diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..00a51aff --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..7fcf1951 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,88 @@ +name: CI + +on: + push: + branches: + - master + - develop + pull_request: + branches: + - master + - develop + +jobs: + backend: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v2 + with: + distribution: adopt + java-version: 11 + + - name: launch docker + run: docker-compose up -d + + - name: build + run: | + ./gradlew bootJar + + - name: test + run: | + ./gradlew test + + desktop: + runs-on: ubuntu-latest + defaults: + run: + shell: bash + working-directory: desktop + + steps: + - uses: actions/checkout@v2 + + - name: setup node + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: yarn + cache-dependency-path: ./desktop/yarn.lock + + - name: dependencies + run: yarn install + + - name: code check + run: | + yarn code-check + + - name: build + run: | + yarn build + + pointer: + runs-on: ubuntu-latest + defaults: + run: + shell: bash + working-directory: app/src/main/pointer + steps: + - uses: actions/checkout@v2 + + - name: setup node + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: yarn + cache-dependency-path: ./app/src/main/pointer/yarn.lock + + - name: dependencies + run: yarn install + + - name: code check + run: | + yarn code-check + + - name: build + run: | + yarn build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..2f2c5ed3 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,21 @@ +name: deploy + +on: + push: + branches: + - develop + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: deploy + env: + JENKINS_URL: ${{secrets.JENKINS_URL}} + JENKINS_USER: ${{secrets.JENKINS_USER}} + JENKINS_JOB_TOKEN: ${{secrets.JENKINS_JOB_TOKEN}} + run: | + curl --user $JENKINS_USER $JENKINS_URL -d token=$JENKINS_JOB_TOKEN diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9b512eaa --- /dev/null +++ b/.gitignore @@ -0,0 +1,74 @@ +### Windows ### +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ + +### Linux ### +!.gitignore +!.git* +*~ + +### OSX ### +.DS_Store +.AppleDouble +.LSOverride +Icon + +### Java ### +*.class +*.jar +*.war +*.ear + +### Gradle ### +.gradle/ +build/ +!gradle/wrapper/gradle-wrapper.jar +bin + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### Eclipse ### +*.pydevproject +.metadata +bin/** +tmp/** +tmp/**/* +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.externalToolBuilders/ +*.launch +.cprojet +.buildpath + +### IntelliJ IDEA ### +.idea/ +*.iws +*.iml +*.ipr +out/ + +### Application property ### +app/src/main/resources/application-dev.yml +app/src/main/resources/application-stage.yml +app/src/main/resources/application-prod.yml + +### Static contents ### +app/src/main/resources/static/* + +### Docker ### +docker/mysql/db +docker/mysql/log diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..90ae1602 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,58 @@ +pipeline { + agent any + + environment { + JENKINS_NODE_COOKIE = 'dontKillMe' + } + + stages { + stage("checkout") { + steps { + checkout scm + } + } + + stage("frontend-build") { + agent { + docker { + image "node:16-alpine" + reuseNode true + } + } + steps { + dir("app/src/main/pointer") { + sh "yarn install" + sh "yarn build" + } + } + } + + stage("backend-build") { + agent { + docker { + image "openjdk:11-jdk" + reuseNode true + } + } + steps { + sh "./gradlew bootJar" + } + } + + stage("deploy") { + steps { + sh "docker-compose up -d" + sh "docker run --rm -d -v $PWD/app/build/libs:/app -p ${PORT}:8080 openjdk:11-jdk java -jar -Dspring.profiles.active=${ENVIRONMENT} app/smartpointer_1.0.0_SNAPSHOT.jar" + } + } + } + + post { + always { + discordSend link: env.BUILD_URL, + result: currentBuild.currentResult, + title: JOB_NAME, + webhookURL: DISCORD_WEBHOOK_URL + } + } +} \ No newline at end of file diff --git a/README.md b/README.md index 547a8b3e..7546df69 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,156 @@ -# サンプル(プロダクト名) +# スマートポインター -[![IMAGE ALT TEXT HERE](https://jphacks.com/wp-content/uploads/2022/08/JPHACKS2022_ogp.jpg)](https://www.youtube.com/watch?v=LUPQFB4QyVo) +![CI](https://github.com/jphacks/D_2208/workflows/CI/badge.svg) +![deploy](https://github.com/jphacks/D_2208/workflows/deploy/badge.svg) +![version](https://img.shields.io/badge/version-1.0.0-blue.svg) + +[![IMAGE ALT TEXT HERE](https://jphacks.com/wp-content/uploads/2022/08/JPHACKS2022_ogp.jpg)](https://youtu.be/6NNR210ilGI) ## 製品概要 + +### 共同プレゼンテーション × Tech + +あなたのスマホがリモコンに!? + +スマートポインターは手元のスマホをリモコン化する、クラウドベースな共同プレゼンテーション支援ツールです。 + +> **Note** +> +> 詳細は[PRD (プロダクト要求仕様書)](https://github.com/jphacks/D_2208/wiki/PRD%20(プロダクト要求仕様書))を参照してください + ### 背景(製品開発のきっかけ、課題等) + +複数人でプレゼンテーションを行う場合、スライドの切り替え担当者とスピーカーが一致しない場合があります。 +しかし、スピーカーが逐一「次のスライドお願いします」と依頼するのは面倒であり、聴衆に煩わしさを与える場合もあるでしょう。 + +そこで、手元のスマートフォンをリモコン化し、リモートにあるホストPCのスライドを共同で操作できるプラットフォームを開発しました。 + ### 製品説明(具体的な製品の説明) + +* ルームの管理 + * スライド投影するホストPCでルームを作成できる + * 招待リンクを発行し、共同プレゼンターに共有できる + * 発表が終わったら、ルームを終了できる +* リモコン操作 + * 招待リンクからルームに参加できる + * 表示名を設定できる + * タイマーを設定できる + * 残り時間通知を設定できる + * スライドを進める/戻すことができる + * スライド上にポインターを表示できる + * 上記操作は共同プレゼンター全員に共有される + ### 特長 -#### 1. 特長1 -#### 2. 特長2 -#### 3. 特長3 + +#### 1. リモートからでも共同でスライド操作できる + +ホストPCに投影されるスライドを、共同プレゼンター全員が操作可能になります。 +ホストPCはルームをホスティングする以外は操作不要で、スマートフォンからのスライド切り替えで発表を行います。 + +#### 2. 発表をもっと快適に + +タイマー設定や現在のスライド番号など、発表に関するステータスが参加者全員に同期されます。 +これにより、プレゼンター全員が自分の発表するタイミング、及び残り時間を把握することができます。 + +#### 3. スライド操作できる人を制限できる + +本システムでは同時にスライド操作できる人を制限しています。 +これは仮に参加者全員のスマートフォンからスライド切り替え可能だと、押し間違いによる予期せぬスライド操作が懸念されるためです。 +現在のスピーカーが次のスピーカーに**ポインタ渡し**することで、ユーザが安心してプレゼンテーションを行えるよう設計しました。 ### 解決出来ること + +類似した既存のサービスは、自分のPCを自分のスマートフォンから操作するところまでしか実現できていません。 +スマートポインターを使えば、 背景説明はAさん、技術説明はBさんが発表担当といったプランの場合に「次のスライドお願いします」とスライド担当者に依頼する必要がなくなります。 + ### 今後の展望 + +* スライドのプレビュー表示 + * スライドの進める/戻すボタンにプレビュー表示するとより便利になる +* ユーザごとにレーザーポインターを表示 + * 現在は一つのレーザーポインターを全員でシェアしている + * レーザーポインターの隣にユーザ名が表示されるとGood +* パフォーマンスの改善 + * STOMPという軽量なメッセージングプロトコルを採用することでパフォーマンス向上を図ったが、スマートフォン・PC間の通信時にサーバを経由するためややタイムラグが生じている + ### 注力したこと(こだわり等) -* -* + +* タイマー設定やスライド切り替え依頼などをシステム側で担うことで、既存の共同プレゼンテーションにおける煩わしさを徹底的に排除した +* 想定されるシナリオを網羅した質の高いテスト + +### 用語集 + +* ルーム + * 共同プレゼンターが参加し、スライドをリモコン操作するためのワークスペース +* ホストPC + * [デスクトップアプリケーション](./desktop)を実行する + * スライド投影するPC + * OSのメニューバーから操作可能 + * リモコンアクションを購読し、パワーポイントなどのプレゼンテーションソフトウェアを操作する +* リモコン + * [リモコン用Webアプリ](./app/src/main/pointer)を実行する + * プレゼンテーション用のレーザーポインター的な概念 + * 自分のスマートフォンをリモコン化し、リモートにあるホストPCのスライドを操作できる! +* ポインタ渡し + * プレゼンター権限を譲渡する行為 ## 開発技術 + ### 活用した技術 -#### API・データ -* -* #### フレームワーク・ライブラリ・モジュール -* -* -#### デバイス -* -* +* デスクトップアプリケーション + * Node.js 16 + * Electron + * React + * Vite + * TypeScript +* リモコン用Webアプリ + * Node.js 16 + * React + * Vite + * TypeScript +* APIサーバ + * Spring Boot 2.7 + * Java OpenJDK 11 + * Spock + * MySQL 8.0 + * OpenAPI + * AsyncAPI +* インフラ + * Google App Engine + * Google Cloud SQL + * Google Cloud Storage + * Google Cloud Scheduler +* CI/CD + * GitHub Actions + * Jenkins + +#### 通信プロトコル + +* HTTP + * ルームの作成、入室機能をREST APIとして提供します + * OpenAPIによるスキーマ駆動開発を採用 + * APIドキュメントは[Swagger UI](https://smartpointer.abelab.dev/swagger-ui/index.html)を参照してください +* STOMP(over WebSocket) + * 軽量なメッセージングプロトコル + * AsyncAPIによるスキーマ駆動開発を採用 + * AsyncAPIは発展途上であり、コード・ドキュメント生成ツールが貧弱だった + * APIドキュメントは、[asyncapi.yml](./asyncapi.yml)を[AsyncAPI Studio](https://studio.asyncapi.com/)にペーストすることで閲覧できます + +#### アーキテクチャ + +リモコン操作を行うモバイル端末と、ルームをホスティングするデスクトップが、APIサーバを介してSTOMP(over WebSocket)で通信します。 + +スライドのページ遷移、ポインター表示など、モバイル端末からの操作命令をデスクトップアプリケーションが購読し、パワーポイントなどのプレゼンテーションソフトウェアを操作することでリモート&複数人での共同プレゼンテーションを実現しています。 + +![](https://user-images.githubusercontent.com/50389029/196952980-36fa7fbd-4b96-4f4d-8f92-a0a41eeb0d7f.png) ### 独自技術 + #### ハッカソンで開発した独自機能・技術 -* 独自で開発したものの内容をこちらに記載してください -* 特に力を入れた部分をファイルリンク、またはcommit_idを記載してください。 -#### 製品に取り入れた研究内容(データ・ソフトウェアなど)(※アカデミック部門の場合のみ提出必須) -* -* +* ルーム・ユーザ情報を管理するREST API([Swagger UI](https://smartpointer.abelab.dev/swagger-ui/index.html)) + * ルーム入室APIから返されたIDトークンを使って、STOMPのトピックをPublish/Subscribeする +* STOMPによる双方向通信API([asyncapi.yml](./asyncapi.yml)) diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..7cc3e7bc --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,154 @@ +import org.yaml.snakeyaml.Yaml + +buildscript { + ext { + SPRING_BOOT_VERSION = "2.7.1" + } + repositories { + mavenCentral() + gradlePluginPortal() + } + dependencies { + classpath "org.springframework.boot:spring-boot-gradle-plugin:${SPRING_BOOT_VERSION}" + classpath "io.spring.gradle:dependency-management-plugin:1.0.12.RELEASE" + classpath "org.flywaydb:flyway-gradle-plugin:8.5.13" + classpath "org.flywaydb:flyway-mysql:8.5.13" + classpath "org.yaml:snakeyaml:1.30" + classpath "com.github.ben-manes:gradle-versions-plugin:0.42.0" + } +} + +apply plugin: "org.springframework.boot" +apply plugin: "io.spring.dependency-management" +apply plugin: "org.flywaydb.flyway" +apply plugin: "com.github.ben-manes.versions" +apply plugin: "java" +apply plugin: "groovy" +apply plugin: "eclipse" +apply plugin: "idea" + +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} + +repositories { + mavenCentral() +} + +configurations { + mybatisGenerate +} + +ext { + // path + PROJECT_ROOT_PATH = projectDir.absolutePath.replaceAll("\\\\", "/") + JAVA_ROOT_PATH = "${PROJECT_ROOT_PATH}/src/main/java" + RESOURCES_ROOT_PATH = "app/src/main/resources" + PROPERTY_ROOT_PATH = "${rootProject.rootDir.path}/${RESOURCES_ROOT_PATH}" + GRADLE_ROOT_PATH = "../gradle" + + // application property file + BASE_PROPERTY_FILE = "application.yml" + ENVIRONMENT = System.getProperty("spring.profiles.active") ?: "sample" + EXTENSION_PROPERTY_FILE = "application-${ENVIRONMENT}.yml" + + // application property + BASE_PROPERTY = new Yaml().load(new File("${PROPERTY_ROOT_PATH}/${BASE_PROPERTY_FILE}").newInputStream()) + EXTENSION_PROPERTY = new Yaml().load(new File("${PROPERTY_ROOT_PATH}/${EXTENSION_PROPERTY_FILE}").newInputStream()) + + // application info + APPLICATION_NAME = BASE_PROPERTY.project.name + APPLICATION_VERSION = BASE_PROPERTY.project.version + + // datasource + DATASOURCE_URL = EXTENSION_PROPERTY.spring.datasource.url + DATASOURCE_USERNAME = EXTENSION_PROPERTY.spring.datasource.username + DATASOURCE_PASSWORD = EXTENSION_PROPERTY.spring.datasource.password + DATASOURCE_DRIVER = EXTENSION_PROPERTY.spring.datasource["driver-class-name"] + + // mybatis + MYBATIS_PROPERTY = BASE_PROPERTY.project.mybatis +} + +dependencies { + // spring boot + implementation "org.springframework.boot:spring-boot-starter-web:${SPRING_BOOT_VERSION}" + implementation "org.springframework.boot:spring-boot-starter-websocket:${SPRING_BOOT_VERSION}" + implementation "org.springframework.boot:spring-boot-starter-validation:${SPRING_BOOT_VERSION}" + implementation "org.springframework.boot:spring-boot-starter-security:${SPRING_BOOT_VERSION}" + testImplementation "org.springframework.boot:spring-boot-starter-test:${SPRING_BOOT_VERSION}" + annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:${SPRING_BOOT_VERSION}" + + // spring security + implementation "org.springframework.security:spring-security-core:5.7.2" + implementation "org.springframework.security:spring-security-web:5.7.2" + implementation "org.springframework.security:spring-security-config:5.7.2" + // implementation "org.springframework.security:spring-security-messaging:5.7.2" + testImplementation "org.springframework.security:spring-security-test:5.7.2" + + // spring session + implementation "org.springframework.session:spring-session-jdbc:2.7.0" + + // flyway + implementation "org.flywaydb:flyway-core:8.5.13" + implementation "org.flywaydb:flyway-mysql:8.5.13" + + // lombok + implementation "org.projectlombok:lombok:1.18.24" + annotationProcessor "org.projectlombok:lombok:1.18.24" + testImplementation "org.projectlombok:lombok:1.18.24" + testAnnotationProcessor "org.projectlombok:lombok:1.18.24" + + // mybatis + implementation "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2" + implementation "org.mybatis.generator:mybatis-generator-maven-plugin:1.4.1" + mybatisGenerate "org.mybatis.generator:mybatis-generator-core:1.4.1" + mybatisGenerate "com.softwareloop:mybatis-generator-lombok-plugin:1.0" + mybatisGenerate "mysql:mysql-connector-java:8.0.29" + + // mysql + implementation "mysql:mysql-connector-java:8.0.29" + + // swagger + implementation "io.springfox:springfox-boot-starter:3.0.0" + implementation "org.springdoc:springdoc-openapi-ui:1.6.9" + implementation "org.springdoc:springdoc-openapi-javadoc:1.6.9" + implementation "org.springdoc:springdoc-openapi-security:1.6.9" + implementation "com.github.therapi:therapi-runtime-javadoc:0.13.0" + annotationProcessor "com.github.therapi:therapi-runtime-javadoc-scribe:0.13.0" + + // test + testImplementation "org.spockframework:spock-core:2.2-M1-groovy-4.0" + testImplementation "org.spockframework:spock-spring:2.2-M1-groovy-4.0" + testImplementation "org.jeasy:easy-random-core:5.0.0" + testImplementation "org.apache.groovy:groovy:4.0.3" + testImplementation "org.apache.groovy:groovy-sql:4.0.3" + + // logging + implementation "ch.qos.logback:logback-classic:1.2.3" + + // util + implementation "io.jsonwebtoken:jjwt:0.9.1" + implementation "com.google.guava:guava:31.1-jre" + implementation "org.apache.commons:commons-lang3:3.12.0" + implementation "org.apache.commons:commons-collections4:4.4" + implementation "commons-net:commons-net:3.8.0" + implementation "commons-validator:commons-validator:1.7" + implementation "net.rakugakibox.util:yaml-resource-bundle:1.2" +} + +tasks.withType(Test) { + systemProperties System.properties +} + +tasks.withType(JavaExec) { + systemProperties System.properties +} + +apply from: "${GRADLE_ROOT_PATH}/jar.gradle" +apply from: "${GRADLE_ROOT_PATH}/run.gradle" +apply from: "${GRADLE_ROOT_PATH}/test.gradle" +apply from: "${GRADLE_ROOT_PATH}/flyway.gradle" +apply from: "${GRADLE_ROOT_PATH}/javadoc.gradle" +apply from: "${GRADLE_ROOT_PATH}/mybatis.gradle" diff --git a/app/src/main/java/dev/abelab/smartpointer/SmartPointerApplication.java b/app/src/main/java/dev/abelab/smartpointer/SmartPointerApplication.java new file mode 100644 index 00000000..1d81ca0c --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/SmartPointerApplication.java @@ -0,0 +1,13 @@ +package dev.abelab.smartpointer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SmartPointerApplication { + + public static void main(String[] args) { + SpringApplication.run(SmartPointerApplication.class, args); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/MessageSourceConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/MessageSourceConfig.java new file mode 100644 index 00000000..b5bdc28c --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/MessageSourceConfig.java @@ -0,0 +1,40 @@ +package dev.abelab.smartpointer.config; + +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ResourceBundleMessageSource; + +import net.rakugakibox.util.YamlResourceBundle; + +/** + * Message Sourceの設定 + */ +@Configuration +public class MessageSourceConfig { + @Bean + public MessageSource messageSource(@Value("${spring.messages.basename}") String basename, + @Value("${spring.messages.encoding}") String encoding) { + + final var messageSource = new YamlMessageSource(); + + messageSource.setBasenames(basename); + messageSource.setDefaultEncoding(encoding); + + return messageSource; + } + + private static class YamlMessageSource extends ResourceBundleMessageSource { + @Override + protected ResourceBundle doGetBundle(String basename, Locale locale) throws MissingResourceException { + return ResourceBundle.getBundle(basename, locale, YamlResourceBundle.Control.INSTANCE); + } + + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/MyBatisConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/MyBatisConfig.java new file mode 100644 index 00000000..8565af4f --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/MyBatisConfig.java @@ -0,0 +1,12 @@ +package dev.abelab.smartpointer.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Configuration; + +/** + * MyBatisの設定 + */ +@MapperScan("dev.abelab.smartpointer.infrastructure.db.mapper") +@Configuration +public class MyBatisConfig { +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/SwaggerConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/SwaggerConfig.java new file mode 100644 index 00000000..5f423f6b --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/SwaggerConfig.java @@ -0,0 +1,37 @@ +package dev.abelab.smartpointer.config; + +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import dev.abelab.smartpointer.property.ProjectProperty; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import lombok.RequiredArgsConstructor; + +/** + * Swaggerの設定 + */ +@Configuration +@RequiredArgsConstructor +public class SwaggerConfig { + + private final ProjectProperty projectProperty;; + + @Bean + public GroupedOpenApi groupedOpenApi() { + return GroupedOpenApi.builder() // + .group("Public API") // + .packagesToScan("dev.abelab.smartpointer.infrastructure.api") // + .build(); + } + + @Bean + public OpenAPI openAPI() { + final var info = new Info() // + .title("Smart Pointer Internal API") // + .version(this.projectProperty.getVersion()); + return new OpenAPI().info(info); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/TestConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/TestConfig.java new file mode 100644 index 00000000..4d3c6126 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/TestConfig.java @@ -0,0 +1,27 @@ +package dev.abelab.smartpointer.config; + +import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import lombok.RequiredArgsConstructor; + +/** + * テストの設定 + */ +@Profile("test") +@Configuration +@RequiredArgsConstructor +public class TestConfig { + + @Bean + public FlywayMigrationStrategy flywayMigrationStrategy() { + return flyway -> { + // テスト用DBをマイグレーションするのは面倒なので、テスト開始前に初期化する + flyway.clean(); + flyway.migrate(); + }; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/TimeZoneConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/TimeZoneConfig.java new file mode 100644 index 00000000..fb44faf1 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/TimeZoneConfig.java @@ -0,0 +1,21 @@ +package dev.abelab.smartpointer.config; + +import java.util.TimeZone; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * タイムゾーンの設定 + */ +@Configuration +public class TimeZoneConfig { + + @Bean + public TimeZone timeZone() { + final var timeZone = TimeZone.getTimeZone("Asia/Tokyo"); + TimeZone.setDefault(timeZone); + return timeZone; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/WebMvcConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/WebMvcConfig.java new file mode 100644 index 00000000..2c96d64a --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/WebMvcConfig.java @@ -0,0 +1,33 @@ +package dev.abelab.smartpointer.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import lombok.RequiredArgsConstructor; + +/** + * Web MVCの設定 + */ +@Configuration +@RequiredArgsConstructor +public class WebMvcConfig implements WebMvcConfigurer { + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(final CorsRegistry registry) { + registry // + .addMapping("/**") // + .allowedOrigins("*") // + .allowedMethods("*") // + .allowedHeaders("*") // + .exposedHeaders("*") // + .allowedOriginPatterns("*"); + } + }; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/WebSecurityConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/WebSecurityConfig.java new file mode 100644 index 00000000..1452c489 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/WebSecurityConfig.java @@ -0,0 +1,40 @@ +package dev.abelab.smartpointer.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.web.SecurityFilterChain; + +import lombok.RequiredArgsConstructor; + +/** + * セキュリティの設定 + */ +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class WebSecurityConfig { + + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + return (web) -> web.ignoring().antMatchers("**.**", "/v3/api-docs/**", "/swagger-resources/**", "/swagger-ui/**", "/webjars/**"); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + // CORSを有効化し、CSRF対策を無効化 + http.cors().and().csrf().disable(); + + // アクセス許可 + http.authorizeRequests() // + .antMatchers("/", "/api/health", "/ws/**").permitAll() // + .antMatchers("/api/batch/**").hasIpAddress("::1") // + .antMatchers("/**").permitAll() // + .anyRequest().authenticated(); + + return http.build(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/config/WebSocketConfig.java b/app/src/main/java/dev/abelab/smartpointer/config/WebSocketConfig.java new file mode 100644 index 00000000..ab503538 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/config/WebSocketConfig.java @@ -0,0 +1,33 @@ +package dev.abelab.smartpointer.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +import dev.abelab.smartpointer.infrastructure.api.StompHandshakeHandler; + +/** + * WebSocketの設定 + */ +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void configureMessageBroker(final MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); + config.setApplicationDestinationPrefixes("/app"); + } + + @Override + public void registerStompEndpoints(final StompEndpointRegistry registry) { + registry.addEndpoint("/ws") // + // ハッカソンなので、全てのオリジンを許可してもOKとする + .setAllowedOriginPatterns("*") // + .setHandshakeHandler(new StompHandshakeHandler()) // + .withSockJS(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/domain/model/RoomModel.java b/app/src/main/java/dev/abelab/smartpointer/domain/model/RoomModel.java new file mode 100644 index 00000000..711c8b3e --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/domain/model/RoomModel.java @@ -0,0 +1,49 @@ +package dev.abelab.smartpointer.domain.model; + +import java.util.UUID; + +import org.apache.commons.lang3.RandomStringUtils; + +import dev.abelab.smartpointer.infrastructure.db.entity.Room; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ルームモデル + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RoomModel { + + /** + * ルームID + */ + @Builder.Default + String id = UUID.randomUUID().toString(); + + /** + * パスコード + */ + @Builder.Default + String passcode = RandomStringUtils.randomNumeric(6); + + public RoomModel(final Room room) { + this.id = room.getId(); + this.passcode = room.getPasscode(); + } + + /** + * パスコードが有効かチェック + * + * @param passcode パスコード + * @return チェック結果 + */ + public boolean isPasscodeValid(final String passcode) { + return this.passcode.equals(passcode); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/domain/model/TimerModel.java b/app/src/main/java/dev/abelab/smartpointer/domain/model/TimerModel.java new file mode 100644 index 00000000..2b7df541 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/domain/model/TimerModel.java @@ -0,0 +1,105 @@ +package dev.abelab.smartpointer.domain.model; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import dev.abelab.smartpointer.enums.TimerStatus; +import dev.abelab.smartpointer.exception.BadRequestException; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.InternalServerErrorException; +import dev.abelab.smartpointer.infrastructure.db.entity.Timer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * タイマーモデル + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TimerModel implements Serializable { + + /** + * ルームID + */ + String roomId; + + /** + * ステータス + */ + @Builder.Default + TimerStatus status = TimerStatus.READY; + + /** + * 初期値[s] + */ + Integer value; + + /** + * 終了日時 + */ + LocalDateTime finishAt; + + public TimerModel(final Timer timer) { + this.roomId = timer.getRoomId(); + this.status = TimerStatus.find(timer.getStatus()) // + .orElseThrow(() -> new InternalServerErrorException(ErrorCode.UNEXPECTED_ERROR)); + this.value = timer.getValue(); + this.finishAt = timer.getFinishAt(); + } + + /** + * タイマーを開始 + * + * @param value タイマー時間[s] + */ + public void start(final Integer value) { + if (!this.getStatus().equals(TimerStatus.READY)) { + throw new BadRequestException(ErrorCode.TIMER_IS_ALREADY_STARTED); + } + + this.setStatus(TimerStatus.RUNNING); + this.setValue(value); + this.setFinishAt(LocalDateTime.now().plusSeconds(value)); + } + + /** + * タイマーを再開 + * + * @param value タイマー時間[s] + */ + public void resume(final Integer value) { + if (!this.getStatus().equals(TimerStatus.READY)) { + throw new BadRequestException(ErrorCode.TIMER_IS_ALREADY_STARTED); + } + + this.setStatus(TimerStatus.RUNNING); + this.setFinishAt(LocalDateTime.now().plusSeconds(value)); + } + + /** + * タイマーを停止 + */ + public void stop() { + if (!this.getStatus().equals(TimerStatus.RUNNING)) { + throw new BadRequestException(ErrorCode.TIMER_IS_ALREADY_STOPPED); + } + + this.setStatus(TimerStatus.READY); + } + + /** + * タイマーをリセット + */ + public void reset() { + if (!this.getStatus().equals(TimerStatus.READY)) { + throw new BadRequestException(ErrorCode.TIMER_CANNOT_BE_RESET); + } + + this.setFinishAt(LocalDateTime.now().plusSeconds(this.getValue())); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/domain/model/UserModel.java b/app/src/main/java/dev/abelab/smartpointer/domain/model/UserModel.java new file mode 100644 index 00000000..747c7f62 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/domain/model/UserModel.java @@ -0,0 +1,43 @@ +package dev.abelab.smartpointer.domain.model; + +import java.io.Serializable; +import java.util.UUID; + +import dev.abelab.smartpointer.infrastructure.db.entity.User; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ユーザモデル + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class UserModel implements Serializable { + + /** + * ユーザID + */ + @Builder.Default + String id = UUID.randomUUID().toString(); + + /** + * ルームID + */ + String roomId; + + /** + * ユーザ名 + */ + String name; + + public UserModel(final User user) { + this.id = user.getId(); + this.roomId = user.getRoomId(); + this.name = user.getName(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/domain/repository/RoomRepository.java b/app/src/main/java/dev/abelab/smartpointer/domain/repository/RoomRepository.java new file mode 100644 index 00000000..0f6fc59a --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/domain/repository/RoomRepository.java @@ -0,0 +1,42 @@ +package dev.abelab.smartpointer.domain.repository; + +import java.util.Optional; + +import dev.abelab.smartpointer.domain.model.RoomModel; + +/** + * ルームリポジトリ + */ +public interface RoomRepository { + + /** + * IDからルームを取得 + * + * @param id ルームID + * @return ルーム + */ + Optional selectById(final String id); + + /** + * ルームを作成 + * + * @param roomModel ルーム + */ + void insert(final RoomModel roomModel); + + /** + * IDからルームを削除 + * + * @param id ルームID + */ + void deleteById(final String id); + + /** + * IDからルームの存在チェック + * + * @param id ルームID + * @return チェック結果 + */ + boolean existsById(final String id); + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/domain/repository/TimerRepository.java b/app/src/main/java/dev/abelab/smartpointer/domain/repository/TimerRepository.java new file mode 100644 index 00000000..6d207144 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/domain/repository/TimerRepository.java @@ -0,0 +1,34 @@ +package dev.abelab.smartpointer.domain.repository; + +import java.util.Optional; + +import dev.abelab.smartpointer.domain.model.TimerModel; + +/** + * タイマーリポジトリ + */ +public interface TimerRepository { + + /** + * ルームIDからタイマーを取得 + * + * @param roomId ルームID + * @return タイマー + */ + Optional selectByRoomId(final String roomId); + + /** + * タイマーを作成 + * + * @param timerModel タイマー + */ + void insert(final TimerModel timerModel); + + /** + * タイマーをupsert + * + * @param timerModel タイマー + */ + void upsert(final TimerModel timerModel); + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/domain/repository/UserRepository.java b/app/src/main/java/dev/abelab/smartpointer/domain/repository/UserRepository.java new file mode 100644 index 00000000..75a4cd40 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/domain/repository/UserRepository.java @@ -0,0 +1,52 @@ +package dev.abelab.smartpointer.domain.repository; + +import java.util.List; +import java.util.Optional; + +import dev.abelab.smartpointer.domain.model.UserModel; + +/** + * ユーザリポジトリ + */ +public interface UserRepository { + + /** + * IDからユーザを取得 + * + * @param id ユーザID + * @return ユーザ + */ + Optional selectById(final String id); + + /** + * ルームIDからユーザリストを取得 + * + * @param roomId ルームID + * @return ユーザリスト + */ + List selectByRoomId(final String roomId); + + /** + * ユーザを作成 + * + * @param userModel ユーザ + */ + void insert(final UserModel userModel); + + /** + * IDからユーザを削除 + * + * @param id ユーザID + */ + void deleteById(final String id); + + /** + * ルームID、ユーザ名からユーザの存在チェック + * + * @param roomId ルームID + * @param name ユーザ名 + * @return 存在するか + */ + boolean existsByRoomIdAndName(final String roomId, final String name); + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/domain/service/UserService.java b/app/src/main/java/dev/abelab/smartpointer/domain/service/UserService.java new file mode 100644 index 00000000..09f1a01f --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/domain/service/UserService.java @@ -0,0 +1,31 @@ +package dev.abelab.smartpointer.domain.service; + +import org.springframework.stereotype.Service; + +import dev.abelab.smartpointer.domain.repository.UserRepository; +import dev.abelab.smartpointer.exception.ConflictException; +import dev.abelab.smartpointer.exception.ErrorCode; +import lombok.RequiredArgsConstructor; + +/** + * ユーザサービス + */ +@RequiredArgsConstructor +@Service +public class UserService { + + private final UserRepository userRepository; + + /** + * ユーザ名が既に使われているかチェック + * + * @param roomId ルームID + * @param name ユーザ名 + */ + public void checkIsNameAlreadyUsed(final String roomId, final String name) throws ConflictException { + if (this.userRepository.existsByRoomIdAndName(roomId, name)) { + throw new ConflictException(ErrorCode.USER_NAME_IS_ALREADY_EXISTS); + } + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/enums/SlideControl.java b/app/src/main/java/dev/abelab/smartpointer/enums/SlideControl.java new file mode 100644 index 00000000..28789a03 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/enums/SlideControl.java @@ -0,0 +1,41 @@ +package dev.abelab.smartpointer.enums; + +import java.util.Arrays; +import java.util.Optional; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * スライド操作 + */ +@Getter +@AllArgsConstructor +public enum SlideControl { + + /** + * 準備中 + */ + NEXT(0), + + /** + * 実行中 + */ + PREVIOUS(1); + + /** + * スライド操作ID + */ + private final Integer id; + + /** + * スライド操作を検索 + * + * @param id タイマーステータスID + * @return タイマーステータス + */ + public static Optional find(final Integer id) { + return Arrays.stream(values()).filter(e -> e.getId().equals(id)).findFirst(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/enums/TimerStatus.java b/app/src/main/java/dev/abelab/smartpointer/enums/TimerStatus.java new file mode 100644 index 00000000..a489cece --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/enums/TimerStatus.java @@ -0,0 +1,41 @@ +package dev.abelab.smartpointer.enums; + +import java.util.Arrays; +import java.util.Optional; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * タイマーステータス + */ +@Getter +@AllArgsConstructor +public enum TimerStatus { + + /** + * 準備中 + */ + READY(0), + + /** + * 実行中 + */ + RUNNING(1); + + /** + * タイマーステータスID + */ + private final Integer id; + + /** + * タイマーステータスを検索 + * + * @param id タイマーステータスID + * @return タイマーステータス + */ + public static Optional find(final Integer id) { + return Arrays.stream(values()).filter(e -> e.getId().equals(id)).findFirst(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/BadRequestException.java b/app/src/main/java/dev/abelab/smartpointer/exception/BadRequestException.java new file mode 100644 index 00000000..82efe9c0 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/BadRequestException.java @@ -0,0 +1,19 @@ +package dev.abelab.smartpointer.exception; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; + +/** + * 400 Bad Request + */ +public class BadRequestException extends BaseException { + + /** + * create bad request exception + * + * @param errorCode error code + */ + public BadRequestException(final ErrorCode errorCode) { + super(BAD_REQUEST, errorCode); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/BaseException.java b/app/src/main/java/dev/abelab/smartpointer/exception/BaseException.java new file mode 100644 index 00000000..597ba56a --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/BaseException.java @@ -0,0 +1,58 @@ +package dev.abelab.smartpointer.exception; + +import org.springframework.http.HttpStatus; + +/** + * 例外の基底クラス + */ +public class BaseException extends RuntimeException { + + /** + * http status + */ + private final HttpStatus httpStatus; + + /** + * error code + */ + private final ErrorCode errorCode; + + /** + * args + */ + private final String[] args; + + /** + * create base exception + * + * @param httpStatus http status + * @param errorCode error code + */ + public BaseException(final HttpStatus httpStatus, final ErrorCode errorCode, final String... args) { + this.httpStatus = httpStatus; + this.errorCode = errorCode; + this.args = args; + } + + /** + * getter of http status + */ + public HttpStatus getHttpStatus() { + return this.httpStatus; + } + + /** + * getter of error code + */ + public ErrorCode getErrorCode() { + return this.errorCode; + } + + /** + * getter of args + */ + public String[] getArgs() { + return this.args; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/ConflictException.java b/app/src/main/java/dev/abelab/smartpointer/exception/ConflictException.java new file mode 100644 index 00000000..4b4bdd83 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/ConflictException.java @@ -0,0 +1,18 @@ +package dev.abelab.smartpointer.exception; + +import static org.springframework.http.HttpStatus.CONFLICT; + +/** + * 409 Conflict + */ +public class ConflictException extends BaseException { + /** + * create conflict exception + * + * @param errorCode error code + */ + public ConflictException(final ErrorCode errorCode) { + super(CONFLICT, errorCode); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/ErrorCode.java b/app/src/main/java/dev/abelab/smartpointer/exception/ErrorCode.java new file mode 100644 index 00000000..7f92c32b --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/ErrorCode.java @@ -0,0 +1,71 @@ +package dev.abelab.smartpointer.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * エラーコード + */ +@Getter +@AllArgsConstructor +public enum ErrorCode { + + /** + * 400 Bad Request: 1000~1999 + */ + VALIDATION_ERROR(1000, "exception.bad_request.validation_error"), + + INVALID_REQUEST_PARAMETER(1001, "exception.bad_request.invalid_request_parameter"), + + INVALID_USER_NAME(1002, "exception.bad_request.invalid_user_name"), + + TIMER_IS_ALREADY_STARTED(1003, "exception.bad_request.timer_is_already_started"), + + TIMER_IS_ALREADY_STOPPED(1004, "exception.bad_request.timer_is_already_stopped"), + + TIMER_CANNOT_BE_RESET(1005, "exception.bad_request.timer_cannot_be_reset"), + + INVALID_TIMER_VALUE(1006, "exception.bad_request.invalid_timer_value"), + + /** + * 401 Unauthorized: 2000~2999 + */ + USER_NOT_LOGGED_IN(2000, "exception.unauthorized.user_not_logged_in"), + + INCORRECT_ROOM_PASSCODE(2001, "exception.unauthorized.incorrect_room_passcode"), + + /** + * 403 Forbidden: 3000~3999 + */ + USER_HAS_NO_PERMISSION(3000, "exception.forbidden.user_has_no_permission"), + + /** + * 404 Not Found: 4000~4999 + */ + NOT_FOUND_API(4000, "exception.not_found.api"), + + NOT_FOUND_ROOM(4001, "exception.not_found.room"), + + NOT_FOUND_TIMER(4002, "exception.not_found.timer"), + + /** + * 409 Conflict: 5000~5999 + */ + USER_NAME_IS_ALREADY_EXISTS(5000, "exception.conflict.user_name_is_already_exists"), + + /** + * 500 Internal Server Error: 6000~6999 + */ + UNEXPECTED_ERROR(6000, "exception.internal_server_error.unexpected_error"); + + /** + * エラーコード + */ + private final Integer code; + + /** + * resources/i18n/messages.ymlのキーに対応 + */ + private final String messageKey; + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/ForbiddenException.java b/app/src/main/java/dev/abelab/smartpointer/exception/ForbiddenException.java new file mode 100644 index 00000000..49737dda --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/ForbiddenException.java @@ -0,0 +1,19 @@ +package dev.abelab.smartpointer.exception; + +import static org.springframework.http.HttpStatus.FORBIDDEN; + +/** + * 403 Forbidden + */ +public class ForbiddenException extends BaseException { + + /** + * create forbidden exception + * + * @param errorCode error code + */ + public ForbiddenException(final ErrorCode errorCode) { + super(FORBIDDEN, errorCode); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/InternalServerErrorException.java b/app/src/main/java/dev/abelab/smartpointer/exception/InternalServerErrorException.java new file mode 100644 index 00000000..0d78d4da --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/InternalServerErrorException.java @@ -0,0 +1,19 @@ +package dev.abelab.smartpointer.exception; + +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + +/** + * 500 Internal Server Error + */ +public class InternalServerErrorException extends BaseException { + + /** + * create conflict exception + * + * @param errorCode error code + */ + public InternalServerErrorException(final ErrorCode errorCode) { + super(INTERNAL_SERVER_ERROR, errorCode); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/NotFoundException.java b/app/src/main/java/dev/abelab/smartpointer/exception/NotFoundException.java new file mode 100644 index 00000000..850ef72a --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/NotFoundException.java @@ -0,0 +1,19 @@ +package dev.abelab.smartpointer.exception; + +import static org.springframework.http.HttpStatus.NOT_FOUND; + +/** + * 404 Not Found + */ +public class NotFoundException extends BaseException { + + /** + * create not found exception + * + * @param errorCode error code + */ + public NotFoundException(final ErrorCode errorCode) { + super(NOT_FOUND, errorCode); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/exception/UnauthorizedException.java b/app/src/main/java/dev/abelab/smartpointer/exception/UnauthorizedException.java new file mode 100644 index 00000000..4d12fb0c --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/exception/UnauthorizedException.java @@ -0,0 +1,19 @@ +package dev.abelab.smartpointer.exception; + +import static org.springframework.http.HttpStatus.UNAUTHORIZED; + +/** + * 500 Unauthorized + */ +public class UnauthorizedException extends BaseException { + + /** + * create unauthorized exception + * + * @param errorCode error code + */ + public UnauthorizedException(final ErrorCode errorCode) { + super(UNAUTHORIZED, errorCode); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/GlobalRestControllerAdvice.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/GlobalRestControllerAdvice.java new file mode 100644 index 00000000..b035cfe5 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/GlobalRestControllerAdvice.java @@ -0,0 +1,176 @@ +package dev.abelab.smartpointer.infrastructure.api; + +import java.util.Locale; + +import javax.annotation.Nullable; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; + +import org.springframework.context.MessageSource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +import dev.abelab.smartpointer.exception.*; +import dev.abelab.smartpointer.infrastructure.api.response.ErrorResponse; +import io.swagger.v3.oas.annotations.Hidden; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * Global rest controller advice + */ +@Slf4j +@Hidden +@Controller +@RestControllerAdvice +@RequiredArgsConstructor +public class GlobalRestControllerAdvice extends ResponseEntityExceptionHandler { + + private final MessageSource messageSource; + + /** + * Handle not found exception + * + * @return response entity + */ + @RequestMapping("/api/**") + public ResponseEntity handleApiNotFoundException() { + return this.buildResponseEntity(new NotFoundException(ErrorCode.NOT_FOUND_API)); + } + + /** + * Handle unexpected exception + * + * @param exception exception + * @return response entity + */ + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(final Exception exception) { + log.error(exception.getMessage(), exception); + return this.buildResponseEntity(new InternalServerErrorException(ErrorCode.UNEXPECTED_ERROR)); + } + + /** + * Handle base exception + * + * @param exception exception + * @return response entity + */ + @ExceptionHandler(BaseException.class) + public ResponseEntity handleBaseException(final BaseException exception) { + return this.buildResponseEntity(exception); + } + + /** + * Handle constraint violation exception + * + * @param exception exception + * @return response entity + */ + @ExceptionHandler(ConstraintViolationException.class) + public ResponseEntity handleConstraintViolationException(final ConstraintViolationException exception) { + return this.buildResponseEntity(new BadRequestException(ErrorCode.VALIDATION_ERROR)); + } + + /** + * Handle method argument type mismatch exception + * + * @param exception exception + * @return response entity + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public ResponseEntity handleMethodArgumentTypeMismatchException(final MethodArgumentTypeMismatchException exception) { + return this.buildResponseEntity(new BadRequestException(ErrorCode.INVALID_REQUEST_PARAMETER)); + } + + /** + * Handle validation exception + * + * @param exception exception + * @return response entity + */ + @ExceptionHandler(ValidationException.class) + public ResponseEntity handleValidationException(final ValidationException exception) { + final var causedException = exception.getCause(); + final var errorCode = causedException instanceof BaseException // + ? ((BaseException) causedException).getErrorCode() // + : ErrorCode.INVALID_REQUEST_PARAMETER; + + return this.buildResponseEntity(new BadRequestException(errorCode)); + } + + /** + * Handle username not found exception + * + * @param exception exception + * @return then response entity + */ + @ExceptionHandler(UsernameNotFoundException.class) + public ResponseEntity handleUsernameNotFoundException(final UsernameNotFoundException exception) { + return this.buildResponseEntity(new UnauthorizedException(ErrorCode.USER_NOT_LOGGED_IN)); + } + + /** + * Handle method argument not valid exception + * + * @param exception exception + * @param headers headers + * @param status status + * @param request request + * @return the response entity + */ + @Override + protected ResponseEntity handleMethodArgumentNotValid(@Nullable final MethodArgumentNotValidException exception, + @Nullable final HttpHeaders headers, @Nullable final HttpStatus status, @Nullable final WebRequest request) { + return this.buildResponseEntity(new BadRequestException(ErrorCode.INVALID_REQUEST_PARAMETER)); + } + + /** + * Handle http message not readable exception + * + * @param exception exception + * @param headers headers + * @param status status + * @param request request + * @return the response entity + */ + @Override + protected ResponseEntity handleHttpMessageNotReadable(@Nullable final HttpMessageNotReadableException exception, + @Nullable final HttpHeaders headers, @Nullable final HttpStatus status, @Nullable final WebRequest request) { + return this.buildResponseEntity(new BadRequestException(ErrorCode.INVALID_REQUEST_PARAMETER)); + } + + /** + * 例外からエラーレスポンスを作成 + * + * @param exception 例外 + * @return エラーレスポンス + */ + private ResponseEntity buildResponseEntity(final BaseException exception) { + final var message = this.messageSource.getMessage(exception.getErrorCode().getMessageKey(), null, Locale.ENGLISH); + final var body = ErrorResponse.builder() // + .code(exception.getErrorCode().getCode()) // + .message(message) // + .build(); + + if (exception.getHttpStatus().is4xxClientError()) { + log.warn(String.format("%d: %s", exception.getErrorCode().getCode(), message)); + } else if (exception.getHttpStatus().is5xxServerError()) { + log.error(String.format("%d: %s", exception.getErrorCode().getCode(), message)); + } + + return new ResponseEntity<>(body, exception.getHttpStatus()); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/GlobalStompControllerAdvice.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/GlobalStompControllerAdvice.java new file mode 100644 index 00000000..5ffc6528 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/GlobalStompControllerAdvice.java @@ -0,0 +1,72 @@ +package dev.abelab.smartpointer.infrastructure.api; + +import java.util.Locale; + +import org.springframework.context.MessageSource; +import org.springframework.messaging.handler.annotation.MessageExceptionHandler; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.web.bind.annotation.ControllerAdvice; + +import dev.abelab.smartpointer.exception.BaseException; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.InternalServerErrorException; +import dev.abelab.smartpointer.infrastructure.api.response.ErrorResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * Global rest controller advice + */ +@Slf4j +@ControllerAdvice +@RequiredArgsConstructor +public class GlobalStompControllerAdvice { + + private final SimpMessagingTemplate simpMessagingTemplate; + + private final MessageSource messageSource; + + /** + * Handle exception + * + * @param exception exception + */ + @MessageExceptionHandler + public void handleException(final Exception exception) { + log.error(exception.getMessage(), exception); + this.broadcastException(new InternalServerErrorException(ErrorCode.UNEXPECTED_ERROR)); + } + + /** + * Handle base exception + * + * @param exception exception + */ + @MessageExceptionHandler + public void handleException(final BaseException exception) { + this.broadcastException(exception); + } + + /** + * 例外を配信 + * + * @param exception exception + */ + private void broadcastException(final BaseException exception) { + final var message = this.messageSource.getMessage(exception.getErrorCode().getMessageKey(), null, Locale.ENGLISH); + final var body = ErrorResponse.builder() // + .code(exception.getErrorCode().getCode()) // + .message(message) // + .build(); + + if (exception.getHttpStatus().is4xxClientError()) { + log.warn(String.format("%d: %s", exception.getErrorCode().getCode(), message)); + } else if (exception.getHttpStatus().is5xxServerError()) { + log.error(String.format("%d: %s", exception.getErrorCode().getCode(), message)); + } + + // TODO: 対象ユーザのみに例外を配信する + this.simpMessagingTemplate.convertAndSend("/topic/exception", body); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/RequestLoggingFilter.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/RequestLoggingFilter.java new file mode 100644 index 00000000..95678015 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/RequestLoggingFilter.java @@ -0,0 +1,87 @@ +package dev.abelab.smartpointer.infrastructure.api; + +import java.util.Objects; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.AbstractRequestLoggingFilter; + +import lombok.extern.slf4j.Slf4j; + +/** + * Request Logging Filter + */ +@Slf4j +@Component +public class RequestLoggingFilter extends AbstractRequestLoggingFilter { + + private static final String ANONYMOUS_USER = "anonymousUser"; + + /** + * ロギングがアクティブか取得 + * + * @param request current HTTP request + */ + @Override + protected boolean shouldLog(final HttpServletRequest request) { + return log.isInfoEnabled(); + } + + /** + * リクエスト前のロギング + * + * @param request current HTTP request + * @param message the message to log + */ + @Override + protected void beforeRequest(final HttpServletRequest request, final String message) { + log.info(message); + } + + /** + * リクエスト後のロギング + * + * @param request current HTTP request + * @param message the message to log + */ + @Override + protected void afterRequest(final HttpServletRequest request, final String message) { + // リクエスト前にロギングするので、ここでは何もしない + } + + /** + * ログメッセージを作成 + * + * @param request current HTTP request + * @param prefix prefix + * @param suffix suffix + * @return the message to log + */ + @Override + protected String createMessage(final HttpServletRequest request, final String prefix, final String suffix) { + final var message = new StringBuilder(); + message.append(prefix); + + // HTTPリクエスト + message.append(request.getMethod()).append(" "); + message.append(request.getRequestURI()); + + // クエリパラメータ + final var queryString = request.getQueryString(); + if (Objects.nonNull(queryString)) { + message.append("?").append(queryString); + } + + // クライアント情報 + final var authentication = SecurityContextHolder.getContext().getAuthentication(); + if (Objects.nonNull(authentication) && !Objects.equals(authentication.getName(), ANONYMOUS_USER)) { + message.append(", user=").append(authentication.getName()); + } + + message.append(suffix); + return message.toString(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/StompHandshakeHandler.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/StompHandshakeHandler.java new file mode 100644 index 00000000..5eca2a57 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/StompHandshakeHandler.java @@ -0,0 +1,31 @@ +package dev.abelab.smartpointer.infrastructure.api; + +import java.security.Principal; +import java.util.Map; +import java.util.Objects; + +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.support.DefaultHandshakeHandler; + +import lombok.extern.slf4j.Slf4j; + +/** + * STOMP Handshake Handler + */ +@Slf4j +public class StompHandshakeHandler extends DefaultHandshakeHandler { + + @Override + protected Principal determineUser(final ServerHttpRequest request, final WebSocketHandler wsHandler, + final Map attributes) { + // TODO: ルーム作成・入室APIでSecurityContextにログインユーザを入れれば多分動くはず! + final var principal = request.getPrincipal(); + if (Objects.nonNull(principal)) { + log.info(String.format("WebSocket connected: user=%s", principal.getName())); + } + + return principal; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/HealthCheckRestController.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/HealthCheckRestController.java new file mode 100644 index 00000000..754e6001 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/HealthCheckRestController.java @@ -0,0 +1,28 @@ +package dev.abelab.smartpointer.infrastructure.api.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +/** + * ヘルスチェックコントローラ + */ +@Tag(name = "Health Check", description = "ヘルスチェック") +@RestController +@RequestMapping(path = "/api/health", produces = MediaType.APPLICATION_JSON_VALUE) +@Validated +@RequiredArgsConstructor +public class HealthCheckRestController { + + @GetMapping + @ResponseStatus(HttpStatus.OK) + public void health() {} + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/PointerStompController.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/PointerStompController.java new file mode 100644 index 00000000..276f48ce --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/PointerStompController.java @@ -0,0 +1,60 @@ +package dev.abelab.smartpointer.infrastructure.api.controller; + +import org.springframework.messaging.handler.annotation.DestinationVariable; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Controller; + +import dev.abelab.smartpointer.infrastructure.api.request.PointerControlRequest; +import dev.abelab.smartpointer.infrastructure.api.validation.RequestValidated; +import dev.abelab.smartpointer.usecase.ControlPointerUseCase; +import dev.abelab.smartpointer.usecase.DisconnectPointerUseCase; +import lombok.RequiredArgsConstructor; + +/** + * ポインターコントローラ + */ +@Controller +@RequiredArgsConstructor +public class PointerStompController { + + private final SimpMessagingTemplate simpMessagingTemplate; + + private final ControlPointerUseCase controlPointerUseCase; + + private final DisconnectPointerUseCase disconnectPointerUseCase; + + /** + * ポインター操作トピック + * + * @param roomId ルームID + * @param requestBody ポインター操作リクエスト + */ + @MessageMapping("/rooms/{roomId}/pointer/control") + public void controlPointer( // + @DestinationVariable final String roomId, // + @RequestValidated @Payload final PointerControlRequest requestBody // + ) { + this.simpMessagingTemplate.convertAndSend( // + String.format("/topic/rooms/%s/pointer/control", roomId), // + this.controlPointerUseCase.handle(roomId, requestBody) // + ); + } + + /** + * ポインター切断トピック + * + * @param roomId ルームID + */ + @MessageMapping("/rooms/{roomId}/pointer/disconnect") + public void disconnectPointer( // + @DestinationVariable final String roomId // + ) { + this.simpMessagingTemplate.convertAndSend( // + String.format("/topic/rooms/%s/pointer/control", roomId), // + this.disconnectPointerUseCase.handle(roomId) // + ); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/RoomRestController.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/RoomRestController.java new file mode 100644 index 00000000..8830f1cf --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/RoomRestController.java @@ -0,0 +1,73 @@ +package dev.abelab.smartpointer.infrastructure.api.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import dev.abelab.smartpointer.infrastructure.api.request.RoomJoinRequest; +import dev.abelab.smartpointer.infrastructure.api.response.AccessTokenResponse; +import dev.abelab.smartpointer.infrastructure.api.response.RoomResponse; +import dev.abelab.smartpointer.infrastructure.api.validation.RequestValidated; +import dev.abelab.smartpointer.usecase.CreateRoomUseCase; +import dev.abelab.smartpointer.usecase.DeleteRoomUseCase; +import dev.abelab.smartpointer.usecase.JoinRoomUseCase; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +/** + * ルームコントローラ + */ +@Tag(name = "Room", description = "ルーム") +@RestController +@RequestMapping(path = "/api/rooms", produces = MediaType.APPLICATION_JSON_VALUE) +@Validated +@RequiredArgsConstructor +public class RoomRestController { + + private final CreateRoomUseCase createRoomUseCase; + + private final DeleteRoomUseCase deleteRoomUseCase; + + private final JoinRoomUseCase joinRoomUseCase; + + /** + * ルーム作成API + * + * @return ルーム + */ + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public RoomResponse createRoom() { + return new RoomResponse(this.createRoomUseCase.handle()); + } + + /** + * ルーム削除API + * + * @param roomId ルームID + */ + @DeleteMapping("/{room_id}") + @ResponseStatus(HttpStatus.OK) + public void deleteRoom(@PathVariable("room_id") final String roomId // + ) { + this.deleteRoomUseCase.handle(roomId); + } + + /** + * ルーム入室API + * + * @param roomId ルームID + * @param requestBody ルーム入室リクエスト + * @return アクセストークン + */ + @PostMapping("/{room_id}/join") + @ResponseStatus(HttpStatus.OK) + public AccessTokenResponse joinRoom( // + @PathVariable("room_id") final String roomId, // + @RequestValidated @RequestBody final RoomJoinRequest requestBody // + ) { + return this.joinRoomUseCase.handle(roomId, requestBody); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/SlideStompController.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/SlideStompController.java new file mode 100644 index 00000000..d1207bab --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/SlideStompController.java @@ -0,0 +1,55 @@ +package dev.abelab.smartpointer.infrastructure.api.controller; + +import org.springframework.messaging.handler.annotation.DestinationVariable; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Controller; + +import dev.abelab.smartpointer.usecase.GoNextSlideUseCase; +import dev.abelab.smartpointer.usecase.GoPreviousSlideUseCase; +import lombok.RequiredArgsConstructor; + +/** + * スライドコントローラ + */ +@Controller +@RequiredArgsConstructor +public class SlideStompController { + + private final SimpMessagingTemplate simpMessagingTemplate; + + private final GoNextSlideUseCase goNextSlideUseCase; + + private final GoPreviousSlideUseCase goPreviousSlideUseCase; + + /** + * スライドを進めるトピック + * + * @param roomId ルームID + */ + @MessageMapping("/rooms/{roomId}/slides/next") + public void goNextSlide( // + @DestinationVariable final String roomId // + ) { + this.simpMessagingTemplate.convertAndSend( // + String.format("/topic/rooms/%s/slides/control", roomId), // + this.goNextSlideUseCase.handle(roomId) // + ); + } + + /** + * スライドを戻すトピック + * + * @param roomId ルームID + */ + @MessageMapping("/rooms/{roomId}/slides/previous") + public void goPreviousSlide( // + @DestinationVariable final String roomId // + ) { + this.simpMessagingTemplate.convertAndSend( // + String.format("/topic/rooms/%s/slides/control", roomId), // + this.goPreviousSlideUseCase.handle(roomId) // + ); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/TimerStompController.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/TimerStompController.java new file mode 100644 index 00000000..8d6e5196 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/controller/TimerStompController.java @@ -0,0 +1,92 @@ +package dev.abelab.smartpointer.infrastructure.api.controller; + +import org.springframework.messaging.handler.annotation.DestinationVariable; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.simp.SimpMessageHeaderAccessor; +import org.springframework.stereotype.Controller; + +import dev.abelab.smartpointer.infrastructure.api.request.TimerResumeRequest; +import dev.abelab.smartpointer.infrastructure.api.request.TimerStartRequest; +import dev.abelab.smartpointer.infrastructure.api.validation.RequestValidated; +import dev.abelab.smartpointer.usecase.*; +import lombok.RequiredArgsConstructor; + +/** + * タイマーコントローラ + */ +@Controller +@RequiredArgsConstructor +public class TimerStompController { + + private final BroadcastTimerUseCase broadcastTimerUseCase; + + private final StartTimerUseCase startTimerUseCase; + + private final ResumeTimerUseCase resumeTimerUseCase; + + private final StopTimerUseCase stopTimerUseCase; + + private final ResetTimerUseCase resetTimerUseCase; + + /** + * タイマー開始トピック + * + * @param roomId ルームID + * @param requestBody タイマー開始リクエスト + * @param headers headers + */ + @MessageMapping("/rooms/{room_id}/timer/start") + public void startTimer( // + @DestinationVariable("room_id") final String roomId, // + @RequestValidated @Payload final TimerStartRequest requestBody, // + final SimpMessageHeaderAccessor headers // + ) { + // TODO: ユーザ認証 + // final var authorization = headers.getFirstNativeHeader(HttpHeaders.AUTHORIZATION); + this.startTimerUseCase.handle(roomId, requestBody); + this.broadcastTimerUseCase.handle(roomId); + } + + /** + * タイマー再開トピック + * + * @param roomId ルームID + * @param requestBody タイマー再開リクエスト + */ + @MessageMapping("/rooms/{room_id}/timer/resume") + public void resumeTimer( // + @DestinationVariable final String roomId, // + @RequestValidated @Payload final TimerResumeRequest requestBody // + ) { + this.resumeTimerUseCase.handle(roomId, requestBody); + this.broadcastTimerUseCase.handle(roomId); + } + + /** + * タイマー停止トピック + * + * @param roomId ルームID + */ + @MessageMapping("/rooms/{room_id}/timer/stop") + public void stopTimer( // + @DestinationVariable final String roomId // + ) { + this.stopTimerUseCase.handle(roomId); + this.broadcastTimerUseCase.handle(roomId); + } + + /** + * タイマーリセットトピック + * + * @param roomId ルームID + */ + @MessageMapping("/rooms/{room_id}/timer/reset") + public void resetTimer( // + @DestinationVariable final String roomId // + ) { + this.resetTimerUseCase.handle(roomId); + this.broadcastTimerUseCase.handle(roomId); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/BaseRequest.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/BaseRequest.java new file mode 100644 index 00000000..4adaa195 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/BaseRequest.java @@ -0,0 +1,15 @@ +package dev.abelab.smartpointer.infrastructure.api.request; + +import dev.abelab.smartpointer.exception.BaseException; + +/** + * リクエストボディのインターフェース + */ +public interface BaseRequest { + + /** + * リクエストボディのバリデーション + */ + void validate() throws BaseException; + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/PointerControlRequest.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/PointerControlRequest.java new file mode 100644 index 00000000..07d8fe33 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/PointerControlRequest.java @@ -0,0 +1,41 @@ +package dev.abelab.smartpointer.infrastructure.api.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ポインター操作リクエスト + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PointerControlRequest implements BaseRequest { + + /** + * α値 + */ + @Schema(required = true) + Double alpha; + + /** + * β値 + */ + @Schema(required = true) + Double beta; + + /** + * γ値 + */ + @Schema(required = true) + Double gamma; + + /** + * バリデーション + */ + public void validate() {} + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/RoomJoinRequest.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/RoomJoinRequest.java new file mode 100644 index 00000000..2deda376 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/RoomJoinRequest.java @@ -0,0 +1,43 @@ +package dev.abelab.smartpointer.infrastructure.api.request; + +import dev.abelab.smartpointer.exception.BadRequestException; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.util.ValidationUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ルーム入室リクエスト + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RoomJoinRequest implements BaseRequest { + + /** + * パスコード + */ + @Schema(required = true) + String passcode; + + /** + * ユーザ名 + */ + @Schema(required = true) + String name; + + /** + * バリデーション + */ + public void validate() { + // ユーザ名 + if (!ValidationUtil.checkStringLength(this.getName(), 1, 255)) { + throw new BadRequestException(ErrorCode.INVALID_USER_NAME); + } + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/TimerResumeRequest.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/TimerResumeRequest.java new file mode 100644 index 00000000..45418502 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/TimerResumeRequest.java @@ -0,0 +1,42 @@ +package dev.abelab.smartpointer.infrastructure.api.request; + +import dev.abelab.smartpointer.exception.BadRequestException; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.util.JsonMessageUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * タイマー再開リクエスト + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TimerResumeRequest implements BaseRequest { + + /** + * 残り時間[s] + */ + @Schema(required = true) + Integer value; + + public TimerResumeRequest(final String payload) { + final var object = JsonMessageUtil.convertJsonToObject(payload, TimerResumeRequest.class); + this.value = object.getValue(); + } + + /** + * バリデーション + */ + public void validate() { + // 残り時間 + if (this.getValue() < 1 || this.getValue() > 3600) { + throw new BadRequestException(ErrorCode.INVALID_TIMER_VALUE); + } + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/TimerStartRequest.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/TimerStartRequest.java new file mode 100644 index 00000000..291e661d --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/request/TimerStartRequest.java @@ -0,0 +1,42 @@ +package dev.abelab.smartpointer.infrastructure.api.request; + +import dev.abelab.smartpointer.exception.BadRequestException; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.util.JsonMessageUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * タイマー開始リクエスト + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TimerStartRequest implements BaseRequest { + + /** + * 設定時間[s] + */ + @Schema(required = true) + Integer value; + + public TimerStartRequest(final String payload) { + final var object = JsonMessageUtil.convertJsonToObject(payload, TimerStartRequest.class); + this.value = object.getValue(); + } + + /** + * バリデーション + */ + public void validate() { + // 設定時間 + if (this.getValue() < 1 || this.getValue() > 3600) { + throw new BadRequestException(ErrorCode.INVALID_TIMER_VALUE); + } + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/AccessTokenResponse.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/AccessTokenResponse.java new file mode 100644 index 00000000..d816e6c2 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/AccessTokenResponse.java @@ -0,0 +1,36 @@ +package dev.abelab.smartpointer.infrastructure.api.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * アクセストークンレスポンス + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AccessTokenResponse { + + /** + * トークンタイプ + */ + @Schema(required = true) + String tokenType; + + /** + * アクセストークン + */ + @Schema(required = true) + String accessToken; + + /** + * TTL + */ + @Schema(required = true) + Integer ttl; + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/ErrorResponse.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/ErrorResponse.java new file mode 100644 index 00000000..f786f396 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/ErrorResponse.java @@ -0,0 +1,30 @@ +package dev.abelab.smartpointer.infrastructure.api.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * エラーレスポンス + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ErrorResponse { + + /** + * エラーメッセージ + */ + @Schema(required = true) + String message; + + /** + * エラーコード + */ + @Schema(required = true) + Integer code; + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/PointerControlResponse.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/PointerControlResponse.java new file mode 100644 index 00000000..a7e4eb65 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/PointerControlResponse.java @@ -0,0 +1,38 @@ +package dev.abelab.smartpointer.infrastructure.api.response; + +import dev.abelab.smartpointer.infrastructure.api.request.PointerControlRequest; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ポインター操作レスポンス + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PointerControlResponse { + + /** + * 回転数 + */ + @Schema(required = true, nullable = true) + PointerRotationResponse rotation; + + /** + * ポインターがアクティブかどうか + */ + @Schema(required = true) + Boolean isActive; + + // TODO: ポインター操作者を入れる + + public PointerControlResponse(final PointerControlRequest requestBody, final Boolean isActive) { + this.rotation = new PointerRotationResponse(requestBody); + this.isActive = isActive; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/PointerRotationResponse.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/PointerRotationResponse.java new file mode 100644 index 00000000..1da76742 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/PointerRotationResponse.java @@ -0,0 +1,43 @@ +package dev.abelab.smartpointer.infrastructure.api.response; + +import dev.abelab.smartpointer.infrastructure.api.request.PointerControlRequest; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ポインター回転数レスポンス + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PointerRotationResponse { + + /** + * α値 + */ + @Schema(required = true) + Double alpha; + + /** + * β値 + */ + @Schema(required = true) + Double beta; + + /** + * γ値 + */ + @Schema(required = true) + Double gamma; + + public PointerRotationResponse(final PointerControlRequest requestBody) { + this.alpha = requestBody.getAlpha(); + this.beta = requestBody.getBeta(); + this.gamma = requestBody.getGamma(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/RoomResponse.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/RoomResponse.java new file mode 100644 index 00000000..3c02a209 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/RoomResponse.java @@ -0,0 +1,36 @@ +package dev.abelab.smartpointer.infrastructure.api.response; + +import dev.abelab.smartpointer.domain.model.RoomModel; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * ルームレスポンス + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RoomResponse { + + /** + * ルームID + */ + @Schema(required = true) + String roomId; + + /** + * パスコード + */ + @Schema(required = true) + String passcode; + + public RoomResponse(final RoomModel roomModel) { + this.roomId = roomModel.getId(); + this.passcode = roomModel.getPasscode(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/SlideControlResponse.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/SlideControlResponse.java new file mode 100644 index 00000000..7e218a71 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/SlideControlResponse.java @@ -0,0 +1,29 @@ +package dev.abelab.smartpointer.infrastructure.api.response; + +import dev.abelab.smartpointer.enums.SlideControl; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * スライド操作レスポンス + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SlideControlResponse { + + /** + * スライド操作ID + */ + @Schema(required = true) + Integer control; + + public SlideControlResponse(final SlideControl slideControl) { + this.control = slideControl.getId(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/TimerResponse.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/TimerResponse.java new file mode 100644 index 00000000..e3578eb5 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/response/TimerResponse.java @@ -0,0 +1,45 @@ +package dev.abelab.smartpointer.infrastructure.api.response; + +import java.time.LocalDateTime; + +import dev.abelab.smartpointer.domain.model.TimerModel; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * タイマーレスポンス + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TimerResponse { + + /** + * ステータス + */ + @Schema(required = true) + Integer status; + + /** + * 初期値[s] + */ + @Schema(required = true, nullable = true) + Integer value; + + /** + * 終了日時 + */ + @Schema(required = true, nullable = true) + LocalDateTime finishAt; + + public TimerResponse(final TimerModel timerModel) { + this.status = timerModel.getStatus().getId(); + this.value = timerModel.getValue(); + this.finishAt = timerModel.getFinishAt(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/validation/RequestValidated.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/validation/RequestValidated.java new file mode 100644 index 00000000..fcf60aeb --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/validation/RequestValidated.java @@ -0,0 +1,27 @@ +package dev.abelab.smartpointer.infrastructure.api.validation; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.validation.Constraint; +import javax.validation.Payload; + +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint(validatedBy = {RequestValidator.class}) +public @interface RequestValidated { + String message() + + default ""; + + Class[] groups() default {}; + + Class[] payload() default {}; + + @Retention(RetentionPolicy.RUNTIME) + @Documented + @interface List { + RequestValidated[] value(); + } +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/validation/RequestValidator.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/validation/RequestValidator.java new file mode 100644 index 00000000..9d848f6f --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/api/validation/RequestValidator.java @@ -0,0 +1,19 @@ +package dev.abelab.smartpointer.infrastructure.api.validation; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import dev.abelab.smartpointer.infrastructure.api.request.BaseRequest; + +public class RequestValidator implements ConstraintValidator { + + @Override + public void initialize(RequestValidated constraintAnnotation) {} + + @Override + public boolean isValid(final BaseRequest baseRequest, final ConstraintValidatorContext constraintValidatorContext) { + baseRequest.validate(); + return true; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/controller/IndexController.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/controller/IndexController.java new file mode 100644 index 00000000..cf54b717 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/controller/IndexController.java @@ -0,0 +1,18 @@ +package dev.abelab.smartpointer.infrastructure.controller; + +import org.springframework.stereotype.Controller; + +/** + * Index Controller + */ +@Controller +public class IndexController { + + /* + * TODO: /ws/**アクセスを横取りしてしまうので、とりあえずコメントアウト + * + * @RequestMapping("/** /{path:[^\\.]*}") public String redirect(@PathVariable String path) { return + * "forward:/"; } + */ + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/Room.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/Room.java new file mode 100644 index 00000000..5ddd8d64 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/Room.java @@ -0,0 +1,30 @@ +package dev.abelab.smartpointer.infrastructure.db.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Room { + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column room.id + * + * @mbg.generated + */ + private String id; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column room.passcode + * + * @mbg.generated + */ + private String passcode; +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/RoomExample.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/RoomExample.java new file mode 100644 index 00000000..38757866 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/RoomExample.java @@ -0,0 +1,441 @@ +package dev.abelab.smartpointer.infrastructure.db.entity; + +import java.util.ArrayList; +import java.util.List; + +public class RoomExample { + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table room + * + * @mbg.generated + */ + protected String orderByClause; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table room + * + * @mbg.generated + */ + protected boolean distinct; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table room + * + * @mbg.generated + */ + protected List oredCriteria; + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public RoomExample() { + oredCriteria = new ArrayList<>(); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public String getOrderByClause() { + return orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public List getOredCriteria() { + return oredCriteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table room + * + * @mbg.generated + */ + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("`id` is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("`id` is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(String value) { + addCriterion("`id` =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(String value) { + addCriterion("`id` <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(String value) { + addCriterion("`id` >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(String value) { + addCriterion("`id` >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(String value) { + addCriterion("`id` <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(String value) { + addCriterion("`id` <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLike(String value) { + addCriterion("`id` like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotLike(String value) { + addCriterion("`id` not like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("`id` in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("`id` not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(String value1, String value2) { + addCriterion("`id` between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(String value1, String value2) { + addCriterion("`id` not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andPasscodeIsNull() { + addCriterion("`passcode` is null"); + return (Criteria) this; + } + + public Criteria andPasscodeIsNotNull() { + addCriterion("`passcode` is not null"); + return (Criteria) this; + } + + public Criteria andPasscodeEqualTo(String value) { + addCriterion("`passcode` =", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeNotEqualTo(String value) { + addCriterion("`passcode` <>", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeGreaterThan(String value) { + addCriterion("`passcode` >", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeGreaterThanOrEqualTo(String value) { + addCriterion("`passcode` >=", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeLessThan(String value) { + addCriterion("`passcode` <", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeLessThanOrEqualTo(String value) { + addCriterion("`passcode` <=", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeLike(String value) { + addCriterion("`passcode` like", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeNotLike(String value) { + addCriterion("`passcode` not like", value, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeIn(List values) { + addCriterion("`passcode` in", values, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeNotIn(List values) { + addCriterion("`passcode` not in", values, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeBetween(String value1, String value2) { + addCriterion("`passcode` between", value1, value2, "passcode"); + return (Criteria) this; + } + + public Criteria andPasscodeNotBetween(String value1, String value2) { + addCriterion("`passcode` not between", value1, value2, "passcode"); + return (Criteria) this; + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table room + * + * @mbg.generated do_not_delete_during_merge + */ + public static class Criteria extends GeneratedCriteria { + protected Criteria() { + super(); + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table room + * + * @mbg.generated + */ + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/Timer.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/Timer.java new file mode 100644 index 00000000..0c06a509 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/Timer.java @@ -0,0 +1,49 @@ +package dev.abelab.smartpointer.infrastructure.db.entity; + +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Timer { + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column timer.room_id + * + * @mbg.generated + */ + private String roomId; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column timer.status + * + * @mbg.generated + */ + private Integer status; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column timer.value + * + * @mbg.generated + */ + private Integer value; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column timer.finish_at + * + * @mbg.generated + */ + private LocalDateTime finishAt; +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/TimerExample.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/TimerExample.java new file mode 100644 index 00000000..10b7b8f9 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/TimerExample.java @@ -0,0 +1,552 @@ +package dev.abelab.smartpointer.infrastructure.db.entity; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +public class TimerExample { + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table timer + * + * @mbg.generated + */ + protected String orderByClause; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table timer + * + * @mbg.generated + */ + protected boolean distinct; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table timer + * + * @mbg.generated + */ + protected List oredCriteria; + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public TimerExample() { + oredCriteria = new ArrayList<>(); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public String getOrderByClause() { + return orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public List getOredCriteria() { + return oredCriteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table timer + * + * @mbg.generated + */ + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andRoomIdIsNull() { + addCriterion("`room_id` is null"); + return (Criteria) this; + } + + public Criteria andRoomIdIsNotNull() { + addCriterion("`room_id` is not null"); + return (Criteria) this; + } + + public Criteria andRoomIdEqualTo(String value) { + addCriterion("`room_id` =", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotEqualTo(String value) { + addCriterion("`room_id` <>", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdGreaterThan(String value) { + addCriterion("`room_id` >", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdGreaterThanOrEqualTo(String value) { + addCriterion("`room_id` >=", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdLessThan(String value) { + addCriterion("`room_id` <", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdLessThanOrEqualTo(String value) { + addCriterion("`room_id` <=", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdLike(String value) { + addCriterion("`room_id` like", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotLike(String value) { + addCriterion("`room_id` not like", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdIn(List values) { + addCriterion("`room_id` in", values, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotIn(List values) { + addCriterion("`room_id` not in", values, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdBetween(String value1, String value2) { + addCriterion("`room_id` between", value1, value2, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotBetween(String value1, String value2) { + addCriterion("`room_id` not between", value1, value2, "roomId"); + return (Criteria) this; + } + + public Criteria andStatusIsNull() { + addCriterion("`status` is null"); + return (Criteria) this; + } + + public Criteria andStatusIsNotNull() { + addCriterion("`status` is not null"); + return (Criteria) this; + } + + public Criteria andStatusEqualTo(Integer value) { + addCriterion("`status` =", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotEqualTo(Integer value) { + addCriterion("`status` <>", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThan(Integer value) { + addCriterion("`status` >", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThanOrEqualTo(Integer value) { + addCriterion("`status` >=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThan(Integer value) { + addCriterion("`status` <", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThanOrEqualTo(Integer value) { + addCriterion("`status` <=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusIn(List values) { + addCriterion("`status` in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotIn(List values) { + addCriterion("`status` not in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusBetween(Integer value1, Integer value2) { + addCriterion("`status` between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotBetween(Integer value1, Integer value2) { + addCriterion("`status` not between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andValueIsNull() { + addCriterion("`value` is null"); + return (Criteria) this; + } + + public Criteria andValueIsNotNull() { + addCriterion("`value` is not null"); + return (Criteria) this; + } + + public Criteria andValueEqualTo(Integer value) { + addCriterion("`value` =", value, "value"); + return (Criteria) this; + } + + public Criteria andValueNotEqualTo(Integer value) { + addCriterion("`value` <>", value, "value"); + return (Criteria) this; + } + + public Criteria andValueGreaterThan(Integer value) { + addCriterion("`value` >", value, "value"); + return (Criteria) this; + } + + public Criteria andValueGreaterThanOrEqualTo(Integer value) { + addCriterion("`value` >=", value, "value"); + return (Criteria) this; + } + + public Criteria andValueLessThan(Integer value) { + addCriterion("`value` <", value, "value"); + return (Criteria) this; + } + + public Criteria andValueLessThanOrEqualTo(Integer value) { + addCriterion("`value` <=", value, "value"); + return (Criteria) this; + } + + public Criteria andValueIn(List values) { + addCriterion("`value` in", values, "value"); + return (Criteria) this; + } + + public Criteria andValueNotIn(List values) { + addCriterion("`value` not in", values, "value"); + return (Criteria) this; + } + + public Criteria andValueBetween(Integer value1, Integer value2) { + addCriterion("`value` between", value1, value2, "value"); + return (Criteria) this; + } + + public Criteria andValueNotBetween(Integer value1, Integer value2) { + addCriterion("`value` not between", value1, value2, "value"); + return (Criteria) this; + } + + public Criteria andFinishAtIsNull() { + addCriterion("`finish_at` is null"); + return (Criteria) this; + } + + public Criteria andFinishAtIsNotNull() { + addCriterion("`finish_at` is not null"); + return (Criteria) this; + } + + public Criteria andFinishAtEqualTo(LocalDateTime value) { + addCriterion("`finish_at` =", value, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtNotEqualTo(LocalDateTime value) { + addCriterion("`finish_at` <>", value, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtGreaterThan(LocalDateTime value) { + addCriterion("`finish_at` >", value, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtGreaterThanOrEqualTo(LocalDateTime value) { + addCriterion("`finish_at` >=", value, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtLessThan(LocalDateTime value) { + addCriterion("`finish_at` <", value, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtLessThanOrEqualTo(LocalDateTime value) { + addCriterion("`finish_at` <=", value, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtIn(List values) { + addCriterion("`finish_at` in", values, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtNotIn(List values) { + addCriterion("`finish_at` not in", values, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtBetween(LocalDateTime value1, LocalDateTime value2) { + addCriterion("`finish_at` between", value1, value2, "finishAt"); + return (Criteria) this; + } + + public Criteria andFinishAtNotBetween(LocalDateTime value1, LocalDateTime value2) { + addCriterion("`finish_at` not between", value1, value2, "finishAt"); + return (Criteria) this; + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table timer + * + * @mbg.generated do_not_delete_during_merge + */ + public static class Criteria extends GeneratedCriteria { + protected Criteria() { + super(); + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table timer + * + * @mbg.generated + */ + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/User.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/User.java new file mode 100644 index 00000000..69a8d1a6 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/User.java @@ -0,0 +1,39 @@ +package dev.abelab.smartpointer.infrastructure.db.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class User { + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column user.id + * + * @mbg.generated + */ + private String id; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column user.room_id + * + * @mbg.generated + */ + private String roomId; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column user.name + * + * @mbg.generated + */ + private String name; +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/UserExample.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/UserExample.java new file mode 100644 index 00000000..418629c0 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/entity/UserExample.java @@ -0,0 +1,511 @@ +package dev.abelab.smartpointer.infrastructure.db.entity; + +import java.util.ArrayList; +import java.util.List; + +public class UserExample { + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table user + * + * @mbg.generated + */ + protected String orderByClause; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table user + * + * @mbg.generated + */ + protected boolean distinct; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table user + * + * @mbg.generated + */ + protected List oredCriteria; + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public UserExample() { + oredCriteria = new ArrayList<>(); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public String getOrderByClause() { + return orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public List getOredCriteria() { + return oredCriteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table user + * + * @mbg.generated + */ + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("`id` is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("`id` is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(String value) { + addCriterion("`id` =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(String value) { + addCriterion("`id` <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(String value) { + addCriterion("`id` >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(String value) { + addCriterion("`id` >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(String value) { + addCriterion("`id` <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(String value) { + addCriterion("`id` <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLike(String value) { + addCriterion("`id` like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotLike(String value) { + addCriterion("`id` not like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("`id` in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("`id` not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(String value1, String value2) { + addCriterion("`id` between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(String value1, String value2) { + addCriterion("`id` not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andRoomIdIsNull() { + addCriterion("`room_id` is null"); + return (Criteria) this; + } + + public Criteria andRoomIdIsNotNull() { + addCriterion("`room_id` is not null"); + return (Criteria) this; + } + + public Criteria andRoomIdEqualTo(String value) { + addCriterion("`room_id` =", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotEqualTo(String value) { + addCriterion("`room_id` <>", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdGreaterThan(String value) { + addCriterion("`room_id` >", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdGreaterThanOrEqualTo(String value) { + addCriterion("`room_id` >=", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdLessThan(String value) { + addCriterion("`room_id` <", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdLessThanOrEqualTo(String value) { + addCriterion("`room_id` <=", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdLike(String value) { + addCriterion("`room_id` like", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotLike(String value) { + addCriterion("`room_id` not like", value, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdIn(List values) { + addCriterion("`room_id` in", values, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotIn(List values) { + addCriterion("`room_id` not in", values, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdBetween(String value1, String value2) { + addCriterion("`room_id` between", value1, value2, "roomId"); + return (Criteria) this; + } + + public Criteria andRoomIdNotBetween(String value1, String value2) { + addCriterion("`room_id` not between", value1, value2, "roomId"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("`name` is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("`name` is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("`name` =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("`name` <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("`name` >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("`name` >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("`name` <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("`name` <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("`name` like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("`name` not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("`name` in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("`name` not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("`name` between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("`name` not between", value1, value2, "name"); + return (Criteria) this; + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table user + * + * @mbg.generated do_not_delete_during_merge + */ + public static class Criteria extends GeneratedCriteria { + protected Criteria() { + super(); + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table user + * + * @mbg.generated + */ + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/RoomMapper.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/RoomMapper.java new file mode 100644 index 00000000..8d84d0aa --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/RoomMapper.java @@ -0,0 +1,6 @@ +package dev.abelab.smartpointer.infrastructure.db.mapper; + +import dev.abelab.smartpointer.infrastructure.db.mapper.base.RoomBaseMapper; + +public interface RoomMapper extends RoomBaseMapper { +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/TimerMapper.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/TimerMapper.java new file mode 100644 index 00000000..619fea79 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/TimerMapper.java @@ -0,0 +1,10 @@ +package dev.abelab.smartpointer.infrastructure.db.mapper; + +import dev.abelab.smartpointer.infrastructure.db.entity.Timer; +import dev.abelab.smartpointer.infrastructure.db.mapper.base.TimerBaseMapper; + +public interface TimerMapper extends TimerBaseMapper { + + void upsert(final Timer timer); + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/UserMapper.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/UserMapper.java new file mode 100644 index 00000000..56282bb0 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/UserMapper.java @@ -0,0 +1,6 @@ +package dev.abelab.smartpointer.infrastructure.db.mapper; + +import dev.abelab.smartpointer.infrastructure.db.mapper.base.UserBaseMapper; + +public interface UserMapper extends UserBaseMapper { +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/RoomBaseMapper.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/RoomBaseMapper.java new file mode 100644 index 00000000..902e682e --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/RoomBaseMapper.java @@ -0,0 +1,107 @@ +package dev.abelab.smartpointer.infrastructure.db.mapper.base; + +import dev.abelab.smartpointer.infrastructure.db.entity.Room; +import dev.abelab.smartpointer.infrastructure.db.entity.RoomExample; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.session.RowBounds; + +@Mapper +public interface RoomBaseMapper { + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + long countByExample(RoomExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int deleteByExample(RoomExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int deleteByPrimaryKey(String id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int insert(Room row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int insertSelective(Room row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + List selectByExampleWithRowbounds(RoomExample example, RowBounds rowBounds); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + List selectByExample(RoomExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + Room selectByPrimaryKey(String id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int updateByExampleSelective(@Param("row") Room row, @Param("example") RoomExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int updateByExample(@Param("row") Room row, @Param("example") RoomExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int updateByPrimaryKeySelective(Room row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table room + * + * @mbg.generated + */ + int updateByPrimaryKey(Room row); +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/TimerBaseMapper.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/TimerBaseMapper.java new file mode 100644 index 00000000..1f76082f --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/TimerBaseMapper.java @@ -0,0 +1,107 @@ +package dev.abelab.smartpointer.infrastructure.db.mapper.base; + +import dev.abelab.smartpointer.infrastructure.db.entity.Timer; +import dev.abelab.smartpointer.infrastructure.db.entity.TimerExample; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.session.RowBounds; + +@Mapper +public interface TimerBaseMapper { + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + long countByExample(TimerExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int deleteByExample(TimerExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int deleteByPrimaryKey(String roomId); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int insert(Timer row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int insertSelective(Timer row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + List selectByExampleWithRowbounds(TimerExample example, RowBounds rowBounds); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + List selectByExample(TimerExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + Timer selectByPrimaryKey(String roomId); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int updateByExampleSelective(@Param("row") Timer row, @Param("example") TimerExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int updateByExample(@Param("row") Timer row, @Param("example") TimerExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int updateByPrimaryKeySelective(Timer row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table timer + * + * @mbg.generated + */ + int updateByPrimaryKey(Timer row); +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/UserBaseMapper.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/UserBaseMapper.java new file mode 100644 index 00000000..3624da34 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/db/mapper/base/UserBaseMapper.java @@ -0,0 +1,107 @@ +package dev.abelab.smartpointer.infrastructure.db.mapper.base; + +import dev.abelab.smartpointer.infrastructure.db.entity.User; +import dev.abelab.smartpointer.infrastructure.db.entity.UserExample; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.session.RowBounds; + +@Mapper +public interface UserBaseMapper { + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + long countByExample(UserExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int deleteByExample(UserExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int deleteByPrimaryKey(String id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int insert(User row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int insertSelective(User row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + List selectByExampleWithRowbounds(UserExample example, RowBounds rowBounds); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + List selectByExample(UserExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + User selectByPrimaryKey(String id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int updateByExampleSelective(@Param("row") User row, @Param("example") UserExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int updateByExample(@Param("row") User row, @Param("example") UserExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int updateByPrimaryKeySelective(User row); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table user + * + * @mbg.generated + */ + int updateByPrimaryKey(User row); +} \ No newline at end of file diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/RoomFactory.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/RoomFactory.java new file mode 100644 index 00000000..9775fb46 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/RoomFactory.java @@ -0,0 +1,27 @@ +package dev.abelab.smartpointer.infrastructure.factory; + +import org.springframework.stereotype.Component; + +import dev.abelab.smartpointer.domain.model.RoomModel; +import dev.abelab.smartpointer.infrastructure.db.entity.Room; + +/** + * ルームファクトリ + */ +@Component +public class RoomFactory { + + /** + * Roomを作成 + * + * @param roomModel model + * @return entity + */ + public Room createRoom(final RoomModel roomModel) { + return Room.builder() // + .id(roomModel.getId()) // + .passcode(roomModel.getPasscode()) // + .build(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/TimerFactory.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/TimerFactory.java new file mode 100644 index 00000000..bcae458f --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/TimerFactory.java @@ -0,0 +1,29 @@ +package dev.abelab.smartpointer.infrastructure.factory; + +import org.springframework.stereotype.Component; + +import dev.abelab.smartpointer.domain.model.TimerModel; +import dev.abelab.smartpointer.infrastructure.db.entity.Timer; + +/** + * タイマーファクトリ + */ +@Component +public class TimerFactory { + + /** + * Timerを作成 + * + * @param timerModel model + * @return entity + */ + public Timer createTimer(final TimerModel timerModel) { + return Timer.builder() // + .roomId(timerModel.getRoomId()) // + .status(timerModel.getStatus().getId()) // + .value(timerModel.getValue()) // + .finishAt(timerModel.getFinishAt()) // + .build(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/UserFactory.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/UserFactory.java new file mode 100644 index 00000000..42308f64 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/factory/UserFactory.java @@ -0,0 +1,28 @@ +package dev.abelab.smartpointer.infrastructure.factory; + +import org.springframework.stereotype.Component; + +import dev.abelab.smartpointer.domain.model.UserModel; +import dev.abelab.smartpointer.infrastructure.db.entity.User; + +/** + * ユーザファクトリ + */ +@Component +public class UserFactory { + + /** + * Userを作成 + * + * @param userModel model + * @return entity + */ + public User createUser(final UserModel userModel) { + return User.builder() // + .id(userModel.getId()) // + .roomId(userModel.getRoomId()) // + .name(userModel.getName()) // + .build(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/RoomRepositoryImpl.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/RoomRepositoryImpl.java new file mode 100644 index 00000000..b4596a00 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/RoomRepositoryImpl.java @@ -0,0 +1,48 @@ +package dev.abelab.smartpointer.infrastructure.repository; + +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import dev.abelab.smartpointer.domain.model.RoomModel; +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.infrastructure.db.entity.RoomExample; +import dev.abelab.smartpointer.infrastructure.db.mapper.RoomMapper; +import dev.abelab.smartpointer.infrastructure.factory.RoomFactory; +import lombok.RequiredArgsConstructor; + +/** + * ルームリポジトリ + */ +@RequiredArgsConstructor +@Repository +public class RoomRepositoryImpl implements RoomRepository { + + private final RoomMapper roomMapper; + + private final RoomFactory roomFactory; + + @Override + public Optional selectById(final String id) { + return Optional.ofNullable(this.roomMapper.selectByPrimaryKey(id)).map(RoomModel::new); + } + + @Override + public void insert(final RoomModel roomModel) { + final var room = this.roomFactory.createRoom(roomModel); + this.roomMapper.insert(room); + } + + @Override + public void deleteById(final String id) { + this.roomMapper.deleteByPrimaryKey(id); + } + + @Override + public boolean existsById(final String id) { + final var example = new RoomExample(); + example.createCriteria().andIdEqualTo(id); + return this.roomMapper.countByExample(example) != 0; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/TimerRepositoryImpl.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/TimerRepositoryImpl.java new file mode 100644 index 00000000..95d1cb15 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/TimerRepositoryImpl.java @@ -0,0 +1,41 @@ +package dev.abelab.smartpointer.infrastructure.repository; + +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import dev.abelab.smartpointer.domain.model.TimerModel; +import dev.abelab.smartpointer.domain.repository.TimerRepository; +import dev.abelab.smartpointer.infrastructure.db.mapper.TimerMapper; +import dev.abelab.smartpointer.infrastructure.factory.TimerFactory; +import lombok.RequiredArgsConstructor; + +/** + * タイマーリポジトリ + */ +@RequiredArgsConstructor +@Repository +public class TimerRepositoryImpl implements TimerRepository { + + private final TimerMapper timerMapper; + + private final TimerFactory timerFactory; + + @Override + public Optional selectByRoomId(final String roomId) { + return Optional.ofNullable(this.timerMapper.selectByPrimaryKey(roomId)).map(TimerModel::new); + } + + @Override + public void insert(final TimerModel timerModel) { + final var timer = this.timerFactory.createTimer(timerModel); + this.timerMapper.insert(timer); + } + + @Override + public void upsert(final TimerModel timerModel) { + final var timer = this.timerFactory.createTimer(timerModel); + this.timerMapper.upsert(timer); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/UserRepositoryImpl.java b/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/UserRepositoryImpl.java new file mode 100644 index 00000000..3ed969fe --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/infrastructure/repository/UserRepositoryImpl.java @@ -0,0 +1,59 @@ +package dev.abelab.smartpointer.infrastructure.repository; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Repository; + +import dev.abelab.smartpointer.domain.model.UserModel; +import dev.abelab.smartpointer.domain.repository.UserRepository; +import dev.abelab.smartpointer.infrastructure.db.entity.UserExample; +import dev.abelab.smartpointer.infrastructure.db.mapper.UserMapper; +import dev.abelab.smartpointer.infrastructure.factory.UserFactory; +import lombok.RequiredArgsConstructor; + +/** + * ユーザリポジトリ + */ +@RequiredArgsConstructor +@Repository +public class UserRepositoryImpl implements UserRepository { + + private final UserMapper userMapper; + + private final UserFactory userFactory; + + @Override + public Optional selectById(final String id) { + return Optional.ofNullable(this.userMapper.selectByPrimaryKey(id)).map(UserModel::new); + } + + @Override + public List selectByRoomId(final String roomId) { + final var example = new UserExample(); + example.createCriteria().andRoomIdEqualTo(roomId); + return this.userMapper.selectByExample(example).stream() // + .map(UserModel::new) // + .collect(Collectors.toList()); + } + + @Override + public void insert(final UserModel userModel) { + final var user = this.userFactory.createUser(userModel); + this.userMapper.insert(user); + } + + @Override + public void deleteById(final String id) { + this.userMapper.deleteByPrimaryKey(id); + } + + @Override + public boolean existsByRoomIdAndName(final String roomId, final String name) { + final var example = new UserExample(); + example.createCriteria().andRoomIdEqualTo(roomId).andNameEqualTo(name); + return this.userMapper.selectByExample(example).size() != 0; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/plugin/CustomMapperNamePlugin.java b/app/src/main/java/dev/abelab/smartpointer/plugin/CustomMapperNamePlugin.java new file mode 100644 index 00000000..9029588b --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/plugin/CustomMapperNamePlugin.java @@ -0,0 +1,30 @@ +package dev.abelab.smartpointer.plugin; + +import java.util.List; + +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.PluginAdapter; + +/** + * MyBatis Generatorで生成されるファイル名をカスタマイズするプラグイン + */ +public class CustomMapperNamePlugin extends PluginAdapter { + + @Override + public boolean validate(final List warnings) { + return true; + } + + @Override + public void initialized(final IntrospectedTable introspectedTable) { + super.initialized(introspectedTable); + + // 生成されるファイルをXxxMapperからXxxBaseMapperに変更する + // 生成されたファイルに拡張内容を追記したくないので、XxxBaseMapperを継承したXxxMapperを手動で作成する + final var javaMapperName = introspectedTable.getMyBatis3JavaMapperType(); + introspectedTable.setMyBatis3JavaMapperType(javaMapperName.replaceAll("Mapper$", "BaseMapper")); + final var xmlMapperName = introspectedTable.getMyBatis3XmlMapperFileName(); + introspectedTable.setMyBatis3XmlMapperFileName(xmlMapperName.replaceAll("Mapper\\.xml", "BaseMapper.xml")); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/plugin/IgnoreTablePlugin.java b/app/src/main/java/dev/abelab/smartpointer/plugin/IgnoreTablePlugin.java new file mode 100644 index 00000000..48d1870d --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/plugin/IgnoreTablePlugin.java @@ -0,0 +1,52 @@ +package dev.abelab.smartpointer.plugin; + +import java.util.List; + +import org.mybatis.generator.api.GeneratedXmlFile; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.PluginAdapter; +import org.mybatis.generator.api.dom.java.Interface; +import org.mybatis.generator.api.dom.java.TopLevelClass; + +/** + * MyBatis Generatorで不要なテーブルを無視するプラグイン + */ +public class IgnoreTablePlugin extends PluginAdapter { + + private final List IGNORE_TABLE_PATTERNS = List.of( // + "flyway_schema_history", // + "SPRING_SESSION", // + "SPRING_SESSION_ATTRIBUTES" // + ); + + @Override + public boolean validate(final List warnings) { + return true; + } + + private boolean checkIsTableToGenerate(final IntrospectedTable introspectedTable) { + final var tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime().replace("`", ""); + return this.IGNORE_TABLE_PATTERNS.stream().noneMatch(tableName::matches); + } + + @Override + public boolean modelBaseRecordClassGenerated(final TopLevelClass topLevelClass, final IntrospectedTable introspectedTable) { + return this.checkIsTableToGenerate(introspectedTable); + } + + @Override + public boolean modelExampleClassGenerated(final TopLevelClass topLevelClass, final IntrospectedTable introspectedTable) { + return this.checkIsTableToGenerate(introspectedTable); + } + + @Override + public boolean clientGenerated(final Interface interfaze, final IntrospectedTable introspectedTable) { + return this.checkIsTableToGenerate(introspectedTable); + } + + @Override + public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) { + return this.checkIsTableToGenerate(introspectedTable); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/property/AuthProperty.java b/app/src/main/java/dev/abelab/smartpointer/property/AuthProperty.java new file mode 100644 index 00000000..3ef895f2 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/property/AuthProperty.java @@ -0,0 +1,46 @@ +package dev.abelab.smartpointer.property; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Data; + +/** + * 認証プロパティ + */ +@Data +@Configuration +@ConfigurationProperties("auth") +public class AuthProperty { + + /** + * TTL[s] + */ + Integer ttl; + + /** + * トークンタイプ + */ + String tokenType; + + /** + * JWT + */ + JWT jwt; + + @Data + public static class JWT { + + /** + * Secret Key + */ + String secret; + + /** + * Issuer + */ + String issuer; + + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/property/ProjectProperty.java b/app/src/main/java/dev/abelab/smartpointer/property/ProjectProperty.java new file mode 100644 index 00000000..81f4ef82 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/property/ProjectProperty.java @@ -0,0 +1,26 @@ +package dev.abelab.smartpointer.property; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Data; + +/** + * プロジェクトプロパティ + */ +@Data +@Configuration +@ConfigurationProperties("project") +public class ProjectProperty { + + /** + * プロジェクト名 + */ + String name; + + /** + * バージョン + */ + String version; + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/BroadcastTimerUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/BroadcastTimerUseCase.java new file mode 100644 index 00000000..bcb3c2a7 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/BroadcastTimerUseCase.java @@ -0,0 +1,48 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.model.TimerModel; +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.domain.repository.TimerRepository; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.infrastructure.api.response.TimerResponse; +import lombok.RequiredArgsConstructor; + +/** + * タイマー取得ユースケース + */ +@RequiredArgsConstructor +@Component +public class BroadcastTimerUseCase { + + private final RoomRepository roomRepository; + + private final TimerRepository timerRepository; + + private final SimpMessagingTemplate simpMessagingTemplate; + + /** + * Handle UseCase + * + * @param roomId ルームID + */ + @Transactional + public void handle(final String roomId) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + // タイマーを取得 + final var timer = this.timerRepository.selectByRoomId(roomId) // + .orElse(TimerModel.builder().roomId(roomId).build()); + + // タイマーを配信 + this.simpMessagingTemplate.convertAndSend(String.format("/topic/rooms/%s/timer", roomId), new TimerResponse(timer)); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/ControlPointerUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/ControlPointerUseCase.java new file mode 100644 index 00000000..e0f81657 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/ControlPointerUseCase.java @@ -0,0 +1,39 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.infrastructure.api.request.PointerControlRequest; +import dev.abelab.smartpointer.infrastructure.api.response.PointerControlResponse; +import lombok.RequiredArgsConstructor; + +/** + * ポインター操作ユースケース + */ +@RequiredArgsConstructor +@Component +public class ControlPointerUseCase { + + private final RoomRepository roomRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + * @param requestBody ポインター操作リクエスト + * @return ポインター操作レスポンス + */ + @Transactional + public PointerControlResponse handle(final String roomId, final PointerControlRequest requestBody) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + return new PointerControlResponse(requestBody, true); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/CreateRoomUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/CreateRoomUseCase.java new file mode 100644 index 00000000..27612e03 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/CreateRoomUseCase.java @@ -0,0 +1,33 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.model.RoomModel; +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import lombok.RequiredArgsConstructor; + +/** + * ルーム作成ユースケース + */ +@RequiredArgsConstructor +@Component +public class CreateRoomUseCase { + + private final RoomRepository roomRepository; + + /** + * Handle UseCase + * + * @return ルーム + */ + @Transactional + public RoomModel handle() { + // ルームを作成 + final var room = RoomModel.builder().build(); + this.roomRepository.insert(room); + + return room; + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/DeleteRoomUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/DeleteRoomUseCase.java new file mode 100644 index 00000000..963fab07 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/DeleteRoomUseCase.java @@ -0,0 +1,36 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import lombok.RequiredArgsConstructor; + +/** + * ルーム削除ユースケース + */ +@RequiredArgsConstructor +@Component +public class DeleteRoomUseCase { + + private final RoomRepository roomRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + */ + @Transactional + public void handle(final String roomId) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + // ルームを削除 + this.roomRepository.deleteById(roomId); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/DisconnectPointerUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/DisconnectPointerUseCase.java new file mode 100644 index 00000000..5d9f206b --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/DisconnectPointerUseCase.java @@ -0,0 +1,40 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.infrastructure.api.response.PointerControlResponse; +import lombok.RequiredArgsConstructor; + +/** + * ポインター切断ユースケース + */ +@RequiredArgsConstructor +@Component +public class DisconnectPointerUseCase { + + private final RoomRepository roomRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + * @return ポインター操作レスポンス + */ + @Transactional + public PointerControlResponse handle(final String roomId) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + return PointerControlResponse.builder() // + .rotation(null) // + .isActive(false) // + .build(); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/GoNextSlideUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/GoNextSlideUseCase.java new file mode 100644 index 00000000..dbccfb33 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/GoNextSlideUseCase.java @@ -0,0 +1,38 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.enums.SlideControl; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.infrastructure.api.response.SlideControlResponse; +import lombok.RequiredArgsConstructor; + +/** + * スライドを進めるユースケース + */ +@RequiredArgsConstructor +@Component +public class GoNextSlideUseCase { + + private final RoomRepository roomRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + * @return スライド操作レスポンス + */ + @Transactional + public SlideControlResponse handle(final String roomId) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + return new SlideControlResponse(SlideControl.NEXT); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/GoPreviousSlideUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/GoPreviousSlideUseCase.java new file mode 100644 index 00000000..7a7d847e --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/GoPreviousSlideUseCase.java @@ -0,0 +1,38 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.enums.SlideControl; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.infrastructure.api.response.SlideControlResponse; +import lombok.RequiredArgsConstructor; + +/** + * スライドを戻すユースケース + */ +@RequiredArgsConstructor +@Component +public class GoPreviousSlideUseCase { + + private final RoomRepository roomRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + * @return スライド操作レスポンス + */ + @Transactional + public SlideControlResponse handle(final String roomId) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + return new SlideControlResponse(SlideControl.PREVIOUS); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/JoinRoomUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/JoinRoomUseCase.java new file mode 100644 index 00000000..c9b88658 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/JoinRoomUseCase.java @@ -0,0 +1,76 @@ +package dev.abelab.smartpointer.usecase; + +import java.util.Date; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.model.UserModel; +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.domain.repository.UserRepository; +import dev.abelab.smartpointer.domain.service.UserService; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.exception.UnauthorizedException; +import dev.abelab.smartpointer.infrastructure.api.request.RoomJoinRequest; +import dev.abelab.smartpointer.infrastructure.api.response.AccessTokenResponse; +import dev.abelab.smartpointer.property.AuthProperty; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.RequiredArgsConstructor; + +/** + * ルーム入室ユースケース + */ +@RequiredArgsConstructor +@Component +public class JoinRoomUseCase { + + private final RoomRepository roomRepository; + + private final UserRepository userRepository; + + private final UserService userService; + + private final AuthProperty authProperty; + + /** + * Handle UseCase + * + * @param roomId ルームID + * @param requestBody ルーム入室リクエスト + * @return アクセストークン + */ + @Transactional + public AccessTokenResponse handle(final String roomId, final RoomJoinRequest requestBody) { + // ルームの取得 + final var room = this.roomRepository.selectById(roomId) // + .orElseThrow(() -> new NotFoundException(ErrorCode.NOT_FOUND_ROOM)); + + // パスコードチェック + if (!room.isPasscodeValid(requestBody.getPasscode())) { + throw new UnauthorizedException(ErrorCode.INCORRECT_ROOM_PASSCODE); + } + + // ユーザ名が使われていないことをチェック + this.userService.checkIsNameAlreadyUsed(roomId, requestBody.getName()); + + // ユーザを作成 + final var user = UserModel.builder() // + .roomId(roomId) // + .name(requestBody.getName()) // + .build(); + this.userRepository.insert(user); + + // アクセストークンを作成 + final var accessToken = Jwts.builder() // + .setSubject(user.getId()) // + .setIssuer(this.authProperty.getJwt().getIssuer()) // + .setIssuedAt(new Date()) // + .setExpiration(new Date(System.currentTimeMillis() + this.authProperty.getTtl() * 1000)) // + .signWith(SignatureAlgorithm.HS512, this.authProperty.getJwt().getSecret().getBytes()) // + .compact(); + return new AccessTokenResponse(this.authProperty.getTokenType(), accessToken, this.authProperty.getTtl()); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/ResetTimerUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/ResetTimerUseCase.java new file mode 100644 index 00000000..95a645be --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/ResetTimerUseCase.java @@ -0,0 +1,44 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.domain.repository.TimerRepository; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import lombok.RequiredArgsConstructor; + +/** + * タイマーリセットユースケース + */ +@RequiredArgsConstructor +@Component +public class ResetTimerUseCase { + + private final RoomRepository roomRepository; + + private final TimerRepository timerRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + */ + @Transactional + public void handle(final String roomId) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + // タイマーを取得 + final var timer = this.timerRepository.selectByRoomId(roomId) // + .orElseThrow(() -> new NotFoundException(ErrorCode.NOT_FOUND_TIMER)); + + // タイマーを更新 + timer.reset(); + this.timerRepository.upsert(timer); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/ResumeTimerUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/ResumeTimerUseCase.java new file mode 100644 index 00000000..0ece6124 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/ResumeTimerUseCase.java @@ -0,0 +1,46 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.domain.repository.TimerRepository; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.infrastructure.api.request.TimerResumeRequest; +import lombok.RequiredArgsConstructor; + +/** + * タイマー再開ユースケース + */ +@RequiredArgsConstructor +@Component +public class ResumeTimerUseCase { + + private final RoomRepository roomRepository; + + private final TimerRepository timerRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + * @param requestBody タイマー再開リクエスト + */ + @Transactional + public void handle(final String roomId, final TimerResumeRequest requestBody) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + // タイマーを取得 + final var timer = this.timerRepository.selectByRoomId(roomId) // + .orElseThrow(() -> new NotFoundException(ErrorCode.NOT_FOUND_TIMER)); + + // タイマーを再開 + timer.resume(requestBody.getValue()); + this.timerRepository.upsert(timer); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/StartTimerUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/StartTimerUseCase.java new file mode 100644 index 00000000..c2e3ee73 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/StartTimerUseCase.java @@ -0,0 +1,48 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.model.TimerModel; +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.domain.repository.TimerRepository; +import dev.abelab.smartpointer.enums.TimerStatus; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import dev.abelab.smartpointer.infrastructure.api.request.TimerStartRequest; +import lombok.RequiredArgsConstructor; + +/** + * タイマー開始ユースケース + */ +@RequiredArgsConstructor +@Component +public class StartTimerUseCase { + + private final RoomRepository roomRepository; + + private final TimerRepository timerRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + * @param requestBody タイマー開始リクエスト + */ + @Transactional + public void handle(final String roomId, final TimerStartRequest requestBody) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + // タイマーを取得 + final var timer = this.timerRepository.selectByRoomId(roomId) // + .orElse(TimerModel.builder().status(TimerStatus.READY).roomId(roomId).build()); + + // タイマーを更新 + timer.start(requestBody.getValue()); + this.timerRepository.upsert(timer); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/usecase/StopTimerUseCase.java b/app/src/main/java/dev/abelab/smartpointer/usecase/StopTimerUseCase.java new file mode 100644 index 00000000..d8886ddb --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/usecase/StopTimerUseCase.java @@ -0,0 +1,44 @@ +package dev.abelab.smartpointer.usecase; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import dev.abelab.smartpointer.domain.repository.RoomRepository; +import dev.abelab.smartpointer.domain.repository.TimerRepository; +import dev.abelab.smartpointer.exception.ErrorCode; +import dev.abelab.smartpointer.exception.NotFoundException; +import lombok.RequiredArgsConstructor; + +/** + * タイマー停止ユースケース + */ +@RequiredArgsConstructor +@Component +public class StopTimerUseCase { + + private final RoomRepository roomRepository; + + private final TimerRepository timerRepository; + + /** + * Handle UseCase + * + * @param roomId ルームID + */ + @Transactional + public void handle(final String roomId) { + // ルームの存在チェック + if (!this.roomRepository.existsById(roomId)) { + throw new NotFoundException(ErrorCode.NOT_FOUND_ROOM); + } + + // タイマーを取得 + final var timer = this.timerRepository.selectByRoomId(roomId) // + .orElseThrow(() -> new NotFoundException(ErrorCode.NOT_FOUND_TIMER)); + + // タイマーを更新 + timer.stop(); + this.timerRepository.upsert(timer); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/util/JsonMessageUtil.java b/app/src/main/java/dev/abelab/smartpointer/util/JsonMessageUtil.java new file mode 100644 index 00000000..64a12fa7 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/util/JsonMessageUtil.java @@ -0,0 +1,30 @@ +package dev.abelab.smartpointer.util; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import lombok.SneakyThrows; + +/** + * JSONメッセージユーティリティ + */ +public class JsonMessageUtil { + + private static final ObjectMapper objectMapper = new ObjectMapper() // + .registerModule(new JavaTimeModule()) // + .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true); + + /** + * JSON文字列をオブジェクトに変換 + * + * @param json json + * @param clazz clazz + * @return object + */ + @SneakyThrows + public static T convertJsonToObject(final String json, final Class clazz) { + return objectMapper.readValue(json, clazz); + } + +} diff --git a/app/src/main/java/dev/abelab/smartpointer/util/ValidationUtil.java b/app/src/main/java/dev/abelab/smartpointer/util/ValidationUtil.java new file mode 100644 index 00000000..850f4994 --- /dev/null +++ b/app/src/main/java/dev/abelab/smartpointer/util/ValidationUtil.java @@ -0,0 +1,62 @@ +package dev.abelab.smartpointer.util; + +import java.util.Objects; + +import org.apache.commons.lang3.StringUtils; + +/** + * バリデーションユーティリティ + */ +public class ValidationUtil { + + /** + * 数値が範囲に収まるかチェック + * + * @param number 数値 + * @param min 最小値 + * @param max 最大値 + * @return バリデーション結果 + */ + public static Boolean checkNumberSize(final Integer number, final Integer min, final Integer max) { + if (Objects.isNull(number)) { + return false; + } + + return (Objects.isNull(min) || number >= min) && (Objects.isNull(max) || number <= max); + } + + /** + * 文字列の長さが範囲に収まるかチェック + * + * @param string 文字列 + * @param min 最小文字数 + * @param max 最大文字数 + * @return バリデーション結果 + */ + public static Boolean checkStringLength(final String string, final Integer min, final Integer max) { + if (Objects.isNull(string)) { + return false; + } + + if (StringUtils.isBlank(string) && min != 0) { + return false; + } else { + return (Objects.isNull(min) || string.length() >= min) && (Objects.isNull(max) || string.length() <= max); + } + } + + /** + * 英数字のみの文字列かチェック + * + * @param string 文字列 + * @return バリデーション結果 + */ + public static Boolean checkIsAlphanumeric(final String string) { + if (Objects.isNull(string)) { + return false; + } + + return string.matches("[A-Za-z\\d]*"); + } + +} diff --git a/app/src/main/pointer/.eslintrc.js b/app/src/main/pointer/.eslintrc.js new file mode 100644 index 00000000..b30e1570 --- /dev/null +++ b/app/src/main/pointer/.eslintrc.js @@ -0,0 +1,58 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended", + "prettier", + ], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: "latest", + sourceType: "module", + }, + plugins: ["react", "import", "@typescript-eslint"], + settings: { + "import/resolver": { + typescript: {}, + }, + }, + rules: { + // restrict order of imports + "import/order": [ + "error", + { + pathGroups: [ + { + pattern: "@/**", + group: "internal", + position: "before", + }, + ], + groups: [ + ["builtin", "external"], + ["parent"], + ["internal"], + ["index", "sibling"], + ], + "newlines-between": "always", + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + }, + ], + }, +}; diff --git a/app/src/main/pointer/.gitignore b/app/src/main/pointer/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/app/src/main/pointer/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/app/src/main/pointer/.vscode/extensions.json b/app/src/main/pointer/.vscode/extensions.json new file mode 100644 index 00000000..e2119f78 --- /dev/null +++ b/app/src/main/pointer/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "ZixuanChen.vitest-explorer" + ] +} \ No newline at end of file diff --git a/app/src/main/pointer/README.md b/app/src/main/pointer/README.md new file mode 100644 index 00000000..a3991818 --- /dev/null +++ b/app/src/main/pointer/README.md @@ -0,0 +1,61 @@ +# リモコン用 アプリケーション + +![version](https://img.shields.io/badge/version-1.0.0-blue.svg) + +## 概要 + +プレゼンテーション用レーザポインターを模したアプリケーションです。 + +ポインター表示、タイマーの設定、リモートでのスライドの切り替え機能を提供します。 + +## 開発 + +### 環境構築 + +```sh +yarn install +``` + +#### エディタの設定 + +以下を自動実行するように設定することを推奨します。 + +- フォーマッタ (Prettier) +- Linter (ESLint) +- テスト (Vitest) + +[Visual Studio Code](https://code.visualstudio.com/) を使用する場合は、以下の拡張機能を使用することを推奨します。 + +- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) +- [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) +- [Vitest](https://marketplace.visualstudio.com/items?itemName=ZixuanChen.vitest-explorer) + +また、これらの拡張機能は、プロジェクトのフォルダ内で拡張機能を `@recommended` で検索すると表示されます。 + +変更する場合は `.vscode/extensions.json` ファイルを編集してください。 + +参考: [Workspace recommended extensions - Managing Extensions in Visual Studio Code](https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions) + +### 開発用サーバの起動 + +```sh +yarn run dev +``` + +### コードチェック + +```sh +yarn run code-check +``` + +### ビルド方法 + +```sh +yarn build +``` + +### 使用技術 + +- React@^18.2.0 +- Vite@^3.1.0 +- TypeScript@^4.6.4 diff --git a/app/src/main/pointer/index.html b/app/src/main/pointer/index.html new file mode 100644 index 00000000..8efe10d6 --- /dev/null +++ b/app/src/main/pointer/index.html @@ -0,0 +1,13 @@ + + + + + + + スマートポインター + + +
+ + + diff --git a/app/src/main/pointer/openapitools.json b/app/src/main/pointer/openapitools.json new file mode 100644 index 00000000..27e6d53b --- /dev/null +++ b/app/src/main/pointer/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "6.2.0" + } +} diff --git a/app/src/main/pointer/package.json b/app/src/main/pointer/package.json new file mode 100644 index 00000000..24fe34a5 --- /dev/null +++ b/app/src/main/pointer/package.json @@ -0,0 +1,53 @@ +{ + "name": "pointer", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "codegen": "openapi-generator-cli generate -g typescript-axios -i http://localhost:8080/v3/api-docs/Public%20API -o ./src/generated/http-client", + "lint": "eslint src", + "format": "yarn check:format --write", + "test": "vitest", + "coverage": "vitest run --coverage", + "code-check": "run-p lint check:*", + "check:format": "prettier src --check", + "check:type": "tsc" + }, + "dependencies": { + "@chakra-ui/react": "2.3.5", + "@emotion/react": "11.10.4", + "@emotion/styled": "11.10.4", + "@heroicons/react": "^2.0.12", + "@stomp/stompjs": "^6.1.2", + "axios": "^1.1.3", + "framer-motion": "7.5.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.38.0", + "sockjs-client": "^1.6.1" + }, + "devDependencies": { + "@openapitools/openapi-generator-cli": "^2.5.2", + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", + "@typescript-eslint/eslint-plugin": "^5.40.0", + "@typescript-eslint/parser": "^5.40.0", + "@vitejs/plugin-basic-ssl": "^0.1.2", + "@vitejs/plugin-react": "^2.1.0", + "eslint": "^8.25.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-typescript": "^3.5.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.6.1", + "eslint-plugin-react": "^7.31.10", + "eslint-plugin-react-hooks": "^4.6.0", + "msw": "^0.47.4", + "npm-run-all": "^4.1.5", + "prettier": "^2.7.1", + "typescript": "^4.6.4", + "vite": "^3.1.0", + "vitest": "^0.24.3" + } +} diff --git a/app/src/main/pointer/public/favicon.svg b/app/src/main/pointer/public/favicon.svg new file mode 100644 index 00000000..3176022a --- /dev/null +++ b/app/src/main/pointer/public/favicon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/pointer/src/App.tsx b/app/src/main/pointer/src/App.tsx new file mode 100644 index 00000000..771ed791 --- /dev/null +++ b/app/src/main/pointer/src/App.tsx @@ -0,0 +1,28 @@ +import { Container, VStack } from "@chakra-ui/react"; +import { useState } from "react"; + +import { Header } from "./components/Header"; +import { JoinRoomForm } from "./components/JoinRoomForm"; +import { Paginator } from "./components/Paginator"; +import { Pointer } from "./components/Pointer"; +import { Timer } from "./components/Timer"; +import { AuthData } from "./types/AuthData"; + +export const App = () => { + const [authData, setAuthData] = useState(null); + + return ( + + {authData ? ( + + {/*
*/} + + + + + ) : ( + + )} + + ); +}; diff --git a/app/src/main/pointer/src/api.ts b/app/src/main/pointer/src/api.ts new file mode 100644 index 00000000..bab41870 --- /dev/null +++ b/app/src/main/pointer/src/api.ts @@ -0,0 +1,16 @@ +import axios from "axios"; + +import { Configuration, RoomApi } from "./generated/http-client"; + +const API_URL = location.origin; + +const config = new Configuration({ + basePath: API_URL, +}); + +const axiosInstance = axios.create({ + baseURL: API_URL, + withCredentials: true, +}); + +export const roomApi = new RoomApi(config, "", axiosInstance); diff --git a/app/src/main/pointer/src/components/Header.tsx b/app/src/main/pointer/src/components/Header.tsx new file mode 100644 index 00000000..54200f3d --- /dev/null +++ b/app/src/main/pointer/src/components/Header.tsx @@ -0,0 +1,16 @@ +import { Flex, Text } from "@chakra-ui/react"; +import { FC } from "react"; + +import { AuthData } from "@/types/AuthData"; + +type Props = { + authData: AuthData; +}; + +export const Header: FC = ({ authData }) => { + return ( + + {authData.userName} + + ); +}; diff --git a/app/src/main/pointer/src/components/JoinRoomForm.tsx b/app/src/main/pointer/src/components/JoinRoomForm.tsx new file mode 100644 index 00000000..13de8cab --- /dev/null +++ b/app/src/main/pointer/src/components/JoinRoomForm.tsx @@ -0,0 +1,135 @@ +import { + VStack, + FormControl, + FormLabel, + Input, + FormHelperText, + Button, + FormErrorMessage, + useToast, + PinInput, + PinInputField, + Flex, +} from "@chakra-ui/react"; +import { AxiosError } from "axios"; +import { FC } from "react"; +import { Controller, useForm } from "react-hook-form"; + +import { roomApi } from "@/api"; +import { AuthData } from "@/types/AuthData"; + +type Props = { + onSubmit: (authData: AuthData) => void; +}; + +const localStorageKey = "lastUserName"; + +type FormValues = { + userName: string; + passcode: string; + roomId: string; +}; + +export const JoinRoomForm: FC = ({ onSubmit: onSubmitProps }) => { + const url = new URL(location.href); + + const toast = useToast(); + + const { + handleSubmit, + register, + formState: { errors, isSubmitting }, + control, + } = useForm({ + defaultValues: { + userName: localStorage.getItem(localStorageKey) ?? "", + passcode: url.searchParams.get("passcode") ?? "", + roomId: url.searchParams.get("roomId") ?? "", + }, + }); + + const onSubmit = async (values: FormValues) => { + try { + const { data } = await roomApi.joinRoom(values.roomId, { + passcode: values.passcode, + name: values.userName, + }); + localStorage.setItem(localStorageKey, values.userName); + onSubmitProps({ + ...data, + userName: values.userName, + roomId: values.roomId, + }); + + toast({ + title: "ログインに成功しました。", + status: "success", + duration: 3000, + isClosable: true, + }); + } catch (error) { + if (error instanceof AxiosError) { + toast({ + title: "ログインに失敗しました。", + description: error.response?.data.message, + status: "error", + duration: 3000, + isClosable: true, + }); + } + } + }; + + return ( + + + ユーザ名 + + {errors.userName?.message} + 1 〜 255 文字 + + + ルームID + + {errors.roomId?.message} + + + パスコード + + ( + + + + + + + + + )} + /> + + {errors.passcode?.message} + + + + ); +}; diff --git a/app/src/main/pointer/src/components/Paginator.tsx b/app/src/main/pointer/src/components/Paginator.tsx new file mode 100644 index 00000000..e6b4a381 --- /dev/null +++ b/app/src/main/pointer/src/components/Paginator.tsx @@ -0,0 +1,62 @@ +import { IconButton, Icon, Flex, VStack, Heading } from "@chakra-ui/react"; +import { ChevronLeftIcon, ChevronRightIcon } from "@heroicons/react/24/solid"; +import { FC } from "react"; + +import { stompClient } from "@/stomp"; +import { AuthData } from "@/types/AuthData"; + +type Props = { + authData: AuthData; +}; + +export const Paginator: FC = ({ authData }) => { + const goNext = () => { + stompClient.publish({ + destination: `/app/rooms/${authData.roomId}/slides/next`, + body: JSON.stringify({ room_id: authData.roomId }), + }); + }; + + const goPrevious = () => + stompClient.publish({ + destination: `/app/rooms/${authData.roomId}/slides/previous`, + body: JSON.stringify({ room_id: authData.roomId }), + }); + + return ( + + {[ + { + icon: ChevronLeftIcon, + label: "1ページ戻す", + text: "前へ", + onClick: goPrevious, + }, + { + icon: ChevronRightIcon, + label: "1ページ進める", + text: "次へ", + onClick: goNext, + }, + ].map(({ icon, label, onClick }, index) => ( + } + /> + ))} + + ); +}; diff --git a/app/src/main/pointer/src/components/Pointer.tsx b/app/src/main/pointer/src/components/Pointer.tsx new file mode 100644 index 00000000..9c1ca97c --- /dev/null +++ b/app/src/main/pointer/src/components/Pointer.tsx @@ -0,0 +1,63 @@ +import { IconButton, Icon, Flex, Box, Heading, VStack } from "@chakra-ui/react"; +import { FC, useEffect, useState } from "react"; + +import { + requestPermission, + subscribeOrientation, + unsubscribeOrientation, +} from "@/deviceorientation"; +import { AuthData } from "@/types/AuthData"; + +type Props = { + authData: AuthData; +}; + +export const Pointer: FC = ({ authData }) => { + const [isActive, setIsActive] = useState(false); + + useEffect(() => { + if (!isActive) { + return; + } + + requestPermission().then(() => { + subscribeOrientation(authData.roomId); + }); + return () => unsubscribeOrientation(authData.roomId); + }, [authData.roomId, isActive]); + + return ( + + + setIsActive(true)} + onMouseUp={() => setIsActive(false)} + onTouchStart={() => setIsActive(true)} + onTouchEnd={() => setIsActive(false)} + icon={ + + + + } + /> + + + ); +}; diff --git a/app/src/main/pointer/src/components/Timer.tsx b/app/src/main/pointer/src/components/Timer.tsx new file mode 100644 index 00000000..f334f61c --- /dev/null +++ b/app/src/main/pointer/src/components/Timer.tsx @@ -0,0 +1,240 @@ +import { + Flex, + NumberInput, + NumberInputField, + NumberInputStepper, + NumberIncrementStepper, + NumberDecrementStepper, + Icon, + VStack, + Button, + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, + useDisclosure, + InputGroup, + InputLeftAddon, + InputRightAddon, + Heading, + useToast, +} from "@chakra-ui/react"; +import { Cog6ToothIcon } from "@heroicons/react/24/solid"; +import { FC, useEffect, useState } from "react"; +import { useForm } from "react-hook-form"; + +import { stompClient } from "@/stomp"; +import { AuthData } from "@/types/AuthData"; + +type Props = { + authData: AuthData; +}; + +type FormValues = { + minutes: string; + seconds: string; +}; + +export const Timer: FC = ({ authData }) => { + const { isOpen, onOpen, onClose } = useDisclosure(); + const [state, setState] = useState<"READY" | "RUNNING">("READY"); + const [finishTimestamp, setFinishedTimestamp] = useState(null); + const [noticeTime, setNoticeTime] = useState("1"); + + const toast = useToast(); + + const completeNoticeTime = () => { + if (noticeTime === "") { + setNoticeTime("0"); + } + onClose(); + }; + + const { register, handleSubmit, setValue } = useForm(); + + const onStartStop = (values: FormValues) => { + console.log(values); + switch (state) { + case "READY": { + stompClient.publish({ + destination: `/app/rooms/${authData.roomId}/timer/start`, + body: JSON.stringify({ + value: Number(values.minutes) * 60 + Number(values.seconds), + }), + }); + return; + } + case "RUNNING": { + stompClient.publish({ + destination: `/app/rooms/${authData.roomId}/timer/stop`, + }); + return; + } + } + }; + + useEffect(() => { + stompClient.subscribe( + `/topic/rooms/${authData.roomId}/timer`, + (message) => { + console.log(message); + const { status, value, finishAt } = JSON.parse(message.body) as { + status: 0 | 1; + value: number; + finishAt: string; + }; + switch (status) { + case 0: { + const minutes = Math.floor(value / 60); + const seconds = value % 60; + setValue("minutes", minutes.toString()); + setValue("seconds", seconds.toString()); + setState("READY"); + return; + } + case 1: { + setFinishedTimestamp( + performance.now() + new Date(finishAt).valueOf() - Date.now() + ); + setState("RUNNING"); + return; + } + } + } + ); + }, [authData.roomId, setValue]); + + useEffect(() => { + if (finishTimestamp === null) { + return; + } + + let requestId: number | null; + + const tick = (now: number) => { + const timeStamp = finishTimestamp - now; + + if (timeStamp <= 0) { + setValue("minutes", "0"); + setValue("seconds", "0"); + setState("READY"); + toast({ + title: "タイマーが終了しました", + description: "お疲れ様でした", + status: "success", + duration: 9000, + isClosable: true, + }); + return; + } + + const seconds = Math.floor((timeStamp / 1000) % 60); + const minutes = Math.floor((timeStamp / 1000 / 60) % 60); + setValue("minutes", minutes.toString()); + setValue("seconds", seconds.toString()); + + requestId = requestAnimationFrame(tick); + }; + + if (state === "RUNNING") { + requestId = requestAnimationFrame(tick); + } + + return () => { + if (requestId) { + cancelAnimationFrame(requestId); + } + }; + }, [finishTimestamp, setValue, state]); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 残り時間通知 + + + + 残り + setNoticeTime(value)} + > + + + + + + + + + + + + + + + + + ); +}; diff --git a/app/src/main/pointer/src/deviceorientation.ts b/app/src/main/pointer/src/deviceorientation.ts new file mode 100644 index 00000000..2a79a6a2 --- /dev/null +++ b/app/src/main/pointer/src/deviceorientation.ts @@ -0,0 +1,80 @@ +import { stompClient } from "./stomp"; + +const messagePleasingWhenDeny = [ + "使用するには許可してください🥺", + "(リロードしてください)", +].join("\n"); + +/** + * for iOS Safari 13+ + */ +export const requestPermission = async () => { + if ( + DeviceMotionEvent && + // @ts-expect-error iOS 13+ にしかない + typeof DeviceMotionEvent.requestPermission === "function" + ) { + // @ts-expect-error iOS 13+ にしかない + const permission = await DeviceMotionEvent.requestPermission(); + if (permission === "denied") { + alert(messagePleasingWhenDeny); + } + } + + if ( + DeviceOrientationEvent && + // @ts-expect-error iOS 13+ にしかない + typeof DeviceOrientationEvent.requestPermission === "function" + ) { + // @ts-expect-error iOS 13+ にしかない + const permission = await DeviceOrientationEvent.requestPermission(); + if (permission === "denied") { + alert(messagePleasingWhenDeny); + } + } +}; + +const orientationKey = ["alpha", "beta", "gamma"] as const; + +type Orientation = { [K in typeof orientationKey[number]]: number }; + +const sub = (a: Orientation, b: Orientation): Orientation => ({ + alpha: a.alpha - b.alpha, + beta: a.beta - b.beta, + gamma: a.gamma - b.gamma, +}); + +let lastOrientation: Orientation | null = null; +let handler: ((orientation: DeviceOrientationEvent) => void) | null = null; + +export const subscribeOrientation = (roomId: string) => { + if (handler) { + return; + } + handler = (event: DeviceOrientationEvent) => { + const orientation = { + alpha: event.alpha!, + beta: event.beta!, + gamma: event.gamma!, + }; + + lastOrientation = lastOrientation ?? orientation; + + stompClient.publish({ + destination: `/app/rooms/${roomId}/pointer/control`, + body: JSON.stringify(sub(orientation, lastOrientation)), + }); + }; + window.addEventListener("deviceorientation", handler); +}; + +export const unsubscribeOrientation = (roomId: string) => { + lastOrientation = null; + if (handler) { + window.removeEventListener("deviceorientation", handler); + handler = null; + } + stompClient.publish({ + destination: `/app/rooms/${roomId}/pointer/disconnect`, + }); +}; diff --git a/app/src/main/pointer/src/generated/http-client/.gitignore b/app/src/main/pointer/src/generated/http-client/.gitignore new file mode 100644 index 00000000..149b5765 --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/.gitignore @@ -0,0 +1,4 @@ +wwwroot/*.js +node_modules +typings +dist diff --git a/app/src/main/pointer/src/generated/http-client/.npmignore b/app/src/main/pointer/src/generated/http-client/.npmignore new file mode 100644 index 00000000..999d88df --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/.npmignore @@ -0,0 +1 @@ +# empty npmignore to ensure all required files (e.g., in the dist folder) are published by npm \ No newline at end of file diff --git a/app/src/main/pointer/src/generated/http-client/.openapi-generator-ignore b/app/src/main/pointer/src/generated/http-client/.openapi-generator-ignore new file mode 100644 index 00000000..7484ee59 --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/app/src/main/pointer/src/generated/http-client/.openapi-generator/FILES b/app/src/main/pointer/src/generated/http-client/.openapi-generator/FILES new file mode 100644 index 00000000..16b445ee --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/.openapi-generator/FILES @@ -0,0 +1,9 @@ +.gitignore +.npmignore +.openapi-generator-ignore +api.ts +base.ts +common.ts +configuration.ts +git_push.sh +index.ts diff --git a/app/src/main/pointer/src/generated/http-client/.openapi-generator/VERSION b/app/src/main/pointer/src/generated/http-client/.openapi-generator/VERSION new file mode 100644 index 00000000..4ac4fded --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/.openapi-generator/VERSION @@ -0,0 +1 @@ +6.2.0 \ No newline at end of file diff --git a/app/src/main/pointer/src/generated/http-client/api.ts b/app/src/main/pointer/src/generated/http-client/api.ts new file mode 100644 index 00000000..76b2bd18 --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/api.ts @@ -0,0 +1,476 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { Configuration } from "./configuration"; +import globalAxios, { + AxiosPromise, + AxiosInstance, + AxiosRequestConfig, +} from "axios"; +// Some imports not used depending on template conditions +// @ts-ignore +import { + DUMMY_BASE_URL, + assertParamExists, + setApiKeyToObject, + setBasicAuthToObject, + setBearerAuthToObject, + setOAuthToObject, + setSearchParams, + serializeDataIfNeeded, + toPathString, + createRequestFunction, +} from "./common"; +// @ts-ignore +import { + BASE_PATH, + COLLECTION_FORMATS, + RequestArgs, + BaseAPI, + RequiredError, +} from "./base"; + +/** + * アクセストークンレスポンス + * @export + * @interface AccessTokenResponse + */ +export interface AccessTokenResponse { + /** + * トークンタイプ + * @type {string} + * @memberof AccessTokenResponse + */ + tokenType: string; + /** + * アクセストークン + * @type {string} + * @memberof AccessTokenResponse + */ + accessToken: string; + /** + * TTL + * @type {number} + * @memberof AccessTokenResponse + */ + ttl: number; +} +/** + * ルーム入室リクエスト + * @export + * @interface RoomJoinRequest + */ +export interface RoomJoinRequest { + /** + * パスコード + * @type {string} + * @memberof RoomJoinRequest + */ + passcode: string; + /** + * ユーザ名 + * @type {string} + * @memberof RoomJoinRequest + */ + name: string; +} +/** + * ルームレスポンス + * @export + * @interface RoomResponse + */ +export interface RoomResponse { + /** + * ルームID + * @type {string} + * @memberof RoomResponse + */ + roomId: string; + /** + * パスコード + * @type {string} + * @memberof RoomResponse + */ + passcode: string; +} + +/** + * HealthCheckApi - axios parameter creator + * @export + */ +export const HealthCheckApiAxiosParamCreator = function ( + configuration?: Configuration +) { + return { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + health: async (options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/api/health`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { + method: "GET", + ...baseOptions, + ...options, + }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = + baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + }; +}; + +/** + * HealthCheckApi - functional programming interface + * @export + */ +export const HealthCheckApiFp = function (configuration?: Configuration) { + const localVarAxiosParamCreator = + HealthCheckApiAxiosParamCreator(configuration); + return { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async health( + options?: AxiosRequestConfig + ): Promise< + (axios?: AxiosInstance, basePath?: string) => AxiosPromise + > { + const localVarAxiosArgs = await localVarAxiosParamCreator.health(options); + return createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + ); + }, + }; +}; + +/** + * HealthCheckApi - factory interface + * @export + */ +export const HealthCheckApiFactory = function ( + configuration?: Configuration, + basePath?: string, + axios?: AxiosInstance +) { + const localVarFp = HealthCheckApiFp(configuration); + return { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + health(options?: any): AxiosPromise { + return localVarFp + .health(options) + .then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * HealthCheckApi - object-oriented interface + * @export + * @class HealthCheckApi + * @extends {BaseAPI} + */ +export class HealthCheckApi extends BaseAPI { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof HealthCheckApi + */ + public health(options?: AxiosRequestConfig) { + return HealthCheckApiFp(this.configuration) + .health(options) + .then((request) => request(this.axios, this.basePath)); + } +} + +/** + * RoomApi - axios parameter creator + * @export + */ +export const RoomApiAxiosParamCreator = function ( + configuration?: Configuration +) { + return { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createRoom: async ( + options: AxiosRequestConfig = {} + ): Promise => { + const localVarPath = `/api/rooms`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { + method: "POST", + ...baseOptions, + ...options, + }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = + baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + joinRoom: async ( + roomId: string, + roomJoinRequest: RoomJoinRequest, + options: AxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'roomId' is not null or undefined + assertParamExists("joinRoom", "roomId", roomId); + // verify required parameter 'roomJoinRequest' is not null or undefined + assertParamExists("joinRoom", "roomJoinRequest", roomJoinRequest); + const localVarPath = `/api/rooms/{room_id}/join`.replace( + `{${"room_id"}}`, + encodeURIComponent(String(roomId)) + ); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { + method: "POST", + ...baseOptions, + ...options, + }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter["Content-Type"] = "application/json"; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = + baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + localVarRequestOptions.data = serializeDataIfNeeded( + roomJoinRequest, + localVarRequestOptions, + configuration + ); + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + }; +}; + +/** + * RoomApi - functional programming interface + * @export + */ +export const RoomApiFp = function (configuration?: Configuration) { + const localVarAxiosParamCreator = RoomApiAxiosParamCreator(configuration); + return { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createRoom( + options?: AxiosRequestConfig + ): Promise< + (axios?: AxiosInstance, basePath?: string) => AxiosPromise + > { + const localVarAxiosArgs = await localVarAxiosParamCreator.createRoom( + options + ); + return createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + ); + }, + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async joinRoom( + roomId: string, + roomJoinRequest: RoomJoinRequest, + options?: AxiosRequestConfig + ): Promise< + ( + axios?: AxiosInstance, + basePath?: string + ) => AxiosPromise + > { + const localVarAxiosArgs = await localVarAxiosParamCreator.joinRoom( + roomId, + roomJoinRequest, + options + ); + return createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + ); + }, + }; +}; + +/** + * RoomApi - factory interface + * @export + */ +export const RoomApiFactory = function ( + configuration?: Configuration, + basePath?: string, + axios?: AxiosInstance +) { + const localVarFp = RoomApiFp(configuration); + return { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createRoom(options?: any): AxiosPromise { + return localVarFp + .createRoom(options) + .then((request) => request(axios, basePath)); + }, + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + joinRoom( + roomId: string, + roomJoinRequest: RoomJoinRequest, + options?: any + ): AxiosPromise { + return localVarFp + .joinRoom(roomId, roomJoinRequest, options) + .then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * RoomApi - object-oriented interface + * @export + * @class RoomApi + * @extends {BaseAPI} + */ +export class RoomApi extends BaseAPI { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RoomApi + */ + public createRoom(options?: AxiosRequestConfig) { + return RoomApiFp(this.configuration) + .createRoom(options) + .then((request) => request(this.axios, this.basePath)); + } + + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RoomApi + */ + public joinRoom( + roomId: string, + roomJoinRequest: RoomJoinRequest, + options?: AxiosRequestConfig + ) { + return RoomApiFp(this.configuration) + .joinRoom(roomId, roomJoinRequest, options) + .then((request) => request(this.axios, this.basePath)); + } +} diff --git a/app/src/main/pointer/src/generated/http-client/base.ts b/app/src/main/pointer/src/generated/http-client/base.ts new file mode 100644 index 00000000..02afd188 --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/base.ts @@ -0,0 +1,78 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { Configuration } from "./configuration"; +// Some imports not used depending on template conditions +// @ts-ignore +import globalAxios, { + AxiosPromise, + AxiosInstance, + AxiosRequestConfig, +} from "axios"; + +export const BASE_PATH = "http://localhost:8080".replace(/\/+$/, ""); + +/** + * + * @export + */ +export const COLLECTION_FORMATS = { + csv: ",", + ssv: " ", + tsv: "\t", + pipes: "|", +}; + +/** + * + * @export + * @interface RequestArgs + */ +export interface RequestArgs { + url: string; + options: AxiosRequestConfig; +} + +/** + * + * @export + * @class BaseAPI + */ +export class BaseAPI { + protected configuration: Configuration | undefined; + + constructor( + configuration?: Configuration, + protected basePath: string = BASE_PATH, + protected axios: AxiosInstance = globalAxios + ) { + if (configuration) { + this.configuration = configuration; + this.basePath = configuration.basePath || this.basePath; + } + } +} + +/** + * + * @export + * @class RequiredError + * @extends {Error} + */ +export class RequiredError extends Error { + name: "RequiredError" = "RequiredError"; + constructor(public field: string, msg?: string) { + super(msg); + } +} diff --git a/app/src/main/pointer/src/generated/http-client/common.ts b/app/src/main/pointer/src/generated/http-client/common.ts new file mode 100644 index 00000000..7e316d57 --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/common.ts @@ -0,0 +1,198 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { Configuration } from "./configuration"; +import { RequiredError, RequestArgs } from "./base"; +import { AxiosInstance, AxiosResponse } from "axios"; + +/** + * + * @export + */ +export const DUMMY_BASE_URL = "https://example.com"; + +/** + * + * @throws {RequiredError} + * @export + */ +export const assertParamExists = function ( + functionName: string, + paramName: string, + paramValue: unknown +) { + if (paramValue === null || paramValue === undefined) { + throw new RequiredError( + paramName, + `Required parameter ${paramName} was null or undefined when calling ${functionName}.` + ); + } +}; + +/** + * + * @export + */ +export const setApiKeyToObject = async function ( + object: any, + keyParamName: string, + configuration?: Configuration +) { + if (configuration && configuration.apiKey) { + const localVarApiKeyValue = + typeof configuration.apiKey === "function" + ? await configuration.apiKey(keyParamName) + : await configuration.apiKey; + object[keyParamName] = localVarApiKeyValue; + } +}; + +/** + * + * @export + */ +export const setBasicAuthToObject = function ( + object: any, + configuration?: Configuration +) { + if (configuration && (configuration.username || configuration.password)) { + object["auth"] = { + username: configuration.username, + password: configuration.password, + }; + } +}; + +/** + * + * @export + */ +export const setBearerAuthToObject = async function ( + object: any, + configuration?: Configuration +) { + if (configuration && configuration.accessToken) { + const accessToken = + typeof configuration.accessToken === "function" + ? await configuration.accessToken() + : await configuration.accessToken; + object["Authorization"] = "Bearer " + accessToken; + } +}; + +/** + * + * @export + */ +export const setOAuthToObject = async function ( + object: any, + name: string, + scopes: string[], + configuration?: Configuration +) { + if (configuration && configuration.accessToken) { + const localVarAccessTokenValue = + typeof configuration.accessToken === "function" + ? await configuration.accessToken(name, scopes) + : await configuration.accessToken; + object["Authorization"] = "Bearer " + localVarAccessTokenValue; + } +}; + +function setFlattenedQueryParams( + urlSearchParams: URLSearchParams, + parameter: any, + key: string = "" +): void { + if (typeof parameter === "object") { + if (Array.isArray(parameter)) { + (parameter as any[]).forEach((item) => + setFlattenedQueryParams(urlSearchParams, item, key) + ); + } else { + Object.keys(parameter).forEach((currentKey) => + setFlattenedQueryParams( + urlSearchParams, + parameter[currentKey], + `${key}${key !== "" ? "." : ""}${currentKey}` + ) + ); + } + } else { + if (urlSearchParams.has(key)) { + urlSearchParams.append(key, parameter); + } else { + urlSearchParams.set(key, parameter); + } + } +} + +/** + * + * @export + */ +export const setSearchParams = function (url: URL, ...objects: any[]) { + const searchParams = new URLSearchParams(url.search); + setFlattenedQueryParams(searchParams, objects); + url.search = searchParams.toString(); +}; + +/** + * + * @export + */ +export const serializeDataIfNeeded = function ( + value: any, + requestOptions: any, + configuration?: Configuration +) { + const nonString = typeof value !== "string"; + const needsSerialization = + nonString && configuration && configuration.isJsonMime + ? configuration.isJsonMime(requestOptions.headers["Content-Type"]) + : nonString; + return needsSerialization + ? JSON.stringify(value !== undefined ? value : {}) + : value || ""; +}; + +/** + * + * @export + */ +export const toPathString = function (url: URL) { + return url.pathname + url.search + url.hash; +}; + +/** + * + * @export + */ +export const createRequestFunction = function ( + axiosArgs: RequestArgs, + globalAxios: AxiosInstance, + BASE_PATH: string, + configuration?: Configuration +) { + return >( + axios: AxiosInstance = globalAxios, + basePath: string = BASE_PATH + ) => { + const axiosRequestArgs = { + ...axiosArgs.options, + url: (configuration?.basePath || basePath) + axiosArgs.url, + }; + return axios.request(axiosRequestArgs); + }; +}; diff --git a/app/src/main/pointer/src/generated/http-client/configuration.ts b/app/src/main/pointer/src/generated/http-client/configuration.ts new file mode 100644 index 00000000..9e93a1fd --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/configuration.ts @@ -0,0 +1,123 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface ConfigurationParameters { + apiKey?: + | string + | Promise + | ((name: string) => string) + | ((name: string) => Promise); + username?: string; + password?: string; + accessToken?: + | string + | Promise + | ((name?: string, scopes?: string[]) => string) + | ((name?: string, scopes?: string[]) => Promise); + basePath?: string; + baseOptions?: any; + formDataCtor?: new () => any; +} + +export class Configuration { + /** + * parameter for apiKey security + * @param name security name + * @memberof Configuration + */ + apiKey?: + | string + | Promise + | ((name: string) => string) + | ((name: string) => Promise); + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + username?: string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + password?: string; + /** + * parameter for oauth2 security + * @param name security name + * @param scopes oauth2 scope + * @memberof Configuration + */ + accessToken?: + | string + | Promise + | ((name?: string, scopes?: string[]) => string) + | ((name?: string, scopes?: string[]) => Promise); + /** + * override base path + * + * @type {string} + * @memberof Configuration + */ + basePath?: string; + /** + * base options for axios calls + * + * @type {any} + * @memberof Configuration + */ + baseOptions?: any; + /** + * The FormData constructor that will be used to create multipart form data + * requests. You can inject this here so that execution environments that + * do not support the FormData class can still run the generated client. + * + * @type {new () => FormData} + */ + formDataCtor?: new () => any; + + constructor(param: ConfigurationParameters = {}) { + this.apiKey = param.apiKey; + this.username = param.username; + this.password = param.password; + this.accessToken = param.accessToken; + this.basePath = param.basePath; + this.baseOptions = param.baseOptions; + this.formDataCtor = param.formDataCtor; + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + public isJsonMime(mime: string): boolean { + const jsonMime: RegExp = new RegExp( + "^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$", + "i" + ); + return ( + mime !== null && + (jsonMime.test(mime) || + mime.toLowerCase() === "application/json-patch+json") + ); + } +} diff --git a/app/src/main/pointer/src/generated/http-client/git_push.sh b/app/src/main/pointer/src/generated/http-client/git_push.sh new file mode 100644 index 00000000..f53a75d4 --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/git_push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=$(git remote) +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' diff --git a/app/src/main/pointer/src/generated/http-client/index.ts b/app/src/main/pointer/src/generated/http-client/index.ts new file mode 100644 index 00000000..61072a74 --- /dev/null +++ b/app/src/main/pointer/src/generated/http-client/index.ts @@ -0,0 +1,16 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export * from "./api"; +export * from "./configuration"; diff --git a/app/src/main/pointer/src/main.tsx b/app/src/main/pointer/src/main.tsx new file mode 100644 index 00000000..0626e7a2 --- /dev/null +++ b/app/src/main/pointer/src/main.tsx @@ -0,0 +1,19 @@ +import { ChakraProvider } from "@chakra-ui/react"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import { App } from "./App"; +import { stompClient } from "./stomp"; +import { theme } from "./theme"; + +stompClient.activate(); + +// HTML で定義されているので disable +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +createRoot(document.getElementById("root")!).render( + + + + + +); diff --git a/app/src/main/pointer/src/sockjs-client.d.ts b/app/src/main/pointer/src/sockjs-client.d.ts new file mode 100644 index 00000000..099c38db --- /dev/null +++ b/app/src/main/pointer/src/sockjs-client.d.ts @@ -0,0 +1,3 @@ +declare module "sockjs-client/dist/sockjs" { + export default (await import("sockjs-client")).default; +} diff --git a/app/src/main/pointer/src/stomp.ts b/app/src/main/pointer/src/stomp.ts new file mode 100644 index 00000000..ad973241 --- /dev/null +++ b/app/src/main/pointer/src/stomp.ts @@ -0,0 +1,6 @@ +import { Client } from "@stomp/stompjs"; +import SockJS from "sockjs-client/dist/sockjs"; + +export const stompClient = new Client({ + webSocketFactory: () => new SockJS(`/ws`), +}); diff --git a/app/src/main/pointer/src/theme.ts b/app/src/main/pointer/src/theme.ts new file mode 100644 index 00000000..ef1b94a2 --- /dev/null +++ b/app/src/main/pointer/src/theme.ts @@ -0,0 +1,18 @@ +import { extendTheme, type ThemeConfig } from "@chakra-ui/react"; + +const config: ThemeConfig = { + initialColorMode: "dark", + useSystemColorMode: false, +}; + +export const theme = extendTheme({ + config, + styles: { + global: { + "html, body, #root": { + w: "100%", + h: "100%", + }, + }, + }, +}); diff --git a/app/src/main/pointer/src/types/AuthData.ts b/app/src/main/pointer/src/types/AuthData.ts new file mode 100644 index 00000000..cb5906d4 --- /dev/null +++ b/app/src/main/pointer/src/types/AuthData.ts @@ -0,0 +1,9 @@ +import { AccessTokenResponse } from "@/generated/http-client"; + +/** + * ログインユーザ + */ +export type AuthData = AccessTokenResponse & { + userName: string; + roomId: string; +}; diff --git a/app/src/main/pointer/src/vite-env.d.ts b/app/src/main/pointer/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/app/src/main/pointer/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/app/src/main/pointer/tsconfig.json b/app/src/main/pointer/tsconfig.json new file mode 100644 index 00000000..b16a9bff --- /dev/null +++ b/app/src/main/pointer/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/app/src/main/pointer/tsconfig.node.json b/app/src/main/pointer/tsconfig.node.json new file mode 100644 index 00000000..9d31e2ae --- /dev/null +++ b/app/src/main/pointer/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/app/src/main/pointer/vite.config.ts b/app/src/main/pointer/vite.config.ts new file mode 100644 index 00000000..7b0a9f30 --- /dev/null +++ b/app/src/main/pointer/vite.config.ts @@ -0,0 +1,26 @@ +import basicSsl from "@vitejs/plugin-basic-ssl"; +import react from "@vitejs/plugin-react"; +import path from "path"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [react(), basicSsl()], + resolve: { + alias: { + "@": path.join(__dirname, "src"), + }, + }, + server: { + port: 8888, + proxy: { + "/api": { + target: "http://localhost:8080", + }, + "/ws": { + target: "ws://localhost:8080", + ws: true, + }, + }, + }, + test: {}, +}); diff --git a/app/src/main/pointer/yarn.lock b/app/src/main/pointer/yarn.lock new file mode 100644 index 00000000..e2ae4b82 --- /dev/null +++ b/app/src/main/pointer/yarn.lock @@ -0,0 +1,4854 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.19.3": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz" + integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== + +"@babel/core@^7.18.13": + version "7.19.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz" + integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.3" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.3" + "@babel/types" "^7.19.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.19.3", "@babel/generator@^7.19.4": + version "7.19.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.19.5.tgz" + integrity sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg== + dependencies: + "@babel/types" "^7.19.4" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-compilation-targets@^7.19.3": + version "7.19.3" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz" + integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== + dependencies: + "@babel/compat-data" "^7.19.3" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.19.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz" + integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz" + integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== + +"@babel/helper-simple-access@^7.18.6": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz" + integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== + dependencies: + "@babel/types" "^7.19.4" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.19.0": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz" + integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.4" + "@babel/types" "^7.19.4" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.18.10", "@babel/parser@^7.19.3", "@babel/parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz" + integrity sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA== + +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx-self@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz" + integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-source@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz" + integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.19.0" + +"@babel/runtime-corejs3@^7.10.2": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.4.tgz" + integrity sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ== + dependencies: + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz" + integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz" + integrity sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.4" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.19.4" + "@babel/types" "^7.19.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz" + integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@chakra-ui/accordion@2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.1.1.tgz" + integrity sha512-5f4QBl/0EgU/9EVvzlj8ZU7SWwG6nUHCE9moGBCbgiIOVBEySxZ5Robsk6+T7sXmzQ41db04GcUE9NRKdalgIA== + dependencies: + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/transition" "2.0.10" + +"@chakra-ui/alert@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.0.11.tgz" + integrity sha512-n40KHU3j1H6EbIdgptjEad92V7Fpv7YD++ZBjy2g1h4w9ay9nw4kGHib3gaIkBupLf52CfLqySEc8w0taoIlXQ== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/spinner" "2.0.10" + +"@chakra-ui/anatomy@2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.0.7.tgz" + integrity sha512-vzcB2gcsGCxhrKbldQQV6LnBPys4eSSsH2UA2mLsT+J3WlXw0aodZw0eE/nH7yLxe4zaQ4Gnc0KjkFW4EWNKSg== + +"@chakra-ui/avatar@2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.1.1.tgz" + integrity sha512-lTZPUq4Pefxgv3ndyJMxIHgFrXwdz2VZFCLF/aKcuGaUlB7TBYaCurQ7TNbME8j8VkJWNX+vKiVHPYvxsrITwQ== + dependencies: + "@chakra-ui/image" "2.0.11" + "@chakra-ui/react-children-utils" "2.0.2" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/breadcrumb@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.0.10.tgz" + integrity sha512-roKFA7nheq18eWNAdrHV6w8A9vZMSQTEEsbL6eU0lhUkolW9RlDjBl1bZvE7icFkNFXlJ33n8+0QAezLI+mMrQ== + dependencies: + "@chakra-ui/react-children-utils" "2.0.2" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/breakpoint-utils@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.4.tgz" + integrity sha512-SUUEYnA/FCIKYDHMuEXcnBMwet+6RAAjQ+CqGD1hlwKPTfh7EK9fS8FoVAJa9KpRKAc/AawzPkgwvorzPj8NSg== + +"@chakra-ui/button@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/button/-/button-2.0.11.tgz" + integrity sha512-J6iMRITqxTxa0JexHUY9c7BXUrTZtSkl3jZ2hxiFybB4MQL8J2wZ24O846B6M+WTYqy7XVuHRuVURnH4czWesw== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/spinner" "2.0.10" + +"@chakra-ui/checkbox@2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.2.1.tgz" + integrity sha512-soTeXEI+4UZSA4B4rRLpdh3cIW/gdhY6k0eXF4ZWExPb+dJ5Giv497S96vS4IGE7SJ7Ugw9kaWS+do2lSiPJew== + dependencies: + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/visually-hidden" "2.0.11" + "@zag-js/focus-visible" "0.1.0" + +"@chakra-ui/clickable@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.10.tgz" + integrity sha512-G6JdR6yAMlXpfjOJ70W2FL7aUwNuomiMFtkneeTpk7Q42bJ5iGHfYlbZEx5nJd8iB+UluXVM4xlhMv2MyytjGw== + dependencies: + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/close-button@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.0.11.tgz" + integrity sha512-9WF/nwwK9BldS89WQ5PtXK2nFS4r8QOgKls2BOwXfE+rGmOUZtOsu8ne/drXRjgkiBRETR6CxdyUjm7EPzXllw== + dependencies: + "@chakra-ui/icon" "3.0.11" + +"@chakra-ui/color-mode@2.1.9": + version "2.1.9" + resolved "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.1.9.tgz" + integrity sha512-0kx0I+AQon8oS23/X+qMtnhsv/1BUulyJvU56p3Uh8CRaBfgJ7Ly9CerShoUL+5kadu6hN1M9oty4cugaCwv2w== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/control-box@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.0.10.tgz" + integrity sha512-sHmZanFLEv4IDATl19ZTxq8Bi8PtjfvnsN6xF4k7JGSYUnk1YXUf1coyW7WKdcsczOASrMikfsLc3iEVAzx4Ng== + +"@chakra-ui/counter@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.0.10.tgz" + integrity sha512-MZK8UKUZp4nFMd+GlV/cq0NIARS7UdlubTuCx+wockw9j2JI5OHzsyK0XiWuJiq5psegSTzpbtT99QfAUm3Yiw== + dependencies: + "@chakra-ui/number-utils" "2.0.4" + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/css-reset@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.0.8.tgz" + integrity sha512-VuDD1rk1pFc+dItk4yUcstyoC9D2B35hatHDBtlPMqTczFAzpbgVJJYgEHANatXGfulM5SdckmYEIJ3Tac1Rtg== + +"@chakra-ui/descendant@3.0.10": + version "3.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.0.10.tgz" + integrity sha512-MHH0Qdm0fGllGP2xgx4WOycmrpctyyEdGw6zxcfs2VqZNlrwmjG3Yb9eVY+Q7UmEv5rwAq6qRn7BhQxgSPn3Cg== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/dom-utils@2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.0.3.tgz" + integrity sha512-aeGlRmTxcv0cvW44DyeZHru1i68ZDQsXpfX2dnG1I1yBlT6GlVx1xYjCULis9mjhgvd2O3NfcYPRTkjNWTDUbA== + +"@chakra-ui/editable@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/editable/-/editable-2.0.12.tgz" + integrity sha512-37bDqm+j2JTN2XR443KRK9MmHHIQuS6fN+2TRuFgjfG8TomxxCJnhJ3GIfQSKh5Yjtnt4sXDmL4L0tyDpNrrrw== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-focus-on-pointer-down" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/event-utils@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.5.tgz" + integrity sha512-VXoOAIsM0PFKDlhm+EZxkWlUXd5UFTb/LTux3y3A+S9G5fDxLRvpiLWByPUgTFTCDFcgTCF+YnQtdWJB4DLyxg== + +"@chakra-ui/focus-lock@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.0.12.tgz" + integrity sha512-NvIP59A11ZNbxXZ3qwxSiQ5npjABkpSbTIjK0uZ9bZm5LMfepRnuuA19VsVlq31/BYV9nHFAy6xzIuG+Qf9xMA== + dependencies: + "@chakra-ui/dom-utils" "2.0.3" + react-focus-lock "^2.9.1" + +"@chakra-ui/form-control@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.0.11.tgz" + integrity sha512-MVhIe0xY4Zn06IXRXFmS9tCa93snppK1SdUQb1P99Ipo424RrL5ykzLnJ8CAkQrhoVP3sxF7z3eOSzk8/iRfow== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/hooks@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.0.11.tgz" + integrity sha512-mYN4u9lbjDjEr/VucrVcLGg/sIO6gA9ZprcT3n9CBGSWt3xih7fCOJmE+yRcCNbL7335AMrv7a/M5Q30aRArcA== + dependencies: + "@chakra-ui/react-utils" "2.0.8" + "@chakra-ui/utils" "2.0.11" + compute-scroll-into-view "1.0.14" + copy-to-clipboard "3.3.1" + +"@chakra-ui/icon@3.0.11": + version "3.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.0.11.tgz" + integrity sha512-RG4jf/XmBdaxOYI5J5QstEtTCPoVlmrQ/XiWhvN0LTgAnmZIqVwFl3Uw+satArdStHAs0GmJZg/E/soFTWuFmw== + dependencies: + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/image@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/image/-/image-2.0.11.tgz" + integrity sha512-S6NqAprPcbHnck/J+2wg06r9SSol62v5A01O8Kke2PnAyjalMcS+6P59lDRO7wvPqsdxq4PPbSTZP6Dww2CvcA== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/input@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/input/-/input-2.0.11.tgz" + integrity sha512-kaV0VCz6/yzoCKQnh/tMUVgh+Rp6EnM+WzJ37SVX1gDvErON2bmmVLU45BiRoWUcd50wOhDlpsNVUWP0sLlCDA== + dependencies: + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/object-utils" "2.0.4" + "@chakra-ui/react-children-utils" "2.0.2" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/layout@2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.1.8.tgz" + integrity sha512-pcNUNgMh+e4wepNOlCg5iDrxGg4VFBpqZPmSHoP4TyPN2ddEnDRLoMLaREMoX7gEVyTsqEFOFg+wa3JZK32H4A== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.4" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/object-utils" "2.0.4" + "@chakra-ui/react-children-utils" "2.0.2" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/lazy-utils@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.2.tgz" + integrity sha512-MTxutBJZvqNNqrrS0722cI7qrnGu0yUQpIebmTxYwI+F3cOnPEKf5Ni+hrA8hKcw4XJhSY4npAPPYu1zJbOV4w== + +"@chakra-ui/live-region@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.0.10.tgz" + integrity sha512-eQ2ZIreR/plzi/KGszDYTi1TvIyGEBcPiWP52BQOS7xwpzb1vsoR1FgFAIELxAGJvKnMUs+9qVogfyRBX8PdOg== + +"@chakra-ui/media-query@3.2.7": + version "3.2.7" + resolved "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.2.7.tgz" + integrity sha512-hbgm6JCe0kYU3PAhxASYYDopFQI26cW9kZnbp+5tRL1fykkVWNMPwoGC8FEZPur9JjXp7aoL6H4Jk7nrxY/XWw== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.4" + "@chakra-ui/react-env" "2.0.10" + +"@chakra-ui/menu@2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.1.1.tgz" + integrity sha512-9fpCyV3vufLV5Rvv/oYC3LyCIkNqh0bEdYFVOLiqCZ6mt6NLFxL2jgE25nROYfDXQuBkY0qPC9IopYU198G4nw== + dependencies: + "@chakra-ui/clickable" "2.0.10" + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/lazy-utils" "2.0.2" + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/react-children-utils" "2.0.2" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-animation-state" "2.0.5" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-disclosure" "2.0.5" + "@chakra-ui/react-use-focus-effect" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-outside-click" "2.0.4" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/transition" "2.0.10" + +"@chakra-ui/modal@2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.2.1.tgz" + integrity sha512-+zfiUG/yZqUQ0wY7syoZg01cpBf54lbKUe7+ANEx558UQGbsI4bbcHSkY9l5lsprQ8teInvhjb6BekeCA0e7TA== + dependencies: + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/focus-lock" "2.0.12" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/transition" "2.0.10" + aria-hidden "^1.1.1" + react-remove-scroll "^2.5.4" + +"@chakra-ui/number-input@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.0.12.tgz" + integrity sha512-3owLjl01sCYpTd3xbq//fJo9QJ0Q3PVYSx9JeOzlXnnTW8ws+yHPrqQzPe7G+tO4yOYynWuUT+NJ9oyCeAJIxA== + dependencies: + "@chakra-ui/counter" "2.0.10" + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-event-listener" "2.0.4" + "@chakra-ui/react-use-interval" "2.0.2" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + +"@chakra-ui/number-utils@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.4.tgz" + integrity sha512-MdYd29GboBoKaXY9jhbY0Wl+0NxG1t/fa32ZSIbU6VrfMsZuAMl4NEJsz7Xvhy50fummLdKn5J6HFS7o5iyIgw== + +"@chakra-ui/object-utils@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.0.4.tgz" + integrity sha512-sY98L4v2wcjpwRX8GCXqT+WzpL0i5FHVxT1Okxw0360T2tGnZt7toAwpMfIOR3dzkemP9LfXMCyBmWR5Hi2zpQ== + +"@chakra-ui/pin-input@2.0.14": + version "2.0.14" + resolved "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.0.14.tgz" + integrity sha512-gFNlTUjU1xIuOErR/d/HrNNh1mS0erjNJSt5C6RU/My4lShzgCczmwnil7TuEx3k7lPqHKLEf/CGeCxBSUjaGA== + dependencies: + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/react-children-utils" "2.0.2" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/popover@2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.1.1.tgz" + integrity sha512-j09NsesfT+eaYITkITYJXDlRcPoOeQUM80neJZKOBgul2iHkVsEoii8dwS5Ip5ONeu4ane1b6zEOlYvYj2SrkA== + dependencies: + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/lazy-utils" "2.0.2" + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-animation-state" "2.0.5" + "@chakra-ui/react-use-disclosure" "2.0.5" + "@chakra-ui/react-use-focus-effect" "2.0.5" + "@chakra-ui/react-use-focus-on-pointer-down" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/popper@3.0.8": + version "3.0.8" + resolved "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.0.8.tgz" + integrity sha512-246eUwuCRsLpTPxn5T8D8T9/6ODqmmz6pRRJAjGnLlUB0gNHgjisBn0UDBic5Gbxcg0sqKvxOMY3uurbW5lXTA== + dependencies: + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@popperjs/core" "^2.9.3" + +"@chakra-ui/portal@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.0.10.tgz" + integrity sha512-VRYvVAggIuqIZ3IQ6XZ1b5ujjjOUgPk9PPdc9jssUngZa7RG+5NXNhgoM8a5TsXv6aPEolBOlDNWuxzRQ4RSSg== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/progress@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.0.11.tgz" + integrity sha512-2OwxGxI6W757QpDB6b++B4b2+t0oBgaQdHnd4/y35n3+mOFj++Wg7XpW4/iDHn+x3LkM+X3NIgdBWQFlmGx+6w== + dependencies: + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/provider@2.0.19": + version "2.0.19" + resolved "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.0.19.tgz" + integrity sha512-V+p0OePre0OgYmNxLbfiPWWbzaJ/EM2sfaRtD7E6ZA4TjUl2m4pWdC6OPMOiklu7EALfSgVk9X6Jh5pc+moH1g== + dependencies: + "@chakra-ui/css-reset" "2.0.8" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-env" "2.0.10" + "@chakra-ui/system" "2.2.12" + "@chakra-ui/utils" "2.0.11" + +"@chakra-ui/radio@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.0.12.tgz" + integrity sha512-871hqAGQaufxyUzPP3aautPBIRZQmpi3fw5XPZ6SbY62dV61M4sjcttd46HfCf5SrAonoOADFQLMGQafznjhaA== + dependencies: + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@zag-js/focus-visible" "0.1.0" + +"@chakra-ui/react-children-utils@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.2.tgz" + integrity sha512-mRTGAZ3DBXB3hgVwS2DVJe3Nlc0qGvMN0PAo4tD/3fj2op2IwspLcYPAWC5D/rI2xj2JlwE6szAtbvxdAfLCNw== + +"@chakra-ui/react-context@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.0.4.tgz" + integrity sha512-eBITFkf7fLSiMZrSdhweK4fYr41WUNMEeIEOP2dCWolE7WgKxNYaYleC+iRGY0GeXkFM2KYywUtixjJe29NuVA== + +"@chakra-ui/react-env@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-2.0.10.tgz" + integrity sha512-3Yab5EbFcCGYzEsoijy4eA3354Z/JoXyk9chYIuW7Uwd+K6g/R8C0mUSAHeTmfp6Fix9kzDgerO5MWNM87b8cA== + +"@chakra-ui/react-types@2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.3.tgz" + integrity sha512-1mJYOQldFTALE0Wr3j6tk/MYvgQIp6CKkJulNzZrI8QN+ox/bJOh8OVP4vhwqvfigdLTui0g0k8M9h+j2ub/Mw== + +"@chakra-ui/react-use-animation-state@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.5.tgz" + integrity sha512-8gZIqZpMS5yTGlC+IqYoSrV13joiAYoeI0YR2t68WuDagcZ459OrjE57+gF04NLxfdV7eUgwqnpuv7IOLbJX/A== + dependencies: + "@chakra-ui/dom-utils" "2.0.3" + "@chakra-ui/react-use-event-listener" "2.0.4" + +"@chakra-ui/react-use-callback-ref@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.4.tgz" + integrity sha512-he7EQfwMA4mwiDDKvX7cHIJaboCqf7UD3KYHGUcIjsF4dSc2Y8X5Ze4w+hmVZoJWIe4DWUzb3ili2SUm8eTgPg== + +"@chakra-ui/react-use-controllable-state@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.5.tgz" + integrity sha512-JrZZpMX24CUyfDuyqDczw9Z9IMvjH8ujETHK0Zu4M0SIsX/q4EqOwwngUFL03I2gx/O38HfSdeX8hMu4zbTAGA== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-disclosure@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.5.tgz" + integrity sha512-kPLB9oxImASRhAbKfvfc03/lbAJbsXndEVRzd+nvvL+QZm2RRfnel3k6OIkWvGFOXXYOPE2+slLe8ZPwbTGg9g== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-event-listener@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.4.tgz" + integrity sha512-VqmalfKWMO8D21XuZO19WUtcP5xhbHXKzkggApTChZUN02UC5TC4pe0pYbDygoeUuNBhY+9lJKHeS08vYsljRg== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-focus-effect@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.5.tgz" + integrity sha512-sbe1QnsXXfjukM+laxbKnT0UnMpHe/7kTzEPG/BYM6/ZDUUmrC1Nz+8l+3H/52iWIaruikDBdif/Xd37Yvu3Kg== + dependencies: + "@chakra-ui/dom-utils" "2.0.3" + "@chakra-ui/react-use-event-listener" "2.0.4" + "@chakra-ui/react-use-update-effect" "2.0.4" + +"@chakra-ui/react-use-focus-on-pointer-down@2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.3.tgz" + integrity sha512-8cKmpv26JnblexNaekWxEDI7M+MZnJcp1PJUz6lByjfQ1m4YjFr1cdbdhG4moaqzzYs7vTmO/qL8KVq8ZLUwyQ== + dependencies: + "@chakra-ui/react-use-event-listener" "2.0.4" + +"@chakra-ui/react-use-interval@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.0.2.tgz" + integrity sha512-5U1c0pEB5n0Yri0E4RdFXWx2RVBZBBhD8Uu49dM33jkIguCbIPmZ+YgVry5DDzCHyz4RgDg4yZKOPK0PI8lEUg== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-latest-ref@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.2.tgz" + integrity sha512-Ra/NMV+DSQ3n0AdKsyIqdgnFzls5UntabtIRfDXLrqmJ4tI0a1tDdop2qop0Ue87AcqD9P1KtQue4KPx7wCElw== + +"@chakra-ui/react-use-merge-refs@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.4.tgz" + integrity sha512-aoWvtE5tDQNaLCiNUI6WV+MA2zVcCLR5mHSCISmowlTXyXOqOU5Fo9ZoUftzrmgCJpDu5x1jfUOivxuHUueb0g== + +"@chakra-ui/react-use-outside-click@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.0.4.tgz" + integrity sha512-uerJKS8dqg2kHs1xozA5vcCqW0UInuwrfCPb+rDWBTpu7aEqxABMw9W3e4gfOABrAjhKz2I0a/bu2i8zbVwdLw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-pan-event@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.5.tgz" + integrity sha512-nhE3b85++EEmBD2v6m46TLoA4LehSCZ349P8kvEjw/RC0K6XDOZndaBucIeAlnpEENSSUpczFfMSOLxSHdu0oA== + dependencies: + "@chakra-ui/event-utils" "2.0.5" + "@chakra-ui/react-use-latest-ref" "2.0.2" + framesync "5.3.0" + +"@chakra-ui/react-use-previous@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.0.2.tgz" + integrity sha512-ap/teLRPKopaHYD80fnf0TR/NpTWHJO5VdKg6sPyF1y5ediYLAzPT1G2OqMCj4QfJsYDctioT142URDYe0Nn7w== + +"@chakra-ui/react-use-safe-layout-effect@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.2.tgz" + integrity sha512-gl5HDq9RVeDJiT8udtpx12KRV8JPLJHDIUX8f/yZcKpXow0C7FFGg5Yy5I9397NQog5ZjKMuOg+AUq9TLJxsyQ== + +"@chakra-ui/react-use-size@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.0.4.tgz" + integrity sha512-W6rgTLuoSC4ovZtqYco8cG+yBadH3bhlg92T5lgpKDakSDr0mXcZdbGx6g0AOkgxXm0V1jWNGO1743wudtF7ew== + dependencies: + "@zag-js/element-size" "0.1.0" + +"@chakra-ui/react-use-timeout@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.2.tgz" + integrity sha512-n6zb3OmxtDmRMxYkDgILqKh15aDOa8jNLHBlqHzmlL6mEGNKmMFPW9j/KvpAqSgKjUTDRnnXcpneprTMKy/yrw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-update-effect@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.4.tgz" + integrity sha512-F/I9LVnGAQyvww+x7tQb47wCwjhMYjpxtM1dTg1U3oCEXY0yF1Ts3NJLUAlsr3nAW6epJIwWx61niC7KWpam1w== + +"@chakra-ui/react-utils@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.8.tgz" + integrity sha512-OSHHBKZlJWTi2NZcPnBx1PyZvLQY+n5RPBtcri7/89EDdAwz2NdEhp2Dz1yQRctOSCF1kB/rnCYDP1U0oRk9RQ== + dependencies: + "@chakra-ui/utils" "2.0.11" + +"@chakra-ui/react@2.3.5": + version "2.3.5" + resolved "https://registry.npmjs.org/@chakra-ui/react/-/react-2.3.5.tgz" + integrity sha512-bQDRV23M3IvF0+AorTvqJmG/4T6KKQIb+1XGA2RyxonoSHVt89HbN3qnygHJw06Sdgpclxdbr/1qZ4o8+SMbpA== + dependencies: + "@chakra-ui/accordion" "2.1.1" + "@chakra-ui/alert" "2.0.11" + "@chakra-ui/avatar" "2.1.1" + "@chakra-ui/breadcrumb" "2.0.10" + "@chakra-ui/button" "2.0.11" + "@chakra-ui/checkbox" "2.2.1" + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/control-box" "2.0.10" + "@chakra-ui/counter" "2.0.10" + "@chakra-ui/css-reset" "2.0.8" + "@chakra-ui/editable" "2.0.12" + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/hooks" "2.0.11" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/image" "2.0.11" + "@chakra-ui/input" "2.0.11" + "@chakra-ui/layout" "2.1.8" + "@chakra-ui/live-region" "2.0.10" + "@chakra-ui/media-query" "3.2.7" + "@chakra-ui/menu" "2.1.1" + "@chakra-ui/modal" "2.2.1" + "@chakra-ui/number-input" "2.0.12" + "@chakra-ui/pin-input" "2.0.14" + "@chakra-ui/popover" "2.1.1" + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/progress" "2.0.11" + "@chakra-ui/provider" "2.0.19" + "@chakra-ui/radio" "2.0.12" + "@chakra-ui/react-env" "2.0.10" + "@chakra-ui/select" "2.0.12" + "@chakra-ui/skeleton" "2.0.17" + "@chakra-ui/slider" "2.0.12" + "@chakra-ui/spinner" "2.0.10" + "@chakra-ui/stat" "2.0.11" + "@chakra-ui/styled-system" "2.3.4" + "@chakra-ui/switch" "2.0.13" + "@chakra-ui/system" "2.2.12" + "@chakra-ui/table" "2.0.11" + "@chakra-ui/tabs" "2.1.3" + "@chakra-ui/tag" "2.0.11" + "@chakra-ui/textarea" "2.0.12" + "@chakra-ui/theme" "2.1.13" + "@chakra-ui/toast" "3.0.13" + "@chakra-ui/tooltip" "2.2.0" + "@chakra-ui/transition" "2.0.10" + "@chakra-ui/utils" "2.0.11" + "@chakra-ui/visually-hidden" "2.0.11" + +"@chakra-ui/select@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/select/-/select-2.0.12.tgz" + integrity sha512-NCDMb0w48GYCHmazVSQ7/ysEpbnri+Up6n+v7yytf6g43TPRkikvK5CsVgLnAEj0lIdCJhWXTcZer5wG5KOEgA== + dependencies: + "@chakra-ui/form-control" "2.0.11" + +"@chakra-ui/shared-utils@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.2.tgz" + integrity sha512-wC58Fh6wCnFFQyiebVZ0NI7PFW9+Vch0QE6qN7iR+bLseOzQY9miYuzPJ1kMYiFd6QTOmPJkI39M3wHqrPYiOg== + +"@chakra-ui/skeleton@2.0.17": + version "2.0.17" + resolved "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.0.17.tgz" + integrity sha512-dL7viXEKDEzmAJGbHMj+QbGl9PAd0VWztEcWcz5wOGfmAcJllA0lVh6NmG/yqLb6iXPCX4Y1Y0Yurm459TEYWg== + dependencies: + "@chakra-ui/media-query" "3.2.7" + "@chakra-ui/react-use-previous" "2.0.2" + +"@chakra-ui/slider@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.0.12.tgz" + integrity sha512-Cna04J7e4+F3tJNb7tRNfPP+koicbDsKJBp+f1NpR32JbRzIfrf2Vdr4hfD5/uOfC4RGxnVInNZzZLGBelLtLw== + dependencies: + "@chakra-ui/number-utils" "2.0.4" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-latest-ref" "2.0.2" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-pan-event" "2.0.5" + "@chakra-ui/react-use-size" "2.0.4" + "@chakra-ui/react-use-update-effect" "2.0.4" + +"@chakra-ui/spinner@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.0.10.tgz" + integrity sha512-SwId1xPaaFAaEYrR9eHkQHAuB66CbxwjWaQonEjeEUSh9ecxkd5WbXlsQSyf2hVRIqXJg0m3HIYblcKUsQt9Rw== + +"@chakra-ui/stat@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.0.11.tgz" + integrity sha512-ZPFK2fKufDSHD8bp/KhO3jLgW/b3PzdG4zV+7iTO7OYjxm5pkBfBAeMqfXGx4cl51rtWUKzsY0HV4vLLjcSjHw== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/styled-system@2.3.4": + version "2.3.4" + resolved "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.3.4.tgz" + integrity sha512-Lozbedu+GBj4EbHB/eGv475SFDLApsIEN9gNKiZJBJAE1HIhHn3Seh1iZQSrHC/Beq+D5cQq3Z+yPn3bXtFU7w== + dependencies: + csstype "^3.0.11" + lodash.mergewith "4.6.2" + +"@chakra-ui/switch@2.0.13": + version "2.0.13" + resolved "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.13.tgz" + integrity sha512-Ikj0L+SLLs/SnfGCiUChaldLIr/aizA1Q9D5+X6LtxpBnixFK/+fNXU+3juPDi9G1IFuNz2IAG51souO7C4nSQ== + dependencies: + "@chakra-ui/checkbox" "2.2.1" + +"@chakra-ui/system@2.2.12": + version "2.2.12" + resolved "https://registry.npmjs.org/@chakra-ui/system/-/system-2.2.12.tgz" + integrity sha512-I7hFQswp8tG6ogjEMFs5TsCItdCYuNxpLAULgUrLdOlsQeNnHNQhlL4zpIfD+VzguhsNy5lisbegAMKjdghTYg== + dependencies: + "@chakra-ui/color-mode" "2.1.9" + "@chakra-ui/react-utils" "2.0.8" + "@chakra-ui/styled-system" "2.3.4" + "@chakra-ui/utils" "2.0.11" + react-fast-compare "3.2.0" + +"@chakra-ui/table@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.11.tgz" + integrity sha512-zQTiqPKEgjdeO/PG0FByn0fH4sPF7dLJF+YszrIzDc6wvpD96iY6MYLeV+CSelbH1g0/uibcJ10PSaFStfGUZg== + dependencies: + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/tabs@2.1.3": + version "2.1.3" + resolved "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.3.tgz" + integrity sha512-9gUcj49LMt5QQnfJHR/ctr9VPttJ97CtQWuH2Irjb3RXkq1TRrz6wjythPImNQUv1/DYyXp2jsUhoEQc4Oz14Q== + dependencies: + "@chakra-ui/clickable" "2.0.10" + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/lazy-utils" "2.0.2" + "@chakra-ui/react-children-utils" "2.0.2" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/tag@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/tag/-/tag-2.0.11.tgz" + integrity sha512-iJJcX+4hl+6Se/8eCRzG+xxDwZfiYgc4Ly/8s93M0uW2GLb+ybbfSE2DjeKSyk3mQVeGzuxGkBfDHH2c2v26ew== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/textarea@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.12.tgz" + integrity sha512-msR9YMynRXwZIqR6DgjQ2MogA/cW1syBx/R0v3es+9Zx8zlbuKdoLhYqajHteCup8dUzTeIH2Vs2vAwgq4wu5A== + dependencies: + "@chakra-ui/form-control" "2.0.11" + +"@chakra-ui/theme-tools@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.12.tgz" + integrity sha512-mnMlKSmXkCjHUJsKWmJbgBTGF2vnLaMLv1ihkBn5eQcCubMQrBLTiMAEFl5pZdzuHItU6QdnLGA10smcXbNl0g== + dependencies: + "@chakra-ui/anatomy" "2.0.7" + "@ctrl/tinycolor" "^3.4.0" + +"@chakra-ui/theme@2.1.13": + version "2.1.13" + resolved "https://registry.npmjs.org/@chakra-ui/theme/-/theme-2.1.13.tgz" + integrity sha512-qbrrvn9JstyLFV2qyhwgnhwzVs4zSJ4PcS3ScL8kafXJazTRU6onbCcjEZ5mVCw6z8uEz3jcE8Y5KIhVzaB+Xw== + dependencies: + "@chakra-ui/anatomy" "2.0.7" + "@chakra-ui/theme-tools" "2.0.12" + +"@chakra-ui/toast@3.0.13": + version "3.0.13" + resolved "https://registry.npmjs.org/@chakra-ui/toast/-/toast-3.0.13.tgz" + integrity sha512-5GADso5l5Tv1PAL1iocEneLs6U7I8HHMHSMvWdPFSmmJJh0XCH3fboh0C9LiFNIcnEGJmn+A5yGc4vjedA0h2A== + dependencies: + "@chakra-ui/alert" "2.0.11" + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-use-timeout" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/styled-system" "2.3.4" + "@chakra-ui/theme" "2.1.13" + +"@chakra-ui/tooltip@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.0.tgz" + integrity sha512-oB97aQJBW+U3rRIt1ct7NaDRMnbW16JQ5ZBCl3BzN1VJWO3djiNuscpjVdZSceb+FdGSFo+GoDozp1ZwqdfFeQ== + dependencies: + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-disclosure" "2.0.5" + "@chakra-ui/react-use-event-listener" "2.0.4" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/transition@2.0.10": + version "2.0.10" + resolved "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.10.tgz" + integrity sha512-Tkkne8pIIY7f95TKt2aH+IAuQqzHmEt+ICPqvg74QbmIpKE5ptX0cd+P3swBANw4ACnJcCc2vWIaKmVBQ9clLw== + +"@chakra-ui/utils@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.11.tgz" + integrity sha512-4ZQdK6tbOuTrUCsAQBHWo7tw5/Q6pBV93ZbVpats61cSWMFGv32AIQw9/hA4un2zDeSWN9ZMVLNjAY2Dq/KQOA== + dependencies: + "@types/lodash.mergewith" "4.6.6" + css-box-model "1.2.1" + framesync "5.3.0" + lodash.mergewith "4.6.2" + +"@chakra-ui/visually-hidden@2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.11.tgz" + integrity sha512-e+5amYvnsmEQdiWH4XMyvrtGTdwz//+48vwj5CsNWWcselzkwqodmciy5rIrT71/SCQDOtmgnL7ZWAUOffxfsQ== + +"@ctrl/tinycolor@^3.4.0": + version "3.4.1" + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz" + integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== + +"@emotion/babel-plugin@^11.10.0": + version "11.10.2" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz" + integrity sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.0" + 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.0.13" + +"@emotion/cache@^11.10.0": + version "11.10.3" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz" + integrity sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.0.13" + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@11.10.4": + version "11.10.4" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.4.tgz" + integrity sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.0" + "@emotion/cache" "^11.10.0" + "@emotion/serialize" "^1.1.0" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz" + integrity sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz" + integrity sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w== + +"@emotion/styled@11.10.4": + version "11.10.4" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.4.tgz" + integrity sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.0" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.0" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + +"@esbuild/android-arm@0.15.11": + version "0.15.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.11.tgz#bdd9c3e098183bdca97075aa4c3e0152ed3e10ee" + integrity sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA== + +"@esbuild/linux-loong64@0.15.11": + version "0.15.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.11.tgz#2f4f9a1083dcb4fc65233b6f59003c406abf32e5" + integrity sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw== + +"@eslint/eslintrc@^1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz" + integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@heroicons/react@^2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@heroicons/react/-/react-2.0.12.tgz" + integrity sha512-FZxKh3i9aKIDxyALTgIpSF2t6V6/eZfF5mRu41QlwkX3Oxzecdm1u6dpft6PQGxIBwO7TKYWaMAYYL8mp/EaOg== + +"@humanwhocodes/config-array@^0.10.5": + version "0.10.7" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + 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.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@motionone/animation@^10.13.1": + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz" + integrity sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ== + dependencies: + "@motionone/easing" "^10.14.0" + "@motionone/types" "^10.14.0" + "@motionone/utils" "^10.14.0" + tslib "^2.3.1" + +"@motionone/dom@10.13.1": + version "10.13.1" + resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.13.1.tgz" + integrity sha512-zjfX+AGMIt/fIqd/SL1Lj93S6AiJsEA3oc5M9VkUr+Gz+juRmYN1vfvZd6MvEkSqEjwPQgcjN7rGZHrDB9APfQ== + dependencies: + "@motionone/animation" "^10.13.1" + "@motionone/generators" "^10.13.1" + "@motionone/types" "^10.13.0" + "@motionone/utils" "^10.13.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.14.0": + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz" + integrity sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA== + dependencies: + "@motionone/utils" "^10.14.0" + tslib "^2.3.1" + +"@motionone/generators@^10.13.1": + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz" + integrity sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg== + dependencies: + "@motionone/types" "^10.14.0" + "@motionone/utils" "^10.14.0" + tslib "^2.3.1" + +"@motionone/types@^10.13.0", "@motionone/types@^10.14.0": + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz" + integrity sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ== + +"@motionone/utils@^10.13.1", "@motionone/utils@^10.14.0": + version "10.14.0" + resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz" + integrity sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw== + dependencies: + "@motionone/types" "^10.14.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@mswjs/cookies@^0.2.2": + version "0.2.2" + resolved "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz" + integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== + dependencies: + "@types/set-cookie-parser" "^2.4.0" + set-cookie-parser "^2.4.6" + +"@mswjs/interceptors@^0.17.5": + version "0.17.6" + resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.6.tgz" + integrity sha512-201pBIWehTURb6q8Gheu4Zhvd3Ox1U4BJq5KiOQsYzkWyfiOG4pwcz5hPZIEryztgrf8/sdwABpvY757xMmfrQ== + dependencies: + "@open-draft/until" "^1.0.3" + "@types/debug" "^4.1.7" + "@xmldom/xmldom" "^0.8.3" + debug "^4.3.3" + headers-polyfill "^3.1.0" + outvariant "^1.2.1" + strict-event-emitter "^0.2.4" + web-encoding "^1.1.5" + +"@nestjs/common@8.4.4": + version "8.4.4" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-8.4.4.tgz#0914c6c0540b5a344c7c8fd6072faa1a49af1158" + integrity sha512-QHi7QcgH/5Jinz+SCfIZJkFHc6Cch1YsAEGFEhi6wSp6MILb0sJMQ1CX06e9tCOAjSlBwaJj4PH0eFCVau5v9Q== + dependencies: + axios "0.26.1" + iterare "1.2.1" + tslib "2.3.1" + uuid "8.3.2" + +"@nestjs/core@8.4.4": + version "8.4.4" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-8.4.4.tgz#94fd2d63fd77791f616fbecafb79faa2235eeeff" + integrity sha512-Ef3yJPuzAttpNfehnGqIV5kHIL9SHptB5F4ERxoU7pT61H3xiYpZw6hSjx68cJO7cc6rm7/N+b4zeuJvFHtvBg== + dependencies: + "@nuxtjs/opencollective" "0.3.2" + fast-safe-stringify "2.1.1" + iterare "1.2.1" + object-hash "3.0.0" + path-to-regexp "3.2.0" + tslib "2.3.1" + uuid "8.3.2" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nuxtjs/opencollective@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" + integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== + dependencies: + chalk "^4.1.0" + consola "^2.15.0" + node-fetch "^2.6.1" + +"@open-draft/until@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz" + integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== + +"@openapitools/openapi-generator-cli@^2.5.2": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.5.2.tgz#727a0f29fec1f91ffb467003d0d12ef35554e0ef" + integrity sha512-FLgkjzpDiHVsH821db0VDSElDoA6TcspGyq3RD4zLBJaJhbSsRwr4u87sNoyuHKBg4OMJbZMT4iJxAhkosKrzw== + dependencies: + "@nestjs/common" "8.4.4" + "@nestjs/core" "8.4.4" + "@nuxtjs/opencollective" "0.3.2" + chalk "4.1.2" + commander "8.3.0" + compare-versions "4.1.3" + concurrently "6.5.1" + console.table "0.10.0" + fs-extra "10.0.1" + glob "7.1.6" + inquirer "8.2.2" + lodash "4.17.21" + reflect-metadata "0.1.13" + rxjs "7.5.5" + tslib "2.0.3" + +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + +"@popperjs/core@^2.9.3": + version "2.11.6" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + +"@stomp/stompjs@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@stomp/stompjs/-/stompjs-6.1.2.tgz#4ac3c380e8d1de1da94a3623d404e67de69dd01e" + integrity sha512-FHDTrIFM5Ospi4L3Xhj6v2+NzCVAeNDcBe95YjUWhWiRMrBF6uN3I7AUOlRgT6jU/2WQvvYK8ZaIxFfxFp+uHQ== + +"@types/chai-subset@^1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz" + integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.3": + version "4.3.3" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz" + integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/debug@^4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/js-levenshtein@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz" + integrity sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g== + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash.mergewith@4.6.6": + version "4.6.6" + resolved "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz" + integrity sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.186" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz" + integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "18.11.0" + resolved "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz" + integrity sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react-dom@^18.0.6": + version "18.0.6" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz" + integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.17": + version "18.0.21" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz" + integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/set-cookie-parser@^2.4.0": + version "2.4.2" + resolved "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz" + integrity sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.0.tgz" + integrity sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q== + dependencies: + "@typescript-eslint/scope-manager" "5.40.0" + "@typescript-eslint/type-utils" "5.40.0" + "@typescript-eslint/utils" "5.40.0" + debug "^4.3.4" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.0.tgz" + integrity sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw== + dependencies: + "@typescript-eslint/scope-manager" "5.40.0" + "@typescript-eslint/types" "5.40.0" + "@typescript-eslint/typescript-estree" "5.40.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz" + integrity sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw== + dependencies: + "@typescript-eslint/types" "5.40.0" + "@typescript-eslint/visitor-keys" "5.40.0" + +"@typescript-eslint/type-utils@5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.0.tgz" + integrity sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw== + dependencies: + "@typescript-eslint/typescript-estree" "5.40.0" + "@typescript-eslint/utils" "5.40.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.0.tgz" + integrity sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw== + +"@typescript-eslint/typescript-estree@5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz" + integrity sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg== + dependencies: + "@typescript-eslint/types" "5.40.0" + "@typescript-eslint/visitor-keys" "5.40.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.0.tgz" + integrity sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.40.0" + "@typescript-eslint/types" "5.40.0" + "@typescript-eslint/typescript-estree" "5.40.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.40.0": + version "5.40.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz" + integrity sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ== + dependencies: + "@typescript-eslint/types" "5.40.0" + eslint-visitor-keys "^3.3.0" + +"@vitejs/plugin-basic-ssl@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-0.1.2.tgz#7177f9adc5384f1377b9b91b17ce7cdb8f422abd" + integrity sha512-EdwCHnbkakR6YPupySZm1WoCDRPaw9c5jObAo2pCRv8Ja2TESFC6Sc8RUOcKuihfjARDfszbBf+YEQwHY9s9wg== + +"@vitejs/plugin-react@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz" + integrity sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA== + dependencies: + "@babel/core" "^7.18.13" + "@babel/plugin-transform-react-jsx" "^7.18.10" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-jsx-self" "^7.18.6" + "@babel/plugin-transform-react-jsx-source" "^7.18.6" + magic-string "^0.26.2" + react-refresh "^0.14.0" + +"@xmldom/xmldom@^0.8.3": + version "0.8.3" + resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.3.tgz" + integrity sha512-Lv2vySXypg4nfa51LY1nU8yDAGo/5YwF+EY/rUZgIbfvwVARcd67ttCM8SMsTeJy51YhHYavEq+FS6R0hW9PFQ== + +"@zag-js/element-size@0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.1.0.tgz" + integrity sha512-QF8wp0+V8++z+FHXiIw93+zudtubYszOtYbNgK39fg3pi+nCZtuSm4L1jC5QZMatNZ83MfOzyNCfgUubapagJQ== + +"@zag-js/focus-visible@0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.1.0.tgz" + integrity sha512-PeaBcTmdZWcFf7n1aM+oiOdZc+sy14qi0emPIeUuGMTjbP0xLGrZu43kdpHnWSXy7/r4Ubp/vlg50MCV8+9Isg== + +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz" + integrity sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A== + dependencies: + tslib "^2.0.0" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz" + integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== + +axios@0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + +axios@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" + integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + 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.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001400: + version "1.0.30001420" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001420.tgz" + integrity sha512-OnyeJ9ascFA9roEj72ok2Ikp7PHJTKubtEJIQ/VK3fdsS50q4KWy+Z5X0A1/GswEItKX0ctAp8n4SYDE7wTu6A== + +chai@^4.3.6: + version "4.3.6" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + +chokidar@^3.4.2: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + 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" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.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== + +compare-versions@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.3.tgz#8f7b8966aef7dc4282b45dfa6be98434fc18a1a4" + integrity sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg== + +compute-scroll-into-view@1.0.14: + version "1.0.14" + resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz" + integrity sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concurrently@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.5.1.tgz#4518c67f7ac680cf5c34d5adf399a2a2047edc8c" + integrity sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag== + dependencies: + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + rxjs "^6.6.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^16.2.0" + +consola@^2.15.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console.table@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/console.table/-/console.table-0.10.0.tgz#0917025588875befd70cf2eff4bef2c6e2d75d04" + integrity sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g== + dependencies: + easy-table "1.1.0" + +convert-source-map@^1.5.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie@^0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +copy-to-clipboard@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-js-pure@^3.25.1: + version "3.25.5" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz" + integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + 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" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-box-model@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + +csstype@^3.0.11, csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +date-fns@^2.16.1: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + +debug@^2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +easy-table@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.1.0.tgz#86f9ab4c102f0371b7297b92a651d5824bc8cb73" + integrity sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA== + optionalDependencies: + wcwidth ">=1.0.1" + +electron-to-chromium@^1.4.251: + version "1.4.283" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.283.tgz" + integrity sha512-g6RQ9zCOV+U5QVHW9OpFR7rdk/V7xfopNXnyAamdpFgCHgZ1sjI8VuR1+zG2YG/TZk+tQ8mpNkug4P8FU0fuOA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.4" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + 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-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild-android-64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.11.tgz#50402129c3e85bb06434e212374c5f693e4c5f01" + integrity sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw== + +esbuild-android-arm64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.11.tgz#49bee35218ea2ccf1a0c5f187af77c1c0a5dee71" + integrity sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ== + +esbuild-darwin-64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.11.tgz#89a90c8cf6f0029ac4169bfedd012a0412c1575f" + integrity sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA== + +esbuild-darwin-arm64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.11.tgz#556f4385c6de806cc81132dd7b8af00fe9d292df" + integrity sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ== + +esbuild-freebsd-64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.11.tgz#fd86fd1b3b65366048f35b996d9cdf3547384eee" + integrity sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg== + +esbuild-freebsd-arm64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.11.tgz#d346bcacfe9779ebc1a11edac1bdedeff6dda3b1" + integrity sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ== + +esbuild-linux-32@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.11.tgz#64b50e774bf75af7dcc6a73ad509f2eb0ac4487b" + integrity sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA== + +esbuild-linux-64@0.15.11: + version "0.15.11" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.11.tgz" + integrity sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA== + +esbuild-linux-arm64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.11.tgz#c0cb31980eee066bfd39a4593660a0ecebe926cb" + integrity sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw== + +esbuild-linux-arm@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.11.tgz#7824d20099977aa671016c7de7a5038c9870010f" + integrity sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A== + +esbuild-linux-mips64le@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.11.tgz#10627331c90164e553429ed25e025184bba485b6" + integrity sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA== + +esbuild-linux-ppc64le@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.11.tgz#be42679a36a5246b893fc8b898135ebacb5a0a14" + integrity sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg== + +esbuild-linux-riscv64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.11.tgz#3ac2f328e3db73cbff833ada94314d8e79503e54" + integrity sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw== + +esbuild-linux-s390x@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.11.tgz#e774e0df061b6847d86783bf3c8c4300a72e03ad" + integrity sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg== + +esbuild-netbsd-64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.11.tgz#55e265fa4489e3f396b16c81f6f5a11d6ca2a9a4" + integrity sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A== + +esbuild-openbsd-64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.11.tgz#bc04103ccfd8c2f2241e1add0b51a095955b73c4" + integrity sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ== + +esbuild-sunos-64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.11.tgz#ccd580305d31fde07b5c386da79c942aaf069013" + integrity sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw== + +esbuild-windows-32@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.11.tgz#40fe1d48f9b20a76f6db5109aaaf1511aed58c71" + integrity sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q== + +esbuild-windows-64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.11.tgz#80c58b1ef2ff030c78e3a06e7a922776cc4cb687" + integrity sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ== + +esbuild-windows-arm64@0.15.11: + version "0.15.11" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.11.tgz#018624023b5c3f0cca334cc99f5ef7134d396333" + integrity sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw== + +esbuild@^0.15.9: + version "0.15.11" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.11.tgz" + integrity sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg== + optionalDependencies: + "@esbuild/android-arm" "0.15.11" + "@esbuild/linux-loong64" "0.15.11" + esbuild-android-64 "0.15.11" + esbuild-android-arm64 "0.15.11" + esbuild-darwin-64 "0.15.11" + esbuild-darwin-arm64 "0.15.11" + esbuild-freebsd-64 "0.15.11" + esbuild-freebsd-arm64 "0.15.11" + esbuild-linux-32 "0.15.11" + esbuild-linux-64 "0.15.11" + esbuild-linux-arm "0.15.11" + esbuild-linux-arm64 "0.15.11" + esbuild-linux-mips64le "0.15.11" + esbuild-linux-ppc64le "0.15.11" + esbuild-linux-riscv64 "0.15.11" + esbuild-linux-s390x "0.15.11" + esbuild-netbsd-64 "0.15.11" + esbuild-openbsd-64 "0.15.11" + esbuild-sunos-64 "0.15.11" + esbuild-windows-32 "0.15.11" + esbuild-windows-64 "0.15.11" + esbuild-windows-arm64 "0.15.11" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-import-resolver-typescript@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.1.tgz#c72634da072eebd04fe73007fa58a62c333c8147" + integrity sha512-U7LUjNJPYjNsHvAUAkt/RU3fcTSpbllA0//35B4eLYTX74frmOepbt7F7J3D1IGtj9k21buOpaqtDd4ZlS/BYQ== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.10.0" + get-tsconfig "^4.2.0" + globby "^13.1.2" + is-core-module "^2.10.0" + is-glob "^4.0.3" + synckit "^0.8.3" + +eslint-module-utils@^2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== + dependencies: + "@babel/runtime" "^7.18.9" + aria-query "^4.2.2" + array-includes "^3.1.5" + ast-types-flow "^0.0.7" + axe-core "^4.4.3" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.2" + language-tags "^1.0.5" + minimatch "^3.1.2" + semver "^6.3.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.31.10: + version "7.31.10" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz#6782c2c7fe91c09e715d536067644bbb9491419a" + integrity sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.25.0: + version "8.25.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz" + integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== + dependencies: + "@eslint/eslintrc" "^1.3.3" + "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/module-importer" "^1.0.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + 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.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.4: + 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" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +focus-lock@^0.11.2: + version "0.11.3" + resolved "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.3.tgz" + integrity sha512-4n0pYcPTa/uI7Q66BZna61nRT7lDhnuJ9PJr6wiDjx4uStg491ks41y7uOG+s0umaaa+hulNKSldU9aTg9/yVg== + dependencies: + tslib "^2.0.3" + +follow-redirects@^1.14.8, follow-redirects@^1.15.0: + 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.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +framer-motion@7.5.3: + version "7.5.3" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-7.5.3.tgz" + integrity sha512-VvANga9Z7bYtKMAsM/je81FwJDHfThOYywN04xVQ4OGdMVY09Bowx/q7nZd6XtytLuv6byc6GT1mYwag+SQ/nw== + dependencies: + "@motionone/dom" "10.13.1" + framesync "6.1.2" + hey-listen "^1.0.8" + popmotion "11.0.5" + style-value-types "5.1.2" + tslib "2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framesync@5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz" + integrity sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA== + dependencies: + tslib "^2.1.0" + +framesync@6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz" + integrity sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g== + dependencies: + tslib "2.4.0" + +fs-extra@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" + integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +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.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + 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: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.2.0.tgz" + integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + dependencies: + type-fest "^0.20.2" + +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + 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.2: + version "13.1.2" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +"graphql@^15.0.0 || ^16.0.0": + version "16.6.0" + resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" + integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +headers-polyfill@^3.1.0: + version "3.1.2" + resolved "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.1.2.tgz" + integrity sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA== + +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +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== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.2.tgz#1310517a87a0814d25336c78a20b44c3d9b7629d" + integrity sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +inquirer@^8.2.0: + version "8.2.4" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.10.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.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.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-node-process@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-node-process/-/is-node-process-1.0.1.tgz" + integrity sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== + +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +js-sdsl@^4.1.4: + version "4.1.5" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz" + integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +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" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +local-pkg@^0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz" + integrity sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash@4.17.21, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + dependencies: + get-func-name "^2.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.26.2: + version "0.26.7" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz" + integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== + dependencies: + sourcemap-codec "^1.4.8" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + 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" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +msw@^0.47.4: + version "0.47.4" + resolved "https://registry.npmjs.org/msw/-/msw-0.47.4.tgz" + integrity sha512-Psftt8Yfl0+l+qqg9OlmKEsxF8S/vtda0CmlR6y8wTaWrMMzuCDa55n2hEGC0ZRDwuV6FFWc/4CjoDsBpATKBw== + dependencies: + "@mswjs/cookies" "^0.2.2" + "@mswjs/interceptors" "^0.17.5" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/js-levenshtein" "^1.1.1" + chalk "4.1.1" + chokidar "^3.4.2" + cookie "^0.4.2" + graphql "^15.0.0 || ^16.0.0" + headers-polyfill "^3.1.0" + inquirer "^8.2.0" + is-node-process "^1.0.1" + js-levenshtein "^1.1.6" + node-fetch "^2.6.7" + outvariant "^1.3.0" + path-to-regexp "^6.2.0" + statuses "^2.0.0" + strict-event-emitter "^0.2.6" + type-fest "^2.19.0" + yargs "^17.3.1" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + 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@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + 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.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +outvariant@^1.2.1, outvariant@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz" + integrity sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f" + integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== + +path-to-regexp@^6.2.0: + version "6.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +popmotion@11.0.5: + version "11.0.5" + resolved "https://registry.npmjs.org/popmotion/-/popmotion-11.0.5.tgz" + integrity sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA== + dependencies: + framesync "6.1.2" + hey-listen "^1.0.8" + style-value-types "5.1.2" + tslib "2.4.0" + +postcss@^8.4.16: + version "8.4.18" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz" + integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-clientside-effect@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz" + integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== + dependencies: + "@babel/runtime" "^7.12.13" + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-fast-compare@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-focus-lock@^2.9.1: + version "2.9.1" + resolved "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.1.tgz" + integrity sha512-pSWOQrUmiKLkffPO6BpMXN7SNKXMsuOakl652IBuALAu1esk+IcpJyM+ALcYzPTTFz1rD0R54aB9A4HuP5t1Wg== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^0.11.2" + prop-types "^15.6.2" + react-clientside-effect "^1.2.6" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-hook-form@^7.38.0: + version "7.38.0" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.38.0.tgz#53d6a68df587ce4ce88352f63e0ecc7fc8779320" + integrity sha512-gxWW1kMeru9xR1GoR+Iw4hA+JBOM3SHfr4DWCUKY0xc7Vv1MLsF109oHtBeWl9shcyPFx67KHru44DheN0XY5A== + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react-remove-scroll-bar@^2.3.3: + version "2.3.4" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.4: + version "2.5.5" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerator-runtime@^0.13.4: + version "0.13.10" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +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== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@~2.78.0: + version "2.78.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz" + integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@7.5.5: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== + dependencies: + tslib "^2.1.0" + +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.5.5: + version "7.5.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== + dependencies: + tslib "^2.1.0" + +safe-buffer@>=5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +set-cookie-parser@^2.4.6: + version "2.5.1" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz" + integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.7.4" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs-client@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.1.tgz#350b8eda42d6d52ddc030c39943364c11dcad806" + integrity sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw== + dependencies: + debug "^3.2.7" + eventsource "^2.0.2" + faye-websocket "^0.11.4" + inherits "^2.0.4" + url-parse "^1.5.10" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + 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.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + 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.12" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + +statuses@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +strict-event-emitter@^0.2.4, strict-event-emitter@^0.2.6: + version "0.2.7" + resolved "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.7.tgz" + integrity sha512-TavbHJ87WD2tDbKI7bTrmc6U4J4Qjh8E9fVvFkIFw2gCu34Wxstn2Yas0+4D78FJN8DOTEzxiT+udBdraRk4UQ== + dependencies: + events "^3.3.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.padend@^3.0.0: + version "3.1.3" + resolved "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-literal@^0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-0.4.2.tgz" + integrity sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw== + dependencies: + acorn "^8.8.0" + +style-value-types@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-5.1.2.tgz" + integrity sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q== + dependencies: + hey-listen "^1.0.8" + tslib "2.4.0" + +stylis@4.0.13: + version "4.0.13" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz" + integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.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.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.8.3: + version "0.8.4" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz" + integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.4.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + +tiny-invariant@^1.0.6: + version "1.3.1" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tinybench@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.3.0.tgz" + integrity sha512-zs1gMVBwyyG2QbVchYIbnabRhMOCGvrwZz/q+SV+LIMa9q5YDQZi2kkI6ZRqV2Bz7ba1uvrc7ieUoE4KWnGeKg== + +tinypool@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz" + integrity sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ== + +tinyspy@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz" + integrity sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@2.4.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +typescript@^4.6.4: + version "4.8.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.3: + version "0.12.4" + resolved "https://registry.npmjs.org/util/-/util-0.12.4.tgz" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +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.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vite@^3.0.0, vite@^3.1.0: + version "3.1.8" + resolved "https://registry.npmjs.org/vite/-/vite-3.1.8.tgz" + integrity sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg== + dependencies: + esbuild "^0.15.9" + postcss "^8.4.16" + resolve "^1.22.1" + rollup "~2.78.0" + optionalDependencies: + fsevents "~2.3.2" + +vitest@^0.24.3: + version "0.24.3" + resolved "https://registry.npmjs.org/vitest/-/vitest-0.24.3.tgz" + integrity sha512-aM0auuPPgMSstWvr851hB74g/LKaKBzSxcG3da7ejfZbx08Y21JpZmbmDYrMTCGhVZKqTGwzcnLMwyfz2WzkhQ== + dependencies: + "@types/chai" "^4.3.3" + "@types/chai-subset" "^1.3.3" + "@types/node" "*" + chai "^4.3.6" + debug "^4.3.4" + local-pkg "^0.4.2" + strip-literal "^0.4.2" + tinybench "^2.3.0" + tinypool "^0.3.0" + tinyspy "^1.0.2" + vite "^3.0.0" + +wcwidth@>=1.0.1, wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-encoding@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +websocket-driver@>=0.5.1: + 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.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.6.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz" + integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/app/src/main/resources/application-local.yml b/app/src/main/resources/application-local.yml new file mode 100644 index 00000000..5793958f --- /dev/null +++ b/app/src/main/resources/application-local.yml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/smartpointer?useSSL=false&allowPublicKeyRetrieval=true&enabledTLSProtocols=TLSv1.2 + username: smartpointer + password: smartpointer + driver-class-name: com.mysql.cj.jdbc.Driver + +auth: + jwt: + secret: 70gdy7X82ya650Vdhb8HqofHniMkPHTIYOIFJA1NKY4= + issuer: dev.abelab.smartpointer \ No newline at end of file diff --git a/app/src/main/resources/application-sample.yml b/app/src/main/resources/application-sample.yml new file mode 100644 index 00000000..4db166c9 --- /dev/null +++ b/app/src/main/resources/application-sample.yml @@ -0,0 +1,6 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/smartpointer?useSSL=false&allowPublicKeyRetrieval=true&enabledTLSProtocols=TLSv1.2 + username: smartpointer + password: smartpointer + driver-class-name: com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml new file mode 100644 index 00000000..8ca4ac46 --- /dev/null +++ b/app/src/main/resources/application-test.yml @@ -0,0 +1,13 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3307/smartpointer?useSSL=false&allowPublicKeyRetrieval=true&enabledTLSProtocols=TLSv1.2 + username: smartpointer + password: smartpointer + driver-class-name: com.mysql.cj.jdbc.Driver + hikari: + maximum-pool-size: 1 + +auth: + jwt: + secret: JWT_SECRET + issuer: JWT_ISSUER \ No newline at end of file diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml new file mode 100644 index 00000000..68309607 --- /dev/null +++ b/app/src/main/resources/application.yml @@ -0,0 +1,71 @@ +spring: + datasource: + url: + username: + password: + driver-class-name: + session: + store-type: jdbc + mvc: + pathmatch: + matching-strategy: ant_path_matcher + messages: + basename: i18n/messages + encoding: UTF-8 + jackson: + date-format: yyyy-MM-dd'T'HH:mm:ss + time-zone: Asia/Tokyo + flyway: + baselineOnMigrate: true + validateOnMigrate: false + outOfOrder: false + url: ${spring.datasource.url} + user: ${spring.datasource.username} + password: ${spring.datasource.password} + locations: classpath:db/migration + enabled: true + +springdoc: + swagger-ui: + doc-expansion: none + +server: + port: 8080 + servlet: + encoding: + charset: UTF-8 + force: true + forward-headers-strategy: framework + reactive: + session: + timeout: 3h + +project: + name: smartpointer + version: 1.0.0 + package: dev.abelab.smartpointer + mybatis: + config: + file: generatorConfig.xml + model: + package: infrastructure.db.entity + client: + package: infrastructure.db.mapper.base + type: XMLMAPPER + map: + package: db.mapper.base + +mybatis: + configuration: + mapUnderscoreToCamelCase: true + mapperLocations: + - classpath:/db/mapper/base/*Mapper.xml + - classpath:/db/mapper/*Mapper.xml + +logging: + level: + root: INFO + +auth: + ttl: 86400 # 24h + token-type: Bearer \ No newline at end of file diff --git a/app/src/main/resources/db/mapper/TimerMapper.xml b/app/src/main/resources/db/mapper/TimerMapper.xml new file mode 100644 index 00000000..a8fb4437 --- /dev/null +++ b/app/src/main/resources/db/mapper/TimerMapper.xml @@ -0,0 +1,14 @@ + + + + + + insert into `timer` (`room_id`, `status`, `value`, `finish_at`) + values (#{roomId}, #{status}, #{value}, #{finishAt}) + ON DUPLICATE KEY UPDATE `room_id` = #{roomId}, + `status` = #{status}, + `value` = #{value}, + `finish_at` = #{finishAt} + + + diff --git a/app/src/main/resources/db/mapper/base/RoomBaseMapper.xml b/app/src/main/resources/db/mapper/base/RoomBaseMapper.xml new file mode 100644 index 00000000..745e5e0c --- /dev/null +++ b/app/src/main/resources/db/mapper/base/RoomBaseMapper.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + `id`, `passcode` + + + + + + delete from `room` + where `id` = #{id,jdbcType=CHAR} + + + + delete from `room` + + + + + + + insert into `room` (`id`, `passcode`) + values (#{id,jdbcType=CHAR}, #{passcode,jdbcType=CHAR}) + + + + insert into `room` + + + `id`, + + + `passcode`, + + + + + #{id,jdbcType=CHAR}, + + + #{passcode,jdbcType=CHAR}, + + + + + + + update `room` + + + `id` = #{row.id,jdbcType=CHAR}, + + + `passcode` = #{row.passcode,jdbcType=CHAR}, + + + + + + + + + update `room` + set `id` = #{row.id,jdbcType=CHAR}, + `passcode` = #{row.passcode,jdbcType=CHAR} + + + + + + + update `room` + + + `passcode` = #{passcode,jdbcType=CHAR}, + + + where `id` = #{id,jdbcType=CHAR} + + + + update `room` + set `passcode` = #{passcode,jdbcType=CHAR} + where `id` = #{id,jdbcType=CHAR} + + + \ No newline at end of file diff --git a/app/src/main/resources/db/mapper/base/TimerBaseMapper.xml b/app/src/main/resources/db/mapper/base/TimerBaseMapper.xml new file mode 100644 index 00000000..d70c5f69 --- /dev/null +++ b/app/src/main/resources/db/mapper/base/TimerBaseMapper.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + `room_id`, `status`, `value`, `finish_at` + + + + + + delete from `timer` + where `room_id` = #{roomId,jdbcType=CHAR} + + + + delete from `timer` + + + + + + + insert into `timer` (`room_id`, `status`, `value`, + `finish_at`) + values (#{roomId,jdbcType=CHAR}, #{status,jdbcType=INTEGER}, #{value,jdbcType=INTEGER}, + #{finishAt,jdbcType=TIMESTAMP}) + + + + insert into `timer` + + + `room_id`, + + + `status`, + + + `value`, + + + `finish_at`, + + + + + #{roomId,jdbcType=CHAR}, + + + #{status,jdbcType=INTEGER}, + + + #{value,jdbcType=INTEGER}, + + + #{finishAt,jdbcType=TIMESTAMP}, + + + + + + + update `timer` + + + `room_id` = #{row.roomId,jdbcType=CHAR}, + + + `status` = #{row.status,jdbcType=INTEGER}, + + + `value` = #{row.value,jdbcType=INTEGER}, + + + `finish_at` = #{row.finishAt,jdbcType=TIMESTAMP}, + + + + + + + + + update `timer` + set `room_id` = #{row.roomId,jdbcType=CHAR}, + `status` = #{row.status,jdbcType=INTEGER}, + `value` = #{row.value,jdbcType=INTEGER}, + `finish_at` = #{row.finishAt,jdbcType=TIMESTAMP} + + + + + + + update `timer` + + + `status` = #{status,jdbcType=INTEGER}, + + + `value` = #{value,jdbcType=INTEGER}, + + + `finish_at` = #{finishAt,jdbcType=TIMESTAMP}, + + + where `room_id` = #{roomId,jdbcType=CHAR} + + + + update `timer` + set `status` = #{status,jdbcType=INTEGER}, + `value` = #{value,jdbcType=INTEGER}, + `finish_at` = #{finishAt,jdbcType=TIMESTAMP} + where `room_id` = #{roomId,jdbcType=CHAR} + + + \ No newline at end of file diff --git a/app/src/main/resources/db/mapper/base/UserBaseMapper.xml b/app/src/main/resources/db/mapper/base/UserBaseMapper.xml new file mode 100644 index 00000000..599eef9e --- /dev/null +++ b/app/src/main/resources/db/mapper/base/UserBaseMapper.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + `id`, `room_id`, `name` + + + + + + delete from `user` + where `id` = #{id,jdbcType=CHAR} + + + + delete from `user` + + + + + + + insert into `user` (`id`, `room_id`, `name`) + values (#{id,jdbcType=CHAR}, #{roomId,jdbcType=CHAR}, #{name,jdbcType=VARCHAR}) + + + + insert into `user` + + + `id`, + + + `room_id`, + + + `name`, + + + + + #{id,jdbcType=CHAR}, + + + #{roomId,jdbcType=CHAR}, + + + #{name,jdbcType=VARCHAR}, + + + + + + + update `user` + + + `id` = #{row.id,jdbcType=CHAR}, + + + `room_id` = #{row.roomId,jdbcType=CHAR}, + + + `name` = #{row.name,jdbcType=VARCHAR}, + + + + + + + + + update `user` + set `id` = #{row.id,jdbcType=CHAR}, + `room_id` = #{row.roomId,jdbcType=CHAR}, + `name` = #{row.name,jdbcType=VARCHAR} + + + + + + + update `user` + + + `room_id` = #{roomId,jdbcType=CHAR}, + + + `name` = #{name,jdbcType=VARCHAR}, + + + where `id` = #{id,jdbcType=CHAR} + + + + update `user` + set `room_id` = #{roomId,jdbcType=CHAR}, + `name` = #{name,jdbcType=VARCHAR} + where `id` = #{id,jdbcType=CHAR} + + + \ No newline at end of file diff --git a/app/src/main/resources/db/migration/V0_0_1__create_spring_session.sql b/app/src/main/resources/db/migration/V0_0_1__create_spring_session.sql new file mode 100644 index 00000000..852c0d64 --- /dev/null +++ b/app/src/main/resources/db/migration/V0_0_1__create_spring_session.sql @@ -0,0 +1,26 @@ +CREATE TABLE SPRING_SESSION +( + PRIMARY_ID CHAR(36) NOT NULL, + SESSION_ID CHAR(36) NOT NULL, + CREATION_TIME BIGINT NOT NULL, + LAST_ACCESS_TIME BIGINT NOT NULL, + MAX_INACTIVE_INTERVAL INT NOT NULL, + EXPIRY_TIME BIGINT NOT NULL, + PRINCIPAL_NAME VARCHAR(100), + CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) +) ENGINE = InnoDB + ROW_FORMAT = DYNAMIC; + +CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID); +CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME); +CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME); + +CREATE TABLE SPRING_SESSION_ATTRIBUTES +( + SESSION_PRIMARY_ID CHAR(36) NOT NULL, + ATTRIBUTE_NAME VARCHAR(200) NOT NULL, + ATTRIBUTE_BYTES BLOB NOT NULL, + CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), + CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION (PRIMARY_ID) ON DELETE CASCADE +) ENGINE = InnoDB + ROW_FORMAT = DYNAMIC; diff --git a/app/src/main/resources/db/migration/V1_0_1__create_room.sql b/app/src/main/resources/db/migration/V1_0_1__create_room.sql new file mode 100644 index 00000000..861962db --- /dev/null +++ b/app/src/main/resources/db/migration/V1_0_1__create_room.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS `room` +( + `id` CHAR(36) NOT NULL DEFAULT (UUID()), + `passcode` CHAR(6) NOT NULL, + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) + ENGINE = InnoDB \ No newline at end of file diff --git a/app/src/main/resources/db/migration/V1_0_2__create_user.sql b/app/src/main/resources/db/migration/V1_0_2__create_user.sql new file mode 100644 index 00000000..4a067987 --- /dev/null +++ b/app/src/main/resources/db/migration/V1_0_2__create_user.sql @@ -0,0 +1,17 @@ +CREATE TABLE IF NOT EXISTS `user` +( + `id` CHAR(36) NOT NULL DEFAULT (UUID()), + `room_id` CHAR(36) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + INDEX `fk_user_room_id_idx` (`room_id` ASC) VISIBLE, + UNIQUE INDEX `room_id_and_name_UNIQUE` (`room_id` ASC, `name` ASC) VISIBLE, + CONSTRAINT `fk_user_room_id` + FOREIGN KEY (`room_id`) + REFERENCES `room` (`id`) + ON DELETE CASCADE + ON UPDATE NO ACTION +) + ENGINE = InnoDB \ No newline at end of file diff --git a/app/src/main/resources/db/migration/V1_0_3__create_timer.sql b/app/src/main/resources/db/migration/V1_0_3__create_timer.sql new file mode 100644 index 00000000..3efd9611 --- /dev/null +++ b/app/src/main/resources/db/migration/V1_0_3__create_timer.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS `timer` +( + `room_id` CHAR(36) NOT NULL, + `status` INT UNSIGNED NOT NULL, + `value` INT UNSIGNED NOT NULL DEFAULT 0, + `finish_at` DATETIME NOT NULL, + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`room_id`), + CONSTRAINT `fk_timer_room_id` + FOREIGN KEY (`room_id`) + REFERENCES `room` (`id`) + ON DELETE CASCADE + ON UPDATE NO ACTION +) + ENGINE = InnoDB \ No newline at end of file diff --git a/app/src/main/resources/generatorConfig.xml b/app/src/main/resources/generatorConfig.xml new file mode 100644 index 00000000..d072b38f --- /dev/null +++ b/app/src/main/resources/generatorConfig.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/app/src/main/resources/i18n/messages.yml b/app/src/main/resources/i18n/messages.yml new file mode 100644 index 00000000..913c7df4 --- /dev/null +++ b/app/src/main/resources/i18n/messages.yml @@ -0,0 +1,22 @@ +exception: + bad_request: + validation_error: 不正なリクエストです。 + invalid_request_parameter: 不正なリクエストです。 + invalid_user_name: ユーザ名は1~255文字にしてください。 + timer_is_already_started: タイマーは既に開始済みです。 + timer_is_already_stopped: タイマーは既に停止済みです。 + timer_cannot_be_reset: 実行中のタイマーはリセットできません。 + invalid_timer_value: タイマー時間は1〜3600秒にしてください。 + unauthorized: + user_not_logged_in: ユーザはログインしていません。 + incorrect_room_passcode: パスコードが間違えています。 + forbidden: + user_has_no_permission: その動作は許可されていません。 + not_found: + api: APIが見つかりません。 + room: ルームが見つかりません。 + timer: タイマーが見つかりません。 + conflict: + user_name_is_already_exists: そのユーザ名は既に使われています。 + internal_server_error: + unexpected_error: 予期しないエラーが発生しました。 \ No newline at end of file diff --git a/app/src/main/tsconfig.json b/app/src/main/tsconfig.json new file mode 100644 index 00000000..8ade1b30 --- /dev/null +++ b/app/src/main/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "strict": true, + "allowUnusedLabels": false, + "allowUnreachableCode": false, + "exactOptionalPropertyTypes": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noPropertyAccessFromIndexSignature": true, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + + "importsNotUsedAsValues": "error", + "checkJs": true, + + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Strictest" +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/AbstractDatabaseSpecification.groovy b/app/src/test/groovy/dev/abelab/smartpointer/AbstractDatabaseSpecification.groovy new file mode 100644 index 00000000..cdc0f69a --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/AbstractDatabaseSpecification.groovy @@ -0,0 +1,44 @@ +package dev.abelab.smartpointer + +import groovy.sql.Sql +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy +import org.springframework.transaction.annotation.Transactional + +import javax.sql.DataSource + +/** + * DBテストの基底クラス + */ +@Transactional +class AbstractDatabaseSpecification extends AbstractSpecification { + + /** + * SQL Handler + */ + protected static Sql sql + + @Autowired + private dataSource(final DataSource dataSource) { + if (Objects.isNull(sql)) { + sql = new Sql(new TransactionAwareDataSourceProxy(dataSource)) + } + } + + /** + * setup before test class + */ + def setupSpec() { + final var timeZone = TimeZone.getTimeZone("Asia/Tokyo") + TimeZone.setDefault(timeZone) + } + + /** + * cleanup after test case + */ + def cleanup() { + // DBを初期化するために、テスト終了時にロールバック + sql.rollback() + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/AbstractSpecification.groovy b/app/src/test/groovy/dev/abelab/smartpointer/AbstractSpecification.groovy new file mode 100644 index 00000000..b0586457 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/AbstractSpecification.groovy @@ -0,0 +1,28 @@ +package dev.abelab.smartpointer + +import dev.abelab.smartpointer.exception.BaseException +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.web.server.LocalServerPort +import spock.lang.Specification + +/** + * テストの基底クラス + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +abstract class AbstractSpecification extends Specification { + + @LocalServerPort + protected Integer PORT + + /** + * 例外を検証 + * + * @param thrownException 発生した例外 + * @param expectedException 期待する例外 + */ + static void verifyException(final BaseException thrownException, final BaseException expectedException) { + assert thrownException.httpStatus == expectedException.httpStatus + assert thrownException.errorCode == expectedException.errorCode + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/domain/model/RoomModel_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/domain/model/RoomModel_UT.groovy new file mode 100644 index 00000000..a2d59f1a --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/domain/model/RoomModel_UT.groovy @@ -0,0 +1,34 @@ +package dev.abelab.smartpointer.domain.model + +import dev.abelab.smartpointer.AbstractSpecification + +/** + * RoomModelの単体テスト + */ +class RoomModel_UT extends AbstractSpecification { + + def "builder: インスタンス生成時にIDとtokenが自動でセットされる"() { + when: + final room = RoomModel.builder().build() + + then: + room.id.length() == 36 + room.passcode.length() == 6 + } + + def "isPasscodeValid: パスコードが有効かチェック"() { + given: + final room = RoomModel.builder() + .passcode("000000") + .build() + + expect: + room.isPasscodeValid(inputPasscode) == expectedResult + + where: + inputPasscode || expectedResult + "000000" || true + "000001" || false + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/domain/model/TimerModel_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/domain/model/TimerModel_UT.groovy new file mode 100644 index 00000000..d5939d49 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/domain/model/TimerModel_UT.groovy @@ -0,0 +1,139 @@ +package dev.abelab.smartpointer.domain.model + +import dev.abelab.smartpointer.AbstractSpecification +import dev.abelab.smartpointer.enums.TimerStatus +import dev.abelab.smartpointer.exception.BadRequestException +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.helper.RandomHelper + +import java.time.LocalDateTime + +/** + * TimerModelの単体テスト + */ +class TimerModel_UT extends AbstractSpecification { + + def "builder: インスタンス生成時にステータスが自動でセットされる"() { + when: + final timer = TimerModel.builder().build() + + then: + timer.status == TimerStatus.READY + } + + def "start: 準備中のタイマーを開始する"() { + given: + final timer = TimerModel.builder() + .status(TimerStatus.READY) + .build() + + when: + timer.start(60) + + then: + timer.value == 60 + } + + def "start: 実行中のタイマーは開始不可"() { + given: + final timer = TimerModel.builder() + .status(TimerStatus.RUNNING) + .build() + + when: + timer.start(60) + + then: + final BaseException exception = thrown() + verifyException(exception, new BadRequestException(ErrorCode.TIMER_IS_ALREADY_STARTED)) + } + + def "resume: タイマーを再開する"() { + given: + final timer = TimerModel.builder() + .value(120) + .status(TimerStatus.READY) + .build() + + when: + timer.resume(60) + + then: + timer.value == 120 + } + + def "resume: 実行中のタイマーは再開不可"() { + given: + final timer = TimerModel.builder() + .status(TimerStatus.RUNNING) + .build() + + when: + timer.resume(60) + + then: + final BaseException exception = thrown() + verifyException(exception, new BadRequestException(ErrorCode.TIMER_IS_ALREADY_STARTED)) + } + + def "stop: 実行中のタイマーを停止する"() { + given: + final timer = TimerModel.builder() + .status(TimerStatus.RUNNING) + .build() + + when: + timer.stop() + + then: + timer.status == TimerStatus.READY + } + + def "stop: 準備中のタイマーは停止不可"() { + given: + final timer = TimerModel.builder() + .status(TimerStatus.READY) + .build() + + when: + timer.stop() + + then: + final BaseException exception = thrown() + verifyException(exception, new BadRequestException(ErrorCode.TIMER_IS_ALREADY_STOPPED)) + } + + def "reset: 準備中のタイマーをリセットする"() { + given: + final oldFinishAt = RandomHelper.mock(LocalDateTime) + final timer = TimerModel.builder() + .status(TimerStatus.READY) + .value(60) + .finishAt(oldFinishAt) + .build() + + when: + timer.reset() + + then: + timer.status == TimerStatus.READY + timer.finishAt != oldFinishAt + } + + + def "reset: 実行中のタイマーはリセット不可"() { + given: + final timer = TimerModel.builder() + .status(TimerStatus.RUNNING) + .build() + + when: + timer.reset() + + then: + final BaseException exception = thrown() + verifyException(exception, new BadRequestException(ErrorCode.TIMER_CANNOT_BE_RESET)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/domain/model/UserModel_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/domain/model/UserModel_UT.groovy new file mode 100644 index 00000000..08fa1914 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/domain/model/UserModel_UT.groovy @@ -0,0 +1,18 @@ +package dev.abelab.smartpointer.domain.model + +import dev.abelab.smartpointer.AbstractSpecification + +/** + * UserModelの単体テスト + */ +class UserModel_UT extends AbstractSpecification { + + def "builder: インスタンス生成時にIDが自動でセットされる"() { + when: + final user = UserModel.builder().build() + + then: + user.id.length() == 36 + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/domain/service/AbstractService_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/domain/service/AbstractService_UT.groovy new file mode 100644 index 00000000..a54560c0 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/domain/service/AbstractService_UT.groovy @@ -0,0 +1,15 @@ +package dev.abelab.smartpointer.domain.service + +import dev.abelab.smartpointer.AbstractSpecification +import dev.abelab.smartpointer.domain.repository.UserRepository +import org.spockframework.spring.SpringBean + +/** + * Service単体テストの基底クラス + */ +abstract class AbstractService_UT extends AbstractSpecification { + + @SpringBean + UserRepository userRepository = Mock() + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/domain/service/UserService_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/domain/service/UserService_UT.groovy new file mode 100644 index 00000000..788d501e --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/domain/service/UserService_UT.groovy @@ -0,0 +1,44 @@ +package dev.abelab.smartpointer.domain.service + +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ConflictException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * UserServiceの単体テスト + */ +class UserService_UT extends AbstractService_UT { + + @Autowired + UserService sut + + def "checkIsNameAlreadyUsed: 対象ルームに同じユーザ名が存在しない場合は何もしない"() { + given: + final roomId = RandomHelper.alphanumeric(10) + final userName = RandomHelper.alphanumeric(10) + + when: + this.sut.checkIsNameAlreadyUsed(roomId, userName) + + then: + 1 * this.userRepository.existsByRoomIdAndName(roomId, userName) >> false + noExceptionThrown() + } + + def "checkIsNameAlreadyUsed: 対象ルームに同じユーザ名が存在する場合は409エラー"() { + given: + final roomId = RandomHelper.alphanumeric(10) + final userName = RandomHelper.alphanumeric(10) + + when: + this.sut.checkIsNameAlreadyUsed(roomId, userName) + + then: + 1 * this.userRepository.existsByRoomIdAndName(roomId, userName) >> true + final BaseException exception = thrown() + verifyException(exception, new ConflictException(ErrorCode.USER_NAME_IS_ALREADY_EXISTS)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/enums/SlideControl_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/enums/SlideControl_UT.groovy new file mode 100644 index 00000000..e060c14c --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/enums/SlideControl_UT.groovy @@ -0,0 +1,24 @@ +package dev.abelab.smartpointer.enums + +import dev.abelab.smartpointer.AbstractSpecification + +/** + * SlideControl単体テスト + */ +class SlideControl_UT extends AbstractSpecification { + + def "find: IDからタイマーステータスを検索"() { + when: + final result = SlideControl.find(inputId) + + then: + result == expectedResult + + where: + inputId || expectedResult + SlideControl.NEXT.id || Optional.of(SlideControl.NEXT) + SlideControl.PREVIOUS.id || Optional.of(SlideControl.PREVIOUS) + -1 || Optional.empty() + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/enums/TimerStatus_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/enums/TimerStatus_UT.groovy new file mode 100644 index 00000000..b260a783 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/enums/TimerStatus_UT.groovy @@ -0,0 +1,24 @@ +package dev.abelab.smartpointer.enums + +import dev.abelab.smartpointer.AbstractSpecification + +/** + * TimerStatusの単体テスト + */ +class TimerStatus_UT extends AbstractSpecification { + + def "find: IDからタイマーステータスを検索"() { + when: + final result = TimerStatus.find(inputId) + + then: + result == expectedResult + + where: + inputId || expectedResult + TimerStatus.READY.id || Optional.of(TimerStatus.READY) + TimerStatus.RUNNING.id || Optional.of(TimerStatus.RUNNING) + -1 || Optional.empty() + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/DateHelper.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/DateHelper.groovy new file mode 100644 index 00000000..91e72086 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/DateHelper.groovy @@ -0,0 +1,49 @@ +package dev.abelab.smartpointer.helper + +import java.time.LocalDateTime + +/** + * 日付ヘルパー + */ +class DateHelper { + + /** + * 日付を作成 + * + * @param year 年 + * @param month 月 + * @param day 日 + * @return 日付 + */ + static LocalDateTime build(final Integer year, final Integer month, final Integer day) { + return LocalDateTime.of(year, month, day, 0, 0) + } + + /** + * 明日の日付を取得 + * + * @return 明日の日付 + */ + static LocalDateTime tomorrow() { + return LocalDateTime.now().plusDays(1) + } + + /** + * 今日の日付を取得 + * + * @return 今日の日付 + */ + static LocalDateTime today() { + return LocalDateTime.now() + } + + /** + * 昨日の日付を取得 + * + * @return 昨日の日付 + */ + static LocalDateTime yesterday() { + return LocalDateTime.now().minusDays(1) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/JsonConvertHelper.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/JsonConvertHelper.groovy new file mode 100644 index 00000000..be234aa1 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/JsonConvertHelper.groovy @@ -0,0 +1,40 @@ +package dev.abelab.smartpointer.helper + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import lombok.SneakyThrows + +/** + * Jsonを変換するヘルパー + */ +class JsonConvertHelper { + + private static final ObjectMapper objectMapper = new ObjectMapper() + .registerModule(new JavaTimeModule()) + .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true) + + /** + * オブジェクトをJSON文字列に変換 + * + * @param object object + * @return string + */ + @SneakyThrows + static String convertObjectToJson(final Object object) { + return objectMapper.writeValueAsString(object) + } + + /** + * JSON文字列をオブジェクトに変換 + * + * @param json json + * @param clazz clazz + * @return object + */ + @SneakyThrows + static T convertJsonToObject(final String json, final Class clazz) { + return objectMapper.readValue(json, clazz) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/RandomHelper.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/RandomHelper.groovy new file mode 100644 index 00000000..dec20754 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/RandomHelper.groovy @@ -0,0 +1,80 @@ +package dev.abelab.smartpointer.helper + +import org.apache.commons.lang3.RandomStringUtils +import org.jeasy.random.EasyRandom + +/** + * ランダム値を扱うヘルパー + */ +class RandomHelper { + + private static final EasyRandom easyRandom = new EasyRandom() + + /** + * ランダムなメールアドレスを生成 + * + * @return email + */ + static String email() { + return RandomStringUtils.randomAlphanumeric(10) + "@example.com" + } + + /** + * ランダムなパスワードを生成 + * + * @return password + */ + static String password() { + return "b9Fj5QYP" + RandomStringUtils.randomAlphanumeric(4) + } + + /** + * ランダムなアルファベット+数字の文字列を生成 + * + * @param length + * @return 文字列 + */ + static String alphanumeric(final Integer length) { + return RandomStringUtils.randomAlphanumeric(length) + } + + /** + * ランダムな数字の文字列を生成 + * + * @param length + * @return 文字列 + */ + static String numeric(final Integer length) { + return RandomStringUtils.randomNumeric(length) + } + + /** + * ランダム値を格納したモックオブジェクトを返す + * + * @param clazz + * @return モックオブジェクト + */ + static T mock(final Class clazz) { + return easyRandom.nextObject(clazz) + } + + /** + * Base64エンコードされた文字列を生成 + * + * @return 文字列 + */ + static String base64() { + final encoder = Base64.encoder + return encoder.encode(RandomStringUtils.randomAlphabetic(10).getBytes()) + } + + /** + * UUIDを生成 + * + * @return UUID + */ + static String uuid() { + return UUID.randomUUID().toString() + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/TableHelper.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/TableHelper.groovy new file mode 100644 index 00000000..b1614337 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/TableHelper.groovy @@ -0,0 +1,39 @@ +package dev.abelab.smartpointer.helper + +import dev.abelab.smartpointer.helper.table.TableParser +import groovy.sql.Sql + +/** + * DBテーブルのヘルパー + */ +class TableHelper { + + /** + * データを挿入 + * + * @param sql sql + * @param tableName テーブル名 + * @param tableData テーブルデータ + */ + def static insert(final Sql sql, final String tableName, final Closure rows) { + TableParser.asTable(rows).toMapList().each { + sql.dataSet("`$tableName`").add(it) + } + } + + /** + * データを挿入 + * 全レコードで共通の値を指定 + * + * @param sql sql + * @param tableName テーブル名 + * @param tableData テーブルデータ + * @param append 全レコードで共通の値 + */ + def static insert(final Sql sql, final String tableName, final Closure rows, final Map append) { + TableParser.asTable(rows).toMapList().each { + sql.dataSet("`$tableName`").add(it + append) + } + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Column.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Column.groovy new file mode 100644 index 00000000..24e838ef --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Column.groovy @@ -0,0 +1,8 @@ +package dev.abelab.smartpointer.helper.table + +import groovy.transform.ToString + +@ToString +class Column { + String name +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/table/PropertyColumnConverter.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/PropertyColumnConverter.groovy new file mode 100644 index 00000000..7bf83833 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/PropertyColumnConverter.groovy @@ -0,0 +1,7 @@ +package dev.abelab.smartpointer.helper.table + +class PropertyColumnConverter { + Column getProperty(final String property) { + new Column(name: property) + } +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Row.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Row.groovy new file mode 100644 index 00000000..0501a0a7 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Row.groovy @@ -0,0 +1,14 @@ +package dev.abelab.smartpointer.helper.table + +import groovy.transform.ToString + +@ToString +class Row { + + List values = [] + + Row or(arg) { + values.add(arg) + this + } +} \ No newline at end of file diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Table.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Table.groovy new file mode 100644 index 00000000..08d4b7d3 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/Table.groovy @@ -0,0 +1,15 @@ +package dev.abelab.smartpointer.helper.table + +import groovy.transform.ToString +import groovy.transform.TupleConstructor + +@ToString +@TupleConstructor +class Table { + List columns + List rows + + List> toMapList() { + rows.collect { [columns, it.values].transpose().collectEntries { [it[0].name, it[1]] } } + } +} \ No newline at end of file diff --git a/app/src/test/groovy/dev/abelab/smartpointer/helper/table/TableParser.groovy b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/TableParser.groovy new file mode 100644 index 00000000..de621202 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/helper/table/TableParser.groovy @@ -0,0 +1,39 @@ +package dev.abelab.smartpointer.helper.table + +class TableParser { + + private static ThreadLocal context = new ThreadLocal() + + static or(self, arg) { + appendRow(self, arg) + } + + static or(Integer self, Integer arg) { + appendRow(self, arg) + } + + static or(Boolean self, Boolean arg) { + appendRow(self, arg) + } + + static appendRow(value, nextValue) { + Row row = new Row(values: [value]) + context.get().add(row) + row.or(nextValue) + } + + static asListOfRows(Closure tableData) { + context.set([]) + use(TableParser) { + tableData.delegate = new PropertyColumnConverter() + tableData.resolveStrategy = Closure.DELEGATE_FIRST + tableData() + } + context.get() + } + + static asTable(Closure tableData) { + def list = asListOfRows(tableData) + new Table(list.head().values, list.tail()) + } +} \ No newline at end of file diff --git a/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/AbstractController_IT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/AbstractController_IT.groovy new file mode 100644 index 00000000..29cf461c --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/AbstractController_IT.groovy @@ -0,0 +1,238 @@ +package dev.abelab.smartpointer.infrastructure.api.controller + +import dev.abelab.smartpointer.AbstractDatabaseSpecification +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.helper.JsonConvertHelper +import dev.abelab.smartpointer.infrastructure.api.response.ErrorResponse +import dev.abelab.smartpointer.property.AuthProperty +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.context.MessageSource +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.messaging.converter.MappingJackson2MessageConverter +import org.springframework.messaging.simp.stomp.StompSession +import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter +import org.springframework.mock.web.MockHttpSession +import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.MvcResult +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders +import org.springframework.test.web.servlet.setup.MockMvcBuilders +import org.springframework.transaction.PlatformTransactionManager +import org.springframework.util.MultiValueMap +import org.springframework.web.context.WebApplicationContext +import org.springframework.web.socket.client.standard.StandardWebSocketClient +import org.springframework.web.socket.messaging.WebSocketStompClient +import org.springframework.web.socket.sockjs.client.SockJsClient +import org.springframework.web.socket.sockjs.client.WebSocketTransport +import spock.lang.Shared + +import java.util.concurrent.TimeUnit + +/** + * Controller統合テストの基底クラス + */ +abstract class AbstractController_IT extends AbstractDatabaseSpecification { + + private MockMvc mockMvc + + private WebSocketStompClient stompClient + + @Autowired + private WebApplicationContext webApplicationContext + + @Autowired + private PlatformTransactionManager transactionManager + + @Autowired + private MessageSource messageSource + + @Autowired + protected AuthProperty authProperty + + @Shared + protected MockHttpSession session = new MockHttpSession() + + /** + * GET request + * + * @param path path + * + * @return HTTP request builder + */ + MockHttpServletRequestBuilder getRequest(final String path) { + return MockMvcRequestBuilders.get(path) + .session(this.session) + } + + /** + * POST request + * + * @param path path + * + * @return HTTP request builder + */ + MockHttpServletRequestBuilder postRequest(final String path) { + return MockMvcRequestBuilders.post(path) + .session(this.session) + } + + /** + * POST request (Form) + * + * @param path path + * @param params query params + * + * @return HTTP request builder + */ + MockHttpServletRequestBuilder postRequest(final String path, final MultiValueMap params) { + return MockMvcRequestBuilders.post(path) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .params(params) + .session(this.session) + } + + /** + * POST request (JSON) + * + * @param path path + * @param content request body + * + * @return HTTP request builder + */ + MockHttpServletRequestBuilder postRequest(final String path, final Object content) { + return MockMvcRequestBuilders.post(path) + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(JsonConvertHelper.convertObjectToJson(content)) + .session(this.session) + } + + /** + * PUT request (JSON) + * + * @param path path + * @param content request body + * + * @return HTTP request builder + */ + MockHttpServletRequestBuilder putRequest(final String path, final Object content) { + return MockMvcRequestBuilders.put(path) + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(JsonConvertHelper.convertObjectToJson(content)) + .session(this.session) + } + + /** + * DELETE request + * + * @param path path + * + * @return HTTP request builder + */ + MockHttpServletRequestBuilder deleteRequest(final String path) { + return MockMvcRequestBuilders.delete(path) + .session(this.session) + } + + /** + * Execute request + * + * @param request HTTP request builder + * @param status expected HTTP status + * + * @return MVC result + */ + MvcResult execute(final MockHttpServletRequestBuilder request, final HttpStatus status) { + final result = mockMvc.perform(request).andReturn() + + assert result.response.status == status.value() + return result + } + + /** + * Execute request / return response + * + * @param request HTTP request builder + * @param status expected HTTP status + * @param clazz response class + * + * @return response + */ + def T execute(final MockHttpServletRequestBuilder request, final HttpStatus status, final Class clazz) { + final result = mockMvc.perform(request).andReturn() + + assert result.response.status == status.value() + return JsonConvertHelper.convertJsonToObject(result.getResponse().getContentAsString(), clazz) + } + + /** + * Execute request / verify exception + * + * @param request HTTP request builder + * @param exception expected exception + * + * @return error response + */ + ErrorResponse execute(final MockHttpServletRequestBuilder request, final BaseException exception) { + final result = mockMvc.perform(request).andReturn() + final response = JsonConvertHelper.convertJsonToObject(result.response.contentAsString, ErrorResponse.class) + + final expectedErrorMessage = this.getErrorMessage(exception) + + assert result.response.status == exception.httpStatus.value() + assert response.code == exception.errorCode.code + assert response.message == expectedErrorMessage + return response + } + + /** + * エラーメッセージを取得 + * + * @param exception exception + * @return エラーメッセージ + */ + private String getErrorMessage(final BaseException exception) { + final messageKey = exception.errorCode.messageKey + final args = exception.args + return this.messageSource.getMessage(messageKey, args, Locale.ENGLISH) + } + + /** + * STOMPのコネクションを開始 + * + * @return session + */ + protected StompSession connect() { + final stompSessionHandler = new StompSessionHandlerAdapter() {} + return this.stompClient.connect(String.format("ws://localhost:%d/ws", PORT), stompSessionHandler) + .get(1, TimeUnit.SECONDS) + } + + /** + * publish + * + * @param destination destination + * @param session stomp session + * @param payload payload + */ + protected void publish(final String destination, final StompSession session, final Object payload) { + session.send(destination, JsonConvertHelper.convertObjectToJson(payload)) + } + + /** + * setup before test case + */ + def setup() { + this.mockMvc = MockMvcBuilders + .webAppContextSetup(this.webApplicationContext) + .addFilter(({ request, response, chain -> + response.setCharacterEncoding("UTF-8") + chain.doFilter(request, response) + })) + .build() + + this.stompClient = new WebSocketStompClient(new SockJsClient(List.of(new WebSocketTransport(new StandardWebSocketClient())))) + this.stompClient.setMessageConverter(new MappingJackson2MessageConverter()) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/HealthCheckRestController_IT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/HealthCheckRestController_IT.groovy new file mode 100644 index 00000000..cdb5b2b2 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/HealthCheckRestController_IT.groovy @@ -0,0 +1,20 @@ +package dev.abelab.smartpointer.infrastructure.api.controller + +import org.springframework.http.HttpStatus + +/** + * HealthCheckRestControllerの統合テスト + */ +class HealthCheckRestController_IT extends AbstractController_IT { + + // API PATH + static final String BASE_PATH = "/api/health" + static final String HEALTH_CHECK_PATH = BASE_PATH + + def "ヘルスチェックAPI: 正常系 200 OKを返す"() { + expect: + final request = this.getRequest(HEALTH_CHECK_PATH) + this.execute(request, HttpStatus.OK) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/RoomRestController_IT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/RoomRestController_IT.groovy new file mode 100644 index 00000000..987bb0bf --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/api/controller/RoomRestController_IT.groovy @@ -0,0 +1,188 @@ +package dev.abelab.smartpointer.infrastructure.api.controller + +import dev.abelab.smartpointer.exception.* +import dev.abelab.smartpointer.helper.RandomHelper +import dev.abelab.smartpointer.helper.TableHelper +import dev.abelab.smartpointer.infrastructure.api.request.RoomJoinRequest +import dev.abelab.smartpointer.infrastructure.api.response.AccessTokenResponse +import dev.abelab.smartpointer.infrastructure.api.response.RoomResponse +import org.springframework.http.HttpStatus + +/** + * RoomRestControllerの統合テスト + */ +class RoomRestController_IT extends AbstractController_IT { + + static final String BASE_PATH = "/api/rooms" + static final String CREATE_ROOM_PATH = BASE_PATH + static final String DELETE_ROOM_PATH = BASE_PATH + "/%s" + static final String JOIN_ROOM_PATH = BASE_PATH + "/%s/join" + + def "ルーム作成API: 正常系 ルームを作成できる"() { + when: + final request = this.postRequest(CREATE_ROOM_PATH) + final response = execute(request, HttpStatus.CREATED, RoomResponse) + + then: + final rooms = sql.rows("SELECT * FROM room") + rooms.size() == 1 + + response.roomId == rooms[0].id + response.passcode == rooms[0].passcode + } + + def "ルーム削除API: 正常系 ルームを削除する"() { + given: + final roomId = RandomHelper.uuid() + final roomPasscode = RandomHelper.numeric(6) + + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + roomId | roomPasscode + } + // @formatter:on + + when: + final request = this.deleteRequest(String.format(DELETE_ROOM_PATH, roomId)) + this.execute(request, HttpStatus.OK) + + then: + final room = sql.firstRow("SELECT * FROM room WHERE id=:id", [id: roomId]) + room == null + } + + def "ルーム削除API: 異常系 ルームが存在しない場合は404エラー"() { + given: + final roomId = RandomHelper.uuid() + + expect: + final request = this.deleteRequest(String.format(DELETE_ROOM_PATH, roomId)) + this.execute(request, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + + def "ルーム入室API: 正常系 入室に成功するとアクセストークンを返す"() { + given: + final roomId = RandomHelper.uuid() + final roomPasscode = RandomHelper.numeric(6) + + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + roomId | roomPasscode + } + // @formatter:on + + final requestBody = RoomJoinRequest.builder() + .passcode(roomPasscode) + .name(inputName) + .build() + + when: + final request = this.postRequest(String.format(JOIN_ROOM_PATH, roomId), requestBody) + final response = this.execute(request, HttpStatus.OK, AccessTokenResponse) + + then: + response.tokenType == this.authProperty.tokenType + response.ttl == this.authProperty.ttl + + final createdUser = sql.firstRow("SELECT * FROM user") + createdUser.room_id == roomId + createdUser.name == requestBody.name + + where: + inputName << [ + RandomHelper.alphanumeric(1), + RandomHelper.alphanumeric(255), + ] + } + + def "ルーム入室API: 異常系 リクエストボディのバリデーション"() { + given: + final requestBody = RoomJoinRequest.builder() + .passcode("") + .name(inputName) + .build() + + expect: + final request = this.postRequest(String.format(JOIN_ROOM_PATH, "..."), requestBody) + this.execute(request, new BadRequestException(expectedErrorCode)) + + where: + inputName || expectedErrorCode + RandomHelper.alphanumeric(0) || ErrorCode.INVALID_USER_NAME + RandomHelper.alphanumeric(256) || ErrorCode.INVALID_USER_NAME + } + + def "ルーム入室API: 異常系 ルームが存在しない場合は404エラー"() { + given: + final roomId = RandomHelper.uuid() + final roomPasscode = RandomHelper.numeric(6) + + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + roomId | roomPasscode + } + // @formatter:on + + final requestBody = RoomJoinRequest.builder() + .passcode(roomPasscode) + .name(RandomHelper.alphanumeric(10)) + .build() + + expect: + final request = this.postRequest(String.format(JOIN_ROOM_PATH, "..."), requestBody) + this.execute(request, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + + def "ルーム入室API: 異常系 パスコードが間違えている場合は401エラー"() { + given: + final roomId = RandomHelper.uuid() + final roomPasscode = RandomHelper.numeric(6) + + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + roomId | roomPasscode + } + // @formatter:on + + final requestBody = RoomJoinRequest.builder() + .passcode(roomPasscode + "...") + .name(RandomHelper.alphanumeric(10)) + .build() + + expect: + final request = this.postRequest(String.format(JOIN_ROOM_PATH, roomId), requestBody) + this.execute(request, new UnauthorizedException(ErrorCode.INCORRECT_ROOM_PASSCODE)) + } + + def "ルーム入室API: 異常系 ユーザ名が既に使われている場合は409エラー"() { + given: + final roomId = RandomHelper.uuid() + final roomPasscode = RandomHelper.numeric(6) + final userName = RandomHelper.alphanumeric(10) + + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + roomId | roomPasscode + } + TableHelper.insert sql, "user", { + room_id | name + roomId | userName + } + // @formatter:on + + final requestBody = RoomJoinRequest.builder() + .passcode(roomPasscode) + .name(userName) + .build() + + expect: + final request = this.postRequest(String.format(JOIN_ROOM_PATH, roomId), requestBody) + this.execute(request, new ConflictException(ErrorCode.USER_NAME_IS_ALREADY_EXISTS)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/AbstractRepository_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/AbstractRepository_UT.groovy new file mode 100644 index 00000000..6985391d --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/AbstractRepository_UT.groovy @@ -0,0 +1,9 @@ +package dev.abelab.smartpointer.infrastructure.repository + +import dev.abelab.smartpointer.AbstractDatabaseSpecification + +/** + * Repository単体テストの基底クラス + */ +abstract class AbstractRepository_UT extends AbstractDatabaseSpecification { +} \ No newline at end of file diff --git a/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/RoomRepositoryImpl_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/RoomRepositoryImpl_UT.groovy new file mode 100644 index 00000000..7e9ff166 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/RoomRepositoryImpl_UT.groovy @@ -0,0 +1,94 @@ +package dev.abelab.smartpointer.infrastructure.repository + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.helper.RandomHelper +import dev.abelab.smartpointer.helper.TableHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * RoomRepositoryImplの単体テスト + */ +class RoomRepositoryImpl_UT extends AbstractRepository_UT { + + @Autowired + RoomRepositoryImpl sut + + def "selectById: IDからルームを取得"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "000000" + } + // @formatter:on + + when: + final result = this.sut.selectById("00000000-0000-0000-0000-000000000000") + + then: + result.isPresent() + result.get().id == "00000000-0000-0000-0000-000000000000" + result.get().passcode == "000000" + } + + def "selectById: 存在しない場合はOptional.empty()を返す"() { + when: + final result = this.sut.selectById(RandomHelper.uuid()) + + then: + result.isEmpty() + } + + def "insert: ルームを作成"() { + given: + final room = RoomModel.builder().build() + + when: + this.sut.insert(room) + + then: + final createdRoom = sql.firstRow("SELECT * FROM room") + createdRoom.id == room.id + createdRoom.passcode == room.passcode + } + + def "deleteById: IDからルームを削除"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "" + "00000000-0000-0000-0000-000000000001" | "" + } + // @formatter:on + + when: + this.sut.deleteById("00000000-0000-0000-0000-000000000000") + + then: + final rooms = sql.rows("SELECT * FROM room") + rooms*.id == ["00000000-0000-0000-0000-000000000001"] + } + + def "existsById: IDからルームの存在チェック"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "" + } + // @formatter:on + + when: + final result = this.sut.existsById(inputId) + + then: + result == expectedResult + + where: + inputId || expectedResult + "00000000-0000-0000-0000-000000000000" || true + "00000000-0000-0000-0000-000000000001" || false + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/TimerRepositoryImpl_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/TimerRepositoryImpl_UT.groovy new file mode 100644 index 00000000..dcfebee0 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/TimerRepositoryImpl_UT.groovy @@ -0,0 +1,144 @@ +package dev.abelab.smartpointer.infrastructure.repository + +import dev.abelab.smartpointer.domain.model.TimerModel +import dev.abelab.smartpointer.enums.TimerStatus +import dev.abelab.smartpointer.helper.TableHelper +import org.springframework.beans.factory.annotation.Autowired + +import java.time.LocalDateTime + +/** + * TimerRepositoryImplの単体テスト + */ +class TimerRepositoryImpl_UT extends AbstractRepository_UT { + + @Autowired + TimerRepositoryImpl sut + + def "selectByRoomId: ルームIDからユーザを取得"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "" + } + TableHelper.insert sql, "timer", { + room_id | status | value | finish_at + "00000000-0000-0000-0000-000000000000" | TimerStatus.READY.id | 60 | "2000-01-01 10:30:30" + } + // @formatter:on + + when: + final result = this.sut.selectByRoomId("00000000-0000-0000-0000-000000000000") + + then: + result.isPresent() + result.get().roomId == "00000000-0000-0000-0000-000000000000" + result.get().status == TimerStatus.READY + result.get().value == 60 + result.get().finishAt.toString() == "2000-01-01T10:30:30" + } + + def "selectByRoomId: 存在しない場合はOptional.empty()を返す"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "" + } + TableHelper.insert sql, "timer", { + room_id | status | value | finish_at + "00000000-0000-0000-0000-000000000000" | TimerStatus.READY.id | 60 | "2000-01-01 00:00:00" + } + // @formatter:on + + when: + final result = this.sut.selectByRoomId("00000000-0000-0000-0000-000000000001") + + then: + result.isEmpty() + } + + def "insert: ルームを作成する"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "" + } + // @formatter:on + + final timer = TimerModel.builder() + .roomId("00000000-0000-0000-0000-000000000000") + .status(TimerStatus.READY) + .value(60) + .finishAt(LocalDateTime.now()) + .build() + + when: + this.sut.insert(timer) + + then: + final createdTimer = sql.firstRow("SELECT * FROM timer") + createdTimer.room_id == timer.roomId + createdTimer.status == timer.status.id + createdTimer.value == timer.value + } + + def "upsert: ルームが存在する場合は更新する"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "" + } + TableHelper.insert sql, "timer", { + room_id | status | value | finish_at + "00000000-0000-0000-0000-000000000000" | TimerStatus.READY.id | 60 | "2000-01-01 00:00:00" + } + // @formatter:on + + final timer = TimerModel.builder() + .roomId("00000000-0000-0000-0000-000000000000") + .status(TimerStatus.RUNNING) + .value(120) + .finishAt(LocalDateTime.now()) + .build() + + when: + this.sut.upsert(timer) + + then: + final upsertedTimer = sql.firstRow("SELECT * FROM timer") + upsertedTimer.room_id == timer.roomId + upsertedTimer.status == timer.status.id + upsertedTimer.value == timer.value + } + + def "upsert: ルームが存在しない場合は作成する"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "" + } + // @formatter:on + + final timer = TimerModel.builder() + .roomId("00000000-0000-0000-0000-000000000000") + .status(TimerStatus.RUNNING) + .value(120) + .finishAt(LocalDateTime.now()) + .build() + + when: + this.sut.upsert(timer) + + then: + final upsertedTimer = sql.firstRow("SELECT * FROM timer") + upsertedTimer.room_id == timer.roomId + upsertedTimer.status == timer.status.id + upsertedTimer.value == timer.value + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/UserRepositoryImpl_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/UserRepositoryImpl_UT.groovy new file mode 100644 index 00000000..10b09ae8 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/infrastructure/repository/UserRepositoryImpl_UT.groovy @@ -0,0 +1,160 @@ +package dev.abelab.smartpointer.infrastructure.repository + +import dev.abelab.smartpointer.domain.model.UserModel +import dev.abelab.smartpointer.helper.RandomHelper +import dev.abelab.smartpointer.helper.TableHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * UserRepositoryImplの単体テスト + */ +class UserRepositoryImpl_UT extends AbstractRepository_UT { + + @Autowired + UserRepositoryImpl sut + + def "selectById: IDからユーザを取得"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "000000" + } + TableHelper.insert sql, "user", { + id | room_id | name + "00000000-0000-0000-0000-000000000000" | "00000000-0000-0000-0000-000000000000" | "A" + "00000000-0000-0000-0000-000000000001" | "00000000-0000-0000-0000-000000000000" | "B" + } + // @formatter:on + + when: + final result = this.sut.selectById("00000000-0000-0000-0000-000000000000") + + then: + result.isPresent() + result.get().id == "00000000-0000-0000-0000-000000000000" + result.get().roomId == "00000000-0000-0000-0000-000000000000" + result.get().name == "A" + } + + def "selectById: 存在しない場合はOptional.empty()を返す"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "000000" + } + TableHelper.insert sql, "user", { + id | room_id | name + "00000000-0000-0000-0000-000000000000" | "00000000-0000-0000-0000-000000000000" | "" + } + // @formatter:on + + when: + final result = this.sut.selectById("00000000-0000-0000-0000-000000000001") + + then: + result.isEmpty() + } + + def "selectByRoomId: ルームIDからユーザリストを取得"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "000000" + "00000000-0000-0000-0000-000000000001" | "000000" + } + TableHelper.insert sql, "user", { + id | room_id | name + "00000000-0000-0000-0000-000000000000" | "00000000-0000-0000-0000-000000000000" | "A" + "00000000-0000-0000-0000-000000000001" | "00000000-0000-0000-0000-000000000000" | "B" + "00000000-0000-0000-0000-000000000002" | "00000000-0000-0000-0000-000000000001" | "C" + } + // @formatter:on + + when: + final roomId = "00000000-0000-0000-0000-000000000000" + final result = this.sut.selectByRoomId(roomId) + + then: + result*.id == ["00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000001"] + result*.roomId == [roomId, roomId] + result*.name == ["A", "B"] + } + + def "insert: ユーザを作成"() { + given: + final roomId = RandomHelper.uuid() + + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + roomId | "000000" + } + // @formatter:on + + final user = UserModel.builder() + .roomId(roomId) + .name(RandomHelper.alphanumeric(10)) + .build() + + when: + this.sut.insert(user) + + then: + final createdUser = sql.firstRow("SELECT * FROM user") + createdUser.id == user.id + createdUser.room_id == user.roomId + createdUser.name == user.name + } + + def "deleteById: IDからユーザを削除"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "000000" + } + TableHelper.insert sql, "user", { + id | room_id | name + "00000000-0000-0000-0000-000000000000" | "00000000-0000-0000-0000-000000000000" | "A" + "00000000-0000-0000-0000-000000000001" | "00000000-0000-0000-0000-000000000000" | "B" + } + // @formatter:on + + when: + this.sut.deleteById("00000000-0000-0000-0000-000000000000") + + then: + final users = sql.rows("SELECT * FROM user") + users*.name == ["B"] + } + + def "existsByRoomIdAndName: ルームID、ユーザ名からユーザの存在チェック"() { + given: + // @formatter:off + TableHelper.insert sql, "room", { + id | passcode + "00000000-0000-0000-0000-000000000000" | "000000" + } + TableHelper.insert sql, "user", { + room_id | name + "00000000-0000-0000-0000-000000000000" | "A" + } + // @formatter:on + + when: + final result = this.sut.existsByRoomIdAndName(inputRoomId, inputName) + + then: + result == expectedResult + + where: + inputRoomId | inputName || expectedResult + "00000000-0000-0000-0000-000000000000" | "A" || true + "00000000-0000-0000-0000-000000000001" | "A" || false + "00000000-0000-0000-0000-000000000000" | "B" || false + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/AbstractUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/AbstractUseCase_UT.groovy new file mode 100644 index 00000000..01ce037a --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/AbstractUseCase_UT.groovy @@ -0,0 +1,27 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.AbstractSpecification +import dev.abelab.smartpointer.domain.repository.RoomRepository +import dev.abelab.smartpointer.domain.repository.TimerRepository +import dev.abelab.smartpointer.domain.repository.UserRepository +import dev.abelab.smartpointer.domain.service.UserService +import org.spockframework.spring.SpringBean + +/** + * UseCase単体テストの基底クラス + */ +abstract class AbstractUseCase_UT extends AbstractSpecification { + + @SpringBean + RoomRepository roomRepository = Mock() + + @SpringBean + UserRepository userRepository = Mock() + + @SpringBean + TimerRepository timerRepository = Mock() + + @SpringBean + UserService userService = Mock() + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/BroadcastTimerUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/BroadcastTimerUseCase_UT.groovy new file mode 100644 index 00000000..10eae4ec --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/BroadcastTimerUseCase_UT.groovy @@ -0,0 +1,45 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.domain.model.TimerModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * BroadcastTimerUseCaseUseCaseの単体テスト + */ +class BroadcastTimerUseCase_UT extends AbstractUseCase_UT { + + @Autowired + BroadcastTimerUseCase sut + + def "handle: タイマーを配信する"() { + given: + final timer = RandomHelper.mock(TimerModel) + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.of(timer) + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/ControlPointerUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/ControlPointerUseCase_UT.groovy new file mode 100644 index 00000000..812542ff --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/ControlPointerUseCase_UT.groovy @@ -0,0 +1,49 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import dev.abelab.smartpointer.infrastructure.api.request.PointerControlRequest +import org.springframework.beans.factory.annotation.Autowired + +/** + * ControlPointerUseCaseの単体テスト + */ +class ControlPointerUseCase_UT extends AbstractUseCase_UT { + + @Autowired + ControlPointerUseCase sut + + def "handle: ポインターを操作する"() { + given: + final room = RandomHelper.mock(RoomModel) + final requestBody = RandomHelper.mock(PointerControlRequest) + + when: + final result = this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + result.rotation.alpha == requestBody.alpha + result.rotation.beta == requestBody.beta + result.rotation.gamma == requestBody.gamma + result.isActive + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + final requestBody = RandomHelper.mock(PointerControlRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/CreateRoomUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/CreateRoomUseCase_UT.groovy new file mode 100644 index 00000000..44693af4 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/CreateRoomUseCase_UT.groovy @@ -0,0 +1,21 @@ +package dev.abelab.smartpointer.usecase + +import org.springframework.beans.factory.annotation.Autowired + +/** + * CreateRoomUseCaseの単体テスト + */ +class CreateRoomUseCase_UT extends AbstractUseCase_UT { + + @Autowired + CreateRoomUseCase sut + + def "handle: ルームを作成する"() { + when: + this.sut.handle() + + then: + 1 * this.roomRepository.insert(_) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/DeleteRoomUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/DeleteRoomUseCase_UT.groovy new file mode 100644 index 00000000..660fdf06 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/DeleteRoomUseCase_UT.groovy @@ -0,0 +1,43 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * DeleteRoomUseCaseの単体テスト + */ +class DeleteRoomUseCase_UT extends AbstractUseCase_UT { + + @Autowired + DeleteRoomUseCase sut + + def "handle: ルームを削除する"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.roomRepository.deleteById(room.id) + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/DisconnectPointerUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/DisconnectPointerUseCase_UT.groovy new file mode 100644 index 00000000..9faf9fe0 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/DisconnectPointerUseCase_UT.groovy @@ -0,0 +1,44 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * DisconnectPointerUseCaseの単体テスト + */ +class DisconnectPointerUseCase_UT extends AbstractUseCase_UT { + + @Autowired + DisconnectPointerUseCase sut + + def "handle: ポインターを切断する"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + final result = this.sut.handle(room.id,) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + result.rotation == null + !result.isActive + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/GoNextSlideUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/GoNextSlideUseCase_UT.groovy new file mode 100644 index 00000000..3787421a --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/GoNextSlideUseCase_UT.groovy @@ -0,0 +1,44 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.enums.SlideControl +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * GoNextSlideUseCaseの単体テスト + */ +class GoNextSlideUseCase_UT extends AbstractUseCase_UT { + + @Autowired + GoNextSlideUseCase sut + + def "handle: スライドを進める"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + final result = this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + result.control == SlideControl.NEXT.id + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/GoPreviousSlideUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/GoPreviousSlideUseCase_UT.groovy new file mode 100644 index 00000000..5cf2452e --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/GoPreviousSlideUseCase_UT.groovy @@ -0,0 +1,44 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.enums.SlideControl +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * GoPreviousSlideUseCaseの単体テスト + */ +class GoPreviousSlideUseCase_UT extends AbstractUseCase_UT { + + @Autowired + GoPreviousSlideUseCase sut + + def "handle: スライドを戻す"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + final result = this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + result.control == SlideControl.PREVIOUS.id + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/JoinRoomUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/JoinRoomUseCase_UT.groovy new file mode 100644 index 00000000..0fed02ce --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/JoinRoomUseCase_UT.groovy @@ -0,0 +1,70 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.exception.UnauthorizedException +import dev.abelab.smartpointer.helper.RandomHelper +import dev.abelab.smartpointer.infrastructure.api.request.RoomJoinRequest +import dev.abelab.smartpointer.property.AuthProperty +import org.springframework.beans.factory.annotation.Autowired + +/** + * JoinRoomUseCaseの単体テスト + */ +class JoinRoomUseCase_UT extends AbstractUseCase_UT { + + @Autowired + JoinRoomUseCase sut + + @Autowired + AuthProperty authProperty; + + def "handle: ログインに成功するとアクセストークンを返す"() { + given: + final room = Spy(RoomModel) + final requestBody = RandomHelper.mock(RoomJoinRequest) + + when: + final result = this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.selectById(room.id) >> Optional.of(room) + 1 * room.isPasscodeValid(requestBody.passcode) >> true + 1 * this.userService.checkIsNameAlreadyUsed(room.id, requestBody.name) >> {} + 1 * this.userRepository.insert(_) + result.tokenType == this.authProperty.tokenType + result.ttl == this.authProperty.ttl + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + final requestBody = RandomHelper.mock(RoomJoinRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.selectById(room.id) >> Optional.empty() + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + + def "handle: パスコードが間違えている場合は401エラー"() { + given: + final room = Spy(RoomModel) + final requestBody = RandomHelper.mock(RoomJoinRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.selectById(room.id) >> Optional.of(room) + room.isPasscodeValid(requestBody.passcode) >> false + final BaseException exception = thrown() + verifyException(exception, new UnauthorizedException(ErrorCode.INCORRECT_ROOM_PASSCODE)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/ResetTimerUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/ResetTimerUseCase_UT.groovy new file mode 100644 index 00000000..2dd2a020 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/ResetTimerUseCase_UT.groovy @@ -0,0 +1,62 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.domain.model.TimerModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * ResetTimerUseCaseUseCaseの単体テスト + */ +class ResetTimerUseCase_UT extends AbstractUseCase_UT { + + @Autowired + ResetTimerUseCase sut + + def "handle: タイマーをリセットする"() { + given: + final timer = Spy(TimerModel) + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + noExceptionThrown() + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.of(timer) + 1 * timer.reset() >> {} + this.timerRepository.upsert(timer) + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + + def "handle: タイマーが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.empty() + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_TIMER)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/ResumeTimerUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/ResumeTimerUseCase_UT.groovy new file mode 100644 index 00000000..bd5f6197 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/ResumeTimerUseCase_UT.groovy @@ -0,0 +1,69 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.domain.model.TimerModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import dev.abelab.smartpointer.infrastructure.api.request.TimerResumeRequest +import org.springframework.beans.factory.annotation.Autowired + +/** + * ResumeTimerUseCaseUseCaseの単体テスト + */ +class ResumeTimerUseCase_UT extends AbstractUseCase_UT { + + @Autowired + ResumeTimerUseCase sut + + def "handle: タイマーを再開する"() { + given: + final timer = Spy(TimerModel) + final room = RandomHelper.mock(RoomModel) + + final requestBody = RandomHelper.mock(TimerResumeRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + noExceptionThrown() + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.of(timer) + 1 * timer.resume(requestBody.value) >> {} + this.timerRepository.upsert(timer) + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + final requestBody = RandomHelper.mock(TimerResumeRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + + def "handle: タイマーが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + final requestBody = RandomHelper.mock(TimerResumeRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.empty() + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_TIMER)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/StartTimerUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/StartTimerUseCase_UT.groovy new file mode 100644 index 00000000..99daa0dc --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/StartTimerUseCase_UT.groovy @@ -0,0 +1,69 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.domain.model.TimerModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import dev.abelab.smartpointer.infrastructure.api.request.TimerStartRequest +import org.springframework.beans.factory.annotation.Autowired + +/** + * StartTimerUseCaseUseCaseの単体テスト + */ +class StartTimerUseCase_UT extends AbstractUseCase_UT { + + @Autowired + StartTimerUseCase sut + + def "handle: タイマーを開始する"() { + given: + final timer = Spy(TimerModel) + final room = RandomHelper.mock(RoomModel) + + final requestBody = RandomHelper.mock(TimerStartRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + noExceptionThrown() + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.of(timer) + 1 * timer.start(requestBody.value) + this.timerRepository.upsert(timer) + } + + def "handle: タイマーが存在しなくても開始可能"() { + given: + final room = RandomHelper.mock(RoomModel) + + final requestBody = RandomHelper.mock(TimerStartRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + noExceptionThrown() + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.empty() + 1 * this.timerRepository.upsert(_) + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + final requestBody = RandomHelper.mock(TimerStartRequest) + + when: + this.sut.handle(room.id, requestBody) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/usecase/StopTimerUseCase_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/usecase/StopTimerUseCase_UT.groovy new file mode 100644 index 00000000..766c33e6 --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/usecase/StopTimerUseCase_UT.groovy @@ -0,0 +1,62 @@ +package dev.abelab.smartpointer.usecase + +import dev.abelab.smartpointer.domain.model.RoomModel +import dev.abelab.smartpointer.domain.model.TimerModel +import dev.abelab.smartpointer.exception.BaseException +import dev.abelab.smartpointer.exception.ErrorCode +import dev.abelab.smartpointer.exception.NotFoundException +import dev.abelab.smartpointer.helper.RandomHelper +import org.springframework.beans.factory.annotation.Autowired + +/** + * StopTimerUseCaseUseCaseの単体テスト + */ +class StopTimerUseCase_UT extends AbstractUseCase_UT { + + @Autowired + StopTimerUseCase sut + + def "handle: タイマーを停止する"() { + given: + final timer = Spy(TimerModel) + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + noExceptionThrown() + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.of(timer) + 1 * timer.stop() >> {} + this.timerRepository.upsert(timer) + } + + def "handle: ルームが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> false + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_ROOM)) + } + + def "handle: タイマーが存在しない場合は404エラー"() { + given: + final room = RandomHelper.mock(RoomModel) + + when: + this.sut.handle(room.id) + + then: + 1 * this.roomRepository.existsById(room.id) >> true + 1 * this.timerRepository.selectByRoomId(room.id) >> Optional.empty() + final BaseException exception = thrown() + verifyException(exception, new NotFoundException(ErrorCode.NOT_FOUND_TIMER)) + } + +} diff --git a/app/src/test/groovy/dev/abelab/smartpointer/util/ValidationUtil_UT.groovy b/app/src/test/groovy/dev/abelab/smartpointer/util/ValidationUtil_UT.groovy new file mode 100644 index 00000000..27d8c28a --- /dev/null +++ b/app/src/test/groovy/dev/abelab/smartpointer/util/ValidationUtil_UT.groovy @@ -0,0 +1,60 @@ +package dev.abelab.smartpointer.util + +import dev.abelab.smartpointer.AbstractSpecification +import dev.abelab.smartpointer.helper.RandomHelper + +/** + * ValidationUtilの単体テスト + */ +class ValidationUtil_UT extends AbstractSpecification { + + def "checkNumberSize: 数値が範囲に収まるかチェック"() { + expect: + ValidationUtil.checkNumberSize(number, min, max) == expectedResult + + where: + number | min | max || expectedResult + 10 | 0 | 20 || true + 10 | 10 | 20 || true + 10 | 0 | 10 || true + 10 | 11 | 20 || false + 10 | 0 | 9 || false + null | 10 | 20 || false + 10 | null | 20 || true + 10 | null | 9 || false + 10 | 0 | null | true + 10 | 11 | null | false + } + + def "checkStringLength: 文字列の長さが範囲に収まるかチェック"() { + expect: + ValidationUtil.checkStringLength(string, min, max) == expectedResult + + where: + string | min | max || expectedResult + RandomHelper.alphanumeric(10) | 0 | 20 || true + RandomHelper.alphanumeric(10) | 10 | 20 || true + RandomHelper.alphanumeric(10) | 0 | 10 || true + RandomHelper.alphanumeric(10) | 11 | 10 || false + RandomHelper.alphanumeric(10) | 0 | 9 || false + null | 0 | 10 || false + RandomHelper.alphanumeric(10) | null | 10 || true + RandomHelper.alphanumeric(10) | null | 9 || false + RandomHelper.alphanumeric(10) | 0 | null || true + RandomHelper.alphanumeric(10) | 11 | null || false + } + + def "checkIsAlphanumeric: 英数字のみの文字列かチェック"() { + expect: + ValidationUtil.checkIsAlphanumeric(string) == expectedResult + + where: + string || expectedResult + null || false + "" || true + " " || false + RandomHelper.alphanumeric(10) || true + RandomHelper.alphanumeric(10) + "_" || false + } + +} diff --git a/asyncapi.yml b/asyncapi.yml new file mode 100644 index 00000000..030fd030 --- /dev/null +++ b/asyncapi.yml @@ -0,0 +1,339 @@ +asyncapi: 2.5.0 + +info: + title: Smart Pointer Internal API + version: 1.0.0 + +servers: + local: + url: localhost:8080 + description: ローカル環境 + protocol: STOMP + dev: + url: smartpointer.abelab.de + description: 開発環境 + protocol: STOMP + prod: + url: smartpointer-prod.an.r.appspot.com + description: 本番環境 + protocol: STOMP + +channels: + /app/rooms/{room_id}/timer/start: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: タイマー開始トピック + message: + $ref: '#/components/messages/startTimer' + /app/rooms/{room_id}/timer/resume: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: タイマー再開トピック + message: + $ref: '#/components/messages/resumeTimer' + /app/rooms/{room_id}/timer/stop: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: タイマー停止トピック + message: + $ref: '#/components/messages/stopTimer' + /app/rooms/{room_id}/timer/reset: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: タイマーリセットトピック + message: + $ref: '#/components/messages/resetTimer' + /app/rooms/{room_id}/slides/next: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: スライドを進めるトピック + message: + $ref: '#/components/messages/goNextSlide' + /app/rooms/{room_id}/slides/previous: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: スライドを戻すトピック + message: + $ref: '#/components/messages/goPreviousSlide' + /app/rooms/{room_id}/pointer/control: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: ポインター操作トピック + message: + $ref: '#/components/messages/controlPointer' + /app/rooms/{room_id}/pointer/disconnect: + parameters: + room_id: + description: ルームID + schema: + type: string + publish: + description: ポインター切断トピック + message: + $ref: '#/components/messages/disconnectPointer' + /topic/rooms/{room_id}/timer: + parameters: + room_id: + description: ルームID + schema: + type: string + subscribe: + description: タイマー購読トピック + message: + $ref: '#/components/messages/broadcastTimer' + /topic/rooms/{room_id}/users: + parameters: + room_id: + description: ルームID + schema: + type: string + subscribe: + description: ユーザリスト購読トピック + message: + $ref: '#/components/messages/broadcastUsers' + /topic/rooms/{room_id}/slides/control: + parameters: + room_id: + description: ルームID + schema: + type: string + subscribe: + description: スライド操作購読トピック + message: + $ref: '#/components/messages/broadcastSlideControl' + /topic/rooms/{room_id}/pointer/control: + parameters: + room_id: + description: ルームID + schema: + type: string + subscribe: + description: ポインター操作購読トピック + message: + $ref: '#/components/messages/broadcastPointerControl' + /topic/exception: + subscribe: + description: 例外購読トピック + message: + $ref: '#/components/messages/broadcastException' + +components: + messages: + startTimer: + description: READY状態のタイマーを開始する + payload: + $ref: '#/components/schemas/TimerStartRequest' + resumeTimer: + description: READY状態のタイマーを再開する + payload: + $ref: '#/components/schemas/TimerResumeRequest' + stopTimer: + description: RUNNING状態のタイマーを停止する + resetTimer: + description: タイマーをリセットする + goNextSlide: + description: スライドを次ページへ進める + goPreviousSlide: + description: スライドを前ページへ戻す + controlPointer: + description: ポインターを操作する + payload: + $ref: '#/components/schemas/PointerControlRequest' + disconnectPointer: + description: ポインターを切断する + broadcastTimer: + description: タイマーを配信する + payload: + $ref: '#/components/schemas/TimerResponse' + broadcastUsers: + description: ユーザリストを配信する + payload: + $ref: '#/components/schemas/UsersResponse' + broadcastSlideControl: + description: スライド操作を配信する + payload: + $ref: '#/components/schemas/SlideControlResponse' + broadcastPointerControl: + description: ポインター操作を配信する + payload: + $ref: '#/components/schemas/PointerControlResponse' + broadcastException: + description: 例外を配信する + payload: + $ref: '#/components/schemas/ErrorResponse' + + schemas: + TimerStartRequest: + description: タイマー開始リクエスト + type: object + properties: + value: + description: 設定時間[s] + type: integer + minimum: 1 + required: + - value + TimerResumeRequest: + description: タイマー再開リクエスト + type: object + properties: + value: + description: 残り時間[s] + type: integer + minimum: 1 + required: + - value + PointerControlRequest: + description: ポインター操作リクエスト + type: object + properties: + alpha: + description: α値 + type: number + beta: + description: β値 + type: number + gamma: + description: γ値 + type: number + required: + - alpha + - beta + - gamma + UserResponse: + description: ユーザレスポンス + type: object + properties: + id: + description: ユーザID + type: string + name: + description: ユーザ名 + type: string + required: + - id + - name + UsersResponse: + description: ユーザリストレスポンス + type: object + properties: + users: + description: ユーザリスト + type: array + $ref: '#/components/schemas/UserResponse' + required: + - users + TimerResponse: + description: タイマーレスポンス + type: object + properties: + status: + description: ステータスID + type: integer + enum: + - 0 + - 1 + value: + description: 残り時間[s] + type: integer + minimum: 1 + nullable: true + finishAt: + description: 終了日時 + type: string + format: yyyy-MM-dd'T'HH:mm:ss + nullable: true + required: + - status + - value + - finishAt + SlideControlResponse: + description: スライド操作レスポンス + type: object + properties: + control: + description: 操作ID + type: integer + enum: + - 0 + - 1 + required: + - control + PointerControlResponse: + description: ポインター操作レスポンス + type: object + properties: + user: + description: ユーザ + type: object + $ref: '#/components/schemas/UserResponse' + isActive: + description: ポインターがアクティブかどうか + type: boolean + rotation: + description: 回転数 + type: object + nullable: true + $ref: '#/components/schemas/PointerRotationResponse' + required: + - user + - enabled + - rotation + PointerRotationResponse: + description: ポインター回転数レスポンス + type: object + properties: + alpha: + description: α値 + type: number + beta: + description: β値 + type: number + gamma: + description: γ値 + type: number + required: + - alpha + - beta + - gamma + ErrorResponse: + description: エラーレスポンス + type: object + properties: + code: + description: エラーコード + type: integer + message: + description: エラーメッセージ + type: string + required: + - code + - message \ No newline at end of file diff --git a/desktop/.eslintrc.js b/desktop/.eslintrc.js new file mode 100644 index 00000000..12b0b9ae --- /dev/null +++ b/desktop/.eslintrc.js @@ -0,0 +1,61 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended", + "prettier", + ], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: "latest", + sourceType: "module", + }, + plugins: ["react", "import", "@typescript-eslint"], + settings: { + "import/resolver": { + typescript: {}, + }, + }, + rules: { + // TypeScript ESLint が references をサポートしておらず、main プロセスの import alias を解決できないため + // https://github.com/typescript-eslint/typescript-eslint/issues/2094 + "import/no-unresolved": "off", + // restrict order of imports + "import/order": [ + "error", + { + pathGroups: [ + { + pattern: "@/**", + group: "internal", + position: "before", + }, + ], + groups: [ + ["builtin", "external"], + ["parent"], + ["internal"], + ["index", "sibling"], + ], + "newlines-between": "always", + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + }, + ], + }, +}; diff --git a/desktop/.gitignore b/desktop/.gitignore new file mode 100644 index 00000000..3c0d0bbc --- /dev/null +++ b/desktop/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +release +.vscode/.debug.env +package-lock.json +pnpm-lock.yaml +yarn.lock +dist-electron diff --git a/desktop/.prettierignore b/desktop/.prettierignore new file mode 100644 index 00000000..91d7922e --- /dev/null +++ b/desktop/.prettierignore @@ -0,0 +1 @@ +electron/main/generated/http-client/* \ No newline at end of file diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 00000000..09bba6bb --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,41 @@ +# ホストPC用 デスクトップアプリケーション + +![version](https://img.shields.io/badge/version-1.0.0-blue.svg) + +## 概要 + +ホストPC向けプレゼンテーションルーム管理アプリケーションです。 + +ルームの作成・終了、ルーム共有リンクの表示、参加者一覧の表示機能があります。 + +## 開発 + +### 環境構築 + +```sh +yarn install +``` + +### 開発用サーバの起動 + +```sh +yarn run dev +``` + +### コードチェック + +```sh +yarn run code-check +``` + +### ビルド方法 + +```sh +yarn build +``` + +### 使用技術 + +- Electron@^8.25.0 +- Vite@^3.1.8 +- TypeScript@^4.6.8 diff --git a/desktop/electron-builder.json5 b/desktop/electron-builder.json5 new file mode 100644 index 00000000..80c81c11 --- /dev/null +++ b/desktop/electron-builder.json5 @@ -0,0 +1,41 @@ +/** + * @see https://www.electron.build/configuration/configuration + */ +{ + appId: "YourAppID", + productName: "YourAppName", + copyright: "Copyright © 2022 ${author}", + asar: true, + directories: { + output: "release/${version}", + buildResources: "electron/resources", + }, + files: [ + "dist-electron", + "dist" + ], + win: { + target: [ + { + target: "nsis", + arch: ["x64"], + }, + ], + artifactName: "${productName}-Windows-${version}-Setup.${ext}", + }, + nsis: { + oneClick: false, + perMachine: false, + allowToChangeInstallationDirectory: true, + deleteAppDataOnUninstall: false, + }, + mac: { + target: ["dmg"], + artifactName: "${productName}-Mac-${version}-Installer.${ext}", + }, + linux: { + icon: "electron/resources/iconset", + target: ["AppImage", "deb"], + artifactName: "${productName}-Linux-${version}.${ext}", + }, +} diff --git a/desktop/electron/electron-env.d.ts b/desktop/electron/electron-env.d.ts new file mode 100644 index 00000000..fbe6ca6d --- /dev/null +++ b/desktop/electron/electron-env.d.ts @@ -0,0 +1,11 @@ +/// + +declare namespace NodeJS { + interface ProcessEnv { + VSCODE_DEBUG?: "true"; + DIST_ELECTRON: string; + DIST: string; + /** /dist/ or /public/ */ + PUBLIC: string; + } +} diff --git a/desktop/electron/main/AppState.ts b/desktop/electron/main/AppState.ts new file mode 100644 index 00000000..3d5e2bcb --- /dev/null +++ b/desktop/electron/main/AppState.ts @@ -0,0 +1,52 @@ +import type { Room, User, Coordinate } from "./types"; + +type State = + | { + name: "READY"; + room?: undefined; + users?: undefined; + pointers?: undefined; + } + | { + name: "CREATING"; + room?: undefined; + users?: undefined; + pointers?: undefined; + } + | { + name: "CREATED"; + room: Room; + users: Map; + pointers: Map; + }; + +export class AppState { + #state: State = { + name: "READY", + }; + + #subscribeListeners = new Set<(state: Readonly) => void>(); + + get state(): Readonly { + return this.#state; + } + + public setState(state: State | ((state: State) => State)): void { + if (typeof state === "function") { + this.#state = state(this.#state); + } else { + this.#state = state; + } + this.#subscribeListeners.forEach((callback) => callback(this.#state)); + } + + public subscribe(callback: (state: Readonly) => void): void { + this.#subscribeListeners.add(callback); + } + + public unsubscribe(callback: (state: Readonly) => void): void { + this.#subscribeListeners.delete(callback); + } +} + +export default AppState; diff --git a/desktop/electron/main/api.ts b/desktop/electron/main/api.ts new file mode 100644 index 00000000..6b8d9704 --- /dev/null +++ b/desktop/electron/main/api.ts @@ -0,0 +1,19 @@ +import axios from "axios"; + +import { Configuration, RoomApi } from "./generated/http-client"; + +const API_URL = + process.env["NODE_ENV"] === "development" + ? "http://localhost:8080" + : "https://smartpointer.abelab.dev"; + +const config = new Configuration({ + basePath: API_URL, +}); + +const axiosInstance = axios.create({ + baseURL: API_URL, + withCredentials: true, +}); + +export const roomApi = new RoomApi(config, "", axiosInstance); diff --git a/desktop/electron/main/app.ts b/desktop/electron/main/app.ts new file mode 100644 index 00000000..5f8b0030 --- /dev/null +++ b/desktop/electron/main/app.ts @@ -0,0 +1,86 @@ +import { app } from "electron"; + +import { AppState } from "./AppState"; +import { showInviteLinkWindow } from "./link"; +import { createTray } from "./menu/tray"; +import { goNext, goPrevious } from "./pagination"; +import { sendHidePointer, sendPointerPosition } from "./pointer"; +import { createRoom } from "./room"; +import { stompClient } from "./stomp"; + +enum SlideControl { + NEXT, + PREVIOUS, +} + +const tanDeg = (deg: number) => Math.tan((deg * Math.PI) / 180); + +app.once("ready", async () => { + const appState = new AppState(); + + stompClient.activate(); + + const handleClickCreateRoom = async () => { + await createRoom(appState); + + if (appState.state.name !== "CREATED") { + throw new Error("ぃやなんしとんねん"); + } + + await showInviteLinkWindow(appState); + + // スライド操作を購読 + stompClient.subscribe( + `/topic/rooms/${appState.state.room.id}/slides/control`, + (message) => { + type Response = { + control: SlideControl; + }; + const body = JSON.parse(message.body) as Response; + if (body.control === SlideControl.NEXT) { + goNext(); + } else { + goPrevious(); + } + } + ); + + // ポインター操作を購読 + stompClient.subscribe( + `/topic/rooms/${appState.state.room.id}/pointer/control`, + (message) => { + type Response = + | { + isActive: true; + rotation: { + alpha: number; + beta: number; + gamma: number; + }; + } + | { + isActive: false; + rotation: null; + }; + const body = JSON.parse(message.body) as Response; + + if (body.isActive) { + sendPointerPosition({ + x: -tanDeg(body.rotation.alpha) / 2, + y: -tanDeg(body.rotation.beta) / 2, + }); + } else { + sendHidePointer(); + } + } + ); + }; + + createTray({ + appState, + handleClickCreateRoom, + handleClickShowInviteLink: () => showInviteLinkWindow(appState), + }); +}); + +app.once("window-all-closed", () => app.quit()); diff --git a/desktop/electron/main/generated/http-client/.gitignore b/desktop/electron/main/generated/http-client/.gitignore new file mode 100644 index 00000000..149b5765 --- /dev/null +++ b/desktop/electron/main/generated/http-client/.gitignore @@ -0,0 +1,4 @@ +wwwroot/*.js +node_modules +typings +dist diff --git a/desktop/electron/main/generated/http-client/.npmignore b/desktop/electron/main/generated/http-client/.npmignore new file mode 100644 index 00000000..999d88df --- /dev/null +++ b/desktop/electron/main/generated/http-client/.npmignore @@ -0,0 +1 @@ +# empty npmignore to ensure all required files (e.g., in the dist folder) are published by npm \ No newline at end of file diff --git a/desktop/electron/main/generated/http-client/.openapi-generator-ignore b/desktop/electron/main/generated/http-client/.openapi-generator-ignore new file mode 100644 index 00000000..7484ee59 --- /dev/null +++ b/desktop/electron/main/generated/http-client/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/desktop/electron/main/generated/http-client/.openapi-generator/FILES b/desktop/electron/main/generated/http-client/.openapi-generator/FILES new file mode 100644 index 00000000..16b445ee --- /dev/null +++ b/desktop/electron/main/generated/http-client/.openapi-generator/FILES @@ -0,0 +1,9 @@ +.gitignore +.npmignore +.openapi-generator-ignore +api.ts +base.ts +common.ts +configuration.ts +git_push.sh +index.ts diff --git a/desktop/electron/main/generated/http-client/.openapi-generator/VERSION b/desktop/electron/main/generated/http-client/.openapi-generator/VERSION new file mode 100644 index 00000000..4ac4fded --- /dev/null +++ b/desktop/electron/main/generated/http-client/.openapi-generator/VERSION @@ -0,0 +1 @@ +6.2.0 \ No newline at end of file diff --git a/desktop/electron/main/generated/http-client/api.ts b/desktop/electron/main/generated/http-client/api.ts new file mode 100644 index 00000000..03e826a9 --- /dev/null +++ b/desktop/electron/main/generated/http-client/api.ts @@ -0,0 +1,355 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import { Configuration } from './configuration'; +import globalAxios, { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; +// Some imports not used depending on template conditions +// @ts-ignore +import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from './common'; +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from './base'; + +/** + * アクセストークンレスポンス + * @export + * @interface AccessTokenResponse + */ +export interface AccessTokenResponse { + /** + * トークンタイプ + * @type {string} + * @memberof AccessTokenResponse + */ + 'tokenType': string; + /** + * アクセストークン + * @type {string} + * @memberof AccessTokenResponse + */ + 'accessToken': string; + /** + * TTL + * @type {number} + * @memberof AccessTokenResponse + */ + 'ttl': number; +} +/** + * ルーム入室リクエスト + * @export + * @interface RoomJoinRequest + */ +export interface RoomJoinRequest { + /** + * パスコード + * @type {string} + * @memberof RoomJoinRequest + */ + 'passcode': string; + /** + * ユーザ名 + * @type {string} + * @memberof RoomJoinRequest + */ + 'name': string; +} +/** + * ルームレスポンス + * @export + * @interface RoomResponse + */ +export interface RoomResponse { + /** + * ルームID + * @type {string} + * @memberof RoomResponse + */ + 'roomId': string; + /** + * パスコード + * @type {string} + * @memberof RoomResponse + */ + 'passcode': string; +} + +/** + * HealthCheckApi - axios parameter creator + * @export + */ +export const HealthCheckApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + health: async (options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/api/health`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * HealthCheckApi - functional programming interface + * @export + */ +export const HealthCheckApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = HealthCheckApiAxiosParamCreator(configuration) + return { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async health(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.health(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * HealthCheckApi - factory interface + * @export + */ +export const HealthCheckApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = HealthCheckApiFp(configuration) + return { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + health(options?: any): AxiosPromise { + return localVarFp.health(options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * HealthCheckApi - object-oriented interface + * @export + * @class HealthCheckApi + * @extends {BaseAPI} + */ +export class HealthCheckApi extends BaseAPI { + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof HealthCheckApi + */ + public health(options?: AxiosRequestConfig) { + return HealthCheckApiFp(this.configuration).health(options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * RoomApi - axios parameter creator + * @export + */ +export const RoomApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createRoom: async (options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/api/rooms`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + joinRoom: async (roomId: string, roomJoinRequest: RoomJoinRequest, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'roomId' is not null or undefined + assertParamExists('joinRoom', 'roomId', roomId) + // verify required parameter 'roomJoinRequest' is not null or undefined + assertParamExists('joinRoom', 'roomJoinRequest', roomJoinRequest) + const localVarPath = `/api/rooms/{room_id}/join` + .replace(`{${"room_id"}}`, encodeURIComponent(String(roomId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(roomJoinRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * RoomApi - functional programming interface + * @export + */ +export const RoomApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = RoomApiAxiosParamCreator(configuration) + return { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createRoom(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createRoom(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async joinRoom(roomId: string, roomJoinRequest: RoomJoinRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.joinRoom(roomId, roomJoinRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * RoomApi - factory interface + * @export + */ +export const RoomApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = RoomApiFp(configuration) + return { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createRoom(options?: any): AxiosPromise { + return localVarFp.createRoom(options).then((request) => request(axios, basePath)); + }, + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + joinRoom(roomId: string, roomJoinRequest: RoomJoinRequest, options?: any): AxiosPromise { + return localVarFp.joinRoom(roomId, roomJoinRequest, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * RoomApi - object-oriented interface + * @export + * @class RoomApi + * @extends {BaseAPI} + */ +export class RoomApi extends BaseAPI { + /** + * ルーム作成API + * @summary ルーム作成API + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RoomApi + */ + public createRoom(options?: AxiosRequestConfig) { + return RoomApiFp(this.configuration).createRoom(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * ルーム入室API + * @summary ルーム入室API + * @param {string} roomId ルームID + * @param {RoomJoinRequest} roomJoinRequest ルーム入室リクエスト + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RoomApi + */ + public joinRoom(roomId: string, roomJoinRequest: RoomJoinRequest, options?: AxiosRequestConfig) { + return RoomApiFp(this.configuration).joinRoom(roomId, roomJoinRequest, options).then((request) => request(this.axios, this.basePath)); + } +} + + diff --git a/desktop/electron/main/generated/http-client/base.ts b/desktop/electron/main/generated/http-client/base.ts new file mode 100644 index 00000000..29c02ed1 --- /dev/null +++ b/desktop/electron/main/generated/http-client/base.ts @@ -0,0 +1,71 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import { Configuration } from "./configuration"; +// Some imports not used depending on template conditions +// @ts-ignore +import globalAxios, { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios'; + +export const BASE_PATH = "http://localhost:8080".replace(/\/+$/, ""); + +/** + * + * @export + */ +export const COLLECTION_FORMATS = { + csv: ",", + ssv: " ", + tsv: "\t", + pipes: "|", +}; + +/** + * + * @export + * @interface RequestArgs + */ +export interface RequestArgs { + url: string; + options: AxiosRequestConfig; +} + +/** + * + * @export + * @class BaseAPI + */ +export class BaseAPI { + protected configuration: Configuration | undefined; + + constructor(configuration?: Configuration, protected basePath: string = BASE_PATH, protected axios: AxiosInstance = globalAxios) { + if (configuration) { + this.configuration = configuration; + this.basePath = configuration.basePath || this.basePath; + } + } +}; + +/** + * + * @export + * @class RequiredError + * @extends {Error} + */ +export class RequiredError extends Error { + name: "RequiredError" = "RequiredError"; + constructor(public field: string, msg?: string) { + super(msg); + } +} diff --git a/desktop/electron/main/generated/http-client/common.ts b/desktop/electron/main/generated/http-client/common.ts new file mode 100644 index 00000000..a2d70b63 --- /dev/null +++ b/desktop/electron/main/generated/http-client/common.ts @@ -0,0 +1,148 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import { Configuration } from "./configuration"; +import { RequiredError, RequestArgs } from "./base"; +import { AxiosInstance, AxiosResponse } from 'axios'; + +/** + * + * @export + */ +export const DUMMY_BASE_URL = 'https://example.com' + +/** + * + * @throws {RequiredError} + * @export + */ +export const assertParamExists = function (functionName: string, paramName: string, paramValue: unknown) { + if (paramValue === null || paramValue === undefined) { + throw new RequiredError(paramName, `Required parameter ${paramName} was null or undefined when calling ${functionName}.`); + } +} + +/** + * + * @export + */ +export const setApiKeyToObject = async function (object: any, keyParamName: string, configuration?: Configuration) { + if (configuration && configuration.apiKey) { + const localVarApiKeyValue = typeof configuration.apiKey === 'function' + ? await configuration.apiKey(keyParamName) + : await configuration.apiKey; + object[keyParamName] = localVarApiKeyValue; + } +} + +/** + * + * @export + */ +export const setBasicAuthToObject = function (object: any, configuration?: Configuration) { + if (configuration && (configuration.username || configuration.password)) { + object["auth"] = { username: configuration.username, password: configuration.password }; + } +} + +/** + * + * @export + */ +export const setBearerAuthToObject = async function (object: any, configuration?: Configuration) { + if (configuration && configuration.accessToken) { + const accessToken = typeof configuration.accessToken === 'function' + ? await configuration.accessToken() + : await configuration.accessToken; + object["Authorization"] = "Bearer " + accessToken; + } +} + +/** + * + * @export + */ +export const setOAuthToObject = async function (object: any, name: string, scopes: string[], configuration?: Configuration) { + if (configuration && configuration.accessToken) { + const localVarAccessTokenValue = typeof configuration.accessToken === 'function' + ? await configuration.accessToken(name, scopes) + : await configuration.accessToken; + object["Authorization"] = "Bearer " + localVarAccessTokenValue; + } +} + +function setFlattenedQueryParams(urlSearchParams: URLSearchParams, parameter: any, key: string = ""): void { + if (typeof parameter === "object") { + if (Array.isArray(parameter)) { + (parameter as any[]).forEach(item => setFlattenedQueryParams(urlSearchParams, item, key)); + } + else { + Object.keys(parameter).forEach(currentKey => + setFlattenedQueryParams(urlSearchParams, parameter[currentKey], `${key}${key !== '' ? '.' : ''}${currentKey}`) + ); + } + } + else { + if (urlSearchParams.has(key)) { + urlSearchParams.append(key, parameter); + } + else { + urlSearchParams.set(key, parameter); + } + } +} + +/** + * + * @export + */ +export const setSearchParams = function (url: URL, ...objects: any[]) { + const searchParams = new URLSearchParams(url.search); + setFlattenedQueryParams(searchParams, objects); + url.search = searchParams.toString(); +} + +/** + * + * @export + */ +export const serializeDataIfNeeded = function (value: any, requestOptions: any, configuration?: Configuration) { + const nonString = typeof value !== 'string'; + const needsSerialization = nonString && configuration && configuration.isJsonMime + ? configuration.isJsonMime(requestOptions.headers['Content-Type']) + : nonString; + return needsSerialization + ? JSON.stringify(value !== undefined ? value : {}) + : (value || ""); +} + +/** + * + * @export + */ +export const toPathString = function (url: URL) { + return url.pathname + url.search + url.hash +} + +/** + * + * @export + */ +export const createRequestFunction = function (axiosArgs: RequestArgs, globalAxios: AxiosInstance, BASE_PATH: string, configuration?: Configuration) { + return >(axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { + const axiosRequestArgs = {...axiosArgs.options, url: (configuration?.basePath || basePath) + axiosArgs.url}; + return axios.request(axiosRequestArgs); + }; +} diff --git a/desktop/electron/main/generated/http-client/configuration.ts b/desktop/electron/main/generated/http-client/configuration.ts new file mode 100644 index 00000000..cbd7fe1c --- /dev/null +++ b/desktop/electron/main/generated/http-client/configuration.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface ConfigurationParameters { + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + username?: string; + password?: string; + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + basePath?: string; + baseOptions?: any; + formDataCtor?: new () => any; +} + +export class Configuration { + /** + * parameter for apiKey security + * @param name security name + * @memberof Configuration + */ + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + username?: string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + password?: string; + /** + * parameter for oauth2 security + * @param name security name + * @param scopes oauth2 scope + * @memberof Configuration + */ + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + /** + * override base path + * + * @type {string} + * @memberof Configuration + */ + basePath?: string; + /** + * base options for axios calls + * + * @type {any} + * @memberof Configuration + */ + baseOptions?: any; + /** + * The FormData constructor that will be used to create multipart form data + * requests. You can inject this here so that execution environments that + * do not support the FormData class can still run the generated client. + * + * @type {new () => FormData} + */ + formDataCtor?: new () => any; + + constructor(param: ConfigurationParameters = {}) { + this.apiKey = param.apiKey; + this.username = param.username; + this.password = param.password; + this.accessToken = param.accessToken; + this.basePath = param.basePath; + this.baseOptions = param.baseOptions; + this.formDataCtor = param.formDataCtor; + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + public isJsonMime(mime: string): boolean { + const jsonMime: RegExp = new RegExp('^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', 'i'); + return mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json'); + } +} diff --git a/desktop/electron/main/generated/http-client/git_push.sh b/desktop/electron/main/generated/http-client/git_push.sh new file mode 100644 index 00000000..f53a75d4 --- /dev/null +++ b/desktop/electron/main/generated/http-client/git_push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=$(git remote) +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' diff --git a/desktop/electron/main/generated/http-client/index.ts b/desktop/electron/main/generated/http-client/index.ts new file mode 100644 index 00000000..abe3f3be --- /dev/null +++ b/desktop/electron/main/generated/http-client/index.ts @@ -0,0 +1,18 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Smart Pointer Internal API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export * from "./api"; +export * from "./configuration"; + diff --git a/desktop/electron/main/link.ts b/desktop/electron/main/link.ts new file mode 100644 index 00000000..2b98f303 --- /dev/null +++ b/desktop/electron/main/link.ts @@ -0,0 +1,33 @@ +import { BrowserWindow } from "electron"; + +import type { AppState } from "./AppState"; +import { loadWindow } from "./window"; + +let inviteLinkWindow: BrowserWindow | null = null; + +export const showInviteLinkWindow = async (appState: AppState) => { + if (appState.state.name !== "CREATED") { + throw new Error("んなんしとんねん"); + } + + inviteLinkWindow = new BrowserWindow({ + width: 600, + height: 400, + title: "招待リンク - スマートポインター", + show: false, + }); + + await loadWindow(inviteLinkWindow, "link.html", { + roomId: appState.state.room.id, + passcode: appState.state.room.passcode, + }); + + inviteLinkWindow.show(); +}; + +export const toggleInviteLinkWindowDevTools = () => { + if (inviteLinkWindow === null) { + return; + } + inviteLinkWindow.webContents.toggleDevTools(); +}; diff --git a/desktop/electron/main/menu/template.ts b/desktop/electron/main/menu/template.ts new file mode 100644 index 00000000..d6f22656 --- /dev/null +++ b/desktop/electron/main/menu/template.ts @@ -0,0 +1,78 @@ +import type { MenuItemConstructorOptions } from "electron"; + +import type AppState from "../AppState"; +// import { toggleInviteLinkWindowDevTools } from "../link"; +// import { toggleOverlayWindowDevTools } from "../pointer"; + +const renderDefaultMenuTemplate = ({ + appState, + handleClickCreateRoom, +}: { + appState: AppState; + handleClickCreateRoom: () => void; +}): MenuItemConstructorOptions[] => [ + { + label: "ルームを作成", + accelerator: "CmdOrCtrl+N", + enabled: appState.state.name !== "CREATING", + click: handleClickCreateRoom, + }, +]; + +const renderCreatedMenuTemplate = ({ + appState, + handleClickShowInviteLink, +}: { + appState: AppState; + handleClickShowInviteLink: () => void; +}): MenuItemConstructorOptions[] => [ + { + label: "参加者一覧", + accelerator: "CmdOrCtrl+L", + // TODO: チェックリストに変更する + submenu: + Array.from(appState.state.users?.values() ?? []).map((user) => ({ + label: user.name, + })) ?? [], + }, + { + label: "招待リンクを表示", + accelerator: "CmdOrCtrl+S", + click: handleClickShowInviteLink, + }, +]; + +export const renderMenuTemplate = ({ + appState, + handleClickCreateRoom, + handleClickShowInviteLink, +}: { + appState: AppState; + handleClickCreateRoom: () => void; + handleClickShowInviteLink: () => void; +}): MenuItemConstructorOptions[] => [ + ...(appState.state.name === "CREATED" + ? renderCreatedMenuTemplate({ appState, handleClickShowInviteLink }) + : renderDefaultMenuTemplate({ appState, handleClickCreateRoom })), + { type: "separator" }, + + // { + // label: "開発者ツールの表示切り替え", + // submenu: [ + // { + // label: "オーバレイ", + // click: toggleOverlayWindowDevTools, + // }, + // { + // label: "招待リンク", + // click: toggleInviteLinkWindowDevTools, + // }, + // ], + // }, + { type: "separator" }, + { + role: "quit", + label: "アプリを終了", + accelerator: "Cmd+Q", + }, +]; diff --git a/desktop/electron/main/menu/tray.ts b/desktop/electron/main/menu/tray.ts new file mode 100644 index 00000000..22f71e6f --- /dev/null +++ b/desktop/electron/main/menu/tray.ts @@ -0,0 +1,30 @@ +import { app, Menu, Tray } from "electron"; +import { join } from "path"; + +import { publicPath } from "../path"; + +import { renderMenuTemplate } from "./template"; + +export const createTray = ({ + appState, + ...menuTemplateParam +}: Parameters[0]) => { + const iconPath = app.isPackaged + ? join(process.resourcesPath!, "public", "assets", "menu-bar-icon.png") + : join(publicPath, "assets", "menu-bar-icon.png"); + const tray = new Tray(iconPath); + tray.setToolTip("スマートポインター"); + + const contextMenu = Menu.buildFromTemplate( + renderMenuTemplate({ ...menuTemplateParam, appState }) + ); + tray.setContextMenu(contextMenu); + + appState.subscribe(() => { + tray.setContextMenu( + Menu.buildFromTemplate( + renderMenuTemplate({ ...menuTemplateParam, appState }) + ) + ); + }); +}; diff --git a/desktop/electron/main/pagination.ts b/desktop/electron/main/pagination.ts new file mode 100644 index 00000000..974840e5 --- /dev/null +++ b/desktop/electron/main/pagination.ts @@ -0,0 +1,11 @@ +import { keyboard, Key } from "@nut-tree/nut-js"; + +export const goNext = async () => { + await keyboard.type(Key.Right); + console.log("goNext"); +}; + +export const goPrevious = async () => { + await keyboard.type(Key.Left); + console.log("goPrevious"); +}; diff --git a/desktop/electron/main/path.ts b/desktop/electron/main/path.ts new file mode 100644 index 00000000..c1c25b4d --- /dev/null +++ b/desktop/electron/main/path.ts @@ -0,0 +1,8 @@ +import { app } from "electron"; +import { join } from "path"; + +export const distElectronPath = join(__dirname, "..", ".."); +export const distPath = join(distElectronPath, "../dist"); +export const publicPath = app.isPackaged + ? distPath + : join(distElectronPath, "../public"); diff --git a/desktop/electron/main/pointer.ts b/desktop/electron/main/pointer.ts new file mode 100644 index 00000000..e032f00c --- /dev/null +++ b/desktop/electron/main/pointer.ts @@ -0,0 +1,61 @@ +import { BrowserWindow, screen } from "electron"; + +import type { AppState } from "./AppState"; +import type { Coordinate } from "./types"; +import { loadWindow } from "./window"; + +let overlayWindow: BrowserWindow | null = null; + +export const showOverlayWindow = async (appState: AppState) => { + if (appState.state.name !== "CREATED") { + throw new Error("なにしとんねん"); + } + + const { width, height } = screen.getPrimaryDisplay().workAreaSize; + + if (overlayWindow === null) { + overlayWindow = new BrowserWindow({ + width, + height, + title: "スマートポインター", + show: false, + frame: false, + transparent: true, + focusable: false, + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + }, + }); + } + overlayWindow.setAlwaysOnTop(true, "screen-saver"); + overlayWindow.setVisibleOnAllWorkspaces(true, { + visibleOnFullScreen: true, + }); + overlayWindow.setIgnoreMouseEvents(true); + + loadWindow(overlayWindow, "overlay.html"); + + overlayWindow.show(); +}; + +export const toggleOverlayWindowDevTools = () => { + if (overlayWindow === null) { + return; + } + overlayWindow.webContents.toggleDevTools(); +}; + +export const sendPointerPosition = (position: Coordinate) => { + if (overlayWindow === null) { + return; + } + overlayWindow.webContents.send("update-pointer-position", position); +}; + +export const sendHidePointer = () => { + if (overlayWindow === null) { + return; + } + overlayWindow.webContents.send("hide-pointer"); +}; diff --git a/desktop/electron/main/room.ts b/desktop/electron/main/room.ts new file mode 100644 index 00000000..727da6e6 --- /dev/null +++ b/desktop/electron/main/room.ts @@ -0,0 +1,30 @@ +import { roomApi } from "./api"; +import type AppState from "./AppState"; +import { showOverlayWindow } from "./pointer"; + +export const createRoom = async (appState: AppState): Promise => { + if (appState.state.name !== "READY") { + throw new Error("なんしとんねん"); + } + + appState.setState({ + name: "CREATING", + }); + + try { + const { + data: { roomId, passcode }, + } = await roomApi.createRoom(); + + appState.setState({ + name: "CREATED", + room: { id: roomId, passcode }, + users: new Map(), + pointers: new Map(), + }); + + await showOverlayWindow(appState); + } catch (e) { + console.error(e); + } +}; diff --git a/desktop/electron/main/stomp.ts b/desktop/electron/main/stomp.ts new file mode 100644 index 00000000..a1e0dd2b --- /dev/null +++ b/desktop/electron/main/stomp.ts @@ -0,0 +1,12 @@ +import { Client } from "@stomp/stompjs"; +import SockJS from "sockjs-client"; + +const brokerURL = + process.env["NODE_ENV"] === "development" + ? "http://localhost:8080/ws" + : "https://smartpointer.abelab.dev/ws"; + +export const stompClient = new Client({ + webSocketFactory: () => new SockJS(brokerURL), + // debug: console.log, +}); diff --git a/desktop/electron/main/types.ts b/desktop/electron/main/types.ts new file mode 100644 index 00000000..32f77e1e --- /dev/null +++ b/desktop/electron/main/types.ts @@ -0,0 +1,12 @@ +export type Room = { + id: string; + passcode: string; +}; +export type User = { + id: string; + name: string; +}; +export type Coordinate = { + x: number; + y: number; +}; diff --git a/desktop/electron/main/window.ts b/desktop/electron/main/window.ts new file mode 100644 index 00000000..ca110eab --- /dev/null +++ b/desktop/electron/main/window.ts @@ -0,0 +1,26 @@ +import { app, BrowserWindow } from "electron"; + +import { distPath } from "./path"; + +const getURL = (fileName: string, params?: { [K in string]: string }) => { + const url = new URL( + fileName, + app.isPackaged ? `file://${distPath}` : "http://localhost:7777" + ); + + if (params !== undefined) { + Object.entries(params).forEach(([key, value]) => { + url.searchParams.append(key, value); + }); + } + + return url.toString(); +}; + +export const loadWindow = async ( + window: BrowserWindow, + fileName: string, + params?: { [K in string]: string } +) => { + await window.loadURL(getURL(fileName, params)); +}; diff --git a/desktop/electron/preload/overlay.ts b/desktop/electron/preload/overlay.ts new file mode 100644 index 00000000..197985f8 --- /dev/null +++ b/desktop/electron/preload/overlay.ts @@ -0,0 +1,23 @@ +import { contextBridge, ipcRenderer } from "electron"; + +// import type { Coordinate } from "../main/types"; + +console.log("preload"); +export type ElectronApi = { + onUpdateRotation: ( + callback: (position: { x: number; y: number }) => void + ) => void; + hidePointer: (callback: () => void) => void; +}; + +const electronApi: ElectronApi = { + onUpdateRotation: (callback: (position: { x: number; y: number }) => void) => + ipcRenderer.on("update-pointer-position", (_, data) => callback(data)), + + hidePointer: (callback: () => void) => + ipcRenderer.on("hide-pointer", callback), +}; + +contextBridge.exposeInMainWorld("electronApi", electronApi); + +console.log("preload"); diff --git a/desktop/link.html b/desktop/link.html new file mode 100644 index 00000000..2634b259 --- /dev/null +++ b/desktop/link.html @@ -0,0 +1,16 @@ + + + + + + + 招待リンク - スマートポインター + + +
+ + + diff --git a/desktop/openapitools.json b/desktop/openapitools.json new file mode 100644 index 00000000..27e6d53b --- /dev/null +++ b/desktop/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "6.2.0" + } +} diff --git a/desktop/overlay.html b/desktop/overlay.html new file mode 100644 index 00000000..3b88f845 --- /dev/null +++ b/desktop/overlay.html @@ -0,0 +1,16 @@ + + + + + + + overlay - スマートポインター + + +
+ + + diff --git a/desktop/package.json b/desktop/package.json new file mode 100644 index 00000000..a4235eca --- /dev/null +++ b/desktop/package.json @@ -0,0 +1,82 @@ +{ + "private": true, + "version": "1.0.0", + "main": "dist-electron/electron/main/app.js", + "name": "smartpointer", + "productName": "smartpointer", + "description": "手元のスマホをリモコン化する、共同プレゼンテーション支援ツール", + "scripts": { + "dev": "cross-env NODE_ENV=prod vite", + "build": "tsc && vite build", + "codegen": "openapi-generator-cli generate -g typescript-axios -i http://localhost:8080/v3/api-docs/Public%20API -o ./electron/main/generated/http-client", + "lint": "eslint src electron", + "format": "yarn check:format --write", + "code-check": "run-p lint check:*", + "check:format": "prettier src electron link.html --check", + "check:type": "tsc" + }, + "build": { + "extraResources": [ + "public/assets/**/*" + ], + "productName": "smartpointer", + "appId": "dev.abelab.smartpointer", + "mac": { + "artifactName": "${productName}-${version}-osx.${ext}", + "category": "public.app-category.productivity", + "target": [ + "dmg", + "zip" + ] + } + }, + "dependencies": { + "@chakra-ui/react": "2.3.6", + "@emotion/react": "11.10.4", + "@emotion/styled": "11.10.4", + "@heroicons/react": "^2.0.12", + "@nut-tree/nut-js": "^2.3.0", + "@react-hook/window-size": "3.1.1", + "@stomp/stompjs": "^6.1.2", + "axios": "^1.1.3", + "framer-motion": "7.6.1", + "qrcode": "^1.5.1", + "react": "18.2.0", + "react-dom": "18.2.0", + "sockjs-client": "^1.6.1" + }, + "devDependencies": { + "@openapitools/openapi-generator-cli": "2.5.2", + "@tsconfig/strictest": "^1.0.2", + "@types/qrcode": "^1.5.0", + "@types/react": "18.0.21", + "@types/react-dom": "18.0.6", + "@types/sockjs-client": "^1.5.1", + "@types/ws": "^8.5.3", + "@typescript-eslint/eslint-plugin": "5.40.1", + "@typescript-eslint/parser": "5.40.1", + "@vitejs/plugin-react": "2.1.0", + "cross-env": "^7.0.3", + "electron": "^21.1.1", + "electron-builder": "^23.3.3", + "electron-reload": "^2.0.0-alpha.1", + "eslint": "8.25.0", + "eslint-config-prettier": "8.5.0", + "eslint-import-resolver-typescript": "3.5.2", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-jsx-a11y": "6.6.1", + "eslint-plugin-react": "7.31.10", + "eslint-plugin-react-hooks": "4.6.0", + "npm-run-all": "4.1.5", + "prettier": "2.7.1", + "typescript": "4.8.4", + "vite": "3.1.8", + "vite-electron-plugin": "^0.4.6", + "vite-plugin-electron-renderer": "^0.10.1" + }, + "debug": { + "env": { + "VITE_DEV_SERVER_URL": "http://127.0.0.1:7777" + } + } +} diff --git a/desktop/public/assets/menu-bar-icon.ico b/desktop/public/assets/menu-bar-icon.ico new file mode 100644 index 00000000..28a6cd8f Binary files /dev/null and b/desktop/public/assets/menu-bar-icon.ico differ diff --git a/desktop/public/assets/menu-bar-icon.png b/desktop/public/assets/menu-bar-icon.png new file mode 100644 index 00000000..25c7f368 Binary files /dev/null and b/desktop/public/assets/menu-bar-icon.png differ diff --git a/desktop/src/link/App.tsx b/desktop/src/link/App.tsx new file mode 100644 index 00000000..230d5bd4 --- /dev/null +++ b/desktop/src/link/App.tsx @@ -0,0 +1,18 @@ +import { FC, useState } from "react"; + +import { Confirmation } from "./Confirmation"; +import { InviteLink } from "./InviteLink"; + +export const App: FC = () => { + const [showInviteLink, setShowInviteLink] = useState(false); + + return ( + <> + {showInviteLink ? ( + + ) : ( + setShowInviteLink(true)} /> + )} + + ); +}; diff --git a/desktop/src/link/Confirmation.tsx b/desktop/src/link/Confirmation.tsx new file mode 100644 index 00000000..a366bc8d --- /dev/null +++ b/desktop/src/link/Confirmation.tsx @@ -0,0 +1,18 @@ +import { Button, Center, Container } from "@chakra-ui/react"; +import type { FC } from "react"; + +type Props = { + onConfirm: () => void; +}; + +export const Confirmation: FC = ({ onConfirm }) => { + return ( + +
+ +
+
+ ); +}; diff --git a/desktop/src/link/InviteLink/Clipboard.tsx b/desktop/src/link/InviteLink/Clipboard.tsx new file mode 100644 index 00000000..7b3b2599 --- /dev/null +++ b/desktop/src/link/InviteLink/Clipboard.tsx @@ -0,0 +1,32 @@ +import { Button, Flex, Input, Text, useClipboard } from "@chakra-ui/react"; +import type { FC } from "react"; + +import { ClipboardIcon } from "./ClipboardIcon"; + +type Props = { + title: string; + text: string; +}; + +export const Clipboard: FC = ({ title, text }) => { + const { hasCopied, onCopy } = useClipboard(text); + + return ( + + + {title} + + + + + + + ); +}; diff --git a/desktop/src/link/InviteLink/ClipboardIcon.tsx b/desktop/src/link/InviteLink/ClipboardIcon.tsx new file mode 100644 index 00000000..c9c596b8 --- /dev/null +++ b/desktop/src/link/InviteLink/ClipboardIcon.tsx @@ -0,0 +1,18 @@ +import { Icon } from "@chakra-ui/react"; + +export const ClipboardIcon = () => ( + + + +); diff --git a/desktop/src/link/InviteLink/index.tsx b/desktop/src/link/InviteLink/index.tsx new file mode 100644 index 00000000..a282143c --- /dev/null +++ b/desktop/src/link/InviteLink/index.tsx @@ -0,0 +1,59 @@ +import { Center, VStack } from "@chakra-ui/react"; +import { toCanvas } from "qrcode"; +import { useEffect, useRef, type FC } from "react"; + +import { Clipboard } from "./Clipboard"; + +const getQueryParam = (queryParamKey: string) => { + const searchParams = new URLSearchParams(window.location.search); + const param = searchParams.get(queryParamKey); + if (param === null) { + throw new Error(`query param key ${queryParamKey} is null`); + } + return param; +}; + +const roomId: string = getQueryParam("roomId"); +const passcode: string = getQueryParam("passcode"); + +const getInviteLink = (roomId: string, passcode: string) => { + const inviteLinkOrigin = "https://smartpointer.abelab.dev/"; + const url = new URL(inviteLinkOrigin); + url.searchParams.append("roomId", roomId); + url.searchParams.set("passcode", passcode); + return url.toString(); +}; + +const inviteLink: string = getInviteLink(roomId, passcode); + +export const InviteLink: FC = () => { + const canvasRef = useRef(null); + + useEffect(() => { + const element = canvasRef.current; + if (element === null) { + throw new Error("canvas element is not found"); + } + toCanvas(element, inviteLink, { width: 160 }); + }, [canvasRef]); + + return ( + +
+ +
+ + + + + + +
+ ); +}; diff --git a/desktop/src/link/main.tsx b/desktop/src/link/main.tsx new file mode 100644 index 00000000..5bea7100 --- /dev/null +++ b/desktop/src/link/main.tsx @@ -0,0 +1,16 @@ +import { ChakraProvider } from "@chakra-ui/react"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import { App } from "./App"; +import { theme } from "./theme"; + +// HTML で定義されているので disable +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +createRoot(document.getElementById("root")!).render( + + + + + +); diff --git a/desktop/src/link/theme.ts b/desktop/src/link/theme.ts new file mode 100644 index 00000000..d2643eb2 --- /dev/null +++ b/desktop/src/link/theme.ts @@ -0,0 +1,14 @@ +import { extendTheme } from "@chakra-ui/react"; + +const styles = { + global: { + "html, body, #root": { + w: "100vw", + h: "100vh", + }, + }, +}; + +export const theme = extendTheme({ + styles, +}); diff --git a/desktop/src/overlay/App.tsx b/desktop/src/overlay/App.tsx new file mode 100644 index 00000000..849cbab9 --- /dev/null +++ b/desktop/src/overlay/App.tsx @@ -0,0 +1,45 @@ +import { ipcRenderer } from "electron"; +import { useEffect, useState } from "react"; + +import { Pointer } from "./Pointer"; +import type { Coordinate } from "./types"; + +export const App = () => { + const [position, setPosition] = useState(null); + + const [showingPointer, setShowingPointer] = useState(false); + + const [cnt, setCnt] = useState(0); + + useEffect(() => { + ipcRenderer.on( + "update-pointer-position", + (_, position: Coordinate | null) => { + setPosition(position); + if (position === null) { + setShowingPointer(false); + setCnt(0); + } else { + setShowingPointer(true); + setCnt((cnt) => cnt + 1); + } + } + ); + + ipcRenderer.on("hide-pointer", () => { + setShowingPointer(false); + setCnt(0); + setPosition(null); + }); + }, []); + + console.log(position); + + if (position === null) { + return null; + } + + return ( + + ); +}; diff --git a/desktop/src/overlay/Pointer.tsx b/desktop/src/overlay/Pointer.tsx new file mode 100644 index 00000000..2de1102f --- /dev/null +++ b/desktop/src/overlay/Pointer.tsx @@ -0,0 +1,47 @@ +import { useWindowSize } from "@react-hook/window-size"; +import type { FC } from "react"; + +import type { Coordinate } from "./types"; + +type Props = { + position: Coordinate; + showingPointer: boolean; + cnt: number; +}; +export const Pointer: FC = ({ position, showingPointer, cnt }) => { + const [width, height] = useWindowSize(); + const radius = 100; + + console.log(showingPointer); + + // FIXME: クロップしたエリアが暗くなる + // TODO: 残像が残るので、初期描画位置を画面外に設定してごまかしてるので修正する + return ( + + 5 ? width / 2 : 0) + position.x * width} ${ + (cnt > 5 ? height / 2 : 0) + position.y * width + } + a ${radius} ${radius} 0 1 1 1 0 + Z + `} + fill="rgba(0, 0, 0, 0.5)" + /> + + ); +}; diff --git a/desktop/src/overlay/main.tsx b/desktop/src/overlay/main.tsx new file mode 100644 index 00000000..5bea7100 --- /dev/null +++ b/desktop/src/overlay/main.tsx @@ -0,0 +1,16 @@ +import { ChakraProvider } from "@chakra-ui/react"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import { App } from "./App"; +import { theme } from "./theme"; + +// HTML で定義されているので disable +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +createRoot(document.getElementById("root")!).render( + + + + + +); diff --git a/desktop/src/overlay/theme.ts b/desktop/src/overlay/theme.ts new file mode 100644 index 00000000..925ad631 --- /dev/null +++ b/desktop/src/overlay/theme.ts @@ -0,0 +1,12 @@ +import { extendTheme } from "@chakra-ui/react"; + +export const theme = extendTheme({ + styles: { + global: { + body: { + bg: "transparent", + color: "white", + }, + }, + }, +}); diff --git a/desktop/src/overlay/types.ts b/desktop/src/overlay/types.ts new file mode 100644 index 00000000..4d11f39b --- /dev/null +++ b/desktop/src/overlay/types.ts @@ -0,0 +1,6 @@ +export type Coordinate = { x: number; y: number }; + +export type ElectronApi = { + onUpdateRotation: (callback: (position: Coordinate) => void) => void; + hidePointer: (callback: () => void) => void; +}; diff --git a/desktop/src/vite-env.d.ts b/desktop/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/desktop/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json new file mode 100644 index 00000000..8191edd7 --- /dev/null +++ b/desktop/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "@tsconfig/strictest/tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowSyntheticDefaultImports": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/desktop/tsconfig.node.json b/desktop/tsconfig.node.json new file mode 100644 index 00000000..e979a775 --- /dev/null +++ b/desktop/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/strictest/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "baseUrl": ".", + "composite": true, + "module": "CommonJS", + "moduleResolution": "node", + "types": ["node"] + }, + "include": ["package.json", "electron"] +} diff --git a/desktop/vite.config.ts b/desktop/vite.config.ts new file mode 100644 index 00000000..a86acbb7 --- /dev/null +++ b/desktop/vite.config.ts @@ -0,0 +1,46 @@ +import react from "@vitejs/plugin-react"; +import { rmSync } from "fs"; +import path from "path"; +import { defineConfig, normalizePath } from "vite"; +import electron from "vite-electron-plugin"; +import renderer from "vite-plugin-electron-renderer"; + +rmSync(path.join(__dirname, "dist-electron"), { + recursive: true, + force: true, +}); + +export default defineConfig(({ mode }) => ({ + server: { + port: 7777, + }, + resolve: { + alias: { + "@": normalizePath(path.join(__dirname, "src")), + }, + }, + build: { + rollupOptions: { + input: { + link: normalizePath(path.join(__dirname, "link.html")), + // overlay: path.join(__dirname, "overlay.html"), + }, + }, + }, + plugins: [ + react(), + electron({ + include: ["electron", "preload"], + plugins: [], + }), + renderer({ + nodeIntegration: true, + }), + ], + esbuild: + mode === "production" + ? { + drop: ["console", "debugger"], + } + : {}, +})); diff --git a/desktop/yarn.lock b/desktop/yarn.lock new file mode 100644 index 00000000..af3a2b8f --- /dev/null +++ b/desktop/yarn.lock @@ -0,0 +1,7127 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.19.3": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" + integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== + +"@babel/core@^7.18.13": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" + integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.6" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helpers" "^7.19.4" + "@babel/parser" "^7.19.6" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.6.tgz#9e481a3fe9ca6261c972645ae3904ec0f9b34a1d" + integrity sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA== + dependencies: + "@babel/types" "^7.19.4" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-compilation-targets@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" + integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== + dependencies: + "@babel/compat-data" "^7.19.3" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" + integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" + +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" + integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== + +"@babel/helper-simple-access@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" + integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== + dependencies: + "@babel/types" "^7.19.4" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" + integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.4" + "@babel/types" "^7.19.4" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.18.10", "@babel/parser@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" + integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== + +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx-self@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" + integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-source@^7.18.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" + integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.19.0" + +"@babel/runtime-corejs3@^7.10.2": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz#778471a71d915cf3b955a9201bebabfe924f872a" + integrity sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA== + dependencies: + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.7.2": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" + integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" + integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.19.6" + "@babel/types" "^7.19.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" + integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@chakra-ui/accordion@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-2.1.2.tgz#f9d384b80f68a92689fa7ad4e43bd8944e6945c6" + integrity sha512-Jf7A6I0eIGk34zO5TiTW8orJOFQb5A/D1ekNYbaukNccoUPKJg/xdQ/b00oIR6LT93nJxggkoP/vszfmmTHuFg== + dependencies: + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/transition" "2.0.11" + +"@chakra-ui/alert@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/alert/-/alert-2.0.11.tgz#d792b0684ae7810befa3874af5bdd4aa115513a2" + integrity sha512-n40KHU3j1H6EbIdgptjEad92V7Fpv7YD++ZBjy2g1h4w9ay9nw4kGHib3gaIkBupLf52CfLqySEc8w0taoIlXQ== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/spinner" "2.0.10" + +"@chakra-ui/anatomy@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/anatomy/-/anatomy-2.0.7.tgz#33e60c7c4d6e5f949f6f8308249dc571f84ead1e" + integrity sha512-vzcB2gcsGCxhrKbldQQV6LnBPys4eSSsH2UA2mLsT+J3WlXw0aodZw0eE/nH7yLxe4zaQ4Gnc0KjkFW4EWNKSg== + +"@chakra-ui/avatar@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/avatar/-/avatar-2.2.0.tgz#58b5e650f7e4b3ab229f50e6a102c54b6eb4b23a" + integrity sha512-mpAkfr/JG+BNBw2WvU55CSRFYKeFBUyAQAu3YulznLzi2U3e7k3IA0J8ofbrDYlSH/9KqkDuuSrxqGZgct+Nug== + dependencies: + "@chakra-ui/image" "2.0.11" + "@chakra-ui/react-children-utils" "2.0.3" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/breadcrumb@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/breadcrumb/-/breadcrumb-2.1.0.tgz#530ded99f931cfcb9f4bd4d951bc82b0a4e102ac" + integrity sha512-khBR579SLDEo6Wuo3tETRY6m0yJD/WCvSR7Res2g1B6OJgc9OQGM7yIMu4OdLUTwfXsCnlHTDoSQPUxFOVAMIQ== + dependencies: + "@chakra-ui/react-children-utils" "2.0.3" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/breakpoint-utils@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.4.tgz#6231eff8b20f4e3cbb4eb7c86d05c927679d905b" + integrity sha512-SUUEYnA/FCIKYDHMuEXcnBMwet+6RAAjQ+CqGD1hlwKPTfh7EK9fS8FoVAJa9KpRKAc/AawzPkgwvorzPj8NSg== + +"@chakra-ui/button@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/button/-/button-2.0.11.tgz#98e0aa1e35ea7e193bb50f9a4b5d0ea23202ace8" + integrity sha512-J6iMRITqxTxa0JexHUY9c7BXUrTZtSkl3jZ2hxiFybB4MQL8J2wZ24O846B6M+WTYqy7XVuHRuVURnH4czWesw== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/spinner" "2.0.10" + +"@chakra-ui/checkbox@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/checkbox/-/checkbox-2.2.2.tgz#494d7090ac11a0a43d05b7849aff6085f7a91045" + integrity sha512-Y6Zbkkk5VNoe0RzqU6F+rKlFVPlubz1KIgYcb7CCNHGOM97dLtRm78eAvJ+7Xmpitr+7zZ4hJLLjfAz+e1X7rA== + dependencies: + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/visually-hidden" "2.0.11" + "@zag-js/focus-visible" "0.1.0" + +"@chakra-ui/clickable@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/clickable/-/clickable-2.0.10.tgz#e89b7b3eaf9364753f6205e36fd5128b26a617d8" + integrity sha512-G6JdR6yAMlXpfjOJ70W2FL7aUwNuomiMFtkneeTpk7Q42bJ5iGHfYlbZEx5nJd8iB+UluXVM4xlhMv2MyytjGw== + dependencies: + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/close-button@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/close-button/-/close-button-2.0.11.tgz#8b0679da42738229014d3807885d05fac0fdf448" + integrity sha512-9WF/nwwK9BldS89WQ5PtXK2nFS4r8QOgKls2BOwXfE+rGmOUZtOsu8ne/drXRjgkiBRETR6CxdyUjm7EPzXllw== + dependencies: + "@chakra-ui/icon" "3.0.11" + +"@chakra-ui/color-mode@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/color-mode/-/color-mode-2.1.9.tgz#d3a6f9ba9eee15d9e14cc96484e25d44cef1dbc1" + integrity sha512-0kx0I+AQon8oS23/X+qMtnhsv/1BUulyJvU56p3Uh8CRaBfgJ7Ly9CerShoUL+5kadu6hN1M9oty4cugaCwv2w== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/control-box@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/control-box/-/control-box-2.0.10.tgz#e8a849c9f0fa085da78ee15dda7e13e1734b983d" + integrity sha512-sHmZanFLEv4IDATl19ZTxq8Bi8PtjfvnsN6xF4k7JGSYUnk1YXUf1coyW7WKdcsczOASrMikfsLc3iEVAzx4Ng== + +"@chakra-ui/counter@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/counter/-/counter-2.0.10.tgz#861f00db021235892dfe0407e739a259f1c233b2" + integrity sha512-MZK8UKUZp4nFMd+GlV/cq0NIARS7UdlubTuCx+wockw9j2JI5OHzsyK0XiWuJiq5psegSTzpbtT99QfAUm3Yiw== + dependencies: + "@chakra-ui/number-utils" "2.0.4" + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/css-reset@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/css-reset/-/css-reset-2.0.8.tgz#093ce6b166b37f2dd14e63f246635c463a59c106" + integrity sha512-VuDD1rk1pFc+dItk4yUcstyoC9D2B35hatHDBtlPMqTczFAzpbgVJJYgEHANatXGfulM5SdckmYEIJ3Tac1Rtg== + +"@chakra-ui/descendant@3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/descendant/-/descendant-3.0.10.tgz#e54c95270896c451f61b57d31719ee042f4e1827" + integrity sha512-MHH0Qdm0fGllGP2xgx4WOycmrpctyyEdGw6zxcfs2VqZNlrwmjG3Yb9eVY+Q7UmEv5rwAq6qRn7BhQxgSPn3Cg== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/dom-utils@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/dom-utils/-/dom-utils-2.0.3.tgz#8a5498b107d3a42662f3502f7b8965cb73bf6a33" + integrity sha512-aeGlRmTxcv0cvW44DyeZHru1i68ZDQsXpfX2dnG1I1yBlT6GlVx1xYjCULis9mjhgvd2O3NfcYPRTkjNWTDUbA== + +"@chakra-ui/editable@2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@chakra-ui/editable/-/editable-2.0.13.tgz#4e6ff480956ae2dcacf4ba2a15019336486bd613" + integrity sha512-GM3n8t3/TOFFcDOWF/tuKsnqn66isZLsU+FkMRY2o0E8XjLBGjCKuXInPW5SRBqhje7EHC+kwViLE780PfwXbw== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-focus-on-pointer-down" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/event-utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/event-utils/-/event-utils-2.0.5.tgz#23de21e319d1a70863953402d64cb4b0e6ce322f" + integrity sha512-VXoOAIsM0PFKDlhm+EZxkWlUXd5UFTb/LTux3y3A+S9G5fDxLRvpiLWByPUgTFTCDFcgTCF+YnQtdWJB4DLyxg== + +"@chakra-ui/focus-lock@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/focus-lock/-/focus-lock-2.0.12.tgz#11c0301a326249efe269c2dd0f54b11a67a04321" + integrity sha512-NvIP59A11ZNbxXZ3qwxSiQ5npjABkpSbTIjK0uZ9bZm5LMfepRnuuA19VsVlq31/BYV9nHFAy6xzIuG+Qf9xMA== + dependencies: + "@chakra-ui/dom-utils" "2.0.3" + react-focus-lock "^2.9.1" + +"@chakra-ui/form-control@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/form-control/-/form-control-2.0.11.tgz#fbfdddb02d1b5d2c67ffdc721c434ff16693e4bd" + integrity sha512-MVhIe0xY4Zn06IXRXFmS9tCa93snppK1SdUQb1P99Ipo424RrL5ykzLnJ8CAkQrhoVP3sxF7z3eOSzk8/iRfow== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/hooks@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/hooks/-/hooks-2.1.0.tgz#a8df3692e407c2fed8cc551c8ce7f3fcd0ea9864" + integrity sha512-4H6BDITq/YrStW99LXurgPkcz4qHSVy9V/QWXCvt1pCuiDTqNztiW4r508H3ApAOsL9NEbyXcM/zWYD7r5VDjA== + dependencies: + "@chakra-ui/react-utils" "2.0.8" + "@chakra-ui/utils" "2.0.11" + compute-scroll-into-view "1.0.14" + copy-to-clipboard "3.3.1" + +"@chakra-ui/icon@3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/icon/-/icon-3.0.11.tgz#a51dda24bed2f2ed77b4136ada8f22d3249c9870" + integrity sha512-RG4jf/XmBdaxOYI5J5QstEtTCPoVlmrQ/XiWhvN0LTgAnmZIqVwFl3Uw+satArdStHAs0GmJZg/E/soFTWuFmw== + dependencies: + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/image@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-2.0.11.tgz#eb880ecd2fce47f22ef50bbbba66cbb027c0304c" + integrity sha512-S6NqAprPcbHnck/J+2wg06r9SSol62v5A01O8Kke2PnAyjalMcS+6P59lDRO7wvPqsdxq4PPbSTZP6Dww2CvcA== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/input@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/input/-/input-2.0.12.tgz#332db53a831daea4d76e1de6d3b4462fd50ae167" + integrity sha512-lJ5necu+Wt698HdCTC7L/ErA2nNVJAra7+knPe0qMR+AizGEL7LKCV/bdQe7eggjvKsDGD4alJIEczUvm3JVUQ== + dependencies: + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/object-utils" "2.0.4" + "@chakra-ui/react-children-utils" "2.0.3" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/layout@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/layout/-/layout-2.1.9.tgz#3e9cc7b5915e033907367e40fc97d218efa5f777" + integrity sha512-ztsavtirtdtjxdqIkGR6fVcrffHp6hs1twRFO/dK14FGXrX3Nn9mi3J1fr1ITBHJq6y5B3yFEj0LHN2fO8dYyw== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.4" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/object-utils" "2.0.4" + "@chakra-ui/react-children-utils" "2.0.3" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/shared-utils" "2.0.2" + +"@chakra-ui/lazy-utils@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/lazy-utils/-/lazy-utils-2.0.2.tgz#d85f9afc60c2434ba76376fd4b23a7a0a1341e14" + integrity sha512-MTxutBJZvqNNqrrS0722cI7qrnGu0yUQpIebmTxYwI+F3cOnPEKf5Ni+hrA8hKcw4XJhSY4npAPPYu1zJbOV4w== + +"@chakra-ui/live-region@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/live-region/-/live-region-2.0.10.tgz#d33a784c85feed7ba96e2579553ca1d20c965171" + integrity sha512-eQ2ZIreR/plzi/KGszDYTi1TvIyGEBcPiWP52BQOS7xwpzb1vsoR1FgFAIELxAGJvKnMUs+9qVogfyRBX8PdOg== + +"@chakra-ui/media-query@3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/media-query/-/media-query-3.2.7.tgz#ece5b2181136145305bf5e6ec82c696ef1d59a77" + integrity sha512-hbgm6JCe0kYU3PAhxASYYDopFQI26cW9kZnbp+5tRL1fykkVWNMPwoGC8FEZPur9JjXp7aoL6H4Jk7nrxY/XWw== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.4" + "@chakra-ui/react-env" "2.0.10" + +"@chakra-ui/menu@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/menu/-/menu-2.1.2.tgz#bbe39e1efdb408ba8e6616e0ec290417474f9454" + integrity sha512-6Z7ecXjp6BtZ1ExbFggfxsAj1hwtcathXekmCTxHpXOD+BdjAC/13+oLclwXeuBO85aoTmQrQ2ovfTkO31bzRQ== + dependencies: + "@chakra-ui/clickable" "2.0.10" + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/lazy-utils" "2.0.2" + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/react-children-utils" "2.0.3" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-animation-state" "2.0.5" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-disclosure" "2.0.5" + "@chakra-ui/react-use-focus-effect" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-outside-click" "2.0.4" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/transition" "2.0.11" + +"@chakra-ui/modal@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-2.2.2.tgz#bf3ef2673a8641a5c851faceb7811e0c0f323517" + integrity sha512-cCYuqLZO4QqFUI1H+uEqixDk6UiCP3yC+sxkhFTXHIApSG9Z44v5np7BVTd6LKdmAN8pAWcc8Oxf14RvD6LWLw== + dependencies: + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/focus-lock" "2.0.12" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/transition" "2.0.11" + aria-hidden "^1.1.1" + react-remove-scroll "^2.5.4" + +"@chakra-ui/number-input@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/number-input/-/number-input-2.0.12.tgz#90a8408e6abb2d021793888ef2119d01761d7614" + integrity sha512-3owLjl01sCYpTd3xbq//fJo9QJ0Q3PVYSx9JeOzlXnnTW8ws+yHPrqQzPe7G+tO4yOYynWuUT+NJ9oyCeAJIxA== + dependencies: + "@chakra-ui/counter" "2.0.10" + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-event-listener" "2.0.4" + "@chakra-ui/react-use-interval" "2.0.2" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + +"@chakra-ui/number-utils@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/number-utils/-/number-utils-2.0.4.tgz#0331be05956f2c03125c073d35655e261e267cd4" + integrity sha512-MdYd29GboBoKaXY9jhbY0Wl+0NxG1t/fa32ZSIbU6VrfMsZuAMl4NEJsz7Xvhy50fummLdKn5J6HFS7o5iyIgw== + +"@chakra-ui/object-utils@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/object-utils/-/object-utils-2.0.4.tgz#d890ce285103a5e9b993f016a4fb38307aa55ac0" + integrity sha512-sY98L4v2wcjpwRX8GCXqT+WzpL0i5FHVxT1Okxw0360T2tGnZt7toAwpMfIOR3dzkemP9LfXMCyBmWR5Hi2zpQ== + +"@chakra-ui/pin-input@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@chakra-ui/pin-input/-/pin-input-2.0.15.tgz#08e65c5e8468cef6192634a53859169b51c2c4a7" + integrity sha512-Ha8siSZm9gyjHHBK8ejwhKT6+75U12I/hNiYFvl2JHhc+Uh8tdi7+N+9SILO5vqbIv9kb+WGitvZ67I0cHjSfw== + dependencies: + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/react-children-utils" "2.0.3" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/popover@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/popover/-/popover-2.1.1.tgz#1b5e05e334ba5f9bce4bc5bcabfb92563393fc84" + integrity sha512-j09NsesfT+eaYITkITYJXDlRcPoOeQUM80neJZKOBgul2iHkVsEoii8dwS5Ip5ONeu4ane1b6zEOlYvYj2SrkA== + dependencies: + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/lazy-utils" "2.0.2" + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-animation-state" "2.0.5" + "@chakra-ui/react-use-disclosure" "2.0.5" + "@chakra-ui/react-use-focus-effect" "2.0.5" + "@chakra-ui/react-use-focus-on-pointer-down" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/popper@3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/popper/-/popper-3.0.8.tgz#89b6984aee405316974dbb70ba451f85832bf44e" + integrity sha512-246eUwuCRsLpTPxn5T8D8T9/6ODqmmz6pRRJAjGnLlUB0gNHgjisBn0UDBic5Gbxcg0sqKvxOMY3uurbW5lXTA== + dependencies: + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@popperjs/core" "^2.9.3" + +"@chakra-ui/portal@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-2.0.10.tgz#8ac21131cb0666a0bf6565468b3f7e799ef3bc8d" + integrity sha512-VRYvVAggIuqIZ3IQ6XZ1b5ujjjOUgPk9PPdc9jssUngZa7RG+5NXNhgoM8a5TsXv6aPEolBOlDNWuxzRQ4RSSg== + dependencies: + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/progress@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/progress/-/progress-2.0.12.tgz#7ce57fe2822d1741c26e82960ca02c667a265a05" + integrity sha512-9qtZimZosTliI7siAZkLeCVdCpXCTxmSETCudHcCUsC+FtcFacmA65+We8qij1nOIqmsbm+NYU6PP89TU2n4Hg== + dependencies: + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/provider@2.0.20": + version "2.0.20" + resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-2.0.20.tgz#2f3f73f6142f4d2b2a5a8ad6dbd777a3fc4390ce" + integrity sha512-mNNfsgm05G4x1VzvHVR9+PNEiuxNnn9xUKDuEwoaO7+IHCMzCRMtPbSJjwmv0xvHUGB9+JChjPpZI5RuHQziJQ== + dependencies: + "@chakra-ui/css-reset" "2.0.8" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-env" "2.0.10" + "@chakra-ui/system" "2.3.0" + "@chakra-ui/utils" "2.0.11" + +"@chakra-ui/radio@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/radio/-/radio-2.0.12.tgz#d89eb463df0247a0e634cff1fb9ca755bcbab825" + integrity sha512-871hqAGQaufxyUzPP3aautPBIRZQmpi3fw5XPZ6SbY62dV61M4sjcttd46HfCf5SrAonoOADFQLMGQafznjhaA== + dependencies: + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@zag-js/focus-visible" "0.1.0" + +"@chakra-ui/react-children-utils@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-children-utils/-/react-children-utils-2.0.3.tgz#406b984c653befd6c99636fcefb55bd01d436a7d" + integrity sha512-tPQjLEEuAw/DYLRw0cNs/g8tcdhZ3r21Sr9dTAzoyvfk0vbZ24gCXRElltW2GZLiFA63mAidzhPmc+yQF3Wtgg== + +"@chakra-ui/react-context@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-context/-/react-context-2.0.4.tgz#1b6ab260d44d9073c95b975b7d1643f011e65e02" + integrity sha512-eBITFkf7fLSiMZrSdhweK4fYr41WUNMEeIEOP2dCWolE7WgKxNYaYleC+iRGY0GeXkFM2KYywUtixjJe29NuVA== + +"@chakra-ui/react-env@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-env/-/react-env-2.0.10.tgz#2eaa4ba64a14ecd2d279c32d5edfef7a6b5de3e8" + integrity sha512-3Yab5EbFcCGYzEsoijy4eA3354Z/JoXyk9chYIuW7Uwd+K6g/R8C0mUSAHeTmfp6Fix9kzDgerO5MWNM87b8cA== + +"@chakra-ui/react-types@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-types/-/react-types-2.0.3.tgz#dc454c4703b4de585e6461fd607304ede06fe595" + integrity sha512-1mJYOQldFTALE0Wr3j6tk/MYvgQIp6CKkJulNzZrI8QN+ox/bJOh8OVP4vhwqvfigdLTui0g0k8M9h+j2ub/Mw== + +"@chakra-ui/react-use-animation-state@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.5.tgz#f022baf0103c35aa494227b041422e7d2401b0d4" + integrity sha512-8gZIqZpMS5yTGlC+IqYoSrV13joiAYoeI0YR2t68WuDagcZ459OrjE57+gF04NLxfdV7eUgwqnpuv7IOLbJX/A== + dependencies: + "@chakra-ui/dom-utils" "2.0.3" + "@chakra-ui/react-use-event-listener" "2.0.4" + +"@chakra-ui/react-use-callback-ref@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.4.tgz#5099ef1df4413af42e434945f541de99394ec96f" + integrity sha512-he7EQfwMA4mwiDDKvX7cHIJaboCqf7UD3KYHGUcIjsF4dSc2Y8X5Ze4w+hmVZoJWIe4DWUzb3ili2SUm8eTgPg== + +"@chakra-ui/react-use-controllable-state@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.5.tgz#5ef9f600ae134a2a37fe080fd6231bbed83544bb" + integrity sha512-JrZZpMX24CUyfDuyqDczw9Z9IMvjH8ujETHK0Zu4M0SIsX/q4EqOwwngUFL03I2gx/O38HfSdeX8hMu4zbTAGA== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-disclosure@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.5.tgz#bb52340f0e7d614cc95819bd21cffd050783f96c" + integrity sha512-kPLB9oxImASRhAbKfvfc03/lbAJbsXndEVRzd+nvvL+QZm2RRfnel3k6OIkWvGFOXXYOPE2+slLe8ZPwbTGg9g== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-event-listener@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.4.tgz#3f893def57a7b10db6c355740dd1e82cd3216259" + integrity sha512-VqmalfKWMO8D21XuZO19WUtcP5xhbHXKzkggApTChZUN02UC5TC4pe0pYbDygoeUuNBhY+9lJKHeS08vYsljRg== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-focus-effect@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.5.tgz#b554277c38e84468b019e08a73579e9700e1003a" + integrity sha512-sbe1QnsXXfjukM+laxbKnT0UnMpHe/7kTzEPG/BYM6/ZDUUmrC1Nz+8l+3H/52iWIaruikDBdif/Xd37Yvu3Kg== + dependencies: + "@chakra-ui/dom-utils" "2.0.3" + "@chakra-ui/react-use-event-listener" "2.0.4" + "@chakra-ui/react-use-update-effect" "2.0.4" + +"@chakra-ui/react-use-focus-on-pointer-down@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.3.tgz#8b605063c9e707a18b021fbcaed8919c8660d1ed" + integrity sha512-8cKmpv26JnblexNaekWxEDI7M+MZnJcp1PJUz6lByjfQ1m4YjFr1cdbdhG4moaqzzYs7vTmO/qL8KVq8ZLUwyQ== + dependencies: + "@chakra-ui/react-use-event-listener" "2.0.4" + +"@chakra-ui/react-use-interval@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-interval/-/react-use-interval-2.0.2.tgz#6d1d5d5b5c5604ee2ea47f1e140e6eaf6e885df5" + integrity sha512-5U1c0pEB5n0Yri0E4RdFXWx2RVBZBBhD8Uu49dM33jkIguCbIPmZ+YgVry5DDzCHyz4RgDg4yZKOPK0PI8lEUg== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-latest-ref@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.2.tgz#4895d3ae2dc93a660ed86aaec7021b729830d3d2" + integrity sha512-Ra/NMV+DSQ3n0AdKsyIqdgnFzls5UntabtIRfDXLrqmJ4tI0a1tDdop2qop0Ue87AcqD9P1KtQue4KPx7wCElw== + +"@chakra-ui/react-use-merge-refs@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.4.tgz#c23f10fda1d3a6327a48708a8a7ad4b62ba918d3" + integrity sha512-aoWvtE5tDQNaLCiNUI6WV+MA2zVcCLR5mHSCISmowlTXyXOqOU5Fo9ZoUftzrmgCJpDu5x1jfUOivxuHUueb0g== + +"@chakra-ui/react-use-outside-click@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.0.4.tgz#977d873cfedec615c8e3acd48fca7b094b464b6e" + integrity sha512-uerJKS8dqg2kHs1xozA5vcCqW0UInuwrfCPb+rDWBTpu7aEqxABMw9W3e4gfOABrAjhKz2I0a/bu2i8zbVwdLw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-pan-event@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.5.tgz#9269d4b798d1447e18b00ee0b28fa52c5c8efb26" + integrity sha512-nhE3b85++EEmBD2v6m46TLoA4LehSCZ349P8kvEjw/RC0K6XDOZndaBucIeAlnpEENSSUpczFfMSOLxSHdu0oA== + dependencies: + "@chakra-ui/event-utils" "2.0.5" + "@chakra-ui/react-use-latest-ref" "2.0.2" + framesync "5.3.0" + +"@chakra-ui/react-use-previous@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-previous/-/react-use-previous-2.0.2.tgz#1091ae8abc2082ab504e3742f8b1d75409ae7b27" + integrity sha512-ap/teLRPKopaHYD80fnf0TR/NpTWHJO5VdKg6sPyF1y5ediYLAzPT1G2OqMCj4QfJsYDctioT142URDYe0Nn7w== + +"@chakra-ui/react-use-safe-layout-effect@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.2.tgz#31088eeb4b2a6910251683ddb15fb855d6127adf" + integrity sha512-gl5HDq9RVeDJiT8udtpx12KRV8JPLJHDIUX8f/yZcKpXow0C7FFGg5Yy5I9397NQog5ZjKMuOg+AUq9TLJxsyQ== + +"@chakra-ui/react-use-size@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-size/-/react-use-size-2.0.4.tgz#3634782f8dab6aa2a37699188afa89251cbae8f3" + integrity sha512-W6rgTLuoSC4ovZtqYco8cG+yBadH3bhlg92T5lgpKDakSDr0mXcZdbGx6g0AOkgxXm0V1jWNGO1743wudtF7ew== + dependencies: + "@zag-js/element-size" "0.1.0" + +"@chakra-ui/react-use-timeout@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.2.tgz#f1378de0d5e01f7aee60d5b9ec3205e1fc7d2fc4" + integrity sha512-n6zb3OmxtDmRMxYkDgILqKh15aDOa8jNLHBlqHzmlL6mEGNKmMFPW9j/KvpAqSgKjUTDRnnXcpneprTMKy/yrw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.4" + +"@chakra-ui/react-use-update-effect@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.4.tgz#522bc58b943fffe540a91f7a096d42e4a91b9748" + integrity sha512-F/I9LVnGAQyvww+x7tQb47wCwjhMYjpxtM1dTg1U3oCEXY0yF1Ts3NJLUAlsr3nAW6epJIwWx61niC7KWpam1w== + +"@chakra-ui/react-utils@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-utils/-/react-utils-2.0.8.tgz#1db4e920386f4afbf44fe9dd8aaaf6f22eefb371" + integrity sha512-OSHHBKZlJWTi2NZcPnBx1PyZvLQY+n5RPBtcri7/89EDdAwz2NdEhp2Dz1yQRctOSCF1kB/rnCYDP1U0oRk9RQ== + dependencies: + "@chakra-ui/utils" "2.0.11" + +"@chakra-ui/react@2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.3.6.tgz#a6d3e092cab433fcd9cf8e9876756818c4261df6" + integrity sha512-xo43UU+yMqRGHZLU4fSgzojeRl5stlIfT+GLbT9CUVEm0HMJCt2m8RsNPBvGOMzANdC+bzwSiOm+MNzQBi9IBQ== + dependencies: + "@chakra-ui/accordion" "2.1.2" + "@chakra-ui/alert" "2.0.11" + "@chakra-ui/avatar" "2.2.0" + "@chakra-ui/breadcrumb" "2.1.0" + "@chakra-ui/button" "2.0.11" + "@chakra-ui/checkbox" "2.2.2" + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/control-box" "2.0.10" + "@chakra-ui/counter" "2.0.10" + "@chakra-ui/css-reset" "2.0.8" + "@chakra-ui/editable" "2.0.13" + "@chakra-ui/form-control" "2.0.11" + "@chakra-ui/hooks" "2.1.0" + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/image" "2.0.11" + "@chakra-ui/input" "2.0.12" + "@chakra-ui/layout" "2.1.9" + "@chakra-ui/live-region" "2.0.10" + "@chakra-ui/media-query" "3.2.7" + "@chakra-ui/menu" "2.1.2" + "@chakra-ui/modal" "2.2.2" + "@chakra-ui/number-input" "2.0.12" + "@chakra-ui/pin-input" "2.0.15" + "@chakra-ui/popover" "2.1.1" + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/progress" "2.0.12" + "@chakra-ui/provider" "2.0.20" + "@chakra-ui/radio" "2.0.12" + "@chakra-ui/react-env" "2.0.10" + "@chakra-ui/select" "2.0.12" + "@chakra-ui/skeleton" "2.0.17" + "@chakra-ui/slider" "2.0.12" + "@chakra-ui/spinner" "2.0.10" + "@chakra-ui/stat" "2.0.11" + "@chakra-ui/styled-system" "2.3.4" + "@chakra-ui/switch" "2.0.14" + "@chakra-ui/system" "2.3.0" + "@chakra-ui/table" "2.0.11" + "@chakra-ui/tabs" "2.1.4" + "@chakra-ui/tag" "2.0.11" + "@chakra-ui/textarea" "2.0.12" + "@chakra-ui/theme" "2.1.14" + "@chakra-ui/theme-utils" "2.0.1" + "@chakra-ui/toast" "4.0.0" + "@chakra-ui/tooltip" "2.2.0" + "@chakra-ui/transition" "2.0.11" + "@chakra-ui/utils" "2.0.11" + "@chakra-ui/visually-hidden" "2.0.11" + +"@chakra-ui/select@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/select/-/select-2.0.12.tgz#9b485e6a28c9aa468bc1c0d8a78aabd985b0c370" + integrity sha512-NCDMb0w48GYCHmazVSQ7/ysEpbnri+Up6n+v7yytf6g43TPRkikvK5CsVgLnAEj0lIdCJhWXTcZer5wG5KOEgA== + dependencies: + "@chakra-ui/form-control" "2.0.11" + +"@chakra-ui/shared-utils@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/shared-utils/-/shared-utils-2.0.2.tgz#1df08133194c12ac4df9302604ec37784c2bb026" + integrity sha512-wC58Fh6wCnFFQyiebVZ0NI7PFW9+Vch0QE6qN7iR+bLseOzQY9miYuzPJ1kMYiFd6QTOmPJkI39M3wHqrPYiOg== + +"@chakra-ui/skeleton@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-2.0.17.tgz#737e08f771980f5b73060dc6c940691e7759d044" + integrity sha512-dL7viXEKDEzmAJGbHMj+QbGl9PAd0VWztEcWcz5wOGfmAcJllA0lVh6NmG/yqLb6iXPCX4Y1Y0Yurm459TEYWg== + dependencies: + "@chakra-ui/media-query" "3.2.7" + "@chakra-ui/react-use-previous" "2.0.2" + +"@chakra-ui/slider@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-2.0.12.tgz#42fc5fe385c507276da29f4aa49a6408ee853978" + integrity sha512-Cna04J7e4+F3tJNb7tRNfPP+koicbDsKJBp+f1NpR32JbRzIfrf2Vdr4hfD5/uOfC4RGxnVInNZzZLGBelLtLw== + dependencies: + "@chakra-ui/number-utils" "2.0.4" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-callback-ref" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-latest-ref" "2.0.2" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-pan-event" "2.0.5" + "@chakra-ui/react-use-size" "2.0.4" + "@chakra-ui/react-use-update-effect" "2.0.4" + +"@chakra-ui/spinner@2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/spinner/-/spinner-2.0.10.tgz#f8b1b6f1c8f45e3aeab44d5ab1f1debc71e52573" + integrity sha512-SwId1xPaaFAaEYrR9eHkQHAuB66CbxwjWaQonEjeEUSh9ecxkd5WbXlsQSyf2hVRIqXJg0m3HIYblcKUsQt9Rw== + +"@chakra-ui/stat@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/stat/-/stat-2.0.11.tgz#0c052aee68486a892e09e802bb569dc984e31eae" + integrity sha512-ZPFK2fKufDSHD8bp/KhO3jLgW/b3PzdG4zV+7iTO7OYjxm5pkBfBAeMqfXGx4cl51rtWUKzsY0HV4vLLjcSjHw== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/styled-system@2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/styled-system/-/styled-system-2.3.4.tgz#6022c5a675b54a69b1d3c2d3e60258901dc7b82a" + integrity sha512-Lozbedu+GBj4EbHB/eGv475SFDLApsIEN9gNKiZJBJAE1HIhHn3Seh1iZQSrHC/Beq+D5cQq3Z+yPn3bXtFU7w== + dependencies: + csstype "^3.0.11" + lodash.mergewith "4.6.2" + +"@chakra-ui/switch@2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@chakra-ui/switch/-/switch-2.0.14.tgz#62372355bf73c19896b39fb7e75c132333c5a882" + integrity sha512-6lzhCkJq7vbD3yGaorGLp0ZZU4ewdKwAu0e62qR8TfYZwbcbpkXbBKloIHbA2XKOduISzS2WYqjmoP6jSKIxrA== + dependencies: + "@chakra-ui/checkbox" "2.2.2" + +"@chakra-ui/system@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/system/-/system-2.3.0.tgz#b7ba122872d4d48806fbf994f1187680ae2296a6" + integrity sha512-BxikahglBI0uU8FE3anEorDTU5oKTUuBIEKVcQrEVnrbNuRJEy1OVYyCNXfqW3MpruRO9ypYV2bWt02AZZWEaQ== + dependencies: + "@chakra-ui/color-mode" "2.1.9" + "@chakra-ui/react-utils" "2.0.8" + "@chakra-ui/styled-system" "2.3.4" + "@chakra-ui/theme-utils" "2.0.1" + "@chakra-ui/utils" "2.0.11" + react-fast-compare "3.2.0" + +"@chakra-ui/table@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/table/-/table-2.0.11.tgz#9bd25d5383c94982b89e792675bc1d1f667f81f3" + integrity sha512-zQTiqPKEgjdeO/PG0FByn0fH4sPF7dLJF+YszrIzDc6wvpD96iY6MYLeV+CSelbH1g0/uibcJ10PSaFStfGUZg== + dependencies: + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/tabs@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/tabs/-/tabs-2.1.4.tgz#38d9748ce2cfa583a123c0f695ea1cbce1a6bd42" + integrity sha512-/CQGj1lC9lvruT5BCYZH6Ok64W4CDSysDXuR2XPZXIih9kVOdXQEMXxG8+3vc63WqTBjHuURtZI0g8ouOy84ew== + dependencies: + "@chakra-ui/clickable" "2.0.10" + "@chakra-ui/descendant" "3.0.10" + "@chakra-ui/lazy-utils" "2.0.2" + "@chakra-ui/react-children-utils" "2.0.3" + "@chakra-ui/react-context" "2.0.4" + "@chakra-ui/react-use-controllable-state" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.4" + "@chakra-ui/react-use-safe-layout-effect" "2.0.2" + +"@chakra-ui/tag@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/tag/-/tag-2.0.11.tgz#14702adf5d1456dbbb84ea7a4b314953b92c323f" + integrity sha512-iJJcX+4hl+6Se/8eCRzG+xxDwZfiYgc4Ly/8s93M0uW2GLb+ybbfSE2DjeKSyk3mQVeGzuxGkBfDHH2c2v26ew== + dependencies: + "@chakra-ui/icon" "3.0.11" + "@chakra-ui/react-context" "2.0.4" + +"@chakra-ui/textarea@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/textarea/-/textarea-2.0.12.tgz#469c1d64cb855b3b534dcd7fcc1d927e60da8da1" + integrity sha512-msR9YMynRXwZIqR6DgjQ2MogA/cW1syBx/R0v3es+9Zx8zlbuKdoLhYqajHteCup8dUzTeIH2Vs2vAwgq4wu5A== + dependencies: + "@chakra-ui/form-control" "2.0.11" + +"@chakra-ui/theme-tools@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/theme-tools/-/theme-tools-2.0.12.tgz#b29d9fb626d35e3b00f532c64f95ea261d8f6997" + integrity sha512-mnMlKSmXkCjHUJsKWmJbgBTGF2vnLaMLv1ihkBn5eQcCubMQrBLTiMAEFl5pZdzuHItU6QdnLGA10smcXbNl0g== + dependencies: + "@chakra-ui/anatomy" "2.0.7" + "@ctrl/tinycolor" "^3.4.0" + +"@chakra-ui/theme-utils@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/theme-utils/-/theme-utils-2.0.1.tgz#a3dc99331ba943e155dd683fe25ce302e3084db0" + integrity sha512-NDwzgTPxm+v3PAJlSSU1MORHLMqO9vsRJ+ObELD5wpvE9aEyRziN/AZSoK2oLwCQMPEiU7R99K5ij1E6ptMt7w== + dependencies: + "@chakra-ui/styled-system" "2.3.4" + "@chakra-ui/theme" "2.1.14" + lodash.mergewith "4.6.2" + +"@chakra-ui/theme@2.1.14": + version "2.1.14" + resolved "https://registry.yarnpkg.com/@chakra-ui/theme/-/theme-2.1.14.tgz#4726d65a65515f8ee96b5f2a725d0d17804ddfc9" + integrity sha512-6EYJCQlrjSjNAJvZmw1un50F8+sQDFsdwu/7UzWe+TeANpKlz4ZcHbh0gkl3PD62lGis+ehITUwqRm8htvDOjw== + dependencies: + "@chakra-ui/anatomy" "2.0.7" + "@chakra-ui/theme-tools" "2.0.12" + +"@chakra-ui/toast@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-4.0.0.tgz#797c34c4ecfcad7c6899c1cda221af0ff04d5d0b" + integrity sha512-abeeloJac5T9WK2IN76fEM5FSRH+erNXln2HqDf5wLBn33avSBXWyTiUL8riVSUqto0lrIn6FuK/MmKo0DH4og== + dependencies: + "@chakra-ui/alert" "2.0.11" + "@chakra-ui/close-button" "2.0.11" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-use-timeout" "2.0.2" + "@chakra-ui/react-use-update-effect" "2.0.4" + "@chakra-ui/styled-system" "2.3.4" + "@chakra-ui/theme" "2.1.14" + +"@chakra-ui/tooltip@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-2.2.0.tgz#24e005f831cddf1c0e41dd246ed2771a97b8637c" + integrity sha512-oB97aQJBW+U3rRIt1ct7NaDRMnbW16JQ5ZBCl3BzN1VJWO3djiNuscpjVdZSceb+FdGSFo+GoDozp1ZwqdfFeQ== + dependencies: + "@chakra-ui/popper" "3.0.8" + "@chakra-ui/portal" "2.0.10" + "@chakra-ui/react-types" "2.0.3" + "@chakra-ui/react-use-disclosure" "2.0.5" + "@chakra-ui/react-use-event-listener" "2.0.4" + "@chakra-ui/react-use-merge-refs" "2.0.4" + +"@chakra-ui/transition@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/transition/-/transition-2.0.11.tgz#b2cfeb2150871c635cb9d03d9b525481dbe56f56" + integrity sha512-O0grc162LARPurjz1R+J+zr4AAKsVwN5+gaqLfZLMWg6TpvczJhwEA2fLCNAdkC/gomere390bJsy52xfUacUw== + +"@chakra-ui/utils@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/utils/-/utils-2.0.11.tgz#8e773f900a8356bd10c48b59151a781dba1c7b70" + integrity sha512-4ZQdK6tbOuTrUCsAQBHWo7tw5/Q6pBV93ZbVpats61cSWMFGv32AIQw9/hA4un2zDeSWN9ZMVLNjAY2Dq/KQOA== + dependencies: + "@types/lodash.mergewith" "4.6.6" + css-box-model "1.2.1" + framesync "5.3.0" + lodash.mergewith "4.6.2" + +"@chakra-ui/visually-hidden@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/visually-hidden/-/visually-hidden-2.0.11.tgz#b2eb236e803451b39cdfcce3c5ab52e773c066a3" + integrity sha512-e+5amYvnsmEQdiWH4XMyvrtGTdwz//+48vwj5CsNWWcselzkwqodmciy5rIrT71/SCQDOtmgnL7ZWAUOffxfsQ== + +"@ctrl/tinycolor@^3.4.0": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32" + integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@electron/get@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" + integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + global-tunnel-ng "^2.7.1" + +"@electron/universal@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339" + integrity sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.1.0" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@emotion/babel-plugin@^11.10.0": + version "11.10.2" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz#879db80ba622b3f6076917a1e6f648b1c7d008c7" + integrity sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.0" + 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.0.13" + +"@emotion/cache@^11.10.0": + version "11.10.3" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.3.tgz#c4f67904fad10c945fea5165c3a5a0583c164b87" + integrity sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.0.13" + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@11.10.4": + version "11.10.4" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.4.tgz#9dc6bccbda5d70ff68fdb204746c0e8b13a79199" + integrity sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.0" + "@emotion/cache" "^11.10.0" + "@emotion/serialize" "^1.1.0" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.0.tgz#b1f97b1011b09346a40e9796c37a3397b4ea8ea8" + integrity sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.0.tgz#771b1987855839e214fc1741bde43089397f7be5" + integrity sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w== + +"@emotion/styled@11.10.4": + version "11.10.4" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.4.tgz#e93f84a4d54003c2acbde178c3f97b421fce1cd4" + integrity sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.0" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.0" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + +"@esbuild/android-arm@0.15.12": + version "0.15.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769" + integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA== + +"@esbuild/linux-loong64@0.15.12": + version "0.15.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1" + integrity sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw== + +"@eslint/eslintrc@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" + integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@heroicons/react@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.0.12.tgz#7e5a16c82512f89a30266dd36f8b8465b3e3e216" + integrity sha512-FZxKh3i9aKIDxyALTgIpSF2t6V6/eZfF5mRu41QlwkX3Oxzecdm1u6dpft6PQGxIBwO7TKYWaMAYYL8mp/EaOg== + +"@humanwhocodes/config-array@^0.10.5": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jimp/bmp@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.16.2.tgz#3982879b10626fc8cf1b4ab8627158bad142ec9d" + integrity sha512-4g9vW45QfMoGhLVvaFj26h4e7cC+McHUQwyFQmNTLW4FfC1OonN9oUr2m/FEDGkTYKR7aqdXR5XUqqIkHWLaFw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + bmp-js "^0.1.0" + +"@jimp/core@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.16.2.tgz#4f8e83a4af76a60610e794362d1deb5afaa03353" + integrity sha512-dp7HcyUMzjXphXYodI6PaXue+I9PXAavbb+AN+1XqFbotN22Z12DosNPEyy+UhLY/hZiQQqUkEaJHkvV31rs+w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + any-base "^1.1.0" + buffer "^5.2.0" + exif-parser "^0.1.12" + file-type "^9.0.0" + load-bmfont "^1.3.1" + mkdirp "^0.5.1" + phin "^2.9.1" + pixelmatch "^4.0.2" + tinycolor2 "^1.4.1" + +"@jimp/custom@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.16.2.tgz#e1ba6874551dd4d748825680c3a16bb7cd3595b6" + integrity sha512-GtNwOs4hcVS2GIbqRUf42rUuX07oLB92cj7cqxZb0ZGWwcwhnmSW0TFLAkNafXmqn9ug4VTpNvcJSUdiuECVKg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/core" "^0.16.2" + +"@jimp/gif@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.16.2.tgz#c049cf0fc781233aca418f130f8664c4cbab64c1" + integrity sha512-TMdyT9Q0paIKNtT7c5KzQD29CNCsI/t8ka28jMrBjEK7j5RRTvBfuoOnHv7pDJRCjCIqeUoaUSJ7QcciKic6CA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + gifwrap "^0.9.2" + omggif "^1.0.9" + +"@jimp/jpeg@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.16.2.tgz#1060cff9700d08802a0932a397cfb61a34b1d058" + integrity sha512-BW5gZydgq6wdIwHd+3iUNgrTklvoQc/FUKSj9meM6A0FU21lUaansRX5BDdJqHkyXJLnnlDGwDt27J+hQuBAVw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + jpeg-js "^0.4.2" + +"@jimp/plugin-blit@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.16.2.tgz#65e683f3f2860a59999b6af068efde3625f86cf7" + integrity sha512-Z31rRfV80gC/r+B/bOPSVVpJEWXUV248j7MdnMOFLu4vr8DMqXVo9jYqvwU/s4LSTMAMXqm4Jg6E/jQfadPKAg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-blur@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.16.2.tgz#05533c19973a16feb037d175bb77e4532f144e45" + integrity sha512-ShkJCAzRI+1fAKPuLLgEkixpSpVmKTYaKEFROUcgmrv9AansDXGNCupchqVMTdxf8zPyW8rR1ilvG3OJobufLQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-circle@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.16.2.tgz#f66c7b8562ccced02688612f548b76952b14ab70" + integrity sha512-6T4z/48F4Z5+YwAVCLOvXQcyGmo0E3WztxCz6XGQf66r4JJK78+zcCDYZFLMx0BGM0091FogNK4QniP8JaOkrA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-color@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.16.2.tgz#925d3b2fa41807c7119197bdf9c5694d92efe3be" + integrity sha512-6oBV0g0J17/7E+aTquvUsgSc85nUbUi+64tIK5eFIDzvjhlqhjGNJYlc46KJMCWIs61qRJayQoZdL/iT/iQuGQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + tinycolor2 "^1.4.1" + +"@jimp/plugin-contain@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.16.2.tgz#e5cf5ca7cc3eec1306cb1b92dbd2a1fad6146a94" + integrity sha512-pLcxO3hVN3LCEhMNvpZ9B7xILHVlS433Vv16zFFJxLRqZdYvPLsc+ZzJhjAiHHuEjVblQrktHE3LGeQwGJPo0w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-cover@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.16.2.tgz#c4aadfaad718a14838219889936ad39a18021df4" + integrity sha512-gzWM7VvYeI8msyiwbUZxH+sGQEgO6Vd6adGxZ0CeKX00uQOe5lDzxb1Wjx7sHcJGz8a/5fmAuwz7rdDtpDUbkw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-crop@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.16.2.tgz#2dd716b93a865b839143016acac53681d85362c3" + integrity sha512-qCd3hfMEE+Z2EuuyXewgXRTtKJGIerWzc1zLEJztsUkPz5i73IGgkOL+mrNutZwGaXZbm+8SwUaGb46sxAO6Tw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-displace@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.16.2.tgz#e4852c48f4b2095a4bcc61c8c1a5faa9618773ef" + integrity sha512-6nXdvNNjCdD95v2o3/jPeur903dz08lG4Y8gmr5oL2yVv9LSSbMonoXYrR/ASesdyXqGdXJLU4NL+yZs4zUqbQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-dither@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.16.2.tgz#e5cf77f5b0b8a4247c171b7e234c99031b6a59f3" + integrity sha512-DERpIzy21ZanMkVsD0Tdy8HQLbD1E41OuvIzaMRoW4183PA6AgGNlrQoFTyXmzjy6FTy1SxaQgTEdouInAWZ9Q== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-fisheye@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.2.tgz#ec6cab102959fd67a4061e6812db6135731f7731" + integrity sha512-Df7PsGIwiIpQu3EygYCnaJyTfOwvwtYV3cmYJS7yFLtdiFUuod+hlSo5GkwEPLAy+QBxhUbDuUqnsWo4NQtbiQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-flip@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.16.2.tgz#3d6f5eac4a8d7d62251aba55259ecb4f8dfe42cf" + integrity sha512-+2uC8ioVQUr06mnjSWraskz2L33nJHze35LkQ8ZNsIpoZLkgvfiWatqAs5bj+1jGI/9kxoCFAaT1Is0f+a4/rw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-gaussian@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.2.tgz#6546886e8b0acfebf285c5aabc4fea476dc54159" + integrity sha512-2mnuDSg4ZEH8zcJig7DZZf4st/cYmQ5UYJKP76iGhZ+6JDACk6uejwAgT5xHecNhkVAaXMdCybA2eknH/9OE1w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-invert@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.16.2.tgz#6ca4f7b204c5d674d093d9aa4c32bf20a924a0ee" + integrity sha512-xFvHbVepTY/nus+6yXiYN1iq+UBRkT0MdnObbiQPstUrAsz0Imn6MWISsnAyMvcNxHGrxaxjuU777JT/esM0gg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-mask@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.16.2.tgz#b352392bc8773f6b21b34901ed17f2bb90a8047e" + integrity sha512-AbdO85xxhfgEDdxYKpUotEI9ixiCMaIpfYHD5a5O/VWeimz2kuwhcrzlHGiyq1kKAgRcl0WEneTCZAHVSyvPKA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-normalize@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.16.2.tgz#e36a8ecaea6acb4711c543212863a570fe19901f" + integrity sha512-+ItBWFwmB0Od7OfOtTYT1gm543PpHUgU8/DN55z83l1JqS0OomDJAe7BmCppo2405TN6YtVm/csXo7p4iWd/SQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-print@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.16.2.tgz#8873338941498997cb2a0d2820e9d58d7c03ba61" + integrity sha512-ifTGEeJ5UZTCiqC70HMeU3iXk/vsOmhWiwVGOXSFXhFeE8ZpDWvlmBsrMYnRrJGuaaogHOIrrQPI+kCdDBSBIQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + load-bmfont "^1.4.0" + +"@jimp/plugin-resize@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.16.2.tgz#7bcca41d9959667fb1e6e87bd6073ce0dbc43bc4" + integrity sha512-gE4N9l6xuwzacFZ2EPCGZCJ/xR+aX2V7GdMndIl/6kYIw5/eib1SFuF9AZLvIPSFuE1FnGo8+vT0pr++SSbhYg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-rotate@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.16.2.tgz#deba6956eaf1d127e91389c53d5c6f59ef80d17f" + integrity sha512-/CTEYkR1HrgmnE0VqPhhbBARbDAfFX590LWGIpxcYIYsUUGQCadl+8Qo4UX13FH0Nt8UHEtPA+O2x08uPYg9UA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-scale@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.16.2.tgz#d297e6a83f860b5e29bc5bd30ec1556561cb71ab" + integrity sha512-3inuxfrlquyLaqFdiiiQNJUurR0WbvN5wAf1qcYX2LubG1AG8grayYD6H7XVoxfUGTZXh1kpmeirEYlqA2zxcw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-shadow@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.16.2.tgz#2365b0d4ade0f9641cf48b887431fe478a7ace45" + integrity sha512-Q0aIs2/L6fWMcEh9Ms73u34bT1hyUMw/oxaVoIzOLo6/E8YzCs2Bi63H0/qaPS0MQpEppI++kvosPbblABY79w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugin-threshold@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.16.2.tgz#3b851659ab1db195b2b4e6c9901f19996a086568" + integrity sha512-gyOwmBgjtMPvcuyOhkP6dOGWbQdaTfhcBRN22mYeI/k/Wh/Zh1OI21F6eKLApsVRmg15MoFnkrCz64RROC34sw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + +"@jimp/plugins@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.16.2.tgz#bba2a7247f926fe7e13e35b24ca9552b0aae4312" + integrity sha512-zCvYtCgctmC0tkYEu+y+kSwSIZBsNznqJ3/3vkpzxdyjd6wCfNY5Qc/68MPrLc1lmdeGo4cOOTYHG7Vc6myzRw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/plugin-blit" "^0.16.2" + "@jimp/plugin-blur" "^0.16.2" + "@jimp/plugin-circle" "^0.16.2" + "@jimp/plugin-color" "^0.16.2" + "@jimp/plugin-contain" "^0.16.2" + "@jimp/plugin-cover" "^0.16.2" + "@jimp/plugin-crop" "^0.16.2" + "@jimp/plugin-displace" "^0.16.2" + "@jimp/plugin-dither" "^0.16.2" + "@jimp/plugin-fisheye" "^0.16.2" + "@jimp/plugin-flip" "^0.16.2" + "@jimp/plugin-gaussian" "^0.16.2" + "@jimp/plugin-invert" "^0.16.2" + "@jimp/plugin-mask" "^0.16.2" + "@jimp/plugin-normalize" "^0.16.2" + "@jimp/plugin-print" "^0.16.2" + "@jimp/plugin-resize" "^0.16.2" + "@jimp/plugin-rotate" "^0.16.2" + "@jimp/plugin-scale" "^0.16.2" + "@jimp/plugin-shadow" "^0.16.2" + "@jimp/plugin-threshold" "^0.16.2" + timm "^1.6.1" + +"@jimp/png@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.16.2.tgz#45af82656aad2fde0489687a538f2af903867a1b" + integrity sha512-sFOtOSz/tzDwXEChFQ/Nxe+0+vG3Tj0eUxnZVDUG/StXE9dI8Bqmwj3MIa0EgK5s+QG3YlnDOmlPUa4JqmeYeQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.2" + pngjs "^3.3.3" + +"@jimp/tiff@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.16.2.tgz#613870065fe1387f6a09fe9d8230c00c35b7b640" + integrity sha512-ADcdqmtZF+U2YoaaHTzFX8D6NFpmN4WZUT0BPMerEuY7Cq8QoLYU22z2h034FrVW+Rbi1b3y04sB9iDiQAlf2w== + dependencies: + "@babel/runtime" "^7.7.2" + utif "^2.0.1" + +"@jimp/types@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.16.2.tgz#e245281495d0c92cd73174f7ac359211882288c7" + integrity sha512-0Ue5Sq0XnDF6TirisWv5E+8uOnRcd8vRLuwocJOhF76NIlcQrz+5r2k2XWKcr3d+11n28dHLXW5TKSqrUopxhA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/bmp" "^0.16.2" + "@jimp/gif" "^0.16.2" + "@jimp/jpeg" "^0.16.2" + "@jimp/png" "^0.16.2" + "@jimp/tiff" "^0.16.2" + timm "^1.6.1" + +"@jimp/utils@^0.16.2": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.16.2.tgz#e78cb82c46f608b72179a31581065bf75b35166c" + integrity sha512-XENrPvmigiXZQ8E2nxJqO6UVvWBLzbNwyYi3Y8Q1IECoYhYI3kgOQ0fmy4G269Vz1V0omh1bNmC42r4OfXg1Jg== + dependencies: + "@babel/runtime" "^7.7.2" + regenerator-runtime "^0.13.3" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + 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.0", "@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/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + 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/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@motionone/animation@^10.13.1": + version "10.14.0" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.14.0.tgz#2f2a3517183bb58d82e389aac777fe0850079de6" + integrity sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ== + dependencies: + "@motionone/easing" "^10.14.0" + "@motionone/types" "^10.14.0" + "@motionone/utils" "^10.14.0" + tslib "^2.3.1" + +"@motionone/dom@10.13.1": + version "10.13.1" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.13.1.tgz#fc29ea5d12538f21b211b3168e502cfc07a24882" + integrity sha512-zjfX+AGMIt/fIqd/SL1Lj93S6AiJsEA3oc5M9VkUr+Gz+juRmYN1vfvZd6MvEkSqEjwPQgcjN7rGZHrDB9APfQ== + dependencies: + "@motionone/animation" "^10.13.1" + "@motionone/generators" "^10.13.1" + "@motionone/types" "^10.13.0" + "@motionone/utils" "^10.13.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.14.0": + version "10.14.0" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.14.0.tgz#d8154b7f71491414f3cdee23bd3838d763fffd00" + integrity sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA== + dependencies: + "@motionone/utils" "^10.14.0" + tslib "^2.3.1" + +"@motionone/generators@^10.13.1": + version "10.14.0" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.14.0.tgz#e05d9dd56da78a4b92db99185848a0f3db62242d" + integrity sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg== + dependencies: + "@motionone/types" "^10.14.0" + "@motionone/utils" "^10.14.0" + tslib "^2.3.1" + +"@motionone/types@^10.13.0", "@motionone/types@^10.14.0": + version "10.14.0" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.14.0.tgz#148c34f3270b175397e49c3058b33fab405c21e3" + integrity sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ== + +"@motionone/utils@^10.13.1", "@motionone/utils@^10.14.0": + version "10.14.0" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.14.0.tgz#a19a3464ed35b08506747b062d035c7bc9bbe708" + integrity sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw== + dependencies: + "@motionone/types" "^10.14.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@nestjs/common@8.4.4": + version "8.4.4" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-8.4.4.tgz#0914c6c0540b5a344c7c8fd6072faa1a49af1158" + integrity sha512-QHi7QcgH/5Jinz+SCfIZJkFHc6Cch1YsAEGFEhi6wSp6MILb0sJMQ1CX06e9tCOAjSlBwaJj4PH0eFCVau5v9Q== + dependencies: + axios "0.26.1" + iterare "1.2.1" + tslib "2.3.1" + uuid "8.3.2" + +"@nestjs/core@8.4.4": + version "8.4.4" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-8.4.4.tgz#94fd2d63fd77791f616fbecafb79faa2235eeeff" + integrity sha512-Ef3yJPuzAttpNfehnGqIV5kHIL9SHptB5F4ERxoU7pT61H3xiYpZw6hSjx68cJO7cc6rm7/N+b4zeuJvFHtvBg== + dependencies: + "@nuxtjs/opencollective" "0.3.2" + fast-safe-stringify "2.1.1" + iterare "1.2.1" + object-hash "3.0.0" + path-to-regexp "3.2.0" + tslib "2.3.1" + uuid "8.3.2" + +"@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" + +"@nut-tree/libnut-darwin@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@nut-tree/libnut-darwin/-/libnut-darwin-2.3.0.tgz#93eec6d6f6c3744506fff035864c0054f4c25b2f" + integrity sha512-hbNW0WN5Olrrcl59sNXCdJCHmaclwk5G/FMQcP8NoTNWkSv2L+zxXZ5dNt13DErCv9HCvMrof20nBz82LArNXg== + dependencies: + bindings "1.5.0" + cmake-js "6.1.0" + node-addon-api "3.0.0" + +"@nut-tree/libnut-linux@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@nut-tree/libnut-linux/-/libnut-linux-2.3.0.tgz#ea9fc5de54744c549941c4574c50fa15fe4a888b" + integrity sha512-Hc2GsW4/BNYViqqaaaQCytj2C4NWNCJGGhCbznjyqI2cAHU3y5Hx+Frlkcnohfo+ofyOZOlPDQSxtP+E4tmVOw== + dependencies: + bindings "1.5.0" + cmake-js "6.1.0" + node-addon-api "3.0.0" + +"@nut-tree/libnut-win32@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@nut-tree/libnut-win32/-/libnut-win32-2.3.0.tgz#206d8524ca2ba126f946eb98821398d7812459eb" + integrity sha512-2v9fBVekJn9ktyI2IWmYlLzNqGBdkaSscfqKmT7Kdzshh6nbsqeawRmhFc4IgTOJBSruz7oc6AWAWsRk9OL3FQ== + dependencies: + bindings "1.5.0" + cmake-js "6.1.0" + node-addon-api "3.0.0" + +"@nut-tree/libnut@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@nut-tree/libnut/-/libnut-2.3.0.tgz#1f0482a7b69b897eff43e5b868fb312e55b2e6c5" + integrity sha512-EAbwcA3xv4zZWX8EmcKzWlWON1hf/IxJsMAdApRqObhoarpBQO28DoHAxZW7HQPP/T9S1YrLHONjGxwUzippQQ== + dependencies: + "@nut-tree/libnut-darwin" "2.3.0" + "@nut-tree/libnut-linux" "2.3.0" + "@nut-tree/libnut-win32" "2.3.0" + +"@nut-tree/nut-js@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@nut-tree/nut-js/-/nut-js-2.3.0.tgz#5f414dd7e46b25a5fca194dd389bcd6c8021afe6" + integrity sha512-QOQeuwlB1e+Ctj7h0lcIzxeWs1tR8DACxCURDsS/TxsYP0SqNBsc+ov4GjwJGOI80WOe00gXahnqVPie4qjfSg== + dependencies: + "@nut-tree/libnut" "2.3.0" + clipboardy "2.3.0" + jimp "0.16.2" + node-abort-controller "2.0.0" + +"@nuxtjs/opencollective@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" + integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== + dependencies: + chalk "^4.1.0" + consola "^2.15.0" + node-fetch "^2.6.1" + +"@openapitools/openapi-generator-cli@2.5.2": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.5.2.tgz#727a0f29fec1f91ffb467003d0d12ef35554e0ef" + integrity sha512-FLgkjzpDiHVsH821db0VDSElDoA6TcspGyq3RD4zLBJaJhbSsRwr4u87sNoyuHKBg4OMJbZMT4iJxAhkosKrzw== + dependencies: + "@nestjs/common" "8.4.4" + "@nestjs/core" "8.4.4" + "@nuxtjs/opencollective" "0.3.2" + chalk "4.1.2" + commander "8.3.0" + compare-versions "4.1.3" + concurrently "6.5.1" + console.table "0.10.0" + fs-extra "10.0.1" + glob "7.1.6" + inquirer "8.2.2" + lodash "4.17.21" + reflect-metadata "0.1.13" + rxjs "7.5.5" + tslib "2.0.3" + +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + +"@popperjs/core@^2.9.3": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + +"@react-hook/debounce@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-hook/debounce/-/debounce-3.0.0.tgz#9eea8b5d81d4cb67cd72dd8657b3ff724afc7cad" + integrity sha512-ir/kPrSfAzY12Gre0sOHkZ2rkEmM4fS5M5zFxCi4BnCeXh2nvx9Ujd+U4IGpKCuPA+EQD0pg1eK2NGLvfWejag== + dependencies: + "@react-hook/latest" "^1.0.2" + +"@react-hook/event@^1.2.1": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@react-hook/event/-/event-1.2.6.tgz#52f91578add934acc1203328ca09ab14fc7ee58e" + integrity sha512-JUL5IluaOdn5w5Afpe/puPa1rj8X6udMlQ9dt4hvMuKmTrBS1Ya6sb4sVgvfe2eU4yDuOfAhik8xhbcCekbg9Q== + +"@react-hook/latest@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@react-hook/latest/-/latest-1.0.3.tgz#c2d1d0b0af8b69ec6e2b3a2412ba0768ac82db80" + integrity sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg== + +"@react-hook/throttle@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@react-hook/throttle/-/throttle-2.2.0.tgz#d0402714a06e1ba0bc1da1fdf5c3c5cd0e08d45a" + integrity sha512-LJ5eg+yMV8lXtqK3lR+OtOZ2WH/EfWvuiEEu0M3bhR7dZRfTyEJKxH1oK9uyBxiXPtWXiQggWbZirMCXam51tg== + dependencies: + "@react-hook/latest" "^1.0.2" + +"@react-hook/window-size@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@react-hook/window-size/-/window-size-3.1.1.tgz#1a564902cfe212e8c27ffc2e74adcaa18a7d65b3" + integrity sha512-yWnVS5LKnOUIrEsI44oz3bIIUYqflamPL27n+k/PC//PsX/YeWBky09oPeAoc9As6jSH16Wgo8plI+ECZaHk3g== + dependencies: + "@react-hook/debounce" "^3.0.0" + "@react-hook/event" "^1.2.1" + "@react-hook/throttle" "^2.2.0" + +"@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== + +"@stomp/stompjs@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@stomp/stompjs/-/stompjs-6.1.2.tgz#4ac3c380e8d1de1da94a3623d404e67de69dd01e" + integrity sha512-FHDTrIFM5Ospi4L3Xhj6v2+NzCVAeNDcBe95YjUWhWiRMrBF6uN3I7AUOlRgT6jU/2WQvvYK8ZaIxFfxFp+uHQ== + +"@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" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tsconfig/strictest@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/strictest/-/strictest-1.0.2.tgz#aff98cd714dbd1722c9229eed2dcf3fc6fd30fd9" + integrity sha512-IRKlC8cnP7zMz1SDBjyIVyPapkEGWLZ6wkF6Z8T+xU80P9sO5uGXlIUvtzjx+7ehPJRWxkB6CeIDwUfyqNtYkQ== + +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash.mergewith@4.6.6": + version "4.6.6" + resolved "https://registry.yarnpkg.com/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz#c4698f5b214a433ff35cb2c75ee6ec7f99d79f10" + integrity sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.186" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.186.tgz#862e5514dd7bd66ada6c70ee5fce844b06c8ee97" + integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "18.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.3.tgz#78a6d7ec962b596fc2d2ec102c4dd3ef073fea6a" + integrity sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A== + +"@types/node@16.9.1": + version "16.9.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708" + integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== + +"@types/node@^16.11.26": + version "16.11.68" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.68.tgz#30ee923f4d940793e0380f5ce61c0bd4b7196b6c" + integrity sha512-JkRpuVz3xCNCWaeQ5EHLR/6woMbHZz/jZ7Kmc63AkU+1HxnoUugzSWMck7dsR4DvNYX8jp9wTi9K7WvnxOIQZQ== + +"@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/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@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/qrcode@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.5.0.tgz#6a98fe9a9a7b2a9a3167b6dde17eff999eabe40b" + integrity sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA== + dependencies: + "@types/node" "*" + +"@types/react-dom@18.0.6": + version "18.0.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" + integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@18.0.21": + version "18.0.21" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" + integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.3.12": + version "7.3.12" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c" + integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A== + +"@types/sockjs-client@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/sockjs-client/-/sockjs-client-1.5.1.tgz#7ed2093da89305af370511c4e3beb7e4ef0d7e87" + integrity sha512-bmZM6A1GPdjF0bcuIUC+50hZEMGkzMsiG9by6X9U+7IZFOiPtz7MJ9h05FSpPVxlj4i+TzzoG3ESo1FJlbLb6A== + +"@types/verror@^1.10.3": + version "1.10.6" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.6.tgz#3e600c62d210c5826460858f84bcbb65805460bb" + integrity sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ== + +"@types/ws@^8.5.3": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + 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.1": + version "17.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" + integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz#3203a6ff396b1194083faaa6e5110c401201d7d5" + integrity sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg== + dependencies: + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/type-utils" "5.40.1" + "@typescript-eslint/utils" "5.40.1" + debug "^4.3.4" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.40.1.tgz#e7f8295dd8154d0d37d661ddd8e2f0ecfdee28dd" + integrity sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg== + dependencies: + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz#a7a5197dfd234622a2421ea590ee0ccc02e18dfe" + integrity sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg== + dependencies: + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" + +"@typescript-eslint/type-utils@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz#091e4ce3bebbdb68f4980bae9dee2e4e1725f601" + integrity sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q== + dependencies: + "@typescript-eslint/typescript-estree" "5.40.1" + "@typescript-eslint/utils" "5.40.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.40.1.tgz#de37f4f64de731ee454bb2085d71030aa832f749" + integrity sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw== + +"@typescript-eslint/typescript-estree@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz#9a7d25492f02c69882ce5e0cd1857b0c55645d72" + integrity sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA== + dependencies: + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.40.1.tgz#3204fb73a559d3b7bab7dc9d3c44487c2734a9ca" + integrity sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz#f3d2bf5af192f4432b84cec6fdcb387193518754" + integrity sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw== + dependencies: + "@typescript-eslint/types" "5.40.1" + eslint-visitor-keys "^3.3.0" + +"@vitejs/plugin-react@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz#4c99df15e71d2630601bd3018093bdc787d40e55" + integrity sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA== + dependencies: + "@babel/core" "^7.18.13" + "@babel/plugin-transform-react-jsx" "^7.18.10" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-jsx-self" "^7.18.6" + "@babel/plugin-transform-react-jsx-source" "^7.18.6" + magic-string "^0.26.2" + react-refresh "^0.14.0" + +"@zag-js/element-size@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.1.0.tgz#dfdb3f66a70328d0c3149aae29b8f99c10590c22" + integrity sha512-QF8wp0+V8++z+FHXiIw93+zudtubYszOtYbNgK39fg3pi+nCZtuSm4L1jC5QZMatNZ83MfOzyNCfgUubapagJQ== + +"@zag-js/focus-visible@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@zag-js/focus-visible/-/focus-visible-0.1.0.tgz#9777bbaff8316d0b3a14a9095631e1494f69dbc7" + integrity sha512-PeaBcTmdZWcFf7n1aM+oiOdZc+sy14qi0emPIeUuGMTjbP0xLGrZu43kdpHnWSXy7/r4Ubp/vlg50MCV8+9Isg== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-keywords@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4: + 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" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +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-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@^0.3.0, ansi@~0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + integrity sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A== + +any-base@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" + integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.6.0.tgz#03cade02838c077db99d86212d61c5fc1d6da1a8" + integrity sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.2.1" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.7" + electron-osx-sign "^0.6.0" + electron-publish "23.6.0" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^4.0.10" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.1.2" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.7" + tar "^6.1.11" + temp-file "^3.4.0" + +arch@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +are-we-there-yet@~1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz#a2d28c93102aa6cc96245a26cb954de06ec53f0c" + integrity sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +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== + +aria-hidden@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.1.tgz#ad8c1edbde360b454eb2bf717ea02da00bfee0f8" + integrity sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A== + dependencies: + tslib "^2.0.0" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + 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.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +asar@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" + integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +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== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axe-core@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" + integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== + +axios@0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + +axios@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" + integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +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" + +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== + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +big-integer@^1.6.17: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +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== + +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + +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" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.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== + +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== + +bmp-js@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" + integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== + +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + +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" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== + +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +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-indexof-polyfill@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + integrity sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g== + +buffer@^5.1.0, buffer@^5.2.0, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== + +builder-util-runtime@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz#2da7b34e78a64ad14ccd070d6eed4662d893bd60" + integrity sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.6.0.tgz#1880ec6da7da3fd6fa19b8bd71df7f39e8d17dd9" + integrity sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.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== + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001400: + version "1.0.30001422" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz#f2d7c6202c49a8359e6e35add894d88ef93edba1" + integrity sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== + dependencies: + traverse ">=0.3.0 <0.4" + +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: + 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" + +chalk@^2.0.0, chalk@^2.4.1: + 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" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +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.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + +ci-info@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" + integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +clipboardy@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" + integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ== + dependencies: + arch "^2.1.1" + execa "^1.0.0" + is-wsl "^2.1.1" + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +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== + +cmake-js@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-6.1.0.tgz#bec7381b58d454acee09d4fb0047153a005063a6" + integrity sha512-utmukLQftpgrCpGRCaHnkv4K27HZNNFqmBl4vnvccy0xp4c1erxjFU/Lq4wn5ngAhFZmpwBPQfoKWKThjSBiwg== + dependencies: + debug "^4" + fs-extra "^5.0.0" + is-iojs "^1.0.1" + lodash "^4" + memory-stream "0" + npmlog "^1.2.0" + rc "^1.2.7" + request "^2.54.0" + semver "^5.0.3" + splitargs "0" + tar "^4" + unzipper "^0.8.13" + url-join "0" + which "^1.0.9" + yargs "^3.6.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +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.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== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.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== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + +compare-versions@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.3.tgz#8f7b8966aef7dc4282b45dfa6be98434fc18a1a4" + integrity sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg== + +compute-scroll-into-view@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz#80e3ebb25d6aa89f42e533956cb4b16a04cfe759" + integrity sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ== + +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== + +concurrently@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.5.1.tgz#4518c67f7ac680cf5c34d5adf399a2a2047edc8c" + integrity sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag== + dependencies: + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + rxjs "^6.6.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^16.2.0" + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +consola@^2.15.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console.table@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/console.table/-/console.table-0.10.0.tgz#0917025588875befd70cf2eff4bef2c6e2d75d04" + integrity sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g== + dependencies: + easy-table "1.1.0" + +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== + +copy-to-clipboard@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-js-pure@^3.25.1: + version "3.25.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" + integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +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@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + 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" + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-box-model@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + +csstype@^3.0.11, csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +date-fns@^2.16.1: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + 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" + +debug@^2.6.8, debug@^2.6.9: + 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@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +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== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +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: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +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== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +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== + +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +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" + +dmg-builder@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.6.0.tgz#d39d3871bce996f16c07d2cafe922d6ecbb2a948" + integrity sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA== + dependencies: + app-builder-lib "23.6.0" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +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== + +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@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== + dependencies: + readable-stream "^2.0.2" + +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== + +easy-table@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.1.0.tgz#86f9ab4c102f0371b7297b92a651d5824bc8cb73" + integrity sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA== + optionalDependencies: + wcwidth ">=1.0.1" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ejs@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +electron-builder@^23.3.3: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.6.0.tgz#c79050cbdce90ed96c5feb67c34e9e0a21b5331b" + integrity sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "23.6.0" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + dmg-builder "23.6.0" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + simple-update-notifier "^1.0.7" + yargs "^17.5.1" + +electron-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.6.0.tgz#ac9b469e0b07752eb89357dd660e5fb10b3d1ce9" + integrity sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-reload@^2.0.0-alpha.1: + version "2.0.0-alpha.1" + resolved "https://registry.yarnpkg.com/electron-reload/-/electron-reload-2.0.0-alpha.1.tgz#6cad98df96695ca1d5462dc9407f7c620028ce99" + integrity sha512-hTde7gv0TEqxbxlB3pj2CwoyCQ9sdiQrcP8GkpzhosxyVeYM3mZbMEVKCZK3L0fED7Mz5A9IWmK7zEvi4H3P1g== + dependencies: + chokidar "^3.5.2" + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +electron@^21.1.1: + version "21.2.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-21.2.0.tgz#8eb65d69b36aa8dac0ee7330eab70181df211c8b" + integrity sha512-oKV4fo8l6jlOZ1cYZ4RpZz02ZxLuBo3SO7DH+FrJ8uDyCirP+eVJ/qlzu23odtNe0P7S/mYAZbC6abZHWoqtLg== + dependencies: + "@electron/get" "^1.14.1" + "@types/node" "^16.11.26" + extract-zip "^2.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== + +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + +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.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@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +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.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + 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-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +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" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +esbuild-android-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc" + integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q== + +esbuild-android-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666" + integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA== + +esbuild-darwin-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25" + integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q== + +esbuild-darwin-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04" + integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw== + +esbuild-freebsd-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0" + integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw== + +esbuild-freebsd-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e" + integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g== + +esbuild-linux-32@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4" + integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA== + +esbuild-linux-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931" + integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA== + +esbuild-linux-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5" + integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ== + +esbuild-linux-arm@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67" + integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A== + +esbuild-linux-mips64le@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2" + integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A== + +esbuild-linux-ppc64le@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7" + integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg== + +esbuild-linux-riscv64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693" + integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA== + +esbuild-linux-s390x@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f" + integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww== + +esbuild-netbsd-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42" + integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w== + +esbuild-openbsd-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae" + integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw== + +esbuild-sunos-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e" + integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg== + +esbuild-windows-32@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0" + integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw== + +esbuild-windows-64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6" + integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA== + +esbuild-windows-arm64@0.15.12: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328" + integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA== + +esbuild@^0.15.9: + version "0.15.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c" + integrity sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng== + optionalDependencies: + "@esbuild/android-arm" "0.15.12" + "@esbuild/linux-loong64" "0.15.12" + esbuild-android-64 "0.15.12" + esbuild-android-arm64 "0.15.12" + esbuild-darwin-64 "0.15.12" + esbuild-darwin-arm64 "0.15.12" + esbuild-freebsd-64 "0.15.12" + esbuild-freebsd-arm64 "0.15.12" + esbuild-linux-32 "0.15.12" + esbuild-linux-64 "0.15.12" + esbuild-linux-arm "0.15.12" + esbuild-linux-arm64 "0.15.12" + esbuild-linux-mips64le "0.15.12" + esbuild-linux-ppc64le "0.15.12" + esbuild-linux-riscv64 "0.15.12" + esbuild-linux-s390x "0.15.12" + esbuild-netbsd-64 "0.15.12" + esbuild-openbsd-64 "0.15.12" + esbuild-sunos-64 "0.15.12" + esbuild-windows-32 "0.15.12" + esbuild-windows-64 "0.15.12" + esbuild-windows-arm64 "0.15.12" + +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-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-config-prettier@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-import-resolver-typescript@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz#9431acded7d898fd94591a08ea9eec3514c7de91" + integrity sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.10.0" + get-tsconfig "^4.2.0" + globby "^13.1.2" + is-core-module "^2.10.0" + is-glob "^4.0.3" + synckit "^0.8.4" + +eslint-module-utils@^2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== + dependencies: + "@babel/runtime" "^7.18.9" + aria-query "^4.2.2" + array-includes "^3.1.5" + ast-types-flow "^0.0.7" + axe-core "^4.4.3" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.2" + language-tags "^1.0.5" + minimatch "^3.1.2" + semver "^6.3.0" + +eslint-plugin-react-hooks@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@7.31.10: + version "7.31.10" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz#6782c2c7fe91c09e715d536067644bbb9491419a" + integrity sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +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@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@8.25.0: + version "8.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b" + integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== + dependencies: + "@eslint/eslintrc" "^1.3.3" + "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/module-importer" "^1.0.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + 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.1.0, estraverse@^5.2.0, estraverse@^5.3.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== + +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exif-parser@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + integrity sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw== + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +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.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + 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-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.4: + 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" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-type@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" + integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== + +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== + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +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" + +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@^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" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +focus-lock@^0.11.2: + version "0.11.3" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.3.tgz#c094e8f109d780f56038abdeec79328fd56b627f" + integrity sha512-4n0pYcPTa/uI7Q66BZna61nRT7lDhnuJ9PJr6wiDjx4uStg491ks41y7uOG+s0umaaa+hulNKSldU9aTg9/yVg== + dependencies: + tslib "^2.0.3" + +follow-redirects@^1.14.8, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +framer-motion@7.6.1: + version "7.6.1" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-7.6.1.tgz#45356eb5519275bce42121a3b3849a6243d45a22" + integrity sha512-8US03IWJKrLoSb81l5OahNzB9Sv7Jo1RhIwUoTG/25BRUdO9lOqq/klsdZqNmNG0ua9IEJJQ8hkYpETJ4N6VSw== + dependencies: + "@motionone/dom" "10.13.1" + framesync "6.1.2" + hey-listen "^1.0.8" + popmotion "11.0.5" + style-value-types "5.1.2" + tslib "2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framesync@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/framesync/-/framesync-5.3.0.tgz#0ecfc955e8f5a6ddc8fdb0cc024070947e1a0d9b" + integrity sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA== + dependencies: + tslib "^2.1.0" + +framesync@6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.1.2.tgz#755eff2fb5b8f3b4d2b266dd18121b300aefea27" + integrity sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g== + dependencies: + tslib "2.4.0" + +fs-extra@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" + integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^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@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.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-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +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@~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== + +fstream@~1.0.10: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +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.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: + 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@~1.2.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" + integrity sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA== + dependencies: + ansi "^0.3.0" + has-unicode "^2.0.0" + lodash.pad "^4.1.0" + lodash.padend "^4.1.0" + lodash.padstart "^4.1.0" + +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-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-stream@^4.0.0, 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-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-tsconfig@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.2.0.tgz#ff368dd7104dab47bf923404eb93838245c66543" + integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +gifwrap@^0.9.2: + version "0.9.4" + resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.9.4.tgz#f4eb6169ba027d61df64aafbdcb1f8ae58ccc0c5" + integrity sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ== + dependencies: + image-q "^4.0.0" + omggif "^1.0.10" + +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@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + 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-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +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== + +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.1: + 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" + +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + +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.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +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.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +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-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.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +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" + +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + +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== + +hosted-git-info@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +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-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + +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" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +image-q@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/image-q/-/image-q-4.0.0.tgz#31e075be7bae3c1f42a85c469b4732c358981776" + integrity sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw== + dependencies: + "@types/node" "16.9.1" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + 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" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +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.3, inherits@^2.0.4, inherits@~2.0.0, 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== + +ini@^1.3.4, 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== + +inquirer@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.2.tgz#1310517a87a0814d25336c78a20b44c3d9b7629d" + integrity sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +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" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + +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-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@~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-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@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.10.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +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-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-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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +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.1: + 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@^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-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-iojs@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-iojs/-/is-iojs-1.1.0.tgz#4c11033b5d5d94d6eab3775dedc9be7d008325f1" + integrity sha512-tLn1j3wYSL6DkvEI+V/j0pKohpa5jk+ER74v6S4SgCXnjS0WA+DoZbwZBrrhgwksMvtuwndyGeG5F8YMsoBzSA== + +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-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@^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-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-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@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +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-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-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +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-wsl@^2.1.1, 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" + +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: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== + +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jimp@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.16.2.tgz#c03e296381ae37586e27f209d134d4596d112f7b" + integrity sha512-UpItBk81a92f8oEyoGYbO3YK4QcM0hoIyuGHmShoF9Ov63P5Qo7Q/X2xsAgnODmSuDJFOtrPtJd5GSWW4LKdOQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/custom" "^0.16.2" + "@jimp/plugins" "^0.16.2" + "@jimp/types" "^0.16.2" + regenerator-runtime "^0.13.3" + +jpeg-js@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" + integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== + +js-sdsl@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" + integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== + +"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@^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" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +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.1: + 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: + 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@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.2.0, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +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" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +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" + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + dependencies: + invert-kv "^1.0.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +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== + +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== + +load-bmfont@^1.3.1, load-bmfont@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" + integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + phin "^2.9.1" + xhr "^2.0.1" + xtend "^4.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^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.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.pad@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" + integrity sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg== + +lodash.padend@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" + integrity sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw== + +lodash.padstart@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + integrity sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw== + +lodash@4.17.21, lodash@^4, lodash@^4.17.10, lodash@^4.17.15, 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@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, 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" + +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@^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" + +magic-string@^0.26.2: + version "0.26.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" + integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== + dependencies: + sourcemap-codec "^1.4.8" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +memory-stream@0: + version "0.0.3" + resolved "https://registry.yarnpkg.com/memory-stream/-/memory-stream-0.0.3.tgz#ebe8dd1c3b8bc38c0e7941e9ddd5aebe6b4de83f" + integrity sha512-q0D3m846qY6ZkIt+19ZemU5vH56lpOZZwoJc3AICARKh/menBuayQUjAGPrqtHQQMUYERSdOrej92J9kz7LgYA== + dependencies: + readable-stream "~1.0.26-2" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +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== + +micromatch@^4.0.4: + 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" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + 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.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +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-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" + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + 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" + +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@^0.5.5: + 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" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +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.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-abort-controller@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-2.0.0.tgz#800e0d250d3b977175e48df4f74c2d3960076a79" + integrity sha512-L8RfEgjBTHAISTuagw51PprVAqNZoG6KSB6LQ6H1bskMVkFs5E71IyjauLBv3XbuomJlguWF/VnRHdJ1gqiAqA== + +node-addon-api@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.0.tgz#812446a1001a54f71663bed188314bba07e09247" + integrity sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg== + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-package-data@^2.3.2: + 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@^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-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== + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +npm-run-all@4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npmlog@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-1.2.1.tgz#28e7be619609b53f7ad1dd300a10d64d716268b6" + integrity sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ== + dependencies: + ansi "~0.3.0" + are-we-there-yet "~1.0.0" + gauge "~1.2.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +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-hash@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +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.assign@^4.1.3, 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.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +omggif@^1.0.10, omggif@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" + integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + +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@^5.1.0: + 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.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== + dependencies: + lcid "^1.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +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-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +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@^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-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== + +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== + +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-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + integrity sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA== + +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + integrity sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA== + +parse-bmfont-xml@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" + integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== + dependencies: + xml-parse-from-string "^1.0.0" + xml2js "^0.4.5" + +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +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" + +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-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +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@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f" + integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +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== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +phin@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" + integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== + +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.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pixelmatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA== + dependencies: + pngjs "^3.0.0" + +plist@^3.0.1, plist@^3.0.4: + version "3.0.6" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" + integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +pngjs@^3.0.0, pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + +popmotion@11.0.5: + version "11.0.5" + resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.5.tgz#8e3e014421a0ffa30ecd722564fd2558954e1f7d" + integrity sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA== + dependencies: + framesync "6.1.2" + hey-listen "^1.0.8" + style-value-types "5.1.2" + tslib "2.4.0" + +postcss@^8.4.16: + version "8.4.18" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2" + integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +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== + +prettier@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw== + +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== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prop-types@^15.6.2, prop-types@^15.8.1: + 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" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +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" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qrcode@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" + integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== + dependencies: + dijkstrajs "^1.0.1" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +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== + +rc@^1.2.7: + 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-clientside-effect@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" + integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== + dependencies: + "@babel/runtime" "^7.12.13" + +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-fast-compare@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-focus-lock@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.1.tgz#094cfc19b4f334122c73bb0bff65d77a0c92dd16" + integrity sha512-pSWOQrUmiKLkffPO6BpMXN7SNKXMsuOakl652IBuALAu1esk+IcpJyM+ALcYzPTTFz1rD0R54aB9A4HuP5t1Wg== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^0.11.2" + prop-types "^15.6.2" + react-clientside-effect "^1.2.6" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-is@^16.13.1, 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-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react-remove-scroll-bar@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.4: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +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-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== + dependencies: + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + 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.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.0.26-2: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + integrity sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw== + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +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" + +reflect-metadata@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.10" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +request@^2.54.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +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== + +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@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.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@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +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== + +rimraf@2: + 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" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +rollup@~2.78.0: + version "2.78.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f" + integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +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" + +rxjs@7.5.5: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== + dependencies: + tslib "^2.1.0" + +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.5.5: + version "7.5.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== + dependencies: + tslib "^2.1.0" + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, 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-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-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" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, 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== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@>=0.6.0, 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.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" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.7: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +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== + +setimmediate@~1.0.4: + 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== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +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.6.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + +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: + 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-update-notifier@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc" + integrity sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew== + dependencies: + semver "~7.0.0" + +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== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +sockjs-client@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.1.tgz#350b8eda42d6d52ddc030c39943364c11dcad806" + integrity sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw== + dependencies: + debug "^3.2.7" + eventsource "^2.0.2" + faye-websocket "^0.11.4" + inherits "^2.0.4" + url-parse "^1.5.10" + +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-support@^0.5.19: + 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@^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: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + 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.12" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + +splitargs@0: + version "0.0.7" + resolved "https://registry.yarnpkg.com/splitargs/-/splitargs-0.0.7.tgz#fe9f7ae657371b33b10cb80da143cf8249cf6b3b" + integrity sha512-UUFYD2oWbNwULH6WoVtLUOw8ch586B+HUqcsAjjjeoBQAM1bD4wZRXu01koaxyd8UeYpybWqW4h+lO1Okv40Tg== + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^4.1.0, string-width@^4.2.0, 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.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.padend@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +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@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +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" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.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-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-json-comments@^3.1.0, 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-value-types@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.1.2.tgz#6be66b237bd546048a764883528072ed95713b62" + integrity sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q== + dependencies: + hey-listen "^1.0.8" + tslib "2.4.0" + +stylis@4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91" + integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@^5.3.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.1.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== + +synckit@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" + integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.4.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^4: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tar@^6.1.11: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + +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== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +timm@^1.6.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" + integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== + +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + +tiny-invariant@^1.0.6: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tinycolor2@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" + integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.0: + 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-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-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@^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" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@2.4.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +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.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript@4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +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" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unzipper@^0.8.13: + version "0.8.14" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.8.14.tgz#ade0524cd2fc14d11b8de258be22f9d247d3f79b" + integrity sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "~1.0.10" + listenercount "~1.0.1" + readable-stream "~2.1.5" + setimmediate "~1.0.4" + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.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" + +url-join@0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8" + integrity sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw== + +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-parse@^1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + +utif@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" + integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== + dependencies: + pako "^1.0.5" + +util-deprecate@^1.0.1, 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== + +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== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +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" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vite-electron-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vite-electron-plugin/-/vite-electron-plugin-0.4.6.tgz#f408d523c573baf99140f84f8957f843f467f409" + integrity sha512-ctHow5YxXoAok816zSp5RazaRcVJ8sQSgTpNR4LhV5rR1LH/MdMagmSsyjtl2JC1BXLPmh62s/eMiwX4ov7j0A== + dependencies: + chokidar "^3.5.3" + fast-glob "^3.2.12" + +vite-plugin-electron-renderer@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-0.10.1.tgz#0a1db65b79396f7f008effc6ecf10901e8628b17" + integrity sha512-N9QXl1QbwAwZesvxMbWpBvYK4BkL4Xt/812RKCAf1b0eOlwW8jEDXuREsax2GBDdAS5kfOjf8V3Trtu/nFvS0A== + +vite@3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/vite/-/vite-3.1.8.tgz#fa29144167d19b773baffd65b3972ea4c12359c9" + integrity sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg== + dependencies: + esbuild "^0.15.9" + postcss "^8.4.16" + resolve "^1.22.1" + rollup "~2.78.0" + optionalDependencies: + fsevents "~2.3.2" + +wcwidth@>=1.0.1, 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" + +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== + +websocket-driver@>=0.5.1: + 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-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + +which@^1.0.9, which@^1.2.9: + 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" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw== + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +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" + +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== + +xhr@^2.0.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + integrity sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g== + +xml2js@^0.4.5: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +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== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.0, yallist@^3.1.1: + 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: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.5.1: + version "17.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" + integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yargs@^3.6.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg== + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +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== diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..6c9cf946 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3" +services: + db-local: + build: ./docker/mysql + restart: always + environment: + MYSQL_DATABASE: "smartpointer" + MYSQL_USER: "smartpointer" + MYSQL_PASSWORD: "smartpointer" + MYSQL_ROOT_PASSWORD: "smartpointer" + TZ: "Asia/Tokyo" + ports: + - "3306:3306" + volumes: + - ./docker/mysql/conf.d:/etc/mysql/conf.d + - ./docker/mysql/log/local:/var/log/mysql + - ./docker/mysql/db:/var/lib/mysql + db-test: + build: ./docker/mysql + restart: always + environment: + MYSQL_DATABASE: "smartpointer" + MYSQL_USER: "smartpointer" + MYSQL_PASSWORD: "smartpointer" + MYSQL_ROOT_PASSWORD: "smartpointer" + TZ: "Asia/Tokyo" + ports: + - "3307:3306" + volumes: + - ./docker/mysql/conf.d:/etc/mysql/conf.d + - ./docker/mysql/log/test:/var/log/mysql \ No newline at end of file diff --git a/docker/mysql/Dockerfile b/docker/mysql/Dockerfile new file mode 100644 index 00000000..71975962 --- /dev/null +++ b/docker/mysql/Dockerfile @@ -0,0 +1 @@ +FROM mysql:8.0 diff --git a/docker/mysql/conf.d/my.cnf b/docker/mysql/conf.d/my.cnf new file mode 100644 index 00000000..1fbd272a --- /dev/null +++ b/docker/mysql/conf.d/my.cnf @@ -0,0 +1,8 @@ +[client] +default-character-set=utf8mb4 + +[mysqld] +character-set-server=utf8mb4 +explicit-defaults-for-timestamp=1 +general-log=1 +general-log-file=/var/log/mysql/mysqld.log \ No newline at end of file diff --git a/gradle/flyway.gradle b/gradle/flyway.gradle new file mode 100644 index 00000000..9899f2e8 --- /dev/null +++ b/gradle/flyway.gradle @@ -0,0 +1,5 @@ +flyway { + url = DATASOURCE_URL + user = DATASOURCE_USERNAME + password = DATASOURCE_PASSWORD +} diff --git a/gradle/jar.gradle b/gradle/jar.gradle new file mode 100644 index 00000000..2d6ac972 --- /dev/null +++ b/gradle/jar.gradle @@ -0,0 +1,7 @@ +jar { + enabled = false +} + +bootJar { + archiveBaseName = "${APPLICATION_NAME}_${APPLICATION_VERSION}" +} diff --git a/gradle/javadoc.gradle b/gradle/javadoc.gradle new file mode 100644 index 00000000..f628770f --- /dev/null +++ b/gradle/javadoc.gradle @@ -0,0 +1,3 @@ +javadoc { + options.tags = ["mbg.generated:X"] +} diff --git a/gradle/mybatis.gradle b/gradle/mybatis.gradle new file mode 100644 index 00000000..e26ae053 --- /dev/null +++ b/gradle/mybatis.gradle @@ -0,0 +1,46 @@ +ext { + MYBATIS_CONFIG_FILE = MYBATIS_PROPERTY.config.file + MYBATIS_MODEL_PACKAGE = "${BASE_PROPERTY.project.package}.${MYBATIS_PROPERTY.model.package}" + MYBATIS_CLIENT_PACKAGE = "${BASE_PROPERTY.project.package}.${MYBATIS_PROPERTY.client.package}" + MYBATIS_MAP_PACKAGE = "${MYBATIS_PROPERTY.map.package}" +} + +task mbGenerate doLast { + ant.taskdef( + name: "genfiles", + classpath: configurations.mybatisGenerate.asPath + ":build/classes/java/main", + classname: "org.mybatis.generator.ant.GeneratorAntTask" + ) + + ant.properties["db.url"] = DATASOURCE_URL.toString() + ant.properties["db.user"] = DATASOURCE_USERNAME.toString() + ant.properties["db.password"] = DATASOURCE_PASSWORD.toString() + ant.properties["db.driver"] = DATASOURCE_DRIVER.toString() + ant.properties["generator.model.project"] = JAVA_ROOT_PATH.toString() + ant.properties["generator.model.package"] = MYBATIS_MODEL_PACKAGE.toString() + ant.properties["generator.client.project"] = JAVA_ROOT_PATH.toString() + ant.properties["generator.client.package"] = MYBATIS_CLIENT_PACKAGE.toString() + ant.properties["generator.client.type"] = MYBATIS_PROPERTY.client.type.toString() + ant.properties["generator.map.project"] = RESOURCES_ROOT_PATH + ant.properties["generator.map.package"] = MYBATIS_MAP_PACKAGE.toString() + + ant.genfiles( + configfile: "${RESOURCES_ROOT_PATH}/${MYBATIS_CONFIG_FILE}", + overwrite: "true", + verbose: "true" + ) { + propertyset { + propertyref(name: "db.url") + propertyref(name: "db.user") + propertyref(name: "db.password") + propertyref(name: "db.driver") + propertyref(name: "generator.model.project") + propertyref(name: "generator.model.package") + propertyref(name: "generator.client.project") + propertyref(name: "generator.client.package") + propertyref(name: "generator.client.type") + propertyref(name: "generator.map.project") + propertyref(name: "generator.map.package") + } + } +} diff --git a/gradle/run.gradle b/gradle/run.gradle new file mode 100644 index 00000000..d17dcd30 --- /dev/null +++ b/gradle/run.gradle @@ -0,0 +1,4 @@ +bootRun { + systemProperty "spring.profiles.active", "local" + systemProperties System.properties +} diff --git a/gradle/test.gradle b/gradle/test.gradle new file mode 100644 index 00000000..451dcf47 --- /dev/null +++ b/gradle/test.gradle @@ -0,0 +1,10 @@ +test { + useJUnitPlatform() + systemProperty "spring.profiles.active", "test" + systemProperties System.properties + + // testLogging { + // exceptionFormat "full" + // showStandardStreams true + // } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..41d9927a Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..aa991fce --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..1b6c7873 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..5f46af49 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include('app')