From 6c5b282bc01fa4be991e9bea8afe754fbef2cc27 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Thu, 15 Dec 2022 23:57:55 +0100 Subject: [PATCH 01/40] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Migrate=20to=20NestJ?= =?UTF-8?q?S?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 25 + .gitignore | 43 +- .prettierrc | 4 + .yarnrc.yml | 1 + README.md | 160 +- img/discordplaymessage.png | Bin 33816 -> 0 bytes img/playtowindow.png | Bin 19416 -> 0 bytes nest-cli.json | 5 + package-lock.json | 4088 +++++++ package.json | 106 +- patches/jellyfin-apiclient+1.7.0.patch | 12 - src/InterActivePlayMessage.js | 217 - src/app.controller.spec.ts | 22 + src/app.controller.ts | 12 + src/app.module.ts | 31 + src/app.service.ts | 9 + src/clients/discord/discord.module.ts | 22 + src/clients/discord/discord.service.ts | 46 + src/clients/jellyfin/jellyfin.module.ts | 22 + src/clients/jellyfin/jellyfin.service.ts | 55 + src/commands/abstractCommand.ts | 6 + .../handler/command-handler.module.ts | 10 + .../handler/command-handler.service.ts | 107 + src/discordclientmanager.js | 15 - src/dispachermanager.js | 13 - src/index.js | 64 - src/interactivemsghandler.js | 112 - src/jellyfinclientmanager.js | 29 - src/main.ts | 8 + src/messagehandler.js | 308 - src/playbackmanager.js | 535 - src/types/env.ts | 3 + src/util.js | 55 - src/utils/constants.ts | 6 + src/websockethandler.js | 56 - test/app.e2e-spec.ts | 24 + test/jest-e2e.json | 9 + tsconfig.build.json | 4 + tsconfig.json | 21 + yarn.lock | 9883 ++++++++++++----- 40 files changed, 12070 insertions(+), 4078 deletions(-) create mode 100644 .eslintrc.js create mode 100644 .prettierrc create mode 100644 .yarnrc.yml delete mode 100644 img/discordplaymessage.png delete mode 100644 img/playtowindow.png create mode 100644 nest-cli.json create mode 100644 package-lock.json delete mode 100644 patches/jellyfin-apiclient+1.7.0.patch delete mode 100644 src/InterActivePlayMessage.js create mode 100644 src/app.controller.spec.ts create mode 100644 src/app.controller.ts create mode 100644 src/app.module.ts create mode 100644 src/app.service.ts create mode 100644 src/clients/discord/discord.module.ts create mode 100644 src/clients/discord/discord.service.ts create mode 100644 src/clients/jellyfin/jellyfin.module.ts create mode 100644 src/clients/jellyfin/jellyfin.service.ts create mode 100644 src/commands/abstractCommand.ts create mode 100644 src/commands/handler/command-handler.module.ts create mode 100644 src/commands/handler/command-handler.service.ts delete mode 100644 src/discordclientmanager.js delete mode 100644 src/dispachermanager.js delete mode 100644 src/index.js delete mode 100644 src/interactivemsghandler.js delete mode 100644 src/jellyfinclientmanager.js create mode 100644 src/main.ts delete mode 100644 src/messagehandler.js delete mode 100644 src/playbackmanager.js create mode 100644 src/types/env.ts delete mode 100644 src/util.js create mode 100644 src/utils/constants.ts delete mode 100644 src/websockethandler.js create mode 100644 test/app.e2e-spec.ts create mode 100644 test/jest-e2e.json create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..8f5aedb --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir : __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/.gitignore b/.gitignore index 390a1c3..f296397 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,39 @@ -node_modules -package-lock.json -config.json -.prettierrc +# compiled output +/dist +/node_modules +.yarn + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# Secrets +*.env \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..dcb7279 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/README.md b/README.md index e60a12e..0144ba0 100644 --- a/README.md +++ b/README.md @@ -1,145 +1,63 @@

- Jellyfin Logo -

Jellyfin Discord Music Bot

-
- A fork of the original project with improved readability and stability, compatible with Jellyfin 10.8.x -
+ Nest Logo

-# ✨ Features -- Simple Discord Bot that hooks into the [Jellyfin](http://github.com/jellyfin/jellyfin) API of your instance -- Request, pause and play songs directly from your Discord Server -- Interactive Media control message to control playback +[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 +[circleci-url]: https://circleci.com/gh/nestjs/nest -# 🦾 About this fork -The original version is decent for Jellyfin 10.6.x and before. After the breaking changes of 10.7 and 10.8, users were unable to stream music from their Jellyfin. -For this reason, I made this fork to address those changes to the API and improve the bot with my own ideas / features. Please check out the original project by [KGT1](https://github.com/KGT1). +

A simple Discord bot that enables you to broadcast your Jellyfin Media Server music collection to voice channels.

-I will gradually update documentation & code of the bot. Please wait patiently. +

+ Thanky you KGT1 for starting this project! This is a fork of their original repository and re-uses some of their code. +

-







-## Original README from https://github.com/KGT1/jellyfin-discord-music-bot +
+
+
+
-Jellyfin Discord Music Bot is a Discord Bot for the [Jellyfin Media Server!](http://github.com/jellyfin/jellyfin) -### Capabilities +## ✨ Features -#### Play to +- Leighweight and extendable using the [Nest](https://github.com/nestjs/nest) framework +- Easy ussage with Discord commands system (eg. ``/play``, ``/pause``, ...) +- Fast configuration via environment variables +- Typesafe for faster and easier development -Just `summon` the Bot into your Channel, than choose the Bot in Jellyfin as the Device you want to cast to - -![Image to Discord Play to Window](img/playtowindow.png) - - and start playing you favourite Music - -#### Interactive Play Message - -When you start playing something you can easily controll the Bot with just clicking on the Buttons under the Play Message - -![Image to Interactive Play Message](img/discordplaymessage.png) - -#### Commands - -Beware that you'll always need to add your prefix(default: ?) in front of the command. - -Command | Description ------------- | ------------- -summon | Join the channel the author of the message(now you can cast to the Bot from within Jellyfin) -disconnect | Disconnect from all current Voice Channels -play | Play the following item(can be the name of the song or the Stream URL) -add | Add the following item to the current playlist -pause/resume | Pause/Resume audio -seek | Where to Seek to in seconds or MM:SS -skip | Skip this Song -spawn | Spawns an Interactive Play Controller -help | Display the help message - -#### Limitations -- No Playlist Repeat Mode. -- Multi Server support. -- [Playing Video Content](https://github.com/discordjs/discord.js/issues/4116) (if Discord ever adds this, I'll implement it into this Bot) - -### Getting Started -You'll need a Discord Application for this Bot to work, as you will host it yourself. - -[Generate an Api and bot here](https://discord.com/developers/applications/). - -Click New Application. - -![image](https://user-images.githubusercontent.com/20715731/97124506-bba00080-1706-11eb-820a-035039484ca2.png) - -The Name of the application will be the bot's name. - -![image](https://user-images.githubusercontent.com/20715731/97124528-d2deee00-1706-11eb-8a05-8b0542e1213a.png) - -Go to the Bot tab. - -![image](https://user-images.githubusercontent.com/20715731/97124557-ef7b2600-1706-11eb-8fed-2373df9a1eb7.png) - -Generate the bot, and grab the token. Also, recommend making the bot private. - -![image](https://user-images.githubusercontent.com/20715731/97124639-484abe80-1707-11eb-92f9-1182aad3d2d2.png) - -Go to the OAuth2 page, click Bot Scope to get the url authorization link. - -![image](https://user-images.githubusercontent.com/20715731/97124754-b68f8100-1707-11eb-9e16-f84401d108bf.png) - -Authorize your room! - -![image](https://user-images.githubusercontent.com/20715731/97124818-08380b80-1708-11eb-944a-f96395dcf6c1.png) - -Next, join a voice channel and connect your bot with ?summon. This will connect your bot to the voice channel you're in and will create the device profile in Jellyfin. - -![Image to Discord Play to Window](img/playtowindow.png) - -From within Jellyfin, start playing content or from within Discord, use the bot commands to start enjoying music! - -For official documentation to creating a bot. - -[How to retrieve your token](https://discordjs.guide/preparations/setting-up-a-bot-application.html#creating-your-bot) - -[How to invite the Bot to your server](https://discordjs.guide/preparations/adding-your-bot-to-servers.html#bot-invite-links) - -### The simplest way to get started is using Docker: +## 🚀 Installation ```bash -docker run -d \ - --name jellyfin-discord-music-bot \ - -e DISCORD_PREFIX="?" \ - -e DISCORD_TOKEN="yourtokengoeshere" \ - -e JELLYFIN_SERVER_ADDRESS="https://jellyfin.DOMAIN" \ - -e JELLYFIN_USERNAME="" \ - -e JELLYFIN_PASSWORD="" \ - -e JELLYFIN_APP_NAME="Jellyfin Discord Music Bot" \ - -e MESSAGE_UPDATE_INTERVAL="2000" \ - --restart unless-stopped \ - kgt1/jellyfin-discord-music-bot +$ git clone https://github.com/manuel-rw/jellyfin-discord-music-bot.git +$ cd jellyfin-discord-music-bot/ +$ yarn +$ yarn start:prod ``` -MESSAGE_UPDATE_INTERVAL is the amount of time in ms the play message gets updated with the current time +> Docker container comming soon -#### Alternatively you can run the Application natively with NodeJS: +## 💻 Development -Dependencies: +I'm open to any contributions to this project. You can start contributing using the following commands, after executing the installation commands: -- npm 6.14.6 -- NodeJS v12.18.3 -- ffmpeg 4.2.4 ```bash -git clone https://github.com/kgt1/jellyfin-discord-music-bot.git -cd jellyfin-discord-music-bot -npm install +# development +$ npm run start + +# watch mode +$ npm run start:dev + +# production mode +$ npm run start:prod ``` -edit config.json and add your token,server-address etc. + ```bash -npm run start -``` +# unit tests +$ npm run test +# e2e tests +$ npm run test:e2e -### How to build -``` -git clone https://github.com/kgt1/jellyfin-discord-music-bot.git -cd jellyfin-discord-music-bot -docker build -t YOUR_IMAGE_NAME . +# test coverage +$ npm run test:cov ``` diff --git a/img/discordplaymessage.png b/img/discordplaymessage.png deleted file mode 100644 index d62bfb63607c588f9c0eca53c17fd1974500645d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33816 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

fd+bIqYTuA*MM@s{jxFlY_ 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 diff --git a/img/playtowindow.png b/img/playtowindow.png deleted file mode 100644 index a228b60da3af5860bfa9b23f010fb24399370420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19416 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.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==", + "deprecated": "no longer supported" + }, + "node_modules/@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@discordjs/node-pre-gyp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.1.0.tgz", + "integrity": "sha512-6u3EbK2x+j9bM3iK9/pE7BWLxOXZ1PvcsbDo3ZBdPocu95qPHj8zCVsBBk3Cao7V6o8QpwxUyJl6oVJ6T3ZgAg==", + "deprecated": "no longer supported", + "dependencies": { + "detect-libc": "^1.0.3", + "mkdirp": "^0.5.5", + "needle": "^2.4.1", + "nopt": "^4.0.3", + "npm-packlist": "^1.4.8", + "npmlog": "^4.1.2", + "rc": "^1.2.8", + "rimraf": "^3.0.2", + "semver": "^7.3.0", + "tar": "^6.0.2" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@discordjs/opus": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.3.3.tgz", + "integrity": "sha512-n3hUs4RY0K8cz8vJ2GiZE4EdJlexoxs1vGsaft5lZlAnU6wsZfncpv4px+HVOMKN8ddtjriGfsrG4lVkAyZcmQ==", + "deprecated": "no longer supported", + "hasInstallScript": true, + "dependencies": { + "@discordjs/node-pre-gyp": "^0.1.0", + "node-addon-api": "^3.0.2" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "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==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/brace-expansion": { + "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" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "peer": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "devOptional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/discord.js": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", + "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "deprecated": "no longer supported", + "dependencies": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.9", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.4.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/discord.js/node_modules/@discordjs/node-pre-gyp": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", + "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/discord.js/node_modules/@discordjs/opus": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.8.0.tgz", + "integrity": "sha512-uHE7OmHEmP8YM0yvsH3iSdacdeghO0qTkF0CIkV07Tg0qdyOLUVkoZHj5Zcpge9rC4qb/JvTS2xRgttSZLM43Q==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@discordjs/node-pre-gyp": "^0.4.4", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/discord.js/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "peer": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/discord.js/node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/discord.js/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "peer": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/discord.js/node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==", + "optional": true, + "peer": true + }, + "node_modules/discord.js/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "peer": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/discord.js/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "peer": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/discord.js/node_modules/prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "peerDependencies": { + "@discordjs/opus": "^0.8.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/discord.js/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/discord.js/node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "dev": true, + "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", + "gopd": "^1.0.1", + "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.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", + "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", + "dev": true, + "peerDependencies": { + "eslint": ">=6.2.2", + "eslint-plugin-import": ">=2.18.0", + "eslint-plugin-node": ">=9.1.0", + "eslint-plugin-promise": ">=4.2.1", + "eslint-plugin-standard": ">=4.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "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==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", + "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", + "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "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==" + }, + "node_modules/fast-json-stable-stringify": { + "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==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "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" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jellyfin-apiclient": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/jellyfin-apiclient/-/jellyfin-apiclient-1.7.0.tgz", + "integrity": "sha512-aaUmhdvox02ge/ROSc8bsdmghjvfbP1QZ28yEPHaMHzY2GBaFczcCWXvEtl6dcQW+lfkemmFtf8D4OSvLHiFzw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsdom": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", + "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", + "dependencies": { + "abab": "^2.0.0", + "acorn": "^6.0.4", + "acorn-globals": "^4.3.0", + "array-equal": "^1.0.0", + "cssom": "^0.3.4", + "cssstyle": "^1.1.1", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.0", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.0.9", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "saxes": "^3.1.5", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.5.0", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^6.1.2", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==" + }, + "node_modules/lru-cache": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, + "peer": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node_modules/node-fetch": { + "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" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodejs": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/nodejs/-/nodejs-0.0.0.tgz", + "integrity": "sha512-1V+0HwaB/dhxzidEFc4uJ3k52gLI4B6YBZgJIofjwYCSAkD6CI0me6TDBT2QM2nbGWNxCHcq9/wVynzQYZOhUg==" + }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "node_modules/npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "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" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/parent-module": { + "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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "node_modules/patch-package": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.0.tgz", + "integrity": "sha512-tC3EqJmo74yKqfsMzELaFwxOAu6FH6t+FzFOsnWAuARm7/n2xB5AOeOueE221eM9gtMuIKMKpF9tBy/X2mNP0Q==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^7.0.1", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^1.10.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=10", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/patch-package/node_modules/path-key": { + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/patch-package/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/patch-package/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/patch-package/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "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" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/regexp.prototype.flags": { + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "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" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dependencies": { + "xmlchars": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver": { + "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" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "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" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/w3c-xmlserializer/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/window": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/window/-/window-4.2.7.tgz", + "integrity": "sha512-goCWCr6B57F6V5HK92lfxwiGlswWyiUtu2Tkyr0L/co2L1Dn5SDayF9ZDTVoYqxfHRt7VEEC7SKbjDBU7TJPpg==", + "dependencies": { + "jsdom": "13.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/word-wrap": { + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + } +} diff --git a/package.json b/package.json index 92ccee7..f2eec95 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,78 @@ { "name": "jellyfin-discord-music-bot", "version": "0.0.1", - "description": "Jellyfin Discord Music Bot is a Discord Bot for the Jellyfin Media Server!", - "main": "src/index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node src/index.js", - "postinstall": "npx patch-package", - "lint": "npx eslint src/ & npx eslint parseENV.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/KGT1/jellyfin-discord-music-bot.git" - }, - "keywords": [ - "Jellyfin", - "Discord", - "Discord-Bot" - ], - "author": "KGT1", + "description": "", + "author": "manuel-rw", + "private": true, "license": "MIT", - "bugs": { - "url": "https://github.com/KGT1/jellyfin-discord-music-bot/issues" + "scripts": { + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" }, - "homepage": "https://github.com/KGT1/jellyfin-discord-music-bot#readme", "dependencies": { - "@discordjs/opus": "^0.3.2", - "chalk": "^4.1.0", - "discord.js": "^12.3.1", - "jellyfin-apiclient": "1.7.0", - "loglevel": "^1.7.1", - "loglevel-plugin-prefix": "^0.8.4", - "node-fetch": "^2.6.0", - "nodejs": "0.0.0", - "window": "^4.2.7", - "ws": "^7.3.1" + "@discordjs/opus": "^0.9.0", + "@jellyfin/sdk": "^0.7.0", + "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.2.0", + "@nestjs/core": "^9.0.0", + "@nestjs/event-emitter": "^1.3.1", + "@nestjs/platform-express": "^9.0.0", + "discord.js": "^14.7.1", + "jellyfin-apiclient": "^1.10.0", + "joi": "^17.7.0", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.2.0" }, "devDependencies": { - "patch-package": "^6.4.7", - "eslint": "^7.9.0", - "eslint-config-standard": "^14.1.1", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.1" + "@nestjs/cli": "^9.0.0", + "@nestjs/schematics": "^9.0.0", + "@nestjs/testing": "^9.0.0", + "@types/express": "^4.17.13", + "@types/jest": "28.1.8", + "@types/node": "^16.0.0", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "28.1.3", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "28.0.8", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "4.1.0", + "typescript": "^4.7.4" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" } } diff --git a/patches/jellyfin-apiclient+1.7.0.patch b/patches/jellyfin-apiclient+1.7.0.patch deleted file mode 100644 index e34c9b5..0000000 --- a/patches/jellyfin-apiclient+1.7.0.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/node_modules/jellyfin-apiclient/dist/jellyfin-apiclient.js b/node_modules/jellyfin-apiclient/dist/jellyfin-apiclient.js -index 4526605..54a7d10 100644 ---- a/node_modules/jellyfin-apiclient/dist/jellyfin-apiclient.js -+++ b/node_modules/jellyfin-apiclient/dist/jellyfin-apiclient.js -@@ -1,2 +1,6 @@ -+const self = require('window') -+const fetch = require('node-fetch') -+const WebSocket = require('ws') -+ - !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["jellyfin-apiclient"]=t():e["jellyfin-apiclient"]=t()}(self,(function(){return function(){"use strict";var e={628:function(e,t,r){function n(e,t){if(!e)throw new Error("obj cannot be null!");e._callbacks=e._callbacks||{};var r=e._callbacks[t];return r||(e._callbacks[t]=[],r=e._callbacks[t]),r}r.d(t,{default:function(){return he}});var i={on:function(e,t,r){n(e,t).push(r)},off:function(e,t,r){var i=n(e,t),a=i.indexOf(r);-1!==a&&i.splice(a,1)},trigger:function(e,t){var r={type:t},i=[];i.push(r);for(var a=arguments[2]||[],o=0,s=a.length;o=20?Promise.reject():function(e){var t=[],r=[],n=e.serverInfo();return n.LocalAddress&&-1===r.indexOf(n.LocalAddress)&&(t.push({url:n.LocalAddress,timeout:0}),r.push(t[t.length-1].url)),n.ManualAddress&&-1===r.indexOf(n.ManualAddress)&&(t.push({url:n.ManualAddress,timeout:100}),r.push(t[t.length-1].url)),n.RemoteAddress&&-1===r.indexOf(n.RemoteAddress)&&(t.push({url:n.RemoteAddress,timeout:200}),r.push(t[t.length-1].url)),console.log("tryReconnect: "+r.join("|")),new Promise((function(r,n){var i={};i.numAddresses=t.length,i.rejects=0,t.map((function(t){setTimeout((function(){i.resolved||function(e,t,r,n,i){console.log("getTryConnectPromise "+t),S(e.getUrl("system/info/public",null,t),{method:"GET",accept:"application/json"},15e3).then((function(){r.resolved||(r.resolved=!0,console.log("Reconnect succeeded to "+t),e.serverAddress(t),n())}),(function(){r.resolved||(console.log("Reconnect failed to "+t),r.rejects++,r.rejects>=r.numAddresses&&i())}))}(e,t.url,i,r,n)}),t.timeout)}))}))}(e).catch((function(r){return console.log("error in tryReconnectInternal: "+(r||"")),new Promise((function(r,n){setTimeout((function(){T(e,t+1).then(r,n)}),500)}))}))}function P(e,t){var r=e.serverId();if(!r)return null;var n=u.getItem("user-".concat(t,"-").concat(r));return n?JSON.parse(n):null}function U(e){E(this,e=JSON.parse(e.data))}var O={};function E(e,t){var r,n,a=t.MessageId;if(a){if(O[a])return;O[a]=!0}"UserDeleted"===t.MessageType?e._currentUser=null:"UserUpdated"===t.MessageType||"UserConfigurationUpdated"===t.MessageType?t.Data.Id===e.getCurrentUserId()&&(e._currentUser=null):"KeepAlive"===t.MessageType?console.debug("Received KeepAlive from server."):"ForceKeepAlive"===t.MessageType&&(console.debug("Received ForceKeepAlive from server. Timeout is ".concat(t.Data," seconds.")),e.sendWebSocketMessage("KeepAlive"),r=e,n=t.Data,b(r),r.keepAliveInterval=setInterval((function(){r.sendWebSocketMessage("KeepAlive")}),1e3*n*.5),r.keepAliveInterval),i.trigger(e,"message",[t])}function b(e){console.debug("Clearing KeepAlive for",e._webSocket),e.keepAliveInterval&&(clearInterval(e.keepAliveInterval),e.keepAliveInterval=null)}function j(){console.log("web socket connection opened"),i.trigger(this,"websocketopen")}function N(){b(this),i.trigger(this,"websocketerror")}function A(e,t){if(!t)return e.lastDetectedBitrate?e.lastDetectedBitrate:Promise.reject();var r=Math.round(.7*t);if(e.getMaxBandwidth){var n=e.getMaxBandwidth();n&&(r=Math.min(r,n))}return e.lastDetectedBitrate=r,e.lastDetectedBitrateTime=(new Date).getTime(),r}function x(e,t,r,n){if(r>=t.length)return A(e,n);var i=t[r];return e.getDownloadSpeed(i.bytes).then((function(n){return n0&&void 0!==arguments[0]?arguments[0]:{};return e.channelIds&&e.channelIds.length>1800?this.ajax({type:"POST",url:this.getUrl("LiveTv/Programs"),data:JSON.stringify(e),contentType:"application/json",dataType:"json"}):this.ajax({type:"GET",url:this.getUrl("LiveTv/Programs",e),dataType:"json"})}},{key:"getLiveTvRecommendedPrograms",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.ajax({type:"GET",url:this.getUrl("LiveTv/Programs/Recommended",e),dataType:"json"})}},{key:"getLiveTvRecordings",value:function(e){var t=this.getUrl("LiveTv/Recordings",e||{});return this.getJSON(t)}},{key:"getLiveTvRecordingSeries",value:function(e){var t=this.getUrl("LiveTv/Recordings/Series",e||{});return this.getJSON(t)}},{key:"getLiveTvRecordingGroups",value:function(e){var t=this.getUrl("LiveTv/Recordings/Groups",e||{});return this.getJSON(t)}},{key:"getLiveTvRecordingGroup",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("LiveTv/Recordings/Groups/".concat(e));return this.getJSON(t)}},{key:"getLiveTvRecording",value:function(e,t){if(!e)throw new Error("null id");var r={};t&&(r.userId=t);var n=this.getUrl("LiveTv/Recordings/".concat(e),r);return this.getJSON(n)}},{key:"getLiveTvProgram",value:function(e,t){if(!e)throw new Error("null id");var r={};t&&(r.userId=t);var n=this.getUrl("LiveTv/Programs/".concat(e),r);return this.getJSON(n)}},{key:"deleteLiveTvRecording",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("LiveTv/Recordings/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"cancelLiveTvTimer",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("LiveTv/Timers/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"getLiveTvTimers",value:function(e){var t=this.getUrl("LiveTv/Timers",e||{});return this.getJSON(t)}},{key:"getLiveTvTimer",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("LiveTv/Timers/".concat(e));return this.getJSON(t)}},{key:"getNewLiveTvTimerDefaults",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("LiveTv/Timers/Defaults",e);return this.getJSON(t)}},{key:"createLiveTvTimer",value:function(e){if(!e)throw new Error("null item");var t=this.getUrl("LiveTv/Timers");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"updateLiveTvTimer",value:function(e){if(!e)throw new Error("null item");var t=this.getUrl("LiveTv/Timers/".concat(e.Id));return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"resetLiveTvTuner",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("LiveTv/Tuners/".concat(e,"/Reset"));return this.ajax({type:"POST",url:t})}},{key:"getLiveTvSeriesTimers",value:function(e){var t=this.getUrl("LiveTv/SeriesTimers",e||{});return this.getJSON(t)}},{key:"getLiveTvSeriesTimer",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("LiveTv/SeriesTimers/".concat(e));return this.getJSON(t)}},{key:"cancelLiveTvSeriesTimer",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("LiveTv/SeriesTimers/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"createLiveTvSeriesTimer",value:function(e){if(!e)throw new Error("null item");var t=this.getUrl("LiveTv/SeriesTimers");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"updateLiveTvSeriesTimer",value:function(e){if(!e)throw new Error("null item");var t=this.getUrl("LiveTv/SeriesTimers/".concat(e.Id));return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"getRegistrationInfo",value:function(e){var t=this.getUrl("Registrations/".concat(e));return this.getJSON(t)}},{key:"getSystemInfo",value:function(e){var t=this.getUrl("System/Info"),r=this;return this.getJSON(t).then((function(e){return r.setSystemInfo(e),Promise.resolve(e)}))}},{key:"getSyncStatus",value:function(){var e=this.getUrl("Sync/"+itemId+"/Status");return this.ajax({url:e,type:"POST",dataType:"json",contentType:"application/json",data:JSON.stringify({TargetId:this.deviceId()})})}},{key:"getPublicSystemInfo",value:function(){var e=this.getUrl("System/Info/Public"),t=this;return this.getJSON(e).then((function(e){return t.setSystemInfo(e),Promise.resolve(e)}))}},{key:"getInstantMixFromItem",value:function(e,t){var r=this.getUrl("Items/".concat(e,"/InstantMix"),t);return this.getJSON(r)}},{key:"getEpisodes",value:function(e,t){var r=this.getUrl("Shows/".concat(e,"/Episodes"),t);return this.getJSON(r)}},{key:"getDisplayPreferences",value:function(e,t,r){var n=this.getUrl("DisplayPreferences/".concat(e),{userId:t,client:r});return this.getJSON(n)}},{key:"updateDisplayPreferences",value:function(e,t,r,n){var i=this.getUrl("DisplayPreferences/".concat(e),{userId:r,client:n});return this.ajax({type:"POST",url:i,data:JSON.stringify(t),contentType:"application/json"})}},{key:"getSeasons",value:function(e,t){var r=this.getUrl("Shows/".concat(e,"/Seasons"),t);return this.getJSON(r)}},{key:"getSimilarItems",value:function(e,t){var r=this.getUrl("Items/".concat(e,"/Similar"),t);return this.getJSON(r)}},{key:"getCultures",value:function(){var e=this.getUrl("Localization/cultures");return this.getJSON(e)}},{key:"getCountries",value:function(){var e=this.getUrl("Localization/countries");return this.getJSON(e)}},{key:"getPlaybackInfo",value:function(e,t,r){var n={DeviceProfile:r};return this.ajax({url:this.getUrl("Items/".concat(e,"/PlaybackInfo"),t),type:"POST",data:JSON.stringify(n),contentType:"application/json",dataType:"json"})}},{key:"getLiveStreamMediaInfo",value:function(e){var t={LiveStreamId:e};return this.ajax({url:this.getUrl("LiveStreams/MediaInfo"),type:"POST",data:JSON.stringify(t),contentType:"application/json",dataType:"json"})}},{key:"getIntros",value:function(e){return this.getJSON(this.getUrl("Users/".concat(this.getCurrentUserId(),"/Items/").concat(e,"/Intros")))}},{key:"getDirectoryContents",value:function(e,t){if(!e)throw new Error("null path");if("string"!=typeof e)throw new Error("invalid path");(t=t||{}).path=e;var r=this.getUrl("Environment/DirectoryContents",t);return this.getJSON(r)}},{key:"getNetworkShares",value:function(e){if(!e)throw new Error("null path");var t={};t.path=e;var r=this.getUrl("Environment/NetworkShares",t);return this.getJSON(r)}},{key:"getParentPath",value:function(e){if(!e)throw new Error("null path");var t={};t.path=e;var r=this.getUrl("Environment/ParentPath",t);return this.ajax({type:"GET",url:r,dataType:"text"})}},{key:"getDrives",value:function(){var e=this.getUrl("Environment/Drives");return this.getJSON(e)}},{key:"getNetworkDevices",value:function(){var e=this.getUrl("Environment/NetworkDevices");return this.getJSON(e)}},{key:"cancelPackageInstallation",value:function(e){if(!e)throw new Error("null installationId");var t=this.getUrl("Packages/Installing/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"refreshItem",value:function(e,t){if(!e)throw new Error("null itemId");var r=this.getUrl("Items/".concat(e,"/Refresh"),t||{});return this.ajax({type:"POST",url:r})}},{key:"installPlugin",value:function(e,t,r){if(!e)throw new Error("null name");var n={AssemblyGuid:t};r&&(n.version=r);var i=this.getUrl("Packages/Installed/".concat(e),n);return this.ajax({type:"POST",url:i})}},{key:"restartServer",value:function(){var e=this.getUrl("System/Restart");return this.ajax({type:"POST",url:e})}},{key:"shutdownServer",value:function(){var e=this.getUrl("System/Shutdown");return this.ajax({type:"POST",url:e})}},{key:"getPackageInfo",value:function(e,t){if(!e)throw new Error("null name");var r={AssemblyGuid:t},n=this.getUrl("Packages/".concat(e),r);return this.getJSON(n)}},{key:"getVirtualFolders",value:function(){var e="Library/VirtualFolders";return e=this.getUrl(e),this.getJSON(e)}},{key:"getPhysicalPaths",value:function(){var e=this.getUrl("Library/PhysicalPaths");return this.getJSON(e)}},{key:"getServerConfiguration",value:function(){var e=this.getUrl("System/Configuration");return this.getJSON(e)}},{key:"getDevicesOptions",value:function(){var e=this.getUrl("System/Configuration/devices");return this.getJSON(e)}},{key:"deleteDevice",value:function(e){var t=this.getUrl("Devices",{Id:e});return this.ajax({type:"DELETE",url:t})}},{key:"getContentUploadHistory",value:function(){var e=this.getUrl("Devices/CameraUploads",{DeviceId:this.deviceId()});return this.getJSON(e)}},{key:"getNamedConfiguration",value:function(e){var t=this.getUrl("System/Configuration/".concat(e));return this.getJSON(t)}},{key:"getScheduledTasks",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("ScheduledTasks",e);return this.getJSON(t)}},{key:"startScheduledTask",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("ScheduledTasks/Running/".concat(e));return this.ajax({type:"POST",url:t})}},{key:"getScheduledTask",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("ScheduledTasks/".concat(e));return this.getJSON(t)}},{key:"getNextUpEpisodes",value:function(e){var t=this.getUrl("Shows/NextUp",e);return this.getJSON(t)}},{key:"stopScheduledTask",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("ScheduledTasks/Running/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"getPluginConfiguration",value:function(e){if(!e)throw new Error("null Id");var t=this.getUrl("Plugins/".concat(e,"/Configuration"));return this.getJSON(t)}},{key:"getAvailablePlugins",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e.PackageType="UserInstalled";var t=this.getUrl("Packages",e);return this.getJSON(t)}},{key:"uninstallPlugin",value:function(e){if(!e)throw new Error("null Id");var t=this.getUrl("Plugins/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"uninstallPluginByVersion",value:function(e,t){if(!e)throw new Error("null Id");if(!t)throw new Error("null Version");var r=this.getUrl("Plugins/".concat(e,"/").concat(t));return this.ajax({type:"DELETE",url:r})}},{key:"enablePlugin",value:function(e,t){if(!e)throw new Error("null Id");if(!t)throw new Error("null Id");var r=this.getUrl("Plugins/".concat(e,"/").concat(t,"/Enable"));return this.ajax({type:"POST",url:r})}},{key:"disablePlugin",value:function(e,t){if(!e)throw new Error("null Id");if(!t)throw new Error("null Version");var r=this.getUrl("Plugins/".concat(e,"/").concat(t,"/Disable"));return this.ajax({type:"POST",url:r})}},{key:"removeVirtualFolder",value:function(e,t){if(!e)throw new Error("null name");var r="Library/VirtualFolders";return r=this.getUrl(r,{refreshLibrary:!!t,name:e}),this.ajax({type:"DELETE",url:r})}},{key:"addVirtualFolder",value:function(e,t,r,n){if(!e)throw new Error("null name");var i={};t&&(i.collectionType=t),i.refreshLibrary=!!r,i.name=e;var a="Library/VirtualFolders";return a=this.getUrl(a,i),this.ajax({type:"POST",url:a,data:JSON.stringify({LibraryOptions:n}),contentType:"application/json"})}},{key:"updateVirtualFolderOptions",value:function(e,t){if(!e)throw new Error("null name");var r="Library/VirtualFolders/LibraryOptions";return r=this.getUrl(r),this.ajax({type:"POST",url:r,data:JSON.stringify({Id:e,LibraryOptions:t}),contentType:"application/json"})}},{key:"renameVirtualFolder",value:function(e,t,r){if(!e)throw new Error("null name");var n="Library/VirtualFolders/Name";return n=this.getUrl(n,{refreshLibrary:!!r,newName:t,name:e}),this.ajax({type:"POST",url:n})}},{key:"addMediaPath",value:function(e,t,r,n){if(!e)throw new Error("null virtualFolderName");if(!t)throw new Error("null mediaPath");var i="Library/VirtualFolders/Paths",a={Path:t};return r&&(a.NetworkPath=r),i=this.getUrl(i,{refreshLibrary:!!n}),this.ajax({type:"POST",url:i,data:JSON.stringify({Name:e,PathInfo:a}),contentType:"application/json"})}},{key:"updateMediaPath",value:function(e,t){if(!e)throw new Error("null virtualFolderName");if(!t)throw new Error("null pathInfo");var r="Library/VirtualFolders/Paths/Update";return r=this.getUrl(r),this.ajax({type:"POST",url:r,data:JSON.stringify({Name:e,PathInfo:t}),contentType:"application/json"})}},{key:"removeMediaPath",value:function(e,t,r){if(!e)throw new Error("null virtualFolderName");if(!t)throw new Error("null mediaPath");var n="Library/VirtualFolders/Paths";return n=this.getUrl(n,{refreshLibrary:!!r,path:t,name:e}),this.ajax({type:"DELETE",url:n})}},{key:"deleteUser",value:function(e){if(!e)throw new Error("null id");var t=this.getUrl("Users/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"deleteUserImage",value:function(e,t,r){if(!e)throw new Error("null userId");if(!t)throw new Error("null imageType");var n=this.getUrl("Users/".concat(e,"/Images/").concat(t));return null!=r&&(n+="/".concat(r)),this.ajax({type:"DELETE",url:n})}},{key:"deleteItemImage",value:function(e,t,r){if(!t)throw new Error("null imageType");var n=this.getUrl("Items/".concat(e,"/Images"));return n+="/".concat(t),null!=r&&(n+="/".concat(r)),this.ajax({type:"DELETE",url:n})}},{key:"deleteItem",value:function(e){if(!e)throw new Error("null itemId");var t=this.getUrl("Items/".concat(e));return this.ajax({type:"DELETE",url:t})}},{key:"stopActiveEncodings",value:function(e){var t={deviceId:this.deviceId()};e&&(t.PlaySessionId=e);var r=this.getUrl("Videos/ActiveEncodings",t);return this.ajax({type:"DELETE",url:r})}},{key:"reportCapabilities",value:function(e){var t=this.getUrl("Sessions/Capabilities/Full");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"updateItemImageIndex",value:function(e,t,r,n){if(!t)throw new Error("null imageType");var i={newIndex:n},a=this.getUrl("Items/".concat(e,"/Images/").concat(t,"/").concat(r,"/Index"),i);return this.ajax({type:"POST",url:a})}},{key:"getItemImageInfos",value:function(e){var t=this.getUrl("Items/".concat(e,"/Images"));return this.getJSON(t)}},{key:"getCriticReviews",value:function(e,t){if(!e)throw new Error("null itemId");var r=this.getUrl("Items/".concat(e,"/CriticReviews"),t);return this.getJSON(r)}},{key:"getItemDownloadUrl",value:function(e){if(!e)throw new Error("itemId cannot be empty");var t="Items/".concat(e,"/Download");return this.getUrl(t,{api_key:this.accessToken()})}},{key:"getSessions",value:function(e){var t=this.getUrl("Sessions",e);return this.getJSON(t)}},{key:"uploadUserImage",value:function(e,t,r){if(!e)throw new Error("null userId");if(!t)throw new Error("null imageType");if(!r)throw new Error("File must be an image.");if(!r.type.startsWith("image/"))throw new Error("File must be an image.");var n=this;return new Promise((function(i,a){var o=new FileReader;o.onerror=function(){a()},o.onabort=function(){a()},o.onload=function(o){var s=o.target.result.split(",")[1],l=n.getUrl("Users/".concat(e,"/Images/").concat(t));n.ajax({type:"POST",url:l,data:s,contentType:"image/".concat(r.name.substring(r.name.lastIndexOf(".")+1))}).then(i,a)},o.readAsDataURL(r)}))}},{key:"uploadItemImage",value:function(e,t,r){if(!e)throw new Error("null itemId");if(!t)throw new Error("null imageType");if(!r)throw new Error("File must be an image.");if(!r.type.startsWith("image/"))throw new Error("File must be an image.");var n=this.getUrl("Items/".concat(e,"/Images"));n+="/".concat(t);var i=this;return new Promise((function(e,t){var a=new FileReader;a.onerror=function(){t()},a.onabort=function(){t()},a.onload=function(a){var o=a.target.result.split(",")[1];i.ajax({type:"POST",url:n,data:o,contentType:"image/".concat(r.name.substring(r.name.lastIndexOf(".")+1))}).then(e,t)},a.readAsDataURL(r)}))}},{key:"uploadItemSubtitle",value:function(e,t,r,n){var i=this;if(!e)throw new SyntaxError("Missing itemId");if(!t)throw new SyntaxError("Missing language");if("boolean"!=typeof r)throw new TypeError("Parameter isForced must be a boolean.");if(!n)throw new SyntaxError("File must be a subtitle file.");var a=n.name.substring(n.name.lastIndexOf(".")+1).toLowerCase();if(!["sub","srt","vtt","ass","ssa"].includes(a))throw new Error("Invalid subtitle format.");var o=this.getUrl("Videos/".concat(e,"/Subtitles"));return new Promise((function(e,s){var l=new FileReader;l.onerror=function(){s()},l.onabort=function(){s()},l.onload=function(n){var l=n.target.result.split(",")[1];i.ajax({type:"POST",url:o,contentType:"application/json",data:JSON.stringify({language:t,format:a,isForced:r,data:l})}).then(e,s)},l.readAsDataURL(n)}))}},{key:"getInstalledPlugins",value:function(){var e=this.getUrl("Plugins",{});return this.getJSON(e)}},{key:"getUser",value:function(e){if(!e)throw new Error("Must supply a userId");var t=this.getUrl("Users/".concat(e));return this.getJSON(t)}},{key:"getStudio",value:function(e,t){if(!e)throw new Error("null name");var r={};t&&(r.userId=t);var n=this.getUrl("Studios/".concat(this.encodeName(e)),r);return this.getJSON(n)}},{key:"getGenre",value:function(e,t){if(!e)throw new Error("null name");var r={};t&&(r.userId=t);var n=this.getUrl("Genres/".concat(this.encodeName(e)),r);return this.getJSON(n)}},{key:"getMusicGenre",value:function(e,t){if(!e)throw new Error("null name");var r={};t&&(r.userId=t);var n=this.getUrl("MusicGenres/".concat(this.encodeName(e)),r);return this.getJSON(n)}},{key:"getArtist",value:function(e,t){if(!e)throw new Error("null name");var r={};t&&(r.userId=t);var n=this.getUrl("Artists/".concat(this.encodeName(e)),r);return this.getJSON(n)}},{key:"getPerson",value:function(e,t){if(!e)throw new Error("null name");var r={};t&&(r.userId=t);var n=this.getUrl("Persons/".concat(this.encodeName(e)),r);return this.getJSON(n)}},{key:"getPublicUsers",value:function(){var e=this.getUrl("users/public");return this.ajax({type:"GET",url:e,dataType:"json"},!1)}},{key:"getUsers",value:function(e){var t=this.getUrl("users",e||{});return this.getJSON(t)}},{key:"getParentalRatings",value:function(){var e=this.getUrl("Localization/ParentalRatings");return this.getJSON(e)}},{key:"getDefaultImageQuality",value:function(e){return"backdrop"===e.toLowerCase()?80:90}},{key:"getUserImageUrl",value:function(e,t){if(!e)throw new Error("null userId");t=t||{};var r="Users/".concat(e,"/Images/").concat(t.type);return null!=t.index&&(r+="/".concat(t.index)),J(this,t),delete t.type,delete t.index,this.getUrl(r,t)}},{key:"getImageUrl",value:function(e,t){if(!e)throw new Error("itemId cannot be empty");t=t||{};var r="Items/".concat(e,"/Images/").concat(t.type);return null!=t.index&&(r+="/".concat(t.index)),t.quality=t.quality||this.getDefaultImageQuality(t.type),this.normalizeImageOptions&&this.normalizeImageOptions(t),delete t.type,delete t.index,this.getUrl(r,t)}},{key:"getScaledImageUrl",value:function(e,t){if(!e)throw new Error("itemId cannot be empty");t=t||{};var r="Items/".concat(e,"/Images/").concat(t.type);return null!=t.index&&(r+="/".concat(t.index)),J(this,t),delete t.type,delete t.index,delete t.minScale,this.getUrl(r,t)}},{key:"getThumbImageUrl",value:function(e,t){if(!e)throw new Error("null item");return(t=t||{}).imageType="thumb",e.ImageTags&&e.ImageTags.Thumb?(t.tag=e.ImageTags.Thumb,this.getImageUrl(e.Id,t)):e.ParentThumbItemId?(t.tag=e.ImageTags.ParentThumbImageTag,this.getImageUrl(e.ParentThumbItemId,t)):null}},{key:"updateUserPassword",value:function(e,t,r){if(!e)return Promise.reject();var n=this.getUrl("Users/".concat(e,"/Password"));return this.ajax({type:"POST",url:n,data:JSON.stringify({CurrentPw:t||"",NewPw:r}),contentType:"application/json"})}},{key:"updateEasyPassword",value:function(e,t){if(e){var r=this.getUrl("Users/".concat(e,"/EasyPassword"));return this.ajax({type:"POST",url:r,data:JSON.stringify({NewPw:t}),contentType:"application/json"})}Promise.reject()}},{key:"resetUserPassword",value:function(e){if(!e)throw new Error("null userId");var t=this.getUrl("Users/".concat(e,"/Password"));return this.ajax({type:"POST",url:t,data:JSON.stringify({resetPassword:!0}),contentType:"application/json"})}},{key:"resetEasyPassword",value:function(e){if(!e)throw new Error("null userId");var t=this.getUrl("Users/".concat(e,"/EasyPassword"));return this.ajax({type:"POST",url:t,data:JSON.stringify({resetPassword:!0}),contentType:"application/json"})}},{key:"updateServerConfiguration",value:function(e){if(!e)throw new Error("null configuration");var t=this.getUrl("System/Configuration");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"updateNamedConfiguration",value:function(e,t){if(!t)throw new Error("null configuration");var r=this.getUrl("System/Configuration/".concat(e));return this.ajax({type:"POST",url:r,data:JSON.stringify(t),contentType:"application/json"})}},{key:"updateItem",value:function(e){if(!e)throw new Error("null item");var t=this.getUrl("Items/".concat(e.Id));return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"updatePluginSecurityInfo",value:function(e){var t=this.getUrl("Plugins/SecurityInfo");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"createUser",value:function(e){var t=this.getUrl("Users/New");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json",headers:{accept:"application/json"}})}},{key:"updateUser",value:function(e){if(!e)throw new Error("null user");var t=this.getUrl("Users/".concat(e.Id));return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"updateUserPolicy",value:function(e,t){if(!e)throw new Error("null userId");if(!t)throw new Error("null policy");var r=this.getUrl("Users/".concat(e,"/Policy"));return this.ajax({type:"POST",url:r,data:JSON.stringify(t),contentType:"application/json"})}},{key:"updateUserConfiguration",value:function(e,t){if(!e)throw new Error("null userId");if(!t)throw new Error("null configuration");var r=this.getUrl("Users/".concat(e,"/Configuration"));return this.ajax({type:"POST",url:r,data:JSON.stringify(t),contentType:"application/json"})}},{key:"updateScheduledTaskTriggers",value:function(e,t){if(!e)throw new Error("null id");if(!t)throw new Error("null triggers");var r=this.getUrl("ScheduledTasks/".concat(e,"/Triggers"));return this.ajax({type:"POST",url:r,data:JSON.stringify(t),contentType:"application/json"})}},{key:"updatePluginConfiguration",value:function(e,t){if(!e)throw new Error("null Id");if(!t)throw new Error("null configuration");var r=this.getUrl("Plugins/".concat(e,"/Configuration"));return this.ajax({type:"POST",url:r,data:JSON.stringify(t),contentType:"application/json"})}},{key:"getAncestorItems",value:function(e,t){if(!e)throw new Error("null itemId");var r={};t&&(r.userId=t);var n=this.getUrl("Items/".concat(e,"/Ancestors"),r);return this.getJSON(n)}},{key:"getItems",value:function(e,t){var r;return r="string"===c(e).toString().toLowerCase()?this.getUrl("Users/".concat(e,"/Items"),t):this.getUrl("Items",t),this.getJSON(r)}},{key:"getResumableItems",value:function(e,t){return this.isMinServerVersion("3.2.33")?this.getJSON(this.getUrl("Users/".concat(e,"/Items/Resume"),t)):this.getItems(e,Object.assign({SortBy:"DatePlayed",SortOrder:"Descending",Filters:"IsResumable",Recursive:!0,CollapseBoxSetItems:!1,ExcludeLocationTypes:"Virtual"},t))}},{key:"getMovieRecommendations",value:function(e){return this.getJSON(this.getUrl("Movies/Recommendations",e))}},{key:"getUpcomingEpisodes",value:function(e){return this.getJSON(this.getUrl("Shows/Upcoming",e))}},{key:"getUserViews",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,r=this.getUrl("Users/".concat(t||this.getCurrentUserId(),"/Views"),e);return this.getJSON(r)}},{key:"getArtists",value:function(e,t){if(!e)throw new Error("null userId");(t=t||{}).userId=e;var r=this.getUrl("Artists",t);return this.getJSON(r)}},{key:"getAlbumArtists",value:function(e,t){if(!e)throw new Error("null userId");(t=t||{}).userId=e;var r=this.getUrl("Artists/AlbumArtists",t);return this.getJSON(r)}},{key:"getGenres",value:function(e,t){if(!e)throw new Error("null userId");(t=t||{}).userId=e;var r=this.getUrl("Genres",t);return this.getJSON(r)}},{key:"getMusicGenres",value:function(e,t){if(!e)throw new Error("null userId");(t=t||{}).userId=e;var r=this.getUrl("MusicGenres",t);return this.getJSON(r)}},{key:"getPeople",value:function(e,t){if(!e)throw new Error("null userId");(t=t||{}).userId=e;var r=this.getUrl("Persons",t);return this.getJSON(r)}},{key:"getStudios",value:function(e,t){if(!e)throw new Error("null userId");(t=t||{}).userId=e;var r=this.getUrl("Studios",t);return this.getJSON(r)}},{key:"getLocalTrailers",value:function(e,t){if(!e)throw new Error("null userId");if(!t)throw new Error("null itemId");var r=this.getUrl("Users/".concat(e,"/Items/").concat(t,"/LocalTrailers"));return this.getJSON(r)}},{key:"getAdditionalVideoParts",value:function(e,t){if(!t)throw new Error("null itemId");var r={};e&&(r.userId=e);var n=this.getUrl("Videos/".concat(t,"/AdditionalParts"),r);return this.getJSON(n)}},{key:"getThemeMedia",value:function(e,t,r){if(!t)throw new Error("null itemId");var n={};e&&(n.userId=e),n.InheritFromParent=r||!1;var i=this.getUrl("Items/".concat(t,"/ThemeMedia"),n);return this.getJSON(i)}},{key:"getSearchHints",value:function(e){var t=this.getUrl("Search/Hints",e),r=this.serverId();return this.getJSON(t).then((function(e){return e.SearchHints.forEach((function(e){e.ServerId=r})),e}))}},{key:"getSpecialFeatures",value:function(e,t){if(!e)throw new Error("null userId");if(!t)throw new Error("null itemId");var r=this.getUrl("Users/".concat(e,"/Items/").concat(t,"/SpecialFeatures"));return this.getJSON(r)}},{key:"getDateParamValue",value:function(e){function t(e){return e<10?"0".concat(e):e}var r=e;return"".concat(r.getFullYear()).concat(t(r.getMonth()+1)).concat(t(r.getDate())).concat(t(r.getHours())).concat(t(r.getMinutes())).concat(t(r.getSeconds()))}},{key:"markPlayed",value:function(e,t,r){if(!e)throw new Error("null userId");if(!t)throw new Error("null itemId");var n={};r&&(n.DatePlayed=this.getDateParamValue(r));var i=this.getUrl("Users/".concat(e,"/PlayedItems/").concat(t),n);return this.ajax({type:"POST",url:i,dataType:"json"})}},{key:"markUnplayed",value:function(e,t){if(!e)throw new Error("null userId");if(!t)throw new Error("null itemId");var r=this.getUrl("Users/".concat(e,"/PlayedItems/").concat(t));return this.ajax({type:"DELETE",url:r,dataType:"json"})}},{key:"updateFavoriteStatus",value:function(e,t,r){if(!e)throw new Error("null userId");if(!t)throw new Error("null itemId");var n=this.getUrl("Users/".concat(e,"/FavoriteItems/").concat(t)),i=r?"POST":"DELETE";return this.ajax({type:i,url:n,dataType:"json"})}},{key:"updateUserItemRating",value:function(e,t,r){if(!e)throw new Error("null userId");if(!t)throw new Error("null itemId");var n=this.getUrl("Users/".concat(e,"/Items/").concat(t,"/Rating"),{likes:r});return this.ajax({type:"POST",url:n,dataType:"json"})}},{key:"getItemCounts",value:function(e){var t={};e&&(t.userId=e);var r=this.getUrl("Items/Counts",t);return this.getJSON(r)}},{key:"clearUserItemRating",value:function(e,t){if(!e)throw new Error("null userId");if(!t)throw new Error("null itemId");var r=this.getUrl("Users/".concat(e,"/Items/").concat(t,"/Rating"));return this.ajax({type:"DELETE",url:r,dataType:"json"})}},{key:"reportPlaybackStart",value:function(e){if(!e)throw new Error("null options");this.lastPlaybackProgressReport=0,this.lastPlaybackProgressReportTicks=null,g(this),w(this);var t=this.getUrl("Sessions/Playing");return this.ajax({type:"POST",data:JSON.stringify(e),contentType:"application/json",url:t})}},{key:"reportPlaybackProgress",value:function(e){if(!e)throw new Error("null options");var t=e.EventName||"timeupdate",r=h[t]||0,n=(new Date).getTime()-(this.lastPlaybackProgressReport||0),i=e.PositionTicks;if(n=5e7&&(r=0)}if(r<(void 0!==this.reportPlaybackProgressTimeout?this.reportPlaybackProgressTimeout:1e6)&&w(this),this.lastPlaybackProgressOptions=e,this.reportPlaybackProgressPromise)return Promise.resolve();var o,s=this,l=!1,u=function(){s.reportPlaybackProgressPromise===o&&(delete s.lastPlaybackProgressOptions,delete s.reportPlaybackProgressTimeout,delete s.reportPlaybackProgressPromise,delete s.reportPlaybackProgressCancel)},c=Math.max(0,r-n);return o=new Promise((function(e,t){return setTimeout(e,c)})).then((function(){return l?Promise.resolve():function(e){if(u(),!e)throw new Error("null options");s.lastPlaybackProgressReport=(new Date).getTime(),s.lastPlaybackProgressReportTicks=e.PositionTicks;var t=s.getUrl("Sessions/Playing/Progress");return s.ajax({type:"POST",data:JSON.stringify(e),contentType:"application/json",url:t})}(s.lastPlaybackProgressOptions)})).finally((function(){u()})),this.reportPlaybackProgressTimeout=r,this.reportPlaybackProgressPromise=o,this.reportPlaybackProgressCancel=function(){l=!0,u()},o}},{key:"reportOfflineActions",value:function(e){if(!e)throw new Error("null actions");var t=this.getUrl("Sync/OfflineActions");return this.ajax({type:"POST",data:JSON.stringify(e),contentType:"application/json",url:t})}},{key:"syncData",value:function(e){if(!e)throw new Error("null data");var t=this.getUrl("Sync/Data");return this.ajax({type:"POST",data:JSON.stringify(e),contentType:"application/json",url:t,dataType:"json"})}},{key:"getReadySyncItems",value:function(e){if(!e)throw new Error("null deviceId");var t=this.getUrl("Sync/Items/Ready",{TargetId:e});return this.getJSON(t)}},{key:"reportSyncJobItemTransferred",value:function(e){if(!e)throw new Error("null syncJobItemId");var t=this.getUrl("Sync/JobItems/".concat(e,"/Transferred"));return this.ajax({type:"POST",url:t})}},{key:"cancelSyncItems",value:function(e,t){if(!e)throw new Error("null itemIds");var r=this.getUrl("Sync/".concat(t||this.deviceId(),"/Items"),{ItemIds:e.join(",")});return this.ajax({type:"DELETE",url:r})}},{key:"reportPlaybackStopped",value:function(e){if(!e)throw new Error("null options");this.lastPlaybackProgressReport=0,this.lastPlaybackProgressReportTicks=null,v(this),w(this);var t=this.getUrl("Sessions/Playing/Stopped");return this.ajax({type:"POST",data:JSON.stringify(e),contentType:"application/json",url:t})}},{key:"sendPlayCommand",value:function(e,t){if(!e)throw new Error("null sessionId");if(!t)throw new Error("null options");var r=this.getUrl("Sessions/".concat(e,"/Playing"),t);return this.ajax({type:"POST",url:r})}},{key:"sendCommand",value:function(e,t){if(!e)throw new Error("null sessionId");if(!t)throw new Error("null command");var r={type:"POST",url:this.getUrl("Sessions/".concat(e,"/Command"))};return r.data=JSON.stringify(t),r.contentType="application/json",this.ajax(r)}},{key:"sendMessageCommand",value:function(e,t){if(!e)throw new Error("null sessionId");if(!t)throw new Error("null options");var r={type:"POST",url:this.getUrl("Sessions/".concat(e,"/Message"))};return r.data=JSON.stringify(t),r.contentType="application/json",this.ajax(r)}},{key:"sendPlayStateCommand",value:function(e,t,r){if(!e)throw new Error("null sessionId");if(!t)throw new Error("null command");var n=this.getUrl("Sessions/".concat(e,"/Playing/").concat(t),r||{});return this.ajax({type:"POST",url:n})}},{key:"getSyncPlayGroups",value:function(){var e=this.getUrl("SyncPlay/List");return this.ajax({type:"GET",url:e})}},{key:"createSyncPlayGroup",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/New");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"joinSyncPlayGroup",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/Join");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"leaveSyncPlayGroup",value:function(){var e=this.getUrl("SyncPlay/Leave");return this.ajax({type:"POST",url:e})}},{key:"sendSyncPlayPing",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/Ping");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlaySetNewQueue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/SetNewQueue");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlaySetPlaylistItem",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/SetPlaylistItem");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayRemoveFromPlaylist",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/RemoveFromPlaylist");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayMovePlaylistItem",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/MovePlaylistItem");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayQueue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/Queue");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayUnpause",value:function(){var e=this.getUrl("SyncPlay/Unpause");return this.ajax({type:"POST",url:e})}},{key:"requestSyncPlayPause",value:function(){var e=this.getUrl("SyncPlay/Pause");return this.ajax({type:"POST",url:e})}},{key:"requestSyncPlaySeek",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/Seek");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayNextItem",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/NextItem");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayPreviousItem",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/PreviousItem");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlaySetRepeatMode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/SetRepeatMode");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlaySetShuffleMode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/SetShuffleMode");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayBuffering",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/Buffering");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlayReady",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/Ready");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"requestSyncPlaySetIgnoreWait",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.getUrl("SyncPlay/SetIgnoreWait");return this.ajax({type:"POST",url:t,data:JSON.stringify(e),contentType:"application/json"})}},{key:"createPackageReview",value:function(e){var t=this.getUrl("Packages/Reviews/".concat(e.id),e);return this.ajax({type:"POST",url:t})}},{key:"getPackageReviews",value:function(e,t,r,n){if(!e)throw new Error("null packageId");var i={};t&&(i.MinRating=t),r&&(i.MaxRating=r),n&&(i.Limit=n);var a=this.getUrl("Packages/".concat(e,"/Reviews"),i);return this.getJSON(a)}},{key:"getSavedEndpointInfo",value:function(){return this._endPointInfo}},{key:"getEndpointInfo",value:function(){var e=this._endPointInfo;if(e)return Promise.resolve(e);var t=this;return this.getJSON(this.getUrl("System/Endpoint")).then((function(e){return k(t,e),e}))}},{key:"getLatestItems",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.getJSON(this.getUrl("Users/".concat(this.getCurrentUserId(),"/Items/Latest"),e))}},{key:"getFilters",value:function(e){return this.getJSON(this.getUrl("Items/Filters2",e))}},{key:"setSystemInfo",value:function(e){this._serverVersion=e.Version}},{key:"serverVersion",value:function(){return this._serverVersion}},{key:"isMinServerVersion",value:function(e){var t=this.serverVersion();return!!t&&function(e,t){e=e.split("."),t=t.split(".");for(var r=0,n=Math.max(e.length,t.length);ra)return 1}return 0}(t,e)>=0}},{key:"handleMessageReceived",value:function(e){E(this,e)}}])&&d(t.prototype,r),e}();function D(e){return(D="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function M(e,t){for(var r=0;rt.length&&0===e.indexOf(t))}function K(e,t){return z(e,t)?e.substr(t.length):e}function X(e){return e?B(e)?e:"local:".concat(e):null}function Y(e){e.Id=X(e.Id),e.SeriesId=X(e.SeriesId),e.SeasonId=X(e.SeasonId),e.AlbumId=X(e.AlbumId),e.ParentId=X(e.ParentId),e.ParentThumbItemId=X(e.ParentThumbItemId),e.ParentPrimaryImageItemId=X(e.ParentPrimaryImageItemId),e.PrimaryImageItemId=X(e.PrimaryImageItemId),e.ParentLogoItemId=X(e.ParentLogoItemId),e.ParentBackdropItemId=X(e.ParentBackdropItemId),e.ParentBackdropImageTags=null}function Z(e,t,r){return e.getLocalFolders(t,r).then((function(r){var n=null;return r.length>0&&(n={Name:e.downloadsTitleText||"Downloads",ServerId:t,Id:"localview",Type:"localview",IsFolder:!0}),Promise.resolve(n)}))}var $=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_(e,t)}(o,e);var t,r,n,i,a=(n=o,i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=V(n);if(i){var r=V(this).constructor;e=Reflect.construct(t,arguments,r)}else e=t.apply(this,arguments);return F(this,e)});function o(e,t,r,n,i,s,l){var u;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o),(u=a.call(this,e,t,r,n,i,s)).localAssetManager=l,u}return t=o,(r=[{key:"getPlaybackInfo",value:function(e,t,r){var n=function(){return R.prototype.getPlaybackInfo.call(i,e,t,r)};if(B(e))return this.localAssetManager.getLocalItem(this.serverId(),Q(e)).then((function(e){return{MediaSources:e.Item.MediaSources.map((function(e){return e.SupportsDirectPlay=!0,e.SupportsDirectStream=!1,e.SupportsTranscoding=!1,e.IsLocal=!0,e}))}}),n);var i=this;return this.localAssetManager.getLocalItem(this.serverId(),e).then((function(a){if(a){var o=a.Item.MediaSources.map((function(e){return e.SupportsDirectPlay=!0,e.SupportsDirectStream=!1,e.SupportsTranscoding=!1,e.IsLocal=!0,e}));return i.localAssetManager.fileExists(a.LocalPath).then((function(n){if(n){var a={MediaSources:o};return Promise.resolve(a)}return R.prototype.getPlaybackInfo.call(i,e,t,r)}),n)}return R.prototype.getPlaybackInfo.call(i,e,t,r)}),n)}},{key:"getItems",value:function(e,t){var r,n=this.serverInfo();if(n&&"localview"===t.ParentId)return this.getLocalFolders(n.Id,e).then((function(e){var t={Items:e,TotalRecordCount:e.length};return Promise.resolve(t)}));if(n&&t&&(B(t.ParentId)||B(t.SeriesId)||B(t.SeasonId)||q(t.ParentId)||B(t.AlbumIds)))return this.localAssetManager.getViewItems(n.Id,e,t).then((function(e){e.forEach((function(e){Y(e)}));var t={Items:e,TotalRecordCount:e.length};return Promise.resolve(t)}));if(t&&t.ExcludeItemIds&&t.ExcludeItemIds.length){var i=t.ExcludeItemIds.split(",");for(r=0;r0?Promise.resolve(r[0]):Promise.reject()})):B(t)&&(r=this.serverInfo())?this.localAssetManager.getLocalItem(r.Id,Q(t)).then((function(e){return Y(e.Item),Promise.resolve(e.Item)})):R.prototype.getItem.call(this,e,t)}},{key:"getLocalFolders",value:function(e){var t=this.serverInfo();return e=e||t.UserId,this.localAssetManager.getViews(t.Id,e)}},{key:"getNextUpEpisodes",value:function(e){return e.SeriesId&&B(e.SeriesId)?Promise.resolve({Items:[],TotalRecordCount:0}):R.prototype.getNextUpEpisodes.call(this,e)}},{key:"getSeasons",value:function(e,t){return B(e)?(t.SeriesId=e,t.IncludeItemTypes="Season",this.getItems(this.getCurrentUserId(),t)):R.prototype.getSeasons.call(this,e,t)}},{key:"getEpisodes",value:function(e,t){return B(t.SeasonId)||B(t.seasonId)||B(e)?(t.SeriesId=e,t.IncludeItemTypes="Episode",this.getItems(this.getCurrentUserId(),t)):R.prototype.getEpisodes.call(this,e,t)}},{key:"getLatestOfflineItems",value:function(e){e.SortBy="DateCreated",e.SortOrder="Descending";var t=this.serverInfo();return t?this.localAssetManager.getViewItems(t.Id,null,e).then((function(e){return e.forEach((function(e){Y(e)})),Promise.resolve(e)})):Promise.resolve([])}},{key:"getThemeMedia",value:function(e,t,r){return q(t)||B(t)||H(t)?Promise.reject():R.prototype.getThemeMedia.call(this,e,t,r)}},{key:"getSpecialFeatures",value:function(e,t){return B(t)?Promise.resolve([]):R.prototype.getSpecialFeatures.call(this,e,t)}},{key:"getSimilarItems",value:function(e,t){return B(e)?Promise.resolve({Items:[],TotalRecordCount:0}):R.prototype.getSimilarItems.call(this,e,t)}},{key:"updateFavoriteStatus",value:function(e,t,r){return B(t)?Promise.resolve():R.prototype.updateFavoriteStatus.call(this,e,t,r)}},{key:"getScaledImageUrl",value:function(e,t){if(B(e)||t&&t.itemid&&B(t.itemid)){var r=this.serverInfo(),n=Q(e);return this.localAssetManager.getImageUrl(r.Id,n,t)}return R.prototype.getScaledImageUrl.call(this,e,t)}},{key:"reportPlaybackStart",value:function(e){if(!e)throw new Error("null options");return B(e.ItemId)?Promise.resolve():R.prototype.reportPlaybackStart.call(this,e)}},{key:"reportPlaybackProgress",value:function(e){if(!e)throw new Error("null options");if(B(e.ItemId)){var t=this.serverInfo();if(t){var r=this;return this.localAssetManager.getLocalItem(t.Id,Q(e.ItemId)).then((function(t){var n=t.Item;return"Video"===n.MediaType||"AudioBook"===n.Type?(n.UserData=n.UserData||{},n.UserData.PlaybackPositionTicks=e.PositionTicks,n.UserData.PlayedPercentage=Math.min(n.RunTimeTicks?(e.PositionTicks||0)/n.RunTimeTicks*100:0,100),r.localAssetManager.addOrUpdateLocalItem(t)):Promise.resolve()}))}return Promise.resolve()}return R.prototype.reportPlaybackProgress.call(this,e)}},{key:"reportPlaybackStopped",value:function(e){if(!e)throw new Error("null options");if(B(e.ItemId)){var t=this.serverInfo(),r={Date:(new Date).getTime(),ItemId:Q(e.ItemId),PositionTicks:e.PositionTicks,ServerId:t.Id,Type:0,UserId:this.getCurrentUserId()};return this.localAssetManager.recordUserAction(r)}return R.prototype.reportPlaybackStopped.call(this,e)}},{key:"getIntros",value:function(e){return B(e)?Promise.resolve({Items:[],TotalRecordCount:0}):R.prototype.getIntros.call(this,e)}},{key:"getInstantMixFromItem",value:function(e,t){return B(e)?Promise.resolve({Items:[],TotalRecordCount:0}):R.prototype.getInstantMixFromItem.call(this,e,t)}},{key:"getItemDownloadUrl",value:function(e){if(B(e)){var t=this.serverInfo();if(t)return this.localAssetManager.getLocalItem(t.Id,Q(e)).then((function(e){return Promise.resolve(e.LocalPath)}))}return R.prototype.getItemDownloadUrl.call(this,e)}}])&&M(t.prototype,r),o}(R);function ee(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};!1!==t.reportCapabilities&&e.reportCapabilities(s),e.enableAutomaticBitrateDetection=t.enableAutomaticBitrateDetection,!1!==t.enableWebSocket&&(console.log("calling apiClient.ensureWebSocket"),e.ensureWebSocket())}function d(e,t,r){return l._getOrAddApiClient(e,t),(l.onLocalUserSignedIn?l.onLocalUserSignedIn.call(l,r):Promise.resolve()).then((function(){i.trigger(l,"localusersignedin",[r])}))}function h(e,t){return ae({type:"GET",url:ie(t,"System/Info"),dataType:"json",headers:{"X-MediaBrowser-Token":e.AccessToken}}).then((function(t){return ne(e,t),Promise.resolve()}),(function(){return e.UserId=null,e.AccessToken=null,Promise.resolve()}))}function v(e){var t={serverId:(e.serverInfo()||{}).Id};return e.logout().then((function(){i.trigger(l,"localusersignedout",[t])}),(function(){i.trigger(l,"localusersignedout",[t])}))}function f(e){if(e.Address&&e.EndpointAddress){var t=e.EndpointAddress.split(":")[0],r=e.Address.split(":");if(r.length>1){var n=r[r.length-1];isNaN(parseInt(n))||(t+=":".concat(n))}return se(t)}return null}function g(e,r,n,a,o,s){var u=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},v=t.credentials();if(!1===u.enableAutoLogin)e.UserId=null,e.AccessToken=null;else if(e.AccessToken&&o)return void h(e,a).then((function(){g(e,r,n,a,!1,s,u)}));ne(e,r),e.LastConnectionMode=n,!1!==u.updateDateLastAccessed&&(e.DateLastAccessed=(new Date).getTime()),t.addOrUpdateServer(v.Servers,e),t.credentials(v);var f={Servers:[]};f.ApiClient=l._getOrAddApiClient(e,a),f.ApiClient.setSystemInfo(r),f.State=e.AccessToken&&!1!==u.enableAutoLogin?"SignedIn":"ServerSignIn",f.Servers.push(e),f.ApiClient.enableAutomaticBitrateDetection=u.enableAutomaticBitrateDetection,f.ApiClient.updateServerInfo(e,a);var y=function(){s(f),i.trigger(l,"connected",[f])};"SignedIn"===f.State?(c(f.ApiClient,u),f.ApiClient.getCurrentUser().then((function(t){d(e,a,t).then(y,y)}),y)):y()}function y(e,t){var r={ManualAddress:e,LastConnectionMode:2};return l.connectToServer(r,t).then((function(e){return"Unavailable"===e.State?Promise.reject():e}))}this._apiClients=[],l._minServerVersion="3.2.33",l.appVersion=function(){return n},l.appName=function(){return r},l.capabilities=function(){return s},l.deviceId=function(){return o},l.credentialProvider=function(){return t},l.getServerInfo=function(e){return t.credentials().Servers.filter((function(t){return t.Id===e}))[0]},l.getLastUsedServer=function(){var e=t.credentials().Servers;return e.sort((function(e,t){return(t.DateLastAccessed||0)-(e.DateLastAccessed||0)})),e.length?e[0]:null},l.addApiClient=function(e){l._apiClients.push(e);var r=t.credentials().Servers.filter((function(t){return le(t.ManualAddress,e.serverAddress())||le(t.LocalAddress,e.serverAddress())||le(t.RemoteAddress,e.serverAddress())})),n=r.length?r[0]:e.serverInfo();if(n.DateLastAccessed=(new Date).getTime(),n.LastConnectionMode=2,n.ManualAddress=e.serverAddress(),e.manualAddressOnly&&(n.manualAddressOnly=!0),e.serverInfo(n),e.onAuthenticated=function(e,t){return u(e,t,{},!0)},!r.length){var a=t.credentials();a.Servers=[n],t.credentials(a)}i.trigger(l,"apiclientcreated",[e])},l.clearData=function(){console.log("connection manager clearing data");var e=t.credentials();e.Servers=[],t.credentials(e)},l._getOrAddApiClient=function(e,t){var s=l.getApiClient(e.Id);return s||(s=new R(t,r,n,a,o),l._apiClients.push(s),s.serverInfo(e),s.onAuthenticated=function(e,t){return u(e,t,{},!0)},i.trigger(l,"apiclientcreated",[s])),console.log("returning instance from getOrAddApiClient"),s},l.getOrCreateApiClient=function(e){var r=t.credentials().Servers.filter((function(t){return le(t.Id,e)}));if(!r.length)throw new Error("Server not found: ".concat(e));var n=r[0];return l._getOrAddApiClient(n,te(n,n.LastConnectionMode))},l.user=function(e){return new Promise((function(t,r){var n;e&&e.getCurrentUserId()&&e&&e.getCurrentUserId()&&e.getCurrentUser().then((function(e){var r=function(e){return e&&e.PrimaryImageTag?{url:l.getApiClient(e).getUserImageUrl(e.Id,{tag:e.PrimaryImageTag,type:"Primary"}),supportsParams:!0}:{url:null,supportsParams:!1}}(n=e);t({localUser:n,name:n?n.Name:null,imageUrl:r.url,supportsImageParams:r.supportsParams})}))}))},l.logout=function(){for(var e=[],r=0,n=l._apiClients.length;r=r.numAddresses&&i())}))}(n.url,n.mode,r,e,t)}),n.timeout)}))}))).then((function(n){var i=n.url,a=n.connectionMode;n=n.data,1===function(e,t){e=e.split("."),t=t.split(".");for(var r=0,n=Math.max(e.length,t.length);ra)return 1}return 0}(l.minServerVersion(),n.Version)?(console.log("minServerVersion requirement not met. Server version: "+n.Version),r({State:"ServerUpdateNeeded",Servers:[e]})):e.Id&&n.Id!==e.Id?(console.log("http request succeeded, but found a different server Id than what was expected"),re(0,r)):g(e,n,a,i,!0,r,t)}),(function(){re(0,r)}))}))},l.connectToAddress=function(e,t){if(!e)return Promise.reject();e=se(e);var r=[];/^[^:]+:\/\//.test(e)?r.push(e):(r.push("https://".concat(e)),r.push("http://".concat(e)));var n=0;return y(r[n],t).catch((function e(){return console.log("connectToAddress ".concat(r[n]," failed")),++n { - // the min with of the discord window allows for this many chars - const NUMBER_OF_CHARS = 12; - let string = ""; - for (let iX = 0; iX < NUMBER_OF_CHARS; iX++) { - if (percent > iX / NUMBER_OF_CHARS) { - string += "█"; - } else { - string += "▒"; - } - } - return string; -}; - -/** - * - * @param {String} string - * @returns {String} - */ -// TODO do this with something like wcwidth -function getMaxWidthString (string) { - const NUMBER_OF_CHARS = 12; - if (string.length > NUMBER_OF_CHARS) { - return string.slice(0, NUMBER_OF_CHARS - 3) + "..."; - } - return string; -}; - -class InterActivePlayMessage { - // musicplayermessage - // probably should have done events instead of callbacks - /** - * - * @param {Object} message - * @param {String} title - * @param {String} artist - * @param {String} imageURL - * @param {String} itemURL - * @param {Number} ticksLength - * @param {Function} onPrevious - * @param {Function} onPausePlay - * @param {Function} onStop - * @param {Function} onNext - * @param {Function} onRepeat - */ - constructor( - message, - title, - artist, - imageURL, - itemURL, - ticksLength, - onPrevious, - onPausePlay, - onStop, - onNext, - onRepeat, - playlistLenth, - ) { - this.ticksLength = ticksLength; - var exampleEmbed = { - color: 0x0099ff, - title: "Now Playing", - url: itemURL, - description: `\`\`${getMaxWidthString(title)}\`\` by \`\`${getMaxWidthString( - artist, - )}\`\``, - thumbnail: { - url: imageURL, - }, - fields: [], - timestamp: new Date(), - }; - if (typeof CONFIG["interactive-seek-bar-update-intervall"] === "number") { - exampleEmbed.fields.push({ - name: getProgressString(0 / this.ticksLength), - value: `${secondsToHms(0)} / ${secondsToHms( - ticksToSeconds(this.ticksLength), - )}`, - inline: false, - }); - } - if (playlistLenth) { - exampleEmbed.fields.push({ - name: `1 of ${playlistLenth}`, - value: "Playlist", - inline: false, - }); - } - message.channel - .send({ - embed: exampleEmbed, - }) - .then((val) => { - this.musicplayermessage = val; - val.react("⏮️"); - val.react("⏯️"); - val.react("⏹️"); - val.react("⏭️"); - val.react("🔁"); - }) - .catch(console.error); - - function reactionchange(reaction, user, musicplayermessage) { - if (reaction.message.id === musicplayermessage.id && !user.bot) { - try { - switch (reaction._emoji.name) { - case "⏮️": - onPrevious(); - break; - case "⏯️": - onPausePlay(); - break; - case "⏹️": - onStop(); - break; - case "⏭️": - onNext(); - break; - case "🔁": - onRepeat(); - break; - default: - break; - } - } catch (error) {} - } - } - - discordclientmanager - .getDiscordClient() - .on("messageReactionAdd", (reaction, user) => { - reactionchange(reaction, user, this.musicplayermessage); - }); - discordclientmanager - .getDiscordClient() - .on("messageReactionRemove", (reaction, user) => { - reactionchange(reaction, user, this.musicplayermessage); - }); - } - - updateProgress(ticks) { - if ( - typeof this.musicplayermessage !== "undefined" && - typeof this.musicplayermessage.embeds[0] !== "undefined" && - typeof this.musicplayermessage.embeds[0].fields[0] !== "undefined" - ) { - this.musicplayermessage.embeds[0].fields[0] = { - name: getProgressString(ticks / this.ticksLength), - value: `${secondsToHms(ticksToSeconds(ticks))} / ${secondsToHms( - ticksToSeconds(this.ticksLength), - )}`, - inline: false, - }; - - this.musicplayermessage.timestamp = new Date(); - this.musicplayermessage.edit(this.musicplayermessage.embeds[0]); - } - } - - updateCurrentSongMessage( - title, - artist, - imageURL, - itemURL, - ticksLength, - playlistIndex, - playlistLenth, - ) { - if (!this.musicplayermessage) { - log.error("Interactive play message was not found"); - return; - } - - if (this.musicplayermessage.embeds.length === 0) { - log.error("Interactive play message was unable to access embeds"); - return; - } - - this.musicplayermessage.embeds[0].url = itemURL; - this.musicplayermessage.embeds[0].description = `\`\`${getMaxWidthString( - title, - )}\`\` by \`\`${getMaxWidthString(artist)}\`\``; - this.musicplayermessage.embeds[0].thumbnail = { url: imageURL }; - const indexOfPlaylistMessage = - this.musicplayermessage.embeds[0].fields.findIndex((element) => { - return element.value === "Playlist"; - }); - if (indexOfPlaylistMessage === -1) { - this.musicplayermessage.embeds[0].fields.push({ - name: `${playlistIndex} of ${playlistLenth}`, - value: "Playlist", - inline: false, - }); - } else { - this.musicplayermessage.embeds[0].fields[ - indexOfPlaylistMessage - ].name = `${playlistIndex} of ${playlistLenth}`; - } - this.ticksLength = ticksLength; - - this.musicplayermessage.timestamp = new Date(); - this.musicplayermessage.edit(this.musicplayermessage.embeds[0]); - } - - destroy() { - this.musicplayermessage.delete(); - delete this; - } -} - -module.exports = InterActivePlayMessage; diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts new file mode 100644 index 0000000..d22f389 --- /dev/null +++ b/src/app.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +describe('AppController', () => { + let appController: AppController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); + + appController = app.get(AppController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/src/app.controller.ts b/src/app.controller.ts new file mode 100644 index 0000000..cce879e --- /dev/null +++ b/src/app.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { AppService } from './app.service'; + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} + + @Get() + getHello(): string { + return this.appService.getHello(); + } +} diff --git a/src/app.module.ts b/src/app.module.ts new file mode 100644 index 0000000..f34c13a --- /dev/null +++ b/src/app.module.ts @@ -0,0 +1,31 @@ +import { Module } from '@nestjs/common'; +import * as Joi from 'joi'; + +import { EventEmitterModule } from '@nestjs/event-emitter'; +import { ConfigModule } from '@nestjs/config'; + +import { AppController } from './app.controller'; +import { AppService } from './app.service'; +import { DiscordClientModule } from './clients/discord/discord.module'; +import { CommandHandlerModule } from './commands/handler/command-handler.module'; +import { JellyfinClientModule } from './clients/jellyfin/jellyfin.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + validationSchema: Joi.object({ + DISCORD_CLIENT_TOKEN: Joi.string().required(), + JELLYFIN_SERVER_ADDRESS: Joi.string().required(), + JELLYFIN_AUTHENTICATION_USERNAME: Joi.string().required(), + JELLYFIN_AUTHENTICATION_PASSWORD: Joi.string().required(), + }), + }), + EventEmitterModule.forRoot(), + DiscordClientModule, + JellyfinClientModule, + CommandHandlerModule, + ], + controllers: [AppController], + providers: [AppService], +}) +export class AppModule {} diff --git a/src/app.service.ts b/src/app.service.ts new file mode 100644 index 0000000..c699f07 --- /dev/null +++ b/src/app.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class AppService { + constructor() {} + getHello(): string { + return 'Hello World!'; + } +} diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts new file mode 100644 index 0000000..45078fc --- /dev/null +++ b/src/clients/discord/discord.module.ts @@ -0,0 +1,22 @@ +import { Module, OnModuleDestroy, OnModuleInit } from "@nestjs/common"; +import { DiscordService } from "./discord.service"; + +@Module({ + imports: [], + controllers: [], + providers: [DiscordService], + exports: [DiscordService], +}) +export class DiscordClientModule implements OnModuleInit, OnModuleDestroy { + + constructor(private discordService: DiscordService) {} + onModuleDestroy() { + this.discordService.destroyClient(); + } + + onModuleInit() { + this.discordService.initializeClient(); + this.discordService.registerEventHandlers(); + this.discordService.connectAndLogin(); + } +} \ No newline at end of file diff --git a/src/clients/discord/discord.service.ts b/src/clients/discord/discord.service.ts new file mode 100644 index 0000000..d43f7a8 --- /dev/null +++ b/src/clients/discord/discord.service.ts @@ -0,0 +1,46 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; + +import { ActivityType, Client } from 'discord.js'; + +@Injectable() +export class DiscordService { + private readonly logger = new Logger(DiscordService.name); + private client: Client; + + constructor(private eventEmitter: EventEmitter2) {} + + initializeClient() { + this.client = new Client({ + intents: ['Guilds', 'GuildMessages', 'MessageContent'], + }); + this.logger.debug('Initialized Discord client'); + } + + connectAndLogin() { + this.client.login(process.env.DISCORD_CLIENT_TOKEN); + } + + registerEventHandlers() { + this.client.on('ready', () => { + this.logger.debug(`Connected as '${this.client.user.tag}' and ready!`); + this.eventEmitter.emit('client.discord.ready'); + }); + + this.client.on('messageCreate', async (message) => { + if (message.author.bot) { + return; + } + + await message.channel.send('nice'); + }); + } + + destroyClient() { + this.client.destroy(); + } + + getClient() { + return this.client; + } +} diff --git a/src/clients/jellyfin/jellyfin.module.ts b/src/clients/jellyfin/jellyfin.module.ts new file mode 100644 index 0000000..dcefca0 --- /dev/null +++ b/src/clients/jellyfin/jellyfin.module.ts @@ -0,0 +1,22 @@ +import { Module, OnModuleDestroy, OnModuleInit } from "@nestjs/common"; +import { JellyfinService } from "./jellyfin.service"; + +@Module({ + imports: [], + controllers: [], + providers: [JellyfinService], + exports: [], +}) +export class JellyfinClientModule implements OnModuleInit, OnModuleDestroy { + + constructor(private jellyfinService: JellyfinService) {} + + onModuleDestroy() { + this.jellyfinService.destroy(); + } + + onModuleInit() { + this.jellyfinService.init(); + this.jellyfinService.authenticate(); + } +} \ No newline at end of file diff --git a/src/clients/jellyfin/jellyfin.service.ts b/src/clients/jellyfin/jellyfin.service.ts new file mode 100644 index 0000000..efa5dbb --- /dev/null +++ b/src/clients/jellyfin/jellyfin.service.ts @@ -0,0 +1,55 @@ +import { Injectable, Logger } from '@nestjs/common'; + +import { Api, Jellyfin } from '@jellyfin/sdk'; + +import { Constants } from 'src/utils/constants'; + +@Injectable() +export class JellyfinService { + private readonly logger = new Logger(JellyfinService.name); + private jellyfin: Jellyfin; + private api: Api; + + constructor() {} + + init() { + this.jellyfin = new Jellyfin({ + clientInfo: { + name: Constants.Metadata.ApplicationName, + version: Constants.Metadata.Version, + }, + deviceInfo: { + id: 'test', + name: 'test', + }, + }); + + this.api = this.jellyfin.createApi(process.env.JELLYFIN_SERVER_ADDRESS); + this.logger.debug('Created Jellyfin Client and Api'); + } + + authenticate() { + this.api + .authenticateUserByName( + process.env.JELLYFIN_AUTHENTICATION_USERNAME, + process.env.JELLYFIN_AUTHENTICATION_PASSWORD, + ) + .then((response) => { + this.logger.debug( + `Connected using user '${response.data.SessionInfo.UserId}'`, + ); + }).catch((test) => { + this.logger.error(test); + }); + } + + destroy() { + if (this.api === undefined) { + this.logger.warn( + 'Jellyfin Api Client was unexpectitly undefined. Graceful destroy has failed', + ); + return; + } + this.api.logout(); + } +} diff --git a/src/commands/abstractCommand.ts b/src/commands/abstractCommand.ts new file mode 100644 index 0000000..fd87fb7 --- /dev/null +++ b/src/commands/abstractCommand.ts @@ -0,0 +1,6 @@ +import { SlashCommandBuilder } from "discord.js"; + +export abstract class Command { + abstract builder(): SlashCommandBuilder; + abstract execute(): void; +} \ No newline at end of file diff --git a/src/commands/handler/command-handler.module.ts b/src/commands/handler/command-handler.module.ts new file mode 100644 index 0000000..f9a52b3 --- /dev/null +++ b/src/commands/handler/command-handler.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { DiscordClientModule } from '../../clients/discord/discord.module'; +import { CommandHandlerService } from './command-handler.service'; + +@Module({ + imports: [DiscordClientModule], + controllers: [], + providers: [CommandHandlerService], +}) +export class CommandHandlerModule {} diff --git a/src/commands/handler/command-handler.service.ts b/src/commands/handler/command-handler.service.ts new file mode 100644 index 0000000..2048c3c --- /dev/null +++ b/src/commands/handler/command-handler.service.ts @@ -0,0 +1,107 @@ +import { EmbedBuilder } from '@discordjs/builders'; +import { Injectable, Logger } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { + ApplicationCommand, + SlashCommandBuilder, + SlashCommandSubcommandBuilder, +} from 'discord.js'; +import { DiscordService } from 'src/clients/discord/discord.service'; +import { Command } from '../abstractCommand'; + +@Injectable() +export class CommandHandlerService { + private logger: Logger = new Logger(CommandHandlerService.name); + + constructor(private discordService: DiscordService) {} + + @OnEvent('client.discord.ready') + async handleOnDiscordClientReady() { + var commands = [ + new SlashCommandBuilder() + .setName('play') + .setDescription('Immideatly play a track') + .addStringOption((option) => + option + .setName('track') + .setDescription('the track name') + .setRequired(true), + ), + new SlashCommandBuilder() + .setName('summon') + .setDescription('Join your current voice channel'), + new SlashCommandBuilder() + .setName('disconnect') + .setDescription('Disconnect from the current voice channel'), + new SlashCommandBuilder() + .setName('enqueue') + .setDescription('Enqueue a track to the current playlist') + .addStringOption((option) => + option + .setName('track') + .setDescription('the track name') + .setRequired(true), + ), + new SlashCommandBuilder() + .setName('current') + .setDescription('Print the current track information'), + new SlashCommandBuilder() + .setName('pause') + .setDescription('Pause or resume the playback of the current track'), + new SlashCommandBuilder() + .setName('skip') + .setDescription('Skip the current track'), + new SlashCommandBuilder() + .setName('stop') + .setDescription( + 'Stop playback entirely and clear the current playlist', + ), + new SlashCommandBuilder() + .setName('help') + .setDescription('Get help for this Discord Bot'), + ]; + + await this.discordService + .getClient() + .application.commands.set(commands.map((x) => x.toJSON())); + + this.discordService + .getClient() + .on('interactionCreate', async (interaction) => { + if (!interaction.isChatInputCommand()) { + return; + } + + await interaction.reply({ + embeds: [ + new EmbedBuilder() + .setAuthor({ + name: 'Jellyfin Discord Bot', + iconURL: + 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', + url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + }) + .setTitle('Help Information') + .setDescription( + 'Jellyfin Discord Music bot is an easy way to broadcast your music collection to a Discord voicechannel.', + ) + .addFields([ + { + name: 'Report an issue', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', + inline: true, + }, + { + name: 'Source code', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + inline: true, + }, + ]) + .toJSON(), + ], + }); + }); + } +} diff --git a/src/discordclientmanager.js b/src/discordclientmanager.js deleted file mode 100644 index 04af08d..0000000 --- a/src/discordclientmanager.js +++ /dev/null @@ -1,15 +0,0 @@ -const Discord = require("discord.js"); - -var discordClient; - -function init() { - discordClient = new Discord.Client(); -} -function getDiscordClient() { - return discordClient; -} - -module.exports = { - getDiscordClient, - init, -}; diff --git a/src/dispachermanager.js b/src/dispachermanager.js deleted file mode 100644 index a2e8d0a..0000000 --- a/src/dispachermanager.js +++ /dev/null @@ -1,13 +0,0 @@ -var audioDispatcher; - -function setAudioDispatcher(par) { - audioDispatcher = par; -} -function getAudioDispatcher() { - return audioDispatcher; -} - -module.exports = { - setAudioDispatcher, - getAudioDispatcher, -}; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 87ae89f..0000000 --- a/src/index.js +++ /dev/null @@ -1,64 +0,0 @@ -const log = require("loglevel"); - -try { - const CONFIG = require("../config.json"); - - const jellyfinClientManager = require("./jellyfinclientmanager"); - - const discordclientmanager = require("./discordclientmanager"); - discordclientmanager.init(); - const discordClient = discordclientmanager.getDiscordClient(); - const { handleChannelMessage } = require("./messagehandler"); - - const prefix = require("loglevel-plugin-prefix"); - const chalk = require("chalk"); - const colors = { - TRACE: chalk.magenta, - DEBUG: chalk.cyan, - INFO: chalk.blue, - WARN: chalk.yellow, - ERROR: chalk.red, - }; - - log.setLevel(CONFIG["log-level"]); - - prefix.reg(log); - log.enableAll(); - - prefix.apply(log, { - format(level, name, timestamp) { - return `${chalk.gray(`[${timestamp}]`)} ${colors[level.toUpperCase()]( - level - )} ${chalk.green(`${name}:`)}`; - }, - }); - - prefix.apply(log.getLogger("critical"), { - format(level, name, timestamp) { - return chalk.red.bold(`[${timestamp}] ${level} ${name}:`); - }, - }); - - jellyfinClientManager.init(); - // TODO Error Checking as the apiclients is inefficent - jellyfinClientManager - .getJellyfinClient() - .authenticateUserByName( - CONFIG["jellyfin-username"], - CONFIG["jellyfin-password"] - ) - .then((response) => { - jellyfinClientManager - .getJellyfinClient() - .setAuthenticationInfo(response.AccessToken, response.SessionInfo.UserId); - }); - - discordClient.on("message", (message) => { - handleChannelMessage(message); - }); - - discordClient.login(CONFIG.token); -} catch (error) { - log.error(error); - console.error(error); -} diff --git a/src/interactivemsghandler.js b/src/interactivemsghandler.js deleted file mode 100644 index ba1fdff..0000000 --- a/src/interactivemsghandler.js +++ /dev/null @@ -1,112 +0,0 @@ -const InterActivePlayMessage = require("./InterActivePlayMessage"); -const CONFIG = require("../config.json"); - -const log = require("loglevel"); - -var interactivePlayMessage; - -var updateInterval; - -const init = ( - message, - title, - artist, - imageURL, - itemURL, - getProgress, - onPrevious, - onPausePlay, - onStop, - onNext, - onRepeat, - playlistLenth -) => { - if (typeof interactivePlayMessage !== "undefined") { - destroy(); - } - interactivePlayMessage = new InterActivePlayMessage( - message, - title, - artist, - imageURL, - itemURL, - getProgress, - onPrevious, - onPausePlay, - onStop, - onNext, - onRepeat, - playlistLenth - ); -}; - -const destroy = () => { - if (typeof interactivePlayMessage !== "undefined") { - interactivePlayMessage.destroy(); - interactivePlayMessage = undefined; - } else { - throw Error("No Interactive Message Found"); - } - - if (updateInterval !== "undefined") { - clearInterval(updateInterval); - updateInterval = undefined; - } -}; - -const hasMessage = () => { - if (typeof interactivePlayMessage === "undefined") { - return false; - } else { - return true; - } -}; - -/** - * - * @param {Function} callback function to retrieve current ticks - */ -const startUpate = (callback) => { - if ( - typeof CONFIG["interactive-seek-bar-update-intervall"] === "number" && - CONFIG["interactive-seek-bar-update-intervall"] > 0 - ) { - updateInterval = setInterval(() => { - interactivePlayMessage.updateProgress(callback()); - }, CONFIG["interactive-seek-bar-update-intervall"]); - } -}; - -const updateCurrentSongMessage = ( - title, - artist, - imageURL, - itemURL, - ticksLength, - playlistIndex, - playlistLenth -) => { - log.log(interactivePlayMessage); - - if (typeof interactivePlayMessage !== "undefined") { - interactivePlayMessage.updateCurrentSongMessage( - title, - artist, - imageURL, - itemURL, - ticksLength, - playlistIndex, - playlistLenth - ); - } else { - throw Error("No Interactive Message Found"); - } -}; - -module.exports = { - init, - destroy, - hasMessage, - startUpate, - updateCurrentSongMessage -}; diff --git a/src/jellyfinclientmanager.js b/src/jellyfinclientmanager.js deleted file mode 100644 index 89c5c86..0000000 --- a/src/jellyfinclientmanager.js +++ /dev/null @@ -1,29 +0,0 @@ -const { ApiClient, Events } = require("jellyfin-apiclient"); -const CONFIG = require("../config.json"); -const os = require("os"); - -var jellyfinClient; - -function init() { - jellyfinClient = new ApiClient( - CONFIG["server-address"], - CONFIG["jellyfin-app-name"], - "0.0.1", - os.hostname(), - os.hostname() - ); -} - -function getJellyfinClient() { - return jellyfinClient; -} - -function getJellyfinEvents() { - return Events; -} - -module.exports = { - getJellyfinClient, - getJellyfinEvents, - init, -}; diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..13cad38 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,8 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + await app.listen(3000); +} +bootstrap(); diff --git a/src/messagehandler.js b/src/messagehandler.js deleted file mode 100644 index 190f629..0000000 --- a/src/messagehandler.js +++ /dev/null @@ -1,308 +0,0 @@ -const CONFIG = require("../config.json"); -const Discord = require("discord.js"); -const { checkJellyfinItemIDRegex } = require("./util"); -const { hmsToSeconds, getDiscordEmbedError } = require("./util"); - -const discordclientmanager = require("./discordclientmanager"); -const jellyfinClientManager = require("./jellyfinclientmanager"); -const playbackmanager = require("./playbackmanager"); -const websocketHanler = require("./websockethandler"); -const discordClient = discordclientmanager.getDiscordClient(); - -var isSummendByPlay = false; - -// random Color of the Jellyfin Logo Gradient -function getRandomDiscordColor() { - const random = Math.random(); - function randomNumber(b, a) { - return ( - Math.floor(random * Math.pow(Math.pow(b - a, 2), 1 / 2)) + (b > a ? a : b) - ); - } - - const GRANDIENT_START = "#AA5CC3"; - const GRANDIENT_END = "#00A4DC"; - - let rS = GRANDIENT_START.slice(1, 3); - let gS = GRANDIENT_START.slice(3, 5); - let bS = GRANDIENT_START.slice(5, 7); - rS = parseInt(rS, 16); - gS = parseInt(gS, 16); - bS = parseInt(bS, 16); - - let rE = GRANDIENT_END.slice(1, 3); - let gE = GRANDIENT_END.slice(3, 5); - let bE = GRANDIENT_END.slice(5, 7); - rE = parseInt(rE, 16); - gE = parseInt(gE, 16); - bE = parseInt(bE, 16); - - return ( - "#" + - ("00" + randomNumber(rS, rE).toString(16)).substr(-2) + - ("00" + randomNumber(gS, gE).toString(16)).substr(-2) + - ("00" + randomNumber(bS, bE).toString(16)).substr(-2) - ); -} - -// Song Search, return the song itemID -async function searchForItemID(searchString) { - const response = await jellyfinClientManager - .getJellyfinClient() - .getSearchHints({ - searchTerm: searchString, - includeItemTypes: "Audio,MusicAlbum,Playlist", - }); - - if (response.TotalRecordCount < 1) { - throw Error("Found nothing"); - } else { - switch (response.SearchHints[0].Type) { - case "Audio": - return [response.SearchHints[0].ItemId]; - case "Playlist": - case "MusicAlbum": { - const resp = await jellyfinClientManager - .getJellyfinClient() - .getItems(jellyfinClientManager.getJellyfinClient().getCurrentUserId(), { - sortBy: "SortName", - sortOrder: "Ascending", - parentId: response.SearchHints[0].ItemId, - }); - const itemArray = []; - resp.Items.forEach((element) => { - itemArray.push(element.Id); - }); - return itemArray; - } - } - } -} - -function summon(voiceChannel) { - voiceChannel.join(); -} - -function summonMessage(message) { - if (!message.member.voice.channel) { - message.reply("please join a voice channel to summon me!"); - } else if (message.channel.type === "dm") { - message.reply("no dms"); - } else { - var desc = "**Joined Voice Channel** `"; - desc = desc.concat(message.member.voice.channel.name).concat("`"); - - summon(message.member.voice.channel); - - const vcJoin = new Discord.MessageEmbed() - .setColor(getRandomDiscordColor()) - .setTitle("Joined Channel") - .setTimestamp() - .setDescription("<:loudspeaker:757929476993581117> " + desc); - message.channel.send(vcJoin); - } -} - -async function playThis(message) { - const indexOfItemID = - message.content.indexOf(CONFIG["discord-prefix"] + "play") + - (CONFIG["discord-prefix"] + "play").length + - 1; - const argument = message.content.slice(indexOfItemID); - let items; - // check if play command was used with itemID - const regexresults = checkJellyfinItemIDRegex(argument); - if (regexresults) { - items = regexresults; - } else { - try { - items = await searchForItemID(argument); - } catch (e) { - const noSong = getDiscordEmbedError(e); - message.channel.send(noSong); - playbackmanager.stop( - isSummendByPlay - ? discordClient.user.client.voice.connections.first() - : undefined, - ); - return; - } - } - - playbackmanager.startPlaying( - discordClient.user.client.voice.connections.first(), - items, - 0, - 0, - isSummendByPlay, - ); - playbackmanager.spawnPlayMessage(message); -} - -async function addThis(message) { - const indexOfItemID = - message.content.indexOf(CONFIG["discord-prefix"] + "add") + - (CONFIG["discord-prefix"] + "add").length + - 1; - const argument = message.content.slice(indexOfItemID); - let items; - // check if play command was used with itemID - const regexresults = checkJellyfinItemIDRegex(argument); - if (regexresults) { - items = regexresults; - } else { - try { - items = await searchForItemID(argument); - } catch (e) { - const noSong = getDiscordEmbedError(e); - message.channel.send(noSong); - return; - } - } - - playbackmanager.addTracks(items); -} - -function handleChannelMessage(message) { - getRandomDiscordColor(); - - if (message.content.startsWith(CONFIG["discord-prefix"] + "summon")) { - isSummendByPlay = false; - - websocketHanler.openSocket(); - - summonMessage(message); - } else if ( - message.content.startsWith(CONFIG["discord-prefix"] + "disconnect") - ) { - playbackmanager.stop(); - jellyfinClientManager.getJellyfinClient().closeWebSocket(); - discordClient.user.client.voice.connections.forEach((element) => { - element.disconnect(); - }); - var desc = "**Left Voice Channel** `"; - desc = desc.concat(message.member.voice.channel.name).concat("`"); - const vcJoin = new Discord.MessageEmbed() - .setColor(getRandomDiscordColor()) - .setTitle("Left Channel") - .setTimestamp() - .setDescription("<:wave:757938481585586226> " + desc); - message.channel.send(vcJoin); - } else if ( - message.content.startsWith(CONFIG["discord-prefix"] + "pause") || - message.content.startsWith(CONFIG["discord-prefix"] + "resume") - ) { - try { - playbackmanager.playPause(); - const noPlay = new Discord.MessageEmbed() - .setColor(0xff0000) - .setTitle("<:play_pause:757940598106882049> " + "Paused/Resumed.") - .setTimestamp(); - message.channel.send(noPlay); - } catch (error) { - const errorMessage = getDiscordEmbedError(error); - message.channel.send(errorMessage); - } - } else if (message.content.startsWith(CONFIG["discord-prefix"] + "play")) { - if (discordClient.user.client.voice.connections.size < 1) { - summonMessage(message); - isSummendByPlay = true; - } - - playThis(message); - } else if (message.content.startsWith(CONFIG["discord-prefix"] + "stop")) { - if (isSummendByPlay) { - if (discordClient.user.client.voice.connections.size > 0) { - playbackmanager.stop(discordClient.user.client.voice.connections.first()); - } - } else { - playbackmanager.stop(); - } - } else if (message.content.startsWith(CONFIG["discord-prefix"] + "seek")) { - const indexOfArgument = - message.content.indexOf(CONFIG["discord-prefix"] + "seek") + - (CONFIG["discord-prefix"] + "seek").length + - 1; - const argument = message.content.slice(indexOfArgument); - try { - playbackmanager.seek(hmsToSeconds(argument) * 10000000); - } catch (error) { - const errorMessage = getDiscordEmbedError(error); - message.channel.send(errorMessage); - } - } else if (message.content.startsWith(CONFIG["discord-prefix"] + "skip")) { - try { - playbackmanager.nextTrack(); - } catch (error) { - const errorMessage = getDiscordEmbedError(error); - message.channel.send(errorMessage); - } - } else if (message.content.startsWith(CONFIG["discord-prefix"] + "add")) { - addThis(message); - } else if (message.content.startsWith(CONFIG["discord-prefix"] + "spawn")) { - try { - playbackmanager.spawnPlayMessage(message); - } catch (error) { - const errorMessage = getDiscordEmbedError(error); - message.channel.send(errorMessage); - } - } else if (message.content.startsWith(CONFIG["discord-prefix"] + "help")) { - /* eslint-disable quotes */ - const reply = new Discord.MessageEmbed() - .setColor(getRandomDiscordColor()) - .setTitle( - "<:musical_note:757938541123862638> " + - "Jellyfin Discord Music Bot" + - " <:musical_note:757938541123862638> ", - ) - .addFields( - { - name: `${CONFIG["discord-prefix"]}summon`, - value: "Join the channel the author of the message", - }, - { - name: `${CONFIG["discord-prefix"]}disconnect`, - value: "Disconnect from all current Voice Channels", - }, - { - name: `${CONFIG["discord-prefix"]}play`, - value: "Play the following item", - }, - { - name: `${CONFIG["discord-prefix"]}add`, - value: "Add the following item to the current playlist", - }, - { - name: `${CONFIG["discord-prefix"]}pause/resume`, - value: "Pause/Resume audio", - }, - { - name: `${CONFIG["discord-prefix"]}seek`, - value: "Where to Seek to in seconds or MM:SS", - }, - { - name: `${CONFIG["discord-prefix"]}skip`, - value: "Skip this Song", - }, - { - name: `${CONFIG["discord-prefix"]}spawn`, - value: "Spawns an Interactive Play Controller", - }, - { - name: `${CONFIG["discord-prefix"]}help`, - value: "Display this help message", - }, - { - name: `GitHub`, - value: - "Find the code for this bot at: https://github.com/KGT1/jellyfin-discord-music-bot", - }, - ); - message.channel.send(reply); - /* eslint-enable quotes */ - } -} - -module.exports = { - handleChannelMessage, -}; diff --git a/src/playbackmanager.js b/src/playbackmanager.js deleted file mode 100644 index 3c5c91d..0000000 --- a/src/playbackmanager.js +++ /dev/null @@ -1,535 +0,0 @@ -const interactivemsghandler = require("./interactivemsghandler"); -const CONFIG = require("../config.json"); -const discordclientmanager = require("./discordclientmanager"); -const log = require("loglevel"); - -const { - getAudioDispatcher, - setAudioDispatcher -} = require("./dispachermanager"); -const { ticksToSeconds } = require("./util"); - -// this whole thing should be a class but its probably too late now. - -var currentPlayingPlaylist; -var currentPlayingPlaylistIndex; -var isPaused; -var isRepeat; -var _disconnectOnFinish; -var _seek; - -const jellyfinClientManager = require("./jellyfinclientmanager"); -const { VoiceConnection } = require("discord.js"); - -function streamURLbuilder(itemID, bitrate) { - // so the server transcodes. Seems appropriate as it has the source file.(doesnt yet work i dont know why) - const supportedCodecs = "opus"; - const supportedContainers = "ogg,opus"; - return `${jellyfinClientManager - .getJellyfinClient() - .serverAddress()}/Audio/${itemID}/universal?UserId=${jellyfinClientManager - .getJellyfinClient() - .getCurrentUserId()}&DeviceId=${jellyfinClientManager - .getJellyfinClient() - .deviceId()}&MaxStreamingBitrate=${bitrate}&Container=${supportedContainers}&AudioCodec=${supportedCodecs}&api_key=${jellyfinClientManager - .getJellyfinClient() - .accessToken()}&TranscodingContainer=ts&TranscodingProtocol=hls`; -} - -function startPlaying( - voiceconnection = discordclientmanager - .getDiscordClient() - .user.client.voice.connections.first(), - itemIDPlaylist = currentPlayingPlaylist, - playlistIndex = currentPlayingPlaylistIndex, - seekTo, - disconnectOnFinish = _disconnectOnFinish -) { - log.debug( - "Start playing", - itemIDPlaylist[playlistIndex], - "with index", - playlistIndex, - "of list with length of", - itemIDPlaylist.length, - "in", - voiceconnection && voiceconnection.channel - ? '"' + - voiceconnection.channel.name + - '" (' + - voiceconnection.channel.id + - ")" - : "an unknown voice channel" - ); - - isPaused = false; - currentPlayingPlaylist = itemIDPlaylist; - currentPlayingPlaylistIndex = playlistIndex; - _disconnectOnFinish = disconnectOnFinish; - _seek = seekTo * 1000; - updatePlayMessage(); - - async function playasync() { - const url = streamURLbuilder( - itemIDPlaylist[playlistIndex], - voiceconnection.channel.bitrate - ); - setAudioDispatcher( - voiceconnection.play(url, { - seek: seekTo - }) - ); - if (seekTo) { - jellyfinClientManager - .getJellyfinClient() - .reportPlaybackProgress(getProgressPayload()); - } else { - jellyfinClientManager.getJellyfinClient().reportPlaybackStart({ - userID: `${jellyfinClientManager.getJellyfinClient().getCurrentUserId()}`, - itemID: `${itemIDPlaylist[playlistIndex]}`, - canSeek: true, - playSessionId: getPlaySessionId(), - playMethod: getPlayMethod() - }); - } - - getAudioDispatcher().on("finish", () => { - // report playback stop and start the same index again - if (isRepeat) { - reportPlaybackStoppedAndStartPlaying( - voiceconnection, - currentPlayingPlaylistIndex - ); - return; - } - - if (currentPlayingPlaylist.length < playlistIndex) { - if (disconnectOnFinish) { - stop(voiceconnection, currentPlayingPlaylist[playlistIndex - 1]); - return; - } - - stop(undefined, currentPlayingPlaylist[playlistIndex - 1]); - return; - } - - // play the next song in the playlist - reportPlaybackStoppedAndStartPlaying( - voiceconnection, - currentPlayingPlaylistIndex + 1 - ); - }); - } - playasync().catch((rsn) => { - console.error(rsn); - }); -} - -/** - * - * @param {VoiceConnection} voiceconnection - The voiceConnection where the bot should play - * @param {number} playlistIndex - The target playlist index - * @param {any} disconnectOnFinish - */ -const reportPlaybackStoppedAndStartPlaying = ( - voiceconnection, - playlistIndex, - disconnectOnFinish -) => { - const stopPayload = getStopPayload(); - - log.debug( - "Repeat and sending following payload as reportPlaybackStopped to the server: ", - stopPayload - ); - - jellyfinClientManager.getJellyfinClient().reportPlaybackStopped(stopPayload); - startPlaying(voiceconnection, undefined, playlistIndex, 0, disconnectOnFinish); -}; - -async function spawnPlayMessage(message) { - if (!message.channel) { - log.error("Unable to send play message in channel"); - log.debug(message); - return; - } - - log.debug( - "Sending play message to channel", - message.channel.name, - "(" + message.channel.id + ")" - ); - - const itemIdDetails = await jellyfinClientManager - .getJellyfinClient() - .getItem( - jellyfinClientManager.getJellyfinClient().getCurrentUserId(), - getItemId() - ); - const imageURL = await jellyfinClientManager - .getJellyfinClient() - .getImageUrl(itemIdDetails.AlbumId || getItemId(), { type: "Primary" }); - try { - interactivemsghandler.init( - message, - itemIdDetails.Name, - itemIdDetails.Artists[0] || "VA", - imageURL, - `${jellyfinClientManager - .getJellyfinClient() - .serverAddress()}/web/index.html#!/details?id=${itemIdDetails.AlbumId}`, - itemIdDetails.RunTimeTicks, - ticksToSeconds(getPostitionTicks()) > 10 ? previousTrack : seek, - playPause, - () => { - stop( - _disconnectOnFinish - ? discordclientmanager - .getDiscordClient() - .user.client.voice.connections.first() - : undefined - ); - }, - nextTrack, - () => { - setIsRepeat(!isRepeat); - }, - currentPlayingPlaylist.length - ); - if (typeof CONFIG["interactive-seek-bar-update-intervall"] === "number") { - interactivemsghandler.startUpate(getPostitionTicks); - } - } catch (error) { - log.error(error); - } -} - -async function updatePlayMessage() { - const itemId = getItemId(); - - if (!itemId) { - return; - } - - const jellyfinItemDetails = await jellyfinClientManager - .getJellyfinClient() - .getItem( - jellyfinClientManager.getJellyfinClient().getCurrentUserId(), - getItemId() - ); - - const primaryAlbumCover = await jellyfinClientManager - .getJellyfinClient() - .getImageUrl(jellyfinItemDetails.AlbumId || itemId, { type: "Primary" }); - - log.debug("Extracted primary Album cover url:", primaryAlbumCover); - - try { - interactivemsghandler.updateCurrentSongMessage( - jellyfinItemDetails.Name, - jellyfinItemDetails.Artists[0] || "VA", - primaryAlbumCover, - `${jellyfinClientManager - .getJellyfinClient() - .serverAddress()}/web/index.html#!/details?id=${ - jellyfinItemDetails.AlbumId - }`, - jellyfinItemDetails.RunTimeTicks, - currentPlayingPlaylistIndex + 1, - currentPlayingPlaylist.length - ); - } catch (exception) { - log.error("Exception during updating the current song message:", exception); - } -} - -/** - * @param {Number} toSeek - where to seek in ticks - */ -function seek(toSeek = 0) { - log.debug("Seeking to: ", toSeek); - - if (!getAudioDispatcher()) { - log.warn("Failed to seek because no song is playing."); - } - - // start playing the same track but with a specified time - startPlaying( - undefined, - undefined, - undefined, - ticksToSeconds(toSeek), - _disconnectOnFinish - ); - - // report change about playback progress to Jellyfin - jellyfinClientManager - .getJellyfinClient() - .reportPlaybackProgress(getProgressPayload()); -} -/** - * - * @param {Array} trackItemIdsArray - array of itemIDs to be added - */ -function addTracks(trackItemIdsArray) { - currentPlayingPlaylist = currentPlayingPlaylist.concat(trackItemIdsArray); - log.debug( - "Added tracks of", - trackItemIdsArray.length, - "to the current playlist" - ); -} - -function nextTrack() { - log.debug("Going to the next track..."); - - if (!currentPlayingPlaylist) { - log.warn( - "Can't go to the next track, because there is currently nothing playing" - ); - return; - } - - if (currentPlayingPlaylistIndex + 1 >= currentPlayingPlaylist.length) { - log.warn( - "Can't go to next track, because the current playing song is the last song." - ); - return; - } - - reportPlaybackStoppedAndStartPlaying( - undefined, - currentPlayingPlaylistIndex + 1, - _disconnectOnFinish - ); -} - -function previousTrack() { - log.debug("Going to the previous track..."); - - if (ticksToSeconds(getPostitionTicks()) > 10) { - return; - } - - // don't go to the previous track when nothing is playing - if (!currentPlayingPlaylist) { - log.warn( - "Can't go to the previous track, because there's currently nothing playing" - ); - return; - } - - if (currentPlayingPlaylistIndex - 1 < 0) { - log.warn( - "Can't go to the previous track, because this is the first track in the playlist" - ); - return; - } - - reportPlaybackStoppedAndStartPlaying( - undefined, - currentPlayingPlaylistIndex - 1, - _disconnectOnFinish - ); -} - -/** - * @param {Object=} disconnectVoiceConnection - Optional The voice Connection do disconnect from - */ -function stop(disconnectVoiceConnection, itemId = getItemId()) { - isPaused = true; - if (interactivemsghandler.hasMessage()) { - interactivemsghandler.destroy(); - } - if (disconnectVoiceConnection) { - disconnectVoiceConnection.disconnect(); - } - log.debug( - "stop playback and send following payload as reportPlaybackStopped to the server: ", - getStopPayload() - ); - jellyfinClientManager - .getJellyfinClient() - .reportPlaybackStopped(getStopPayload()); - if (getAudioDispatcher()) { - try { - getAudioDispatcher().destroy(); - } catch (error) { - console.error(error); - } - } - setAudioDispatcher(undefined); -} - -function pause() { - log.debug("Pausing the current track..."); - isPaused = true; - - // report to Jellyfin that the client has paused the track - jellyfinClientManager - .getJellyfinClient() - .reportPlaybackProgress(getProgressPayload()); - - // pause the track in the audio dispatcher - getAudioDispatcher().pause(true); -} - -function resume() { - log.debug("Resuming playback of the current track..."); - - isPaused = false; - - // report to Jellyfin that the client has resumed playback - jellyfinClientManager - .getJellyfinClient() - .reportPlaybackProgress(getProgressPayload()); - - // resume playback in the audio dispatcher - getAudioDispatcher().resume(); -} - -/** - * Pauses the playback of the current track is playing or - * resumes the placback if the current track is paused - */ -function playPause() { - const audioDispatcher = getAudioDispatcher(); - - if (!audioDispatcher) { - log.warn( - "Can't toggle the playback of the current song because there is nothing playing right now" - ); - return; - } - - if (audioDispatcher.paused) { - log.debug("Resuming playback because the current track is paused..."); - resume(); - return; - } - - log.debug("Pausing the playback because the current track is playing..."); - pause(); -} - -function getPostitionTicks() { - // this is very sketchy but i dont know how else to do it - return ( - (_seek + getAudioDispatcher().streamTime - getAudioDispatcher().pausedTime) * - 10000 - ); -} - -function getPlayMethod() { - // TODO figure out how to figure this out - return "DirectPlay"; -} - -function getRepeatMode() { - if (isRepeat) { - return "RepeatOne"; - } - - return "RepeatNone"; -} - -function getPlaylistItemId() { - return getItemId(); -} - -function getPlaySessionId() { - // TODO: generate a unique identifier for identification at Jellyfin. This may cause conflicts when running multiple bots on the same Jellyfin server. - return "ae2436edc6b91b11d72aeaa67f84e0ea"; -} - -function getNowPLayingQueue() { - return [ - { - Id: getItemId(), - // as I curently dont support Playlists - PlaylistItemId: getPlaylistItemId() - } - ]; -} - -function getCanSeek() { - return true; -} - -function getIsMuted() { - return false; -} - -function getVolumeLevel() { - return 100; -} - -function getItemId() { - if (typeof currentPlayingPlaylist !== "undefined") { - return currentPlayingPlaylist[currentPlayingPlaylistIndex]; - } - return undefined; -} - -function getIsPaused() { - // AudioDispacker Paused is to slow - - if (isPaused === undefined) { - isPaused = false; - } - - return isPaused; -} - -function setIsRepeat(arg) { - if (arg === undefined) { - if (!(isRepeat === undefined)) { - isRepeat = !isRepeat; - } - } - isRepeat = arg; -} - -function getProgressPayload() { - const payload = { - CanSeek: getCanSeek(), - IsMuted: getIsMuted(), - IsPaused: getIsPaused(), - ItemId: getItemId(), - MediaSourceId: getItemId(), - NowPlayingQueue: getNowPLayingQueue(), - PlayMethod: getPlayMethod(), - PlaySessionId: getPlaySessionId(), - PlaylistItemId: getPlaylistItemId(), - PositionTicks: getPostitionTicks(), - RepeatMode: getRepeatMode(), - VolumeLevel: getVolumeLevel(), - EventName: "pauseplayupdate" - }; - return payload; -} - -function getStopPayload() { - return { - userId: jellyfinClientManager.getJellyfinClient().getCurrentUserId(), - itemId: getItemId(), - sessionID: getPlaySessionId(), - playSessionId: getPlaySessionId(), - positionTicks: getPostitionTicks() - }; -} - -module.exports = { - startPlaying, - stop, - playPause, - resume, - pause, - seek, - setIsRepeat, - nextTrack, - previousTrack, - addTracks, - getPostitionTicks, - spawnPlayMessage -}; diff --git a/src/types/env.ts b/src/types/env.ts new file mode 100644 index 0000000..a57cce4 --- /dev/null +++ b/src/types/env.ts @@ -0,0 +1,3 @@ +export interface EnvironmentVariablesType { + DISCORD_CLIENT_TOKEN: string; +} \ No newline at end of file diff --git a/src/util.js b/src/util.js deleted file mode 100644 index a622945..0000000 --- a/src/util.js +++ /dev/null @@ -1,55 +0,0 @@ -function checkJellyfinItemIDRegex(strgintomatch) { - const regexresult = strgintomatch.match(/([0-9]|[a-f]){32}/); - if (regexresult) { - return [regexresult[0]]; - } else { - return undefined; - } -} - -function ticksToSeconds(ticks) { - return ticks / 10000000; -} - -function hmsToSeconds(str) { - var p = str.split(":"); - var s = 0; - var m = 1; - - while (p.length > 0) { - s += m * parseInt(p.pop(), 10); - m *= 60; - } - - return s; -} - -function secondsToHms(totalSeconds) { - const hours = Math.floor(totalSeconds / 3600); - totalSeconds %= 3600; - const minutes = Math.floor(totalSeconds / 60); - let seconds = Math.floor(totalSeconds % 60); - seconds = seconds < 10 && seconds > 0 ? `0${seconds}` : `${seconds}`; - if (hours > 0) { - return `${hours}:${minutes}:${seconds}`; - } else { - return `${minutes}:${seconds}`; - } -} - -function getDiscordEmbedError(e) { - const Discord = require("discord.js"); - return new Discord.MessageEmbed() - .setColor(0xff0000) - .setTitle("Error!") - .setTimestamp() - .setDescription("<:x:757935515445231651> " + e); -} - -module.exports = { - checkJellyfinItemIDRegex, - ticksToSeconds, - hmsToSeconds, - getDiscordEmbedError, - secondsToHms, -}; diff --git a/src/utils/constants.ts b/src/utils/constants.ts new file mode 100644 index 0000000..b9db489 --- /dev/null +++ b/src/utils/constants.ts @@ -0,0 +1,6 @@ +export const Constants = { + Metadata: { + Version: "0.0.1", + ApplicationName: "Discord Jellyfin Music Bot" + } +} \ No newline at end of file diff --git a/src/websockethandler.js b/src/websockethandler.js deleted file mode 100644 index 27b7724..0000000 --- a/src/websockethandler.js +++ /dev/null @@ -1,56 +0,0 @@ -const jellyfinClientManager = require("./jellyfinclientmanager"); -const playbackmanager = require("./playbackmanager"); -const { ticksToSeconds } = require("./util"); - -function openSocket() { - jellyfinClientManager.getJellyfinClient().openWebSocket(); - jellyfinClientManager.getJellyfinClient().reportCapabilities({ - PlayableMediaTypes: "Audio", - SupportsMediaControl: true, - SupportedCommands: "SetRepeatMode,Play,Playstate", - }); - jellyfinClientManager - .getJellyfinEvents() - .on(jellyfinClientManager.getJellyfinClient(), "message", (type, data) => { - if (data.MessageType === "Play") { - if (data.Data.PlayCommand === "PlayNow") { - playbackmanager.startPlaying( - undefined, - data.Data.ItemIds, - data.Data.StartIndex || 0, - 0, - false - ); - } - } else if (data.MessageType === "Playstate") { - if (data.Data.Command === "PlayPause") { - playbackmanager.playPause(); - } else if (data.Data.Command === "Stop") { - playbackmanager.stop(); - } else if (data.Data.Command === "Seek") { - // because the server sends seek an privious track at same time so i have to do timing - setTimeout(async () => { - playbackmanager.seek(data.Data.SeekPositionTicks); - }, 20); - } else if (data.Data.Command === "NextTrack") { - try { - playbackmanager.nextTrack(); - } catch (error) { - console.error(error); - } - } else if (data.Data.Command === "PreviousTrack") { - try { - if (ticksToSeconds(playbackmanager.getPostitionTicks()) < 10) { - playbackmanager.previousTrack(); - } - } catch (error) { - console.error(error); - } - } - } - }); -} - -module.exports = { - openSocket, -}; diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts new file mode 100644 index 0000000..50cda62 --- /dev/null +++ b/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/test/jest-e2e.json b/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..adb614c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } +} diff --git a/yarn.lock b/yarn.lock index 8081dbf..bc84168 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,2499 +1,7384 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/highlight@^7.10.4": - 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" - -"@discordjs/collection@^0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" - integrity sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== - -"@discordjs/form-data@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@discordjs/form-data/-/form-data-3.0.1.tgz#5c9e6be992e2e57d0dfa0e39979a850225fb4697" - integrity sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -"@discordjs/node-pre-gyp@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@discordjs/node-pre-gyp/-/node-pre-gyp-0.1.0.tgz#762b3b40be8567186bd7e79084befec4738a9e89" - integrity sha512-6u3EbK2x+j9bM3iK9/pE7BWLxOXZ1PvcsbDo3ZBdPocu95qPHj8zCVsBBk3Cao7V6o8QpwxUyJl6oVJ6T3ZgAg== - dependencies: - detect-libc "^1.0.3" - mkdirp "^0.5.5" - needle "^2.4.1" - nopt "^4.0.3" - npm-packlist "^1.4.8" - npmlog "^4.1.2" - rc "^1.2.8" - rimraf "^3.0.2" - semver "^7.3.0" - tar "^6.0.2" - -"@discordjs/opus@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@discordjs/opus/-/opus-0.3.3.tgz#d3a9165b817ca477164ee28315aef259c1cdab48" - integrity sha512-n3hUs4RY0K8cz8vJ2GiZE4EdJlexoxs1vGsaft5lZlAnU6wsZfncpv4px+HVOMKN8ddtjriGfsrG4lVkAyZcmQ== - dependencies: - "@discordjs/node-pre-gyp" "^0.1.0" - node-addon-api "^3.0.2" - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - 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== - -"@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== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -abab@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -acorn-globals@^4.3.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^6.0.1, acorn@^6.0.4: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -ajv@^6.10.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" - -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -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" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== - -array-includes@^3.1.4: - 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.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" - -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== - -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-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -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== - -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== - -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== - -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" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^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" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -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== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - 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" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -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== - -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" - -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== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -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== - -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.2: - 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" - -cssom@0.3.x, cssom@^0.3.4: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^1.1.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== - dependencies: - cssom "0.3.x" - -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" - -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -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.6, 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" - -debug@^4.0.1, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -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, 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== - -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-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - -discord.js@^12.3.1: - version "12.5.3" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.5.3.tgz#56820d473c24320871df9ea0bbc6b462f21cf85c" - integrity sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw== - dependencies: - "@discordjs/collection" "^0.1.6" - "@discordjs/form-data" "^3.0.1" - abort-controller "^3.0.0" - node-fetch "^2.6.1" - prism-media "^1.2.9" - setimmediate "^1.0.5" - tweetnacl "^1.0.3" - ws "^7.4.4" - -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" - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - -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" - -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== - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - 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.1" - 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.4" - 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.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - 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" - -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== - -escodegen@^1.11.0: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-standard@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== - -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-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-plugin-es@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" - integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.22.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-node@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== - dependencies: - eslint-plugin-es "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" - -eslint-plugin-promise@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" - integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== - -eslint-plugin-standard@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== - -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-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -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@^7.9.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -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, estraverse@^4.2.0: - 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: - 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== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -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== - -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-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, 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== - -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" - -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-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -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.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -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@~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" - -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.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== - -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" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -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@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -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" - -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" - -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@^7.1.3: - 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" - -globals@^13.6.0, globals@^13.9.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" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -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" - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - -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" - -iconv-lite@0.4.24, iconv-lite@^0.4.4: - 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" - -ignore-walk@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -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: - 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.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -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" - -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-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.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - 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.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: - 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-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - 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-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-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-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: - 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@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -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== - -jellyfin-apiclient@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.7.0.tgz#51e1d3fc099109eb463b60adbb91cfe4bce3dc84" - integrity sha512-aaUmhdvox02ge/ROSc8bsdmghjvfbP1QZ28yEPHaMHzY2GBaFczcCWXvEtl6dcQW+lfkemmFtf8D4OSvLHiFzw== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsdom@13.2.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.2.0.tgz#b1a0dbdadc255435262be8ea3723d2dba0d7eb3a" - integrity sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw== - dependencies: - abab "^2.0.0" - acorn "^6.0.4" - acorn-globals "^4.3.0" - array-equal "^1.0.0" - cssom "^0.3.4" - cssstyle "^1.1.1" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.0" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.0.9" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.5" - saxes "^3.1.5" - symbol-tree "^3.2.2" - tough-cookie "^2.5.0" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^6.1.2" - xml-name-validator "^3.0.0" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -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: - 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" - -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" - -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" - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -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" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.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.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.19: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loglevel-plugin-prefix@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" - integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== - -loglevel@^1.7.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== - -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" - -micromatch@^4.0.2: - 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" - -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" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -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@^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.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== - -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== - -needle@^2.4.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -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-addon-api@^3.0.2: - version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - -node-fetch@^2.6.0, 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" - -nodejs@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/nodejs/-/nodejs-0.0.0.tgz#4722fa2e18ac4eb73a42ae16d01e3584a12b7531" - integrity sha512-1V+0HwaB/dhxzidEFc4uJ3k52gLI4B6YBZgJIofjwYCSAkD6CI0me6TDBT2QM2nbGWNxCHcq9/wVynzQYZOhUg== - -nopt@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -npm-bundled@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - -npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.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== - -nwsapi@^2.0.9: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -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.0: - 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-inspect@^1.12.0, 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.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.3.tgz#d36b7700ddf0019abb6b1df1bb13f6445f79051f" - integrity sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -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" - -once@^1.3.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" - -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -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" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-tmpdir@^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== - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -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" - -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - -patch-package@^6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" - integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^2.0.0" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - open "^7.4.2" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-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.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== - -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== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -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== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prism-media@^1.2.9: - version "1.3.4" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.4.tgz#7951f26a9186b791dc8c820ff07310ec46a8a5f1" - integrity sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g== - -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== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -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== - -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== - -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== - -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.6: - 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" - -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.0.0, regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.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-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -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.1, resolve@^1.20.0, resolve@^1.22.0: - 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" - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.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" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - 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== - -"safer-buffer@>= 2.1.2 < 3", 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== - -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== - -saxes@^3.1.5: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== - dependencies: - xmlchars "^2.1.1" - -semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.1.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.2.1, semver@^7.3.0: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -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== - -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: - 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== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -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" - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - -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@^1.0.2 || 2 || 3 || 4", 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.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.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-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== - -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-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== - -symbol-tree@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tar@^6.0.2: - 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" - -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== - -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" - -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" - -tough-cookie@^2.3.3, tough-cookie@^2.5.0, 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@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== - dependencies: - punycode "^2.1.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -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" - -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" - -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== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -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-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -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== - -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== - -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" - -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@^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== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -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" - -w3c-hr-time@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== - dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" - xml-name-validator "^3.0.0" - -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== - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -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" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -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@^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" - -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -window@^4.2.7: - version "4.2.7" - resolved "https://registry.yarnpkg.com/window/-/window-4.2.7.tgz#e6fdf048a47cc33464e0b4bd2714e2b958418515" - integrity sha512-goCWCr6B57F6V5HK92lfxwiGlswWyiUtu2Tkyr0L/co2L1Dn5SDayF9ZDTVoYqxfHRt7VEEC7SKbjDBU7TJPpg== - dependencies: - jsdom "13.2.0" - -word-wrap@^1.2.3, 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== - -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== - -ws@^6.1.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -ws@^7.3.1, ws@^7.4.4: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -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== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@ampproject/remapping@npm:^2.1.0": + version: 2.2.0 + resolution: "@ampproject/remapping@npm:2.2.0" + dependencies: + "@jridgewell/gen-mapping": ^0.1.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 + languageName: node + linkType: hard + +"@angular-devkit/core@npm:14.2.1": + version: 14.2.1 + resolution: "@angular-devkit/core@npm:14.2.1" + dependencies: + ajv: 8.11.0 + ajv-formats: 2.1.1 + jsonc-parser: 3.1.0 + rxjs: 6.6.7 + source-map: 0.7.4 + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + checksum: 67a4c57a6e51bbb7151fa57d5d27e2360dea55b125343ff79939fc7c15dc88b6d027303f98024c3bef3a994a901212ddb2f3d6fd6f6433760e1b7bb504f0648f + languageName: node + linkType: hard + +"@angular-devkit/core@npm:14.2.2": + version: 14.2.2 + resolution: "@angular-devkit/core@npm:14.2.2" + dependencies: + ajv: 8.11.0 + ajv-formats: 2.1.1 + jsonc-parser: 3.1.0 + rxjs: 6.6.7 + source-map: 0.7.4 + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + checksum: 63a38df8a6983eb07933cd4b05ebbdc0f7690ab88ebcb739c15931d048083d84527316d03f81aa37ae2ae601790d789fc4da7a764f11be27ab7edb79cf7528e6 + languageName: node + linkType: hard + +"@angular-devkit/schematics-cli@npm:14.2.2": + version: 14.2.2 + resolution: "@angular-devkit/schematics-cli@npm:14.2.2" + dependencies: + "@angular-devkit/core": 14.2.2 + "@angular-devkit/schematics": 14.2.2 + ansi-colors: 4.1.3 + inquirer: 8.2.4 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + bin: + schematics: bin/schematics.js + checksum: 024c334cc14bbdda8eb1e7ab2e93b908828a310ec8e0dcd8f97c6e25edb335073da706d5ba3558daafc564285bf5f1945cb1804a034f2cb8aa353813dce04fc4 + languageName: node + linkType: hard + +"@angular-devkit/schematics@npm:14.2.1": + version: 14.2.1 + resolution: "@angular-devkit/schematics@npm:14.2.1" + dependencies: + "@angular-devkit/core": 14.2.1 + jsonc-parser: 3.1.0 + magic-string: 0.26.2 + ora: 5.4.1 + rxjs: 6.6.7 + checksum: 74af9c50b0953ae8a4cf8390d935b1acc28acb4f8816f771aa08cd9293ecdbd2bc07a3be619f4eb779e3ccfd4a71e367480787739ca47a5ff272f61c5f9ff28d + languageName: node + linkType: hard + +"@angular-devkit/schematics@npm:14.2.2": + version: 14.2.2 + resolution: "@angular-devkit/schematics@npm:14.2.2" + dependencies: + "@angular-devkit/core": 14.2.2 + jsonc-parser: 3.1.0 + magic-string: 0.26.2 + ora: 5.4.1 + rxjs: 6.6.7 + checksum: 4a7cc5c51a3a3e12de6450e8e65e66799ae576ed78830e27eb0113e43009299cfa30cf052b1963945eb806a084cdaf7f5df2132822a6f92ca0e3be31d5d6ce3f + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/code-frame@npm:7.18.6" + dependencies: + "@babel/highlight": ^7.18.6 + checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.20.0": + version: 7.20.5 + resolution: "@babel/compat-data@npm:7.20.5" + checksum: 523790c43ef6388fae91d1ca9acf1ab0e1b22208dcd39c0e5e7a6adf0b48a133f1831be8d5931a72ecd48860f3e3fb777cb89840794abd8647a5c8e5cfab484e + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": + version: 7.20.5 + resolution: "@babel/core@npm:7.20.5" + dependencies: + "@ampproject/remapping": ^2.1.0 + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.20.5 + "@babel/helper-compilation-targets": ^7.20.0 + "@babel/helper-module-transforms": ^7.20.2 + "@babel/helpers": ^7.20.5 + "@babel/parser": ^7.20.5 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.5 + "@babel/types": ^7.20.5 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.1 + semver: ^6.3.0 + checksum: 9547f1e6364bc58c3621e3b17ec17f0d034ff159e5a520091d9381608d40af3be4042dd27c20ad7d3e938422d75850ac56a3758d6801d65df701557af4bd244b + languageName: node + linkType: hard + +"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.7.2": + version: 7.20.5 + resolution: "@babel/generator@npm:7.20.5" + dependencies: + "@babel/types": ^7.20.5 + "@jridgewell/gen-mapping": ^0.3.2 + jsesc: ^2.5.1 + checksum: 31c10d1e122f08cf755a24bd6f5d197f47eceba03f1133759687d00ab72d210e60ba4011da42f368b6e9fa85cbfda7dc4adb9889c2c20cc5c34bb2d57c1deab7 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.20.0": + version: 7.20.0 + resolution: "@babel/helper-compilation-targets@npm:7.20.0" + dependencies: + "@babel/compat-data": ^7.20.0 + "@babel/helper-validator-option": ^7.18.6 + browserslist: ^4.21.3 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: bc183f2109648849c8fde0b3c5cf08adf2f7ad6dc617b546fd20f34c8ef574ee5ee293c8d1bd0ed0221212e8f5907cdc2c42097870f1dcc769a654107d82c95b + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.18.9": + version: 7.18.9 + resolution: "@babel/helper-environment-visitor@npm:7.18.9" + checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helper-function-name@npm:7.19.0" + dependencies: + "@babel/template": ^7.18.10 + "@babel/types": ^7.19.0 + checksum: eac1f5db428ba546270c2b8d750c24eb528b8fcfe50c81de2e0bdebf0e20f24bec688d4331533b782e4a907fad435244621ca2193cfcf80a86731299840e0f6e + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-hoist-variables@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-module-imports@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-module-transforms@npm:7.20.2" + dependencies: + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-module-imports": ^7.18.6 + "@babel/helper-simple-access": ^7.20.2 + "@babel/helper-split-export-declaration": ^7.18.6 + "@babel/helper-validator-identifier": ^7.19.1 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.1 + "@babel/types": ^7.20.2 + checksum: 33a60ca115f6fce2c9d98e2a2e5649498aa7b23e2ae3c18745d7a021487708fc311458c33542f299387a0da168afccba94116e077f2cce49ae9e5ab83399e8a2 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.20.2 + resolution: "@babel/helper-plugin-utils@npm:7.20.2" + checksum: f6cae53b7fdb1bf3abd50fa61b10b4470985b400cc794d92635da1e7077bb19729f626adc0741b69403d9b6e411cddddb9c0157a709cc7c4eeb41e663be5d74b + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-simple-access@npm:7.20.2" + dependencies: + "@babel/types": ^7.20.2 + checksum: ad1e96ee2e5f654ffee2369a586e5e8d2722bf2d8b028a121b4c33ebae47253f64d420157b9f0a8927aea3a9e0f18c0103e74fdd531815cf3650a0a4adca11a1 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-split-export-declaration@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.19.4": + version: 7.19.4 + resolution: "@babel/helper-string-parser@npm:7.19.4" + checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-validator-option@npm:7.18.6" + checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.20.5": + version: 7.20.6 + resolution: "@babel/helpers@npm:7.20.6" + dependencies: + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.5 + "@babel/types": ^7.20.5 + checksum: f03ec6eb2bf8dc7cdfe2569ee421fd9ba6c7bac6c862d90b608ccdd80281ebe858bc56ca175fc92b3ac50f63126b66bbd5ec86f9f361729289a20054518f1ac5 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/highlight@npm:7.18.6" + dependencies: + "@babel/helper-validator-identifier": ^7.18.6 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.20.5": + version: 7.20.5 + resolution: "@babel/parser@npm:7.20.5" + bin: + parser: ./bin/babel-parser.js + checksum: e8d514ce0aa74d56725bd102919a49fa367afef9cd8208cf52f670f54b061c4672f51b4b7980058ab1f5fe73615fe4dc90720ab47bbcebae07ad08d667eda318 + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": ^7.12.13 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.20.0 + resolution: "@babel/plugin-syntax-typescript@npm:7.20.0" + dependencies: + "@babel/helper-plugin-utils": ^7.19.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6189c0b5c32ba3c9a80a42338bd50719d783b20ef29b853d4f03929e971913d3cefd80184e924ae98ad6db09080be8fe6f1ffde9a6db8972523234f0274d36f7 + languageName: node + linkType: hard + +"@babel/template@npm:^7.18.10, @babel/template@npm:^7.3.3": + version: 7.18.10 + resolution: "@babel/template@npm:7.18.10" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/parser": ^7.18.10 + "@babel/types": ^7.18.10 + checksum: 93a6aa094af5f355a72bd55f67fa1828a046c70e46f01b1606e6118fa1802b6df535ca06be83cc5a5e834022be95c7b714f0a268b5f20af984465a71e28f1473 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.20.1, @babel/traverse@npm:^7.20.5, @babel/traverse@npm:^7.7.2": + version: 7.20.5 + resolution: "@babel/traverse@npm:7.20.5" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.20.5 + "@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.20.5 + "@babel/types": ^7.20.5 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: c7fed468614aab1cf762dda5df26e2cfcd2b1b448c9d3321ac44786c4ee773fb0e10357e6593c3c6a648ae2e0be6d90462d855998dc10e3abae84de99291e008 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.20.5 + resolution: "@babel/types@npm:7.20.5" + dependencies: + "@babel/helper-string-parser": ^7.19.4 + "@babel/helper-validator-identifier": ^7.19.1 + to-fast-properties: ^2.0.0 + checksum: 773f0a1ad9f6ca5c5beaf751d1d8d81b9130de87689d1321fc911d73c3b1167326d66f0ae086a27fb5bfc8b4ee3ffebf1339be50d3b4d8015719692468c31f2d + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + languageName: node + linkType: hard + +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@discordjs/builders@npm:^1.4.0": + version: 1.4.0 + resolution: "@discordjs/builders@npm:1.4.0" + dependencies: + "@discordjs/util": ^0.1.0 + "@sapphire/shapeshift": ^3.7.1 + discord-api-types: ^0.37.20 + fast-deep-equal: ^3.1.3 + ts-mixer: ^6.0.2 + tslib: ^2.4.1 + checksum: 3089ea5dc58e62c0314fd5fd995281d183d1a938d14a71b89c47b71b6cdf4cdf9f8c2ee1d04ca59e6bdde583b8bb785f3b53d917fb155cade8d27ac0dedbc942 + languageName: node + linkType: hard + +"@discordjs/collection@npm:^1.3.0": + version: 1.3.0 + resolution: "@discordjs/collection@npm:1.3.0" + checksum: 5ca6e9757f4c1e19564a0ac96ebfcabd1a83bf3ac0270034a0ea887f418f196caea4b54ebac5aaf0fc28d98f58f12794a6242d07acf08c946f23aa2e0047e87d + languageName: node + linkType: hard + +"@discordjs/node-pre-gyp@npm:^0.4.5": + version: 0.4.5 + resolution: "@discordjs/node-pre-gyp@npm:0.4.5" + dependencies: + detect-libc: ^2.0.0 + https-proxy-agent: ^5.0.0 + make-dir: ^3.1.0 + node-fetch: ^2.6.7 + nopt: ^5.0.0 + npmlog: ^5.0.1 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.11 + bin: + node-pre-gyp: bin/node-pre-gyp + checksum: 60ba7bfdb9e002ff6ff47086312ca446e97b2dfa695a581a1b49eb94d2c716ad509166d97b66b76096d8fd33b9aaa4bb88dad083980821b7691aa55ebccdb5e4 + languageName: node + linkType: hard + +"@discordjs/opus@npm:^0.9.0": + version: 0.9.0 + resolution: "@discordjs/opus@npm:0.9.0" + dependencies: + "@discordjs/node-pre-gyp": ^0.4.5 + node-addon-api: ^5.0.0 + checksum: 1bb17efcece86b5d0f025dcb301e87a01c50db3267776b608cc103e3f6fbbb0b0ea4e61dcb5700fbeb27039b50c771db9efc1b7af628b9c2329120f497e1c20e + languageName: node + linkType: hard + +"@discordjs/rest@npm:^1.4.0": + version: 1.4.0 + resolution: "@discordjs/rest@npm:1.4.0" + dependencies: + "@discordjs/collection": ^1.3.0 + "@discordjs/util": ^0.1.0 + "@sapphire/async-queue": ^1.5.0 + "@sapphire/snowflake": ^3.2.2 + discord-api-types: ^0.37.20 + file-type: ^18.0.0 + tslib: ^2.4.1 + undici: ^5.13.0 + checksum: 78e09f3249277b7b0f826032482ef266f4f6f62da90fd11d62fc4b31247b1d67662ee1abd7d276ac47dc066652696cbe7e0fde1fc6174e4efc37650b12c87b8b + languageName: node + linkType: hard + +"@discordjs/util@npm:^0.1.0": + version: 0.1.0 + resolution: "@discordjs/util@npm:0.1.0" + checksum: 880e15cd761437a21cf17b8a9dab50e7e5418fcc77dc34037c31a52b871fab1b958218ab6218aafd20af8b7a4e658a705d3f257268324773a285d9a06368c1b9 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^1.3.3": + version: 1.3.3 + resolution: "@eslint/eslintrc@npm:1.3.3" + 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 + checksum: f03e9d6727efd3e0719da2051ea80c0c73d20e28c171121527dbb868cd34232ca9c1d0525a66e517a404afea26624b1e47895b6a92474678418c2f50c9566694 + languageName: node + linkType: hard + +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 + languageName: node + linkType: hard + +"@hapi/hoek@npm:^9.0.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 + languageName: node + linkType: hard + +"@hapi/topo@npm:^5.0.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.6": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" + dependencies: + "@humanwhocodes/object-schema": ^1.2.1 + debug: ^4.1.1 + minimatch: ^3.0.5 + checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.1": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: ^5.3.1 + find-up: ^4.1.0 + get-package-type: ^0.1.0 + js-yaml: ^3.13.1 + resolve-from: ^5.0.0 + checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + languageName: node + linkType: hard + +"@jellyfin/sdk@npm:^0.7.0": + version: 0.7.0 + resolution: "@jellyfin/sdk@npm:0.7.0" + dependencies: + axios: 0.27.2 + compare-versions: 5.0.1 + checksum: d7ddae88464e0f2276ec7a793f7e525098a56d96491a450d5e859bf46d74e473a4b4bd5dce2a64ef80484e12e23c14934a4cb20429e89a3c41e52e817e3f31d4 + languageName: node + linkType: hard + +"@jest/console@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/console@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + slash: ^3.0.0 + checksum: fe50d98d26d02ce2901c76dff4bd5429a33c13affb692c9ebf8a578ca2f38a5dd854363d40d6c394f215150791fd1f692afd8e730a4178dda24107c8dfd9750a + languageName: node + linkType: hard + +"@jest/core@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/core@npm:28.1.3" + dependencies: + "@jest/console": ^28.1.3 + "@jest/reporters": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^28.1.3 + jest-config: ^28.1.3 + jest-haste-map: ^28.1.3 + jest-message-util: ^28.1.3 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.3 + jest-resolve-dependencies: ^28.1.3 + jest-runner: ^28.1.3 + jest-runtime: ^28.1.3 + jest-snapshot: ^28.1.3 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + jest-watcher: ^28.1.3 + micromatch: ^4.0.4 + pretty-format: ^28.1.3 + rimraf: ^3.0.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: cb79f34bafc4637e7130df12257f5b29075892a2be2c7f45c6d4c0420853e80b5dae11016e652530eb234f4c44c00910cdca3c2cd86275721860725073f7d9b4 + languageName: node + linkType: hard + +"@jest/environment@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/environment@npm:28.1.3" + dependencies: + "@jest/fake-timers": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + jest-mock: ^28.1.3 + checksum: 14c496b84aef951df33128cea68988e9de43b2e9d62be9f9c4308d4ac307fa345642813679f80d0a4cedeb900cf6f0b6bb2b92ce089528e8721f72295fdc727f + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/expect-utils@npm:28.1.3" + dependencies: + jest-get-type: ^28.0.2 + checksum: 808ea3a68292a7e0b95490fdd55605c430b4cf209ea76b5b61bfb2a1badcb41bc046810fe4e364bd5fe04663978aa2bd73d8f8465a761dd7c655aeb44cf22987 + languageName: node + linkType: hard + +"@jest/expect@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/expect@npm:28.1.3" + dependencies: + expect: ^28.1.3 + jest-snapshot: ^28.1.3 + checksum: 4197f6fdddc33dc45ba4e838f992fc61839c421d7aed0dfe665ef9c2f172bb1df8a8cac9cecee272b40e744a326da521d5e182709fe82a0b936055bfffa3b473 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/fake-timers@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@sinonjs/fake-timers": ^9.1.2 + "@types/node": "*" + jest-message-util: ^28.1.3 + jest-mock: ^28.1.3 + jest-util: ^28.1.3 + checksum: cec14d5b14913a54dce64a62912c5456235f5d90b509ceae19c727565073114dae1aaf960ac6be96b3eb94789a3a758b96b72c8fca7e49a6ccac415fbc0321e1 + languageName: node + linkType: hard + +"@jest/globals@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/globals@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/expect": ^28.1.3 + "@jest/types": ^28.1.3 + checksum: 3504bb23de629d466c6f2b6b75d2e1c1b10caccbbcfb7eaa82d22cc37711c8e364c243929581184846605c023b475ea6c42c2e3ea5994429a988d8d527af32cd + languageName: node + linkType: hard + +"@jest/reporters@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/reporters@npm:28.1.3" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@jridgewell/trace-mapping": ^0.3.13 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + jest-worker: ^28.1.3 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + terminal-link: ^2.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: a7440887ce837922cbeaa64c3232eb48aae02aa9123f29fc4280ad3e1afe4b35dcba171ba1d5fd219037c396c5152d9c2d102cff1798dd5ae3bd33ac4759ae0a + languageName: node + linkType: hard + +"@jest/schemas@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/schemas@npm:28.1.3" + dependencies: + "@sinclair/typebox": ^0.24.1 + checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de + languageName: node + linkType: hard + +"@jest/source-map@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/source-map@npm:28.1.2" + dependencies: + "@jridgewell/trace-mapping": ^0.3.13 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: b82a5c2e93d35d86779c61a02ccb967d1b5cd2e9dd67d26d8add44958637cbbb99daeeb8129c7653389cb440dc2a2f5ae4d2183dc453c67669ff98938b775a3a + languageName: node + linkType: hard + +"@jest/test-result@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/test-result@npm:28.1.3" + dependencies: + "@jest/console": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 957a5dd2fd2e84aabe86698f93c0825e96128ccaa23abf548b159a9b08ac74e4bde7acf4bec48479243dbdb27e4ea1b68c171846d21fb64855c6b55cead9ef27 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/test-sequencer@npm:28.1.3" + dependencies: + "@jest/test-result": ^28.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + slash: ^3.0.0 + checksum: 13f8905e6d1ec8286694146f7be3cf90eff801bbdea5e5c403e6881444bb390ed15494c7b9948aa94bd7e9c9a851e0d3002ed6e7371d048b478596e5b23df953 + languageName: node + linkType: hard + +"@jest/transform@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/transform@npm:28.1.3" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^28.1.3 + "@jridgewell/trace-mapping": ^0.3.13 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^1.4.0 + fast-json-stable-stringify: ^2.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.3 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.1 + checksum: dadf618936e0aa84342f07f532801d5bed43cdf95d1417b929e4f8782c872cff1adc84096d5a287a796d0039a2691c06d8450cce5a713a8b52fbb9f872a1e760 + languageName: node + linkType: hard + +"@jest/types@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/types@npm:28.1.3" + dependencies: + "@jest/schemas": ^28.1.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 1e258d9c063fcf59ebc91e46d5ea5984674ac7ae6cae3e50aa780d22b4405bf2c925f40350bf30013839eb5d4b5e521d956ddf8f3b7c78debef0e75a07f57350 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.1.0": + version: 0.1.1 + resolution: "@jridgewell/gen-mapping@npm:0.1.1" + dependencies: + "@jridgewell/set-array": ^1.0.0 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/gen-mapping@npm:0.3.2" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/source-map@npm:0.3.2" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1b83f0eb944e77b70559a394d5d3b3f98a81fcc186946aceb3ef42d036762b52ef71493c6c0a3b7c1d2f08785f53ba2df1277fe629a06e6109588ff4cdcf7482 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.17 + resolution: "@jridgewell/trace-mapping@npm:0.3.17" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 + languageName: node + linkType: hard + +"@nestjs/cli@npm:^9.0.0": + version: 9.1.5 + resolution: "@nestjs/cli@npm:9.1.5" + dependencies: + "@angular-devkit/core": 14.2.2 + "@angular-devkit/schematics": 14.2.2 + "@angular-devkit/schematics-cli": 14.2.2 + "@nestjs/schematics": ^9.0.0 + chalk: 3.0.0 + chokidar: 3.5.3 + cli-table3: 0.6.2 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 7.2.13 + inquirer: 7.3.3 + node-emoji: 1.11.0 + ora: 5.4.1 + os-name: 4.0.1 + rimraf: 3.0.2 + shelljs: 0.8.5 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + tsconfig-paths: 4.1.0 + tsconfig-paths-webpack-plugin: 4.0.0 + typescript: 4.8.4 + webpack: 5.74.0 + webpack-node-externals: 3.0.0 + bin: + nest: bin/nest.js + checksum: 0a832817fff7126ec6f6a32cd1ca6b8db3b21447ca57c54167f989275b7a5914191c1b99442f19c45ceaa3185d2ee46d80c862b242dbfb8b8b239bd049054ac4 + languageName: node + linkType: hard + +"@nestjs/common@npm:^9.0.0": + version: 9.2.1 + resolution: "@nestjs/common@npm:9.2.1" + dependencies: + iterare: 1.2.1 + tslib: 2.4.1 + uuid: 9.0.0 + peerDependencies: + cache-manager: <=5 + class-transformer: "*" + class-validator: "*" + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + checksum: 82acae70df519f1f217f5b11354c29e1f3b9e5ddd5f73385bd76705c235507230bb19c6c0eb696938565ce70c33cecb487d539c829d1c8d39121fcf3468b4d55 + languageName: node + linkType: hard + +"@nestjs/config@npm:^2.2.0": + version: 2.2.0 + resolution: "@nestjs/config@npm:2.2.0" + dependencies: + dotenv: 16.0.1 + dotenv-expand: 8.0.3 + lodash: 4.17.21 + uuid: 8.3.2 + peerDependencies: + "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 + reflect-metadata: ^0.1.13 + rxjs: ^6.0.0 || ^7.2.0 + checksum: 42b9d8014da51ee76621f705d3783d10fbcaa8362881ecd591b8c9542e8067d3e61258bb01556694c355471ea6af8485c05ba85d1326f54f810bff19bfefef2e + languageName: node + linkType: hard + +"@nestjs/core@npm:^9.0.0": + version: 9.2.1 + resolution: "@nestjs/core@npm:9.2.1" + 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.4.1 + uuid: 9.0.0 + peerDependencies: + "@nestjs/common": ^9.0.0 + "@nestjs/microservices": ^9.0.0 + "@nestjs/platform-express": ^9.0.0 + "@nestjs/websockets": ^9.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + "@nestjs/microservices": + optional: true + "@nestjs/platform-express": + optional: true + "@nestjs/websockets": + optional: true + checksum: 006edefb175840f7706e3ae755dfd984e112d40fe3ce26bd75ee019652c38b5225c751617efaf6054b07ddb1f7e044f49015520889f0003aa9aab33111d59172 + languageName: node + linkType: hard + +"@nestjs/event-emitter@npm:^1.3.1": + version: 1.3.1 + resolution: "@nestjs/event-emitter@npm:1.3.1" + dependencies: + eventemitter2: 6.4.6 + peerDependencies: + "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 + "@nestjs/core": ^7.0.0 || ^8.0.0 || ^9.0.0 + reflect-metadata: ^0.1.12 + checksum: fd4b8f2ec6ff8f2aa5dce41d5bc4492ab22af908e42eff3b21978c929514ce816649ca1f077255171a8a586db731d0268b171a2e909f64dda7d6f2598b75a6fe + languageName: node + linkType: hard + +"@nestjs/platform-express@npm:^9.0.0": + version: 9.2.1 + resolution: "@nestjs/platform-express@npm:9.2.1" + dependencies: + body-parser: 1.20.1 + cors: 2.8.5 + express: 4.18.2 + multer: 1.4.4-lts.1 + tslib: 2.4.1 + peerDependencies: + "@nestjs/common": ^9.0.0 + "@nestjs/core": ^9.0.0 + checksum: a20d5471b1dcc56f056af14593d94ed8e155208338359e72519ed052ffdc741c5b27a75726c46277dc8baadd99615b369c6874353e73c95133b90a05b79810e9 + languageName: node + linkType: hard + +"@nestjs/schematics@npm:^9.0.0": + version: 9.0.3 + resolution: "@nestjs/schematics@npm:9.0.3" + dependencies: + "@angular-devkit/core": 14.2.1 + "@angular-devkit/schematics": 14.2.1 + fs-extra: 10.1.0 + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + peerDependencies: + typescript: ^4.3.5 + checksum: 8439f211f1df75e60092a730d62cfeb22b9d51c864a2740ca8723a5e64284fe63375152b430f4c7d7f54d6f6deedea905d4769f864fe64fa0ce90ea1f4683fbe + languageName: node + linkType: hard + +"@nestjs/testing@npm:^9.0.0": + version: 9.2.1 + resolution: "@nestjs/testing@npm:9.2.1" + dependencies: + tslib: 2.4.1 + peerDependencies: + "@nestjs/common": ^9.0.0 + "@nestjs/core": ^9.0.0 + "@nestjs/microservices": ^9.0.0 + "@nestjs/platform-express": ^9.0.0 + peerDependenciesMeta: + "@nestjs/microservices": + optional: true + "@nestjs/platform-express": + optional: true + checksum: 69fbe0535bbc6b8f90f90a02efb33b390d5aa7ce1f309452b1fcedd9304f7466871842f27d042587fce8532892abe58c769465eca13dde80860e002ffa83570b + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^2.1.0": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" + dependencies: + "@gar/promisify": ^1.1.3 + semver: ^7.3.5 + checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + languageName: node + linkType: hard + +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" + dependencies: + mkdirp: ^1.0.4 + rimraf: ^3.0.2 + checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + languageName: node + linkType: hard + +"@nuxtjs/opencollective@npm:0.3.2": + version: 0.3.2 + resolution: "@nuxtjs/opencollective@npm:0.3.2" + dependencies: + chalk: ^4.1.0 + consola: ^2.15.0 + node-fetch: ^2.6.1 + bin: + opencollective: bin/opencollective.js + checksum: fd3737c12edf55b5c2279674664c3ed5e756410ea82e9cd324c3f0e032ed5ccd8df1959ec69ea97f2f1c9c33c884aae3d7a7108a73ea0faa90d74ea47cf364d4 + languageName: node + linkType: hard + +"@sapphire/async-queue@npm:^1.5.0": + version: 1.5.0 + resolution: "@sapphire/async-queue@npm:1.5.0" + checksum: 983dbd1fd1b1798496e5edb6a0db7e4d90015160e1028f20475eab0a92625513f1e8d938bc0305811a9cec461c94e01b1e4191615ff03ba49356f568f3255250 + languageName: node + linkType: hard + +"@sapphire/shapeshift@npm:^3.7.1": + version: 3.8.0 + resolution: "@sapphire/shapeshift@npm:3.8.0" + dependencies: + fast-deep-equal: ^3.1.3 + lodash: ^4.17.21 + checksum: 48335f7599c2f7b0fe49e42def542f12b896f9f594f34c8127d96d4dcd4700b85b28afe985bc56cc238bcf013e2b28bf442f2cc2b35a2e2ab02a5d2924429084 + languageName: node + linkType: hard + +"@sapphire/snowflake@npm:^3.2.2": + version: 3.3.0 + resolution: "@sapphire/snowflake@npm:3.3.0" + checksum: 122bbe325d596d670650c5c037d7f80a85a280ef5d5170dcb11030252773defa0df76277bcd28e663abe9c206310dcc596e3be32666fc6c53dede2798c3109da + languageName: node + linkType: hard + +"@sideway/address@npm:^4.1.3": + version: 4.1.4 + resolution: "@sideway/address@npm:4.1.4" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: b9fca2a93ac2c975ba12e0a6d97853832fb1f4fb02393015e012b47fa916a75ca95102d77214b2a29a2784740df2407951af8c5dde054824c65577fd293c4cdb + languageName: node + linkType: hard + +"@sideway/formula@npm:^3.0.0": + version: 3.0.0 + resolution: "@sideway/formula@npm:3.0.0" + checksum: 8ae26a0ed6bc84f7310be6aae6eb9d81e97f382619fc69025d346871a707eaab0fa38b8c857e3f0c35a19923de129f42d35c50b8010c928d64aab41578580ec4 + languageName: node + linkType: hard + +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.24.1": + version: 0.24.51 + resolution: "@sinclair/typebox@npm:0.24.51" + checksum: fd0d855e748ef767eb19da1a60ed0ab928e91e0f358c1dd198d600762c0015440b15755e96d1176e2a0db7e09c6a64ed487828ee10dd0c3e22f61eb09c478cd0 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^1.7.0": + version: 1.8.6 + resolution: "@sinonjs/commons@npm:1.8.6" + dependencies: + type-detect: 4.0.8 + checksum: 7d3f8c1e85f30cd4e83594fc19b7a657f14d49eb8d95a30095631ce15e906c869e0eff96c5b93dffea7490c00418b07f54582ba49c6560feb2a8c34c0b16832d + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^9.1.2": + version: 9.1.2 + resolution: "@sinonjs/fake-timers@npm:9.1.2" + dependencies: + "@sinonjs/commons": ^1.7.0 + checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6 + languageName: node + linkType: hard + +"@tokenizer/token@npm:^0.3.0": + version: 0.3.0 + resolution: "@tokenizer/token@npm:0.3.0" + checksum: 1d575d02d2a9f0c5a4ca5180635ebd2ad59e0f18b42a65f3d04844148b49b3db35cf00b6012a1af2d59c2ab3caca59451c5689f747ba8667ee586ad717ee58e1 + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.3 + resolution: "@tsconfig/node16@npm:1.0.3" + checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.1.20 + resolution: "@types/babel__core@npm:7.1.20" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: a09c4f0456552547a5b8a5a009a3daec4d362f622168f8e08bda0ded2da0a65ab0b1642e23c433b3616721f5701dc34a996c5bde5baeaea53eda98f438043f2c + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.4 + resolution: "@types/babel__generator@npm:7.6.4" + dependencies: + "@babel/types": ^7.0.0 + checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.1 + resolution: "@types/babel__template@npm:7.4.1" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.18.3 + resolution: "@types/babel__traverse@npm:7.18.3" + dependencies: + "@babel/types": ^7.3.0 + checksum: d20953338b2f012ab7750932ece0a78e7d1645b0a6ff42d49be90f55e9998085da1374a9786a7da252df89555c6586695ba4d1d4b4e88ab2b9f306bcd35e00d3 + languageName: node + linkType: hard + +"@types/body-parser@npm:*": + version: 1.19.2 + resolution: "@types/body-parser@npm:1.19.2" + dependencies: + "@types/connect": "*" + "@types/node": "*" + checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.35 + resolution: "@types/connect@npm:3.4.35" + dependencies: + "@types/node": "*" + checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + languageName: node + linkType: hard + +"@types/cookiejar@npm:*": + version: 2.1.2 + resolution: "@types/cookiejar@npm:2.1.2" + checksum: f6e1903454007f86edd6c3520cbb4d553e1d4e17eaf1f77f6f75e3270f48cc828d74397a113a36942f5fe52f9fa71067bcfa738f53ad468fcca0bc52cb1cbd28 + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.4 + resolution: "@types/eslint-scope@npm:3.7.4" + dependencies: + "@types/eslint": "*" + "@types/estree": "*" + checksum: ea6a9363e92f301cd3888194469f9ec9d0021fe0a397a97a6dd689e7545c75de0bd2153dfb13d3ab532853a278b6572c6f678ce846980669e41029d205653460 + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.4.10 + resolution: "@types/eslint@npm:8.4.10" + dependencies: + "@types/estree": "*" + "@types/json-schema": "*" + checksum: 21e009ed9ed9bc8920fdafc6e11ff321c4538b4cc18a56fdd59dc5184ea7bbf363c71638c9bdb59fc1254dddcdd567485136ed68b0ee4750948d4e32cb79c689 + languageName: node + linkType: hard + +"@types/estree@npm:*": + version: 1.0.0 + resolution: "@types/estree@npm:1.0.0" + checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443 + languageName: node + linkType: hard + +"@types/estree@npm:^0.0.51": + version: 0.0.51 + resolution: "@types/estree@npm:0.0.51" + checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:^4.17.31": + version: 4.17.31 + resolution: "@types/express-serve-static-core@npm:4.17.31" + dependencies: + "@types/node": "*" + "@types/qs": "*" + "@types/range-parser": "*" + checksum: 009bfbe1070837454a1056aa710d0390ee5fb8c05dfe5a1691cc3e2ca88dc256f80e1ca27cb51a978681631d2f6431bfc9ec352ea46dd0c6eb183d0170bde5df + languageName: node + linkType: hard + +"@types/express@npm:^4.17.13": + version: 4.17.15 + resolution: "@types/express@npm:4.17.15" + dependencies: + "@types/body-parser": "*" + "@types/express-serve-static-core": ^4.17.31 + "@types/qs": "*" + "@types/serve-static": "*" + checksum: b4acd8a836d4f6409cdf79b12d6e660485249b62500cccd61e7997d2f520093edf77d7f8498ca79d64a112c6434b6de5ca48039b8fde2c881679eced7e96979b + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.5 + resolution: "@types/graceful-fs@npm:4.1.5" + dependencies: + "@types/node": "*" + checksum: d076bb61f45d0fc42dee496ef8b1c2f8742e15d5e47e90e20d0243386e426c04d4efd408a48875ab432f7960b4ce3414db20ed0fbbfc7bcc89d84e574f6e045a + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/istanbul-lib-coverage@npm:2.0.4" + checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.0 + resolution: "@types/istanbul-lib-report@npm:3.0.0" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.1 + resolution: "@types/istanbul-reports@npm:3.0.1" + dependencies: + "@types/istanbul-lib-report": "*" + checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 + languageName: node + linkType: hard + +"@types/jest@npm:28.1.8": + version: 28.1.8 + resolution: "@types/jest@npm:28.1.8" + dependencies: + expect: ^28.0.0 + pretty-format: ^28.0.0 + checksum: d4cd36158a3ae1d4b42cc48a77c95de74bc56b84cf81e09af3ee0399c34f4a7da8ab9e787570f10004bd642f9e781b0033c37327fbbf4a8e4b6e37e8ee3693a7 + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d + languageName: node + linkType: hard + +"@types/mime@npm:*": + version: 3.0.1 + resolution: "@types/mime@npm:3.0.1" + checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 18.11.15 + resolution: "@types/node@npm:18.11.15" + checksum: cae8692a5cee0316f93ee0342237eb921f70c51afb37c661c711a925a4642654ae7e404c5a80899d481c0cfaff3a6891ef04bacd330a2e72734192bfc91dc2d8 + languageName: node + linkType: hard + +"@types/node@npm:^16.0.0": + version: 16.18.9 + resolution: "@types/node@npm:16.18.9" + checksum: 7dc9cb417869592b2ad64233d06cd3eda63b8ae31d72a0811e4f5ac5a2ef01feb4d4c91159481e506c7a56951981359e75069c7fae6f0de90fc0c3c8b69a36cd + languageName: node + linkType: hard + +"@types/parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "@types/parse-json@npm:4.0.0" + checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b + languageName: node + linkType: hard + +"@types/prettier@npm:^2.1.5": + version: 2.7.1 + resolution: "@types/prettier@npm:2.7.1" + checksum: 5e3f58e229d6c73b5f5cae2e8f96c1c4a5b5805f83459e17a045ba8e96152b1d38e86b63e3172fb159dac923388699660862b75b2d37e54220805f0e691e26f1 + languageName: node + linkType: hard + +"@types/qs@npm:*": + version: 6.9.7 + resolution: "@types/qs@npm:6.9.7" + checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.4 + resolution: "@types/range-parser@npm:1.2.4" + checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + languageName: node + linkType: hard + +"@types/semver@npm:^7.3.12": + version: 7.3.13 + resolution: "@types/semver@npm:7.3.13" + checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 + languageName: node + linkType: hard + +"@types/serve-static@npm:*": + version: 1.15.0 + resolution: "@types/serve-static@npm:1.15.0" + dependencies: + "@types/mime": "*" + "@types/node": "*" + checksum: b6ac93d471fb0f53ddcac1f9b67572a09cd62806f7db5855244b28f6f421139626f24799392566e97d1ffc61b12f9de7f30380c39fcae3c8a161fe161d44edf2 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.1 + resolution: "@types/stack-utils@npm:2.0.1" + checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 + languageName: node + linkType: hard + +"@types/superagent@npm:*": + version: 4.1.16 + resolution: "@types/superagent@npm:4.1.16" + dependencies: + "@types/cookiejar": "*" + "@types/node": "*" + checksum: 187d1d32fdafd20b27e81728c46283160d3296ad904d56e0780769cf524105c94cc64bf5bafa170400cf5f1063d30826427de42ff0894d15b54df6d0fa31be4e + languageName: node + linkType: hard + +"@types/supertest@npm:^2.0.11": + version: 2.0.12 + resolution: "@types/supertest@npm:2.0.12" + dependencies: + "@types/superagent": "*" + checksum: f0e2b44f86bec2f708d6a3d0cb209055b487922040773049b0f8c6b557af52d4b5fa904e17dfaa4ce6e610172206bbec7b62420d158fa57b6ffc2de37b1730d3 + languageName: node + linkType: hard + +"@types/ws@npm:^8.5.3": + version: 8.5.3 + resolution: "@types/ws@npm:8.5.3" + dependencies: + "@types/node": "*" + checksum: 0ce46f850d41383fcdc2149bcacc86d7232fa7a233f903d2246dff86e31701a02f8566f40af5f8b56d1834779255c04ec6ec78660fe0f9b2a69cf3d71937e4ae + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.0 + resolution: "@types/yargs-parser@npm:21.0.0" + checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.17 + resolution: "@types/yargs@npm:17.0.17" + dependencies: + "@types/yargs-parser": "*" + checksum: 4f1b5149e794c8960652b4339dc96655e53b48fdbe1b847fcb0db95e72e760724a4c5c616a7fccb3c0ae8beb0e57e06e37391d492e916e3ff179aafeb890e426 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^5.0.0": + version: 5.46.1 + resolution: "@typescript-eslint/eslint-plugin@npm:5.46.1" + dependencies: + "@typescript-eslint/scope-manager": 5.46.1 + "@typescript-eslint/type-utils": 5.46.1 + "@typescript-eslint/utils": 5.46.1 + debug: ^4.3.4 + ignore: ^5.2.0 + natural-compare-lite: ^1.4.0 + regexpp: ^3.2.0 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 4ea4af5faa5c509113d575bf6ea1f76989f253b4839bb98bcda28450be7fc8a87788169e822b0f6d739aee67e32e824440ef00cebc294d4212ffb3fed1f0756a + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.0.0": + version: 5.46.1 + resolution: "@typescript-eslint/parser@npm:5.46.1" + dependencies: + "@typescript-eslint/scope-manager": 5.46.1 + "@typescript-eslint/types": 5.46.1 + "@typescript-eslint/typescript-estree": 5.46.1 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 784fe3ae688da85784b271c10d1e0b807583f4c370e32aa7a09b2584d0f7b92316a93cccbd9458bdf08f169b220097a4b0456bc5f62a210607a13a5fae84c972 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.46.1": + version: 5.46.1 + resolution: "@typescript-eslint/scope-manager@npm:5.46.1" + dependencies: + "@typescript-eslint/types": 5.46.1 + "@typescript-eslint/visitor-keys": 5.46.1 + checksum: bf934603dc9c7da71eb26f415d13018f2a96dbba193a773bc440a5c93828365f09bb3db9be55189dfbbace414c6c48d7fad246c0d9717dab4676d0d79d6d8676 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.46.1": + version: 5.46.1 + resolution: "@typescript-eslint/type-utils@npm:5.46.1" + dependencies: + "@typescript-eslint/typescript-estree": 5.46.1 + "@typescript-eslint/utils": 5.46.1 + debug: ^4.3.4 + tsutils: ^3.21.0 + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: a47f1b73ac773a7f33421a8e8f9bc6e047f55236e3257b2c9eaa04d18595ab6505129ffdab86685e9c3bef564091315a2347150cd6e61a511cc2160667458014 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.46.1": + version: 5.46.1 + resolution: "@typescript-eslint/types@npm:5.46.1" + checksum: 91143d3304b8c70d69d9c8e5b7428cce3a222eacfbeb99e592d278668bcf998760731deae064a76157b9a0fc4911fe3178aa24e4ea6fe2ba68dd37113834c924 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.46.1": + version: 5.46.1 + resolution: "@typescript-eslint/typescript-estree@npm:5.46.1" + dependencies: + "@typescript-eslint/types": 5.46.1 + "@typescript-eslint/visitor-keys": 5.46.1 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 21499b927b4118cd51e841b2e1b7e55621135f923f461b75dc8ca8442de38a82da5a0232dce5229e0266b6fc12d70696e0e912fcf1483d4c44f02e4cad39ed98 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.46.1": + version: 5.46.1 + resolution: "@typescript-eslint/utils@npm:5.46.1" + dependencies: + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.46.1 + "@typescript-eslint/types": 5.46.1 + "@typescript-eslint/typescript-estree": 5.46.1 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: db9fd1dfb2390e66041f9529d564f38ccf74042de68e0e1e3d319ba4d02d7cd969d75dc056f938b98acab53ad7c1e36c68eabb15c0b2e2296b081652fa8d3820 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.46.1": + version: 5.46.1 + resolution: "@typescript-eslint/visitor-keys@npm:5.46.1" + dependencies: + "@typescript-eslint/types": 5.46.1 + eslint-visitor-keys: ^3.3.0 + checksum: 952cf20e29a040e0820e52d6815097abf042ea8e1fd5d013c0a319284ea0e2e29e0ca9ef244717450a6eb9d32ebf7fa9ed91185675a27adc35c9ad070d561b7c + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/ast@npm:1.11.1" + dependencies: + "@webassemblyjs/helper-numbers": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + checksum: 1eee1534adebeece635362f8e834ae03e389281972611408d64be7895fc49f48f98fddbbb5339bf8a72cb101bcb066e8bca3ca1bf1ef47dadf89def0395a8d87 + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" + checksum: b8efc6fa08e4787b7f8e682182d84dfdf8da9d9c77cae5d293818bc4a55c1f419a87fa265ab85252b3e6c1fd323d799efea68d825d341a7c365c64bc14750e97 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" + checksum: 0792813f0ed4a0e5ee0750e8b5d0c631f08e927f4bdfdd9fe9105dc410c786850b8c61bff7f9f515fdfb149903bec3c976a1310573a4c6866a94d49bc7271959 + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" + checksum: a337ee44b45590c3a30db5a8b7b68a717526cf967ada9f10253995294dbd70a58b2da2165222e0b9830cd4fc6e4c833bf441a721128d1fe2e9a7ab26b36003ce + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" + dependencies: + "@webassemblyjs/floating-point-hex-parser": 1.11.1 + "@webassemblyjs/helper-api-error": 1.11.1 + "@xtuc/long": 4.2.2 + checksum: 44d2905dac2f14d1e9b5765cf1063a0fa3d57295c6d8930f6c59a36462afecc6e763e8a110b97b342a0f13376166c5d41aa928e6ced92e2f06b071fd0db59d3a + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" + checksum: eac400113127832c88f5826bcc3ad1c0db9b3dbd4c51a723cfdb16af6bfcbceb608170fdaac0ab7731a7e18b291be7af68a47fcdb41cfe0260c10857e7413d97 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-buffer": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/wasm-gen": 1.11.1 + checksum: 617696cfe8ecaf0532763162aaf748eb69096fb27950219bb87686c6b2e66e11cd0614d95d319d0ab1904bc14ebe4e29068b12c3e7c5e020281379741fe4bedf + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/ieee754@npm:1.11.1" + dependencies: + "@xtuc/ieee754": ^1.2.0 + checksum: 23a0ac02a50f244471631802798a816524df17e56b1ef929f0c73e3cde70eaf105a24130105c60aff9d64a24ce3b640dad443d6f86e5967f922943a7115022ec + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/leb128@npm:1.11.1" + dependencies: + "@xtuc/long": 4.2.2 + checksum: 33ccc4ade2f24de07bf31690844d0b1ad224304ee2062b0e464a610b0209c79e0b3009ac190efe0e6bd568b0d1578d7c3047fc1f9d0197c92fc061f56224ff4a + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/utf8@npm:1.11.1" + checksum: 972c5cfc769d7af79313a6bfb96517253a270a4bf0c33ba486aa43cac43917184fb35e51dfc9e6b5601548cd5931479a42e42c89a13bb591ffabebf30c8a6a0b + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-buffer": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/helper-wasm-section": 1.11.1 + "@webassemblyjs/wasm-gen": 1.11.1 + "@webassemblyjs/wasm-opt": 1.11.1 + "@webassemblyjs/wasm-parser": 1.11.1 + "@webassemblyjs/wast-printer": 1.11.1 + checksum: 6d7d9efaec1227e7ef7585a5d7ff0be5f329f7c1c6b6c0e906b18ed2e9a28792a5635e450aca2d136770d0207225f204eff70a4b8fd879d3ac79e1dcc26dbeb9 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/ieee754": 1.11.1 + "@webassemblyjs/leb128": 1.11.1 + "@webassemblyjs/utf8": 1.11.1 + checksum: 1f6921e640293bf99fb16b21e09acb59b340a79f986c8f979853a0ae9f0b58557534b81e02ea2b4ef11e929d946708533fd0693c7f3712924128fdafd6465f5b + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-buffer": 1.11.1 + "@webassemblyjs/wasm-gen": 1.11.1 + "@webassemblyjs/wasm-parser": 1.11.1 + checksum: 21586883a20009e2b20feb67bdc451bbc6942252e038aae4c3a08e6f67b6bae0f5f88f20bfc7bd0452db5000bacaf5ab42b98cf9aa034a6c70e9fc616142e1db + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-api-error": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/ieee754": 1.11.1 + "@webassemblyjs/leb128": 1.11.1 + "@webassemblyjs/utf8": 1.11.1 + checksum: 1521644065c360e7b27fad9f4bb2df1802d134dd62937fa1f601a1975cde56bc31a57b6e26408b9ee0228626ff3ba1131ae6f74ffb7d718415b6528c5a6dbfc2 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wast-printer@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@xtuc/long": 4.2.2 + checksum: f15ae4c2441b979a3b4fce78f3d83472fb22350c6dc3fd34bfe7c3da108e0b2360718734d961bba20e7716cb8578e964b870da55b035e209e50ec9db0378a3f7 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec + languageName: node + linkType: hard + +"abbrev@npm:1, abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: ~2.1.34 + negotiator: 0.6.3 + checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 + languageName: node + linkType: hard + +"acorn-import-assertions@npm:^1.7.6": + version: 1.8.0 + resolution: "acorn-import-assertions@npm:1.8.0" + peerDependencies: + acorn: ^8 + checksum: 5c4cf7c850102ba7ae0eeae0deb40fb3158c8ca5ff15c0bca43b5c47e307a1de3d8ef761788f881343680ea374631ae9e9615ba8876fee5268dbe068c98bcba6 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0": + version: 8.8.1 + resolution: "acorn@npm:8.8.1" + bin: + acorn: bin/acorn + checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.2.1 + resolution: "agentkeepalive@npm:4.2.1" + dependencies: + debug: ^4.1.0 + depd: ^1.1.2 + humanize-ms: ^1.2.1 + checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv-formats@npm:2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 + languageName: node + linkType: hard + +"ajv@npm:8.11.0": + version: 8.11.0 + resolution: "ajv@npm:8.11.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + 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 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0": + version: 8.11.2 + resolution: "ajv@npm:8.11.2" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 53435bf79ee7d1eabba8085962dba4c08d08593334b304db7772887f0b7beebc1b3d957432f7437ed4b60e53b5d966a57b439869890209c50fed610459999e3e + languageName: node + linkType: hard + +"ansi-colors@npm:4.1.3": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: ^0.21.3 + checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"append-field@npm:^1.0.0": + version: 1.0.0 + resolution: "append-field@npm:1.0.0" + checksum: 482ba08acc0ecef00fe7da6bf2f8e48359a9905ee1af525f3120c9260c02e91eedf0579b59d898e8d8455b6c199e340bc0a2fd4b9e02adaa29a8a86c722b37f9 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 1.2.0 + resolution: "aproba@npm:1.2.0" + checksum: 0fca141966559d195072ed047658b6e6c4fe92428c385dd38e288eacfc55807e7b4989322f030faff32c0f46bb0bc10f1e0ac32ec22d25315a1e5bbc0ebb76dc + languageName: node + linkType: hard + +"are-we-there-yet@npm:^2.0.0": + version: 2.0.0 + resolution: "are-we-there-yet@npm:2.0.0" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 6c80b4fd04ecee6ba6e737e0b72a4b41bdc64b7d279edfc998678567ff583c8df27e27523bc789f2c99be603ffa9eaa612803da1d886962d2086e7ff6fa90c7c + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"asap@npm:^2.0.0": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"axios@npm:0.27.2": + version: 0.27.2 + resolution: "axios@npm:0.27.2" + dependencies: + follow-redirects: ^1.14.9 + form-data: ^4.0.0 + checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 + languageName: node + linkType: hard + +"babel-jest@npm:^28.1.3": + version: 28.1.3 + resolution: "babel-jest@npm:28.1.3" + dependencies: + "@jest/transform": ^28.1.3 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^28.1.3 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 57ccd2296e1839687b5df2fd138c3d00717e0369e385254b012ccd4ee70e75f5d5c8e6cfcdf92d155015b468cfebb847b38e69bb5805d8aaf730e20575127cc6 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + "@istanbuljs/load-nyc-config": ^1.0.0 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-instrument: ^5.0.4 + test-exclude: ^6.0.0 + checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^28.1.3": + version: 28.1.3 + resolution: "babel-plugin-jest-hoist@npm:28.1.3" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 648d89f9d80f6450ce7e50d0c32eb91b7f26269b47c3e37aaf2e0f2f66a980978345bd6b8c9b8c3aa6a8252ad2bc2c9fb50630e9895622c9a0972af5f70ed20e + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-bigint": ^7.8.3 + "@babel/plugin-syntax-class-properties": ^7.8.3 + "@babel/plugin-syntax-import-meta": ^7.8.3 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.8.3 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-top-level-await": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^28.1.3": + version: 28.1.3 + resolution: "babel-preset-jest@npm:28.1.3" + dependencies: + babel-plugin-jest-hoist: ^28.1.3 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 8248a4a5ca4242cc06ad13b10b9183ad2664da8fb0da060c352223dcf286f0ce9c708fa17901dc44ecabec25e6d309e5e5b9830a61dd777c3925f187a345a47d + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + languageName: node + linkType: hard + +"bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: ^5.5.0 + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 + languageName: node + linkType: hard + +"body-parser@npm:1.20.1": + version: 1.20.1 + resolution: "body-parser@npm:1.20.1" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.4 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"browserslist@npm:^4.14.5, browserslist@npm:^4.21.3": + version: 4.21.4 + resolution: "browserslist@npm:4.21.4" + dependencies: + caniuse-lite: ^1.0.30001400 + electron-to-chromium: ^1.4.251 + node-releases: ^2.0.6 + update-browserslist-db: ^1.0.9 + bin: + browserslist: cli.js + checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: ^0.4.0 + checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.1.13 + checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 + languageName: node + linkType: hard + +"busboy@npm:^1.0.0, busboy@npm:^1.6.0": + version: 1.6.0 + resolution: "busboy@npm:1.6.0" + dependencies: + streamsearch: ^1.1.0 + checksum: 32801e2c0164e12106bf236291a00795c3c4e4b709ae02132883fe8478ba2ae23743b11c5735a0aae8afe65ac4b6ca4568b91f0d9fed1fdbc32ede824a73746e + languageName: node + linkType: hard + +"bytes@npm:3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e + languageName: node + linkType: hard + +"cacache@npm:^16.1.0": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": ^2.1.0 + "@npmcli/move-file": ^2.0.0 + chownr: ^2.0.0 + fs-minipass: ^2.1.0 + glob: ^8.0.1 + infer-owner: ^1.0.4 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + mkdirp: ^1.0.4 + p-map: ^4.0.0 + promise-inflight: ^1.0.1 + rimraf: ^3.0.2 + ssri: ^9.0.0 + tar: ^6.1.11 + unique-filename: ^2.0.0 + checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: ^1.1.1 + get-intrinsic: ^1.0.2 + checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001400": + version: 1.0.30001439 + resolution: "caniuse-lite@npm:1.0.30001439" + checksum: 3912dd536c9735713ca85e47721988bbcefb881ddb4886b0b9923fa984247fd22cba032cf268e57d158af0e8a2ae2eae042ae01942a1d6d7849fa9fa5d62fb82 + languageName: node + linkType: hard + +"chalk@npm:3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 + languageName: node + linkType: hard + +"chalk@npm:^2.0.0": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 + languageName: node + linkType: hard + +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d + languageName: node + linkType: hard + +"chokidar@npm:3.5.3, chokidar@npm:^3.5.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.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 + dependenciesMeta: + fsevents: + optional: true + checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.7.0 + resolution: "ci-info@npm:3.7.0" + checksum: 6e5df0250382ff3732703b36b958d2d892dd3c481f9671666f96c2ab7888be744bc4dca81395be958dcb828502d94f18fa9aa8901c5a3c9923cda212df02724c + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.2 + resolution: "cjs-module-lexer@npm:1.2.2" + checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: ^3.1.0 + checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.7.0 + resolution: "cli-spinners@npm:2.7.0" + checksum: a9afaf73f58d1f951fb23742f503631b3cf513f43f4c7acb1b640100eb76bfa16efbcd1994d149ffc6603a6d75dd3d4a516a76f125f90dce437de9b16fd0ee6f + languageName: node + linkType: hard + +"cli-table3@npm:0.6.2": + version: 0.6.2 + resolution: "cli-table3@npm:0.6.2" + dependencies: + "@colors/colors": 1.5.0 + string-width: ^4.2.0 + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 2f82391698b8a2a2a5e45d2adcfea5d93e557207f90455a8d4c1aac688e9b18a204d9eb4ba1d322fa123b17d64ea3dc5e11de8b005529f3c3e7dbeb27cb4d9be + languageName: node + linkType: hard + +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.1 + resolution: "collect-v8-coverage@npm:1.0.1" + checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-support@npm:^1.1.2, color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"commander@npm:4.1.1": + version: 4.1.1 + resolution: "commander@npm:4.1.1" + checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + +"compare-versions@npm:5.0.1": + version: 5.0.1 + resolution: "compare-versions@npm:5.0.1" + checksum: 302a4e46224b47b9280cf894c6c87d8df912671fa391dcdbf0e63438d9b0a69fe20dd747fb439e8d54c43af016ff4eaaf0a4c9d8e7ca358bcd12dadf4ad2935e + languageName: node + linkType: hard + +"component-emitter@npm:^1.3.0": + version: 1.3.0 + resolution: "component-emitter@npm:1.3.0" + checksum: b3c46de38ffd35c57d1c02488355be9f218e582aec72d72d1b8bbec95a3ac1b38c96cd6e03ff015577e68f550fbb361a3bfdbd9bb248be9390b7b3745691be6b + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"concat-stream@npm:^1.5.2": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^2.2.2 + typedarray: ^0.0.6 + checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285 + languageName: node + linkType: hard + +"consola@npm:^2.15.0": + version: 2.15.3 + resolution: "consola@npm:2.15.3" + checksum: 8ef7a09b703ec67ac5c389a372a33b6dc97eda6c9876443a60d76a3076eea0259e7f67a4e54fd5a52f97df73690822d090cf8b7e102b5761348afef7c6d03e28 + languageName: node + linkType: hard + +"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: 5.2.1 + checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 + languageName: node + linkType: hard + +"content-type@npm:~1.0.4": + version: 1.0.4 + resolution: "content-type@npm:1.0.4" + checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 + languageName: node + linkType: hard + +"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a + languageName: node + linkType: hard + +"cookie@npm:0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 + languageName: node + linkType: hard + +"cookiejar@npm:^2.1.3": + version: 2.1.3 + resolution: "cookiejar@npm:2.1.3" + checksum: 88259983ebc52ceb23cdacfa48762b6a518a57872eff1c7ed01d214fff5cf492e2660d7d5c04700a28f1787a76811df39e8639f8e17670b3cf94ecd86e161f07 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab + languageName: node + linkType: hard + +"cors@npm:2.8.5": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: ^4 + vary: ^1 + checksum: ced838404ccd184f61ab4fdc5847035b681c90db7ac17e428f3d81d69e2989d2b680cc254da0e2554f5ed4f8a341820a1ce3d1c16b499f6e2f47a1b9b07b5006 + languageName: node + linkType: hard + +"cosmiconfig@npm:^7.0.1": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + 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 + checksum: c53bf7befc1591b2651a22414a5e786cd5f2eeaa87f3678a3d49d6069835a9d8d1aef223728e98aa8fec9a95bf831120d245096db12abe019fecb51f5696c96f + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"dedent@npm:^0.7.0": + version: 0.7.0 + resolution: "dedent@npm:0.7.0" + checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.2.2 + resolution: "deepmerge@npm:4.2.2" + checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: ^1.0.2 + checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"depd@npm:2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a + languageName: node + linkType: hard + +"depd@npm:^1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 + languageName: node + linkType: hard + +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.0.1 + resolution: "detect-libc@npm:2.0.1" + checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + languageName: node + linkType: hard + +"dezalgo@npm:^1.0.4": + version: 1.0.4 + resolution: "dezalgo@npm:1.0.4" + dependencies: + asap: ^2.0.0 + wrappy: 1 + checksum: 895389c6aead740d2ab5da4d3466d20fa30f738010a4d3f4dcccc9fc645ca31c9d10b7e1804ae489b1eb02c7986f9f1f34ba132d409b043082a86d9a4e745624 + languageName: node + linkType: hard + +"diff-sequences@npm:^28.1.1": + version: 28.1.1 + resolution: "diff-sequences@npm:28.1.1" + checksum: e2529036505567c7ca5a2dea86b6bcd1ca0e3ae63bf8ebf529b8a99cfa915bbf194b7021dc1c57361a4017a6d95578d4ceb29fabc3232a4f4cb866a2726c7690 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"discord-api-types@npm:^0.37.20": + version: 0.37.23 + resolution: "discord-api-types@npm:0.37.23" + checksum: 68c385366ccec523c35db4048f2c0d1fcd979fefb620ba57707dc648d0e647b817047a03682d9cac2e9e9a1642f2129ad343ac66a7a9b1e0d6bf53bc5eb11f37 + languageName: node + linkType: hard + +"discord.js@npm:^14.7.1": + version: 14.7.1 + resolution: "discord.js@npm:14.7.1" + dependencies: + "@discordjs/builders": ^1.4.0 + "@discordjs/collection": ^1.3.0 + "@discordjs/rest": ^1.4.0 + "@discordjs/util": ^0.1.0 + "@sapphire/snowflake": ^3.2.2 + "@types/ws": ^8.5.3 + discord-api-types: ^0.37.20 + fast-deep-equal: ^3.1.3 + lodash.snakecase: ^4.1.1 + tslib: ^2.4.1 + undici: ^5.13.0 + ws: ^8.11.0 + checksum: fa861275b1f5360ef1b06cd514014ebd4e3f384655834dd1f73fd9f715bee643500f9d837c52f496d306825bc9c3d6c94e67463d91326e3750a28db765926ad6 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dotenv-expand@npm:8.0.3": + version: 8.0.3 + resolution: "dotenv-expand@npm:8.0.3" + checksum: 128ce90ac825b543de3ece0154a51b056ab0dc36bb26d97a68cd0b8707327ecd3c182fb6ac63b26a0fcdfa85064419906a1065cb634f1f9dc08ad311375f1fc0 + languageName: node + linkType: hard + +"dotenv@npm:16.0.1": + version: 16.0.1 + resolution: "dotenv@npm:16.0.1" + checksum: f459ffce07b977b7f15d8cc4ee69cdff77d4dd8c5dc8c85d2d485ee84655352c2415f9dd09d42b5b5985ced3be186130871b34e2f3e2569ebc72fbc2e8096792 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.251": + version: 1.4.284 + resolution: "electron-to-chromium@npm:1.4.284" + checksum: be496e9dca6509dbdbb54dc32146fc99f8eb716d28a7ee8ccd3eba0066561df36fc51418d8bd7cf5a5891810bf56c0def3418e74248f51ea4a843d423603d10a + languageName: node + linkType: hard + +"emittery@npm:^0.10.2": + version: 0.10.2 + resolution: "emittery@npm:0.10.2" + checksum: ee3e21788b043b90885b18ea756ec3105c1cedc50b29709c92b01e239c7e55345d4bb6d3aef4ddbaf528eef448a40b3bb831bad9ee0fc9c25cbf1367ab1ab5ac + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.10.0, enhanced-resolve@npm:^5.7.0": + version: 5.12.0 + resolution: "enhanced-resolve@npm:5.12.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: bf3f787facaf4ce3439bef59d148646344e372bef5557f0d37ea8aa02c51f50a925cd1f07b8d338f18992c29f544ec235a8c64bcdb56030196c48832a5494174 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"es-module-lexer@npm:^0.9.0": + version: 0.9.3 + resolution: "es-module-lexer@npm:0.9.3" + checksum: 84bbab23c396281db2c906c766af58b1ae2a1a2599844a504df10b9e8dc77ec800b3211fdaa133ff700f5703d791198807bba25d9667392d27a5e9feda344da8 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.3.0": + version: 8.5.0 + resolution: "eslint-config-prettier@npm:8.5.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 0d0f5c32e7a0ad91249467ce71ca92394ccd343178277d318baf32063b79ea90216f4c81d1065d60f96366fdc60f151d4d68ae7811a58bd37228b84c2083f893 + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^4.0.0": + version: 4.2.1 + resolution: "eslint-plugin-prettier@npm:4.2.1" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + eslint: ">=7.28.0" + prettier: ">=2.0.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-scope@npm:^7.1.1": + version: 7.1.1 + resolution: "eslint-scope@npm:7.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e + languageName: node + linkType: hard + +"eslint-utils@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-utils@npm:3.0.0" + dependencies: + eslint-visitor-keys: ^2.0.0 + peerDependencies: + eslint: ">=5" + checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0": + version: 3.3.0 + resolution: "eslint-visitor-keys@npm:3.3.0" + checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 + languageName: node + linkType: hard + +"eslint@npm:^8.0.1": + version: 8.29.0 + resolution: "eslint@npm:8.29.0" + dependencies: + "@eslint/eslintrc": ^1.3.3 + "@humanwhocodes/config-array": ^0.11.6 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + 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.2 + globals: ^13.15.0 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + 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 + bin: + eslint: bin/eslint.js + checksum: e05204b05907b82d910983995cb946e0ba62ca514eb2b6791c43f623333b143564a2eee0139909d31c10935c21877d815b1f76dd674a59cb91c471064325c4ab + languageName: node + linkType: hard + +"espree@npm:^9.4.0": + version: 9.4.1 + resolution: "espree@npm:9.4.1" + dependencies: + acorn: ^8.8.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.3.0 + checksum: 4d266b0cf81c7dfe69e542c7df0f246e78d29f5b04dda36e514eb4c7af117ee6cfbd3280e560571ed82ff6c9c3f0003c05b82583fc7a94006db7497c4fe4270e + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.0": + version: 1.4.0 + resolution: "esquery@npm:1.4.0" + dependencies: + estraverse: ^5.1.0 + checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff + languageName: node + linkType: hard + +"eventemitter2@npm:6.4.6": + version: 6.4.6 + resolution: "eventemitter2@npm:6.4.6" + checksum: 1ede7ce0c01298fa3bc1998b34857c2acd0e73a1d7406e37b9127a84712762cf303a46add62943ae6944cd806bdd29ff542344c727a012b2ea6fd3c90f059367 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"execa@npm:^4.0.2": + version: 4.1.0 + resolution: "execa@npm:4.1.0" + dependencies: + cross-spawn: ^7.0.0 + get-stream: ^5.0.0 + human-signals: ^1.1.1 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.0 + onetime: ^5.1.0 + signal-exit: ^3.0.2 + strip-final-newline: ^2.0.0 + checksum: e30d298934d9c52f90f3847704fd8224e849a081ab2b517bbc02f5f7732c24e56a21f14cb96a08256deffeb2d12b2b7cb7e2b014a12fb36f8d3357e06417ed55 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 + languageName: node + linkType: hard + +"expect@npm:^28.0.0, expect@npm:^28.1.3": + version: 28.1.3 + resolution: "expect@npm:28.1.3" + dependencies: + "@jest/expect-utils": ^28.1.3 + jest-get-type: ^28.0.2 + jest-matcher-utils: ^28.1.3 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + checksum: 101e0090de300bcafedb7dbfd19223368a2251ce5fe0105bbb6de5720100b89fb6b64290ebfb42febc048324c76d6a4979cdc4b61eb77747857daf7a5de9b03d + languageName: node + linkType: hard + +"express@npm:4.18.2": + version: 4.18.2 + resolution: "express@npm:4.18.2" + dependencies: + accepts: ~1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: ~1.0.4 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + etag: ~1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: ~1.1.2 + on-finished: 2.4.1 + parseurl: ~1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: ~2.0.7 + qs: 6.11.0 + range-parser: ~1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: ~1.6.18 + utils-merge: 1.0.1 + vary: ~1.1.2 + checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037 + languageName: node + linkType: hard + +"external-editor@npm:^3.0.3": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: ^0.7.0 + iconv-lite: ^0.4.24 + tmp: ^0.0.33 + checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2": + version: 1.2.0 + resolution: "fast-diff@npm:1.2.0" + checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + 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 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fast-safe-stringify@npm:2.1.1, fast-safe-stringify@npm:^2.1.1": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.14.0 + resolution: "fastq@npm:1.14.0" + dependencies: + reusify: ^1.0.4 + checksum: da2c05ec1446ef77b8ba2b76619c90d483404f5087e71e77469fbee797280a1f4ef26a63be15b2377198bc20d09fdf25c7d6e1e492a1e568a29dfdd9bcb7538c + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: 2.1.1 + checksum: b15a124cef28916fe07b400eb87cbc73ca082c142abf7ca8e8de6af43eca79ca7bd13eb4d4d48240b3bd3136eaac40d16e42d6edf87a8e5d1dd8070626860c78 + languageName: node + linkType: hard + +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"file-type@npm:^18.0.0": + version: 18.0.0 + resolution: "file-type@npm:18.0.0" + dependencies: + readable-web-to-node-stream: ^3.0.2 + strtok3: ^7.0.0 + token-types: ^5.0.1 + checksum: 67f5a927b8030e35a4faf9dd9dea9e17bcb042fb61b9851b7dd1b1b3bb3ecfdd9f83bc3bc72686316ea2bac70df652c61e10affa9b5957b1a3d731df4925e3cb + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"finalhandler@npm:1.2.0": + version: 1.2.0 + resolution: "finalhandler@npm:1.2.0" + dependencies: + debug: 2.6.9 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + on-finished: 2.4.1 + parseurl: ~1.3.3 + statuses: 2.0.1 + unpipe: ~1.0.0 + checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: ^3.1.0 + rimraf: ^3.0.2 + checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.14.9": + version: 1.15.2 + resolution: "follow-redirects@npm:1.15.2" + peerDependenciesMeta: + debug: + optional: true + checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + languageName: node + linkType: hard + +"fork-ts-checker-webpack-plugin@npm:7.2.13": + version: 7.2.13 + resolution: "fork-ts-checker-webpack-plugin@npm:7.2.13" + dependencies: + "@babel/code-frame": ^7.16.7 + chalk: ^4.1.2 + chokidar: ^3.5.3 + cosmiconfig: ^7.0.1 + deepmerge: ^4.2.2 + fs-extra: ^10.0.0 + memfs: ^3.4.1 + minimatch: ^3.0.4 + node-abort-controller: ^3.0.1 + schema-utils: ^3.1.1 + semver: ^7.3.5 + tapable: ^2.2.1 + peerDependencies: + typescript: ">3.6.0" + vue-template-compiler: "*" + webpack: ^5.11.0 + peerDependenciesMeta: + vue-template-compiler: + optional: true + checksum: 3d4694c6fee4b8b2f213d0d10a3f40da770ca0ed3aa2a3dc8d1e701ad1ecaed3a1507f77a1b0cea6ef80539b04d8e5f5f02560e688d310bcb9e8c81f684d2950 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"formidable@npm:^2.1.1": + version: 2.1.2 + resolution: "formidable@npm:2.1.2" + dependencies: + dezalgo: ^1.0.4 + hexoid: ^1.0.0 + once: ^1.4.0 + qs: ^6.11.0 + checksum: 81c8e5d89f5eb873e992893468f0de22c01678ca3d315db62be0560f9de1c77d4faefc9b1f4575098eb2263b3c81ba1024833a9fc3206297ddbac88a4f69b7a8 + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 + languageName: node + linkType: hard + +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 + languageName: node + linkType: hard + +"fs-extra@npm:10.1.0, fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-monkey@npm:^1.0.3": + version: 1.0.3 + resolution: "fs-monkey@npm:1.0.3" + checksum: cf50804833f9b88a476911ae911fe50f61a98d986df52f890bd97e7262796d023698cb2309fa9b74fdd8974f04315b648748a0a8ee059e7d5257b293bfc409c0 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: latest + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a + languageName: node + linkType: hard + +"gauge@npm:^3.0.0": + version: 3.0.2 + resolution: "gauge@npm:3.0.2" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.2 + console-control-strings: ^1.0.0 + has-unicode: ^2.0.1 + object-assign: ^4.1.1 + signal-exit: ^3.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.2 + checksum: 81296c00c7410cdd48f997800155fbead4f32e4f82109be0719c63edc8560e6579946cc8abd04205297640691ec26d21b578837fd13a4e96288ab4b40b1dc3e9 + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2": + version: 1.1.3 + resolution: "get-intrinsic@npm:1.1.3" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.3 + checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 + languageName: node + linkType: hard + +"get-stream@npm:^5.0.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: ^3.0.0 + checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 + languageName: node + linkType: hard + +"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + 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 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:^8.0.1": + version: 8.0.3 + resolution: "glob@npm:8.0.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + +"globals@npm:^13.15.0": + version: 13.19.0 + resolution: "globals@npm:13.19.0" + dependencies: + type-fest: ^0.20.2 + checksum: a000dbd00bcf28f0941d8a29c3522b1c3b8e4bfe4e60e262c477a550c3cbbe8dbe2925a6905f037acd40f9a93c039242e1f7079c76b0fd184bc41dcc3b5c8e2e + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + 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 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da + languageName: node + linkType: hard + +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + languageName: node + linkType: hard + +"hexoid@npm:^1.0.0": + version: 1.0.0 + resolution: "hexoid@npm:1.0.0" + checksum: 27a148ca76a2358287f40445870116baaff4a0ed0acc99900bf167f0f708ffd82e044ff55e9949c71963852b580fc024146d3ac6d5d76b508b78d927fa48ae2d + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.0": + version: 4.1.0 + resolution: "http-cache-semantics@npm:4.1.0" + checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 + languageName: node + linkType: hard + +"http-errors@npm:2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"human-signals@npm:^1.1.1": + version: 1.1.1 + resolution: "human-signals@npm:1.1.1" + checksum: d587647c9e8ec24e02821b6be7de5a0fc37f591f6c4e319b3054b43fd4c35a70a94c46fc74d8c1a43c47fde157d23acd7421f375e1c1365b09a16835b8300205 + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: ">= 2.1.2 < 3" + checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.2.1 + resolution: "ignore@npm:5.2.1" + checksum: 7251d00cba49fe88c4f3565fadeb4aa726ba38294a9a79ffed542edc47bafd989d4b2ccf65700c5b1b26a1e91dfc7218fb23017937c79216025d5caeec0ee9d5 + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: ^4.2.0 + resolve-cwd: ^3.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"inquirer@npm:7.3.3": + version: 7.3.3 + resolution: "inquirer@npm:7.3.3" + dependencies: + ansi-escapes: ^4.2.1 + chalk: ^4.1.0 + cli-cursor: ^3.1.0 + cli-width: ^3.0.0 + external-editor: ^3.0.3 + figures: ^3.0.0 + lodash: ^4.17.19 + mute-stream: 0.0.8 + run-async: ^2.4.0 + rxjs: ^6.6.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + through: ^2.3.6 + checksum: 4d387fc1eb6126acbd58cbdb9ad99d2887d181df86ab0c2b9abdf734e751093e2d5882c2b6dc7144d9ab16b7ab30a78a1d7f01fb6a2850a44aeb175d1e3f8778 + languageName: node + linkType: hard + +"inquirer@npm:8.2.4": + version: 8.2.4 + resolution: "inquirer@npm:8.2.4" + 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 + checksum: dfcb6529d3af443dfea2241cb471508091b51f5121a088fdb8728b23ec9b349ef0a5e13a0ef2c8e19457b0bed22f7cbbcd561f7a4529d084c562a58c605e2655 + languageName: node + linkType: hard + +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: ^2.0.0 + checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + languageName: node + linkType: hard + +"is-core-module@npm:^2.9.0": + version: 2.11.0 + resolution: "is-core-module@npm:2.11.0" + dependencies: + has: ^1.0.3 + checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.0 + resolution: "istanbul-lib-coverage@npm:3.2.0" + checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": ^7.12.3 + "@babel/parser": ^7.14.7 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-coverage: ^3.2.0 + semver: ^6.3.0 + checksum: bf16f1803ba5e51b28bbd49ed955a736488381e09375d830e42ddeb403855b2006f850711d95ad726f2ba3f1ae8e7366de7e51d2b9ac67dc4d80191ef7ddf272 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.0 + resolution: "istanbul-lib-report@npm:3.0.0" + dependencies: + istanbul-lib-coverage: ^3.0.0 + make-dir: ^3.0.0 + supports-color: ^7.1.0 + checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: ^4.1.1 + istanbul-lib-coverage: ^3.0.0 + source-map: ^0.6.1 + checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.5 + resolution: "istanbul-reports@npm:3.1.5" + dependencies: + html-escaper: ^2.0.0 + istanbul-lib-report: ^3.0.0 + checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 + languageName: node + linkType: hard + +"iterare@npm:1.2.1": + version: 1.2.1 + resolution: "iterare@npm:1.2.1" + checksum: 70bc80038e3718aa9072bc63b3a0135166d7120bde46bfcaf80a88d11005dcef1b2d69cd353849f87a3f58ba8f546a8c6e6983408236ff01fa50b52339ee5223 + languageName: node + linkType: hard + +"jellyfin-apiclient@npm:^1.10.0": + version: 1.10.0 + resolution: "jellyfin-apiclient@npm:1.10.0" + checksum: 494161b3acf2e17db22c50fd13c637890985fa95aced5f4161045ae7a1eb80374625e83f2bd286a5a0f06847e06fab1f4dcc2d93f603bc1b033344adb12a7f7b + languageName: node + linkType: hard + +"jellyfin-discord-music-bot@workspace:.": + version: 0.0.0-use.local + resolution: "jellyfin-discord-music-bot@workspace:." + dependencies: + "@discordjs/opus": ^0.9.0 + "@jellyfin/sdk": ^0.7.0 + "@nestjs/cli": ^9.0.0 + "@nestjs/common": ^9.0.0 + "@nestjs/config": ^2.2.0 + "@nestjs/core": ^9.0.0 + "@nestjs/event-emitter": ^1.3.1 + "@nestjs/platform-express": ^9.0.0 + "@nestjs/schematics": ^9.0.0 + "@nestjs/testing": ^9.0.0 + "@types/express": ^4.17.13 + "@types/jest": 28.1.8 + "@types/node": ^16.0.0 + "@types/supertest": ^2.0.11 + "@typescript-eslint/eslint-plugin": ^5.0.0 + "@typescript-eslint/parser": ^5.0.0 + discord.js: ^14.7.1 + eslint: ^8.0.1 + eslint-config-prettier: ^8.3.0 + eslint-plugin-prettier: ^4.0.0 + jellyfin-apiclient: ^1.10.0 + jest: 28.1.3 + joi: ^17.7.0 + prettier: ^2.3.2 + reflect-metadata: ^0.1.13 + rimraf: ^3.0.2 + rxjs: ^7.2.0 + source-map-support: ^0.5.20 + supertest: ^6.1.3 + ts-jest: 28.0.8 + ts-loader: ^9.2.3 + ts-node: ^10.0.0 + tsconfig-paths: 4.1.0 + typescript: ^4.7.4 + languageName: unknown + linkType: soft + +"jest-changed-files@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-changed-files@npm:28.1.3" + dependencies: + execa: ^5.0.0 + p-limit: ^3.1.0 + checksum: c78af14a68b9b19101623ae7fde15a2488f9b3dbe8cca12a05c4a223bc9bfd3bf41ee06830f20fb560c52434435d6153c9cc6cf450b1f7b03e5e7f96a953a6a6 + languageName: node + linkType: hard + +"jest-circus@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-circus@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/expect": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + is-generator-fn: ^2.0.0 + jest-each: ^28.1.3 + jest-matcher-utils: ^28.1.3 + jest-message-util: ^28.1.3 + jest-runtime: ^28.1.3 + jest-snapshot: ^28.1.3 + jest-util: ^28.1.3 + p-limit: ^3.1.0 + pretty-format: ^28.1.3 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: b635e60a9c92adaefc3f24def8eba691e7c2fdcf6c9fa640cddf2eb8c8b26ee62eab73ebb88798fd7c52a74c1495a984e39b748429b610426f02e9d3d56e09b2 + languageName: node + linkType: hard + +"jest-cli@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-cli@npm:28.1.3" + dependencies: + "@jest/core": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/types": ^28.1.3 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^28.1.3 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: fb424576bf38346318daddee3fcc597cd78cb8dda1759d09c529d8ba1a748f2765c17b00671072a838826e59465a810ff8a232bc6ba2395c131bf3504425a363 + languageName: node + linkType: hard + +"jest-config@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-config@npm:28.1.3" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^28.1.3 + "@jest/types": ^28.1.3 + babel-jest: ^28.1.3 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^28.1.3 + jest-environment-node: ^28.1.3 + jest-get-type: ^28.0.2 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.3 + jest-runner: ^28.1.3 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^28.1.3 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: ddabffd3a3a8cb6c2f58f06cdf3535157dbf8c70bcde3e5c3de7bee6a8d617840ffc8cffb0083e38c6814f2a08c225ca19f58898efaf4f351af94679f22ce6bc + languageName: node + linkType: hard + +"jest-diff@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-diff@npm:28.1.3" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^28.1.1 + jest-get-type: ^28.0.2 + pretty-format: ^28.1.3 + checksum: fa8583e0ccbe775714ce850b009be1b0f6b17a4b6759f33ff47adef27942ebc610dbbcc8a5f7cfb7f12b3b3b05afc9fb41d5f766674616025032ff1e4f9866e0 + languageName: node + linkType: hard + +"jest-docblock@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-docblock@npm:28.1.1" + dependencies: + detect-newline: ^3.0.0 + checksum: 22fca68d988ecb2933bc65f448facdca85fc71b4bd0a188ea09a5ae1b0cc3a049a2a6ec7e7eaa2542c1d5cb5e5145e420a3df4fa280f5070f486c44da1d36151 + languageName: node + linkType: hard + +"jest-each@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-each@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + jest-util: ^28.1.3 + pretty-format: ^28.1.3 + checksum: 5c5b8ccb1484e58b027bea682cfa020a45e5bf5379cc7c23bdec972576c1dc3c3bf03df2b78416cefc1a58859dd33b7cf5fff54c370bc3c0f14a3e509eb87282 + languageName: node + linkType: hard + +"jest-environment-node@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-environment-node@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/fake-timers": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + jest-mock: ^28.1.3 + jest-util: ^28.1.3 + checksum: 1048fe306a6a8b0880a4c66278ebb57479f29c12cff89aab3aa79ab77a8859cf17ab8aa9919fd21c329a7db90e35581b43664e694ad453d5b04e00f3c6420469 + languageName: node + linkType: hard + +"jest-get-type@npm:^28.0.2": + version: 28.0.2 + resolution: "jest-get-type@npm:28.0.2" + checksum: 5281d7c89bc8156605f6d15784f45074f4548501195c26e9b188742768f72d40948252d13230ea905b5349038865a1a8eeff0e614cc530ff289dfc41fe843abd + languageName: node + linkType: hard + +"jest-haste-map@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-haste-map@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.3 + jest-worker: ^28.1.3 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: d05fdc108645fc2b39fcd4001952cc7a8cb550e93494e98c1e9ab1fc542686f6ac67177c132e564cf94fe8f81503f3f8db8b825b9b713dc8c5748aec63ba4688 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-leak-detector@npm:28.1.3" + dependencies: + jest-get-type: ^28.0.2 + pretty-format: ^28.1.3 + checksum: 2e976a4880cf9af11f53a19f6a3820e0f90b635a900737a5427fc42e337d5628ba446dcd7c020ecea3806cf92bc0bbf6982ed62a9cd84e5a13d8751aa30fbbb7 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-matcher-utils@npm:28.1.3" + dependencies: + chalk: ^4.0.0 + jest-diff: ^28.1.3 + jest-get-type: ^28.0.2 + pretty-format: ^28.1.3 + checksum: 6b34f0cf66f6781e92e3bec97bf27796bd2ba31121e5c5997218d9adba6deea38a30df5203937d6785b68023ed95cbad73663cc9aad6fb0cb59aeb5813a58daf + languageName: node + linkType: hard + +"jest-message-util@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-message-util@npm:28.1.3" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^28.1.3 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^28.1.3 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 1f266854166dcc6900d75a88b54a25225a2f3710d463063ff1c99021569045c35c7d58557b25447a17eb3a65ce763b2f9b25550248b468a9d4657db365f39e96 + languageName: node + linkType: hard + +"jest-mock@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-mock@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/node": "*" + checksum: a573bf8e5f12f4c29c661266c31b5c6b69a28d3195b83049983bce025b2b1a0152351567e89e63b102ef817034c2a3aa97eda4e776f3bae2aee54c5765573aa7 + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 + languageName: node + linkType: hard + +"jest-regex-util@npm:^28.0.2": + version: 28.0.2 + resolution: "jest-regex-util@npm:28.0.2" + checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-resolve-dependencies@npm:28.1.3" + dependencies: + jest-regex-util: ^28.0.2 + jest-snapshot: ^28.1.3 + checksum: 4eea9ec33aefc1c71dc5956391efbcc7be76bda986b366ab3931d99c5f7ed01c9ebd7520e405ea2c76e1bb2c7ce504be6eca2b9831df16564d1e625500f3bfe7 + languageName: node + linkType: hard + +"jest-resolve@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-resolve@npm:28.1.3" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + jest-pnp-resolver: ^1.2.2 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + resolve: ^1.20.0 + resolve.exports: ^1.1.0 + slash: ^3.0.0 + checksum: df61a490c93f4f4cf52135e43d6a4fcacb07b0b7d4acc6319e9289529c1d14f2d8e1638e095dbf96f156834802755e38db68caca69dba21a3261ee711d4426b6 + languageName: node + linkType: hard + +"jest-runner@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-runner@npm:28.1.3" + dependencies: + "@jest/console": ^28.1.3 + "@jest/environment": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.10.2 + graceful-fs: ^4.2.9 + jest-docblock: ^28.1.1 + jest-environment-node: ^28.1.3 + jest-haste-map: ^28.1.3 + jest-leak-detector: ^28.1.3 + jest-message-util: ^28.1.3 + jest-resolve: ^28.1.3 + jest-runtime: ^28.1.3 + jest-util: ^28.1.3 + jest-watcher: ^28.1.3 + jest-worker: ^28.1.3 + p-limit: ^3.1.0 + source-map-support: 0.5.13 + checksum: 32405cd970fa6b11e039192dae699fd1bcc6f61f67d50605af81d193f24dd4373b25f5fcc1c571a028ec1b02174e8a4b6d0d608772063fb06f08a5105693533b + languageName: node + linkType: hard + +"jest-runtime@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-runtime@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/fake-timers": ^28.1.3 + "@jest/globals": ^28.1.3 + "@jest/source-map": ^28.1.2 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + execa: ^5.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + jest-message-util: ^28.1.3 + jest-mock: ^28.1.3 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.3 + jest-snapshot: ^28.1.3 + jest-util: ^28.1.3 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: b17c40af858e74dafa4f515ef3711c1e9ef3d4ad7d74534ee0745422534bc04fd166d4eceb62a3aa7dc951505d6f6d2a81d16e90bebb032be409ec0500974a36 + languageName: node + linkType: hard + +"jest-snapshot@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-snapshot@npm:28.1.3" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/babel__traverse": ^7.0.6 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^28.1.3 + graceful-fs: ^4.2.9 + jest-diff: ^28.1.3 + jest-get-type: ^28.0.2 + jest-haste-map: ^28.1.3 + jest-matcher-utils: ^28.1.3 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + natural-compare: ^1.4.0 + pretty-format: ^28.1.3 + semver: ^7.3.5 + checksum: 2a46a5493f1fb50b0a236a21f25045e7f46a244f9f3ae37ef4fbcd40249d0d68bb20c950ce77439e4e2cac985b05c3061c90b34739bf6069913a1199c8c716e1 + languageName: node + linkType: hard + +"jest-util@npm:^28.0.0, jest-util@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-util@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: fd6459742c941f070223f25e38a2ac0719aad92561591e9fb2a50d602a5d19d754750b79b4074327a42b00055662b95da3b006542ceb8b54309da44d4a62e721 + languageName: node + linkType: hard + +"jest-validate@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-validate@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + leven: ^3.1.0 + pretty-format: ^28.1.3 + checksum: 95e0513b3803c3372a145cda86edbdb33d9dfeaa18818176f2d581e821548ceac9a179f065b6d4671a941de211354efd67f1fff8789a4fb89962565c85f646db + languageName: node + linkType: hard + +"jest-watcher@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-watcher@npm:28.1.3" + dependencies: + "@jest/test-result": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.10.2 + jest-util: ^28.1.3 + string-length: ^4.0.1 + checksum: 8f6d674a4865e7df251f71544f1b51f06fd36b5a3a61f2ac81aeb81fa2a196be354fba51d0f97911c88f67cd254583b3a22ee124bf2c5b6ee2fadec27356c207 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 + languageName: node + linkType: hard + +"jest-worker@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-worker@npm:28.1.3" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: e921c9a1b8f0909da9ea07dbf3592f95b653aef3a8bb0cbcd20fc7f9a795a1304adecac31eecb308992c167e8d7e75c522061fec38a5928ace0f9571c90169ca + languageName: node + linkType: hard + +"jest@npm:28.1.3": + version: 28.1.3 + resolution: "jest@npm:28.1.3" + dependencies: + "@jest/core": ^28.1.3 + "@jest/types": ^28.1.3 + import-local: ^3.0.2 + jest-cli: ^28.1.3 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: b9dcb542eb7c16261c281cdc2bf37155dbb3f1205bae0b567f05051db362c85ddd4b765f126591efb88f6d298eb10336d0aa6c7d5373b4d53f918137a9a70182 + languageName: node + linkType: hard + +"joi@npm:^17.7.0": + version: 17.7.0 + resolution: "joi@npm:17.7.0" + dependencies: + "@hapi/hoek": ^9.0.0 + "@hapi/topo": ^5.0.0 + "@sideway/address": ^4.1.3 + "@sideway/formula": ^3.0.0 + "@sideway/pinpoint": ^2.0.0 + checksum: 767a847936cb66787256c4351ff86e1b9e8d7383cbe81a5c827064032c2a8e8b6e938baef5ad32c4035fe4c56e537bd90aa2a952be8a0658601c920cdeb4fb3c + languageName: node + linkType: hard + +"js-sdsl@npm:^4.1.4": + version: 4.2.0 + resolution: "js-sdsl@npm:4.2.0" + checksum: 2cd0885f7212afb355929d72ca105cb37de7e95ad6031e6a32619eaefa46735a7d0fb682641a0ba666e1519cb138fe76abc1eea8a34e224140c9d94c995171f1 + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json5@npm:^2.2.1": + version: 2.2.1 + resolution: "json5@npm:2.2.1" + bin: + json5: lib/cli.js + checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + languageName: node + linkType: hard + +"jsonc-parser@npm:3.1.0": + version: 3.1.0 + resolution: "jsonc-parser@npm:3.1.0" + checksum: 81b00c565c60cb1b400523a918d42ad9c7bb3d9cf34c708bf78d37c8c496ecd670c3ff8828f2f60aa6e6627ef4287982794ddf92261ea71e320973c54b29fb22 + languageName: node + linkType: hard + +"jsonc-parser@npm:3.2.0": + version: 3.2.0 + resolution: "jsonc-parser@npm:3.2.0" + checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.snakecase@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.snakecase@npm:4.1.1" + checksum: 1685ed3e83dda6eae5a4dcaee161a51cd210aabb3e1c09c57150e7dd8feda19e4ca0d27d0631eabe8d0f4eaa51e376da64e8c018ae5415417c5890d42feb72a8 + languageName: node + linkType: hard + +"lodash@npm:4.17.21, lodash@npm:^4.17.19, lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: ^4.1.0 + is-unicode-supported: ^0.1.0 + checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.14.1 + resolution: "lru-cache@npm:7.14.1" + checksum: d72c6713c6a6d86836a7a6523b3f1ac6764768cca47ec99341c3e76db06aacd4764620e5e2cda719a36848785a52a70e531822dc2b33fb071fa709683746c104 + languageName: node + linkType: hard + +"macos-release@npm:^2.5.0": + version: 2.5.0 + resolution: "macos-release@npm:2.5.0" + checksum: 57379ba354449898ceca91ca8f1ae4d0b2c45671e8a5200d29054a77b462a0319eb3dcb8a8b6bbe2257079cf682550abcfd8a6214a60ac78e4a71c007df1fc85 + languageName: node + linkType: hard + +"magic-string@npm:0.26.2": + version: 0.26.2 + resolution: "magic-string@npm:0.26.2" + dependencies: + sourcemap-codec: ^1.4.8 + checksum: b4db4e2b370ac8d9ffc6443a2b591b75364bf1fc9121b5a4068d5b89804abff6709d1fa4a0e0c2d54f2e61e0e44db83efdfe219a5ab0ba6d25ee1f2b51fbed55 + languageName: node + linkType: hard + +"make-dir@npm:^3.0.0, make-dir@npm:^3.1.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: ^6.0.0 + checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 + languageName: node + linkType: hard + +"make-error@npm:1.x, make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^10.0.3": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^16.1.0 + http-cache-semantics: ^4.1.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-fetch: ^2.0.3 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^9.0.0 + checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: 1.0.5 + checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 + languageName: node + linkType: hard + +"memfs@npm:^3.4.1": + version: 3.4.12 + resolution: "memfs@npm:3.4.12" + dependencies: + fs-monkey: ^1.0.3 + checksum: dab8dec1ae0b2a92e4d563ac86846047cd7aeb17cde4ad51da85cff6e580c32d12b886354527788e36eb75f733dd8edbaf174476b7cea73fed9c5a0e45a6b428 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.1": + version: 1.0.1 + resolution: "merge-descriptors@npm:1.0.1" + checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"methods@npm:^1.1.2, methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a + languageName: node + linkType: hard + +"micromatch@npm:^4.0.0, micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 + languageName: node + linkType: hard + +"mime@npm:2.6.0": + version: 2.6.0 + resolution: "mime@npm:2.6.0" + bin: + mime: cli.js + checksum: 1497ba7b9f6960694268a557eae24b743fd2923da46ec392b042469f4b901721ba0adcf8b0d3c2677839d0e243b209d76e5edcbd09cfdeffa2dfb6bb4df4b862 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.1 + resolution: "minimatch@npm:5.1.1" + dependencies: + brace-expansion: ^2.0.1 + checksum: 215edd0978320a3354188f84a537d45841f2449af4df4379f79b9b777e71aa4f5722cc9d1717eabd2a70d38ef76ab7b708d24d83ea6a6c909dfd8833de98b437 + languageName: node + linkType: hard + +"minimist@npm:^1.2.6": + version: 1.2.7 + resolution: "minimist@npm:1.2.7" + checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^2.0.3": + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" + dependencies: + encoding: ^0.1.13 + minipass: ^3.1.6 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass@npm:4.0.0" + dependencies: + yallist: ^4.0.0 + checksum: 7a609afbf394abfcf9c48e6c90226f471676c8f2a67f07f6838871afb03215ede431d1433feffe1b855455bcb13ef0eb89162841b9796109d6fed8d89790f381 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.4": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: ^1.2.6 + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.0.0": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"multer@npm:1.4.4-lts.1": + version: 1.4.4-lts.1 + resolution: "multer@npm:1.4.4-lts.1" + dependencies: + append-field: ^1.0.0 + busboy: ^1.0.0 + concat-stream: ^1.5.2 + mkdirp: ^0.5.4 + object-assign: ^4.1.1 + type-is: ^1.6.4 + xtend: ^4.0.0 + checksum: da04b06efdbff9bd42d9f71297eeb2c0566231a4b9c895f49479c09b163c5e404aa6e58bd1c19f006f82e2114362545e39cbf7e0163ffd8d73d0f88adf4489e2 + languageName: node + linkType: hard + +"mute-stream@npm:0.0.8": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 + languageName: node + linkType: hard + +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + languageName: node + linkType: hard + +"node-abort-controller@npm:^3.0.1": + version: 3.0.1 + resolution: "node-abort-controller@npm:3.0.1" + checksum: 2b3d75c65249fea99e8ba22da3a8bc553f034f44dd12f5f4b38b520f718b01c88718c978f0c24c2a460fc01de9a80b567028f547b94440cb47adeacfeb82c2ee + languageName: node + linkType: hard + +"node-addon-api@npm:^5.0.0": + version: 5.0.0 + resolution: "node-addon-api@npm:5.0.0" + dependencies: + node-gyp: latest + checksum: 7c5e2043ac37f6108784d94ed73a44ae6d3e68eb968de60680922fc6bc3d17fa69448c0feb4e0c9d3f4c74a0324822e566a8340a56916d9d6f23cb3e85620334 + languageName: node + linkType: hard + +"node-emoji@npm:1.11.0": + version: 1.11.0 + resolution: "node-emoji@npm:1.11.0" + dependencies: + lodash: ^4.17.21 + checksum: e8c856c04a1645062112a72e59a98b203505ed5111ff84a3a5f40611afa229b578c7d50f1e6a7f17aa62baeea4a640d2e2f61f63afc05423aa267af10977fb2b + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": + version: 2.6.7 + resolution: "node-fetch@npm:2.6.7" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.3.0 + resolution: "node-gyp@npm:9.3.0" + dependencies: + env-paths: ^2.2.0 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^10.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 589ddd3ed967724ef425f9624bfa47cf73022640ab3eba6d556e92cdc4ddef33b63fce3a467c93b995a3f61df92eafd3c3d1e8dbe4a2c00c383334487dea99c3 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e + languageName: node + linkType: hard + +"node-releases@npm:^2.0.6": + version: 2.0.7 + resolution: "node-releases@npm:2.0.7" + checksum: d1c5af091d788b7f9dfce5aa77cbf76c28e8e326b891fe64a05b96943a90cd6ba19eae94ef32777c23f5898a7b00d9cf8266adba33d61ebe6611cca74ccfc0b1 + languageName: node + linkType: hard + +"nopt@npm:^5.0.0": + version: 5.0.0 + resolution: "nopt@npm:5.0.0" + dependencies: + abbrev: 1 + bin: + nopt: bin/nopt.js + checksum: d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: ^3.0.0 + checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + languageName: node + linkType: hard + +"npmlog@npm:^5.0.1": + version: 5.0.1 + resolution: "npmlog@npm:5.0.1" + dependencies: + are-we-there-yet: ^2.0.0 + console-control-strings: ^1.1.0 + gauge: ^3.0.0 + set-blocking: ^2.0.0 + checksum: 516b2663028761f062d13e8beb3f00069c5664925871a9b57989642ebe09f23ab02145bf3ab88da7866c4e112cafff72401f61a672c7c8a20edc585a7016ef5f + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"object-assign@npm:^4, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-hash@npm:3.0.0": + version: 3.0.0 + resolution: "object-hash@npm:3.0.0" + checksum: 80b4904bb3857c52cc1bfd0b52c0352532ca12ed3b8a6ff06a90cd209dfda1b95cee059a7625eb9da29537027f68ac4619363491eedb2f5d3dddbba97494fd6c + languageName: node + linkType: hard + +"object-inspect@npm:^1.9.0": + version: 1.12.2 + resolution: "object-inspect@npm:1.12.2" + checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: 1.1.1 + checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: ^2.1.0 + checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + languageName: node + linkType: hard + +"optionator@npm:^0.9.1": + version: 0.9.1 + resolution: "optionator@npm:0.9.1" + 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 + checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + languageName: node + linkType: hard + +"ora@npm:5.4.1, ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + 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 + checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 + languageName: node + linkType: hard + +"os-name@npm:4.0.1": + version: 4.0.1 + resolution: "os-name@npm:4.0.1" + dependencies: + macos-release: ^2.5.0 + windows-release: ^4.0.0 + checksum: 507ae75979ec410b5fccaddddc7e8afb3f9fd096e902230d8ae940590513e64fce6fe25fd1ccc410ec89defc78b5593d71cb1c323e546621c210c4a7086c7399 + languageName: node + linkType: hard + +"os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + 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 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.7": + version: 0.1.7 + resolution: "path-to-regexp@npm:0.1.7" + checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce + languageName: node + linkType: hard + +"path-to-regexp@npm:3.2.0": + version: 3.2.0 + resolution: "path-to-regexp@npm:3.2.0" + checksum: c3d35cda3b26d9e604d789b9a1764bb9845f53ca8009d5809356b4677a3c064b0f01117a05a5b4b77bafd5ae002a82592e3f3495e885c22961f8b1dab8bd6ae7 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"peek-readable@npm:^5.0.0": + version: 5.0.0 + resolution: "peek-readable@npm:5.0.0" + checksum: bef5ceb50586eb42e14efba274ac57ffe97f0ed272df9239ce029f688f495d9bf74b2886fa27847c706a9db33acda4b7d23bbd09a2d21eb4c2a54da915117414 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.5 + resolution: "pirates@npm:4.0.5" + checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"pluralize@npm:8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: ^1.1.2 + checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + languageName: node + linkType: hard + +"prettier@npm:^2.3.2": + version: 2.8.1 + resolution: "prettier@npm:2.8.1" + bin: + prettier: bin-prettier.js + checksum: 4f21a0f1269f76fb36f54e9a8a1ea4c11e27478958bf860661fb4b6d7ac69aac1581f8724fa98ea3585e56d42a2ea317a17ff6e3324f40cb11ff9e20b73785cc + languageName: node + linkType: hard + +"pretty-format@npm:^28.0.0, pretty-format@npm:^28.1.3": + version: 28.1.3 + resolution: "pretty-format@npm:28.1.3" + dependencies: + "@jest/schemas": ^28.1.3 + ansi-regex: ^5.0.1 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: ^3.0.3 + sisteransi: ^1.0.5 + checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d + languageName: node + linkType: hard + +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + languageName: node + linkType: hard + +"qs@npm:6.11.0, qs@npm:^6.11.0": + version: 6.11.0 + resolution: "qs@npm:6.11.0" + dependencies: + side-channel: ^1.0.4 + checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: ^5.1.0 + checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + languageName: node + linkType: hard + +"range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 + languageName: node + linkType: hard + +"raw-body@npm:2.5.1": + version: 2.5.1 + resolution: "raw-body@npm:2.5.1" + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + languageName: node + linkType: hard + +"readable-stream@npm:^2.2.2": + version: 2.3.7 + resolution: "readable-stream@npm:2.3.7" + 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 + checksum: e4920cf7549a60f8aaf694d483a0e61b2a878b969d224f89b3bc788b8d920075132c4b55a7494ee944c7b6a9a0eada28a7f6220d80b0312ece70bbf08eeca755 + languageName: node + linkType: hard + +"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.0 + resolution: "readable-stream@npm:3.6.0" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 + languageName: node + linkType: hard + +"readable-web-to-node-stream@npm:^3.0.2": + version: 3.0.2 + resolution: "readable-web-to-node-stream@npm:3.0.2" + dependencies: + readable-stream: ^3.6.0 + checksum: 8c56cc62c68513425ddfa721954875b382768f83fa20e6b31e365ee00cbe7a3d6296f66f7f1107b16cd3416d33aa9f1680475376400d62a081a88f81f0ea7f9c + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + languageName: node + linkType: hard + +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" + dependencies: + resolve: ^1.1.6 + checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b + languageName: node + linkType: hard + +"reflect-metadata@npm:^0.1.13": + version: 0.1.13 + resolution: "reflect-metadata@npm:0.1.13" + checksum: 798d379a7b6f6455501145419505c97dd11cbc23857a386add2b9ef15963ccf15a48d9d15507afe01d4cd74116df8a213247200bac00320bd7c11ddeaa5e8fb4 + languageName: node + linkType: hard + +"regexpp@npm:^3.2.0": + version: 3.2.0 + resolution: "regexpp@npm:3.2.0" + checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: ^5.0.0 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve.exports@npm:^1.1.0": + version: 1.1.0 + resolution: "resolve.exports@npm:1.1.0" + checksum: 52865af8edb088f6c7759a328584a5de6b226754f004b742523adcfe398cfbc4559515104bc2ae87b8e78b1e4de46c9baec400b3fb1f7d517b86d2d48a098a2d + languageName: node + linkType: hard + +"resolve@npm:^1.1.6, resolve@npm:^1.20.0": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.20.0#~builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: ^5.1.0 + signal-exit: ^3.0.2 + checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:3.0.2, rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"rxjs@npm:6.6.7, rxjs@npm:^6.6.0": + version: 6.6.7 + resolution: "rxjs@npm:6.6.7" + dependencies: + tslib: ^1.9.0 + checksum: bc334edef1bb8bbf56590b0b25734ba0deaf8825b703256a93714308ea36dff8a11d25533671adf8e104e5e8f256aa6fdfe39b2e248cdbd7a5f90c260acbbd1b + languageName: node + linkType: hard + +"rxjs@npm:^7.2.0, rxjs@npm:^7.5.5": + version: 7.6.0 + resolution: "rxjs@npm:7.6.0" + dependencies: + tslib: ^2.1.0 + checksum: b3abbbfe1ddfd06fca9314b83cbd13bcddc3320429218136f75c79a4802ac430dd13873364aac1ded54fd457f8c77df332d205a92d8a1c61656565bb718c50af + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.1.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": + version: 3.1.1 + resolution: "schema-utils@npm:3.1.1" + dependencies: + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 + ajv-keywords: ^3.5.2 + checksum: fb73f3d759d43ba033c877628fe9751620a26879f6301d3dbeeb48cf2a65baec5cdf99da65d1bf3b4ff5444b2e59cbe4f81c2456b5e0d2ba7d7fd4aed5da29ce + languageName: node + linkType: hard + +"semver@npm:7.x, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8": + version: 7.3.8 + resolution: "semver@npm:7.3.8" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + +"send@npm:0.18.0": + version: 0.18.0 + resolution: "send@npm:0.18.0" + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + etag: ~1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: ~1.2.1 + statuses: 2.0.1 + checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.0": + version: 6.0.0 + resolution: "serialize-javascript@npm:6.0.0" + dependencies: + randombytes: ^2.1.0 + checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 + languageName: node + linkType: hard + +"serve-static@npm:1.15.0": + version: 1.15.0 + resolution: "serve-static@npm:1.15.0" + dependencies: + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + parseurl: ~1.3.3 + send: 0.18.0 + checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"shelljs@npm:0.8.5": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" + dependencies: + glob: ^7.0.0 + interpret: ^1.0.0 + rechoir: ^0.6.2 + bin: + shjs: bin/shjs + checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.21, source-map-support@npm:^0.5.20, source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:0.7.4": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"sourcemap-codec@npm:^1.4.8": + version: 1.4.8 + resolution: "sourcemap-codec@npm:1.4.8" + checksum: b57981c05611afef31605732b598ccf65124a9fcb03b833532659ac4d29ac0f7bfacbc0d6c5a28a03e84c7510e7e556d758d0bb57786e214660016fb94279316 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"ssri@npm:^9.0.0": + version: 9.0.1 + resolution: "ssri@npm:9.0.1" + dependencies: + minipass: ^3.1.1 + checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: ^2.0.0 + checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb + languageName: node + linkType: hard + +"streamsearch@npm:^1.1.0": + version: 1.1.0 + resolution: "streamsearch@npm:1.1.0" + checksum: 1cce16cea8405d7a233d32ca5e00a00169cc0e19fbc02aa839959985f267335d435c07f96e5e0edd0eadc6d39c98d5435fb5bbbdefc62c41834eadc5622ad942 + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: ^1.0.2 + strip-ansi: ^6.0.0 + checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 + languageName: node + linkType: hard + +"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1, string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: ~5.1.0 + checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"strtok3@npm:^7.0.0": + version: 7.0.0 + resolution: "strtok3@npm:7.0.0" + dependencies: + "@tokenizer/token": ^0.3.0 + peek-readable: ^5.0.0 + checksum: 2ebe7ad8f2aea611dec6742cf6a42e82764892a362907f7ce493faf334501bf981ce21c828dcc300457e6d460dc9c34d644ededb3b01dcb9e37559203cf1748c + languageName: node + linkType: hard + +"superagent@npm:^8.0.5": + version: 8.0.6 + resolution: "superagent@npm:8.0.6" + dependencies: + component-emitter: ^1.3.0 + cookiejar: ^2.1.3 + debug: ^4.3.4 + fast-safe-stringify: ^2.1.1 + form-data: ^4.0.0 + formidable: ^2.1.1 + methods: ^1.1.2 + mime: 2.6.0 + qs: ^6.11.0 + semver: ^7.3.8 + checksum: 2dfe44b74acd37da34cb44617919927ebf689570f46f89234be3a0b8e89cae5afca8e28adae6b6be77a3cd06661f47cf5c4c872e9d98ba184e8f12fcb041a29d + languageName: node + linkType: hard + +"supertest@npm:^6.1.3": + version: 6.3.3 + resolution: "supertest@npm:6.3.3" + dependencies: + methods: ^1.1.2 + superagent: ^8.0.5 + checksum: 38239e517f7ba62b7a139a79c5c48d55f8d67b5ff4b6e51d5b07732ca8bbc4a28ffa1b10916fbb403dd013a054dbf028edc5850057d9a43aecbff439d494673e + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-hyperlinks@npm:^2.0.0": + version: 2.3.0 + resolution: "supports-hyperlinks@npm:2.3.0" + dependencies: + has-flag: ^4.0.0 + supports-color: ^7.0.0 + checksum: 9ee0de3c8ce919d453511b2b1588a8205bd429d98af94a01df87411391010fe22ca463f268c84b2ce2abad019dfff8452aa02806eeb5c905a8d7ad5c4f4c52b8 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"symbol-observable@npm:4.0.0": + version: 4.0.0 + resolution: "symbol-observable@npm:4.0.0" + checksum: 212c7edce6186634d671336a88c0e0bbd626c2ab51ed57498dc90698cce541839a261b969c2a1e8dd43762133d47672e8b62e0b1ce9cf4157934ba45fd172ba8 + languageName: node + linkType: hard + +"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.1.13 + resolution: "tar@npm:6.1.13" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^4.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c + languageName: node + linkType: hard + +"terminal-link@npm:^2.0.0": + version: 2.1.1 + resolution: "terminal-link@npm:2.1.1" + dependencies: + ansi-escapes: ^4.2.1 + supports-hyperlinks: ^2.0.0 + checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.1.3": + version: 5.3.6 + resolution: "terser-webpack-plugin@npm:5.3.6" + dependencies: + "@jridgewell/trace-mapping": ^0.3.14 + jest-worker: ^27.4.5 + schema-utils: ^3.1.1 + serialize-javascript: ^6.0.0 + terser: ^5.14.1 + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 8f3448d7fdb0434ce6a0c09d95c462bfd2f4a5a430233d854163337f734a7f5c07c74513d16081e06d4ca33d366d5b1a36f5444219bc41a7403afd6162107bad + languageName: node + linkType: hard + +"terser@npm:^5.14.1": + version: 5.16.1 + resolution: "terser@npm:5.16.1" + dependencies: + "@jridgewell/source-map": ^0.3.2 + acorn: ^8.5.0 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: cb524123504a2f0d9140c1e1a8628c83bba9cacc404c6aca79e2493a38dfdf21275617ba75b91006b3f1ff586e401ab31121160cd253699f334c6340ea2756f5 + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": ^0.1.2 + glob: ^7.1.4 + minimatch: ^3.0.4 + checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"through@npm:^2.3.6": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd + languageName: node + linkType: hard + +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: ~1.0.2 + checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 + languageName: node + linkType: hard + +"token-types@npm:^5.0.1": + version: 5.0.1 + resolution: "token-types@npm:5.0.1" + dependencies: + "@tokenizer/token": ^0.3.0 + ieee754: ^1.2.1 + checksum: 32780123bc6ce8b6a2231d860445c994a02a720abf38df5583ea957aa6626873cd1c4dd8af62314da4cf16ede00c379a765707a3b06f04b8808c38efdae1c785 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + +"tree-kill@npm:1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 49117f5f410d19c84b0464d29afb9642c863bc5ba40fcb9a245d474c6d5cc64d1b177a6e6713129eb346b40aebb9d4631d967517f9fbe8251c35b21b13cd96c7 + languageName: node + linkType: hard + +"ts-jest@npm:28.0.8": + version: 28.0.8 + resolution: "ts-jest@npm:28.0.8" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^28.0.0 + json5: ^2.2.1 + lodash.memoize: 4.x + make-error: 1.x + semver: 7.x + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^28.0.0 + babel-jest: ^28.0.0 + jest: ^28.0.0 + typescript: ">=4.3" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: c72e9292709e77ce47ac7813cb24feaa9d01dc983598d29a821f224b5cc190dc7d67e17379cef089095404c00b9d582ee91c727916f9ec289cb1b723df408ae3 + languageName: node + linkType: hard + +"ts-loader@npm:^9.2.3": + version: 9.4.2 + resolution: "ts-loader@npm:9.4.2" + dependencies: + chalk: ^4.1.0 + enhanced-resolve: ^5.0.0 + micromatch: ^4.0.0 + semver: ^7.3.4 + peerDependencies: + typescript: "*" + webpack: ^5.0.0 + checksum: 6f306ee4c615c2a159fb177561e3fb86ca2cbd6c641e710d408a64b4978e1ff3f2c9733df07bff27d3f82efbfa7c287523d4306049510c7485ac2669a9c37eb0 + languageName: node + linkType: hard + +"ts-mixer@npm:^6.0.2": + version: 6.0.2 + resolution: "ts-mixer@npm:6.0.2" + checksum: cbe9935886fab201f2265ebde8e7e4147a3147ba6b6b4701ed5b92fd52729cda340f45f80f486131d203ed25c8c896a2a3623b2c33cd14314bd7ba961e97ee2e + languageName: node + linkType: hard + +"ts-node@npm:^10.0.0": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + languageName: node + linkType: hard + +"tsconfig-paths-webpack-plugin@npm:4.0.0": + version: 4.0.0 + resolution: "tsconfig-paths-webpack-plugin@npm:4.0.0" + dependencies: + chalk: ^4.1.0 + enhanced-resolve: ^5.7.0 + tsconfig-paths: ^4.0.0 + checksum: 7ff7d63c1153e6dd30ce660b006495ae5cb5cbb78b30bb59b3cb627567325d4af52c7a69dda8aec7b94d576f5385581a69307472992954c40fe6949564155397 + languageName: node + linkType: hard + +"tsconfig-paths@npm:4.1.0": + version: 4.1.0 + resolution: "tsconfig-paths@npm:4.1.0" + dependencies: + json5: ^2.2.1 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: e4b101f81b2abd95499d8145e0aa73144e857c2c359191058486cef101b7accae22a69114e5d5814a13d5ab3b0bae70dd0c85bcdb7e829bbe1bfda5c9067c9b1 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^4.0.0": + version: 4.1.1 + resolution: "tsconfig-paths@npm:4.1.1" + dependencies: + json5: ^2.2.1 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: 3a1c6c8f614370ee648313d71bbde2a3bcdfb7e99ad068b7791d7b04fac78f120021c96ab4ec285ba78469f13fc08317a987fdf0d90ea03f8d47305e25bd29c6 + languageName: node + linkType: hard + +"tslib@npm:2.4.1, tslib@npm:^2.1.0, tslib@npm:^2.4.1": + version: 2.4.1 + resolution: "tslib@npm:2.4.1" + checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca + languageName: node + linkType: hard + +"tslib@npm:^1.8.1, tslib@npm:^1.9.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + languageName: node + linkType: hard + +"type-is@npm:^1.6.4, type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: 0.3.0 + mime-types: ~2.1.24 + checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 + languageName: node + linkType: hard + +"typescript@npm:4.8.4": + version: 4.8.4 + resolution: "typescript@npm:4.8.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 3e4f061658e0c8f36c820802fa809e0fd812b85687a9a2f5430bc3d0368e37d1c9605c3ce9b39df9a05af2ece67b1d844f9f6ea8ff42819f13bcb80f85629af0 + languageName: node + linkType: hard + +"typescript@npm:^4.7.4": + version: 4.9.4 + resolution: "typescript@npm:4.9.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e782fb9e0031cb258a80000f6c13530288c6d63f1177ed43f770533fdc15740d271554cdae86701c1dd2c83b082cea808b07e97fd68b38a172a83dbf9e0d0ef9 + languageName: node + linkType: hard + +"typescript@patch:typescript@4.8.4#~builtin": + version: 4.8.4 + resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin::version=4.8.4&hash=0102e9" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 301459fc3eb3b1a38fe91bf96d98eb55da88a9cb17b4ef80b4d105d620f4d547ba776cc27b44cc2ef58b66eda23fe0a74142feb5e79a6fb99f54fc018a696afa + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.7.4#~builtin": + version: 4.9.4 + resolution: "typescript@patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=d73830" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 37f6e2c3c5e2aa5934b85b0fddbf32eeac8b1bacf3a5b51d01946936d03f5377fe86255d4e5a4ae628fd0cd553386355ad362c57f13b4635064400f3e8e05b9d + languageName: node + linkType: hard + +"undici@npm:^5.13.0": + version: 5.14.0 + resolution: "undici@npm:5.14.0" + dependencies: + busboy: ^1.6.0 + checksum: 7a076e44d84b25844b4eb657034437b8b9bb91f17d347de474fdea1d4263ce7ae9406db79cd30de5642519277b4893f43073258bcc8fed420b295da3fdd11b26 + languageName: node + linkType: hard + +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" + dependencies: + unique-slug: ^3.0.0 + checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + languageName: node + linkType: hard + +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + languageName: node + linkType: hard + +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.9": + version: 1.0.10 + resolution: "update-browserslist-db@npm:1.0.10" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + browserslist-lint: cli.js + checksum: 12db73b4f63029ac407b153732e7cd69a1ea8206c9100b482b7d12859cd3cd0bc59c602d7ae31e652706189f1acb90d42c53ab24a5ba563ed13aebdddc5561a0 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 + languageName: node + linkType: hard + +"uuid@npm:8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + +"uuid@npm:9.0.0": + version: 9.0.0 + resolution: "uuid@npm:9.0.0" + bin: + uuid: dist/bin/uuid + checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.0.1 + resolution: "v8-to-istanbul@npm:9.0.1" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^1.6.0 + checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 + languageName: node + linkType: hard + +"vary@npm:^1, vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: 1.0.12 + checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + languageName: node + linkType: hard + +"watchpack@npm:^2.4.0": + version: 2.4.0 + resolution: "watchpack@npm:2.4.0" + dependencies: + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.1.2 + checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131 + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: ^1.0.3 + checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + +"webpack-node-externals@npm:3.0.0": + version: 3.0.0 + resolution: "webpack-node-externals@npm:3.0.0" + checksum: 355080c35c821115b97dda8c93d9d0565a90a6012a532324eb0d6a64f8f0d609431fd29504fc7ce414755841ac14f601f3eef99472c2c5dc00233b504ebe73f2 + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 + languageName: node + linkType: hard + +"webpack@npm:5.74.0": + version: 5.74.0 + resolution: "webpack@npm:5.74.0" + dependencies: + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^0.0.51 + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/wasm-edit": 1.11.1 + "@webassemblyjs/wasm-parser": 1.11.1 + acorn: ^8.7.1 + acorn-import-assertions: ^1.7.6 + browserslist: ^4.14.5 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.10.0 + es-module-lexer: ^0.9.0 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.9 + json-parse-even-better-errors: ^2.3.1 + loader-runner: ^4.2.0 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^3.1.0 + tapable: ^2.1.1 + terser-webpack-plugin: ^5.1.3 + watchpack: ^2.4.0 + webpack-sources: ^3.2.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 320c41369a75051b19e18c63f408b3dcc481852e992f83d311771c5ec0f05f2946385e8ebef62030cf3587f0a3d2f12779ffdb191569a966847289ba7313f946 + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"windows-release@npm:^4.0.0": + version: 4.0.0 + resolution: "windows-release@npm:4.0.0" + dependencies: + execa: ^4.0.2 + checksum: 77c87d332d9e8ad94a72844c0bee169babd63ab06636521fc6ffacb2f1fb2ec3f38b81bc3fcb53ec76b57c1add33348c16660a38ac6aed381190d9c2b95c39e6 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.3": + version: 1.2.3 + resolution: "word-wrap@npm:1.2.3" + checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f + languageName: node + linkType: hard + +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.1": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^3.0.7 + checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c + languageName: node + linkType: hard + +"ws@npm:^8.11.0": + version: 8.11.0 + resolution: "ws@npm:8.11.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 316b33aba32f317cd217df66dbfc5b281a2f09ff36815de222bc859e3424d83766d9eb2bd4d667de658b6ab7be151f258318fb1da812416b30be13103e5b5c67 + languageName: node + linkType: hard + +"xtend@npm:^4.0.0": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yaml@npm:^1.10.0": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f + languageName: node + linkType: hard + +"yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs@npm:^17.3.1": + version: 17.6.2 + resolution: "yargs@npm:17.6.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 47da1b0d854fa16d45a3ded57b716b013b2179022352a5f7467409da5a04a1eef5b3b3d97a2dfc13e8bbe5f2ffc0afe3bc6a4a72f8254e60f5a4bd7947138643 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard From 0e70791284f118857e2deeef6896a1d7ad63193e Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 10:42:35 +0100 Subject: [PATCH 02/40] =?UTF-8?q?=F0=9F=9A=A8=20Fix=20eslint=20warnings=20?= =?UTF-8?q?and=20remove=20old=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.json.example | 10 ---------- parseENV.js | 16 ---------------- src/clients/discord/discord.module.ts | 7 +++---- src/clients/discord/discord.service.ts | 2 +- 4 files changed, 4 insertions(+), 31 deletions(-) delete mode 100644 config.json.example delete mode 100644 parseENV.js diff --git a/config.json.example b/config.json.example deleted file mode 100644 index 3672d4e..0000000 --- a/config.json.example +++ /dev/null @@ -1,10 +0,0 @@ -{ - "token": "", - "server-address": "", - "jellyfin-username": "", - "jellyfin-password": "", - "discord-prefix": "?", - "jellyfin-app-name": "Jellyfin Discord Music Bot", - "interactive-seek-bar-update-intervall": 10000, - "log-level": "info" -} diff --git a/parseENV.js b/parseENV.js deleted file mode 100644 index 393b2e4..0000000 --- a/parseENV.js +++ /dev/null @@ -1,16 +0,0 @@ -const fs = require("fs"); -const filename = "./config.json"; -const configfile = require(filename); - -if (process.env.DISCORD_PREFIX) { configfile["discord-prefix"] = process.env.DISCORD_PREFIX; } -if (process.env.DISCORD_TOKEN) { configfile.token = process.env.DISCORD_TOKEN; } -if (process.env.JELLYFIN_SERVER_ADDRESS) { configfile["server-address"] = process.env.JELLYFIN_SERVER_ADDRESS; } -if (process.env.JELLYFIN_USERNAME) { configfile["jellyfin-username"] = process.env.JELLYFIN_USERNAME; } -if (process.env.JELLYFIN_PASSWORD) { configfile["jellyfin-password"] = process.env.JELLYFIN_PASSWORD; } -if (process.env.JELLYFIN_APP_NAME) { configfile["jellyfin-app-name"] = process.env.JELLYFIN_APP_NAME; } -if (process.env.MESSAGE_UPDATE_INTERVAL) { configfile["interactive-seek-bar-update-intervall"] = parseInt(process.env.MESSAGE_UPDATE_INTERVAL); } -if (process.env.LOG_LEVEL) { configfile["log-level"] = process.env.LOG_LEVEL; } - -fs.writeFile(filename, JSON.stringify(configfile, null, 1), (err) => { - if (err) return console.error(err); -}); diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts index 45078fc..1e61691 100644 --- a/src/clients/discord/discord.module.ts +++ b/src/clients/discord/discord.module.ts @@ -1,5 +1,5 @@ -import { Module, OnModuleDestroy, OnModuleInit } from "@nestjs/common"; -import { DiscordService } from "./discord.service"; +import { Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; +import { DiscordService } from './discord.service'; @Module({ imports: [], @@ -8,7 +8,6 @@ import { DiscordService } from "./discord.service"; exports: [DiscordService], }) export class DiscordClientModule implements OnModuleInit, OnModuleDestroy { - constructor(private discordService: DiscordService) {} onModuleDestroy() { this.discordService.destroyClient(); @@ -19,4 +18,4 @@ export class DiscordClientModule implements OnModuleInit, OnModuleDestroy { this.discordService.registerEventHandlers(); this.discordService.connectAndLogin(); } -} \ No newline at end of file +} diff --git a/src/clients/discord/discord.service.ts b/src/clients/discord/discord.service.ts index d43f7a8..d6cf09d 100644 --- a/src/clients/discord/discord.service.ts +++ b/src/clients/discord/discord.service.ts @@ -1,7 +1,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; -import { ActivityType, Client } from 'discord.js'; +import { Client } from 'discord.js'; @Injectable() export class DiscordService { From beb34b7d7cacc9425d09fc8a4b224c5ff4f455a6 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 13:48:39 +0100 Subject: [PATCH 03/40] =?UTF-8?q?=E2=9C=A8=20Add=20nestjs=20discord=20pack?= =?UTF-8?q?age?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + src/app.module.ts | 12 +- src/clients/discord/discord.module.ts | 21 +--- src/clients/discord/discord.service.ts | 46 -------- .../discord/jellyfin.config.service.ts | 18 +++ src/clients/jellyfin/jellyfin.service.ts | 10 +- src/commands/abstractCommand.ts | 6 - src/commands/command.module.ts | 12 ++ .../handler/command-handler.module.ts | 10 -- .../handler/command-handler.service.ts | 107 ------------------ src/commands/help.command.ts | 90 +++++++++++++++ tsconfig.json | 3 +- yarn.lock | 83 ++++++++++++++ 13 files changed, 230 insertions(+), 190 deletions(-) delete mode 100644 src/clients/discord/discord.service.ts create mode 100644 src/clients/discord/jellyfin.config.service.ts delete mode 100644 src/commands/abstractCommand.ts create mode 100644 src/commands/command.module.ts delete mode 100644 src/commands/handler/command-handler.module.ts delete mode 100644 src/commands/handler/command-handler.service.ts create mode 100644 src/commands/help.command.ts diff --git a/package.json b/package.json index f2eec95..2e6e0e1 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { + "@discord-nestjs/common": "^4.0.8", + "@discord-nestjs/core": "^4.3.1", "@discordjs/opus": "^0.9.0", "@jellyfin/sdk": "^0.7.0", "@nestjs/common": "^9.0.0", diff --git a/src/app.module.ts b/src/app.module.ts index f34c13a..1e67a10 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,14 +1,16 @@ import { Module } from '@nestjs/common'; import * as Joi from 'joi'; -import { EventEmitterModule } from '@nestjs/event-emitter'; +import { DiscordModule } from '@discord-nestjs/core'; import { ConfigModule } from '@nestjs/config'; +import { EventEmitterModule } from '@nestjs/event-emitter'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { DiscordClientModule } from './clients/discord/discord.module'; -import { CommandHandlerModule } from './commands/handler/command-handler.module'; import { JellyfinClientModule } from './clients/jellyfin/jellyfin.module'; +import { CommandModule } from './commands/command.module'; +import { DiscordConfigService } from './clients/discord/jellyfin.config.service'; @Module({ imports: [ @@ -20,10 +22,14 @@ import { JellyfinClientModule } from './clients/jellyfin/jellyfin.module'; JELLYFIN_AUTHENTICATION_PASSWORD: Joi.string().required(), }), }), + DiscordModule.forRootAsync({ + useClass: DiscordConfigService, + }), + DiscordModule, EventEmitterModule.forRoot(), + CommandModule, DiscordClientModule, JellyfinClientModule, - CommandHandlerModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts index 1e61691..86d2df1 100644 --- a/src/clients/discord/discord.module.ts +++ b/src/clients/discord/discord.module.ts @@ -1,21 +1,10 @@ -import { Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; -import { DiscordService } from './discord.service'; +import { Module } from '@nestjs/common'; +import { DiscordConfigService } from './jellyfin.config.service'; @Module({ imports: [], controllers: [], - providers: [DiscordService], - exports: [DiscordService], + providers: [DiscordConfigService], + exports: [DiscordConfigService], }) -export class DiscordClientModule implements OnModuleInit, OnModuleDestroy { - constructor(private discordService: DiscordService) {} - onModuleDestroy() { - this.discordService.destroyClient(); - } - - onModuleInit() { - this.discordService.initializeClient(); - this.discordService.registerEventHandlers(); - this.discordService.connectAndLogin(); - } -} +export class DiscordClientModule {} diff --git a/src/clients/discord/discord.service.ts b/src/clients/discord/discord.service.ts deleted file mode 100644 index d6cf09d..0000000 --- a/src/clients/discord/discord.service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Injectable, Logger } from '@nestjs/common'; -import { EventEmitter2 } from '@nestjs/event-emitter'; - -import { Client } from 'discord.js'; - -@Injectable() -export class DiscordService { - private readonly logger = new Logger(DiscordService.name); - private client: Client; - - constructor(private eventEmitter: EventEmitter2) {} - - initializeClient() { - this.client = new Client({ - intents: ['Guilds', 'GuildMessages', 'MessageContent'], - }); - this.logger.debug('Initialized Discord client'); - } - - connectAndLogin() { - this.client.login(process.env.DISCORD_CLIENT_TOKEN); - } - - registerEventHandlers() { - this.client.on('ready', () => { - this.logger.debug(`Connected as '${this.client.user.tag}' and ready!`); - this.eventEmitter.emit('client.discord.ready'); - }); - - this.client.on('messageCreate', async (message) => { - if (message.author.bot) { - return; - } - - await message.channel.send('nice'); - }); - } - - destroyClient() { - this.client.destroy(); - } - - getClient() { - return this.client; - } -} diff --git a/src/clients/discord/jellyfin.config.service.ts b/src/clients/discord/jellyfin.config.service.ts new file mode 100644 index 0000000..c8c8d7f --- /dev/null +++ b/src/clients/discord/jellyfin.config.service.ts @@ -0,0 +1,18 @@ +import { + DiscordModuleOption, + DiscordOptionsFactory, +} from '@discord-nestjs/core'; +import { Injectable } from '@nestjs/common'; +import { GatewayIntentBits } from 'discord.js'; + +@Injectable() +export class DiscordConfigService implements DiscordOptionsFactory { + createDiscordOptions(): DiscordModuleOption { + return { + token: process.env.DISCORD_CLIENT_TOKEN, + discordClientOptions: { + intents: [GatewayIntentBits.Guilds], + }, + }; + } +} diff --git a/src/clients/jellyfin/jellyfin.service.ts b/src/clients/jellyfin/jellyfin.service.ts index efa5dbb..3c750a9 100644 --- a/src/clients/jellyfin/jellyfin.service.ts +++ b/src/clients/jellyfin/jellyfin.service.ts @@ -35,10 +35,18 @@ export class JellyfinService { process.env.JELLYFIN_AUTHENTICATION_PASSWORD, ) .then((response) => { + if (response.data.SessionInfo === undefined) { + this.logger.error( + `Failed to authenticate with response code ${response.status}: '${response.data}'`, + ); + return; + } + this.logger.debug( `Connected using user '${response.data.SessionInfo.UserId}'`, ); - }).catch((test) => { + }) + .catch((test) => { this.logger.error(test); }); } diff --git a/src/commands/abstractCommand.ts b/src/commands/abstractCommand.ts deleted file mode 100644 index fd87fb7..0000000 --- a/src/commands/abstractCommand.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SlashCommandBuilder } from "discord.js"; - -export abstract class Command { - abstract builder(): SlashCommandBuilder; - abstract execute(): void; -} \ No newline at end of file diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts new file mode 100644 index 0000000..e816157 --- /dev/null +++ b/src/commands/command.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { DiscordModule } from '@discord-nestjs/core'; + +import { HelpCommand } from './help.command'; + +@Module({ + imports: [DiscordModule.forFeature()], + controllers: [], + providers: [HelpCommand], + exports: [], +}) +export class CommandModule {} diff --git a/src/commands/handler/command-handler.module.ts b/src/commands/handler/command-handler.module.ts deleted file mode 100644 index f9a52b3..0000000 --- a/src/commands/handler/command-handler.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { DiscordClientModule } from '../../clients/discord/discord.module'; -import { CommandHandlerService } from './command-handler.service'; - -@Module({ - imports: [DiscordClientModule], - controllers: [], - providers: [CommandHandlerService], -}) -export class CommandHandlerModule {} diff --git a/src/commands/handler/command-handler.service.ts b/src/commands/handler/command-handler.service.ts deleted file mode 100644 index 2048c3c..0000000 --- a/src/commands/handler/command-handler.service.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { EmbedBuilder } from '@discordjs/builders'; -import { Injectable, Logger } from '@nestjs/common'; -import { OnEvent } from '@nestjs/event-emitter'; -import { - ApplicationCommand, - SlashCommandBuilder, - SlashCommandSubcommandBuilder, -} from 'discord.js'; -import { DiscordService } from 'src/clients/discord/discord.service'; -import { Command } from '../abstractCommand'; - -@Injectable() -export class CommandHandlerService { - private logger: Logger = new Logger(CommandHandlerService.name); - - constructor(private discordService: DiscordService) {} - - @OnEvent('client.discord.ready') - async handleOnDiscordClientReady() { - var commands = [ - new SlashCommandBuilder() - .setName('play') - .setDescription('Immideatly play a track') - .addStringOption((option) => - option - .setName('track') - .setDescription('the track name') - .setRequired(true), - ), - new SlashCommandBuilder() - .setName('summon') - .setDescription('Join your current voice channel'), - new SlashCommandBuilder() - .setName('disconnect') - .setDescription('Disconnect from the current voice channel'), - new SlashCommandBuilder() - .setName('enqueue') - .setDescription('Enqueue a track to the current playlist') - .addStringOption((option) => - option - .setName('track') - .setDescription('the track name') - .setRequired(true), - ), - new SlashCommandBuilder() - .setName('current') - .setDescription('Print the current track information'), - new SlashCommandBuilder() - .setName('pause') - .setDescription('Pause or resume the playback of the current track'), - new SlashCommandBuilder() - .setName('skip') - .setDescription('Skip the current track'), - new SlashCommandBuilder() - .setName('stop') - .setDescription( - 'Stop playback entirely and clear the current playlist', - ), - new SlashCommandBuilder() - .setName('help') - .setDescription('Get help for this Discord Bot'), - ]; - - await this.discordService - .getClient() - .application.commands.set(commands.map((x) => x.toJSON())); - - this.discordService - .getClient() - .on('interactionCreate', async (interaction) => { - if (!interaction.isChatInputCommand()) { - return; - } - - await interaction.reply({ - embeds: [ - new EmbedBuilder() - .setAuthor({ - name: 'Jellyfin Discord Bot', - iconURL: - 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', - url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - }) - .setTitle('Help Information') - .setDescription( - 'Jellyfin Discord Music bot is an easy way to broadcast your music collection to a Discord voicechannel.', - ) - .addFields([ - { - name: 'Report an issue', - value: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', - inline: true, - }, - { - name: 'Source code', - value: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - inline: true, - }, - ]) - .toJSON(), - ], - }); - }); - } -} diff --git a/src/commands/help.command.ts b/src/commands/help.command.ts new file mode 100644 index 0000000..b011fbc --- /dev/null +++ b/src/commands/help.command.ts @@ -0,0 +1,90 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { EmbedBuilder } from '@discordjs/builders'; +import { InteractionReplyOptions, MessagePayload } from 'discord.js'; + +@Command({ + name: 'help', + description: 'ejifejf', +}) +@UsePipes(TransformPipe) +export class HelpCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): + | string + | void + | MessagePayload + | InteractionReplyOptions + | Promise { + return { + embeds: [ + new EmbedBuilder() + .setAuthor({ + name: 'Jellyfin Discord Bot', + iconURL: + 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', + url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + }) + .setTitle('Help Information') + .setDescription( + 'Jellyfin Discord Music bot is an easy way to broadcast your music collection to a Discord voicechannel.', + ) + .addFields([ + { + name: 'Report an issue', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', + inline: true, + }, + { + name: 'Source code', + value: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + inline: true, + }, + ]) + .toJSON(), + ], + }; + } + + /* + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ) { + return new EmbedBuilder() + .setAuthor({ + name: 'Jellyfin Discord Bot', + iconURL: + 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', + url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + }) + .setTitle('Help Information') + .setDescription( + 'Jellyfin Discord Music bot is an easy way to broadcast your music collection to a Discord voicechannel.', + ) + .addFields([ + { + name: 'Report an issue', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', + inline: true, + }, + { + name: 'Source code', + value: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + inline: true, + }, + ]) + .toJSON(); + } + */ +} diff --git a/tsconfig.json b/tsconfig.json index adb614c..efc026f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,7 @@ "noImplicitAny": false, "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, - "noFallthroughCasesInSwitch": false + "noFallthroughCasesInSwitch": false, + "useDefineForClassFields": true } } diff --git a/yarn.lock b/yarn.lock index bc84168..306355c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -491,6 +491,39 @@ __metadata: languageName: node linkType: hard +"@discord-nestjs/common@npm:^4.0.8": + version: 4.0.8 + resolution: "@discord-nestjs/common@npm:4.0.8" + dependencies: + "@nestjs/mapped-types": 1.2.0 + class-transformer: 0.5.1 + class-validator: 0.13.2 + peerDependencies: + "@discord-nestjs/core": "*" + "@nestjs/common": 8.* || 9.* + "@nestjs/core": 8.* || 9.* + discord.js: 14.* + reflect-metadata: ^0.1.13 + rxjs: ^7.* + checksum: 254f740d6762f3cfe827500b7c0b0a1357c631032a95fe82a1425dbbebe97e442add85a5d85dfaf333a53cb16caea293a8345bb8e17832f8f67c605676bca69f + languageName: node + linkType: hard + +"@discord-nestjs/core@npm:^4.3.1": + version: 4.3.1 + resolution: "@discord-nestjs/core@npm:4.3.1" + dependencies: + class-transformer: 0.5.1 + peerDependencies: + "@nestjs/common": 8.* || 9.* + "@nestjs/core": 8.* || 9.* + discord.js: 14.* + reflect-metadata: ^0.1.13 + rxjs: ^7.* + checksum: 2a9013126359520d9133fa547f4a08f46eb9f3d7329aa516ef22c9c779794815ba4b1e1cb5b7e899a9e16c11568931d8a14f9cb52e3944d80bf8e292e6a6daba + languageName: node + linkType: hard + "@discordjs/builders@npm:^1.4.0": version: 1.4.0 resolution: "@discordjs/builders@npm:1.4.0" @@ -1076,6 +1109,23 @@ __metadata: languageName: node linkType: hard +"@nestjs/mapped-types@npm:1.2.0": + version: 1.2.0 + resolution: "@nestjs/mapped-types@npm:1.2.0" + peerDependencies: + "@nestjs/common": ^7.0.8 || ^8.0.0 || ^9.0.0 + class-transformer: ^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0 + class-validator: ^0.11.1 || ^0.12.0 || ^0.13.0 + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + checksum: cc625310873c5caf69521bc03c75a6780467f662fd4c8b2402f6e65228268eec1244c131dbf65c81c985680feacee50dae7d3c1f2b7bced7bad79922389aa38f + languageName: node + linkType: hard + "@nestjs/platform-express@npm:^9.0.0": version: 9.2.1 resolution: "@nestjs/platform-express@npm:9.2.1" @@ -2547,6 +2597,23 @@ __metadata: languageName: node linkType: hard +"class-transformer@npm:0.5.1": + version: 0.5.1 + resolution: "class-transformer@npm:0.5.1" + checksum: f191c8b4cc4239990f5efdd790cabdd852c243ed66248e39f6616a349c910c6eed2d9fd1fbf7ee6ea89f69b4f1d0b493b27347fe0cd0ae26b47c3745a805b6d3 + languageName: node + linkType: hard + +"class-validator@npm:0.13.2": + version: 0.13.2 + resolution: "class-validator@npm:0.13.2" + dependencies: + libphonenumber-js: ^1.9.43 + validator: ^13.7.0 + checksum: 0deb4c29faa18345f6989fd7eaaaa07b05caae5298603fcd6485531c6daad503e5d2b24cc1342e4fc88ae5ba0acffdc24d0fc333110ef3f21a667cd8a79e1258 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -4361,6 +4428,8 @@ __metadata: version: 0.0.0-use.local resolution: "jellyfin-discord-music-bot@workspace:." dependencies: + "@discord-nestjs/common": ^4.0.8 + "@discord-nestjs/core": ^4.3.1 "@discordjs/opus": ^0.9.0 "@jellyfin/sdk": ^0.7.0 "@nestjs/cli": ^9.0.0 @@ -4995,6 +5064,13 @@ __metadata: languageName: node linkType: hard +"libphonenumber-js@npm:^1.9.43": + version: 1.10.15 + resolution: "libphonenumber-js@npm:1.10.15" + checksum: 94283206159b9eaf07e4af9c002dda2b0b171099a8116baa0b6871f6312475112ec92121cca85916968fa9fb1220641205f6ee2349a1cc33197d811a69572198 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -7137,6 +7213,13 @@ __metadata: languageName: node linkType: hard +"validator@npm:^13.7.0": + version: 13.7.0 + resolution: "validator@npm:13.7.0" + checksum: 2b83283de1222ca549a7ef57f46e8d49c6669213348db78b7045bce36a3b5843ff1e9f709ebf74574e06223461ee1f264f8cc9a26a0060a79a27de079d8286ef + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" From f5c1cb71a6bf0a493ac604446a7f075b4d0006a2 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 14:15:32 +0100 Subject: [PATCH 04/40] =?UTF-8?q?=E2=9C=A8=20Add=20status=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/command.module.ts | 3 +- src/commands/help.command.ts | 37 ++---------------------- src/commands/status.command.ts | 52 ++++++++++++++++++++++++++++++++++ src/types/colors.ts | 3 ++ 4 files changed, 60 insertions(+), 35 deletions(-) create mode 100644 src/commands/status.command.ts create mode 100644 src/types/colors.ts diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index e816157..a6f6066 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -2,11 +2,12 @@ import { Module } from '@nestjs/common'; import { DiscordModule } from '@discord-nestjs/core'; import { HelpCommand } from './help.command'; +import { StatusCommand } from './status.command'; @Module({ imports: [DiscordModule.forFeature()], controllers: [], - providers: [HelpCommand], + providers: [HelpCommand, StatusCommand], exports: [], }) export class CommandModule {} diff --git a/src/commands/help.command.ts b/src/commands/help.command.ts index b011fbc..f909a06 100644 --- a/src/commands/help.command.ts +++ b/src/commands/help.command.ts @@ -8,10 +8,11 @@ import { } from '@discord-nestjs/core'; import { EmbedBuilder } from '@discordjs/builders'; import { InteractionReplyOptions, MessagePayload } from 'discord.js'; +import { DefaultJellyfinColor } from 'src/types/colors'; @Command({ name: 'help', - description: 'ejifejf', + description: 'Get help if you're having problems with this bot', }) @UsePipes(TransformPipe) export class HelpCommand implements DiscordTransformedCommand { @@ -33,6 +34,7 @@ export class HelpCommand implements DiscordTransformedCommand { 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', }) + .setColor(DefaultJellyfinColor) .setTitle('Help Information') .setDescription( 'Jellyfin Discord Music bot is an easy way to broadcast your music collection to a Discord voicechannel.', @@ -54,37 +56,4 @@ export class HelpCommand implements DiscordTransformedCommand { ], }; } - - /* - handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ) { - return new EmbedBuilder() - .setAuthor({ - name: 'Jellyfin Discord Bot', - iconURL: - 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', - url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - }) - .setTitle('Help Information') - .setDescription( - 'Jellyfin Discord Music bot is an easy way to broadcast your music collection to a Discord voicechannel.', - ) - .addFields([ - { - name: 'Report an issue', - value: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', - inline: true, - }, - { - name: 'Source code', - value: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - inline: true, - }, - ]) - .toJSON(); - } - */ } diff --git a/src/commands/status.command.ts b/src/commands/status.command.ts new file mode 100644 index 0000000..a478e8d --- /dev/null +++ b/src/commands/status.command.ts @@ -0,0 +1,52 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + InjectDiscordClient, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { EmbedBuilder } from '@discordjs/builders'; +import { Client, InteractionReplyOptions } from 'discord.js'; +import { DefaultJellyfinColor } from 'src/types/colors'; + +@Command({ + name: 'status', + description: 'Display the current status for troubleshooting', +}) +@UsePipes(TransformPipe) +export class StatusCommand implements DiscordTransformedCommand { + constructor( + @InjectDiscordClient() + private readonly client: Client, + ) {} + + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions { + const ping = this.client.ws.ping; + + return { + embeds: [ + new EmbedBuilder() + .setTitle('Online and ready') + .setColor(DefaultJellyfinColor) + .addFields([ + { + name: 'Ping', + value: `${ping}ms`, + inline: true, + }, + { + name: 'Source code', + value: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + inline: true, + }, + ]) + .toJSON(), + ], + }; + } +} diff --git a/src/types/colors.ts b/src/types/colors.ts new file mode 100644 index 0000000..8c64332 --- /dev/null +++ b/src/types/colors.ts @@ -0,0 +1,3 @@ +import { RGBTuple } from 'discord.js'; + +export const DefaultJellyfinColor: RGBTuple = [119, 116, 204]; From 3d9ba8ede74065932f5dcfb78616ac1b34198798 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 16:10:16 +0100 Subject: [PATCH 05/40] =?UTF-8?q?=E2=9C=A8=20Add=20playback=20commands?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/commands/command.module.ts | 21 ++++++++++++++++++++- src/commands/current.command.ts | 23 +++++++++++++++++++++++ src/commands/disconnect.command.ts | 23 +++++++++++++++++++++++ src/commands/enqueue.command.ts | 23 +++++++++++++++++++++++ src/commands/pause.command.ts | 25 +++++++++++++++++++++++++ src/commands/play.command.ts | 23 +++++++++++++++++++++++ src/commands/skip.command.ts | 23 +++++++++++++++++++++++ src/commands/status.command.ts | 26 +++++++++++++++++++++++--- src/commands/stop.command.ts | 23 +++++++++++++++++++++++ src/commands/summon.command.ts | 23 +++++++++++++++++++++++ yarn.lock | 8 ++++++++ 12 files changed, 238 insertions(+), 4 deletions(-) create mode 100644 src/commands/current.command.ts create mode 100644 src/commands/disconnect.command.ts create mode 100644 src/commands/enqueue.command.ts create mode 100644 src/commands/pause.command.ts create mode 100644 src/commands/play.command.ts create mode 100644 src/commands/skip.command.ts create mode 100644 src/commands/stop.command.ts create mode 100644 src/commands/summon.command.ts diff --git a/package.json b/package.json index 2e6e0e1..3b28725 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@nestjs/core": "^9.0.0", "@nestjs/event-emitter": "^1.3.1", "@nestjs/platform-express": "^9.0.0", + "date-fns": "^2.29.3", "discord.js": "^14.7.1", "jellyfin-apiclient": "^1.10.0", "joi": "^17.7.0", diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index a6f6066..c014edd 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -3,11 +3,30 @@ import { DiscordModule } from '@discord-nestjs/core'; import { HelpCommand } from './help.command'; import { StatusCommand } from './status.command'; +import { CurrentTrackCommand } from './current.command'; +import { DisconnectCommand } from './disconnect.command'; +import { EnqueueCommand } from './enqueue.command'; +import { PausePlaybackCommand } from './pause.command'; +import { PlayCommand } from './play.command'; +import { SkipTrackCommand } from './skip.command'; +import { StopPlaybackCommand } from './stop.command'; +import { SummonCommand } from './summon.command'; @Module({ imports: [DiscordModule.forFeature()], controllers: [], - providers: [HelpCommand, StatusCommand], + providers: [ + HelpCommand, + StatusCommand, + CurrentTrackCommand, + DisconnectCommand, + EnqueueCommand, + PausePlaybackCommand, + PlayCommand, + SkipTrackCommand, + StopPlaybackCommand, + SummonCommand, + ], exports: [], }) export class CommandModule {} diff --git a/src/commands/current.command.ts b/src/commands/current.command.ts new file mode 100644 index 0000000..c678fad --- /dev/null +++ b/src/commands/current.command.ts @@ -0,0 +1,23 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'current', + description: 'Print the current track information', +}) +@UsePipes(TransformPipe) +export class CurrentTrackCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/src/commands/disconnect.command.ts b/src/commands/disconnect.command.ts new file mode 100644 index 0000000..5f596e3 --- /dev/null +++ b/src/commands/disconnect.command.ts @@ -0,0 +1,23 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'disconnect', + description: 'Join your current voice channel', +}) +@UsePipes(TransformPipe) +export class DisconnectCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/src/commands/enqueue.command.ts b/src/commands/enqueue.command.ts new file mode 100644 index 0000000..824a548 --- /dev/null +++ b/src/commands/enqueue.command.ts @@ -0,0 +1,23 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'enqueue', + description: 'Enqueue a track to the current playlist', +}) +@UsePipes(TransformPipe) +export class EnqueueCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/src/commands/pause.command.ts b/src/commands/pause.command.ts new file mode 100644 index 0000000..c15707c --- /dev/null +++ b/src/commands/pause.command.ts @@ -0,0 +1,25 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'pause', + description: 'Pause or resume the playback of the current track', +}) +@UsePipes(TransformPipe) +export class PausePlaybackCommand + implements DiscordTransformedCommand +{ + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/src/commands/play.command.ts b/src/commands/play.command.ts new file mode 100644 index 0000000..57219b5 --- /dev/null +++ b/src/commands/play.command.ts @@ -0,0 +1,23 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'play', + description: 'Immediately play a track', +}) +@UsePipes(TransformPipe) +export class PlayCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/src/commands/skip.command.ts b/src/commands/skip.command.ts new file mode 100644 index 0000000..a1ae7e3 --- /dev/null +++ b/src/commands/skip.command.ts @@ -0,0 +1,23 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'skip', + description: 'Skip the current track', +}) +@UsePipes(TransformPipe) +export class SkipTrackCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/src/commands/status.command.ts b/src/commands/status.command.ts index a478e8d..b5c3124 100644 --- a/src/commands/status.command.ts +++ b/src/commands/status.command.ts @@ -8,9 +8,12 @@ import { UsePipes, } from '@discord-nestjs/core'; import { EmbedBuilder } from '@discordjs/builders'; -import { Client, InteractionReplyOptions } from 'discord.js'; +import { Client, InteractionReplyOptions, Status } from 'discord.js'; import { DefaultJellyfinColor } from 'src/types/colors'; +import { formatDuration, intervalToDuration } from 'date-fns'; +import { Constants } from 'src/utils/constants'; + @Command({ name: 'status', description: 'Display the current status for troubleshooting', @@ -27,6 +30,13 @@ export class StatusCommand implements DiscordTransformedCommand { executionContext: TransformedCommandExecutionContext, ): InteractionReplyOptions { const ping = this.client.ws.ping; + const status = Status[this.client.ws.status]; + + const interval = intervalToDuration({ + start: this.client.uptime, + end: 0, + }); + const formattedDuration = formatDuration(interval); return { embeds: [ @@ -34,14 +44,24 @@ export class StatusCommand implements DiscordTransformedCommand { .setTitle('Online and ready') .setColor(DefaultJellyfinColor) .addFields([ + { + name: 'Version', + value: Constants.Metadata.Version, + inline: false, + }, { name: 'Ping', value: `${ping}ms`, inline: true, }, { - name: 'Source code', - value: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + name: 'Status', + value: `${status}`, + inline: true, + }, + { + name: 'Uptime', + value: `${formattedDuration}`, inline: true, }, ]) diff --git a/src/commands/stop.command.ts b/src/commands/stop.command.ts new file mode 100644 index 0000000..c5d9e42 --- /dev/null +++ b/src/commands/stop.command.ts @@ -0,0 +1,23 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'stop', + description: 'Stop playback entirely and clear the current playlist', +}) +@UsePipes(TransformPipe) +export class StopPlaybackCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/src/commands/summon.command.ts b/src/commands/summon.command.ts new file mode 100644 index 0000000..2bde645 --- /dev/null +++ b/src/commands/summon.command.ts @@ -0,0 +1,23 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { InteractionReplyOptions } from 'discord.js'; + +@Command({ + name: 'summon', + description: 'Join your current voice channel', +}) +@UsePipes(TransformPipe) +export class SummonCommand implements DiscordTransformedCommand { + handler( + dto: unknown, + executionContext: TransformedCommandExecutionContext, + ): InteractionReplyOptions | string { + return 'nice'; + } +} diff --git a/yarn.lock b/yarn.lock index 306355c..d33eb53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2892,6 +2892,13 @@ __metadata: languageName: node linkType: hard +"date-fns@npm:^2.29.3": + version: 2.29.3 + resolution: "date-fns@npm:2.29.3" + checksum: e01cf5b62af04e05dfff921bb9c9933310ed0e1ae9a81eb8653452e64dc841acf7f6e01e1a5ae5644d0337e9a7f936175fd2cb6819dc122fdd9c5e86c56be484 + languageName: node + linkType: hard + "debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -4446,6 +4453,7 @@ __metadata: "@types/supertest": ^2.0.11 "@typescript-eslint/eslint-plugin": ^5.0.0 "@typescript-eslint/parser": ^5.0.0 + date-fns: ^2.29.3 discord.js: ^14.7.1 eslint: ^8.0.1 eslint-config-prettier: ^8.3.0 From 2b8851195165256c31fbc68fa0b7f87059223e7e Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 20:12:51 +0100 Subject: [PATCH 06/40] =?UTF-8?q?=E2=9C=A8=20Add=20icons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/icons/alert-circle.png | Bin 0 -> 5077 bytes images/icons/circle-check.png | Bin 0 -> 5193 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/icons/alert-circle.png create mode 100644 images/icons/circle-check.png diff --git a/images/icons/alert-circle.png b/images/icons/alert-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..0f943627fdf1362cb243abc6ee74b7ef589f1df2 GIT binary patch literal 5077 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 mD=FK8(NX_H(^>r^5|n9jJ>pW1 literal 0 HcmV?d00001 diff --git a/images/icons/circle-check.png b/images/icons/circle-check.png new file mode 100644 index 0000000000000000000000000000000000000000..b37339d5d73eddba2dbae00f225fa1ff69493046 GIT binary patch literal 5193 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 literal 0 HcmV?d00001 From c581ef748a51f4bc9b7e8db774109181a626ee88 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 20:17:24 +0100 Subject: [PATCH 07/40] =?UTF-8?q?=F0=9F=92=84=20Color=20icons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/icons/alert-circle.png | Bin 5077 -> 11854 bytes images/icons/circle-check.png | Bin 5193 -> 12144 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/images/icons/alert-circle.png b/images/icons/alert-circle.png index 0f943627fdf1362cb243abc6ee74b7ef589f1df2..facc2e0a7821e99857eff49fa69e796f987830f1 100644 GIT binary patch literal 11854 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 literal 5077 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 mD=FK8(NX_H(^>r^5|n9jJ>pW1 diff --git a/images/icons/circle-check.png b/images/icons/circle-check.png index b37339d5d73eddba2dbae00f225fa1ff69493046..c1bd6a9ac966eb1f8980925441742777944d6c39 100644 GIT binary patch literal 12144 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 C-{k%P literal 5193 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 From 73f2f0eb5f9df915624c7734ef1510b5f1bca21a Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 21:21:26 +0100 Subject: [PATCH 08/40] =?UTF-8?q?=E2=9C=A8=20Implement=20Summon=20and=20Di?= =?UTF-8?q?sconnect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++ package.json | 1 + src/app.module.ts | 2 +- ...g.service.ts => discord.config.service.ts} | 7 +- src/clients/discord/discord.module.ts | 2 +- src/clients/discord/discord.voice.service.ts | 14 ++++ src/clients/jellyfin/jellyfin.service.ts | 5 +- src/commands/disconnect.command.ts | 56 ++++++++++++---- src/commands/status.command.ts | 2 +- src/commands/summon.command.ts | 65 +++++++++++++++---- src/types/colors.ts | 1 + src/utils/constants.ts | 8 +-- yarn.lock | 35 ++++++++++ 13 files changed, 167 insertions(+), 36 deletions(-) rename src/clients/discord/{jellyfin.config.service.ts => discord.config.service.ts} (68%) create mode 100644 src/clients/discord/discord.voice.service.ts diff --git a/README.md b/README.md index 0144ba0..95c7cca 100644 --- a/README.md +++ b/README.md @@ -61,3 +61,8 @@ $ npm run test:e2e # test coverage $ npm run test:cov ``` + +## 👤 Credits +- https://tabler-icons.io/ (MIT) +- https://docs.nestjs.com/ (MIT) +- https://discord.js.org/ (Apache 2.0) \ No newline at end of file diff --git a/package.json b/package.json index 3b28725..b788a56 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@discord-nestjs/common": "^4.0.8", "@discord-nestjs/core": "^4.3.1", "@discordjs/opus": "^0.9.0", + "@discordjs/voice": "^0.14.0", "@jellyfin/sdk": "^0.7.0", "@nestjs/common": "^9.0.0", "@nestjs/config": "^2.2.0", diff --git a/src/app.module.ts b/src/app.module.ts index 1e67a10..4c6d7a7 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,7 +10,7 @@ import { AppService } from './app.service'; import { DiscordClientModule } from './clients/discord/discord.module'; import { JellyfinClientModule } from './clients/jellyfin/jellyfin.module'; import { CommandModule } from './commands/command.module'; -import { DiscordConfigService } from './clients/discord/jellyfin.config.service'; +import { DiscordConfigService } from './clients/discord/discord.config.service'; @Module({ imports: [ diff --git a/src/clients/discord/jellyfin.config.service.ts b/src/clients/discord/discord.config.service.ts similarity index 68% rename from src/clients/discord/jellyfin.config.service.ts rename to src/clients/discord/discord.config.service.ts index c8c8d7f..c17f74b 100644 --- a/src/clients/discord/jellyfin.config.service.ts +++ b/src/clients/discord/discord.config.service.ts @@ -11,7 +11,12 @@ export class DiscordConfigService implements DiscordOptionsFactory { return { token: process.env.DISCORD_CLIENT_TOKEN, discordClientOptions: { - intents: [GatewayIntentBits.Guilds], + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + GatewayIntentBits.GuildIntegrations, + ], }, }; } diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts index 86d2df1..abad467 100644 --- a/src/clients/discord/discord.module.ts +++ b/src/clients/discord/discord.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { DiscordConfigService } from './jellyfin.config.service'; +import { DiscordConfigService } from './discord.config.service'; @Module({ imports: [], diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts new file mode 100644 index 0000000..a969208 --- /dev/null +++ b/src/clients/discord/discord.voice.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from "@nestjs/common"; +import { VoiceChannel } from "discord.js"; + +@Injectable() +export class DiscordVoiceService { + + summonClient(voiceChannel: VoiceChannel) { + // voiceChannel.join(''); + } + + startPlayback() { + + } +} \ No newline at end of file diff --git a/src/clients/jellyfin/jellyfin.service.ts b/src/clients/jellyfin/jellyfin.service.ts index 3c750a9..56433c7 100644 --- a/src/clients/jellyfin/jellyfin.service.ts +++ b/src/clients/jellyfin/jellyfin.service.ts @@ -1,8 +1,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { Api, Jellyfin } from '@jellyfin/sdk'; - -import { Constants } from 'src/utils/constants'; +import { Constants } from '../../utils/constants'; @Injectable() export class JellyfinService { @@ -10,8 +9,6 @@ export class JellyfinService { private jellyfin: Jellyfin; private api: Api; - constructor() {} - init() { this.jellyfin = new Jellyfin({ clientInfo: { diff --git a/src/commands/disconnect.command.ts b/src/commands/disconnect.command.ts index 5f596e3..46fcccc 100644 --- a/src/commands/disconnect.command.ts +++ b/src/commands/disconnect.command.ts @@ -1,23 +1,55 @@ import { TransformPipe } from '@discord-nestjs/common'; +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; import { - Command, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; + CommandInteraction, + EmbedBuilder, + InteractionReplyOptions, +} from 'discord.js'; +import { getVoiceConnection } from '@discordjs/voice'; +import { DefaultJellyfinColor, ErrorJellyfinColor } from '../types/colors'; @Command({ name: 'disconnect', description: 'Join your current voice channel', }) @UsePipes(TransformPipe) -export class DisconnectCommand implements DiscordTransformedCommand { - handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions | string { - return 'nice'; +export class DisconnectCommand implements DiscordCommand { + handler(interaction: CommandInteraction): InteractionReplyOptions | string { + const connection = getVoiceConnection(interaction.guildId); + + if (!connection) { + return { + embeds: [ + new EmbedBuilder() + .setColor(ErrorJellyfinColor) + .setAuthor({ + name: 'Unable to disconnect from voice channel', + iconURL: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', + }) + .setDescription( + 'I am currently not connected to any voice channels', + ) + .toJSON(), + ], + }; + return; + } + + connection.destroy(); + + return { + embeds: [ + new EmbedBuilder() + .setColor(DefaultJellyfinColor) + .setAuthor({ + name: 'Disconnected from your channel', + iconURL: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/circle-check.png?raw=true', + }) + .toJSON(), + ], + }; } } diff --git a/src/commands/status.command.ts b/src/commands/status.command.ts index b5c3124..b4aadb7 100644 --- a/src/commands/status.command.ts +++ b/src/commands/status.command.ts @@ -12,7 +12,7 @@ import { Client, InteractionReplyOptions, Status } from 'discord.js'; import { DefaultJellyfinColor } from 'src/types/colors'; import { formatDuration, intervalToDuration } from 'date-fns'; -import { Constants } from 'src/utils/constants'; +import { Constants } from '../utils/constants'; @Command({ name: 'status', diff --git a/src/commands/summon.command.ts b/src/commands/summon.command.ts index 2bde645..6f39006 100644 --- a/src/commands/summon.command.ts +++ b/src/commands/summon.command.ts @@ -1,23 +1,64 @@ import { TransformPipe } from '@discord-nestjs/common'; +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; +import { joinVoiceChannel } from '@discordjs/voice'; +import { Logger } from '@nestjs/common'; import { - Command, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; + CommandInteraction, + EmbedBuilder, + GuildMember, + InteractionReplyOptions +} from 'discord.js'; +import { DefaultJellyfinColor } from '../types/colors'; @Command({ name: 'summon', description: 'Join your current voice channel', }) @UsePipes(TransformPipe) -export class SummonCommand implements DiscordTransformedCommand { - handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions | string { - return 'nice'; +export class SummonCommand implements DiscordCommand { + private readonly logger = new Logger(SummonCommand.name); + + handler(interaction: CommandInteraction): InteractionReplyOptions | string { + const guildMember = interaction.member as GuildMember; + + if (guildMember.voice.channel === null) { + return { + embeds: [ + new EmbedBuilder() + .setColor(DefaultJellyfinColor) + .setAuthor({ + name: 'Unable to join your channel', + iconURL: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', + }) + .setDescription( + 'You are in a channel, I am either unabelt to connect to or you aren&apost in a channel yet', + ) + .toJSON(), + ], + }; + } + + const channel = guildMember.voice.channel; + + joinVoiceChannel({ + channelId: channel.id, + adapterCreator: channel.guild.voiceAdapterCreator, + guildId: channel.guildId, + }); + + return { + embeds: [ + new EmbedBuilder() + .setColor(DefaultJellyfinColor) + .setAuthor({ + name: 'Joined your voicehannel', + iconURL: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/circle-check.png?raw=true&test=a', + }) + .toJSON(), + ], + }; } } diff --git a/src/types/colors.ts b/src/types/colors.ts index 8c64332..2b54c63 100644 --- a/src/types/colors.ts +++ b/src/types/colors.ts @@ -1,3 +1,4 @@ import { RGBTuple } from 'discord.js'; export const DefaultJellyfinColor: RGBTuple = [119, 116, 204]; +export const ErrorJellyfinColor: RGBTuple = [242, 33, 95]; diff --git a/src/utils/constants.ts b/src/utils/constants.ts index b9db489..060e903 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1,6 +1,6 @@ export const Constants = { Metadata: { - Version: "0.0.1", - ApplicationName: "Discord Jellyfin Music Bot" - } -} \ No newline at end of file + Version: '0.0.1', + ApplicationName: 'Discord Jellyfin Music Bot', + }, +}; diff --git a/yarn.lock b/yarn.lock index d33eb53..69ddeb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -597,6 +597,19 @@ __metadata: languageName: node linkType: hard +"@discordjs/voice@npm:^0.14.0": + version: 0.14.0 + resolution: "@discordjs/voice@npm:0.14.0" + dependencies: + "@types/ws": ^8.5.3 + discord-api-types: ^0.37.20 + prism-media: ^1.3.4 + tslib: ^2.4.1 + ws: ^8.11.0 + checksum: baa68a324f8c7b4a7863a966e7d10a01a4df93aa68800f867e7a6fef016fcd16306ff5a562674884192b0e6538e53e8404d114a7c9781f0637c8e0dea3bca368 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^1.3.3": version: 1.3.3 resolution: "@eslint/eslintrc@npm:1.3.3" @@ -4438,6 +4451,7 @@ __metadata: "@discord-nestjs/common": ^4.0.8 "@discord-nestjs/core": ^4.3.1 "@discordjs/opus": ^0.9.0 + "@discordjs/voice": ^0.14.0 "@jellyfin/sdk": ^0.7.0 "@nestjs/cli": ^9.0.0 "@nestjs/common": ^9.0.0 @@ -5961,6 +5975,27 @@ __metadata: languageName: node linkType: hard +"prism-media@npm:^1.3.4": + version: 1.3.4 + resolution: "prism-media@npm:1.3.4" + peerDependencies: + "@discordjs/opus": ^0.8.0 + ffmpeg-static: ^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0 + node-opus: ^0.3.3 + opusscript: ^0.0.8 + peerDependenciesMeta: + "@discordjs/opus": + optional: true + ffmpeg-static: + optional: true + node-opus: + optional: true + opusscript: + optional: true + checksum: 703be28c87b4694714a52a0ea84516b19d2e62e510d0f204efc074b044ad93dde00241d4b4741c25aa2e27a00e3b472e60ad0f6c94e88710f0827dc63889373a + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" From ca10c0fd6d156cd56879b1d398a9444d0e1a281a Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 22:14:56 +0100 Subject: [PATCH 09/40] =?UTF-8?q?=E2=9C=A8=20Add=20play=20track=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/clients/discord/discord.config.service.ts | 1 + src/clients/discord/discord.module.ts | 12 ++++- src/clients/discord/discord.voice.service.ts | 24 +++++---- src/commands/play.command.ts | 50 ++++++++++++++++--- src/models/track-request.dto.ts | 6 +++ yarn.lock | 17 +++++++ 7 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 src/models/track-request.dto.ts diff --git a/package.json b/package.json index b788a56..06d8d2e 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "discord.js": "^14.7.1", "jellyfin-apiclient": "^1.10.0", "joi": "^17.7.0", + "libsodium-wrappers": "^0.7.10", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" diff --git a/src/clients/discord/discord.config.service.ts b/src/clients/discord/discord.config.service.ts index c17f74b..870d5ee 100644 --- a/src/clients/discord/discord.config.service.ts +++ b/src/clients/discord/discord.config.service.ts @@ -16,6 +16,7 @@ export class DiscordConfigService implements DiscordOptionsFactory { GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildIntegrations, + GatewayIntentBits.GuildVoiceStates, ], }, }; diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts index abad467..27d4a92 100644 --- a/src/clients/discord/discord.module.ts +++ b/src/clients/discord/discord.module.ts @@ -1,10 +1,18 @@ import { Module } from '@nestjs/common'; +import { OnModuleDestroy } from '@nestjs/common/interfaces/hooks'; import { DiscordConfigService } from './discord.config.service'; +import { DiscordVoiceService } from './discord.voice.service'; @Module({ imports: [], controllers: [], - providers: [DiscordConfigService], + providers: [DiscordConfigService, DiscordVoiceService], exports: [DiscordConfigService], }) -export class DiscordClientModule {} +export class DiscordClientModule implements OnModuleDestroy { + constructor(private readonly discordVoiceService: DiscordVoiceService) {} + + onModuleDestroy() { + this.discordVoiceService.disconnectGracefully(); + } +} diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index a969208..552d37b 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -1,14 +1,20 @@ -import { Injectable } from "@nestjs/common"; -import { VoiceChannel } from "discord.js"; +import { getVoiceConnections } from '@discordjs/voice'; +import { Injectable } from '@nestjs/common'; +import { Logger } from '@nestjs/common/services'; @Injectable() export class DiscordVoiceService { - - summonClient(voiceChannel: VoiceChannel) { - // voiceChannel.join(''); - } - - startPlayback() { + private readonly logger = new Logger(DiscordVoiceService.name); + disconnectGracefully() { + const connections = getVoiceConnections(); + this.logger.debug( + `Disonnecting gracefully from ${ + Object.keys(connections).length + } connections`, + ); + connections.forEach((connection) => { + connection.destroy(); + }); } -} \ No newline at end of file +} diff --git a/src/commands/play.command.ts b/src/commands/play.command.ts index 57219b5..137cb84 100644 --- a/src/commands/play.command.ts +++ b/src/commands/play.command.ts @@ -1,23 +1,61 @@ import { TransformPipe } from '@discord-nestjs/common'; - import { Command, DiscordTransformedCommand, + Payload, TransformedCommandExecutionContext, UsePipes, } from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; +import { InteractionReplyOptions, MessagePayload } from 'discord.js'; + +import { Injectable } from '@nestjs/common'; +import { TrackRequestDto } from '../models/track-request.dto'; +import { + createAudioPlayer, + createAudioResource, + getVoiceConnection, +} from '@discordjs/voice'; +import { Logger } from '@nestjs/common/services'; @Command({ name: 'play', description: 'Immediately play a track', }) +@Injectable() @UsePipes(TransformPipe) -export class PlayCommand implements DiscordTransformedCommand { +export class PlayCommand implements DiscordTransformedCommand { + private readonly logger = new Logger(PlayCommand.name); + handler( - dto: unknown, + @Payload() dto: TrackRequestDto, executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions | string { - return 'nice'; + ): + | string + | void + | MessagePayload + | InteractionReplyOptions + | Promise { + const player = createAudioPlayer(); + + this.logger.debug('bruh'); + + player.on('error', (error) => { + this.logger.error(error); + }); + + player.on('debug', (error) => { + this.logger.debug(error); + }); + + const resource = createAudioResource(dto.search); + + const connection = getVoiceConnection(executionContext.interaction.guildId); + + connection.subscribe(player); + + player.play(resource); + player.unpause(); + + return 'Playing Audio...'; } } diff --git a/src/models/track-request.dto.ts b/src/models/track-request.dto.ts new file mode 100644 index 0000000..8daf21e --- /dev/null +++ b/src/models/track-request.dto.ts @@ -0,0 +1,6 @@ +import { Param } from '@discord-nestjs/core'; + +export class TrackRequestDto { + @Param({ required: true, description: 'Track name to search' }) + search: string; +} diff --git a/yarn.lock b/yarn.lock index 69ddeb0..46c427b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4475,6 +4475,7 @@ __metadata: jellyfin-apiclient: ^1.10.0 jest: 28.1.3 joi: ^17.7.0 + libsodium-wrappers: ^0.7.10 prettier: ^2.3.2 reflect-metadata: ^0.1.13 rimraf: ^3.0.2 @@ -5093,6 +5094,22 @@ __metadata: languageName: node linkType: hard +"libsodium-wrappers@npm:^0.7.10": + version: 0.7.10 + resolution: "libsodium-wrappers@npm:0.7.10" + dependencies: + libsodium: ^0.7.0 + checksum: 294ac098895a15f99e65431c62478f149e9e5cbbcd1fa1b41e832b65e0ead63856cc964b3b7c14447a48701e3334661dea9223442834ae7dd0d34285991616cd + languageName: node + linkType: hard + +"libsodium@npm:^0.7.0": + version: 0.7.10 + resolution: "libsodium@npm:0.7.10" + checksum: 243794a0b3b753fafb304a82e9ff777eaccf11785bde6965e7f25171fd2fb35da302a89f009a91c1e922817d37724f7afc86592b128b2b58ed657d7fbe5259e6 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" From 17eee92404e993e902fa632d53e72e455abc4160 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Fri, 16 Dec 2022 23:17:26 +0100 Subject: [PATCH 10/40] =?UTF-8?q?=E2=9C=A8=20Add=20playback=20manager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- src/app.module.ts | 2 + .../discord/discord.message.service.ts | 50 ++++++++++++++++ src/clients/discord/discord.module.ts | 5 +- src/commands/command.module.ts | 4 ++ src/commands/enqueue.command.ts | 26 +++++++- src/commands/play.command.ts | 59 +++++++++++++++---- src/commands/summon.command.ts | 6 +- src/playback/playback.module.ts | 10 ++++ src/playback/playback.service.ts | 51 ++++++++++++++++ src/types/playlist.ts | 9 +++ src/types/track.ts | 1 + yarn.lock | 3 +- 13 files changed, 207 insertions(+), 22 deletions(-) create mode 100644 src/clients/discord/discord.message.service.ts create mode 100644 src/playback/playback.module.ts create mode 100644 src/playback/playback.service.ts create mode 100644 src/types/playlist.ts create mode 100644 src/types/track.ts diff --git a/package.json b/package.json index 06d8d2e..00c4143 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "libsodium-wrappers": "^0.7.10", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", - "rxjs": "^7.2.0" + "rxjs": "^7.2.0", + "uuid": "^9.0.0" }, "devDependencies": { "@nestjs/cli": "^9.0.0", diff --git a/src/app.module.ts b/src/app.module.ts index 4c6d7a7..a8015a1 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -11,6 +11,7 @@ import { DiscordClientModule } from './clients/discord/discord.module'; import { JellyfinClientModule } from './clients/jellyfin/jellyfin.module'; import { CommandModule } from './commands/command.module'; import { DiscordConfigService } from './clients/discord/discord.config.service'; +import { PlaybackModule } from './playback/playback.module'; @Module({ imports: [ @@ -30,6 +31,7 @@ import { DiscordConfigService } from './clients/discord/discord.config.service'; CommandModule, DiscordClientModule, JellyfinClientModule, + PlaybackModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/clients/discord/discord.message.service.ts b/src/clients/discord/discord.message.service.ts new file mode 100644 index 0000000..d033a2f --- /dev/null +++ b/src/clients/discord/discord.message.service.ts @@ -0,0 +1,50 @@ +import { Injectable } from '@nestjs/common'; +import { APIEmbed, EmbedBuilder } from 'discord.js'; +import { DefaultJellyfinColor, ErrorJellyfinColor } from '../../types/colors'; + +@Injectable() +export class DiscordMessageService { + buildErrorMessage({ + title, + description, + }: { + title: string; + description?: string; + }): APIEmbed { + const embedBuilder = new EmbedBuilder() + .setColor(ErrorJellyfinColor) + .setAuthor({ + name: title, + iconURL: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', + }); + + if (description !== undefined) { + embedBuilder.setDescription(description); + } + + return embedBuilder.toJSON(); + } + + buildMessage({ + title, + description, + }: { + title: string; + description?: string; + }): APIEmbed { + const embedBuilder = new EmbedBuilder() + .setColor(DefaultJellyfinColor) + .setAuthor({ + name: title, + iconURL: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/circle-check.png?raw=true', + }); + + if (description !== undefined) { + embedBuilder.setDescription(description); + } + + return embedBuilder.toJSON(); + } +} diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts index 27d4a92..17808af 100644 --- a/src/clients/discord/discord.module.ts +++ b/src/clients/discord/discord.module.ts @@ -1,13 +1,14 @@ import { Module } from '@nestjs/common'; import { OnModuleDestroy } from '@nestjs/common/interfaces/hooks'; import { DiscordConfigService } from './discord.config.service'; +import { DiscordMessageService } from './discord.message.service'; import { DiscordVoiceService } from './discord.voice.service'; @Module({ imports: [], controllers: [], - providers: [DiscordConfigService, DiscordVoiceService], - exports: [DiscordConfigService], + providers: [DiscordConfigService, DiscordVoiceService, DiscordMessageService], + exports: [DiscordConfigService, DiscordMessageService], }) export class DiscordClientModule implements OnModuleDestroy { constructor(private readonly discordVoiceService: DiscordVoiceService) {} diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index c014edd..0d50d1b 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -11,6 +11,8 @@ import { PlayCommand } from './play.command'; import { SkipTrackCommand } from './skip.command'; import { StopPlaybackCommand } from './stop.command'; import { SummonCommand } from './summon.command'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { PlaybackService } from '../playback/playback.service'; @Module({ imports: [DiscordModule.forFeature()], @@ -26,6 +28,8 @@ import { SummonCommand } from './summon.command'; SkipTrackCommand, StopPlaybackCommand, SummonCommand, + DiscordMessageService, + PlaybackService, ], exports: [], }) diff --git a/src/commands/enqueue.command.ts b/src/commands/enqueue.command.ts index 824a548..3c7eea4 100644 --- a/src/commands/enqueue.command.ts +++ b/src/commands/enqueue.command.ts @@ -7,17 +7,37 @@ import { UsePipes, } from '@discord-nestjs/core'; import { InteractionReplyOptions } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { TrackRequestDto } from '../models/track-request.dto'; +import { PlaybackService } from '../playback/playback.service'; @Command({ name: 'enqueue', description: 'Enqueue a track to the current playlist', }) @UsePipes(TransformPipe) -export class EnqueueCommand implements DiscordTransformedCommand { +export class EnqueueCommand + implements DiscordTransformedCommand +{ + constructor( + private readonly discordMessageService: DiscordMessageService, + private readonly playbackService: PlaybackService, + ) {} + handler( - dto: unknown, + dto: TrackRequestDto, executionContext: TransformedCommandExecutionContext, ): InteractionReplyOptions | string { - return 'nice'; + const index = this.playbackService.eneuqueTrack({}); + return { + embeds: [ + this.discordMessageService.buildMessage({ + title: `Track Added to queue`, + description: `Your track \`\`${ + dto.search + }\`\` was added to the queue at position \`\`${index + 1}\`\``, + }), + ], + }; } } diff --git a/src/commands/play.command.ts b/src/commands/play.command.ts index 137cb84..c6a83a1 100644 --- a/src/commands/play.command.ts +++ b/src/commands/play.command.ts @@ -6,7 +6,12 @@ import { TransformedCommandExecutionContext, UsePipes, } from '@discord-nestjs/core'; -import { InteractionReplyOptions, MessagePayload } from 'discord.js'; +import { + EmbedBuilder, + GuildMember, + InteractionReplyOptions, + MessagePayload, +} from 'discord.js'; import { Injectable } from '@nestjs/common'; import { TrackRequestDto } from '../models/track-request.dto'; @@ -14,8 +19,10 @@ import { createAudioPlayer, createAudioResource, getVoiceConnection, + joinVoiceChannel, } from '@discordjs/voice'; import { Logger } from '@nestjs/common/services'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; @Command({ name: 'play', @@ -26,6 +33,8 @@ import { Logger } from '@nestjs/common/services'; export class PlayCommand implements DiscordTransformedCommand { private readonly logger = new Logger(PlayCommand.name); + constructor(private readonly discordMessageService: DiscordMessageService) {} + handler( @Payload() dto: TrackRequestDto, executionContext: TransformedCommandExecutionContext, @@ -35,27 +44,53 @@ export class PlayCommand implements DiscordTransformedCommand { | MessagePayload | InteractionReplyOptions | Promise { - const player = createAudioPlayer(); + const guildMember = executionContext.interaction.member as GuildMember; - this.logger.debug('bruh'); + if (guildMember.voice.channel === null) { + return { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'Unable to join your channel', + description: + 'You are in a channel, I am either unabelt to connect to or you aren&apost in a channel yet', + }), + ], + }; + } - player.on('error', (error) => { - this.logger.error(error); + const channel = guildMember.voice.channel; + + joinVoiceChannel({ + channelId: channel.id, + adapterCreator: channel.guild.voiceAdapterCreator, + guildId: channel.guildId, }); - player.on('debug', (error) => { - this.logger.debug(error); - }); - - const resource = createAudioResource(dto.search); - const connection = getVoiceConnection(executionContext.interaction.guildId); + if (!connection) { + return { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'Unable to establish audio connection', + description: + 'I was unable to establish an audio connection to your voice channel', + }), + ], + }; + } + + const player = createAudioPlayer(); + + const resource = createAudioResource(dto.search); + connection.subscribe(player); player.play(resource); player.unpause(); - return 'Playing Audio...'; + return { + embeds: [new EmbedBuilder().setTitle(`Playing ${dto.search}`).toJSON()], + }; } } diff --git a/src/commands/summon.command.ts b/src/commands/summon.command.ts index 6f39006..71b0f4a 100644 --- a/src/commands/summon.command.ts +++ b/src/commands/summon.command.ts @@ -7,9 +7,9 @@ import { CommandInteraction, EmbedBuilder, GuildMember, - InteractionReplyOptions + InteractionReplyOptions, } from 'discord.js'; -import { DefaultJellyfinColor } from '../types/colors'; +import { DefaultJellyfinColor, ErrorJellyfinColor } from '../types/colors'; @Command({ name: 'summon', @@ -26,7 +26,7 @@ export class SummonCommand implements DiscordCommand { return { embeds: [ new EmbedBuilder() - .setColor(DefaultJellyfinColor) + .setColor(ErrorJellyfinColor) .setAuthor({ name: 'Unable to join your channel', iconURL: diff --git a/src/playback/playback.module.ts b/src/playback/playback.module.ts new file mode 100644 index 0000000..2a5b408 --- /dev/null +++ b/src/playback/playback.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { PlaybackService } from './playback.service'; + +@Module({ + imports: [], + controllers: [], + providers: [PlaybackService], + exports: [PlaybackService], +}) +export class PlaybackModule {} diff --git a/src/playback/playback.service.ts b/src/playback/playback.service.ts new file mode 100644 index 0000000..301bf64 --- /dev/null +++ b/src/playback/playback.service.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@nestjs/common'; +import { Playlist } from '../types/playlist'; +import { Track } from '../types/track'; + +import { v4 as uuidv4 } from 'uuid'; + +@Injectable() +export class PlaybackService { + private readonly playlist: Playlist = { + tracks: [], + activeTrack: null, + }; + + getActiveTrack() { + return this.getTrackById(this.playlist.activeTrack); + } + + setActiveTrack(trackId: string) { + const track = this.getTrackById(trackId); + + if (!track) { + throw Error('track is not in playlist'); + } + + this.playlist.activeTrack = track.id; + } + + eneuqueTrack(track: Track) { + const uuid = uuidv4(); + this.playlist.tracks.push({ + id: uuid, + track: track, + }); + return this.playlist.tracks.findIndex((x) => x.id === uuid); + } + + set(tracks: Track[]) { + this.playlist.tracks = tracks.map((t) => ({ + id: uuidv4(), + track: t, + })); + } + + clear() { + this.playlist.tracks = []; + } + + private getTrackById(id: string) { + return this.playlist.tracks.find((x) => x.id === id); + } +} diff --git a/src/types/playlist.ts b/src/types/playlist.ts new file mode 100644 index 0000000..dabbb40 --- /dev/null +++ b/src/types/playlist.ts @@ -0,0 +1,9 @@ +import { Track } from './track'; + +export interface Playlist { + tracks: { + id: string; + track: Track; + }[]; + activeTrack: string | null; +} diff --git a/src/types/track.ts b/src/types/track.ts new file mode 100644 index 0000000..c7f9f8b --- /dev/null +++ b/src/types/track.ts @@ -0,0 +1 @@ +export interface Track {} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 46c427b..06e28ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4487,6 +4487,7 @@ __metadata: ts-node: ^10.0.0 tsconfig-paths: 4.1.0 typescript: ^4.7.4 + uuid: ^9.0.0 languageName: unknown linkType: soft @@ -7246,7 +7247,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:9.0.0": +"uuid@npm:9.0.0, uuid@npm:^9.0.0": version: 9.0.0 resolution: "uuid@npm:9.0.0" bin: From 4693b2f75f0b92b94664c609fda383b834a31802 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 01:25:45 +0100 Subject: [PATCH 11/40] =?UTF-8?q?=E2=9C=A8=20Add=20search=20command=20and?= =?UTF-8?q?=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/jellyfin/jellyfin.module.ts | 24 ++-- .../jellyfin/jellyfin.search.service.ts | 31 +++++ src/clients/jellyfin/jellyfin.service.ts | 23 ++++ .../jellyfin/jellyfin.websocket.service.ts | 15 +++ src/commands/command.module.ts | 15 ++- src/commands/search.comands.ts | 113 ++++++++++++++++++ 6 files changed, 207 insertions(+), 14 deletions(-) create mode 100644 src/clients/jellyfin/jellyfin.search.service.ts create mode 100644 src/clients/jellyfin/jellyfin.websocket.service.ts create mode 100644 src/commands/search.comands.ts diff --git a/src/clients/jellyfin/jellyfin.module.ts b/src/clients/jellyfin/jellyfin.module.ts index dcefca0..02a8dcf 100644 --- a/src/clients/jellyfin/jellyfin.module.ts +++ b/src/clients/jellyfin/jellyfin.module.ts @@ -1,16 +1,20 @@ -import { Module, OnModuleDestroy, OnModuleInit } from "@nestjs/common"; -import { JellyfinService } from "./jellyfin.service"; +import { Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; +import { JellyfinSearchService } from './jellyfin.search.service'; +import { JellyfinService } from './jellyfin.service'; +import { JellyinWebsocketService } from './jellyfin.websocket.service'; @Module({ imports: [], controllers: [], - providers: [JellyfinService], - exports: [], + providers: [JellyfinService, JellyinWebsocketService, JellyfinSearchService], + exports: [JellyfinService, JellyfinSearchService], }) export class JellyfinClientModule implements OnModuleInit, OnModuleDestroy { - - constructor(private jellyfinService: JellyfinService) {} - + constructor( + private jellyfinService: JellyfinService, + private readonly jellyfinWebsocketService: JellyinWebsocketService, + ) {} + onModuleDestroy() { this.jellyfinService.destroy(); } @@ -18,5 +22,9 @@ export class JellyfinClientModule implements OnModuleInit, OnModuleDestroy { onModuleInit() { this.jellyfinService.init(); this.jellyfinService.authenticate(); + + setTimeout(() => { + this.jellyfinWebsocketService.openSocket(); + }, 5000); } -} \ No newline at end of file +} diff --git a/src/clients/jellyfin/jellyfin.search.service.ts b/src/clients/jellyfin/jellyfin.search.service.ts new file mode 100644 index 0000000..1b8d60f --- /dev/null +++ b/src/clients/jellyfin/jellyfin.search.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@nestjs/common'; +import { JellyfinService } from './jellyfin.service'; + +import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; +import { getSearchApi } from '@jellyfin/sdk/lib/utils/api/search-api'; +import { Logger } from '@nestjs/common/services'; + +@Injectable() +export class JellyfinSearchService { + private readonly logger = new Logger(JellyfinSearchService.name); + + constructor(private readonly jellyfinService: JellyfinService) {} + + async search(searchTerm: string): Promise { + const api = this.jellyfinService.getApi(); + + this.logger.debug(`Searching for '${searchTerm}'`); + + const searchApi = getSearchApi(api); + const { + data: { SearchHints, TotalRecordCount }, + } = await searchApi.get({ + searchTerm: searchTerm, + mediaTypes: ['Audio', 'Album'], + }); + + this.logger.debug(`Found ${TotalRecordCount} results for '${searchTerm}'`); + + return SearchHints; + } +} diff --git a/src/clients/jellyfin/jellyfin.service.ts b/src/clients/jellyfin/jellyfin.service.ts index 56433c7..5bcfa21 100644 --- a/src/clients/jellyfin/jellyfin.service.ts +++ b/src/clients/jellyfin/jellyfin.service.ts @@ -2,12 +2,16 @@ import { Injectable, Logger } from '@nestjs/common'; import { Api, Jellyfin } from '@jellyfin/sdk'; import { Constants } from '../../utils/constants'; +import { SystemApi } from '@jellyfin/sdk/lib/generated-client/api/system-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; @Injectable() export class JellyfinService { private readonly logger = new Logger(JellyfinService.name); private jellyfin: Jellyfin; private api: Api; + private systemApi: SystemApi; + private userId: string; init() { this.jellyfin = new Jellyfin({ @@ -42,6 +46,9 @@ export class JellyfinService { this.logger.debug( `Connected using user '${response.data.SessionInfo.UserId}'`, ); + this.userId = response.data.SessionInfo.UserId; + + this.systemApi = getSystemApi(this.api); }) .catch((test) => { this.logger.error(test); @@ -57,4 +64,20 @@ export class JellyfinService { } this.api.logout(); } + + getApi() { + return this.api; + } + + getJellyfin() { + return this.jellyfin; + } + + getSystemApi() { + return this.systemApi; + } + + getUserId() { + return this.userId; + } } diff --git a/src/clients/jellyfin/jellyfin.websocket.service.ts b/src/clients/jellyfin/jellyfin.websocket.service.ts new file mode 100644 index 0000000..b7c447d --- /dev/null +++ b/src/clients/jellyfin/jellyfin.websocket.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@nestjs/common'; +import { JellyfinService } from './jellyfin.service'; + +import { getPlaystateApi } from '@jellyfin/sdk/lib/utils/api/playstate-api'; + +@Injectable() +export class JellyinWebsocketService { + constructor(private readonly jellyfinClientManager: JellyfinService) {} + + async openSocket() { + const systemApi = getPlaystateApi(this.jellyfinClientManager.getApi()); + + // TODO: Write socket playstate api to report playback progress + } +} diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index 0d50d1b..3358d1b 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -1,21 +1,23 @@ -import { Module } from '@nestjs/common'; import { DiscordModule } from '@discord-nestjs/core'; +import { Module } from '@nestjs/common'; -import { HelpCommand } from './help.command'; -import { StatusCommand } from './status.command'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { JellyfinClientModule } from '../clients/jellyfin/jellyfin.module'; +import { PlaybackService } from '../playback/playback.service'; import { CurrentTrackCommand } from './current.command'; import { DisconnectCommand } from './disconnect.command'; import { EnqueueCommand } from './enqueue.command'; +import { HelpCommand } from './help.command'; import { PausePlaybackCommand } from './pause.command'; import { PlayCommand } from './play.command'; +import { SearchItemCommand } from './search.comands'; import { SkipTrackCommand } from './skip.command'; +import { StatusCommand } from './status.command'; import { StopPlaybackCommand } from './stop.command'; import { SummonCommand } from './summon.command'; -import { DiscordMessageService } from '../clients/discord/discord.message.service'; -import { PlaybackService } from '../playback/playback.service'; @Module({ - imports: [DiscordModule.forFeature()], + imports: [DiscordModule.forFeature(), JellyfinClientModule], controllers: [], providers: [ HelpCommand, @@ -28,6 +30,7 @@ import { PlaybackService } from '../playback/playback.service'; SkipTrackCommand, StopPlaybackCommand, SummonCommand, + SearchItemCommand, DiscordMessageService, PlaybackService, ], diff --git a/src/commands/search.comands.ts b/src/commands/search.comands.ts new file mode 100644 index 0000000..bea924a --- /dev/null +++ b/src/commands/search.comands.ts @@ -0,0 +1,113 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { + Command, + DiscordTransformedCommand, + Param, + Payload, + TransformedCommandExecutionContext, + UsePipes, +} from '@discord-nestjs/core'; +import { + APIEmbedField, + ComponentType, + EmbedBuilder, + InteractionReplyOptions, +} from 'discord.js'; +import { JellyfinSearchService } from '../clients/jellyfin/jellyfin.search.service'; +import { TrackRequestDto } from '../models/track-request.dto'; +import { DefaultJellyfinColor } from '../types/colors'; + +@Command({ + name: 'search', + description: 'Search for an item on your Jellyfin instance', +}) +@UsePipes(TransformPipe) +export class SearchItemCommand + implements DiscordTransformedCommand +{ + constructor(private readonly jellyfinSearchService: JellyfinSearchService) {} + + async handler( + @Payload() dto: TrackRequestDto, + executionContext: TransformedCommandExecutionContext, + ): Promise { + const items = await this.jellyfinSearchService.search(dto.search); + + const firstItems = items.slice(0, 10); + + const lines: string[] = firstItems.map( + (item) => + `:white_small_square: ${this.markSearchTermOverlap( + item.Name, + dto.search, + )} *(${item.Type})*`, + ); + + const description = `I have found **${ + items.length + }** results for your search \`\`${ + dto.search + }\`\`.\nFor better readability, I have limited the search results to 10\n\n ${lines.join( + '\n', + )}`; + + const emojiForType = (type: string) => { + switch (type) { + case 'Audio': + return '🎵'; + case 'Playlist': + return '📚'; + default: + return undefined; + } + }; + + const selectOptions: { label: string; value: string; emoji?: string }[] = + firstItems.map((item) => ({ + label: item.Name, + value: item.Id, + emoji: emojiForType(item.Type), + })); + + return { + embeds: [ + new EmbedBuilder() + .setAuthor({ + name: 'Jellyfin Search Results', + iconURL: + 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', + }) + .setColor(DefaultJellyfinColor) + .setDescription(description) + .toJSON(), + ], + components: [ + { + type: ComponentType.ActionRow, + components: [ + { + type: ComponentType.StringSelect, + customId: 'cool', + options: selectOptions, + }, + ], + }, + ], + }; + } + + private markSearchTermOverlap(value: string, searchTerm: string) { + const startIndex = value.indexOf(searchTerm); + const actualValue = value.substring( + startIndex, + startIndex + 1 + searchTerm.length, + ); + return `${value.substring( + 0, + startIndex, + )}**${actualValue}**${value.substring( + startIndex + 1 + actualValue.length, + )}`; + } +} From 2aa2d16e40317b5768225f3aa224c78f32203869 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 14:13:03 +0100 Subject: [PATCH 12/40] =?UTF-8?q?=E2=9C=A8=20Add=20search=20result=20embed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jellyfin/jellyfin.search.service.ts | 17 ++++ src/commands/enqueue.command.ts | 3 +- src/commands/search.comands.ts | 79 ++++++++++++++++++- src/types/track.ts | 6 +- 4 files changed, 99 insertions(+), 6 deletions(-) diff --git a/src/clients/jellyfin/jellyfin.search.service.ts b/src/clients/jellyfin/jellyfin.search.service.ts index 1b8d60f..873bd12 100644 --- a/src/clients/jellyfin/jellyfin.search.service.ts +++ b/src/clients/jellyfin/jellyfin.search.service.ts @@ -3,6 +3,7 @@ import { JellyfinService } from './jellyfin.service'; import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; import { getSearchApi } from '@jellyfin/sdk/lib/utils/api/search-api'; +import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; import { Logger } from '@nestjs/common/services'; @Injectable() @@ -28,4 +29,20 @@ export class JellyfinSearchService { return SearchHints; } + + async getById(id: string): Promise { + const api = this.jellyfinService.getApi(); + + const searchApi = getItemsApi(api); + const { data } = await searchApi.getItems({ + ids: [id], + }); + + if (data.Items.length !== 1) { + this.logger.warn(`Failed to retrieve item via id '${id}'`); + return null; + } + + return data.Items[0]; + } } diff --git a/src/commands/enqueue.command.ts b/src/commands/enqueue.command.ts index 3c7eea4..0498257 100644 --- a/src/commands/enqueue.command.ts +++ b/src/commands/enqueue.command.ts @@ -28,7 +28,8 @@ export class EnqueueCommand dto: TrackRequestDto, executionContext: TransformedCommandExecutionContext, ): InteractionReplyOptions | string { - const index = this.playbackService.eneuqueTrack({}); + // const index = this.playbackService.eneuqueTrack({}); + const index = 0; return { embeds: [ this.discordMessageService.buildMessage({ diff --git a/src/commands/search.comands.ts b/src/commands/search.comands.ts index bea924a..4a1e5d9 100644 --- a/src/commands/search.comands.ts +++ b/src/commands/search.comands.ts @@ -3,21 +3,31 @@ import { TransformPipe } from '@discord-nestjs/common'; import { Command, DiscordTransformedCommand, - Param, + On, Payload, TransformedCommandExecutionContext, UsePipes, } from '@discord-nestjs/core'; +import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; +import { Logger } from '@nestjs/common/services'; import { - APIEmbedField, ComponentType, EmbedBuilder, + Events, + Interaction, InteractionReplyOptions, } from 'discord.js'; import { JellyfinSearchService } from '../clients/jellyfin/jellyfin.search.service'; import { TrackRequestDto } from '../models/track-request.dto'; import { DefaultJellyfinColor } from '../types/colors'; +import { v4 as uuidv4 } from 'uuid'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; + +import { formatDuration, intervalToDuration } from 'date-fns'; +import { format } from 'path'; +import { PlaybackService } from '../playback/playback.service'; + @Command({ name: 'search', description: 'Search for an item on your Jellyfin instance', @@ -26,7 +36,13 @@ import { DefaultJellyfinColor } from '../types/colors'; export class SearchItemCommand implements DiscordTransformedCommand { - constructor(private readonly jellyfinSearchService: JellyfinSearchService) {} + private readonly logger: Logger = new Logger(SearchItemCommand.name); + + constructor( + private readonly jellyfinSearchService: JellyfinSearchService, + private readonly discordMessageService: DiscordMessageService, + private readonly playbackService: PlaybackService, + ) {} async handler( @Payload() dto: TrackRequestDto, @@ -88,7 +104,7 @@ export class SearchItemCommand components: [ { type: ComponentType.StringSelect, - customId: 'cool', + customId: 'searchItemSelect', options: selectOptions, }, ], @@ -97,6 +113,61 @@ export class SearchItemCommand }; } + @On(Events.InteractionCreate) + async onStringSelect(interaction: Interaction) { + if (!interaction.isStringSelectMenu()) return; + + if (interaction.customId !== 'searchItemSelect') { + return; + } + + if (interaction.values.length !== 1) { + this.logger.warn( + `Failed to process interaction select with values [${interaction.values.length}]`, + ); + return; + } + + const item = await this.jellyfinSearchService.getById( + interaction.values[0], + ); + + const milliseconds = item.RunTimeTicks / 10000; + + const duration = formatDuration( + intervalToDuration({ + start: milliseconds, + end: 0, + }), + ); + + const artists = item.Artists.join(', '); + + const addedIndex = this.playbackService.eneuqueTrack({ + jellyfinId: item.Id, + name: item.Name, + durationInMilliseconds: milliseconds, + }); + + await interaction.update({ + embeds: [ + new EmbedBuilder() + .setAuthor({ + name: 'Jellyfin Search', + iconURL: + 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', + }) + .setTitle(item.Name) + .setDescription( + `**Duration**: ${duration}\n**Artists**: ${artists}\n\nTrack was added to the queue at position ${addedIndex}`, + ) + .setColor(DefaultJellyfinColor) + .toJSON(), + ], + components: [], + }); + } + private markSearchTermOverlap(value: string, searchTerm: string) { const startIndex = value.indexOf(searchTerm); const actualValue = value.substring( diff --git a/src/types/track.ts b/src/types/track.ts index c7f9f8b..2954289 100644 --- a/src/types/track.ts +++ b/src/types/track.ts @@ -1 +1,5 @@ -export interface Track {} \ No newline at end of file +export interface Track { + jellyfinId: string; + name: string; + durationInMilliseconds: number; +} From fe5096acf72bf4416057c7bc534d88b5daa7fd44 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 16:58:38 +0100 Subject: [PATCH 13/40] =?UTF-8?q?=E2=9C=A8=20Add=20universal=20audio=20str?= =?UTF-8?q?eaming=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discord/discord.message.service.ts | 43 +++++---- src/clients/discord/discord.module.ts | 2 +- src/clients/discord/discord.voice.service.ts | 92 ++++++++++++++++++- src/clients/jellyfin/jellyfin.module.ts | 14 ++- .../jellyfin.stream.builder.service.ts | 31 +++++++ src/commands/command.module.ts | 7 +- src/commands/pause.command.ts | 31 +++++-- src/commands/play.command.ts | 80 +++++----------- src/commands/search.comands.ts | 23 ++++- src/models/generic-try-handler.ts | 9 ++ src/utils/constants.ts | 5 + 11 files changed, 247 insertions(+), 90 deletions(-) create mode 100644 src/clients/jellyfin/jellyfin.stream.builder.service.ts create mode 100644 src/models/generic-try-handler.ts diff --git a/src/clients/discord/discord.message.service.ts b/src/clients/discord/discord.message.service.ts index d033a2f..b8b96cd 100644 --- a/src/clients/discord/discord.message.service.ts +++ b/src/clients/discord/discord.message.service.ts @@ -2,6 +2,9 @@ import { Injectable } from '@nestjs/common'; import { APIEmbed, EmbedBuilder } from 'discord.js'; import { DefaultJellyfinColor, ErrorJellyfinColor } from '../../types/colors'; +import { formatRFC7231 } from 'date-fns'; +import { Constants } from '../../utils/constants'; + @Injectable() export class DiscordMessageService { buildErrorMessage({ @@ -11,40 +14,48 @@ export class DiscordMessageService { title: string; description?: string; }): APIEmbed { - const embedBuilder = new EmbedBuilder() - .setColor(ErrorJellyfinColor) - .setAuthor({ - name: title, - iconURL: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', - }); - - if (description !== undefined) { - embedBuilder.setDescription(description); - } - - return embedBuilder.toJSON(); + const date = formatRFC7231(new Date()); + return this.buildMessage({ + title: title, + description: description, + mixin(embedBuilder) { + return embedBuilder + .setFooter({ + text: `${date} - Report an issue: ${Constants.Links.ReportIssue}`, + }) + .setColor(ErrorJellyfinColor); + }, + }); } buildMessage({ title, description, + mixin = (builder) => builder, }: { title: string; description?: string; + mixin?: (embedBuilder: EmbedBuilder) => EmbedBuilder; }): APIEmbed { - const embedBuilder = new EmbedBuilder() + const date = formatRFC7231(new Date()); + + let embedBuilder = new EmbedBuilder() .setColor(DefaultJellyfinColor) .setAuthor({ name: title, iconURL: 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/circle-check.png?raw=true', + }) + .setFooter({ + text: `${date}`, }); - if (description !== undefined) { - embedBuilder.setDescription(description); + if (description !== undefined && description.length > 0) { + embedBuilder = embedBuilder.setDescription(description); } + embedBuilder = mixin(embedBuilder); + return embedBuilder.toJSON(); } } diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts index 17808af..e59427c 100644 --- a/src/clients/discord/discord.module.ts +++ b/src/clients/discord/discord.module.ts @@ -8,7 +8,7 @@ import { DiscordVoiceService } from './discord.voice.service'; imports: [], controllers: [], providers: [DiscordConfigService, DiscordVoiceService, DiscordMessageService], - exports: [DiscordConfigService, DiscordMessageService], + exports: [DiscordConfigService, DiscordVoiceService, DiscordMessageService], }) export class DiscordClientModule implements OnModuleDestroy { constructor(private readonly discordVoiceService: DiscordVoiceService) {} diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index 552d37b..79ca9bd 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -1,10 +1,81 @@ -import { getVoiceConnections } from '@discordjs/voice'; +import { + AudioPlayer, + AudioResource, + createAudioPlayer, + getVoiceConnection, + getVoiceConnections, + joinVoiceChannel, + VoiceConnection, +} from '@discordjs/voice'; import { Injectable } from '@nestjs/common'; import { Logger } from '@nestjs/common/services'; +import { GuildMember } from 'discord.js'; +import { GenericTryHandler } from '../../models/generic-try-handler'; +import { DiscordMessageService } from './discord.message.service'; @Injectable() export class DiscordVoiceService { private readonly logger = new Logger(DiscordVoiceService.name); + private audioPlayer: AudioPlayer; + private voiceConnection: VoiceConnection; + + constructor(private readonly discordMessageService: DiscordMessageService) {} + + tryJoinChannelAndEstablishVoiceConnection( + member: GuildMember, + ): GenericTryHandler { + if (this.voiceConnection !== undefined) { + return { + success: false, + reply: {}, + }; + } + + if (member.voice.channel === null) { + return { + success: false, + reply: { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'Unable to join your channel', + description: + "I am unable to join your channel, because you don't seem to be in a voice channel. Connect to a channel first to use this command", + }), + ], + }, + }; + } + + const channel = member.voice.channel; + + joinVoiceChannel({ + channelId: channel.id, + adapterCreator: channel.guild.voiceAdapterCreator, + guildId: channel.guildId, + }); + + if (this.voiceConnection == undefined) { + this.voiceConnection = getVoiceConnection(member.guild.id); + } + + return { + success: true, + reply: {}, + }; + } + + playResource(resource: AudioResource) { + this.createAndReturnOrGetAudioPlayer().play(resource); + } + + pause() { + this.createAndReturnOrGetAudioPlayer().pause(); + } + + unpause() { + this.createAndReturnOrGetAudioPlayer().unpause(); + } + disconnectGracefully() { const connections = getVoiceConnections(); this.logger.debug( @@ -17,4 +88,23 @@ export class DiscordVoiceService { connection.destroy(); }); } + + private createAndReturnOrGetAudioPlayer() { + if (this.audioPlayer === undefined) { + this.logger.debug( + `Initialized new instance of Audio Player because it has not been defined yet`, + ); + this.audioPlayer = createAudioPlayer(); + this.audioPlayer.on('debug', (message) => { + this.logger.debug(message); + }); + this.audioPlayer.on('error', (message) => { + this.logger.error(message); + }); + this.voiceConnection.subscribe(this.audioPlayer); + return this.audioPlayer; + } + + return this.audioPlayer; + } } diff --git a/src/clients/jellyfin/jellyfin.module.ts b/src/clients/jellyfin/jellyfin.module.ts index 02a8dcf..40e8818 100644 --- a/src/clients/jellyfin/jellyfin.module.ts +++ b/src/clients/jellyfin/jellyfin.module.ts @@ -1,13 +1,23 @@ import { Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { JellyfinSearchService } from './jellyfin.search.service'; import { JellyfinService } from './jellyfin.service'; +import { JellyfinStreamBuilderService } from './jellyfin.stream.builder.service'; import { JellyinWebsocketService } from './jellyfin.websocket.service'; @Module({ imports: [], controllers: [], - providers: [JellyfinService, JellyinWebsocketService, JellyfinSearchService], - exports: [JellyfinService, JellyfinSearchService], + providers: [ + JellyfinService, + JellyinWebsocketService, + JellyfinSearchService, + JellyfinStreamBuilderService, + ], + exports: [ + JellyfinService, + JellyfinSearchService, + JellyfinStreamBuilderService, + ], }) export class JellyfinClientModule implements OnModuleInit, OnModuleDestroy { constructor( diff --git a/src/clients/jellyfin/jellyfin.stream.builder.service.ts b/src/clients/jellyfin/jellyfin.stream.builder.service.ts new file mode 100644 index 0000000..a2a61ca --- /dev/null +++ b/src/clients/jellyfin/jellyfin.stream.builder.service.ts @@ -0,0 +1,31 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { JellyfinService } from './jellyfin.service'; + +import { getUniversalAudioApi } from '@jellyfin/sdk/lib/utils/api/universal-audio-api'; + +@Injectable() +export class JellyfinStreamBuilderService { + private readonly logger = new Logger(JellyfinStreamBuilderService.name); + + constructor(private readonly jellyfinService: JellyfinService) {} + + async buildStreamUrl(jellyfinItemId: string, bitrate: number) { + const api = this.jellyfinService.getApi(); + + this.logger.debug( + `Attempting to build stream resource for item ${jellyfinItemId} with bitrate ${bitrate}`, + ); + + const accessToken = this.jellyfinService.getApi().accessToken; + + const url = encodeURI( + `${ + api.basePath + }/Audio/${jellyfinItemId}/universal?UserId=${this.jellyfinService.getUserId()}&DeviceId=${ + this.jellyfinService.getJellyfin().clientInfo.name + }&MaxStreamingBitrate=${bitrate}&Container=ogg,opus&AudioCodec=opus&TranscodingContainer=ts&TranscodingProtocol=hls&api_key=${accessToken}`, + ); + + return url; + } +} diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index 3358d1b..0b04605 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -2,6 +2,7 @@ import { DiscordModule } from '@discord-nestjs/core'; import { Module } from '@nestjs/common'; import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { DiscordClientModule } from '../clients/discord/discord.module'; import { JellyfinClientModule } from '../clients/jellyfin/jellyfin.module'; import { PlaybackService } from '../playback/playback.service'; import { CurrentTrackCommand } from './current.command'; @@ -17,7 +18,11 @@ import { StopPlaybackCommand } from './stop.command'; import { SummonCommand } from './summon.command'; @Module({ - imports: [DiscordModule.forFeature(), JellyfinClientModule], + imports: [ + DiscordModule.forFeature(), + JellyfinClientModule, + DiscordClientModule, + ], controllers: [], providers: [ HelpCommand, diff --git a/src/commands/pause.command.ts b/src/commands/pause.command.ts index c15707c..833cd3e 100644 --- a/src/commands/pause.command.ts +++ b/src/commands/pause.command.ts @@ -2,24 +2,39 @@ import { TransformPipe } from '@discord-nestjs/common'; import { Command, + CommandExecutionContext, + DiscordCommand, DiscordTransformedCommand, TransformedCommandExecutionContext, UsePipes, } from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; +import { + ButtonInteraction, + CacheType, + ChatInputCommandInteraction, + ContextMenuCommandInteraction, + Interaction, + InteractionReplyOptions, + MessagePayload, + StringSelectMenuInteraction, +} from 'discord.js'; @Command({ name: 'pause', description: 'Pause or resume the playback of the current track', }) @UsePipes(TransformPipe) -export class PausePlaybackCommand - implements DiscordTransformedCommand -{ +export class PausePlaybackCommand implements DiscordCommand { handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions | string { - return 'nice'; + interaction: + | ChatInputCommandInteraction + | ContextMenuCommandInteraction, + executionContext: CommandExecutionContext< + StringSelectMenuInteraction | ButtonInteraction + >, + ): string | InteractionReplyOptions { + return { + content: 'test', + }; } } diff --git a/src/commands/play.command.ts b/src/commands/play.command.ts index c6a83a1..259810d 100644 --- a/src/commands/play.command.ts +++ b/src/commands/play.command.ts @@ -6,23 +6,14 @@ import { TransformedCommandExecutionContext, UsePipes, } from '@discord-nestjs/core'; -import { - EmbedBuilder, - GuildMember, - InteractionReplyOptions, - MessagePayload, -} from 'discord.js'; +import { GuildMember, InteractionReplyOptions } from 'discord.js'; +import { createAudioResource } from '@discordjs/voice'; import { Injectable } from '@nestjs/common'; -import { TrackRequestDto } from '../models/track-request.dto'; -import { - createAudioPlayer, - createAudioResource, - getVoiceConnection, - joinVoiceChannel, -} from '@discordjs/voice'; import { Logger } from '@nestjs/common/services'; import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; +import { TrackRequestDto } from '../models/track-request.dto'; @Command({ name: 'play', @@ -33,64 +24,37 @@ import { DiscordMessageService } from '../clients/discord/discord.message.servic export class PlayCommand implements DiscordTransformedCommand { private readonly logger = new Logger(PlayCommand.name); - constructor(private readonly discordMessageService: DiscordMessageService) {} + constructor( + private readonly discordMessageService: DiscordMessageService, + private readonly discordVoiceService: DiscordVoiceService, + ) {} handler( @Payload() dto: TrackRequestDto, executionContext: TransformedCommandExecutionContext, ): | string - | void - | MessagePayload | InteractionReplyOptions - | Promise { + | Promise { const guildMember = executionContext.interaction.member as GuildMember; - if (guildMember.voice.channel === null) { - return { - embeds: [ - this.discordMessageService.buildErrorMessage({ - title: 'Unable to join your channel', - description: - 'You are in a channel, I am either unabelt to connect to or you aren&apost in a channel yet', - }), - ], - }; + const joinVoiceChannel = + this.discordVoiceService.tryJoinChannelAndEstablishVoiceConnection( + guildMember, + ); + + if (!joinVoiceChannel.success) { + return joinVoiceChannel.reply; } - const channel = guildMember.voice.channel; - - joinVoiceChannel({ - channelId: channel.id, - adapterCreator: channel.guild.voiceAdapterCreator, - guildId: channel.guildId, - }); - - const connection = getVoiceConnection(executionContext.interaction.guildId); - - if (!connection) { - return { - embeds: [ - this.discordMessageService.buildErrorMessage({ - title: 'Unable to establish audio connection', - description: - 'I was unable to establish an audio connection to your voice channel', - }), - ], - }; - } - - const player = createAudioPlayer(); - - const resource = createAudioResource(dto.search); - - connection.subscribe(player); - - player.play(resource); - player.unpause(); + this.discordVoiceService.playResource(createAudioResource(dto.search)); return { - embeds: [new EmbedBuilder().setTitle(`Playing ${dto.search}`).toJSON()], + embeds: [ + this.discordMessageService.buildMessage({ + title: `Playing ${dto.search}`, + }), + ], }; } } diff --git a/src/commands/search.comands.ts b/src/commands/search.comands.ts index 4a1e5d9..a6dc466 100644 --- a/src/commands/search.comands.ts +++ b/src/commands/search.comands.ts @@ -8,12 +8,12 @@ import { TransformedCommandExecutionContext, UsePipes, } from '@discord-nestjs/core'; -import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; import { Logger } from '@nestjs/common/services'; import { ComponentType, EmbedBuilder, Events, + GuildMember, Interaction, InteractionReplyOptions, } from 'discord.js'; @@ -21,11 +21,12 @@ import { JellyfinSearchService } from '../clients/jellyfin/jellyfin.search.servi import { TrackRequestDto } from '../models/track-request.dto'; import { DefaultJellyfinColor } from '../types/colors'; -import { v4 as uuidv4 } from 'uuid'; import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { createAudioResource } from '@discordjs/voice'; import { formatDuration, intervalToDuration } from 'date-fns'; -import { format } from 'path'; +import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; +import { JellyfinStreamBuilderService } from '../clients/jellyfin/jellyfin.stream.builder.service'; import { PlaybackService } from '../playback/playback.service'; @Command({ @@ -41,7 +42,9 @@ export class SearchItemCommand constructor( private readonly jellyfinSearchService: JellyfinSearchService, private readonly discordMessageService: DiscordMessageService, + private readonly discordVoiceService: DiscordVoiceService, private readonly playbackService: PlaybackService, + private readonly jellyfinStreamBuilder: JellyfinStreamBuilderService, ) {} async handler( @@ -149,6 +152,20 @@ export class SearchItemCommand durationInMilliseconds: milliseconds, }); + const guildMember = interaction.member as GuildMember; + const bitrate = guildMember.voice.channel.bitrate; + + this.discordVoiceService.tryJoinChannelAndEstablishVoiceConnection( + guildMember, + ); + + this.jellyfinStreamBuilder + .buildStreamUrl(item.Id, bitrate) + .then((stream) => { + const resource = createAudioResource(stream); + this.discordVoiceService.playResource(resource); + }); + await interaction.update({ embeds: [ new EmbedBuilder() diff --git a/src/models/generic-try-handler.ts b/src/models/generic-try-handler.ts new file mode 100644 index 0000000..a8e5ab4 --- /dev/null +++ b/src/models/generic-try-handler.ts @@ -0,0 +1,9 @@ +import { InteractionReplyOptions } from 'discord.js'; + +export interface GenericTryHandler { + success: boolean; + reply: + | string + | InteractionReplyOptions + | Promise; +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 060e903..e3ec416 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -3,4 +3,9 @@ export const Constants = { Version: '0.0.1', ApplicationName: 'Discord Jellyfin Music Bot', }, + Links: { + SourceCode: 'https://github.com/manuel-rw/jellyfin-discord-music-bot/', + ReportIssue: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', + }, }; From c2c2a9d091b01fd6c073cb870492787fa6047b78 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 17:56:55 +0100 Subject: [PATCH 14/40] =?UTF-8?q?=F0=9F=8E=A8=20Code=20cleanup,=20remove?= =?UTF-8?q?=20old=20api=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 - src/clients/discord/discord.voice.service.ts | 55 ++++++++++++++++++ src/commands/current.command.ts | 28 ++++----- src/commands/disconnect.command.ts | 52 +++++------------ src/commands/help.command.ts | 22 ++----- src/commands/summon.command.ts | 61 +++++++------------- src/models/generic-try-handler.ts | 10 ++-- yarn.lock | 8 --- 8 files changed, 117 insertions(+), 120 deletions(-) diff --git a/package.json b/package.json index 00c4143..b364c7d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "@nestjs/platform-express": "^9.0.0", "date-fns": "^2.29.3", "discord.js": "^14.7.1", - "jellyfin-apiclient": "^1.10.0", "joi": "^17.7.0", "libsodium-wrappers": "^0.7.10", "reflect-metadata": "^0.1.13", diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index 79ca9bd..9489091 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -1,5 +1,7 @@ import { AudioPlayer, + AudioPlayerPausedState, + AudioPlayerStatus, AudioResource, createAudioPlayer, getVoiceConnection, @@ -68,14 +70,67 @@ export class DiscordVoiceService { this.createAndReturnOrGetAudioPlayer().play(resource); } + /** + * Pauses the current audio player + */ pause() { this.createAndReturnOrGetAudioPlayer().pause(); } + /** + * Unpauses the current audio player + */ unpause() { this.createAndReturnOrGetAudioPlayer().unpause(); } + /** + * Check if the current state is paused + * @returns The current pause state as a boolean + */ + isPaused() { + return ( + this.createAndReturnOrGetAudioPlayer().state.status === + AudioPlayerStatus.Paused + ); + } + + /** + * Checks if the current state is paused or not and toggles the states to the opposite. + * @returns The new paused state - true: paused, false: unpaused + */ + togglePaused(): boolean { + if (this.isPaused()) { + this.unpause(); + return true; + } + + this.pause(); + return false; + } + + disconnect(): GenericTryHandler { + if (this.voiceConnection === undefined) { + return { + success: false, + reply: { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'Unable to disconnect from voice channel', + description: 'I am currently not connected to any voice channels', + }), + ], + }, + }; + } + + this.voiceConnection.destroy(); + return { + success: true, + reply: {}, + }; + } + disconnectGracefully() { const connections = getVoiceConnections(); this.logger.debug( diff --git a/src/commands/current.command.ts b/src/commands/current.command.ts index c678fad..e8f93eb 100644 --- a/src/commands/current.command.ts +++ b/src/commands/current.command.ts @@ -1,23 +1,25 @@ import { TransformPipe } from '@discord-nestjs/common'; -import { - Command, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; +import { CommandInteraction } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { GenericCustomReply } from '../models/generic-try-handler'; @Command({ name: 'current', description: 'Print the current track information', }) @UsePipes(TransformPipe) -export class CurrentTrackCommand implements DiscordTransformedCommand { - handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions | string { - return 'nice'; +export class CurrentTrackCommand implements DiscordCommand { + constructor(private readonly discordMessageService: DiscordMessageService) {} + + handler(interaction: CommandInteraction): GenericCustomReply { + return { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'NOT IMPLEMENTED', + }), + ], + }; } } diff --git a/src/commands/disconnect.command.ts b/src/commands/disconnect.command.ts index 46fcccc..6474d8e 100644 --- a/src/commands/disconnect.command.ts +++ b/src/commands/disconnect.command.ts @@ -1,13 +1,10 @@ import { TransformPipe } from '@discord-nestjs/common'; import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; -import { - CommandInteraction, - EmbedBuilder, - InteractionReplyOptions, -} from 'discord.js'; -import { getVoiceConnection } from '@discordjs/voice'; -import { DefaultJellyfinColor, ErrorJellyfinColor } from '../types/colors'; +import { CommandInteraction } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; +import { GenericCustomReply } from '../models/generic-try-handler'; @Command({ name: 'disconnect', @@ -15,40 +12,23 @@ import { DefaultJellyfinColor, ErrorJellyfinColor } from '../types/colors'; }) @UsePipes(TransformPipe) export class DisconnectCommand implements DiscordCommand { - handler(interaction: CommandInteraction): InteractionReplyOptions | string { - const connection = getVoiceConnection(interaction.guildId); + constructor( + private readonly discordVoiceService: DiscordVoiceService, + private readonly discordMessageService: DiscordMessageService, + ) {} - if (!connection) { - return { - embeds: [ - new EmbedBuilder() - .setColor(ErrorJellyfinColor) - .setAuthor({ - name: 'Unable to disconnect from voice channel', - iconURL: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', - }) - .setDescription( - 'I am currently not connected to any voice channels', - ) - .toJSON(), - ], - }; - return; + handler(interaction: CommandInteraction): GenericCustomReply { + const disconnect = this.discordVoiceService.disconnect(); + + if (!disconnect.success) { + return disconnect.reply; } - connection.destroy(); - return { embeds: [ - new EmbedBuilder() - .setColor(DefaultJellyfinColor) - .setAuthor({ - name: 'Disconnected from your channel', - iconURL: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/circle-check.png?raw=true', - }) - .toJSON(), + this.discordMessageService.buildMessage({ + title: 'Disconnected from your channel', + }), ], }; } diff --git a/src/commands/help.command.ts b/src/commands/help.command.ts index f909a06..4ed6db8 100644 --- a/src/commands/help.command.ts +++ b/src/commands/help.command.ts @@ -1,30 +1,18 @@ import { TransformPipe } from '@discord-nestjs/common'; -import { - Command, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; import { EmbedBuilder } from '@discordjs/builders'; -import { InteractionReplyOptions, MessagePayload } from 'discord.js'; +import { CommandInteraction } from 'discord.js'; import { DefaultJellyfinColor } from 'src/types/colors'; +import { GenericCustomReply } from '../models/generic-try-handler'; @Command({ name: 'help', description: 'Get help if you're having problems with this bot', }) @UsePipes(TransformPipe) -export class HelpCommand implements DiscordTransformedCommand { - handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ): - | string - | void - | MessagePayload - | InteractionReplyOptions - | Promise { +export class HelpCommand implements DiscordCommand { + handler(commandInteraction: CommandInteraction): GenericCustomReply { return { embeds: [ new EmbedBuilder() diff --git a/src/commands/summon.command.ts b/src/commands/summon.command.ts index 71b0f4a..3fbb7b4 100644 --- a/src/commands/summon.command.ts +++ b/src/commands/summon.command.ts @@ -1,15 +1,11 @@ import { TransformPipe } from '@discord-nestjs/common'; import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; -import { joinVoiceChannel } from '@discordjs/voice'; import { Logger } from '@nestjs/common'; -import { - CommandInteraction, - EmbedBuilder, - GuildMember, - InteractionReplyOptions, -} from 'discord.js'; -import { DefaultJellyfinColor, ErrorJellyfinColor } from '../types/colors'; +import { CommandInteraction, GuildMember } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; +import { GenericCustomReply } from '../models/generic-try-handler'; @Command({ name: 'summon', @@ -19,45 +15,28 @@ import { DefaultJellyfinColor, ErrorJellyfinColor } from '../types/colors'; export class SummonCommand implements DiscordCommand { private readonly logger = new Logger(SummonCommand.name); - handler(interaction: CommandInteraction): InteractionReplyOptions | string { + constructor( + private readonly discordVoiceService: DiscordVoiceService, + private readonly discordMessageService: DiscordMessageService, + ) {} + + handler(interaction: CommandInteraction): GenericCustomReply { const guildMember = interaction.member as GuildMember; - if (guildMember.voice.channel === null) { - return { - embeds: [ - new EmbedBuilder() - .setColor(ErrorJellyfinColor) - .setAuthor({ - name: 'Unable to join your channel', - iconURL: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', - }) - .setDescription( - 'You are in a channel, I am either unabelt to connect to or you aren&apost in a channel yet', - ) - .toJSON(), - ], - }; + const tryResult = + this.discordVoiceService.tryJoinChannelAndEstablishVoiceConnection( + guildMember, + ); + + if (!tryResult.success) { + return tryResult.reply; } - const channel = guildMember.voice.channel; - - joinVoiceChannel({ - channelId: channel.id, - adapterCreator: channel.guild.voiceAdapterCreator, - guildId: channel.guildId, - }); - return { embeds: [ - new EmbedBuilder() - .setColor(DefaultJellyfinColor) - .setAuthor({ - name: 'Joined your voicehannel', - iconURL: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/circle-check.png?raw=true&test=a', - }) - .toJSON(), + this.discordMessageService.buildMessage({ + title: 'Joined your voicehannel', + }), ], }; } diff --git a/src/models/generic-try-handler.ts b/src/models/generic-try-handler.ts index a8e5ab4..47183c7 100644 --- a/src/models/generic-try-handler.ts +++ b/src/models/generic-try-handler.ts @@ -2,8 +2,10 @@ import { InteractionReplyOptions } from 'discord.js'; export interface GenericTryHandler { success: boolean; - reply: - | string - | InteractionReplyOptions - | Promise; + reply: GenericCustomReply; } + +export type GenericCustomReply = + | string + | InteractionReplyOptions + | Promise; diff --git a/yarn.lock b/yarn.lock index 06e28ac..8687676 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4437,13 +4437,6 @@ __metadata: languageName: node linkType: hard -"jellyfin-apiclient@npm:^1.10.0": - version: 1.10.0 - resolution: "jellyfin-apiclient@npm:1.10.0" - checksum: 494161b3acf2e17db22c50fd13c637890985fa95aced5f4161045ae7a1eb80374625e83f2bd286a5a0f06847e06fab1f4dcc2d93f603bc1b033344adb12a7f7b - languageName: node - linkType: hard - "jellyfin-discord-music-bot@workspace:.": version: 0.0.0-use.local resolution: "jellyfin-discord-music-bot@workspace:." @@ -4472,7 +4465,6 @@ __metadata: eslint: ^8.0.1 eslint-config-prettier: ^8.3.0 eslint-plugin-prettier: ^4.0.0 - jellyfin-apiclient: ^1.10.0 jest: 28.1.3 joi: ^17.7.0 libsodium-wrappers: ^0.7.10 From 9c23ef293fa32112f017062ce878da56259d7452 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 18:31:58 +0100 Subject: [PATCH 15/40] =?UTF-8?q?=F0=9F=90=9B=20Crash=20when=20no=20items?= =?UTF-8?q?=20from=20API=20are=20present?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discord/discord.message.service.ts | 5 ++ src/commands/pause.command.ts | 52 ++++++++++--------- src/commands/search.comands.ts | 11 ++++ 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/clients/discord/discord.message.service.ts b/src/clients/discord/discord.message.service.ts index b8b96cd..4ea303d 100644 --- a/src/clients/discord/discord.message.service.ts +++ b/src/clients/discord/discord.message.service.ts @@ -20,6 +20,11 @@ export class DiscordMessageService { description: description, mixin(embedBuilder) { return embedBuilder + .setAuthor({ + name: title, + iconURL: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', + }) .setFooter({ text: `${date} - Report an issue: ${Constants.Links.ReportIssue}`, }) diff --git a/src/commands/pause.command.ts b/src/commands/pause.command.ts index 833cd3e..6626ad8 100644 --- a/src/commands/pause.command.ts +++ b/src/commands/pause.command.ts @@ -1,23 +1,9 @@ import { TransformPipe } from '@discord-nestjs/common'; -import { - Command, - CommandExecutionContext, - DiscordCommand, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { - ButtonInteraction, - CacheType, - ChatInputCommandInteraction, - ContextMenuCommandInteraction, - Interaction, - InteractionReplyOptions, - MessagePayload, - StringSelectMenuInteraction, -} from 'discord.js'; +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; +import { CommandInteraction, InteractionReplyOptions } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; @Command({ name: 'pause', @@ -25,16 +11,32 @@ import { }) @UsePipes(TransformPipe) export class PausePlaybackCommand implements DiscordCommand { + constructor( + private readonly discordVoiceService: DiscordVoiceService, + private readonly discordMessageService: DiscordMessageService, + ) {} + handler( - interaction: - | ChatInputCommandInteraction - | ContextMenuCommandInteraction, - executionContext: CommandExecutionContext< - StringSelectMenuInteraction | ButtonInteraction - >, + commandInteraction: CommandInteraction, ): string | InteractionReplyOptions { + const newStatus = this.discordVoiceService.togglePaused(); + + if (newStatus) { + return { + embeds: [ + this.discordMessageService.buildMessage({ + title: 'Paused', + }), + ], + }; + } + return { - content: 'test', + embeds: [ + this.discordMessageService.buildMessage({ + title: 'Unpaused', + }), + ], }; } } diff --git a/src/commands/search.comands.ts b/src/commands/search.comands.ts index a6dc466..14de61f 100644 --- a/src/commands/search.comands.ts +++ b/src/commands/search.comands.ts @@ -53,6 +53,17 @@ export class SearchItemCommand ): Promise { const items = await this.jellyfinSearchService.search(dto.search); + if (items.length < 1) { + return { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'No results for your search query found', + description: `I was not able to find any matches for your query \`\`${dto.search}\`\`. Please check that I have access to the desired libraries and that your query is not misspelled`, + }), + ], + }; + } + const firstItems = items.slice(0, 10); const lines: string[] = firstItems.map( From feeb09a17da502fdca5ac15a89945a7bb17a6c27 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 19:52:32 +0100 Subject: [PATCH 16/40] =?UTF-8?q?=E2=9C=A8=20Add=20embed=20to=20display=20?= =?UTF-8?q?playlist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/icons/jellyfin-icon-squared.png | Bin 0 -> 95175 bytes .../discord/discord.message.service.ts | 6 +- src/commands/command.module.ts | 8 +-- src/commands/current.command.ts | 49 +++++++++++++- .../{search.comands.ts => play.comands.ts} | 25 ++++---- src/commands/play.command.ts | 60 ------------------ src/commands/previous.command.ts | 40 ++++++++++++ src/commands/skip.command.ts | 39 ++++++++---- src/playback/playback.service.ts | 53 ++++++++++++++++ src/utils/constants.ts | 11 ++++ src/utils/timeUtils.ts | 11 ++++ 11 files changed, 208 insertions(+), 94 deletions(-) create mode 100644 images/icons/jellyfin-icon-squared.png rename src/commands/{search.comands.ts => play.comands.ts} (92%) delete mode 100644 src/commands/play.command.ts create mode 100644 src/commands/previous.command.ts create mode 100644 src/utils/timeUtils.ts diff --git a/images/icons/jellyfin-icon-squared.png b/images/icons/jellyfin-icon-squared.png new file mode 100644 index 0000000000000000000000000000000000000000..04193b4a001cee95b2ce423b83dae937a4bdbedd GIT binary patch literal 95175 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∈N54E2|KS$nLck#+MyBe;{2(}kXu&ZH z#UQrYVj~>!fhSwBcctKh+V{Y*(P&&?vu$@M)Amjd8@|GOxc_)c`{FF_f)&6mk{djN zS}Nw+y0$&d0zJ{boqPI`7WnIk|AfVPRf?LnIHw7uom#r-k8=&gotIR-AArG%2kRqU zaVIeCN(2AvzW)blDEa;VH>2Kbi{pJ~F($5Dx<;rQu%Y6Ygz-xV9+q!P;xH}c84a*r zC`dalyED_4AIVUkM;|8|Xqj zQh0-z1yJs6#i$XL!+C9xxE4t{Aave3(Vy%1!1`I~3VcD##g<@VqZvb+tt;V%FPn3m z3y41z5-9S}%j7XdG7i$7p6VmA{aMOp~zw zmUpTa^ZOT7+J+F@Q1XPaOobjI05T*%WiEURRwp7Zh}SzzBcgv*_b{etfO4tT!w^t* zgT6T?2})xnP%>xR$DY%^$lYS&3B_Oe=IpxmB%c83D#`c-P>8(~>4$^6J3_2lto~+} zSB*1@LjWroSan2)WF7NGZ-$fB=34h$#h5+}RpGBQ#?2_JMXLdUQu26^Js)QUKHV}x z#?tV&A_4{|W_^A5n>CQAK$T01$>dWY|B)QzGK}|Jlnk@JAsFXpwXEMYd7P`?n1Zlp zgZXY6hdDFJIr7o6zPHs|!MLw;oRtmu#QEvGyLRmL*?o3LL|64QbDRIK1&C#oS0DY= z3WTvlksHguMXDdiHd@Zp`HUaHmzp~=bSW?=?DGb6H~NY!%in~?Ml<4st28{ZmskFn z1ncuR_q-T1P|b-z5XbaCr2j}@;B|MT=Btms-b;o5NwwNy6>07u*)VMRd#w^Wz}QP? zGhN~8kJSaf#~9ZKNAv+hIpBe;+Sl^PY7Tmzu~Of|rbqxI-c(x%RA0LTb)BB`O%&}= zmP_rOzQwOMy5F~jFof~;!TC6OlZJ&r1J`MK*YO-jR-%!x%wKBCX&kdKdEWtZf}2i7 z?iWSkcS@Lf1}IH7ZDEs{F2&rM0En7soM=nd00Q?&VpQmf!%B)T-Mc z%_MS0q#<8?W)Mh5Le=BKsB!9*_OXa)K!~l`kLKTQ&qxnc>zAJ2Wa)*(?3@FErKtGd zz>;(48*UtOJ2HN=tiqeykQmPM8R2N{8s#JKd&OE1pe{IBYAXdjWsgi_GEF;!lbXolB#&sun&XMK#1cs5kri?-TLNF5NO)EG&jLer|-rtw#V^wFxiw$*4E zu@rOP#G{fTP<_-5%1~un^Y2&zq4*U21(#%pY@{~0b~Yow*YfIRvM=aL=ry0$cj9?% z#g0=vrfWOjeCa$!{kDzi#{ZVABk)~6 zR=ME`$(lnzOeQr3Lf#jJ7x@}w{eDinZvPBa`3Rft(41hKBATX8vwQUIjewynK#b-S z(siPH6^hDQ$_P*$WMk?Q8ef>J3?#+CyfL}m}ZC%H@G z0^8aDMp4mhV17i|&}iIM)U@@mX`DY@6HNYMFLk0+)lKE~kwO?G%IU~GqNz7<9_ja= zWQB;2<9ACfEkDx|0734WQ5o~T0G_v(x-Wgr#&6JBw)AC56{*Y#o%5Jjo8eIkJ>6*T z69M^w!g8%gI?=S!Ywq|~WqakTNHvg%YWu#;hTPpq5mccHFhpKTkrBTn_(J)`03Z4U z$wRF}2ogzmAfEXoeL`0_k@xXzXh>L`BLm5Kyjq;FZQh#p`k(lTyw%b_g_^>$iVboL z?=y*LS9Mp}{iDXv`iuW6^YkL+E$fL=pTQ0jNH5<3igO*5jIpHt=ns0C zCg5s3fHR>%WHo}u&vE;pmx&X+SB+Vv6^xH8yuCu9Al(-RbI@C6U%#2DAufd@Wt$z?N7Y+mq zymdVgln(eAx>jo5#t;ojr)$~Pr;YtX|oGmhImtjU`` zRRo)?A)Dz-9PdQ1bPB3)4HS7yuE&U72!M<*k2;5~pkV?XUmMz81KGv*tx~i%hwha> zb=K3j@S|tk+vD-{8fPYQ{#(cM`uS*<_Ger9GqmdF5;aiXx0afl$*n?YR-e^BeseRz z@JuQ50%FNOlqU~xS@BEC&!}a2yXGDADe-N>UgSBpIKh^i%75~Kqc)8=B&+Cv zyCn|nw;WRO2=RbZ9v$)uA@ z{K;R{NzCvVC|*>)A34yJHE!4L((uL?v5$Bf&qUh=^ zQIo>ZV!jL_BZhjvRsS|ou-?F?%OkAu572*cm^3Jwo-|<`-uNLp(?F*>Eohi%vIf5c zBlUBc4+ESN?bd*L5%uBUaDHQMG;mecRS&P0XhA-)w3ZBhq|##&{)^4WQQPe@xYZWa z`2r``^LSP)*CY*B!~L0er{KgwQ)V%flUgdveZKHG%Ji!Gn4~J0Ft7H7Pck2hW9Yvf z!F#2>14o~JL?Ye)OO~xR^7WY~p8njc+f)~ij)Kr%B=;rCZt}pv5Vc;6ZLwS%H}&Da z1VwYEQhOMWhi>=Do(QGr)m%}F;UHOZ)t^RM9RlDRAulwBiM7p`{*(I2|jcy(;qmK+iIXw?FpsP7jdtLD9oCT z#_1Xke>c8gb(h=vLVE$K+dF%Tv3q_jWDTJ>L%t@olxnxUe6Cy0njtd&UULhnoNB@G zfU1OEDon2eKU`9#eq|-(sARwdT%5!Vj5^H8gA5zZhAwHQ9r2De;%dGLaj|Vp`tqmf z-&Rbm1N0D;W5M-KaN>jMIL&+NBTYLq58=tH#0tR;Kw~%qGzN*}n^xVe&_C8Ay)MJq z?vNv*Fh1$@=%h0E1PlnB<&uQOxI!L$mcQhSS`oL=)>@x*?_~+aJ0tATFk`{q>*+c9#1Dz?VHGv#^N@q6?lcn=D0Ax$l&R z>yT^l5a=>SoMF+TRGK9zf}fq7NWb$3#O3I@5 zN7FfFd$gQw^?jA%LAl51h*N$j@};*bhcT|!ksWEpTRE?wJW4A%nGEgH{ll!Nz)@)^ z$9W0-VLeTuoqeYJqiF42EyW}(4aZQCYYJb#P0br&7RY-aVm(>LiNA#22tRs9E43Vm zJI!gxN_wB(fPrMHDjd;RBJVK4DQ?K*cv||wrK~zjcVrfJ+J8k$V5=5AN1SZ(%LQR2 ze(uxOMGmFCPDG5z)j}~_8yRHMjbT?J^k!S4-LCzN0Z6w=ndVCWih-kO=^hKS;FvL@ z$4No*O8c<0vYN=Z)f+Nh_p5^8+-%hb!&8Akw4R4)U`QhHitW#+ zd$6=h(OL{9=_7CBl09d&g;tsv;(^@@9|q^$4{^Aw9zaNyI(h*2XAco57wWwF4vG*y z7ev*UxrLOfbSvw0_!*K-$cj_wHOlvA0Ew>L?zcS*_}3g+aQvULxCxuszrg)+5{s!- zJ<#24Kxy;_N<~O!iiLdP^0mfc5bOWwN*5Iw|tDv9JYtSGpeJ*$NMlCzDF2T^D zj_?l?a(^Y$u&B;dNRIi)A5oO%bYMI+QppQR(NtD)S(I;VJcU#EHvX^NO(yQmdohaC zTu~S~QT^==3o|&IW_|`;h=-`=k%xcg9yAbA<}SP*??Vt}_q3;4bseWGk?vhkjsySV z3j!1WFTK*UuAU{4NqADyFb43JoOE@J2?z1H}+F!fPPP7(C_)2G- zsK#6hTc*N);XsjdX^vUm{!-GQMo;g3F|Y{!8dDJ1v5_bY_0qpg?-9rH%WET`NTA){ zba?Ys_YTFCceTZ6bteGvE+;9ogIJr_Hc@U~s7?jh8X1l^CpP==LWt-iYrEv8xVx~4 z!0%|0X1zQkdgHcUpMsK;A~?zZ5p~8VUPcf{3?cgV%Z?aC;sFG6%1dvUR=tpra?`2< zAVQV78pCozaQ+me)F|x?Zy0N$bc&j??U!r}rpmM9ks&hN4s8263>&UV{I&tBl=wwM zIrJnt`TCXI93M8ajDsMAV4I}k^TbzMkp$~QlqI{|iRk>l!jij)YN+aFfy?}I=EYi{l$a|x||MPy? zk7wshpP6gs)~&vCPE(BFWgS%Dd%jf1M;`R)T^}YNrt3^6N!&vn;Nb$wL6|Z3OO`E1 zKwVA=|12p}CFoEGbQ88*Hp86W~G0gN(Zi)je0A0wTYQbuNB>$!uL&QV0`P4CiC zhfD1I?SEU$0?Jq3%*zdcjUdLYFC(6J3G&Ks1*a?zG}|_DmHbS%afEx{R|6pALE!;U zm~d@)o2}v$vsYFFhEy+COm{)K9p|?q7PXUXF#rbl#0Hy0E(F|1PHCdpC?<%WifF4x zSx_@zT#Fv^Xw^PIl~*0{%mzcKc12ZIb*ZnF*8%d0vaag=Nd3NGJL0?15}<%rtm|&s zIXgv&IJyAJwpMwb6w!90+vvwpOopWKsWpj-*QLsE>QMZVz7+{e!7J?fP8OYwe&~1xpy%wt?$3dz)oV z-uP$RKYyaS@%ZjX7Dwyk$s6+yVh%zZOMjBA5&iU)bJdE0&2#m0o~HO5_RpUs}MxXcwXL6_!jnU4=RKk>0fhuHowy zKcfB8xP2|};MiP4_-|DrZr*1AS#$IEmQK?n&xiib8wE|=j(>f+_tbu`^s72Qam>Kh z`JHVyMTU|x;fby;2FzkPVTyrQH#SVaofb8yG)9iFE9=mageo!UhH>)SN%i7|xxJ|u zNypJp>(mEbNM=bZVqZ^(Qx33LIyd{7N%h9s!7E?LiN5uC>NW3!zcklm8}e)WV{R@+ z9UP~Ee#2kt&T7|msrO886Ur0(AL9CLa8zC}>7`p9ZUZ*|JJC4S7h6Xcih=Mgi}-iv zgnH%6<%{s_KmcHX%|kp*ze`E4M%B3ANBj|lhv!NkQ$-3H697u_9`^C;dSH%<9dU=< z*~;X1 z&vD)l--$ErCE`x4$jN$pTdnb=+aEkESHVimJ*6cZ>4GcUj+n=N{Vsv$!1K=y&e+k`=3iydyF4@&6@0R?MDG6T{2I}u? zUkzsB^#XskMQF3lbCD!~;$vl7uu11@&|JE@HF|U{@`04zipy5OJph$60mB$9I_Wu( zaDCHcoK%@j1PYAODb-vN9yGS(`4uS>6F*VrY>zVMhfWuCBwXaXMlZVpVWWEi6w59t zyM>9LJgHluyqXdbjaV7_8a*TGj(gO6eUd{lahUYF5qNl$UxxzN6nM%Yl{;u~2tqUNd$8}!sr^N0z@!RV6 zU{~F!&k+>D`4)+b^H%;YD>i6?&da7(cbmQ1=*_NgZ>_-`*d^X>q_EiIfN!GX?ZP`N znh;|>CITHk;|*KyGAPNGgsH3#J5QXN_akDp7H95qr8NyThvu!tS%s=d;v?w7RME4_ zY(|$~w5tCu+&afYTh8*vOmTjdIuvD&jDcq_TvSK1d{rv1H$PDQgk64Ic%A%9q6VS3 zL&727bH3Fpq(Af*aoMOg*8_@;uoX*8Tl$>&6ZRng(@E|$hI62SQ|>p?DURYd2E>}0 zf9*0mL_Ky?#{k!WUE+vA+rv}FPDrql9in4Xx1ii4M4sbn$NS_QV(!W-o(`JF=Bx`fBlazc1cU`^SaQ z;6zTk9dn3X1oDrJJ<&JT6qD{w*Lf?Y1q66V5kCcs9>Gu^q}2yz76(6HC!ip)r6E*g zE8%BDYmlq|qKd}eCepnX`@NJ78`~}hy^*Z{WJ&Gx5LT1!R3tJqF4f&g*cnXgPLl+} zJKm6_Q?(l(P}#qI5(l9gL5TPX`sYQZoK{d9TzR)ru(ubbND6uM@4?YUW3B)pdSj*n zVczYNL>r<^V^H;xBlgN4bG;1R`pigCRc=$tBx$|HQ#8>W6O zUJTt=tvuer2b+ad?Wlxb39kpw#GQ_h_E<&HQ+mZ-=WbBmee)x%fAt0DgWhG*C=sjX_;(&`+`uXW5N> zyMe-pWmk|9d9r8QiT7!Jhv}+xCn;^D{lNCKk8elNyKlhe36*Qr!0L>-}HM&>M4k(7|>_YTLPbaQt1<=5X|TuxW7+FT(iId zeFYSEaO!{sVW!pnz!WT+Y!M|=v8dxsoe6>?CIO05v6UJ+ zps|ajbFgT{Wi*{vZGCX-5VWKKHmh{M^d@qP5u%On)iZ|MFsZ-ti5apsP;n(Hlds^( zy@1#n0qBQj{Bqc4;rX%M=S7zR4|DdVWVkJr+K}{P8lwNX*T1_H`+YTjCWuQ;ljBN2 z>B-Vpvev`;1>d+^W>YWj{gR?fNcaX&rr|VYHh}$c^ zm;#dqBGX~wZ$b_rd{3V=&5;r~#75}hxK0sEuk7)QVtH^FofMh;vFD{>sV9AEJwmYH z62%=BGSqb3XxY7KeJLfa75a!Qqy${7PZ6VEDFdtH6HQ6U?ESh3HaS!8oQy}YK;%iV#**(i=+bAk4TO%BoXfH0Q;^b~1( zhzsf80DaQIZk?|3Ljj9R%0s|zRu6*Qr91@V+^`P=|IRydZ;>X=j!j)*xew93-Rs&PbP_y>Vik z!W#^qNM2q}f*XV$rOQXYTTD+7h*kr_%^>|q{n3ZO?}0mG8}l2-()*Uti;G9wS<*SI zrY8fUI6l8G0VFtfskw*gdjBm#I)`2M&LbJk{3HFLp+AkV#OiCVdHH?SzWx755 z%Q6Vdbbh|qJFz;l2&<@ltA0qzL3UTZleu*6KTxi~JZloO9>F zlEYV;kaUx96sRy(rr6}tJ z<&vFt!D^x_Y&8}~B2PV9{Wn-J8n`DNJ|DjS93K8E#ypgw$0?-WQ5EbrIw4xG9&;J2 z^2nkM0R30U`-=>_RhzwtUCu@`iSl(D?zU*LKqd;#_t<+a>MOOngYg~!hWHE(cbynz zC8wq-c|)6OXg{`N{Xn?y1pgF1`mIlCv&#wp_4Ew9PVY=?)&tkKU+l^A0<$<(*g}RJ z+m0dA@-yq`sd_yJ+h>!(!Fr?5rlReVep&XN-a)__M;7k^S};Up6ugmzhG^?aurA5v z$sj`quf@Ku1VVeHg3N=tN;N!~1b{Djy!Mt~^vbA#A2z=0xgwhQJY_y=X~(%@kq1v# zcQKZXCeHg@YS{Ej%R)IQpWbQiR7P2y!%wO+;v)#{>f~v)`O=O|*!*146;y!ftN%uc zNeW0E`11%E<^d$3uPNZ@L=Xv9st=_@$h%xx^6xJZ`9b5aUzE=l4<2Bf9?+ZbFRyo! zF8Ki{+yS`dOAB+nNc_2#(U(gGOv0*9VfoveMr%K=h+S zbfYj%75nuZ-#b;CF9EkvU6W%C6nahPer>_ymC_i8$f=@Pj#2AXSWp>WbakKzbiZ>D zubXQm@HvHT3(Is5v@4xB_Xj%jos2P1=C|Ng4QRy^@V->WVneG5v@W#-hGT462?#X4RxG%q>5J9?Lm5 zyt1XRVJ+3nJ=|$Zo6r7+Xe=9xr+K{4ly3j^0Si&`tUlIs?d2c7ZSp++Uz@*Al-&93 z2Mj4*?9@I26#O5n0%BBN0?i#j;{Jr#Ia#OnjnVguba#g(w^l)me4||8D}N(L`ewZb z*ay_(=N|XcF<#Cc0gCT5IebhM4gDJ@eTgM0!81^o5I?FaVy$S^r;*hWTaX;G8KY@6 zS2Uogw`Lo#?>o>G@>#bH`uuPlI%VbqK5BVjusb_NCGsCA4vC&u^Ue(NIBD=zqdLR zrU|$6`X3emXz+M6G9TO2W@Lr`R*bw|51JOpyg*uZD|>ter(?DVBjmw9{DP6o7wqR=tbHNxFEd@%0;_# zPugk=qz3M#=8rwj<*Zm4u7G;M>Jz5LL|`OMLJf*pv+!9H5vRldqFQviT2$iQC(@FZ z`Q|Ub@%=|fzbXgx5IC@!#h5r_`Yp*tBh)iUzD#4$=2F#+%}akFha-#O8mrtoY41glGHjZb}*JZWIl z#fo@;u9w~w41UhW?z72c{Wu8F5z$$&Icy0h5=wG78x9LdCiO|utp@@=ouKOHTRRU* z16o9@qTsXDJ7Fm2p=m#oY&?X0orCaFZg39x%Y1IAAggULRGl9I@MVrUrQ%s^reGJiqi(etm`L)1rH6hA4r) z?lH@+r|`%2J28V2BhMeO?avt6QVS|~5_uzfi{!U!`@Omeb`6WNA1zOxt80uyRn~-s zjgyBBP{hdR((0MLseLa$Utj&)Q>bTf9X}|g&Mf|S;~)B~W9vrV0dfgktfEAx zOS0n&Vg6}h{%dp?_w9iTMX4YivHAt8NIw!00cS$kJXqzWH?>%Q)DUzD>5jr1ExxKD z?QM3l3p>&4Z@wPdwFxCFZr)$vpPs}i)y(7+pJh>|r?}q>ARaAmyzHxMrMN~NgTh;B z2H+LiEwC~kZ|Gl*%%=s)E=nU2Yno=c0=c#EP=Cs*S-;-Sx*}pIWfH+NC7*}3 zJIjp6v^p;5JG*V*HK#j+;n~}S4}ZUDHmBZnPUtbfFPM-c9Kk`z~37t=s*So!IjO6iYytVbfm=CfsB^o_F6tm`=mz;10;66-)zMHU{_A8u;3~=l43o~0QsC#oNiRmioa*W@XnJn{F z=6gizUTt?XOVpfChWw)HG!QAqUT_&ghylCW9h*tKbMgw^#(BHY*UzGQnWaKLrT-ef z&$K2?zrLpw3DE~gkxscLSK!;+TLLfUAIFhKh9akFkI9mr378cUx}-!ZgN6bIjVuVTX;SY1c@eA~9^(|0_%YRUmdO_wIwnDRpcGOuc(_RIz8nd(Oz9*kb$&1H2b zD}se5dTt&7Of*)H%4&gV-pIsQbQwWq)ogbymo+9250i<4+2Xug!+*jE`jf|i=T&fd zdbKs-fDzE(BQ%@Q7XfO18d$!#dURth#3Bx(tIs+8L}0?@YgNh=>omh(13K8_okxoY8QtpB078#U*Pake#Kg+%KmSDvZl>^H&N2MEEHd zZtsL7dEoEjBTzO=hhmLF!{dUVzNDJ^T#a#4@op44aG;X_7nf2AkSyJ zqA51;xiCJ~yhum}Mng=Hdf~t6?&7EQ--ncC9*E5|WSOnnc@6vji$AaW#Xbe{`cmmQ zR_dx>icQ`0)xdFF<+3qC^4vzWxV|4Asv!jD98r}r?65ssM^<$8Xgg>c=~jP#(bBa5 zh+UTlz=CgP&2jb4UU5br$2C=M`*2CY>)suwup?fPO$=O7D@i<(6X7*5g!gjD3k`CW zS%svx1U6e5`3SP)GyI5k!FbW%Sap2{uxI(pED#mN`x2Qv$%5k}sEg=gT+wLM63TR^ z?OHy1tN6=vc)v|NPZZX_@v`2{fAU?+G}->!(Na+ChHYgTIV#8-+xdvCbe5gM78zP# zp8OV%;%wZwZi?(pxL_Do))xDF3!D|X5QRd$+a@mS9iL%ii`h0trCkz5$3Hu&_W`{W zJ@R7GRKA|X)MpiE&*94#DFig=W&=fTK$@iN#K5|WlKaEjK&}BCi6C&0?ri%Vy9stT zR%*qo^uHAE;r?6%%oXYrT2o0R)AtUPXuh z{g}(3fWWwmq3O}0jlyE#Y*^lt0Ry!?IIz>{6 z{K<3Hx})OAc>l{r4g^iS%ZKw>4zwHuN3j5i>SdqZv>18-dv{VbfGP!fF+FK-iQFEy zp%*t=HEv^BioL)AtxE82=mhwg5}ZXk`0qxz?cIFkw3s*-&EcWH3c6uzDo97$Ze7tE zDd00=?-KHeeJ!ZzxZM75I?*2Ab~`aJ-CfAZ7c3r{XkK>~VU(chqQkl!Fy7mq{0exD zZg`C|yd>k^@Twp`Tov!*X*B&gQ7GPW?xxe%nigP#*)m*pGj9*HF;sNwD*FNrG$=)M z&M2uf7n-2-L1nsSs$c2IFF_AVdUkarFO;necV5Snt$XVv>1&oUIA}Rn06hkOcK&l0 zgaVluR3oXi5@9glsH*yX1~+Y>H-Q1j1fT8`bsGp=`-pl0%uWm8SI7Uc^`;-;Zb zb3AqvPB1EUcn%75IN}KM0FQ65-gts=eNY&8zlR-t#Sr76L0Y

I4}mumfLav5sFT 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 { + const isCurrent = track.id === playList.activeTrack; + return `${this.getListPoint(isCurrent)} ${ + track.track.name + }\n${Constants.Design.InvisibleSpace.repeat( + 3, + )}${formatMillisecondsAsHumanReadable( + track.track.durationInMilliseconds, + )} ${isCurrent && ' *(active track)*'}`; + }) + .join(',\n'); + return { embeds: [ - this.discordMessageService.buildErrorMessage({ - title: 'NOT IMPLEMENTED', + this.discordMessageService.buildMessage({ + title: 'Your Playlist', + description: tracklist, }), ], }; } + + private getListPoint(isCurrent: boolean) { + if (isCurrent) { + return ':black_small_square:'; + } + + return ':white_small_square:'; + } } diff --git a/src/commands/search.comands.ts b/src/commands/play.comands.ts similarity index 92% rename from src/commands/search.comands.ts rename to src/commands/play.comands.ts index 14de61f..0bb6fb2 100644 --- a/src/commands/search.comands.ts +++ b/src/commands/play.comands.ts @@ -28,16 +28,17 @@ import { formatDuration, intervalToDuration } from 'date-fns'; import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; import { JellyfinStreamBuilderService } from '../clients/jellyfin/jellyfin.stream.builder.service'; import { PlaybackService } from '../playback/playback.service'; +import { Constants } from '../utils/constants'; @Command({ - name: 'search', + name: 'play', description: 'Search for an item on your Jellyfin instance', }) @UsePipes(TransformPipe) -export class SearchItemCommand +export class PlayItemCommand implements DiscordTransformedCommand { - private readonly logger: Logger = new Logger(SearchItemCommand.name); + private readonly logger: Logger = new Logger(PlayItemCommand.name); constructor( private readonly jellyfinSearchService: JellyfinSearchService, @@ -102,15 +103,15 @@ export class SearchItemCommand return { embeds: [ - new EmbedBuilder() - .setAuthor({ - name: 'Jellyfin Search Results', - iconURL: - 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', - }) - .setColor(DefaultJellyfinColor) - .setDescription(description) - .toJSON(), + this.discordMessageService.buildMessage({ + title: '', + mixin(embedBuilder) { + return embedBuilder.setAuthor({ + name: 'Jellyfin Search Results', + iconURL: Constants.Design.Icons.JellyfinLogo, + }); + }, + }), ], components: [ { diff --git a/src/commands/play.command.ts b/src/commands/play.command.ts deleted file mode 100644 index 259810d..0000000 --- a/src/commands/play.command.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { TransformPipe } from '@discord-nestjs/common'; -import { - Command, - DiscordTransformedCommand, - Payload, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { GuildMember, InteractionReplyOptions } from 'discord.js'; - -import { createAudioResource } from '@discordjs/voice'; -import { Injectable } from '@nestjs/common'; -import { Logger } from '@nestjs/common/services'; -import { DiscordMessageService } from '../clients/discord/discord.message.service'; -import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; -import { TrackRequestDto } from '../models/track-request.dto'; - -@Command({ - name: 'play', - description: 'Immediately play a track', -}) -@Injectable() -@UsePipes(TransformPipe) -export class PlayCommand implements DiscordTransformedCommand { - private readonly logger = new Logger(PlayCommand.name); - - constructor( - private readonly discordMessageService: DiscordMessageService, - private readonly discordVoiceService: DiscordVoiceService, - ) {} - - handler( - @Payload() dto: TrackRequestDto, - executionContext: TransformedCommandExecutionContext, - ): - | string - | InteractionReplyOptions - | Promise { - const guildMember = executionContext.interaction.member as GuildMember; - - const joinVoiceChannel = - this.discordVoiceService.tryJoinChannelAndEstablishVoiceConnection( - guildMember, - ); - - if (!joinVoiceChannel.success) { - return joinVoiceChannel.reply; - } - - this.discordVoiceService.playResource(createAudioResource(dto.search)); - - return { - embeds: [ - this.discordMessageService.buildMessage({ - title: `Playing ${dto.search}`, - }), - ], - }; - } -} diff --git a/src/commands/previous.command.ts b/src/commands/previous.command.ts new file mode 100644 index 0000000..f131fb6 --- /dev/null +++ b/src/commands/previous.command.ts @@ -0,0 +1,40 @@ +import { TransformPipe } from '@discord-nestjs/common'; + +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; +import { CommandInteraction, InteractionReplyOptions } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { PlaybackService } from '../playback/playback.service'; + +@Command({ + name: 'previous', + description: 'Go to the previous track', +}) +@UsePipes(TransformPipe) +export class PreviousTrackCommand implements DiscordCommand { + constructor( + private readonly playbackService: PlaybackService, + private readonly discordMessageService: DiscordMessageService, + ) {} + + handler( + dcommandInteraction: CommandInteraction, + ): InteractionReplyOptions | string { + if (!this.playbackService.previousTrack()) { + return { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'There is no previous track', + }), + ], + }; + } + + return { + embeds: [ + this.discordMessageService.buildMessage({ + title: 'Went to previous track', + }), + ], + }; + } +} diff --git a/src/commands/skip.command.ts b/src/commands/skip.command.ts index a1ae7e3..04f4708 100644 --- a/src/commands/skip.command.ts +++ b/src/commands/skip.command.ts @@ -1,23 +1,40 @@ import { TransformPipe } from '@discord-nestjs/common'; -import { - Command, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; +import { CommandInteraction, InteractionReplyOptions } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { PlaybackService } from '../playback/playback.service'; @Command({ name: 'skip', description: 'Skip the current track', }) @UsePipes(TransformPipe) -export class SkipTrackCommand implements DiscordTransformedCommand { +export class SkipTrackCommand implements DiscordCommand { + constructor( + private readonly playbackService: PlaybackService, + private readonly discordMessageService: DiscordMessageService, + ) {} + handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, + interactionCommand: CommandInteraction, ): InteractionReplyOptions | string { - return 'nice'; + if (!this.playbackService.nextTrack()) { + return { + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'There is no next track', + }), + ], + }; + } + + return { + embeds: [ + this.discordMessageService.buildMessage({ + title: 'Skipped to the next track', + }), + ], + }; } } diff --git a/src/playback/playback.service.ts b/src/playback/playback.service.ts index 301bf64..7a3819f 100644 --- a/src/playback/playback.service.ts +++ b/src/playback/playback.service.ts @@ -25,12 +25,49 @@ export class PlaybackService { this.playlist.activeTrack = track.id; } + nextTrack() { + const keys = this.getTrackIds(); + const index = this.getActiveIndex(); + + console.log(keys); + console.log(index); + + if (!this.hasActiveTrack() || index >= keys.length) { + return false; + } + + const newKey = keys[index + 1]; + this.setActiveTrack(newKey); + return true; + } + + previousTrack() { + const index = this.getActiveIndex(); + + if (!this.hasActiveTrack() || index < 1) { + return false; + } + + const keys = this.getTrackIds(); + const newKey = keys[index - 1]; + this.setActiveTrack(newKey); + return true; + } + eneuqueTrack(track: Track) { const uuid = uuidv4(); + + const emptyBefore = this.playlist.tracks.length === 0; + this.playlist.tracks.push({ id: uuid, track: track, }); + + if (emptyBefore) { + this.setActiveTrack(this.playlist.tracks.find((x) => x.id === uuid).id); + } + return this.playlist.tracks.findIndex((x) => x.id === uuid); } @@ -45,7 +82,23 @@ export class PlaybackService { this.playlist.tracks = []; } + hasActiveTrack() { + return this.playlist.activeTrack !== null; + } + + getPlaylist(): Playlist { + return this.playlist; + } + private getTrackById(id: string) { return this.playlist.tracks.find((x) => x.id === id); } + + private getTrackIds() { + return Object.keys(this.playlist.tracks); + } + + private getActiveIndex() { + return this.getTrackIds().indexOf(this.playlist.activeTrack); + } } diff --git a/src/utils/constants.ts b/src/utils/constants.ts index e3ec416..95a9b69 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -8,4 +8,15 @@ export const Constants = { ReportIssue: 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', }, + Design: { + InvisibleSpace: '\u1CBC', + Icons: { + JellyfinLogo: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/jellyfin-icon-squared.png?raw=true', + SuccessIcon: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/circle-check.png?raw=true', + ErrorIcon: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/blob/nestjs-migration/images/icons/alert-circle.png?raw=true', + }, + }, }; diff --git a/src/utils/timeUtils.ts b/src/utils/timeUtils.ts new file mode 100644 index 0000000..8118e6f --- /dev/null +++ b/src/utils/timeUtils.ts @@ -0,0 +1,11 @@ +import { formatDuration, intervalToDuration } from 'date-fns'; + +export const formatMillisecondsAsHumanReadable = (milliseconds: number) => { + const duration = formatDuration( + intervalToDuration({ + start: milliseconds, + end: 0, + }), + ); + return duration; +}; From 60df58959ac9d18ae6a006483e5d799c24984f52 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 20:19:25 +0100 Subject: [PATCH 17/40] =?UTF-8?q?=E2=9C=A8=20Add=20on=20track=20change=20e?= =?UTF-8?q?vent=20and=20automatic=20track=20waterfall?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/discord/discord.module.ts | 3 +- src/clients/discord/discord.voice.service.ts | 27 ++++++++++++++-- src/commands/play.comands.ts | 33 ++++++++++---------- src/playback/playback.service.ts | 17 ++++++++++ src/types/track.ts | 1 + src/utils/stringUtils.ts | 9 ++++++ 6 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 src/utils/stringUtils.ts diff --git a/src/clients/discord/discord.module.ts b/src/clients/discord/discord.module.ts index e59427c..ba703a3 100644 --- a/src/clients/discord/discord.module.ts +++ b/src/clients/discord/discord.module.ts @@ -1,11 +1,12 @@ import { Module } from '@nestjs/common'; import { OnModuleDestroy } from '@nestjs/common/interfaces/hooks'; +import { PlaybackModule } from '../../playback/playback.module'; import { DiscordConfigService } from './discord.config.service'; import { DiscordMessageService } from './discord.message.service'; import { DiscordVoiceService } from './discord.voice.service'; @Module({ - imports: [], + imports: [PlaybackModule], controllers: [], providers: [DiscordConfigService, DiscordVoiceService, DiscordMessageService], exports: [DiscordConfigService, DiscordVoiceService, DiscordMessageService], diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index 9489091..ed204e1 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -1,9 +1,9 @@ import { AudioPlayer, - AudioPlayerPausedState, AudioPlayerStatus, AudioResource, createAudioPlayer, + createAudioResource, getVoiceConnection, getVoiceConnections, joinVoiceChannel, @@ -11,8 +11,11 @@ import { } from '@discordjs/voice'; import { Injectable } from '@nestjs/common'; import { Logger } from '@nestjs/common/services'; +import { OnEvent } from '@nestjs/event-emitter'; import { GuildMember } from 'discord.js'; import { GenericTryHandler } from '../../models/generic-try-handler'; +import { PlaybackService } from '../../playback/playback.service'; +import { Track } from '../../types/track'; import { DiscordMessageService } from './discord.message.service'; @Injectable() @@ -21,7 +24,16 @@ export class DiscordVoiceService { private audioPlayer: AudioPlayer; private voiceConnection: VoiceConnection; - constructor(private readonly discordMessageService: DiscordMessageService) {} + constructor( + private readonly discordMessageService: DiscordMessageService, + private readonly playbackService: PlaybackService, + ) {} + + @OnEvent('playback.newTrack') + handleOnNewTrack(newTrack: Track) { + const resource = createAudioResource(newTrack.streamUrl); + this.playResource(resource); + } tryJoinChannelAndEstablishVoiceConnection( member: GuildMember, @@ -156,6 +168,17 @@ export class DiscordVoiceService { this.audioPlayer.on('error', (message) => { this.logger.error(message); }); + this.audioPlayer.on('stateChange', (statusChange) => { + if (statusChange.status !== AudioPlayerStatus.AutoPaused) { + return; + } + + if (!this.playbackService.hasNextTrack()) { + return; + } + + this.playbackService.nextTrack(); + }); this.voiceConnection.subscribe(this.audioPlayer); return this.audioPlayer; } diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index 0bb6fb2..0f3f52c 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -29,6 +29,7 @@ import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; import { JellyfinStreamBuilderService } from '../clients/jellyfin/jellyfin.stream.builder.service'; import { PlaybackService } from '../playback/playback.service'; import { Constants } from '../utils/constants'; +import { trimStringToFixedLength } from '../utils/stringUtils'; @Command({ name: 'play', @@ -69,9 +70,9 @@ export class PlayItemCommand const lines: string[] = firstItems.map( (item) => - `:white_small_square: ${this.markSearchTermOverlap( - item.Name, - dto.search, + `:white_small_square: ${trimStringToFixedLength( + this.markSearchTermOverlap(item.Name, dto.search), + 30, )} *(${item.Type})*`, ); @@ -104,7 +105,8 @@ export class PlayItemCommand return { embeds: [ this.discordMessageService.buildMessage({ - title: '', + title: 'a', + description: description, mixin(embedBuilder) { return embedBuilder.setAuthor({ name: 'Jellyfin Search Results', @@ -158,12 +160,6 @@ export class PlayItemCommand const artists = item.Artists.join(', '); - const addedIndex = this.playbackService.eneuqueTrack({ - jellyfinId: item.Id, - name: item.Name, - durationInMilliseconds: milliseconds, - }); - const guildMember = interaction.member as GuildMember; const bitrate = guildMember.voice.channel.bitrate; @@ -171,12 +167,17 @@ export class PlayItemCommand guildMember, ); - this.jellyfinStreamBuilder - .buildStreamUrl(item.Id, bitrate) - .then((stream) => { - const resource = createAudioResource(stream); - this.discordVoiceService.playResource(resource); - }); + const stream = await this.jellyfinStreamBuilder.buildStreamUrl( + item.Id, + bitrate, + ); + + const addedIndex = this.playbackService.eneuqueTrack({ + jellyfinId: item.Id, + name: item.Name, + durationInMilliseconds: milliseconds, + streamUrl: stream, + }); await interaction.update({ embeds: [ diff --git a/src/playback/playback.service.ts b/src/playback/playback.service.ts index 7a3819f..27cc2cb 100644 --- a/src/playback/playback.service.ts +++ b/src/playback/playback.service.ts @@ -3,6 +3,7 @@ import { Playlist } from '../types/playlist'; import { Track } from '../types/track'; import { v4 as uuidv4 } from 'uuid'; +import { EventEmitter2 } from '@nestjs/event-emitter'; @Injectable() export class PlaybackService { @@ -11,6 +12,8 @@ export class PlaybackService { activeTrack: null, }; + constructor(private readonly eventEmitter: EventEmitter2) {} + getActiveTrack() { return this.getTrackById(this.playlist.activeTrack); } @@ -38,6 +41,7 @@ export class PlaybackService { const newKey = keys[index + 1]; this.setActiveTrack(newKey); + this.controlAudioPlayer(); return true; } @@ -51,6 +55,7 @@ export class PlaybackService { const keys = this.getTrackIds(); const newKey = keys[index - 1]; this.setActiveTrack(newKey); + this.controlAudioPlayer(); return true; } @@ -66,6 +71,7 @@ export class PlaybackService { if (emptyBefore) { this.setActiveTrack(this.playlist.tracks.find((x) => x.id === uuid).id); + this.controlAudioPlayer(); } return this.playlist.tracks.findIndex((x) => x.id === uuid); @@ -82,6 +88,10 @@ export class PlaybackService { this.playlist.tracks = []; } + hasNextTrack() { + return this.getActiveIndex() + 1 < this.getTrackIds().length; + } + hasActiveTrack() { return this.playlist.activeTrack !== null; } @@ -101,4 +111,11 @@ export class PlaybackService { private getActiveIndex() { return this.getTrackIds().indexOf(this.playlist.activeTrack); } + + private controlAudioPlayer() { + const activeTrack = this.getActiveTrack(); + console.log('received track change'); + console.log(activeTrack.track); + this.eventEmitter.emit('playback.newTrack', activeTrack.track); + } } diff --git a/src/types/track.ts b/src/types/track.ts index 2954289..bc60421 100644 --- a/src/types/track.ts +++ b/src/types/track.ts @@ -2,4 +2,5 @@ export interface Track { jellyfinId: string; name: string; durationInMilliseconds: number; + streamUrl: string; } diff --git a/src/utils/stringUtils.ts b/src/utils/stringUtils.ts new file mode 100644 index 0000000..9c34684 --- /dev/null +++ b/src/utils/stringUtils.ts @@ -0,0 +1,9 @@ +export const trimStringToFixedLength = (value: string, maxLength: number) => { + if (maxLength < 1) { + throw new Error('max length must be positive'); + } + + return value.length > maxLength + ? value.substring(0, maxLength - 3) + '...' + : value; +}; From 2571c7118496d9ad579561914780fe8c57462b47 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 20:27:05 +0100 Subject: [PATCH 18/40] =?UTF-8?q?=F0=9F=90=9B=20Crash=20with=20nextTrack?= =?UTF-8?q?=20and=20previousTrack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/playback/playback.service.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/playback/playback.service.ts b/src/playback/playback.service.ts index 27cc2cb..62e0f29 100644 --- a/src/playback/playback.service.ts +++ b/src/playback/playback.service.ts @@ -19,6 +19,7 @@ export class PlaybackService { } setActiveTrack(trackId: string) { + console.log(`getting track by id ${trackId}`); const track = this.getTrackById(trackId); if (!track) { @@ -30,12 +31,15 @@ export class PlaybackService { nextTrack() { const keys = this.getTrackIds(); + console.log('keys:'); + console.log(keys); + const index = this.getActiveIndex(); console.log(keys); console.log(index); - if (!this.hasActiveTrack() || index >= keys.length) { + if (!this.hasActiveTrack() || index + 1 >= keys.length) { return false; } @@ -105,7 +109,7 @@ export class PlaybackService { } private getTrackIds() { - return Object.keys(this.playlist.tracks); + return this.playlist.tracks.map((item) => item.id); } private getActiveIndex() { @@ -114,8 +118,6 @@ export class PlaybackService { private controlAudioPlayer() { const activeTrack = this.getActiveTrack(); - console.log('received track change'); - console.log(activeTrack.track); this.eventEmitter.emit('playback.newTrack', activeTrack.track); } } From ef01e8089014f5b2c79b24ccfea89b936950fb85 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 20:51:03 +0100 Subject: [PATCH 19/40] =?UTF-8?q?=F0=9F=8E=A8=20Use=20new=20embed=20builde?= =?UTF-8?q?r=20method=20instead=20for=20status=20and=20help?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/discord/discord.voice.service.ts | 8 ++ src/commands/help.command.ts | 59 ++++++------ src/commands/status.command.ts | 94 ++++++++++++-------- src/playback/playback.service.ts | 20 +++-- 4 files changed, 109 insertions(+), 72 deletions(-) diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index ed204e1..f5ad7e7 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -107,6 +107,14 @@ export class DiscordVoiceService { ); } + /** + * Gets the current audio player status + * @returns The current audio player status + */ + getPlayerStatus(): AudioPlayerStatus { + return this.createAndReturnOrGetAudioPlayer().state.status; + } + /** * Checks if the current state is paused or not and toggles the states to the opposite. * @returns The new paused state - true: paused, false: unpaused diff --git a/src/commands/help.command.ts b/src/commands/help.command.ts index 4ed6db8..baa548c 100644 --- a/src/commands/help.command.ts +++ b/src/commands/help.command.ts @@ -1,9 +1,8 @@ import { TransformPipe } from '@discord-nestjs/common'; import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; -import { EmbedBuilder } from '@discordjs/builders'; import { CommandInteraction } from 'discord.js'; -import { DefaultJellyfinColor } from 'src/types/colors'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; import { GenericCustomReply } from '../models/generic-try-handler'; @Command({ @@ -12,35 +11,39 @@ import { GenericCustomReply } from '../models/generic-try-handler'; }) @UsePipes(TransformPipe) export class HelpCommand implements DiscordCommand { + constructor(private readonly discordMessageService: DiscordMessageService) {} + handler(commandInteraction: CommandInteraction): GenericCustomReply { return { embeds: [ - new EmbedBuilder() - .setAuthor({ - name: 'Jellyfin Discord Bot', - iconURL: - 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', - url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - }) - .setColor(DefaultJellyfinColor) - .setTitle('Help Information') - .setDescription( - 'Jellyfin Discord Music bot is an easy way to broadcast your music collection to a Discord voicechannel.', - ) - .addFields([ - { - name: 'Report an issue', - value: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', - inline: true, - }, - { - name: 'Source code', - value: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - inline: true, - }, - ]) - .toJSON(), + this.discordMessageService.buildMessage({ + title: 'a', + description: + 'Jellyfin Discord Bot is an open source and self-hosted Discord bot, that integrates with your Jellyfin Media server and enables you to playback music from your libraries. You can use the Discord Slash Commands to invoke bot commands.', + mixin(embedBuilder) { + return embedBuilder + .setAuthor({ + name: 'Jellyfin Discord Bot', + iconURL: + 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', + url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + }) + .addFields([ + { + name: 'Report an issue', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', + inline: true, + }, + { + name: 'Source code', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + inline: true, + }, + ]); + }, + }), ], }; } diff --git a/src/commands/status.command.ts b/src/commands/status.command.ts index b4aadb7..de72ff6 100644 --- a/src/commands/status.command.ts +++ b/src/commands/status.command.ts @@ -2,33 +2,40 @@ import { TransformPipe } from '@discord-nestjs/common'; import { Command, - DiscordTransformedCommand, + DiscordCommand, InjectDiscordClient, - TransformedCommandExecutionContext, UsePipes, } from '@discord-nestjs/core'; -import { EmbedBuilder } from '@discordjs/builders'; -import { Client, InteractionReplyOptions, Status } from 'discord.js'; -import { DefaultJellyfinColor } from 'src/types/colors'; +import { + Client, + CommandInteraction, + InteractionReplyOptions, + Status, +} from 'discord.js'; import { formatDuration, intervalToDuration } from 'date-fns'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { JellyfinService } from '../clients/jellyfin/jellyfin.service'; import { Constants } from '../utils/constants'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; + @Command({ name: 'status', description: 'Display the current status for troubleshooting', }) @UsePipes(TransformPipe) -export class StatusCommand implements DiscordTransformedCommand { +export class StatusCommand implements DiscordCommand { constructor( @InjectDiscordClient() private readonly client: Client, + private readonly discordMessageService: DiscordMessageService, + private readonly jellyfinService: JellyfinService, ) {} - handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions { + async handler( + commandInteraction: CommandInteraction, + ): Promise { const ping = this.client.ws.ping; const status = Status[this.client.ws.status]; @@ -38,34 +45,49 @@ export class StatusCommand implements DiscordTransformedCommand { }); const formattedDuration = formatDuration(interval); + const jellyfinSystemApi = getSystemApi(this.jellyfinService.getApi()); + const jellyfinSystemInformation = await jellyfinSystemApi.getSystemInfo(); + return { embeds: [ - new EmbedBuilder() - .setTitle('Online and ready') - .setColor(DefaultJellyfinColor) - .addFields([ - { - name: 'Version', - value: Constants.Metadata.Version, - inline: false, - }, - { - name: 'Ping', - value: `${ping}ms`, - inline: true, - }, - { - name: 'Status', - value: `${status}`, - inline: true, - }, - { - name: 'Uptime', - value: `${formattedDuration}`, - inline: true, - }, - ]) - .toJSON(), + this.discordMessageService.buildMessage({ + title: 'Discord Bot Status', + mixin(embedBuilder) { + return embedBuilder.addFields([ + { + name: 'Bot Version', + value: Constants.Metadata.Version, + inline: true, + }, + { + name: 'Discord Bot Ping', + value: `${ping}ms`, + inline: true, + }, + { + name: 'Discord Bot Status', + value: `${status}`, + inline: true, + }, + { + name: 'Discord Bot Uptime', + value: `${formattedDuration}`, + inline: false, + }, + { + name: 'Jellyfin Server Version', + value: jellyfinSystemInformation.data.Version ?? 'unknown', + inline: true, + }, + { + name: 'Jellyfin Server Operating System', + value: + jellyfinSystemInformation.data.OperatingSystem ?? 'unknown', + inline: true, + }, + ]); + }, + }), ], }; } diff --git a/src/playback/playback.service.ts b/src/playback/playback.service.ts index 62e0f29..fa3629f 100644 --- a/src/playback/playback.service.ts +++ b/src/playback/playback.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { Playlist } from '../types/playlist'; import { Track } from '../types/track'; @@ -7,6 +7,8 @@ import { EventEmitter2 } from '@nestjs/event-emitter'; @Injectable() export class PlaybackService { + private readonly logger = new Logger(PlaybackService.name); + private readonly playlist: Playlist = { tracks: [], activeTrack: null, @@ -19,7 +21,6 @@ export class PlaybackService { } setActiveTrack(trackId: string) { - console.log(`getting track by id ${trackId}`); const track = this.getTrackById(trackId); if (!track) { @@ -31,15 +32,12 @@ export class PlaybackService { nextTrack() { const keys = this.getTrackIds(); - console.log('keys:'); - console.log(keys); - const index = this.getActiveIndex(); - console.log(keys); - console.log(index); - if (!this.hasActiveTrack() || index + 1 >= keys.length) { + this.logger.debug( + `Unable to go to next track, because playback has reached end of the playlist`, + ); return false; } @@ -53,6 +51,9 @@ export class PlaybackService { const index = this.getActiveIndex(); if (!this.hasActiveTrack() || index < 1) { + this.logger.debug( + `Unable to go to previous track, because there is no previous track in the playlist`, + ); return false; } @@ -118,6 +119,9 @@ export class PlaybackService { private controlAudioPlayer() { const activeTrack = this.getActiveTrack(); + this.logger.debug( + `A new track (${activeTrack.id}) was requested and will be emmitted as an event`, + ); this.eventEmitter.emit('playback.newTrack', activeTrack.track); } } From f9a376495b2f9753b1a9d7b4ee1e656b48ffa7c1 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 21:39:52 +0100 Subject: [PATCH 20/40] =?UTF-8?q?=F0=9F=90=9B=20Duplicated=20singleton=20s?= =?UTF-8?q?ervices=20and=20playlist=20ending?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/discord/discord.voice.service.ts | 51 +++++++++++++------- src/commands/command.module.ts | 8 ++- src/commands/current.command.ts | 2 +- src/main.ts | 1 + 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index f5ad7e7..4464091 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -170,27 +170,44 @@ export class DiscordVoiceService { `Initialized new instance of Audio Player because it has not been defined yet`, ); this.audioPlayer = createAudioPlayer(); - this.audioPlayer.on('debug', (message) => { - this.logger.debug(message); - }); - this.audioPlayer.on('error', (message) => { - this.logger.error(message); - }); - this.audioPlayer.on('stateChange', (statusChange) => { - if (statusChange.status !== AudioPlayerStatus.AutoPaused) { - return; - } - - if (!this.playbackService.hasNextTrack()) { - return; - } - - this.playbackService.nextTrack(); - }); + this.attachEventListenersToAudioPlayer(); this.voiceConnection.subscribe(this.audioPlayer); return this.audioPlayer; } return this.audioPlayer; } + + private attachEventListenersToAudioPlayer() { + this.audioPlayer.on('debug', (message) => { + this.logger.debug(message); + }); + this.audioPlayer.on('error', (message) => { + this.logger.error(message); + }); + this.audioPlayer.on('stateChange', (previousState) => { + if (previousState.status !== AudioPlayerStatus.Playing) { + return; + } + + if (this.audioPlayer.state.status !== AudioPlayerStatus.Idle) { + return; + } + + const hasNextTrack = this.playbackService.hasNextTrack(); + + this.logger.debug( + `Deteced audio player status change from ${previousState.status} to ${ + this.audioPlayer.state.status + }. Has next track: ${hasNextTrack ? 'yes' : 'no'}`, + ); + + if (!hasNextTrack) { + this.logger.debug(`Audio Player has reached the end of the playlist`); + return; + } + + this.playbackService.nextTrack(); + }); + } } diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index 1dc13bd..3963aca 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -1,17 +1,16 @@ import { DiscordModule } from '@discord-nestjs/core'; import { Module } from '@nestjs/common'; -import { DiscordMessageService } from '../clients/discord/discord.message.service'; import { DiscordClientModule } from '../clients/discord/discord.module'; import { JellyfinClientModule } from '../clients/jellyfin/jellyfin.module'; -import { PlaybackService } from '../playback/playback.service'; +import { PlaybackModule } from '../playback/playback.module'; import { CurrentTrackCommand } from './current.command'; import { DisconnectCommand } from './disconnect.command'; import { EnqueueCommand } from './enqueue.command'; import { HelpCommand } from './help.command'; import { PausePlaybackCommand } from './pause.command'; -import { PreviousTrackCommand } from './previous.command'; import { PlayItemCommand } from './play.comands'; +import { PreviousTrackCommand } from './previous.command'; import { SkipTrackCommand } from './skip.command'; import { StatusCommand } from './status.command'; import { StopPlaybackCommand } from './stop.command'; @@ -22,6 +21,7 @@ import { SummonCommand } from './summon.command'; DiscordModule.forFeature(), JellyfinClientModule, DiscordClientModule, + PlaybackModule, ], controllers: [], providers: [ @@ -36,8 +36,6 @@ import { SummonCommand } from './summon.command'; SummonCommand, PlayItemCommand, PreviousTrackCommand, - DiscordMessageService, - PlaybackService, ], exports: [], }) diff --git a/src/commands/current.command.ts b/src/commands/current.command.ts index 42e67c8..be4db65 100644 --- a/src/commands/current.command.ts +++ b/src/commands/current.command.ts @@ -44,7 +44,7 @@ export class CurrentTrackCommand implements DiscordCommand { 3, )}${formatMillisecondsAsHumanReadable( track.track.durationInMilliseconds, - )} ${isCurrent && ' *(active track)*'}`; + )} ${isCurrent ? ' *(active track)*' : ''}`; }) .join(',\n'); diff --git a/src/main.ts b/src/main.ts index 13cad38..4c1b409 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,7 @@ import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); + app.enableShutdownHooks(); await app.listen(3000); } bootstrap(); From a31928ab15d54e39e7f4a5d14bc26c6fba0cfa9c Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 22:18:31 +0100 Subject: [PATCH 21/40] =?UTF-8?q?=F0=9F=90=9B=20Unused=20try=20dto=20from?= =?UTF-8?q?=20try=20join=20in=20play=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/play.comands.ts | 21 ++++++++++++++++----- src/commands/status.command.ts | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index 0f3f52c..2fa8ba9 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -23,7 +23,6 @@ import { DefaultJellyfinColor } from '../types/colors'; import { DiscordMessageService } from '../clients/discord/discord.message.service'; -import { createAudioResource } from '@discordjs/voice'; import { formatDuration, intervalToDuration } from 'date-fns'; import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; import { JellyfinStreamBuilderService } from '../clients/jellyfin/jellyfin.stream.builder.service'; @@ -161,11 +160,23 @@ export class PlayItemCommand const artists = item.Artists.join(', '); const guildMember = interaction.member as GuildMember; - const bitrate = guildMember.voice.channel.bitrate; - this.discordVoiceService.tryJoinChannelAndEstablishVoiceConnection( - guildMember, - ); + const tryResult = + this.discordVoiceService.tryJoinChannelAndEstablishVoiceConnection( + guildMember, + ); + + if (!tryResult.success) { + const replyOptions = tryResult.reply as InteractionReplyOptions; + await interaction.update({ + embeds: replyOptions.embeds, + content: undefined, + components: [], + }); + return; + } + + const bitrate = guildMember.voice.channel.bitrate; const stream = await this.jellyfinStreamBuilder.buildStreamUrl( item.Id, diff --git a/src/commands/status.command.ts b/src/commands/status.command.ts index de72ff6..9e13232 100644 --- a/src/commands/status.command.ts +++ b/src/commands/status.command.ts @@ -4,13 +4,13 @@ import { Command, DiscordCommand, InjectDiscordClient, - UsePipes, + UsePipes } from '@discord-nestjs/core'; import { Client, CommandInteraction, InteractionReplyOptions, - Status, + Status } from 'discord.js'; import { formatDuration, intervalToDuration } from 'date-fns'; From 86ffb19c9a7a99ad81f173cf73aee2828df9234c Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 22:22:44 +0100 Subject: [PATCH 22/40] =?UTF-8?q?=F0=9F=90=9B=20Inverted=20pause=20states?= =?UTF-8?q?=20for=20pause=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/discord/discord.voice.service.ts | 4 ++-- src/commands/play.comands.ts | 18 ++++-------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index 4464091..b1d375f 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -122,11 +122,11 @@ export class DiscordVoiceService { togglePaused(): boolean { if (this.isPaused()) { this.unpause(); - return true; + return false; } this.pause(); - return false; + return true; } disconnect(): GenericTryHandler { diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index 2fa8ba9..a48e098 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -11,7 +11,6 @@ import { import { Logger } from '@nestjs/common/services'; import { ComponentType, - EmbedBuilder, Events, GuildMember, Interaction, @@ -19,7 +18,6 @@ import { } from 'discord.js'; import { JellyfinSearchService } from '../clients/jellyfin/jellyfin.search.service'; import { TrackRequestDto } from '../models/track-request.dto'; -import { DefaultJellyfinColor } from '../types/colors'; import { DiscordMessageService } from '../clients/discord/discord.message.service'; @@ -192,18 +190,10 @@ export class PlayItemCommand await interaction.update({ embeds: [ - new EmbedBuilder() - .setAuthor({ - name: 'Jellyfin Search', - iconURL: - 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', - }) - .setTitle(item.Name) - .setDescription( - `**Duration**: ${duration}\n**Artists**: ${artists}\n\nTrack was added to the queue at position ${addedIndex}`, - ) - .setColor(DefaultJellyfinColor) - .toJSON(), + this.discordMessageService.buildMessage({ + title: 'Jellyfin Search', + description: `**Duration**: ${duration}\n**Artists**: ${artists}\n\nTrack was added to the queue at position ${addedIndex}`, + }), ], components: [], }); From 7d8dc888c39af9cca9c6d9193b8f438e423adaae Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 22:35:11 +0100 Subject: [PATCH 23/40] =?UTF-8?q?=F0=9F=90=9B=20Fix=20invalid=20try=20stat?= =?UTF-8?q?e=20when=20client=20already=20owns=20a=20voice=20connection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/discord/discord.voice.service.ts | 5 ++- src/commands/command.module.ts | 2 - src/commands/enqueue.command.ts | 44 ------------------- src/commands/play.comands.ts | 45 ++++++++++++-------- 4 files changed, 31 insertions(+), 65 deletions(-) delete mode 100644 src/commands/enqueue.command.ts diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index b1d375f..32bbedb 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -40,12 +40,15 @@ export class DiscordVoiceService { ): GenericTryHandler { if (this.voiceConnection !== undefined) { return { - success: false, + success: true, reply: {}, }; } if (member.voice.channel === null) { + this.logger.log( + `Unable to join a voice channel because the member ${member.user.username} is not in a voice channel`, + ); return { success: false, reply: { diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index 3963aca..bd414d2 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -6,7 +6,6 @@ import { JellyfinClientModule } from '../clients/jellyfin/jellyfin.module'; import { PlaybackModule } from '../playback/playback.module'; import { CurrentTrackCommand } from './current.command'; import { DisconnectCommand } from './disconnect.command'; -import { EnqueueCommand } from './enqueue.command'; import { HelpCommand } from './help.command'; import { PausePlaybackCommand } from './pause.command'; import { PlayItemCommand } from './play.comands'; @@ -29,7 +28,6 @@ import { SummonCommand } from './summon.command'; StatusCommand, CurrentTrackCommand, DisconnectCommand, - EnqueueCommand, PausePlaybackCommand, SkipTrackCommand, StopPlaybackCommand, diff --git a/src/commands/enqueue.command.ts b/src/commands/enqueue.command.ts deleted file mode 100644 index 0498257..0000000 --- a/src/commands/enqueue.command.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { TransformPipe } from '@discord-nestjs/common'; - -import { - Command, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; -import { DiscordMessageService } from '../clients/discord/discord.message.service'; -import { TrackRequestDto } from '../models/track-request.dto'; -import { PlaybackService } from '../playback/playback.service'; - -@Command({ - name: 'enqueue', - description: 'Enqueue a track to the current playlist', -}) -@UsePipes(TransformPipe) -export class EnqueueCommand - implements DiscordTransformedCommand -{ - constructor( - private readonly discordMessageService: DiscordMessageService, - private readonly playbackService: PlaybackService, - ) {} - - handler( - dto: TrackRequestDto, - executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions | string { - // const index = this.playbackService.eneuqueTrack({}); - const index = 0; - return { - embeds: [ - this.discordMessageService.buildMessage({ - title: `Track Added to queue`, - description: `Your track \`\`${ - dto.search - }\`\` was added to the queue at position \`\`${index + 1}\`\``, - }), - ], - }; - } -} diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index a48e098..5a4cbc6 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -73,13 +73,19 @@ export class PlayItemCommand )} *(${item.Type})*`, ); - const description = `I have found **${ - items.length - }** results for your search \`\`${ - dto.search - }\`\`.\nFor better readability, I have limited the search results to 10\n\n ${lines.join( - '\n', - )}`; + let description = + 'I have found **' + + items.length + + '** results for your search ``' + + dto.search + + '``.'; + + if (items.length > 10) { + description += + '\nSince the results exceed 10 items, I truncated them for better readability.'; + } + + description += '\n\n' + lines.join('\n'); const emojiForType = (type: string) => { switch (type) { @@ -146,17 +152,6 @@ export class PlayItemCommand interaction.values[0], ); - const milliseconds = item.RunTimeTicks / 10000; - - const duration = formatDuration( - intervalToDuration({ - start: milliseconds, - end: 0, - }), - ); - - const artists = item.Artists.join(', '); - const guildMember = interaction.member as GuildMember; const tryResult = @@ -165,6 +160,9 @@ export class PlayItemCommand ); if (!tryResult.success) { + this.logger.warn( + `Unable to process select result because the member was not in a voice channcel`, + ); const replyOptions = tryResult.reply as InteractionReplyOptions; await interaction.update({ embeds: replyOptions.embeds, @@ -181,6 +179,15 @@ export class PlayItemCommand bitrate, ); + const milliseconds = item.RunTimeTicks / 10000; + + const duration = formatDuration( + intervalToDuration({ + start: milliseconds, + end: 0, + }), + ); + const addedIndex = this.playbackService.eneuqueTrack({ jellyfinId: item.Id, name: item.Name, @@ -188,6 +195,8 @@ export class PlayItemCommand streamUrl: stream, }); + const artists = item.Artists.join(', '); + await interaction.update({ embeds: [ this.discordMessageService.buildMessage({ From 4be0ca1537f9db5fc730f258c88ef864e19e621e Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 22:39:33 +0100 Subject: [PATCH 24/40] =?UTF-8?q?=E2=9C=A8=20Implement=20stop=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/discord/discord.voice.service.ts | 7 ++++ src/commands/stop.command.ts | 38 +++++++++++++------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/clients/discord/discord.voice.service.ts b/src/clients/discord/discord.voice.service.ts index 32bbedb..ff7fa15 100644 --- a/src/clients/discord/discord.voice.service.ts +++ b/src/clients/discord/discord.voice.service.ts @@ -92,6 +92,13 @@ export class DiscordVoiceService { this.createAndReturnOrGetAudioPlayer().pause(); } + /** + * Stops the audio player + */ + stop(force: boolean): boolean { + return this.createAndReturnOrGetAudioPlayer().stop(force); + } + /** * Unpauses the current audio player */ diff --git a/src/commands/stop.command.ts b/src/commands/stop.command.ts index c5d9e42..a9b7977 100644 --- a/src/commands/stop.command.ts +++ b/src/commands/stop.command.ts @@ -1,23 +1,35 @@ import { TransformPipe } from '@discord-nestjs/common'; -import { - Command, - DiscordTransformedCommand, - TransformedCommandExecutionContext, - UsePipes, -} from '@discord-nestjs/core'; -import { InteractionReplyOptions } from 'discord.js'; +import { Command, DiscordCommand, UsePipes } from '@discord-nestjs/core'; +import { CommandInteraction } from 'discord.js'; +import { DiscordMessageService } from '../clients/discord/discord.message.service'; +import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; +import { GenericCustomReply } from '../models/generic-try-handler'; +import { PlaybackService } from '../playback/playback.service'; @Command({ name: 'stop', description: 'Stop playback entirely and clear the current playlist', }) @UsePipes(TransformPipe) -export class StopPlaybackCommand implements DiscordTransformedCommand { - handler( - dto: unknown, - executionContext: TransformedCommandExecutionContext, - ): InteractionReplyOptions | string { - return 'nice'; +export class StopPlaybackCommand implements DiscordCommand { + constructor( + private readonly playbackService: PlaybackService, + private readonly discordMessageService: DiscordMessageService, + private readonly discordVoiceService: DiscordVoiceService, + ) {} + handler(CommandInteraction: CommandInteraction): GenericCustomReply { + this.playbackService.clear(); + this.discordVoiceService.stop(false); + + return { + embeds: [ + this.discordMessageService.buildMessage({ + title: 'Playlist cleared', + description: + 'Playback was stopped and your playlist has been cleared', + }), + ], + }; } } From d8ce16d7d8d2b74ba444a92815717b32662bfde1 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 22:41:43 +0100 Subject: [PATCH 25/40] =?UTF-8?q?=F0=9F=94=A7=20Ignore=20development=20fil?= =?UTF-8?q?es=20in=20Docker=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index d353c32..df4469b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,6 @@ -img +docs +test +images node_modules -package-lock.json \ No newline at end of file +package-lock.json +yarn.lock \ No newline at end of file From d024b4f714f54b99451d0ab7e86f3db6699c8cdd Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sat, 17 Dec 2022 22:54:46 +0100 Subject: [PATCH 26/40] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Rename=20current=20c?= =?UTF-8?q?ommand=20to=20playlist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/command.module.ts | 4 +-- ...current.command.ts => playlist.command.ts} | 36 ++++++++++++------- src/playback/playback.service.ts | 4 +++ 3 files changed, 29 insertions(+), 15 deletions(-) rename src/commands/{current.command.ts => playlist.command.ts} (66%) diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index bd414d2..fdee065 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -4,7 +4,7 @@ import { Module } from '@nestjs/common'; import { DiscordClientModule } from '../clients/discord/discord.module'; import { JellyfinClientModule } from '../clients/jellyfin/jellyfin.module'; import { PlaybackModule } from '../playback/playback.module'; -import { CurrentTrackCommand } from './current.command'; +import { PlaylistCommand } from './playlist.command'; import { DisconnectCommand } from './disconnect.command'; import { HelpCommand } from './help.command'; import { PausePlaybackCommand } from './pause.command'; @@ -26,7 +26,7 @@ import { SummonCommand } from './summon.command'; providers: [ HelpCommand, StatusCommand, - CurrentTrackCommand, + PlaylistCommand, DisconnectCommand, PausePlaybackCommand, SkipTrackCommand, diff --git a/src/commands/current.command.ts b/src/commands/playlist.command.ts similarity index 66% rename from src/commands/current.command.ts rename to src/commands/playlist.command.ts index be4db65..4d2aeb6 100644 --- a/src/commands/current.command.ts +++ b/src/commands/playlist.command.ts @@ -6,14 +6,15 @@ import { DiscordMessageService } from '../clients/discord/discord.message.servic import { GenericCustomReply } from '../models/generic-try-handler'; import { PlaybackService } from '../playback/playback.service'; import { Constants } from '../utils/constants'; +import { trimStringToFixedLength } from '../utils/stringUtils'; import { formatMillisecondsAsHumanReadable } from '../utils/timeUtils'; @Command({ - name: 'current', + name: 'playlist', description: 'Print the current track information', }) @UsePipes(TransformPipe) -export class CurrentTrackCommand implements DiscordCommand { +export class PlaylistCommand implements DiscordCommand { constructor( private readonly discordMessageService: DiscordMessageService, private readonly playbackService: PlaybackService, @@ -36,15 +37,24 @@ export class CurrentTrackCommand implements DiscordCommand { const tracklist = playList.tracks .slice(0, 10) - .map((track) => { + .map((track, index) => { const isCurrent = track.id === playList.activeTrack; - return `${this.getListPoint(isCurrent)} ${ - track.track.name - }\n${Constants.Design.InvisibleSpace.repeat( - 3, - )}${formatMillisecondsAsHumanReadable( + + let point = this.getListPoint(isCurrent, index); + point += `**${trimStringToFixedLength(track.track.name, 30)}**`; + + if (isCurrent === true) { + point += ' :loud_sound:'; + } + + point += '\n'; + point += Constants.Design.InvisibleSpace.repeat(2); + point += 'Duration: '; + point += formatMillisecondsAsHumanReadable( track.track.durationInMilliseconds, - )} ${isCurrent ? ' *(active track)*' : ''}`; + ); + + return point; }) .join(',\n'); @@ -52,17 +62,17 @@ export class CurrentTrackCommand implements DiscordCommand { embeds: [ this.discordMessageService.buildMessage({ title: 'Your Playlist', - description: tracklist, + description: `${tracklist}\n\nUse the /skip and /previous command to select a track`, }), ], }; } - private getListPoint(isCurrent: boolean) { + private getListPoint(isCurrent: boolean, index: number) { if (isCurrent) { - return ':black_small_square:'; + return `${index + 1}. `; } - return ':white_small_square:'; + return `${index + 1}. `; } } diff --git a/src/playback/playback.service.ts b/src/playback/playback.service.ts index fa3629f..beb4034 100644 --- a/src/playback/playback.service.ts +++ b/src/playback/playback.service.ts @@ -74,6 +74,10 @@ export class PlaybackService { track: track, }); + this.logger.debug( + `Added the track '${track.jellyfinId}' to the current playlist`, + ); + if (emptyBefore) { this.setActiveTrack(this.playlist.tracks.find((x) => x.id === uuid).id); this.controlAudioPlayer(); From fda415262a69a69ce9b21a75c16744dddac71353 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 12:17:25 +0100 Subject: [PATCH 27/40] =?UTF-8?q?=F0=9F=99=88=20Ignore=20.vscode=20configu?= =?UTF-8?q?ration=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f296397..b2d97e7 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ lerna-debug.log* *.launch .settings/ *.sublime-workspace +.vscode # IDE - VSCode .vscode/* From 94e23f6280c281c81aee2f239d0587eb3968e6dd Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 12:20:19 +0100 Subject: [PATCH 28/40] =?UTF-8?q?=F0=9F=94=A7=20Update=20GitHub=20Issue=20?= =?UTF-8?q?templates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 891c617..cea1872 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,5 +1,5 @@ --- -name: Bug report +name: 🐛 Bug report about: Create a report to help us improve title: '' labels: '' diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bbcbbe7..041e344 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,5 +1,5 @@ --- -name: Feature request +name: ✨ Feature request about: Suggest an idea for this project title: '' labels: '' From a7eb89d0e4f4be8b047bff1fc12fc194eb2e2e48 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 12:30:42 +0100 Subject: [PATCH 29/40] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Rename=20skip=20comm?= =?UTF-8?q?and=20to=20next?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/command.module.ts | 2 +- src/commands/{skip.command.ts => next.command.ts} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/commands/{skip.command.ts => next.command.ts} (93%) diff --git a/src/commands/command.module.ts b/src/commands/command.module.ts index fdee065..bcc2ce9 100644 --- a/src/commands/command.module.ts +++ b/src/commands/command.module.ts @@ -10,7 +10,7 @@ import { HelpCommand } from './help.command'; import { PausePlaybackCommand } from './pause.command'; import { PlayItemCommand } from './play.comands'; import { PreviousTrackCommand } from './previous.command'; -import { SkipTrackCommand } from './skip.command'; +import { SkipTrackCommand } from './next.command'; import { StatusCommand } from './status.command'; import { StopPlaybackCommand } from './stop.command'; import { SummonCommand } from './summon.command'; diff --git a/src/commands/skip.command.ts b/src/commands/next.command.ts similarity index 93% rename from src/commands/skip.command.ts rename to src/commands/next.command.ts index 04f4708..bed2bcd 100644 --- a/src/commands/skip.command.ts +++ b/src/commands/next.command.ts @@ -6,8 +6,8 @@ import { DiscordMessageService } from '../clients/discord/discord.message.servic import { PlaybackService } from '../playback/playback.service'; @Command({ - name: 'skip', - description: 'Skip the current track', + name: 'next', + description: 'Go to the next track in the playlist', }) @UsePipes(TransformPipe) export class SkipTrackCommand implements DiscordCommand { From fb60efde6765dad17d74ae3bf6ee505938e01887 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 12:37:33 +0100 Subject: [PATCH 30/40] =?UTF-8?q?=E2=9C=A8=20Add=20artists=20to=20the=20pl?= =?UTF-8?q?ay=20selection=20and=20dropdown=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/play.comands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index 5a4cbc6..dbc030a 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -70,7 +70,7 @@ export class PlayItemCommand `:white_small_square: ${trimStringToFixedLength( this.markSearchTermOverlap(item.Name, dto.search), 30, - )} *(${item.Type})*`, + )} [${item.Artists.join(', ')}] *(${item.Type})*`, ); let description = @@ -100,7 +100,7 @@ export class PlayItemCommand const selectOptions: { label: string; value: string; emoji?: string }[] = firstItems.map((item) => ({ - label: item.Name, + label: `${item.Name} [${item.Artists.join(', ')}]`, value: item.Id, emoji: emojiForType(item.Type), })); From 3f2b1a7b5f1b6ac1ae6884243129c8576c338788 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 14:10:24 +0100 Subject: [PATCH 31/40] =?UTF-8?q?=F0=9F=93=9D=20Add=20example=20discord=20?= =?UTF-8?q?bot=20icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++--- images/discord-bot-profile-picture.png | Bin 0 -> 171149 bytes images/discord-bot-profile-picture.xcf | Bin 0 -> 558152 bytes 3 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 images/discord-bot-profile-picture.png create mode 100644 images/discord-bot-profile-picture.xcf diff --git a/README.md b/README.md index 95c7cca..339e7fa 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ Nest Logo

-[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 -[circleci-url]: https://circleci.com/gh/nestjs/nest +
+

Jellyfin Discord Bot

A simple Discord bot that enables you to broadcast your Jellyfin Media Server music collection to voice channels.

@@ -12,7 +12,6 @@

-



diff --git a/images/discord-bot-profile-picture.png b/images/discord-bot-profile-picture.png new file mode 100644 index 0000000000000000000000000000000000000000..ed701f84bc77f07e2811dea3129ed300feae04b5 GIT binary patch literal 171149 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%0A$@jwz30s6X1N-59vBEIA2Zzal{E}O) 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

hBS~RYCY+s3 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 W65jw@6T_Vmd+=#9-e*kf$nRmvgc~!?i(_V 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�!kGV*-3g$K-x={zec{YG*%qpxh#V)mR18!wktufRFst;MhMQGv-Kd+E6HN`; zMFd9JXV`C6X+@GJe28?sU_E|*Q3`J&1tkG6O=1c~n12uzCGnMP8JE66LWN;+=)3NJ zWyMECBpGdiq*hSN#%#{Hj{emM?UqoM@DO69BRMW>F&NGaawL2P((}I*8T5&SR_A{; zSmoQ<8r@86%%2u~}}=9J#TY+N)*n#(!O zEea?~dH*h;qN&<8M#Puy`KfWOny8|4$}Kgs}0~W|}?=2zJB`Rn-y!?Q1XtuBAk7y1r&Sh;k}eG2@5u*=SA3Xh z-u01`<-RArg=qiIt=^tW#D6Z!aI*iO+%p~mAdB{+t15e+lcp|TV|98|GQmC7V_FJU zoli6yVlE`Gu z6d}%oj}wjHC*}s9f87Tv&8B%lf_h7RJ9lbvlwj6x-Vy->t&z+K!N%DgZu<4tZD%e| z#A9#2fDJ?#ZwQo~*!+1=VNyrHBfKydu|8++5E?~v-bt_)S-b_zg;vp;C{MJPsm9E{ zaYLr|7SLrP%fP)j`^q=(G3}QWRugdkD&Tv5dveS*B<=+uL;@zh#FRyLXF#(~7{XlU z>#W+!q{WHGA7?Po<^>n=I4O}KzQh0A6fx)JK&}wL5e9Tjw9Yj9SbA?vnqI-vWbku$XwQZzvqodZu0!;@46q?l?UMR8}(2s0c}P z=GSCSz{zPJew1W2L6Kld>XFbong|gp5Tas%L&B-xWa0Yj2 zci_#Uu5u%Zq-I8hGZ;2~6p>93T3SU|a?|MkjSQHRiJxrLH&Ry8>r&a-sUjG0hPgB+ z^=4;(wRCj%Pur#CWCPx{3QH=%Jl-0Pn3e-=8h;r$Q=ANZF(&4YNQ7ZuO9OZ#IyN^0 z&`kcK;IYJ!>YyMPCX;h-&H>J#k?+(^9Yb)b39{0l$jqvo?CMi42(6YhRM(PA@+nqB zZ3@Y5=+8X%ionEQ|?8KnnidbA#vn)$uI%= z6F1DlTWU^LgoNMw=kvFnII~T09^jD@1x>Sy|G|HfwMu)oc^G*KXAiNnmPfW;^W&X- zMrih49zH*ElqpU{``u=KfhqG#W8zbieYE0Cq+>2k*|K1C$bugQJd9+T;z-`1vZ9=< zs|zvMzs#r*ZJXAxND!%oB<~3U3huV={|Fo?8gT0G>jjqz!Q{r|lN_-&wSa+t!W!sl zq*tn_PDqBQ!3%IYP(_eov?rKLpUpdQ`zx0l zkBeFH&KrWBYm*Gz=98Q+GWa>;0!VSP?@eF@3wB0mW@Qv1r$L8rkr>%7ezpc-icxoW z_Gf}-3%bNAcw^>#UFs5nWSJFy8>E2$HVN?)09=HMwW6+QSH080$m5M7iRq6n<-_+>#;%3CV@>?muHZr($x*a$*Tmog~J z#zAUte;!kP=gd6CqjSM)5#}${Li&&(D0!=qhk^Ju^3QOETF_oz=VyW+<5lMtOUDYX z6O4`i(~=~x0=1A=`DgL43JxYJ2`IqLrnENTSIz zrv{(FGiJGv4NIJ`hi|#7_(zyV;Glp=EP>sy1gXfAb#7KF?l76v*|iiSEB2mg)j^o^ zW@%kqV7PwI93Pcb72mxm{PHH_(9c}7#jgD_T?JiSao-fpLy4SH`LrKN@?rd4>X4Li z>ODY>rytW!=Iug5pdu?HX@zB6pp4mg@Pn(8;exuPGGCC%6Ln2{a+o2ZMiW=bon?uZ zw@SVuIK2DcX&lVpTQZzH6xvB&l4`aC1qNh4S)5~0AHm7QaVR;?5?VE6Tc2xx{R*HpK)+0$4{;7-cFQ73~ZZuVRGr-j}m-<9`p7|WP5Q8ms zFW>#Uyjit1imXgKO5+PaDD4FDM0I2iUDb~gA|b$ZT=DvrumqwtTdmv z3TgcHErr`UW09nv*cLeHC`4=$ly)i4wIRv3V6aT_jf`FpqglZJqR}=zegV_@IDwx& zGUIg-mbC0}3`jp5mmC5YNC4nVn0(RzBLKFvEEWlH(C~J}uqKrN^F>*An@sj*)ff38L5-oS<-w3i3j2p9d zPFXs0Xs9LF7~G9_Ym+~PGA;4TM4DwxGO*q@08U8QM+7J@5mSap;Nh$mz^E`zdC`PW zs8g(I?bMLy%Cgr%Ak<8Wv6_iMe1czf-cmUBHIbGYBWq(S>LHfkCY<}Egc+_T5=*43 zR73;jCtQdn){#@D#B4}qJhL(h3etN1_mW>?zOIftuHOi>s_3gI+TuO%YQ+|2x~ijA zVNUY607((%rZZ;E2(WlqXlE6R|Am_IQS~VpO&DCK89cHtSqEmTLNb=>z(KH~0AcbuRERE~xH4!9-VjH$d@-2|q7=`1%ov&Fa5m6J zi`l%xrAt%ZNh(e!%wg>OYFQ}|z9@!FwfesRIm@%B3B)Yk{UK4M3Z9tDrBwO+KN3c) z8HdT22<`qOR*p<$?zptyN!U(w8F$T2m|>A{6&iIm|EFxF;=8Sz7jZt$UQ^rXw}fUn zl=re!KH@Wqnt~!i8+TK`Fa{z*&#y#Rx*_#8TG}DUW+v~>|2fTpMH}T@FkoB}Rhjs6 zrI8bQYcq#z0hYGKU@}yoBJ{{&Y-<3Jx&NI&$m`O^tZA;iCsKdEK%mVS7U?Vsr-m(n zY>0OkLa^S#_dgOy4pg*w_doq_uK2_E_$hZR2`9w((a2eL*Gl+S^b4sEeNAyBz_AeQ zIE`sti>%&iJWpj@A5({G6|$q21Bt{o!vnO z(Po^;G!J}I0ZbK}^YW4L3CJaZMCs$gs=qVIY$kAL&Mp>FL7vQp{P_@(obVQ#F)5j8 z!A-1S62>x%sfxJ5d7++Lr3u$+%{3e|X|VYIH5KtxG0z=3G3kF=j&2G+|A5UxK!Dcq zbtzQm`CC5DI#MtnWk(Lt8&uc(fAKeupK=>pf#spb85ls}RhVvobANiSQt&sAvQei|Os=@BWLbCI_QtF3_M)7gHaD zZ3*M;LCoA!jM?EfhXc!9F z?*j>Dyb5*bjKn4?1~LFuM%=Kl8D}c^)yao>w`S9%&@q7MkbRoG3JzrDyYRv z+U$a@{dk7_rI(&|80>-u6%J8k**n_2{D1mfyN`O?_++dOT^sz=O5IKFW8i-IUlh)5 zHR@qgn=a}IDW#)ZL7;i)@sV%ORB#>%B^qn6EIwRx@6D@j;mCEm$?LRuDy8gakk;6e z2l=s6n%u?+;`LVu#fo`~pN*I(;oOL0TkXU4ZF}+Zu>9V}mtEDXu`IA^_jzEiD{QcC zhHdG%nYMjcpLvTbj|B2*cu)aCadxJDxZ2xLftw!j!@Zl>N@4i@P2CUO#tW$l%e^Y- zF$7cq!%oM1GlH3 zDtZ}pDIObVa8FnHMadnm#yTBs>E~|oaB<)cLZ#;;TwiNrTJ+e|V2;#KOSqLKSn#|a z_HVFYoljE`afpz!ALXr+!?LbxTkRxvBQ{^4zHG=LM?ByE!;K5xT>KGU!V$k!n-=ZS zqx`~=6xq07m<2AC!o4Z0c4&Hjm8}F6K`UmXfnh{3LN;H31a?G2R!aReEg$`&_Sq(9 zm+VhP6&$~SCuv3|ns95Wu@l7*_qqbl?vyTub(rk4)K|0-EgXY()W+9_^?wdLZPtn`_v36Ov{)6wBaqAP5~Dt~sZJ zSDCXzA9sPJy-#V2nyxsh;f9>e;ryE;K0?dacvRw0q8mMQ0_>V5&*PnUfloDxT-i4_zVz!P?jyGvbHkQAMTuH3cupCLl71AFC4H;Bp&cuy4ffz`l?7>}k86 zd=vFdy@fr4k{8L`kfyhT=_j9^U4$%}Wvz;3?F)`&L z%Xt-q)0@KU_Wzt+F?XG`J6kVf;}terkB0W7R$$L$iLvMjD-?sT3G-TtK%PbGlY$Gk zw9zdA0=i+pquf#?WE*QTU0k3)U?=@_xnh|U*w0!7#iT>|qU+=x)W)2RDH(NdOjb^B zCV03W2WC@`d$BqC26@vj;T&5W5Jcz|(4 zdCV=aOKzk8_VQ1CzOEm_G85#`xfXdu;SDt)idsq*042r${GO+TXj7jEv#lqDv9}5BWM6ZxBvJ|< z#RE;}nHtgra+j1X%Iercp{pEbXT*Blh8r9pz4kC^v5Zh@eeubTlIW)+XCFE08iT2S zBo3b#bGqA=E2l*~K}7=Cj2vl$!*n8H%U#=xP%ob+lv|#TNbH$_DC?jwDTpOWwgY+< z+nNYY+Z-{3aZpdpM8EktmIl2-HRMEPjZ&hjkJpxlu~D&ZQH8L9D15p9OkZsnlem5xQ6)j6A2!Q(Po7e^GGKfZG5_Gzg#waJ(G6JBoVuNnF#o1noh(xlH z7Xhb_U3mAGpKK^EOE0E)Y?aNw2$-~o*RehWsFA-Yd-xW+Xm%~NBCT%I^S6YU?Dnj3 zqh9d?V#A32yaE`g9*uwv6O2cfw8TW2Fsb}^Ut5Gn)b2Lt2OXNjG=+9aH~kx=VsCk% zlv=d5m{r>5#9BnpR%T+6iWFEv8iy(X%{0kIV{~WHo@SP#QQeai*}8w$^^{TQW@<%M z#W)-$i(EY{%Y8$sT~{MvZXsyR@~c_1G1emRkeyqvb5Jir;jL)d=~!#yFcC>yUjL=O zu6tbv7#Pj%(pXq-qezc(TR@EMwI;1s-3yrxVpYk{3lbw49T%H zr#8sa%hPAngZSBz9#ZXx4fBIcudnvk#*9 zDOM*zV8QWf{k}WlBHBu@%C;#!y8DucNGFC=5YZIL4UBP)PjP+@DjQi)Hti}}3DhGpc!xMp)R=5(){AsGY#f6zGKmOjG!23~O&9n9 zP3)(vfr7LfcW>&rkReUkrexFa2HXaD31D1^{Id8XGI>3@c+#FQyT0U%T`=}V-{Nhr9L^^T0OAh$a9&Xnj zNiGplaxqpoo>@x98ha8pm=nPgfDBC(nqD)Uf2BCG*%TXFc|E<6G-NczV%$GD;t#W= zlb26GNKR0ZJNytvSv3YIQo`WdX(Rf@DbtGsZh%AysFGUj?Qs zYC;A9Ma>oMnQ@6JB*emrP$G#EO|Y{&+NyE0nLZ2HY!>P&WC0=DS!#f=%8r>0J%)bq z4I78X_7Vy7&h|W`u$0^yKPJO*-A2~1R(uek6Zy9Tr5idq3YFmMxrSeE;c(kT9L*8G zyKBh=*(-vgxN4Y&PKNUhV2Z6Ux!o9T2KFpJCj&u$>==4+PPR05r4`-~ct@8-d_h!r zzIg7ag&$VZ>*k4QSp?HaS;vJu=e!_hrXmyLC6uy&4WJ5n$}*<>94=tviFYkOg?s_r z*IQb~c=A=c)99fY!XD14m>#@CzK3G81fNR>P*Hq-XnbaIKr+qtP_@Nub3ISoNp7*F z#w}k#eB8kyJT$wcpI(2Lvi7_Ul*B9|AVsmq8>BqT!0qMPZ$6EPUN}zpAUIRE0>&By zwE!2XOu!{??s*Dsu`;%EE=rBVqFnQqgQj=%oY>jn%PnNhSZb3|^fe5#WB!zlYwsNa zAk8r);%ba3n*&#G?Sm50s{QN+v=57WaM>+~N4_ZjkBTlv$}3h4Ax}o7$zX~c*@SuR z{R>(&rz|0&D%;$CJ#Zc*HhS~lR049%L_JxY&C zp~sn!9QK$)#7BSN5w83C>fy0(Ka@&kDI;I)6 zM^(GvZU=y|txyByyPGx}o;6#L+qY^>*M zw2@B6p5%Lx?6&%9zk^xL$U~-W&>VR`LfO=&IaSv?mX%KdS7tMe64y6jiOl3 ze$UymF%u86?Qz+^cu49UoQ4&LaKr0x3M^`&AuiO+-eZjK23^H*w6a2+_3>kmE1V?7yeUY@S$8OFs%+2jbv=p)) zG?diKaHxFOLV<89PUO_~&=SXqSjpp?3JDf!#yd88@wTx*jMhE%ScD_4q zF{9ynt}vmVmFxlFcG9J)P!}t${O)vjH>h%mciqF;*YD6Avcx24laHq~9BphYTHEo{ zbg|$x^y)ZHABKgGC)&;y#IyZc!DE;-;me`#mFEiEx9mCb`)cr`c4NaGE~tBPyuAB* zie`4Hv93nfytJo7Y8J11_a~yvPZ!T_hLghSe|6%Xg{;_-hvS+#)p*6n5Wz9sVUGq{ zP(7g?`80G+G+|k%7umyLG^TNip}*;CHqzP&60^0fE1Y)o$#Qk#=O9t{RPAZBe~ipCfgjk}JOuBjQJ?@w@L zx71%4b)IOk954=FpYKoiX$4HI_@a@Geu$x;mUr9J?EW)lXf2PYR|!Vo(YdW`17Ayc z|BTk|PZVe5$#8&^suJ56658*az9oSSyXS1i7DPE>ghsKXUD}h9sc@zOct4=a6Hydz z)Wg>2v1B2(+4Epw3U-=!Oz*<(1QJ1qR!JzH@o`ezV692FzJL^SpF%bc%jEKI0*CdX zo`Q~p5ONT#m&1 zfsxSE(< zq|MRIi({+gSh%u=N+hw3G0cwjEp*b+PL%3UWrBpZc7_0PLLfD2;;o4}$PYEdEn8po zzzZEo0jULV#-O~5M!Hr)*tfvKh^YAJH!XpLHp8=pTpt}e+0!yguq_vGBhy;)w!mvz z`XNT*FtvvHORg4feZ32(St%o0o=1C&;jn4WICmWJ5l)rK!J3U881gAWk5cpF=LYWW z@InBy_I;OZ)L);mg(l_)mywoPoL6{gk(e$oe{2t;B)#YY4=FTuQOW4y`>Gv54Yh`p z&Q(}Ij8e!&Q|=E}sY@7ox2vwSSv|y@?x?P4k&9>d*_ouA5lnp`1bD$OwV8`Pz*~V7 zR6EPSC}^ifp%UvBQ8)1$`f+CgeT~kGI~p$7%i-Vt_B#xMh;zJKLNG&NJ9`Hcw_^Yf z0qi=qQGt=i+b&m$y_9~$OvhfLgOW(6DO%d=2RS=D@p+MUMEDS%^y%hfg z^eioS%$V&GMJ@wwpRw<<1Kf=RTt!_EWM&MSjzuo)Nvql~m)3~$W^4wJ)+&!v>lOsh zCM>c(h(rERSag$u1n#kn2~v!gXhM67Ay8C!d8Z9r(7fhL!ac^Rpm7B#ZgckwpkiQD zZ0$Vympk1ctBf2G{TmJe>xpQ0w(SLFzACNO&_M>6OYHL*P>Ux~2xdS-4mV91uJ5@n zCgZSc<3JJgGK$#M`Z63i*-F~y8MMiHc_|DO1vL4Ed zeVRRHiQ0p(81ahhP{=BM&z@)BQ>oW!n;;kPpD3F}U0%l5IJDT*m(h`+nC^`Jw}R_J zW6OyvjSsa-n@J;IqOIbcusSYjN~6JLqi zevT|Bcnq8RoCS@gW@f|C(-Kd}6NFc)huiB3qaJM#Xxhc|hIk-%k*dMY0JD#o=%8YC zNbk5OieyNz&_?SAg5fb0{R|^$NYa0gSI_tooN8e$Z$8Sct({W*7{doBOVvzz(#%Fz zCK>1m%_y{=Dl8fa1j`(Sk*G=sAr$hUN>v)08;d zj6i9pR(o+A72ls3 zoTgT@W>x33*HV^;-$F@ncYt0d`*tJhTn-t8_6y9Z>F-h93a>uHLFhbMKpF5wQSHEE z>WkS3yS$wUe~19>6_W%4-6oLDOxEQz0zXk@;az7kBvp8)Y-fMEIp(a|>VB*4J6E54 z*=-u3@u_`hOB)1K!1wilk9wx$PjT zEt=S{4TRRu5MW6Olb>*l>JP&W?3+_TnRfNyn*0_%kIatF6{<4~cuHkC44AT01HR}l zHIN`r)k+&BiCFV4Fi&d9ky8-Qfw3pWLE2cIFpvNduoz} z(6NYQ0Ow?}gwJ!>>%!n9A+e_27!p~Nc*>>&2uF3GFxpRAOL#HJY^ZEx>KbR!bWF=C zpOY^J7?u%3iaPlj&!;UI--F2L5FxpsWL;^~jT*rw&ZTW}z__e<275xPWzuo8v_wKC zR538_`8J!=NIj4_G7JyWQKsSANVtIDBGHSG?YLW3om@yFCS4m|K~@@gAQOS9W(FHs zI(?ax67+?r(uL7;NFvnDjl>`qT179Ws;+=kNlcsRz^vL1`^3~Kzab`DljgL;$-Plr zlWWg_pChpP;;y|+!Zx|-PlK{xb`iKE`5o}KU3xVJ9ct1FOv71)a7W^esq4X!}fa&R#QaFc~?eW_(x8#{{UUm2;9xW<%An zP2P~C|4?XgybeOPEF^i`Nwq+M*?Pz;+?qe9T+cI0g2r0EayB*l``syYGBRq;3S*$o zrHzf(wC`&UCasthqt5RL5_4Fw%dPMJJA4NPK?#GDugy1l+eK&BA+b0mUm!O5O{w~# zv)Ag2XPJ>W&FBkS(#08bR)-m(IH#f*lGE3_5;Tn1{Y_Pgb&o(}jLdG-SR zt10D6&s(3IiCrR`XgfgiiJCu>mGgann%_S?EbjmHaQ|?B|3FmY&1Xdw<|sj;Wbfvu z{r&PGQ;hZsJkV(Yle2pU93%^QEub>LUp)K)4Kv*%7g+4NIX&GkEOOf3e|@;0my&>4 zOuI21d0KLn4@Bk~74j|B&9+Hwl~0Wb9|g?sx4n#aN9JuDbbM?Hosvdd#tna_5_T|HuM>K!oKqzHar?2<${ks=wmDNK67?UPm z=d(LqqopS<%Ujz|zyh>V7Bj)!iqhk)8GFQ^mPY11`Dm>2Yq4qBo^+(T44VR?x=7 z!{ftxu=d6KQ8>+HYsigl{5gdlwZYj?_3r);bn$@5&_>~kRwMN0y}I%;wagy>qy}>i z;Vul)Nbpt)8z?OJbo?j#ww5NiuW?4Nk6#~*aMW)g9!;kP!xqZ;($ z2QS2E)5Hs!_!lay{1m!-2`8hDi5hq z{W@m-Ck?lVdRc^#{xlnI#1fa>y`4Pv^8RCVr7i9r_K#oRJ}zNxKJL=L?82LM!sFZZ zuyFW-ckb1<*_&5XxbpsCC~0kUtQ*JF(xvTlGPi#G^7irV<7V`Q5f3y}+CimlA7^iW zL(eMPpN$C!sH<(qT0ee}Mhak5zsU?7l_e{IV=987`CDTb{dOPIt9_|Xum3KQw-k~W zYTCnu{&DvBMdMnI0*`MOQrLvTE<&`$=5POmz?{o=xjh#1qIELAi#hI5pUpc%uB8`N zZ@)Yuk={z>;twB}O1z1FKfZm08O2`Qe?jzzRZ4AYWw2`_KxOe(@_O@nk(j#tZmQY& z+pmvrn}}q(5?4<=q!;aBQn#{2jE<}c(q{~Oc5>DXX>2<1FJabzxI6=f6D<<+buKk= zsX?*!j}z0u)X~}7=n+O;YYH*ZO$?Y)stt!3NMqDqa|L)4Gt&_F_rC%rgd@I*k8?Y! zJ?Wx>(}|noh;w`GTJA+6ORu|HWx$YzJ3DguYt7gjY6feHo`?6_hiBoE{M2c#!)e`A z0yZ8sxZ6x)(s&aJX?P&I+!v@>V2$o$Kk<*$=)GXEBN{f5y1-`(LzY;?C+%2S1)d!s zTzRwCb&>WHdR0*A4E{!La$nEA;Oa;F0#t+(qS-z7Hk{}uO2M@k*1v8H*L4Z<2zIe6 z%vIB)lKoJ?ibmBp$mB0}wDh+Ey@v9AoV5LQLk}|Tujv(iG|eeso77aWC__sCn{C*6 z>?o>0k2ns0>POqvrUpnPg4BmEqDZPi%6RYzNy_I|3HX@qRMw@{YkPHK)yc3=YP!;Q zbA6dGk|D55PVGotb|~NC&;y#T>8eyg;w_uTRMrt+M;bY zwcX$-_?aVD(YH7vDBixaYQGAA8z4*eo$uE=W^~tq4GlNTXW0c&jCwSHdE-j_@jg-- zifp~hGosz5dcSYT-Bj>mRRH5|N!c8#W7hJLAN-3jY7t9G*z+dVu|gnj{&G|hHun!({?#y{V_4@gpS|gLRmJ2U=k8XHIOx;E{HEQs7oy@ zSrlm$$6hW7;0r#f>5dgA@`5flHKsWMl>kJzyt_;vo3PDxM4i=R9Bu+2DC0yo)B>=C zju2L9F7Gd}Oz1L#eQ5vCSeHYXH0)ysPVJuh$>kYF2a}_%gdmj>CT$MQaRrxctm{cf z9VPI+AiCY}*-OyFY3snS^<(Wr?CQrT@K#Js5KoINV;S-)Yk!bVm zNlHQpLO&#k#cxlmp$2GB^IIDDNG>Rj&`8(Wy!rEBG~N(8Oly~sig}I#5F1cS?;$NG zNM~`@&&`jgBoINI?&bK{F_*TpqO>DBUAyS7sF+}5+AQn)Lad%|>NHK_ZWQW@`|M4c zDM6i9Xs*$qa8bZu|1jZU%Ev5}<6*}`v7!BFSnegnEvU8%sCXzkX1Kct?ZT-`4mYRo zv`37-@I$!O;jNBAQyI~R*z1HhEIEe%q+ijqbexV|Dvekp3;jCnX&9?<>{>^V3`hm0 z$y4cSH7|=SXu3jI)JOwQfoeE$D6f;ENOCsuQIP~Fb{M;`wYOtoJtBt;-yCR)bk>9V z=3z`PCqOHM9cz(TiFVeIF;Oxj${ORWWIJIkFV4J(*4MVyMU+m1ts4C8lIujsqO>h+ zd6Cv6z{A{{q3h-iWIv~7%pJ65 z!BKoZptxP#sta7@Do#6$#cUmNt}xu8GVkpOYv2Rq8u=I7tms7U)%+F@(%eZ=jpn~m zWxXhcL`U)o=KOgtv>r|Ip5Q-!_#97$&v#5TB{Q0T>4-sW6yMO1@t*|0f%y{vHEG>P z{OYAXIRRX&TAi(`KF~0X&GHUv8~KicLWDk#-P>uTFi8^Aexd>O=~mG}$td7>dznt_ zFj7?|J{y{_AR4(zB-P2FvsvFaAu?}Z2oENs;3$wMd3?yU|PmplYQB7M#Iy^ z5UnYNpfjjYO(R3i#{>&7$9x6&V`QR+I1vUj*pPiFj~xYc{F2miGf`{6#q9C_x?(Z_ zkTHMz+3d&T+bse-J??C-`v+Rr1Vs?eySMKa+%S9lhe?vR@<0NDgd06nXfr$g+7{#I z>GbZBvQKZDdm>qd?lB;n4`X})jH=rv^6GE3*osR_i_g9P&H%p_T5(Yk{U|`1&33btd2PU>49W|Nb%j(+kJCN zE11j(4mwZJ6HLzEK0#PYruM*_qLklJA8+Ik zo6X;SeT!~(kH6XyeYZUra3@G@?-y_Xq=|P?;9?}AmyZ`Ugu-V7&ld`%T5@Ud*XEjd zWcZ-b{7!qkqul&0rQg2WL~|s^kOl`q{hAm~0|w_PWt$S@0Uyze>P@TI*@=tQ9Om^7 zWxN9q(-3$7EelpvOo?e)LV?^sn=Gk)mhua#T_C$ZQiBXySG<^ zBCY@iN97DP-~EBqYUfjoA5O`kJGRrQ_+G_e)i^5OrtVNQ zG*Qsb&Zqd>ngxC>jhH@QFIc_%L_s*v#^iH962SH;>bAu*oPT)teu1Kv5qwF4(R^k& z*tbceEpmiXB`@(zcm4KvyFWKDriqE$M8*S~Y5nd)6d=Fv^cRaX0LfXsX1FlCXrHTh zUo2`{&EDCwpWa?Rwx=Wl0HluO41O9jy#Mo^s{Rvt%b}E~D6ih9VPO_<@JOS)TfP4dR^y-6HJk;e5SeE0pZ;rI#muR6 zHI=)XVx&&lKyM(R)!zS3)fgA{EPFIA6>D91GCS0II29tndoID{Om$fr+feGAjfaxf zrXRFLt?d0DDu>da)zZ87yNHv13RSHEZ~lNR|HbP)bU(?4?|pdKQ9rRE4Cqx~Sm`De zzFowNE~W;R91|o2a~eYxu2mtW5;nAz|GKI|Hadc~E)7Hr&y~?$bO~*Z3{RB;2&JcT zqGI`YMH9}_M0c z>0wx4YNSoE7K%}z8lJs{u9QU@_?iEDIRsR*S`+f4TV`$&NOgHXzW?0D^YT|U4|d}I z5f|p+{Tec>_ZRBuUuNPI)MiJB%Y*>+ z(&^Tw-JquV&M?v6kfE;;$qSwsCQ~z6fz#@nO6exz{Po1&1W-YCkQANF)1BW^d)=^V zbTJHx4zV$#!cF>y4z7sD3{o1yhMV1gRNxjJq!PXpq(;Gu`wtdLsdz-Y*?_Z?e?liB ztQv$U+K&t-P;DQ{Ci_A^f^yLllTNW0I`$-n(WLk@zJ8?+u`d(Z7~&G+jgy;T?|ky} z1|G02ERYP7RlUNq_u2*u+Iog(EI|ZJJ|uE)id+`MEiQ>Lom}r2mLV5{FhydBspovI zK04^2gv1omP;E=uYoFfkM(Y)=Xc8z=H5z~B>5&B0V%!3yi4v;-!=ioOHZCIqJ`kgyLxjTe(#!r3$4p8*c- z?Y0`Gjn{f&SOd((pdqCv%8=i=sSl+zdBhAg?ZAcPW2mW-GF8;zf~kn;&M@g!peXYj z*pnEu;L_aF%OI@^wawyK7dNW67LU85P;B$BwisRjj2w?!O6YL652Cg0xK%)u9td~x;Q+%S4h`J6 zsrtpSxF(wcF?7p@?VaNstX!c(F~O5U1GoXH0hB%HY>tE-^``wN;5|^R*hmDqDpx}tE5|@a z2VQ#VB2v7G)~ilw^`Vwsq=Lv<#}rSPEJYWGt8n(TN6gJ*0c-JoRFm3@c5O8C%V}b?F_H61WgXhh3w`Azs|O z)M|Q*$gU<#p=COBKj%cOi%ku{MGBW?YrNU5$xSCC$`< zc+7#uIWA=wc+F)dC8p`;;u1Tw7FcIFjq41%ztx|A1NEvYZqVz>YaObAD)EJk zh`3D55!v;*##-h!CY&;yt|&^wBKJ(q3(6!(JOTR5w4+ngG$Tk7d_&uOw~X$oR5YbL z7XoHqS|U@d^rnl*U|ebjRzLq+L=J-wq^{}r--f5NsSeagN;S+Ygm#aqUBoLJ3&h+R z5;Vrz4wu@q{+%TasiUaZOrZ{}IWPl?lTr=U7#9nX2>`S3tNZF21E+(oV(ML-nWkxW zIiR@Fj#ffL^36-0vQ|RvH>GKosp-t^b00~HDd3MW2!3ZV(8oprZ72iv9BrjL5^}*Q zj8g`BCCwVY6N1#rJAGsos53{Q#wFFIN|uiwEK&wpe_<2R2KJET9qamxXLe4-7covV zFot`UH(CG45$YyQiBZL5d8<|-BkJHoDzLYZfeeT@RyIZRs)L4Jz;+=fvY3Wc7gYU( zGzuJ>OT&#^fN`{RngDB;vwQAwfyQTIKh5}@>%0gogR2S}U;B~15?3YQr~i&s zdE{>aILRP6zK}zj#!Tmu@zlO~o${YNti~{lxf^869t+PDW6I4Hyw}(Zjgww8X^p7@ z9!x8@&^C<`x2kbz3ev+~-(La4r}UWD;vb*hUnbL=rdhuI7XlfV^5X9$RS?!xgI<0B zLwkgsD`~%!<%i4{M{|quuORh0_%ns-747iMdl*44nq;We zMK2S<(UgW!5T&2f*(YyE!A$TyfL2TdU7k~y&Ei-%4%{s1jOtB1Et{2+1zkaLnXCj~ z4x==LH;hkN;-}G5UW~Lv>;%wiiLr?vo`)eZ0~K1do?I(CH(JE+kl-E?BI?dX|0;J}t>gS00&T zV;&wU3#k(i6uE$c1-h(o$(tv{#*<_|Q#iJuI$WH1K(F=jTrY&!6oL(mpv6o$D{fc= z>?&i{^04(p?q@duYFQpw^22r4sIU+;k91NG`xjD3cE29(cU)zfJrt(9eHN|HQM2z1 zHMoB9h0^lGWgg?}gMmjLq`U=d?9~fWWFgM>jz{EB2hUXV^8lUCw?a?Qm}+rJ$=dzC zToA@T=x5W-$?^o;`jC~PB>P-zh@xTN6|j8NG>;i}0}!|~Yk1ERs=L!wmodSeyCkFp zi`@KIkAUYo=!a8T|#6m z{D7gX$*k5`B8|peYj+{b3uF^IM)ztJC9tTCdMw5R+OWf;+ps&QlzQ^PBNx4qT)U&O zeJ(aufRNh4H{`NnXnwk8F&ZnS(5TO2@|YJD4y?Y)a$DHXk{Aptt?4p+7GY4>=RsNd zNzE+dAo=WyRZ8>pDh#?y$^7WT2%awx_sXMd&qhOOYPR>-rp7gKZoBj6L1g73=8@2D zi=y2uE~F8V=;ByJjapd91wj-%o~1i&v&S6TX^(V_kW~;ihsH+BL2{oq)iztLV2KZl zL0CG3D7JkS?cP%~J_{3NEb9ofX25cGx^}oc2#OXdbcLLq-H%c7fDyFpxa|Zivb)bh z0u!Jqw?ngW4_dBI;ARgSAem!6fqQa?RUrdSxYNwH!r>FrT+v#_+VJtZ|1! z(&P|c*{u;qXgD(RV;L~Z+2Y2s_L5cj5Mea|E#Rn@1+*G~OT#oP9f%BmK02;py!kWj z3Tqj3@@orkJ|>9KMwk!w{}ctv?_vm)Vom5B!{tcfBl`H0F_)nPoBLlUqLM|Ma!|>= zM`>J?$pc^DP^IpJAJb4zwsn_U*fq4Nei^AuJICu_u`KW zrYq2N{-vF@Gibx7)m_I*9Wu&zR>joEe56E6FXR_|7N8FXf?1XlGxo-KFUNvHR(Id6 zXl#}5qC$J%)U6iL=xi*g1>iZUKc|@;Z`a4@XMVA^QKj9%1$z{Bu$)zd57+nK#d~Y9 zi@R4D_SlP@u<)5*-siT~nVziIj3|hbA%%*5=wi9ffjFIm2rNlF8!x!|S4;Zx$KpH> z;v@{q#lj(s=_&+mfGwB#WNoSUu|nMT?h1SVn!0S&=^dTd&Sa4)uiA$?Ex*$XsR|RN zqSByh6!vZRUDd_2{C65n0{l#mfK4l^Lq_Dp{^qzCZJL2N%!<_a(cN?Hd6q+?_NhU~ zlpUpaag!>mvl_#H70nvYyNwERRd( z&Uo5tYmiPKqGN44PbJWE*QY6KGBVZ_aU^t)-)PLza*ehl4Wghjp9Ln`kXCN59SbKq zV{#35a(2yy*dS>toopOz!pTKq5Ak#CE6R2d?xVn-6OD=%)$jZ1P7dAB>*xksbIQ42 zfE!R`8N47c8!hR}jLkrv;6V0>c7q0YP^A16<$0_v&(Q&QrkHv$$g-=ajtu_}$+}}G zf(FDN?qV=uF*auiPGK|O1Uy|XoBJG&QewLw1Y$yXbodk^-u~-Qv{qc{ek%%-?XM{< za=S{r)zKO67eI&XClR>1Jh*!Ni85Xn(r%9*B-IZ)rbHu#P$o&^;PcSi{O&rCXP{L! zieO9mM3g*4OW*0E_IZK~n$euNg`EWvV@HA62#;(B2V}Sg%VvEz-!HSTFe(VPVvj*Y zL>J&WHMT~qJbj307Xunj%^HLY?>lNxbVE`DNAzynvqm4BS?~&A4~XFjBnq=JZrWP4 zvs2orQczdP)YJYM4M9l$vUiaBVlS-V9i9-Ti3%hGODG3G6o=W^Y=DC4I~%XR0(Tq5 zDRGS%uswv+){`CzGbTkMfzXTX4-Pb;gfg>!MobOVJkHQ9LZGRUue#?Rf6_q>9?y!| z-TkV(sh*!~K!?b%ISM9B!J@s)Hiz6iM*HU{( zwEKNW9UTGaRjx6;Kp-E}6eqdg%g}vXg(0|@rtbapQUE|5Jd1bSbaYSfrtH( z%wL^-@3!lWs(6TExPkPneZsthpe*yp3dDdSXyKTH7ZyRsmA=rB_?*W!UZyebzj3BN zJS0U!AhnA9a4L-cgi0P@Ac>Wv*j5?T;yA)1=HmIyyd^QFb#Z=m3K! zAKghwJIlLjPc|-&0?SCop{q$CSdVi~$i&>T%V$jzoMGfvGB+7Mf`Td|t&~L@S*i z67(-%YdlU;^g|kW6buld+8tyvoIKq5pw1POgz){{K-07DKDtCiZm{uv8G$AwLK zl-}0u%A-|$%8QdYG$nQqzuaR5XY}P@t-XWMMfgi1AD}D9$-`Z>lRU>L+RgwrF!Z`Z ziddh8>_qKIMnxW#6)w{X{zMR`86A9djV$dO!{!eBH$j;6Y=NXxVVTy$T;~rj0{R@U znM4$ZcA{u9QI&Dd7Px~9@8Tt&GBivj_81*|nhOE>L*UXu$mA1n=&xB1F-JYE0sa{d zbw4(HUoCn!1)E~k-IY7FCj0H53v%+Z$DuqdY zcUu#-H;~SjVJ+KF}z> zFvcQ2tx!y}^4t?TId8fhm-UTW)r;7jw#Uw%V~gb(phEa2Z*2ghYpk06pRqX*6&*)1 zCU^uctB^SlKH3>OEOg9!eFn4Eq8a1?M;gv#mrXpL`Ampj0FiVyIw+%-7B$p<^$b15 zB^bNqbnwU_r$a zRVd8XB-FneLw$`TN}-Rani6(Iu_I?U@_>RlP9;bap%>z!S954BfiSe9$vHH77mQl@YH1+9jv{Ca0e!Lk1rr7G8;hl<$&Nx zcJ*-|(|)ee80l&~OnSPbQJfqyj3={ZX)GR)LThHFrkrszXU@8dz(o#1!X|5|nT?@h z_u#Xx@ez5Mld;n-&EKMr(Q~KVq>U^ZF@q-ubNZ6jgqK+E+=@QPa7 z??$6o@G7XvwE;YKijLJ;SHeSyE{-$6GQmG$pn}7$j4-QowoL-VNQvcH!*--B)tOp# zLl>tKUs)>x&qa<|k;PNWIyGKk{uXn+$YLy^5+=E1JNX_^yL2tZ`T*eo?iPqoY{by*d4xuY_hYE$2W zJeO0R)1JXO*y`q%<0~oRp33eY9@?HDLQ&2du;Q}}%Cd$#&j8^-KqZk?j#xk39@qys zh1nVU_UjFjWJBrmN!FH3ChLik>~tKWuWmR@k4keAEXR;UmWzs;4VBra7or>%2!}bM z+XD_c6y%VdQo*3RTh0?my?=QwR66c!i}pDF@P>`VTj3_h&?D&_D!*4lZ@TL~TjA0S z>c)+TZ*DpDkWy}F&1rYtza0Jb;Dc)93$@QWM>!#^Y{iKB(6~P8;;(B(mqI%}8TlI^WL+xvU zxJ&5GNS1mg1=V?SsqfWv=G^jD$m^hsw<8?W!R&Ew@o4h)z)>pMBO0`_IsOu1l-k$Y z;gA&3`5dCN184EwG#3hTA0(R;PTN?tId(=tp$mq)8`H#&kpVX2wHcp|-&3eY(ckc>Jg=yPp=VO>2>eT> z316(ya435B@`%^v1ANXvgZ-a#J>8W%gOTJ&Z0*?9!e)ad`Bh+kG!fh#7IEd!jPH3!+FDF{G!lO=8HQLP-LVG)PRPo~Wi*Fa!FB+^^5BG7ml9cM zta5Pdx;`eS^_OYjGi~9WK1E~EV8Lh;Sad;viR5n0XD47+lq$s0AGu1h5g3Y_Pmx3i z$96NDj#32j4klGYHm33qSC1rLerNG9l6{d2E)a4#j`qQja>_oNk(m_n9gW1!SCL9g z%WSW$KhK~$}MAhZW|yvT9B z>)T&iB*ktlHeil$=Vibcr^Vg=CJ`y|o)aH)%-X;~FMDeCZX!h)%SmbjDiFGGI2@Rb zQ>RA^?9r~AqdmZeN2~$;E)yq+j4#jNV-YAKI^4d=;e%j{87z#@Xtd_Q5yYBP+5U|u zT4yO*%&sS=xz5;#=0?VB9igX5BrcUwkqvJMRF;Vm#!XKOsbPg3JR53h3cvGjzE zl%sRtw_iZ05JIe@WI{Y3;>{r#gcHdo8n?GU3^)b>0$~rUQg#j;3lU)(r?;dM4%`DE zvQQ5H32>6DAczS%UxxQ8QVaz$;OrcnzY&@f#BOYTo8)hB^aXAbb@Z=|5<(Jd&iPan zyQWE2H!g@nlLkzl17eiAB7kC-H)(T$^*q;W2J&uINP3bf#MxZ`J=Ih&^ zZGiNgsAYcBG+jc|5pS52xdj4M8rQF6J9=U7snaGynJq9h2@xtUKWJRDKQhB18cyT;@ad&{JLO+s>FzN8fe9s-!r6M!YwMRUYiZ)@(>n4pAzns!?d1KV#7z zHMUGCb+?ERY+47kZ5zg(ieyBGnV_Po=9_^&T#UOYu(M0}hD*`MUr_8h=i(wEXmh4vu1Hl(Ab)7n%<0p6=R?oJCnO`|)AjLecAf8boM?S$~^{t;sg59c%YK-}D#g7Vq| z*J6A(Uz3y)P(jx&t3-NOOv1>F8h?o#>C<}M=}>p!z}2@&K9X+nTr7(+>nm(F>HqUSe+5)a=qxhN3UkDGu=I_hQ}jg^cH zH(Ij146%%BCQ8Q1eFc|flW-mThJTj|HUkLiR&qa@>oVCDI(cKXS(G3`vsfd8m9usQ zP;st}F4n4jh!Hs2(;OFx2qc)@%=Dv>$rL&Q^0wr6RP{lX@y4H+H%d#|JT{FKw~jxe zR)H)D#}tJ#d=>2GQ{>o$mYh ztdKQ2@`R}2{y58v+5s7TDKwq^sD7uB|9+~mc)LH_Ry?0{qZeVPcVd6A!bfB6Cg2 zsV=9SA$%^#XiV9o#6(J7L!@hEk%R>lA;yo9eG6}k{B1Ou<%aPiGwD6p1^*VOtu^;s$Twefcg z-KIvTJe{@t!+W7Ie*-6Pc6@&D++Y4TJ2v+^ulegg`T2^g*RKVLWX(9}IF);00fUzrrxzEx0(Nyct9B$zQl1h=<5vTW?yv`GcRYAqNV88ri^`-J9PBF;Jy{ z<=1P8y#8!qZ_DK8Kf-HCaq(-lj4GlxGn!0P3M@&KiBE6LY=W)xu|eczM=>$ApE22c z^CRDL;4@^c74Ta#X5$V7eTQiexBq-tY|-iGcwU`OI(rM|xJ3 zy7-5`ym`l6Dejc=2AUjr%vWA=7(h#vzx5jj7yBW8PITtNq%wp^F>`h1&B)tjMpm^t zR#=SB#59>-1pxbj>G-^$T$^D2W=xR7sOj4p4!L4Lo_8b#?5V(=TAsi8Q2weCseJNJ zN>e=0SO9Dt9TS|{nvX21qZALOZqD!T&)*J)fIl|@sa9>_EuX)J-_#^J<=j!PnTnj< z{s(oD=WP~n+&Z%DaHWFeNJ_7O=q3KuK>;HK3P=wCm|5Gwl=lb;ncwCz!Nr2;0;(Qg&k$i_$;Y7c)x>1IbakfZl1%YBRA60+@~(Sk$B#DTuSCO=X_%k ze5diJ-`o!;1O9va93Bf#$Jb+eyJtwtv`3#SaU@9A>mMa>9&%yYl-13F#L4*iL#=s=>c|G z@Fek~WlQ~)Q+#K96GZMPdip3I%NtY67rQt8i5wg#!P94G=0ES5MzpFG^uV_l)&7x*#fw)qlp`X*t zk)Zf9Nl1$bPDQt(KUGMjK?#57zklWKXVS{?F%?l^N+m5OUAev}tdfVSN+=4lq~tuP zLntWY*C{SDq&g==!BRnhB)E|Z<`4)*6cLJ7s7D-xXg5dOlDR>Ui3z(oP{#>p>3$DI z77FIufSPyfTX2$S$5qjl-gz688^+NoudaeA8Vl0=PZ=y_iWwoDtoa0q#mrg)f6lGsK-BC@)r#3r%6lM{jza;%3p02A}6 z-jf?(CIrZ>0>=W_f>ZN3{2t}H7Ne+aEa1q3#~>*o#9ul| zt;}b7v%~*Z2l=V|L3ah1VmS??xG~D`t4IcW;4Twvf`ab`zhJM$;b#;IAzsmL1)m*} zB^Y5OYfbyEMPIZ)%4NEpO4I@S9zpdGaPl81s2I%YA5$8WbyW<^!z(tzY>{D5NHn5B{-$yky>?rd*k}B6?%!QpdWPR z2hG zV#RSsZvVIGcE%gTK;6X%_R1HC{e3`m=ChK1&mq=OU4s!(}o~zs?;v$0;lmG~U zq9Db8{ppX9rn&4qt8l0qYZgw*YHnokq>%Jc(me$p^B|}qA{i6E%x=CrGaHD4noaza z^l!$}yx!dWC+yE#x7t)f#<~y@zewx{zEj^ju?|sl#Z{6W{52wZi-?Xe1mYx#6E1mm zIc04|YUowS2vu0&9|Cj!o>L8|fGJZpy^FuRf6z;rv3yWS z0xFa6g3>f5v}ZT}8l0DX(^;aig&go&<-hqG0x)GiMh+W&Z(EqPyRuCWzoA7if#$ zl6LJIq1p?*_*JY$&TW%teEbJGfkw&0{Fr~w*e6-TFk`wY>)EI$nI3}q%|&kPI#z3! zA<1FiCYuh#yT4m`Yi|O}HVH7h4P1lfA;{#i;Hi*`^l2WQ8T>)+Uyy@dUj7jD{2xsV zi97&lS?6a)OQj1kOxVnB4eTajgfgm3C8|IZPf4LHxF{@3{zp7@J91D7@!o9cPUTK} zE&`!`;Oh~fLtFgC>~nCK`7YV>yNlZ$q~}~aPd+>CKeApg2mDE1r_j(px!ZpR9I31d z&`K2M1(&Tv1d%jc0n7yDhDz7U^kN`3(3Z^4Zhwt1Ly`O2GgcDNh&{|rMO@1H@_Qy~ z6Y>e8%0og!^~z+HefW=TsT*11LS{f;6tnf=k!mp52Lh(Ls100`tjk~d$La@Va+Wf| zzh-heol5p7=`L4J+H}>|Jl8vqDiHDG4F2DOibM+Fi{#OO10swm5yvdHs3AG1Vvji` z7JQ0={_cu;VM8-HbG{blObZ71bH>f$rN0JdIkDR5%ZXvu`*M}HkgRu4li=ULrS*Vs z)b#>vd!e(*+?k}7EC>H6UGJfTBoj3|ycnzO zq%a9E3J0Z063XV;RQrP8v)pR&CbOJ3B;P2EJ5up!tg;3^&D zK?-bOjTt`vF8UF80hhTvW*Yy-MKW@^MToK?t@Qd<6hKIk49U0=p#w9VM0@=gZW39T zZ4r+(g3oWrkMaF@vNGI=aQui1{v==V9e;1mNNV}!*WixvW1AVe^_&0Uf3aN=NB^Ef zPN*Qn*n)wYlUl(*5S++L{J}q+gftOF0Ne=9oFoiJ1N#@`%qUeQyb25moO{;a%*GxJ zlnJZ-ktmpf{gzrkO_%$aLvasJgixaExN?0Y++>^iVQ4U!mRRp(6hYSJ5CB$I5RJ8| z&nbl?w8(_oEy{xmxt>UxVk_qV*O~8nCfSzzvgtj-~lNb7$YQLfib6cXG z0W|q9umm&V>ydcjuNNtVIs(}IZQ3WvB7$owd{sE57_uq|B&hK_5A;Ylyj{Bh`<6HV z$-bp3n0LGk=T1AZ@a2XwAzgZvjX2I7PdEQT3{%sB5)(_QP+VmJQ4Q%dg5I2u{5=yB z1e)1dj>kL?lyCwJKY>8ET;X@ZBy(|KqZw7XPHlu$N(b9m72IZmj+>KtNo}pwh|E)_ znfp^1V!lxuNg%!9lV^^9Ol>5CREUgZf{lOt+Y(Uhx+_bvvXbB|wLa-8WuqP*C{CGEcdZfx%} z7zIi`VA!0`)A1kYzZQpS4O$S$>hK#k=LL-gpuikY@dNZGfYkgAU(C5?tW#94cD9R~LA$SXA zoPB#`L?^bI^f10N9QMx{GjB~cG0DdNY*t`wW&sRe3uF9TH%D|{9Oe2ZqyBmw#HqVJuWqvlT0Ev9upi{wiZ=dZYSH6@coQ;XN%XW`V8Z{iETG>5Z>tFb)j z36MnCbLvu%0dk+$g>xQ`*cKa6(aE0=1H6<5Dtc3*bu=J;f&@ zy#n=U3}QiK{ydjYh6^-hCc=13VG+uJWaUoKa`l|yFdssYpMVyc|6P*s*woxL*J-Gr zo}W|YsMu=9!mIBR>Wh3tBZgUuI-fSptXZol3$#}Vk(s8XWM2O#{0h|sLO(x;Us!;^ z)9b${uFv5>P7I%!hayE~}6PJZaD?UjG5!St_Xp1b!_gqLirU{{>j<{zA zpt&3%ZbxaP6E=9Wd6pTE0H`Y(moLR;n=CFWupl2mN!~(>7nN|zMaf2?kZd^9CDySZ z=^?{%u^=d=^(mNtS*L$c;II6dRZ;%ysxWmicG#fg4+-mI`U>f+VMy3DT>Ky4BX;Nm zju6k#UqGvFX2}Ld1|^n-ab4Igh260Vsu`J)a6v_OUbPdW~-PFWKz;f!a zuD?-A7#EO2SO+jlM*>Vz0v?=^5*mEH<(H_yJ4}Iz!}@GN*qJV;Iv`b3Z-N*aufjEd zBEjBW_-MiNbGCGq)b+5%i~7&lK3 zg>ZB7TYSySZhxosMkEyU-$xgd^zKjl+pnN zCRX};Ei~EoHJ( zVm=vhGI9G1>bTmKU!i|-R0lK{#nnX~S`NjO@=0D<*q+6jiU!a9lbZ7G9sKRPD32Ze|woKbSEw@Hwn{!w5A3L<10^6~nHYKE@_>2+X> zP$>(SL?8LvxgICR%*#v@WkRxPd3X{ju6_oV?ggcU|dG3WS*T(hU?f(k=rL{jEBt3L%+r%-C#myV6J%iH%s^Kaw33H0C$2Hl=-tM1I{%1EL5N zjMQIQCJU9zQ13Kk#VG`I{|}oX3W%fvrm@OsLKmwdlpAKdh{q`}V&%4ExA@DfR_E^I zVu=W%5|`;H_qRzM`7(KxloNU>_6fY2TO3&@qVsb?Ov#{{Je+Xs43H*>p`@MmOUg&! zCKBmf)R@N0O(LQugm_96Y!gIq6YL`S!B1D9J0mCxo8SEJE%B7Mq2C|K5Neh%5BFoI z%#665keX1E&1sgXe2O9HcYG+R$lNG-KfsP#ewk097u}+V;)#IJlBhgZF|A_~<77I_ z3|W&+EtKiNTds|~jI{!p{xiskFqL`)3&AY>&JC`ynkKLUgV+QGZe;i}V9(m7Oi`91 z1+nxNRwq8Ep9C(;+y7Bl)!0xSIY@|IBt{mRDK}J$J~37`q#nn_n|BM&tQi~4@5m%n zdL?A=dT% zII`sfo)Wo8MNOMMM_AQon#%muB1?{11^j>%GG+HB$`F}k+G}7HQ%7TZZ)P3T9(ZI* zZI(os%vwqqW;Sbn_<>?wfNmDZY>+G)6EM zj<8TH^zSeVI6{fSr~%jHO+aMo&8%47{*o!#6(I>y1QqbwWMROYI&iYjmF(Ohmib;8 zxOsm2PYd%`F6F1!)t}^k>`e!5Vz^?qO)M0ata0Sv1Q4Q{ab-2_fH4SLQldXn#G;F# zayba9^H@-n+-P*D02zQtw(QB5LXr&;f$Zp2>b z0v)i)l(ldzIl4JtyK2h<1I*2_DA+;7LEN5f@lO1Jf0hEI zaBguVb(1-uRa`CsPd}m?MCnMefgbyXN`mZDbZj)+wp?B0raPX1U5uveoOR21{Ot8~ zjt(m3P_oe*w9rwcT;BdB+hw1ott%Z*iyuml@ia}aFbak%O+YuHTVPi*n1Va57nW!w ztkDe7A*kb-gH6$);&&t&@zcnAiVufZ&vpxVf=4{IJ!QoXYGl13eL4#BS3C zL0JbKEn$pTBS^((;}6Vm(^r~lQHvkLxOU4Xq0n?Nu2tyu>`AO+wg1i0+O(P{w%C=r z=VcdqPs+yyS;2zx-2^(fIL02^FJ$$I)#^bVZGN-+9YH%P zK)bXAm7_%I*LZjVRK*8Ud6|Wg|kL0&iBz z>xDmT!bYcHFDkq~4>XNUfbMi54X^}wwamL=fpscFC)w^Py@f@`Ei*rS?^Eb(ARnQo zh-L({fz>BL#LWaS)jJ-cs^!FNM=ZA47Kp<=l#Qb9*c>Aw18ul^>4Z;q4d9pCC$JYo zS~YPPS~DcF%54u3K$R3voowNMqE7pX>urdp)Z@-h@Wja@JYH`nO7O3S52%NwT=23y zUT33GR5v!e0H0A2kN$Ii&Z&S>cQeYa?$k80KDALpxX<8Y-R>sk&Ii1iYht4ap6Sn) zl}I^120iqiAF_Ld#o0BNZ3MF0Kx_aNrRwffu&B{MZ*%vXdn33{08P@sYztqvR=f$M zIMO3~4|H2uHf|bx&$#A(Q5*u+4F@E3I0&IQL@i2ZMYsBtA+~|aUIgQ)3bqq%+dUm# zcGC;!*v#3KBJ`Fgc5uLYY*mzC+r8j6x7_q~2g{P^P6aY2Gu^QOQm2JVif9Y&vX$9j zg;Mijke9N+hn+S~tR;s}9>6>Aq9wyU>%p@QI2_^LJvlUI@SQTz6c?WAlqysp+lrp- zS=6MhvM_xV)4vZqH`}tRfFra#!suRo zYc|h^@6jv6lOjwTr7rHSPoJR35yi62hSTB3T{|SH#ypgP^NZM;Kl5Oj&FF(jVwDcQ z9f%maGhg@y;MRNrp^L@825`rV`;lZK0sYnN1@#67614ys!2-76kPx%)iWz$6#XaehsiPn1a} z%Ue48(m9NTcwjYRhd8u_gqapghQq-+o1wzR1YH6$%=I+$Qj{s14a1Cj8G(`B4gQ^z z?_mo8RO3@jGd@0{PShnBpiN<|GV4Vya`dFNhJFeQ_AFxc%3#wDHS_koeo(pa%jVS< z1SXJnE4~^Jwt))8PLW9<>hdO+N_EALc&?a^!`3zJ)KR;p7Zl1CU^8nIFcJ*ra#^-a zm7&l|lEeq~&yUS_iOPgzXXt9iE*zv~HFEW4 z^xA-g*MCl>7oj|#v9X9ZtGcWBtr7YC=JQpDfbgEL@)jtQp8FS}{+%qi7n@=A2} zBC)t9(ESw<8dKsdw`hzmMl@gCsR43^5m2!5*AdAPb9ZOQU2tak3bI?$E0R|__9`V_Bdtj%o*)e> za8p!{uP4@j_L5yBi^5b)kQPVj(n{G~j3x3Z+0DAffSzJ(y9;XzDhb@AA`ib5Aw|i6 z{#js;n7tfQMEu+RK2?G(g%QH3MMQqD?*2JpEq|Y2jTR7MMG--W0#z}Qs7^zZ1Wh?M z;I|dCzZ#0;h(1a#5Hp7=*#x4ap|9Q8K`baLhfvACC{exn5%UBF^A}b)08(*}n|BHH z_Qzi*?qpJX*cU+|fTxV7+UPlv+Zf&9kKFD=HngqjX@~^0a^R%b2BdqUjCGP*_5X z4_zLz66ei;5DoT;3d9neVaC3?Hy$7X+XM$mAd7(nMNVfJDVM}&A8;{>9Za(^XEtiQ z0Y5a*7*HMm+v($dEl9~IyvS!LKDFggPf|LZoFRti1RLDcQUkciSd1fQ9cNK{x6 zIPzFu>VDC*Rkqdv7IaIT16-~SW7dsg6Q+}-!7lMRY))sNn2s59Xd+e@46*pA!R^Xu zA;xgR&d1ygrgM}hfVe3CGoJ>MZ4_~SW{aAV0E8Qa++~#8^x2ryS`)>%qW2|_!p&Vu zCB~a0OreRe$`6@(Km|qf^a;r;G)42t1iw0CGXRF(){^XFh#=cUV42>Yk&px%V(3UE z;{qhfC1E7ePYTDZ$pJ!jSYq9U8LhsuRCy##3K7QUC{a%U{0~49=O>JMY)_pVmF^#i z;VtAwj{z+4X=BHL?$IPtOsb5Z)ly?qT$^yYyCp&La>7jV8iqH)Km!lVY4!nXIaLZf zuTa&H@vO0mu`jfQg8@~vFbyXt2>6O`S_CWAe7e%eN68zhCB)8#YDQf7iciOi8kl0zDKZ+W3Th<1J5DokPp-r{2eAF| z^4})KrWoo1*$b{2wK)j~)%Kob62=DVm`F_DWKq*93ZUcV_gzv^nvqZK@4wj)8!6bp zGWcw2zhV!c?}k-AE^}$NB>4uR>5Px_Lo?Vh4me%05MmTvVElTNv9NoKemHUJm?X*b z29BDwG-`1I5p>I^DY7_h8^iP^En_!nES+bIpBNS!Ro4|$p;KhzF*X&Qd=Da^Ymf#n zwZN|0cQi-(TOriHED|~S&6{1^#YuAr8_sAvtxCm1(SBufH}Wa5;rhILIU52{$O5x` zf>|_;Y<3wY$RvWHen<#DXRDwQm_eE_x!d;33GBE<=a_BS<8?BX2f-M~?D(B06LYUG>_(`ZW0^P(AzBhw2{-^5 zJp|YE73I=wLI@M0rqs5lrmPE+&_WtQHq9iBbB8FaDpvyo396b_gLRk^u(C&Mc%i6i zGf#QnL88a-RBrQ5v@<2HRX3J_ndWA*cRBLcb9y*}_WrcxUdzyIgO$poOfygVIo(|W zx8gur^6B_v&vPm?B@6h4j91LFX}B8LIHXi6?9opWjSLvcF()wDS2>Dw5By!>8J9TD z(M~`EVT=hX_LX+kYYm4pJ^#F)f>}D8Y5U@3n`=c2a04F>_vK7VI)6$v^Q`VJMy^gk zIL>&!*TGMl|L&Td)P8p3Sf#DfdB}azz!*^Gag794tpSeX*9EsC$oo;Nwjz>c2t-ez zq*yZNV1+&G=6+7!OG2NXW%E9#lxdzE-$}Lit`+2@#&6muqXMN=sbnWpD5Kp{9N;6Mn`Oy^X%yeHOt%U1kR#8{*orWcxb z9zvf!TEhdb3BprH;cN;SV6)yR@mivnon}uvAOdta`W?1ZAm`gZ=&XpcUZ%G> zN#g#rp+r5mt&ZPKTPi}b*ZZ)4f8r!yqZR?sQ4NE^vZ4K7YHp{!N6_zN1x6+l(>vJX zqs<&JYjqq~+aVfdowRWL;XrCJM1MM6-`gf0H!-=p9g3_~E7t!0caJ%K@cameicQ?t zyLc|FC%}%AU>`U>9ER#!ok@v1YZtLX&wA$ARSuWsOxpWC-b1~rORAg`a{4eVW_07- z{U=VZ4R4E4Cc89igPfde;Tt90 z_V?=t260q1`r#d#!ld~u%*Im_Z_gmUf=1>Pj&S4zkEX{@%B!!Q1 zh$_;?xLPcpE_Cbq_}02PeLqNeGH?BRNHp)SrQgH#?4if!K5%I5 zmq&CT!;>91r@m03@SVc8lE?9KEbsm1p*qL;AmLWagWdvy9v6()d$`}DkF#xF$*}>YNXQRo{3d|Fif(I{p0GqqP~+V36h(RtIeq}hVK3^O z)0opJ*qxMe$Zu{o^R~{o3!G`M}i0hRq43{?kR_JP`26Q z?EmlTO_w9vk!-zUjGS{gQ_bCdl4MM2_Yw4Fvik~pJ^hqS_gc65R@JF9k4b&sT0k&c z77UUR8{6SaQKF`pmr z@bqmeY}sYxyWM$q^J?F5qkK7;Ib0~s4|`gD@x-}=sj=*2Ow-jC+eRIrvDjVjFVvX~ z2Yjihv!t^jPr!4PS0}ABnca$l?J?!Vk0ui z@XC+IWK13lpY0?w$9V=rx9S$Sz^Qj|^Ru-VAFptCbXcy7!8Acn#N;SW^kbGmC7c@B zQ8S_g;f0&7DR@Wl4Ee^@ns?uq4?5KAbR#F9*>?TEIIlEJr$M8eg=k2xU=W+ zxe&N)-K3FcB$KVx)3(8XwK<%lAu!j@PD{0fovbh_P#+fPm%R+TNMY6C&2lIQV!BT) z<7n7N%Gt)d;Z+N=7_7+PHQfBnwE$SU=N3AV_c$duLCEx-;p7#bT!-9Hbf*Xsf!cKa zFm+k~0yw3}g5K|f2*FR$E#Q^T)?h917If9FjU!+}bd=Si5$uNUW@KMspmEGmcdAv|T8}Q4aR9C!U&lcP+n#ny_=063pPCS-50+;)873$0q9IOg zI25)8Iatv@{6QBXKg*puP&ZRYYm;RrX{HdpPOY0A+E#|twm82L1JEoiy(k zgZ4*twH-#)ia`-n+_Qo;;-drGM84Jzq+9IOYAlLv@DMtrOA zSs47Vr>K2lyIa;Uaj3o+t26No#B~~}0TgPCXmI2r7yew)Xe5j`pZ3_VD7ZE16bsom z@s2F7Z&>SPgUF0z=o3+-8Gz;P>3%fYln3_@ZdOmYJR#0~@V~S8mI-%aJkgOj{DdPmaOBEny8bLU0I&`!bI^5L1pba`;_%5v% znnXspRnr61$Qtp zm)(uyAD3&rzvup+BXNkSX~W^r;lYu@C*ggggUIzpDY)=)iHK(K-LCKu72(BG!e2S6 z%BC1C-{3?Nap~lw>BuH=596(&p@EHo!GgE$w9ZY(b%WR2)EhZk@2x$Ehlc2IZPopn zp6yVrbeutpz4EKx)t18cv7Fh2r9vHqV2NV7pG*C;xM&f_B1W-7wPP4srKU)(_sgfB zhN0TbE^=&Kj_^w!^|Uv8S6Ac|bMxE)nvR3Ml}^BlA+L2bT)KSh!kaEw?7G`A73^|S zP1V&SzTQ|1ofKP34QCEJe}zh2K6kp}FjkIsK6mHzm9A3}nFZ1@9*HC^gsDql5Ry8oq<9eR z-{pYL&JTZR-$>4ytkZhSN7y!zrN4OrpSAOrMhd~Ym^6aDin8uggssoErsHdLh<&4( zCjU&&uj8`mnKzr;;hKbrCP5eLWd&t2{w{(zCw$ZwT#|tT%con&H66|A@j0v1j@mW@ zW2VVIcE*QRBxWr?vRMp$z zKGw^!E*-H(hY5|@EC<>1N(xH%*W`lACwO3jyPDzw=gCo41!;;VSx}{^@!0AFtqBF1 zZD;C&x?V@=QbKF?T`RJ)qc{_?5;#q)Zd7Yd4jayR(Wz3);|r`SaUUwr*&*%2QHAbMGFoq%w$IYClO8w##1d$gKn`Rw3hmYhaykrq!$Cu{!_FZ z_3}^p&IF-Ms=^Hc^lE4a?i{z;InzZNlUDUSY8$G84KuTDm}uVwk?3ucq&2DPraO=r zMDZ_`B7)K@ywf-4^+>xBbPDLL+>W{noo^$V%dwc4%XZwd2`uDDrHi;l&E#FC;pReh z$kre;>$PJ5jkcBVkC4a96=t@*jH*OTuq645n~L6U|T}IlWn(=f{V- zvqj;!Sn#ET0uCdM4kWvG{joP@wpIt>Qh=uRcEt6|z*h;B6?rD;U6~0%TKUN|6a&tl zs^i&00_&xD9hjnfD62d&*OVc5r9Rn?S34DkAX)jt*8)dOVg^7|b~Ca~>C3Bdji@-) zIhT>Xxuz7_L5BPUTBE3%7mwz^_zj-QZ#afF{Vvy)^`iJ5Q=-eWXc`VG7xA1h56x=n zgz=U9*vBIWw!;s>`H^X@QszA3jlDrcx{msUi~Wb){#D2PMZJ`Yk=ijjo85QG5a~mi ztD+M!=M)FJx?(qm>sF;ter%V#+b_9k6U`bU$y}hFXiC?dmo3Jd z(NS8YZe7k$Zf-x>^e3{Daa_xWX+t9dVM8|$hmqF?mx#>yXo~4B-9`sm11jvuZf$#S zQt55nwpV z$SZ~OL~@-8;Or3a&ADMD=njkh>HrG| zO(W@8T90EuEr=E796(oG#Ya6<+~Ka;6&6Z^iWZPr9&YB%Dl#p*OcfW0UtsgVb%&mQ zeI|{N^g3E~ox86N=`6=X1WteMr84{Bc-RtW zA^Ge5k6g&lmg>`O&QItj>rHR>zl@9ALxLz2r>CEuGwllJynj0$4qAm3ouJ!}H#_VD4z0KSgk%za*_Rmx=pyT&`-g`@8<(&LseJRKK@pN`0apJ|bHx}7&<>z$W zsF}N#$DvFbmYcLm&JY+9p)*#;O1b^COh4_p{elKu9DkHOUI^THY;FHrf&IbkQ~GLo z{BSsK=R665ueQEETpoMZCatv}u4apmu&zZkD1v#3E@|%bvE9Ep(vcb4BUIeB;=}$1 zrcj5zPitW#x#D%33wuO(mCf*Pe-p3*;C27qs{K z_~YrQMwtt6ie>FMhOu^$_g+&wp`&vwP6zC7W%uUz-RXGbwiwWD2G8c8rXC`n>*KF9 z=jb5NJ}`mdjlX*R@_2EApOa?uvexYqCf6MU^5g4xa(t<6;kL~{W7UY`L5aZIDIs-x z+(Gy{{d0AEJ}r+5(krW0aSO{Ax#yST>7>n&tE&T@O~o|kWS#t+#DeXV(3+}3?etSi zz}B)Nf-!}J*@%F-i3)xWjpOn}%SY#5wR?Y+Z;LG98y+Ax8NYy!#c>q)A*?6@iTtFV z@N(3w)Zey$3sZ~ZRVYNZ)i65ds)FCp)a9wB>%zup-B#419(*hHw3Xkh)35KTWXYIQ zRe=grb*lLl{4OZ+;XS;_gBCDU?CK-Z`z4gFPSp$<%dVbH}_n2))gEcK^Yli+w-MfIE6-A-7 z2iq5FpPWYaQRfKwk}zr|D3Oi3MTwm zKYcejfM3&EO_Gs;Dy}>4sJ|^5nTyQqxO1+EF@7eEz$dj4_;M5r+zs1f=Y4B);P+ra z<3vE`M$eFHn_@gurXI5%;;qT82n1Ki+v98M>MU{Kv}~6SB@CP3=du`5gj|&kGK;qz zAsWnhP?^Lv>4*cuy|?sq+&+QQTLpTZi=Rf17OgMwEg*VcJW&UvR%prSaV}LSURPB| z!Ry*-l`o3~hU6~KV!7e!k|EhUn$vR@yG{uTZI$?_%G;KViP`AJ6(eD(*8x>mP?#@B z-ZlwhDjr55xCd7*Aeg?pS~`Gn!JrwbWnfsXQLD6(8*0Beeh>Nl?6@CaO7MwSszJGQ zfE-|txao=O7yBP1op)`sUXJF*flgm37>mWOU+E8uMd>!IZbrOe+AT!{v+LT5+M?95 zL#~4hu|ttB%Es~7%&Agpn3GCaFQFLalQE7FdGUiBI5sr?b1u>*)Two&a9q`|um_6- ztD}yTY7-t3&_pX&XwbmwR74x}zSnc4JCp+_7+7uZ>PUAvf|gP2;TcyHY7#_1IM`KK zXeC{uCe;Nm@*lU_X)3b64VU7Tu57O1z~ulFjN5WJVOLzxjO$p^9|C#9gV)|9zQ!lv zYg&Gkf5(8sBQDgUhSwW0l~DvMcAPFJ>CpBVp+wHkA+qzfy9>{Hq z)}Dz@(KnaV{}LNFvtu2labvE7r$5(s&^qZ6JRdi4>OLIt72@`-xw4w{Y4}BCb_Gei zDB)U%k_PHgtVi?o0akH>k@|^|gqyIY%q@3cfXq5P0&njek>K`lAC898c&a$AYbt0? zRZ5w~HM4FVvlXp5yB&H6b@6nWP>HZ+kHI2U>jUW}EKX@4UdsM17hi>^i_^C@$X=Da zd6lHbt_mo{~`E*M}5hi;;7^= zs^HaVDUwf6ZuKNy22NxCU|Suo9~GJu)@NW~2ol{FeJAKQFuXa$S?E&O>2nzp2?e_A zj1C&ze2ono?h@oX29)9EFfuu0CAFIkwj7t*S#v(NPRt^y*N{|17fSV08q;47pjF}r zNd6dsM#ZFAS&DSGjvD1`Qfw8!%AuYBV{`Z}W~v>r9to=Zv?hJ99*6^7eIHRv48N(B zO3Gm?V|1p%9ytEu!48pNvS}E+Gh;8VsG#!p`T+8x0O@2UyqZz_3NI*jnc+OU(97N> z6gKj|N^`34bQRl%;LE8>rf6uz-NRp4L%u)&1kQ(x((&)+BGo&?GmMDvM~x2 z2r}&ZS;Key2*~vXKInNQ&`y41ef9|L-_`ya<{G3ekDGW1uV_j9Bl>)m#EI}olYZt8 zDjB4CMSCv5kY?maX;R4yq(=O?1R~L5G029`U68b==zAOZM;oOY$!gl%+BCu854s_o& z?4qTHkG6Tl&AJZ4;6*T8q^S$pT%L)GAZSnu9!!MQhMEx5XByqK4pLp5ZbISq#g{W% zQ4kKq&PaQDK*jIiS@Ik!Sggw@@jLrMECXrN_1e$YA8SMl?J^-(j7CO>Eeb?q&^Z;$ z?@jI)$*UR3K-ot)mWVDXzpHe(1;o>3!Z~~VKnoeCzJ`yb6J_!N$^MrPr#GlgXihGI z0ioBS^C5iK^wt@)Pi~HX^P)e3w4D+4@|v7San9|Q!Vear)L~yL)^?pXE$Db19GV`J z)_frDCjO5JsV(n|(|^DF-SeNJ^L*Mwf72+G&e$XLQ@&2B44eeOQld@G?2{1+~Vm$Qsr}vj9e_Q+}&P~d|#;y8zGAFY< zkxSu4p6Go$0(Q|qs+8OjUd?~N%6l5+n=0wL^bb-~dhOEZJ*g0qCI6Hyej;Ul;a7){ z?33F&UBK1z`&Y>2;`A!A-yA;3stjC&*)U=+;%=QTk3Y3C0+~-KbOQ^dL1FVUY)Y2| zXj+qBHsvm&L$8n?EqAzKgEDfsKg}rz6nS<02bUH80fF>~`{fAn-yOee^_m~pFP9SW z`Zmo#;gOe&*owcT%WtR2Lfz9n+QYUm@x-$8Vh-fEBihT16v1t>cT?3(Mz z!O8vFyj%FW&0n?r{VgKZmMkl}<aO7EK&h#dHjaUF&*l4IG1}_ReZL_{3(})?rH%oaW}@7j9OX- z(d+jkj98mLL;zD}OGx2sIIf@He^!;S^T|w-MSXt%d*1%tCK8d@+g5wezt*AM((?Y9 z|J!?i<-aSMBsW%MsoUPIuQ!f60 z*A`f~+P{FVg&pY@C^J=qH+=pJZwZvpkLd%1`nCyV{&RpXQv0G^RCW5USKiwLs+2VP zwl@E>4gR&Q@-ww;4JUTt^(0p*mNoT<2wHJN1})^%=w-)>Y3TQep)G1FstU8#A!w!c zhg33~W`!iv|K7p=v2r<1ZW(=g8T{zN>vos`#9-`IEC*l=Y*F_4bUnStnv1WGVq0Ip zR}%0ML6oj6t>uzZ%w{{h`SrP#6Je> z2at9G2aa>&Cg!R5q;V!jqK$}XAA7T5m?%wVK}J2?R!j*}=vm{tm^xhUmyF2F{6sb~ zhxn%W#qV|GLzj`biG^n*Df@jG9>z_gde(jyFXKq}3bahL zp1zAbxRQ&_M=S#j%<54&zCnNiCju5}GHrZmAMKR7$OC1&bAmE-rx0i;6N0>xpbED@ zjkz0~k95nK32qA9Ea?E%RzBk#>xJmXR7jn*VO+sdTE=}~q7A&I+mj4RlNKNf!t#|C z`X5MS!}Rs^9<0VTcsG@c(BU-Y$J{BBeTm4p^Q=beSk3+p1M;sDh^ia?3`8RDf?4fo zQe66|RM^s^QO}GBolhm6T-WN1+(<*nS@2i)quyP6d`t^oQ{!kuH9eS&P-LdVVPV+l z3mMqpW%~mrDr>3BqO30_>+q65Nx50T>X4IkGn&%L{5!L6OoejG4~G`BSK4a4!hB_i z_+7Q}E@~S!oAOsvzOjnbW3?oaYh+F)+mK{j$y~Opl(&B`Mh#Wo5$s$ZzeyJi(~x%C z!|7M(W~xpKV!2|fVARSE9?Gg@3b#FQar(i2%L~^XagKsgv5%L7S?)TkN%_39)!aGy z`=w8nrSGq#e5THSodlg)BI83#^QTjc%fXO$)+3UW|7Q{^r?5M};O{btMXq>J>fX13 z0b6Z9O)uB>WYAJh?<3V3KqM;C^e%=i`ltf6sjd~#MYTMfQo~t8qx+6sYp~wS@xK(S zz_Ety7Fm!f=eKjGEo@@7clYyou+B)| zhmg*p$cRXzoGR!TmkDs_L|MvL9f9)O-i`QHr|=WHe6QZxmmQ(os^O?Ld@saT|LaRx zR@WP`rYo#7F1Jdba@x|k%2BY8=So?r(Vb%FmfmBldOuZFoc5I(71|wovQgc!W6I0a z8pmHX*u?y_x`@IGEF|No7Smwby`fDV;vd1Kj?JjkYja$*-qGqIFv=O@Lw|GnI&JSK zzL_IoXl*oua?8`dr$37G!y-=99pWZZJWbVg_ zA$$BHy7o~GR^z%9Rv8Q@PFE!IP+G+%P}j*R!@;Jh$MQJgx2Ab=?)c^A%j5R~OV9-e zq{%1cmNBdzBm#V+i=_*P`)6HwP0@Io`EvBX6QHGzMPIgfC^c zhp(kOD(BBOg=)bYN7EMy1hqkaTUXA>tp29TpO*Gt1`1bhk;w%Kod3IxNu%VMYyH0; z%)zbN(RQ}d_zgER11UaRS)cHS65$0Xim(%hZzzN+4l@p__I`S`SfC}cFM04CZ5ebk z_G_|f?2;nM44kf#$gvijL*<(>T{G7H#$crP)zM%zgp=B9_BUb~qjMuDzO;Jk!SuG6 zFhn;NhV4@}6s|=%hcynaObOD0#o=$Zz4c2t)XB1_i+ac7t7u%bI3Bcp_iZ$YX3=q6 zo)(do*UeJ%$JAh`aDlcP+1c+VH|rM3?}P^ajcLKNOAC&toAmoNW$OUb7m=*}GNH^q z-9~ayQpOUjMVt}RYGgs%KKMyH_0+P=l19)9DJoGlngKBcJ@jFC#0AbHieq|C?F;XU zNoIEoJfG(PuH9F3RM37B#WIr3@+ItB-NN3Cp&ZCGfg;_P;rgSdaAI&GPkz2CaEyv2KU}gpr-6Z5<|o0_s1S4o7_0Z8dE6T_o98r;YlYPK ze`;X(urt(!m^&cVva)dwOKm?TmhtxnxqdbJVGyvHx}kE`acN;m&32~~M~532+bSD5 z`z9%%&%12fW0yRz7Td2Uv;b=Ab~W;|N*I`iH>_OWC2my0#BK9uQf*6XlN!Ux`n zZ=thxkDyLFI~~bX`JM-QoqTr{B9HxMRfVZRR_!>u?-GKoD?=cbXD_Iq&6rqd^7IsM zPpX@}4=-G1O8{3*JnddRbyYocbUqtB7d2XE*NRBdm3clD!2@V)i4#xnaJZ#7bGAFk zWz`9cEwhC5X~*M<&A440n4*M~?^_tlVhw8bwS8j7ZxD06h^y({M=2{PkWLyK0m10y zQ_^@5jSbl%NEZ=2?|H_C33jR9)x_w0-HCO#Gf6~sy7+yTNBJ5OEE>3qDk@n{M4@bJNo9%TbC zDOn5$KzGtQHwShdqIs_?Ai(iPH?mazJb8}h)}9;u_}I1KnV{2ud}h=lcjSsU?8E0Xx~DgsgX za_?f(D*twusnWEav}P~25ByR4MRwEc4wKmDVM!IEAl z?Z*RbTyqYvy2>C5H`c^3ZJ(~$(wi8Zkew=~jk!tZw>N&>Vbo0M*=uhVOL~l6W&tcs z`emmzTOI$Iri>QRsDvEqn^D;F;dPWwSRMI(qri{n2NV&i-w6SwB3rM!zTsM!al9Fb$M!cFY(_s_1T0XYWU@qp+v$tF zAW>LOFmP#EbL2Ab7?436e9TW13r#xUHd4;zMA3eh6+}n08`~yy=%6`aO{|vThxBE$ z{qAIEYSh=ijHgSBSz%#Mu=s>Z9Td%j7RfpMvtc~8u3#RnGYj4rbb zsXVsLJQ%<$Q*YCCd_KJ%llqO%9X&MKc{R|mfZR!}4)bb&B3Y7@$UGV16K@;S-i0q( zd(TYw2rqR4S0kD+iHzTgXfK)5zHsVHXR7gc=DyVFg~K!Rd)Im|j0PHHazyzId($Dr z(mDnhJCa~7wW)Vc?gEu1hOD3D30=mtn4*PX0h_iNfW`pxurUvZW`7T#G5_$SHe^)u zm|Ss+hX?}5*;h);h2kb-O8Xis?ea+XG!eadRwGL`c}kf_aj(ZJDTrpF-Yh57V6;+J z4%p@+FIQe+A&b89ybZTc0|9S%4wcoCk5Bh=`Eervt{s1+JzcKD-Ssfzkp$;boFmSM@E=!=mORYYi9j>^#oHa0#)ZZjSkCiE|F z)|t_6`=(slXuXXq9&0I9T}`Z_Ru(<(z8TON{G`<>|G3OJ@1vsD`)W5=GSWGDY76Ug zsqLhDFZOp~t2@m|V67Mi&Izsq=@>C7_%+(VPkvE7+Y2zDx`uimN8$nxM^~h4HrG$u zf%ze>J>ApQ4X3b4V(FY&#qCpr&|V%1njH zb0Dbplh7S}yxD&vjHFckG}W&TCmZti;h|J_-KPVVXEArXNO+{U<+F#;-O`AsC2DdSAS`~DFx^lIk#zI+}t>+Y1 zfZt~a8eQNC6!1PNtd(guicS_P22lwkk3!r#R*N*ZbWReSH41q+f(&YeszZz6amI^< zb0Mccq66Wmt5RD=3q$0L&a4k_qrg{Lsrdvynw*+0&8}*GSC@h3B)Zs`LOK_RxEHIq z7y3+0I%hXVyRC^iXcdiEZw4)Umq*5772T;@D*(j>d4(_?d?HYXwLP^)g@=ctmr&2> zc3}5yeAcQ7u(~4WdkLRKp>gd{m^RTI_s=}=(^aMsW5DD0y)agv5W z@AHf>{n@8g_O#@?3f))-cRgTE6 zLJ#N@fEJlXB`*APX@9&Qn_LKUVs)J&+D$}Yb==sw}`XguOs2%`e0bNIHyn) z*Mz(NZ7shf{P#0Mn zplRf}@$5se+_9$vVRN@k=kjW(vj(rbqHO@Eq9_mXxkp#F2YYkTh9FUsCLBpr<84N#OV%xMIXa{Hbr18^7u_Wl?ggL?Zma!Ky=MoALpz6 zXAfLCpO0FMI5$|VRx)14@L_ioK!Wfz4fPN11R?adu@Fj?AL~3v%kIZU<50B`Flr}s zk3{swTUSA1&42m=?+1lU>00#!R3eGp>TWSXT5z4QD>VVH4MjuOC?cX5%@m#Hewog-Rh)T7td3rU@OZu`f?I=>o zU6(ZzHMUc`{Sp}SSRM@O$LJ(%M#WztX>F8}ZbBA#`i z)-K0&K<0T5R?EPk*{-;(iSyNJ)QnbS$TkrAI3TT7bX($9&p<9pYB$D{1U3ev`&DHH zmtl18STHuqe5a4q6p>z})CU(R%#)}jwhGNl!n1eX z68E|%w=W*wobs!b%>9I<>LqGpClr#Cwk(=0Sj#*=GUrvE_GlE_pifA%x);C2z`ZWm zqCROcuB)KLmz%>kp(tG`(^!I3XC!!D^DGj}@dR^fx7=KsSs1Cu96WH$R)*}%<=%Q1kM6zp1>5*>N{AaC8hWz98{3X`doi$?0&ES<&U1h7 zPJ!9v?OkHjC$={Y9S|;imid=WgS*q8oAxorT$clWpq&Bb*-gw9C7D zOMjCZWx&ecJg_|>yt(xi5gPB;X==AIY&+O}TF%@btNZm^tzyHE7^1VemlPYj59&Vk z%!Nl>t{m#)4rN!cHaBAK)_G+x2@B*S3+z}+liX$8X7r7jW-nDcMJ@nq-kfehnX$Jt ztc^XQfqFeD=`K2}QL>VD^IXZx`rK+5>}5kXNjs;qp!MHJK1zq})1^|6X^Igy0Y8o7 zyhBD(ZcdFT&Hr>`FkLtw?xj8Ml{q$jWt%vJ1;di&JHe+<(lWV%ct7Pj8#pf?ziN^A zHgR2KVVxvYwQYUglI`({E!`p}+T&)+hQpUn-$#Gl9E0nsTzbGQL;-U5)RG=XcfrRk@(+rLo-oY_Zwr%*Ey2NaY=e6OSBnD{!e z_+Mia=s4XkyXf6TF@4-H(2MKB)7s(4bW4BIN^76n1k+sz!-=!@E*>1!!b9%ZWmi+i zTD&w|4&9}=o{bFbw1y*e&5pB!V6y&_xf{-$pjIeJOKCUTq*5kJNCX0614^K_%qG-H zI6+W1;w$dF30X5Cm4Oco>&&wwC6wBJ)Trp6+|BU5FZOTS5}D{ebd;NOsd{x(n=RCu zYibU#`{5ZInaCV-L3I>Iw$3TS4ID=PI!>1(AR6*{!}VoSQ8u3zI9Xy-O&G2BpTN5@ zK|C6LE~bupH8F#};_Dfp{rUt@7q&BLfwXWDM>wTI82*+yV^?}HrQe1rc3FiMJ@zSC zMnGRW1}f&Rh`1DhNh2N>pFw*3z{BT*;_F@FZ2cu~-45@xy+Bwf>Ct4K{|3<4P0s1# zv@V<6d|UPj7*UkbnEgHHN76EKW|oc!ticDQWxj>N|K}0k?27J=x8pl3iJMqrs zD9Q!~WA9q`e0^AtBZdL~2@KhxRBwQzI0SmpdmN!mDM-E3^Z~h{*Ij6fX}6x_%PsCF zJ+`m*Bs7th($@W21g8iEJj?sM$#QX`9DFOIMQ1VHGdz0aN4MMUIRHG?J^(0NnufT@ z&v6SqD8-$O1sN=exK~F5F2)YFe~g#&?j2^z(?Jx|;_)A;*>=f+JbbRKLgMXcu?Hx0 zXK%4T0?Hq@t_s%Gd64ZD)$6_Vz(ZOb1o#ZN8e3UM(A|uh4PbG8E_$p*fkFo;%sxQL z?RMES6RJ1(7(qAeD=(b^4$PBd8aun$>J|6ZL+4LErFkAQ;%>5aS;Wko@E}z8ofQzm zpXUx_*I7icMEd3}f>Eh$xF1~kIwGo|VBqEfJioVJ#M}qA!S$%@h%yBcr^^%S89;Ej zGwe8Cw(E%YvquJ~_ zD!IdmclzXs?KOaP{i?UA$rJoyp7BlM9c{UPBC~Ah%h~yzZOw6!L@*6wcOW%YRoO4}dD7{EzHZ_ux})ebTz(x%)Ip-8 zwAs;uQXj2)K&s9eu=#N)>8=i6f-O`iD$u3=N`^f@xL!W%{>((48~Cqwe=n;xEUn{@ ze#%N$EzH)N=lll!*X(1eD=}Kg2B~nt8Gdch>XDsVAcei8J)fjn3&i#Ae(xC7qIR}N zQ%d$9Z+frZlM{Njn;ldjWlpPeGjTQT>Y;vmeyX5m)I=DC>&(%lHcIM!HE}BT-0hs) zvaP)YuW4C%VE3`^20YVCuJ`Gjn2rM_<@OVL?|Yz&dPRu4dcj@e6z4^!xXYIC)3ozT zl5cj59>uu?rkzqsDlVMml6G(d6jnG*DLX%85jGp^lOF&r^LOkqJod{wcf5YJc@m*6uqG!8ODX8W z$1{g(_B^plvyUb+ojh|04d+6%&upQhEN}|?dO#7AUFxLQ=q<@6bwz8O9fkDU)TdXO z4u$SMSZhjFxqJ@qm&i5giO$sMlv&rvh!S8oK&8Diwn@ zy+)^;{>CkG%Hc^$LGX7>2xd0{ z{cK}zLdcd$-Sh_BAhaPGuNi$mYyq zsN;VaRRg85dRo4$ODPp93y`Tx$N;{6CLPc=VD$qr6GulRZldQm3K{7(9bn$%n?cWR zsy`sNoa{w^puH%kiR3kuMtIvMMI~y z493Hwo%!*Rs-11JRWXBOF^NDnfX9fsXR%>%I-#Q^ZC{Z>Jz1ZZ$EauLQ%^aouTa#u z@h)w&oeAN&FV);Y?Cenlg6j2*1Xfg6Pl55E;qQ9Wzf50GZHW!MYG_PLM(j(2?wYMq zk<|&EE-WXK8QF!!(>LkS{GxpIV`Q!{=5u{VRw8w6iQZEu0+}$(I+n3q37XDh{ytTr z>l%E~=$S$nFL@8=0Y7KK2v?k;^Xl+j;`PZ1-JGO`$rQ2Sb0qJM_7PG#N`d9{v<7e^ zs4hk~>K`YcBCR`TETLju#`2c>C|urw;$tq<8s;R8SRsTuG1zs$N>xX%xr7}HnTjls z9!ocDtMJ!yGqCR#ZiehaQJj=>o20EKB`elE3fB@UyW8B|oC~#2X-bo5u2pt+_`H%`~2{S;S}^B=ZC9zIh`pkMQW5mYg}@mkp}?fyvA0QQ*uZ#;J@(p zbZ5^FeDOA#S;zsFbvl-w3*;OFC`3s(hm&PI5-xz`yw_a(J{Qa$h^@4-Nr8GV9B9?^ zm~8Mk8%gpx6t!~%`UFxpMW8lYwk1Yz*P$SW#}GMsSk!B&3|Y zz;obU+UAQ}F30&i_+<~)MJ%4v3)70uO?Y^aM3P8ou|V+e%T14lH)Qt!$edyWnCIZC zhsVF91vzgj9!aXu-SIra9GDg7XN%`(>LWe?OoNU;_tP~WauQ8Fqt0Yv$e*%(oN$x(vpYqIY*27Nu2IP$3MN?LgBQBDk6+m zp{jeZYTQ2xVrx^04U$2ANLqMeRTCZIi7LEa5zomXh~87kx>s}Z1b0Xht4C5#Qu3Fn zkIa4nM$b%5*gB45HKk=yxn4Ut98~bbW1=E8O@SmSP=dCYs8Dti9ITh7cqi+2ciJ9LThsAj8lNks4XE*^f z^o|QjQ#rDkYk1?sr8Jl)_y{-N<=cjf&VodU$+(FPe03ynhkEdQSZG83*&3-f zgdu4Z{a>Jc=g#Qd>rT4$2BB-YI*EqM{OG;bbDc9q60ur$%uSeV9lGb-o|RI~Xw}IK z$t0U7HPd1~^~5wtn+#k3SN`{x%=43~Uw#kpPCB5T04$iEu~s=w@V|Qc`$xA*3p`H# z<8@+x$~$B9vJHQeDn8LvM^2Zia~eb+P`w%}bJ6PHnMWdny`BgN{(!bXX-`G;P-ri{ z`|?#FI45e0#ALm5PWAF#j`j8=Zt#b<*jQKxmmrl>s=0sjF11()(BzAv@5RIC6tS2j z@Cf`qq<(()rI5RP(0|~_zHyf0bObQ0)FbAJ?Egxco`Ws;`5gfG?%~gTeLEn1&DX~I zJ#nxnTt7d2Lejvw0gx)^^kL*h)CuAjxB#{$PKOoDN-T2KN=9AvT{cC<2Vrp`bW2-^ ztb1Uix4o_BaofP6tPIR^u)~V5i-mmmjWnd<4=t9rmstXigzWV?49%IG{fB-`32&{_ zk`}HW{%6Pz(y*8pzrw888oB7k^wi?I9m}4f$sx@tNn!E+izz+Z5+5w>iZtU(2&BKK zr69WZo&V_Mz+_5$jyQ;_H}XYAS8$pj{3j~eK72D74RGZ|!ZX@BSD}C6X_MYH=PqxgD?an-AgtF+Rr1^W=M9Zgl+u3s`NO$S#NuCWe~@Cd>j(nQZ22gUdiY^yRHf zTA*@1I$0+R3XczO`KOmfdg-S+*2H*K@zNw9#C*g^SD2z>^4!Z5SU!l`x(M=GNwmf| z8RpMSla$&&JOoewg|EjN5*9w_TJS?hfQGIB_E`6*RIyo$4$Y>ga&y(`tFe|rbRS2=42^S)`Rn|Pcz!-LrVY?d(2W?CJ(8PBa)znJ@Zt?#*I&?; zvc>`0GAmWRGYROu_}P@6fBV?2F2|d}Xm1`(MCFlt;Q6{1>6jzHA z+3Q@0&xzl2>yb~wzmPdo>3TY%{=el8LR-otuhQ&2*E%`HlUeZq%+f8MIBut~9N1lV zvZvn+ha+i@9JII7zmSoyCbExv^QG>=n0_#Muahz6G5l9<%q_&JST@0;`;@troZwj4 z*X#4_xaHH%kQpre(!+WM$7SHt5ce~_*}nU!m-)Wfcn3_ab9(bV-+0Gn-jPp>0l$Ko z2r9;i5d07*fBD(FfA&N1hVR8ZL+q>ED2~n>Uvu-9d>%GkgecF(EiScGA$4W<~NozH-n|U65VX36Kj}Gz;8NR*8KbDJy#TvDM$Cen zbq?uFfCP-Z#&q`(F-HOr$%HK-D8;2h#Z0yZleQ83D4e!<>4Ad(*Rx1G1SG z!NwMt9=J)d_>Qo#8|PJo!sTCcQThw9C;;n}NpJs@tNI;lOnTtJG`9eMrWIy2#N&e#{4aEZhnN2)=6B_U1#X*TumuVFonZ$j^*zK%s~Q1)&*0|JR{=)) z1z79p%v7V_f?I&t#Sg^FkVx5jCj};&z_)I56o<2{pF#%k-3Z zThO-7zZmguz|)4O78W{s^CuMTDXC*Q+M~#p*`snY(AkPEL5`87PY68_=x^Lo0GvQ5 zQkQ$9Z*$|QS76)9``@zbEQ6c!OE+=t4exMEHf4O}-xRhMUQ2+klV(A@5tI{gLWC77 z1!5&`Z_x2|GV*81nZTY4Y+XfV|89l={+0hF<98)zS_LEm7Zc)xSMd}qz!Fr^X(!D7 ziO-WLjR^3FMU>0`{&l^AQv{a@%em8deLaW>Pyfcd>)leHmvc;sf$?JZ7d|eYz6u~F zoGn0J5m?KeOFYMF%ku#&a4sB|O#}Tvah|QQQC48yfOV;fb_0t(BQw$l1?MpfAcM9{ zRt%3teZyJ9`th_*R{#{^XNYgn5vY?%N3R>)%e&1YknfTRvj|-m&@_O2a*HIpYogYY=OB0efLo9fm$Ij=pFx-y^(r?O zs9`2;vFKzbSH^Fk>$&wZxM|AYe-{C#TZ$E+G}YYE^!DoAw^GSHAr`6)|L!#R zl>NuKgm7q4>lE=m!`^ZzxpkF9@fq_=UGYI|izN-{n(t=i-Ajdl4j(M^=K*|)RjJev z*J|MT-J1YXX5BHaBHWjd>lySj+pH~*NI^w{NX@(44*=uS`cZD*p3%V)2`ppDiBiQj z;V)rd;ReJLOj>h~5;ywO4G?IIVgJru8tnebzdpFo@U{ZSur`m))v>ZIbzhKRCOG$I zN|-2a+B?Qyo7 z?G!H`9>PQ^%v5rKU6NlURZQkN8Fnl3{f7}Mx%2_ALU!y2q419}_0!DeE8$bwkXDZk zHn-Zy@F@*xQ{)YoliQ6OHQxl5$(?%t#Khajuc5(f{GzakB@`RMT?Cfz1r2F@m$EHh zytSZQ6p;u5#sYL9Q5;AJx_J5{l<0k`ab-r4azITP4%6)jp7Z&-8#(n$`_IklTg7pYX36KqxE&Pse z36~$<0qX|Ng>2KzV(LchNVXc3B_6i!M4+O*P}2PD3OIJoS>~>|at@Ep@4kEZ6JI5A z73~C9$p}i=ZLjlVWn=PrKwZ9Uuxt=!2zwR&bq6f26mIgpFfLhYgB+m(pGJ~eKGziT zD~Y&-tvm>T^5EwZTN!!!)glhfy0B{_Kkvf!cYMEs+$1&Y?LF~eZU^;#C8^eGZO)!2 zUl7o3JSZ+1p_7kL4ohx_iRHsr#rw!65|WSsvIttB7uk#NS3!A!nT7Y5`uuR$x%Q;| zADFc+4MWRL_0k(My8UV+}i)tC`}cw7Tkat3Jn zgkXzIk3f*5)~2in&d*?5ycO$KkXZOwUpP(%ptT1D^&RSjNHe|zwWKKHDDXbgws~A4 z_3O-dPo0_x^(5D2uR-TFL9=0@)Iu%+X_DEN(lKF0KS)KMRltDPlt}DPfljIy#zkW$ zwuL;&S<#yr{StGt{L7bDmAdh-v+XPgOc*=X{Uw<|fuJs~<7P8d@uGYyj2ImJE_$)k%^8R(cU9K;Zv`!K?w=5pND!YN$@zvP{@IK#o zPS6<+ME@OOsi5k+bK*j@z-=(!>@z6qc=$=y5X zm>X|?JYGs#lxV#E*MLS(u|=Ai#DP%@L^dJlC9bT)v_M_6e#Rw2ngaKy%*anT=%= z7m8}}ClXjo%5y>Ibg_QKLuy|kD z$F|i|TJHcSpfkg==m)O5N-#fMn$8693i#%6ytFMz>rjx2j+ZZIwXXC^v}oU_{D zJ2THi3YpT*U1PanC)}Aq*>&EQxK->VioIYpS3*_{=$P^aoB&tna5KRRSbbOP{-BW+ zZ$x&m_JZ*Eg8A7XYD2P_Uw!`aj=K$9n>iK;3w#0{@gNi-Vk9jpPfYah!Uv$+ zD_z1RF|W6bkuXJBJ?=mLEbsur$<2g#)})PVhL~cL@3J&&4PK3mvxOmNp+vpoGaNLU z=JRI8_sC(cC1VxRD0w$=)>^LM$V7G-)J3rA`T_*bAtg@xog9ge0x8Ct#5E)L+|rRy zphT0>e@R+WWT8|(KSQ3#DtNlujLGFpv{D~TW`1+|_~$uedS2l5 zO{xVK0uHOke@T^CrU$N^S$a%dyAZ;I_*T?_GYECgeizb&DBr213*dE2nEs!YJwX4f z)EPug-47dAV7=6 z@cR)4FM_e;@oBZBra= z*MEeWNk?*FEv>yBY4Gy;KTn`Pi%%Z<#qk*_;rg$BRL z1W08H?>LaL?anZjOh zZcc=GmL*etGcEw1H0w8m*hd$cta8kGbeu9ol%K<+ zkRYE)s}^mpW?Z0}0xEqp7u<{(1OB zPsvj83QS8>S(8sqZ;bR|6KiAjd%08%+SNjdy^C#9le((-3PAZE}M0k*Amh%>Gj z=z6Y^+ar-#0+3a5e0A(c6Vz@;#p{ts)evPZPz=K*D(s{gfBL*5IMk)ZYe;DV?nly3 zKillrVyD1dT%1|7-SnB`A+L5t7BNP}{b+fQ=4Q@jF$hPcui-*|V)e8debj`y*zaLN z&c)L|+x+yQ|6V@*N5*p`RcXbl@Z{ibF2W8;fk9K}gqmr%4r6Z1O^j=SiEa0zAEM#S zP`Yz@A44I$Nn_MZ77vG#l2|;w<%*Kvxny+4>|$rzu9Mp1$xSsh#O35p3!@oJfWlJL zJYTfp5f(MsAQOorQ7tPa-=4R0Fi3kt+YDDsWcoO%4=1s=d+U*B7U#UY{8xoxU%5ONlTDbpD^D0HHQK=&I7u;fwj+i4!+0pD zyK=1dmtz{!XZ2gW&dF`hdrQ{f`I8C}TMuu%&7ux_#m@FH)1b*GGqZ zdWQbUldy2oEl?<3#HfY_Z{CE|io$tZnjIYv6+G-q@H2(vUL+LR3c*XyPhY(3 zagtp)+>Qi^xTQ`X2a^Gx8geV=S9uJmk7U6Fit97N+w3GlTY8y|!1jOSVIc1DWtI0Z z)P3p>ZiAEN=h>yUk8w7R4sg3Ko+M_^P=&!$!)ZIZ3=wvDgB-Nn3)F2#au5Lp&YSu9 zs1naw`83nm^^6vkNW^r9&P$~>$98Q1E2ERmd|YwVQ_r_Hfh_- zWqa{9j4i1e_I(tJL#!;5{I>P?=_;G@srB+&@7)pDt(Se$tS^qBpmhq7tV z%Xp$s1Yi6Zs~Hw{adLr5k6D-N4CY;c5C z7alLL>v#u`R+#|S=}j-V*@Yp4Z{6t?MnE{E7%P`kgx#|8@>dG_fX&~B1=ZN-A*6if zD?>2wc{^Qh0W+qNQY^26s!>s9Ao<@Y0~0Hp2#anYOSqZUJ96LJy-fezVp-kX%o}=!imw3A5j^&!8RWaN@-|YYhSSC3KZiio6<5s zn9n@H+g4T$i(Y&z`;1~1)tmk8>ETh|gS<Mx6xQ~12|lX3S~TTWwXZ2qp3gP zQ;Jtl{{RQt4dXXr%=|GN4hKNz{aP>k+_4IeCBq1BiH|VaT6em>`a^v+%dF1JbS}Um zQ*k6|xc~RCQG^l<00PxepQjU?LT_dhCz{tI#tJH)^b6PPrjFz!2r2oZ#B!(0R+p$x z86g`3j{9y#WjPS5?upSOG8T@Nv5+N*>R}rvK*(Ha9f;&t3vJwTYxWM)nxEi-3Lot| zdv22DIoV95SuMqMA^I?o`uQ@~{Dg>r*KX3ztYCd7{RVrZy7~fPALsXUq?m#jEl{+! zB&;MH1MNB$Y18hQpK}a3*7#ex=0*cg#wpj?5y~RI3=r!lt`cq8248nO6p5?Z%!Gn2 z0UG(pk#!Be1B`HDk1B{6?|^8XJrrUxRSE@$S={Cgl=9?qLl%5M4eAcA=Rg<{o^FC; z!W~pDx;d)G`O`*)N;|!RGEu~Lce3EI>R9n=WCKMJwn(mL70dtz0EM_bMsjqGtAS0w z`h!XYae%R+9q_T->&es779T#WP2>sVRB0IznubuuceQQo8ogukHS)k6+3s7wLb_K< zmuH}P)<|FEdhd`^0QC)ij{w+<254bZ{PZ@O$8}p>7F4Y@wuf4vZwA=UFh8E09?u=KceMTC!_l4dehr7TV;)El zxCSHz^|XA8%(Fo-9p0ZHsg96^63a&XX0FwnIGa2!p29wjzIDTMUSjSZE&crLa>V7i z#AA78S2l$ezmujbv`=%&yU#@1LVMP&Y1UKo_IM1^4e7wRyQIDGa_Wx9BChk$HG84D zA)I?X_feZZ6!cb%3FH9=pBnXmUk^#AzA~NawY)M1IDGGLPkhz< zYD-j zaFM87k4MxJ9B&@~m(u)5sQF(o%y10fCVF4Cjg>Xn!Foo@y*Ee{Q5)%#bSdLvGka@b zVEoL4z?j8M@H@<(sQ?3h2YBrWrs=c7AvYDTB&58GoMRBjVfd8q#ttJ(#A(wL_r$2b z8tGeSMit|HmKCfU!4btU1`!||)lFI0ffv~KtT73tpr6GLt!!#<9b8js9u&KX(l zw6H<50?jd$f|jr*#Lrnv3;q6VrU6`wD3F&$P<+98cW~vd8vH<#UE!1;g$%J@COY{b z=VAkCpMWj8U{T$Sm$WU<)20Q8C%`xkIfP!-($aMWEa$tMcR*dhuy-OYp*h)tr-b2d zF49d)C@&n5Z-bKHZAVnLt=X$IHKm4op?*tFFHH!lvtW^H0Ln&82iH`HCAwLvE`>XO zk#8XUJUem{6DSuh$%@=4SN`wtE-)LPR3qp@gqGSOlnJ{@Tfb_|b)jqF)8*yM~!8%{txu)wE4)a_a&N(>inM0@&7>P0*=fn4G$8R%_irk?)w2Qr(*oMCcV{!DHO4XF3 z*|=<&e>+p`=v7%qBO^T6hW^9;tpDo6fuNP{Oy*btp+Rq1*^4v9GIIa`m-`+pkr z*q~p9bN3_u=#O*K#86S1XVJ@}J*<*lOr9Aco{ZrM03KAt$wSF#QfP!YqvJ+0k=A=) zfOXo6&2a>ED*BMa$bMbr$PCT`@MwY`PIN)6Qya1E;AuCf`Zc9IM#4i1rX7=@R^{&S zP3lADsdekg(TE~u=w|&)kF%F4wm|u8lXQ;YbG$EN4uvp)J8Ko=a^2DjUEl&-JvCw z^eK(wOtA(BM0@7E{Do^B4mW;d4Jo@u{XuRiG!LXr>l)!xtd$$8+2MNIPd(R@bd5WESY$%7?anwjukz-8Z z+Ji-z@<91~w~II>gdz@L$^9YM+i)mkK<2XYmZ@8t{{9kDv>`E$?r?nE%+sy2hf7R! zOjh&#k2tc);S5;Z;jigwnEkj_V~Ef?;nwNQIMiTcOTEnKaO4~AuHgbHui#PrYk;j* zS-Za2e~tCXp!atZuDS$He2qPH;>y9G^FW}DrrsmgLOIX$0bBJT*vK#T9zOMm&`F{Y zsp*A|Oc_~4>h(;(YX%9J!EXD2s9>t|IUM?!QWF)zrIcdDlTOo#ZcZ-Hg9kmg-y8l_ z%>qu^nP|kR6EcDY%&O?I)iNx_be$xS*C|OK56B$La3W=ZqX6pMEFpSsi4I`#YM#Sc z7cs8Yfi~MF^JF58KK__laey&%Qblmab2`5!aIgUHtV+2>a-g@ zksAX2G(taL?|mEGezj-hrE%=<7rEQ#-Z_}LIgGe1u2G#%Ytbq2XrNE%L%kvEj=R@R zu|s?peksQhd})dErH^2QMs?bSkjSy9q$S3G|o_pBhAHO(OL#7>kMPliMJCUYx?gG z;}~%CFVno)auA+-B$dnpPY(9T;w9|4Iy<8A>)^Vlb80=ttfcwGA({BqHlMfNBDOu& zNYwVMta!Pw5ND{OUdBA4tT9{`2kLZ#7##J&8w;^l^dPL$Q?sSV7B-?@s6I9;byL5} zh}Vl)YM3#~F-R&&r$raRGqFr#nX{m-k2#9Lg7g7r-i3&AfzmV3^4qEYxdG4Y=^pPC z1CMhdDq_huK`2zxb1E8RdDJy$@uogXwD&z>ippV%gmRA#-QO2es8Tf8jsu;J@iiP1 zj!K)UPs9OzuwD;gjDy4G#m~GN{+{T0QD{6J4Isv}>m4L|SQWqq(_m&Sy`r3ho^d{8 zsXwUC@*}1Ap=g?Btl9s>^C|FqUlY za-8)I|MY2&jg1@`g!PO?!);iSBM>UyPpKNx)^}un7}gyrI)`8DA;b}hx~MB}B20(d zRX}j%so3<<3DM~YpbNw@16?^6wJy{ehhTB)v7MCLQcI4E^=z@~9seOwv3@i}T#jAw z&`zBK&MT#&9%QCEh_VS;?nlT$t;cwZ96ARb-}*Mi;=3wK#2)9u7D}e1EX*liX=@s- z(l{(FR`0+g&Mr`L+u5MfQru+kfkUELo5V1T$gx^zk-(?-U6 z2Jpi!2uVheAZg2DPBqO9c^PT(@;P>s!I9ZD5bH9~*+5V)ag1^OF-1gVhj=gM>6KJ@%lF7Mb5Dd*-xpNdSQ9b}?0j8Pl!5Jj_QZl9u9}0aG8I zClhVe5Hf^bR%%_>HqV(KQ56OdiNN;Zh=7^9Wqvy0I4QljMKbnsW**>1KdB0ph7zIH zw`f8m5sy|R=0ko0^-K$}(N9Cxs1@uFT%hL5gK5#kplE6(msTvXsXr6*C%Z6C+YyFx zu?t9QC`5H*b{N-Lh-U5M8EOR^*BERX+GidRo}(CdXRBK00vohsF1`8 z3mh#qOwV@asVEguG!qbi0+HBF%O+H`2>e_QhxctGLEV}_BUT97VbalBcGG(BeRJe8m6VzxD`Ynb4A`bK{gSpnT6na;6Bol;wE3uaJzL{ZsLO6b8&sDmRt|#u~MeRT)QRdl5sh1 zwt33P#+hl@Qs(kRWT1PNhTFomI(|)^w~@-w^_s;4v>_%YCm-zep2url(-7UBkJx zqrf)&$%AFHaxdbNK89#jL`1suJdO z$l#5xtcU3>lJMFJsY}+3Ykyep1?gwJnb!@tV(H@K#a^-gd~pU3kY| z$*fOHYo^Q5M-y9{5J(b`Pp>Fq4G4ozpYo|%Td_Md;4c?pcQkP{`VK-jxs7~hi{+0T z*k@7fR43nf{WRAr7rAQ1epb_$^Zu76*e$)y=E2KiW_`0sqajlZMwf@kbJDsQjp7 zGPa1#F0qF1wOHe9b-yZ0X&X}b1^(nm^cT)*?EfLxv!zObT#lAL-ocvAMI~kd8?`-t zlaINJdov}$Hwvj{^yl(~6A1SKH8cB82Qjw1jcJw8915s6**wM6uQ3`3dmpEirwh{k66DJ@1?edN zrE8+VI!{CC^S7v6UAPb(A!ALUfD{ltpTcW&<-&oHCQyZ%Vcsh>*gXT}_)6n&R@_e1 z6*-+Q8aKM_-g*Mh3T^NGGc}=Xv@^-`t9;q&Q;>DIZ0V4Lr75X zJwK*6ElOwcwF2>ywq^39XuM)~#+K<_-F)dk^ba4EPJVcJ@tc*nFFSFV^ytct0n_hteLSbV14V! zsFVlIO$KAt&_Nnir`;8*y(2sS^v38y|6z_Y1QBl_ORLaY{L4TK!`u-BidnT}y~3gI zmRy|v?tOXr%m4UNRZ4wrSw?LxH{PlVdMPflDGlO|-WZ^nolPoo|rBsCoH4OY&s=m;RHlwI`0RJSKBw%c0#P3@uoF%n9T{nz0 zG#SQHJn5o=H2>El1a5>)zJ#I#OAQotg9M@+{Gge_VqcJB0;y6Sx z)F+1Ga2*)n;c9&znn>La9jY5M?4*F%o7%GF(3S_T#oS-B%dRDQD!%M1VJcNp4AdJ}y z!CTjZpzmd>cGkKRL+XQ-oG~nfbYC)bnscm+G(}P(G_k}%rsL4{<=*pQC0HAY-*V$t5c*oEIg(c_*Q%D zAjK;`o)|3Jtc)s1c{NSbeamON9x@hEPC{pXtRr;$Md}$2?wOeswL9V*aNneOJXJ+5 zqC{b=hA-ApnaARt?gx*JisagjjyWYR;;mvrKbDY))kc+eXw`>M#KQ%F z!_njZQ(OB#`Hz>4$)Ent7w18)^Q8*e{~7S!A@%4*9g8SCT&SU!ygL}>eT=iZ6E9W} zuOPKTi=Wy}!cFMxRk!r?6WU9D ze^vvVMhdIV8<0i{(9cHw&CHe3xY`c2XCytGmpTV@i$$*ja>I20zu{vv#jE+u-8D0{ z?^<#7dwO9CNpoofK2lYMea4$%4eBFwa41>3&i4M7-lsLy`=E(>8AN9Ai}q)yF=Q2vdg Date: Sun, 18 Dec 2022 16:34:06 +0100 Subject: [PATCH 32/40] =?UTF-8?q?=E2=9C=A8=20Add=20playlists=20playback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jellyfin/jellyfin.search.service.ts | 29 ++- .../jellyfin.stream.builder.service.ts | 4 +- src/commands/play.comands.ts | 153 ++++++++------ src/models/jellyfinAudioItems.ts | 197 ++++++++++++++++++ 4 files changed, 310 insertions(+), 73 deletions(-) create mode 100644 src/models/jellyfinAudioItems.ts diff --git a/src/clients/jellyfin/jellyfin.search.service.ts b/src/clients/jellyfin/jellyfin.search.service.ts index 873bd12..dc3a56b 100644 --- a/src/clients/jellyfin/jellyfin.search.service.ts +++ b/src/clients/jellyfin/jellyfin.search.service.ts @@ -2,9 +2,11 @@ import { Injectable } from '@nestjs/common'; import { JellyfinService } from './jellyfin.service'; import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; -import { getSearchApi } from '@jellyfin/sdk/lib/utils/api/search-api'; import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; +import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; +import { getSearchApi } from '@jellyfin/sdk/lib/utils/api/search-api'; import { Logger } from '@nestjs/common/services'; +import { JellyfinAudioPlaylist } from '../../models/jellyfinAudioItems'; @Injectable() export class JellyfinSearchService { @@ -20,16 +22,39 @@ export class JellyfinSearchService { const searchApi = getSearchApi(api); const { data: { SearchHints, TotalRecordCount }, + status, } = await searchApi.get({ searchTerm: searchTerm, - mediaTypes: ['Audio', 'Album'], + mediaTypes: ['Audio', 'MusicAlbum', 'Playlist'], }); + if (status !== 200) { + this.logger.error(`Jellyfin Search failed with status code ${status}`); + return []; + } + this.logger.debug(`Found ${TotalRecordCount} results for '${searchTerm}'`); return SearchHints; } + async getPlaylistById(id: string): Promise { + const api = this.jellyfinService.getApi(); + const searchApi = getPlaylistsApi(api); + + const axiosResponse = await searchApi.getPlaylistItems({ + userId: this.jellyfinService.getUserId(), + playlistId: id, + }); + + if (axiosResponse.status !== 200) { + this.logger.error(`Jellyfin Search failed with status code ${status}`); + return new JellyfinAudioPlaylist(); + } + + return axiosResponse.data as JellyfinAudioPlaylist; + } + async getById(id: string): Promise { const api = this.jellyfinService.getApi(); diff --git a/src/clients/jellyfin/jellyfin.stream.builder.service.ts b/src/clients/jellyfin/jellyfin.stream.builder.service.ts index a2a61ca..41741de 100644 --- a/src/clients/jellyfin/jellyfin.stream.builder.service.ts +++ b/src/clients/jellyfin/jellyfin.stream.builder.service.ts @@ -1,15 +1,13 @@ import { Injectable, Logger } from '@nestjs/common'; import { JellyfinService } from './jellyfin.service'; -import { getUniversalAudioApi } from '@jellyfin/sdk/lib/utils/api/universal-audio-api'; - @Injectable() export class JellyfinStreamBuilderService { private readonly logger = new Logger(JellyfinStreamBuilderService.name); constructor(private readonly jellyfinService: JellyfinService) {} - async buildStreamUrl(jellyfinItemId: string, bitrate: number) { + buildStreamUrl(jellyfinItemId: string, bitrate: number) { const api = this.jellyfinService.getApi(); this.logger.debug( diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index dbc030a..ce23dfb 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -21,12 +21,14 @@ import { TrackRequestDto } from '../models/track-request.dto'; import { DiscordMessageService } from '../clients/discord/discord.message.service'; -import { formatDuration, intervalToDuration } from 'date-fns'; import { DiscordVoiceService } from '../clients/discord/discord.voice.service'; import { JellyfinStreamBuilderService } from '../clients/jellyfin/jellyfin.stream.builder.service'; +import { + BaseJellyfinAudioPlayable, + searchResultAsJellyfinAudio, +} from '../models/jellyfinAudioItems'; import { PlaybackService } from '../playback/playback.service'; import { Constants } from '../utils/constants'; -import { trimStringToFixedLength } from '../utils/stringUtils'; @Command({ name: 'play', @@ -51,8 +53,18 @@ export class PlayItemCommand executionContext: TransformedCommandExecutionContext, ): Promise { const items = await this.jellyfinSearchService.search(dto.search); + const parsedItems = await Promise.all( + items.map( + async (item) => + await searchResultAsJellyfinAudio( + this.logger, + this.jellyfinSearchService, + item, + ), + ), + ); - if (items.length < 1) { + if (parsedItems.length < 1) { return { embeds: [ this.discordMessageService.buildErrorMessage({ @@ -63,15 +75,13 @@ export class PlayItemCommand }; } - const firstItems = items.slice(0, 10); + const firstItems = parsedItems.slice(0, 10); - const lines: string[] = firstItems.map( - (item) => - `:white_small_square: ${trimStringToFixedLength( - this.markSearchTermOverlap(item.Name, dto.search), - 30, - )} [${item.Artists.join(', ')}] *(${item.Type})*`, - ); + const lines: string[] = firstItems.map((item, index) => { + let line = `${index + 1}. `; + line += item.prettyPrint(dto.search); + return line; + }); let description = 'I have found **' + @@ -87,22 +97,11 @@ export class PlayItemCommand description += '\n\n' + lines.join('\n'); - const emojiForType = (type: string) => { - switch (type) { - case 'Audio': - return '🎵'; - case 'Playlist': - return '📚'; - default: - return undefined; - } - }; - const selectOptions: { label: string; value: string; emoji?: string }[] = firstItems.map((item) => ({ - label: `${item.Name} [${item.Artists.join(', ')}]`, - value: item.Id, - emoji: emojiForType(item.Type), + label: item.prettyPrint(dto.search), + value: item.getValueId(), + emoji: item.getEmoji(), })); return { @@ -148,10 +147,6 @@ export class PlayItemCommand return; } - const item = await this.jellyfinSearchService.getById( - interaction.values[0], - ); - const guildMember = interaction.member as GuildMember; const tryResult = @@ -174,51 +169,73 @@ export class PlayItemCommand const bitrate = guildMember.voice.channel.bitrate; - const stream = await this.jellyfinStreamBuilder.buildStreamUrl( - item.Id, + const valueParts = interaction.values[0].split('_'); + const type = valueParts[0]; + const id = valueParts[1]; + + switch (type) { + case 'track': + const item = await this.jellyfinSearchService.getById(id); + const addedIndex = this.enqueueSingleTrack( + item as BaseJellyfinAudioPlayable, + bitrate, + ); + interaction.update({ + embeds: [ + this.discordMessageService.buildMessage({ + title: item.Name, + description: `Your track was added to the position ${addedIndex} in the playlist`, + }), + ], + components: [], + }); + break; + case 'playlist': + const playlist = await this.jellyfinSearchService.getPlaylistById(id); + playlist.Items.forEach((item) => { + this.enqueueSingleTrack(item as BaseJellyfinAudioPlayable, bitrate); + }); + interaction.update({ + embeds: [ + this.discordMessageService.buildMessage({ + title: `Added ${playlist.TotalRecordCount} items from your playlist`, + }), + ], + components: [], + }); + break; + default: + interaction.update({ + embeds: [ + this.discordMessageService.buildErrorMessage({ + title: 'Unable to process your selection', + description: `Sorry. I don't know the type you selected: \`\`${type}\`\`. Please report this bug to the developers.\n\nDebug Information:\`\`${interaction.values.join( + ', ', + )}\`\``, + }), + ], + components: [], + }); + break; + } + } + + private enqueueSingleTrack( + jellyfinPlayable: BaseJellyfinAudioPlayable, + bitrate: number, + ) { + const stream = this.jellyfinStreamBuilder.buildStreamUrl( + jellyfinPlayable.Id, bitrate, ); - const milliseconds = item.RunTimeTicks / 10000; + const milliseconds = jellyfinPlayable.RunTimeTicks / 10000; - const duration = formatDuration( - intervalToDuration({ - start: milliseconds, - end: 0, - }), - ); - - const addedIndex = this.playbackService.eneuqueTrack({ - jellyfinId: item.Id, - name: item.Name, + return this.playbackService.eneuqueTrack({ + jellyfinId: jellyfinPlayable.Id, + name: jellyfinPlayable.Name, durationInMilliseconds: milliseconds, streamUrl: stream, }); - - const artists = item.Artists.join(', '); - - await interaction.update({ - embeds: [ - this.discordMessageService.buildMessage({ - title: 'Jellyfin Search', - description: `**Duration**: ${duration}\n**Artists**: ${artists}\n\nTrack was added to the queue at position ${addedIndex}`, - }), - ], - components: [], - }); - } - - private markSearchTermOverlap(value: string, searchTerm: string) { - const startIndex = value.indexOf(searchTerm); - const actualValue = value.substring( - startIndex, - startIndex + 1 + searchTerm.length, - ); - return `${value.substring( - 0, - startIndex, - )}**${actualValue}**${value.substring( - startIndex + 1 + actualValue.length, - )}`; } } diff --git a/src/models/jellyfinAudioItems.ts b/src/models/jellyfinAudioItems.ts new file mode 100644 index 0000000..c358c19 --- /dev/null +++ b/src/models/jellyfinAudioItems.ts @@ -0,0 +1,197 @@ +import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; +import { JellyfinStreamBuilderService } from '../clients/jellyfin/jellyfin.stream.builder.service'; +import { Track } from '../types/track'; +import { trimStringToFixedLength } from '../utils/stringUtils'; + +import { Logger } from '@nestjs/common'; +import { v4 as uuidv4 } from 'uuid'; +import { JellyfinSearchService } from '../clients/jellyfin/jellyfin.search.service'; + +export interface BaseJellyfinAudioPlayable { + /** + * The primary identifier of the item + */ + Id: string; + + /** + * The name of the item + */ + Name: string; + + /** + * The runtime in ticks. 10'000 ticks equal one second + */ + RunTimeTicks: number; + + fromSearchHint( + jellyfinSearchService: JellyfinSearchService, + searchHint: SearchHint, + ): Promise; + + fetchTracks( + jellyfinStreamBuilder: JellyfinStreamBuilderService, + bitrate: number, + ): Track[]; + + prettyPrint(search: string): string; + + getId(): string; + + getValueId(): string; + + getEmoji(): string; +} + +export class JellyfinAudioItem implements BaseJellyfinAudioPlayable { + Id: string; + Name: string; + RunTimeTicks: number; + ItemId: string; + + /** + * The year, when this was produced. Usually something like 2021 + */ + ProductionYear?: number; + + Album?: string; + + AlbumId?: string; + + AlbumArtist?: string; + + Artists?: string[]; + + getValueId(): string { + return `track_${this.getId()}`; + } + async fromSearchHint( + jellyfinSearchService: JellyfinSearchService, + searchHint: SearchHint, + ): Promise { + this.Id = searchHint.Id; + this.ItemId = searchHint.ItemId; + this.Name = searchHint.Name; + this.RunTimeTicks = searchHint.RunTimeTicks; + this.Album = searchHint.Album; + this.AlbumArtist = searchHint.AlbumArtist; + this.AlbumId = searchHint.AlbumId; + this.Artists = searchHint.Artists; + return this; + } + + getEmoji(): string { + return '🎵'; + } + + getId(): string { + return this.Id; + } + + prettyPrint(search: string): string { + let line = trimStringToFixedLength( + markSearchTermOverlap(this.Name, search), + 30, + ); + if (this.Artists !== undefined && this.Artists.length > 0) { + line += ` [${this.Artists.join(', ')}]`; + } + line += ` *(Audio)*`; + return line; + } + + fetchTracks( + jellyfinStreamBuilder: JellyfinStreamBuilderService, + bitrate: number, + ): Track[] { + return [ + { + name: this.Name, + durationInMilliseconds: this.RunTimeTicks / 1000, + jellyfinId: this.Id, + streamUrl: jellyfinStreamBuilder.buildStreamUrl(this.Id, bitrate), + }, + ]; + } +} + +export class JellyfinAudioPlaylist implements BaseJellyfinAudioPlayable { + getValueId(): string { + return `playlist_${this.getId()}`; + } + async fromSearchHint( + jellyfinSearchService: JellyfinSearchService, + searchHint: SearchHint, + ): Promise { + this.Id = searchHint.Id; + this.Name = searchHint.Name; + this.RunTimeTicks = searchHint.RunTimeTicks; + const playlist = await jellyfinSearchService.getPlaylistById(searchHint.Id); + this.Items = playlist.Items; + this.TotalRecordCount = playlist.TotalRecordCount; + return this; + } + + getEmoji(): string { + return '📚'; + } + + getId(): string { + return this.Id; + } + + prettyPrint(search: string): string { + return `${markSearchTermOverlap(this.Name, search)} (${ + this.TotalRecordCount + } items) (Playlist)`; + } + + fetchTracks( + jellyfinStreamBuilder: JellyfinStreamBuilderService, + bitrate: number, + ): Track[] { + return this.Items.flatMap((item) => + item.fetchTracks(jellyfinStreamBuilder, bitrate), + ); + } + + Id: string; + Name: string; + RunTimeTicks: number; + Items: JellyfinAudioItem[]; + TotalRecordCount: number; +} + +export const searchResultAsJellyfinAudio = async ( + logger: Logger, + jellyfinSearchService: JellyfinSearchService, + searchHint: SearchHint, +) => { + switch (searchHint.Type) { + case 'Audio': + return await new JellyfinAudioItem().fromSearchHint( + jellyfinSearchService, + searchHint, + ); + case 'Playlist': + return await new JellyfinAudioPlaylist().fromSearchHint( + jellyfinSearchService, + searchHint, + ); + default: + logger.error( + `Failed to parse Jellyfin response for item type ${searchHint.Type}`, + ); + null; + } +}; + +export const markSearchTermOverlap = (value: string, searchTerm: string) => { + const startIndex = value.indexOf(searchTerm); + const actualValue = value.substring( + startIndex, + startIndex + 1 + searchTerm.length, + ); + return `${value.substring(0, startIndex)}**${actualValue}**${value.substring( + startIndex + 1 + actualValue.length, + )}`; +}; From 1a1e12506f41989d9ab44e3e6fc2b6153e5d1e5e Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 17:46:31 +0100 Subject: [PATCH 33/40] =?UTF-8?q?=E2=9C=A8=20Add=20album=20playback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jellyfin/jellyfin.search.service.ts | 41 +++++++++++-- src/commands/play.comands.ts | 17 +++++- src/commands/playlist.command.ts | 2 +- src/models/jellyfinAudioItems.ts | 57 ++++++++++++++++++- 4 files changed, 108 insertions(+), 9 deletions(-) diff --git a/src/clients/jellyfin/jellyfin.search.service.ts b/src/clients/jellyfin/jellyfin.search.service.ts index dc3a56b..b9776d6 100644 --- a/src/clients/jellyfin/jellyfin.search.service.ts +++ b/src/clients/jellyfin/jellyfin.search.service.ts @@ -1,12 +1,17 @@ import { Injectable } from '@nestjs/common'; import { JellyfinService } from './jellyfin.service'; -import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; +import { + BaseItemDto, + BaseItemKind, + SearchHint, + SearchHintResult, +} from '@jellyfin/sdk/lib/generated-client/models'; import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; import { getSearchApi } from '@jellyfin/sdk/lib/utils/api/search-api'; import { Logger } from '@nestjs/common/services'; -import { JellyfinAudioPlaylist } from '../../models/jellyfinAudioItems'; +import { JellyfinAudioPlaylist, JellyfinMusicAlbum } from '../../models/jellyfinAudioItems'; @Injectable() export class JellyfinSearchService { @@ -25,9 +30,15 @@ export class JellyfinSearchService { status, } = await searchApi.get({ searchTerm: searchTerm, - mediaTypes: ['Audio', 'MusicAlbum', 'Playlist'], + includeItemTypes: [ + BaseItemKind.Audio, + BaseItemKind.MusicAlbum, + BaseItemKind.Playlist, + ], }); + console.log(SearchHints); + if (status !== 200) { this.logger.error(`Jellyfin Search failed with status code ${status}`); return []; @@ -48,13 +59,35 @@ export class JellyfinSearchService { }); if (axiosResponse.status !== 200) { - this.logger.error(`Jellyfin Search failed with status code ${status}`); + this.logger.error( + `Jellyfin Search failed with status code ${axiosResponse.status}`, + ); return new JellyfinAudioPlaylist(); } return axiosResponse.data as JellyfinAudioPlaylist; } + async getItemsByAlbum(albumId: string): Promise { + const api = this.jellyfinService.getApi(); + const searchApi = getSearchApi(api); + const axiosResponse = await searchApi.get({ + parentId: albumId, + userId: this.jellyfinService.getUserId(), + mediaTypes: [BaseItemKind[BaseItemKind.Audio]], + searchTerm: '%', + }); + + if (axiosResponse.status !== 200) { + this.logger.error( + `Jellyfin Search failed with status code ${axiosResponse.status}`, + ); + return new JellyfinMusicAlbum(); + } + + return axiosResponse.data as JellyfinMusicAlbum; + } + async getById(id: string): Promise { const api = this.jellyfinService.getApi(); diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index ce23dfb..dbc1140 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -190,6 +190,21 @@ export class PlayItemCommand components: [], }); break; + case 'album': + const album = await this.jellyfinSearchService.getItemsByAlbum(id); + console.log(album); + album.SearchHints.forEach((item) => { + this.enqueueSingleTrack(item as BaseJellyfinAudioPlayable, bitrate); + }); + interaction.update({ + embeds: [ + this.discordMessageService.buildMessage({ + title: `Added ${album.TotalRecordCount} items from your album`, + }), + ], + components: [], + }); + break; case 'playlist': const playlist = await this.jellyfinSearchService.getPlaylistById(id); playlist.Items.forEach((item) => { @@ -209,7 +224,7 @@ export class PlayItemCommand embeds: [ this.discordMessageService.buildErrorMessage({ title: 'Unable to process your selection', - description: `Sorry. I don't know the type you selected: \`\`${type}\`\`. Please report this bug to the developers.\n\nDebug Information:\`\`${interaction.values.join( + description: `Sorry. I don't know the type you selected: \`\`${type}\`\`. Please report this bug to the developers.\n\nDebug Information: \`\`${interaction.values.join( ', ', )}\`\``, }), diff --git a/src/commands/playlist.command.ts b/src/commands/playlist.command.ts index 4d2aeb6..138db8c 100644 --- a/src/commands/playlist.command.ts +++ b/src/commands/playlist.command.ts @@ -56,7 +56,7 @@ export class PlaylistCommand implements DiscordCommand { return point; }) - .join(',\n'); + .join('\n'); return { embeds: [ diff --git a/src/models/jellyfinAudioItems.ts b/src/models/jellyfinAudioItems.ts index c358c19..5e83f15 100644 --- a/src/models/jellyfinAudioItems.ts +++ b/src/models/jellyfinAudioItems.ts @@ -1,4 +1,7 @@ -import { SearchHint } from '@jellyfin/sdk/lib/generated-client/models'; +import { + BaseItemKind, + SearchHint, +} from '@jellyfin/sdk/lib/generated-client/models'; import { JellyfinStreamBuilderService } from '../clients/jellyfin/jellyfin.stream.builder.service'; import { Track } from '../types/track'; import { trimStringToFixedLength } from '../utils/stringUtils'; @@ -161,22 +164,70 @@ export class JellyfinAudioPlaylist implements BaseJellyfinAudioPlayable { TotalRecordCount: number; } +export class JellyfinMusicAlbum implements BaseJellyfinAudioPlayable { + Id: string; + Name: string; + RunTimeTicks: number; + SearchHints: JellyfinAudioItem[]; + TotalRecordCount: number; + + async fromSearchHint( + jellyfinSearchService: JellyfinSearchService, + searchHint: SearchHint, + ): Promise { + this.Id = searchHint.Id; + this.Name = searchHint.Name; + this.RunTimeTicks = searchHint.RunTimeTicks; + const album = await jellyfinSearchService.getItemsByAlbum(searchHint.Id); + this.SearchHints = album.SearchHints; + this.TotalRecordCount = album.TotalRecordCount; + return this; + } + fetchTracks( + jellyfinStreamBuilder: JellyfinStreamBuilderService, + bitrate: number, + ): Track[] { + return this.SearchHints.flatMap((item) => + item.fetchTracks(jellyfinStreamBuilder, bitrate), + ); + } + prettyPrint(search: string): string { + return `${markSearchTermOverlap(this.Name, search)} (${ + this.TotalRecordCount + } items) (Album)`; + } + getId(): string { + return this.Id; + } + getValueId(): string { + return `album_${this.getId()}`; + } + getEmoji(): string { + return '📀'; + } +} + export const searchResultAsJellyfinAudio = async ( logger: Logger, jellyfinSearchService: JellyfinSearchService, searchHint: SearchHint, ) => { switch (searchHint.Type) { - case 'Audio': + case BaseItemKind[BaseItemKind.Audio]: return await new JellyfinAudioItem().fromSearchHint( jellyfinSearchService, searchHint, ); - case 'Playlist': + case BaseItemKind[BaseItemKind.Playlist]: return await new JellyfinAudioPlaylist().fromSearchHint( jellyfinSearchService, searchHint, ); + case BaseItemKind[BaseItemKind.MusicAlbum]: + return await new JellyfinMusicAlbum().fromSearchHint( + jellyfinSearchService, + searchHint, + ); default: logger.error( `Failed to parse Jellyfin response for item type ${searchHint.Type}`, From 3fd94e590d8768f9c86d95678507439af8b281e8 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 17:54:36 +0100 Subject: [PATCH 34/40] =?UTF-8?q?=F0=9F=94=A5=20Remove=20console=20log=20d?= =?UTF-8?q?ebug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/jellyfin/jellyfin.search.service.ts | 2 -- src/commands/play.comands.ts | 1 - 2 files changed, 3 deletions(-) diff --git a/src/clients/jellyfin/jellyfin.search.service.ts b/src/clients/jellyfin/jellyfin.search.service.ts index b9776d6..f342ea2 100644 --- a/src/clients/jellyfin/jellyfin.search.service.ts +++ b/src/clients/jellyfin/jellyfin.search.service.ts @@ -37,8 +37,6 @@ export class JellyfinSearchService { ], }); - console.log(SearchHints); - if (status !== 200) { this.logger.error(`Jellyfin Search failed with status code ${status}`); return []; diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index dbc1140..dbead9e 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -192,7 +192,6 @@ export class PlayItemCommand break; case 'album': const album = await this.jellyfinSearchService.getItemsByAlbum(id); - console.log(album); album.SearchHints.forEach((item) => { this.enqueueSingleTrack(item as BaseJellyfinAudioPlayable, bitrate); }); From 576d97ed8259c1a450da389a832d20b39dc106f3 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Sun, 18 Dec 2022 19:21:21 +0100 Subject: [PATCH 35/40] =?UTF-8?q?=F0=9F=8E=A8=20Code=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Meier Lukas --- src/clients/discord/discord.message.service.ts | 2 +- src/clients/jellyfin/jellyfin.service.ts | 2 +- src/commands/play.comands.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/clients/discord/discord.message.service.ts b/src/clients/discord/discord.message.service.ts index 155108a..6524b47 100644 --- a/src/clients/discord/discord.message.service.ts +++ b/src/clients/discord/discord.message.service.ts @@ -53,7 +53,7 @@ export class DiscordMessageService { text: `${date}`, }); - if (description !== undefined && description.length > 0) { + if (!description && description.length >= 1) { embedBuilder = embedBuilder.setDescription(description); } diff --git a/src/clients/jellyfin/jellyfin.service.ts b/src/clients/jellyfin/jellyfin.service.ts index 5bcfa21..d82763a 100644 --- a/src/clients/jellyfin/jellyfin.service.ts +++ b/src/clients/jellyfin/jellyfin.service.ts @@ -56,7 +56,7 @@ export class JellyfinService { } destroy() { - if (this.api === undefined) { + if (!this.api) { this.logger.warn( 'Jellyfin Api Client was unexpectitly undefined. Graceful destroy has failed', ); diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index dbead9e..7126a0f 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -64,7 +64,7 @@ export class PlayItemCommand ), ); - if (parsedItems.length < 1) { + if (parsedItems.length === 0) { return { embeds: [ this.discordMessageService.buildErrorMessage({ From a63a2c6dc5bb60937c7bbe384f97e519b4d8ce57 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 19:21:33 +0100 Subject: [PATCH 36/40] =?UTF-8?q?=F0=9F=8E=A8=20Code=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.controller.spec.ts | 22 ------------------- src/app.controller.ts | 12 ---------- src/app.module.ts | 8 +++---- src/app.service.ts | 9 -------- src/clients/jellyfin/jellyfin.module.ts | 9 +------- src/clients/jellyfin/jellyfin.service.ts | 9 ++++++-- .../jellyfin.stream.builder.service.ts | 20 +++++++++++------ .../jellyfin/jellyfin.websocket.service.ts | 10 ++++++++- src/commands/pause.command.ts | 14 ++---------- src/commands/play.comands.ts | 2 +- src/commands/playlist.command.ts | 2 +- src/playback/playback.service.ts | 2 +- 12 files changed, 38 insertions(+), 81 deletions(-) delete mode 100644 src/app.controller.spec.ts delete mode 100644 src/app.controller.ts delete mode 100644 src/app.service.ts diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts deleted file mode 100644 index d22f389..0000000 --- a/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -describe('AppController', () => { - let appController: AppController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); - - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/src/app.controller.ts b/src/app.controller.ts deleted file mode 100644 index cce879e..0000000 --- a/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/src/app.module.ts b/src/app.module.ts index a8015a1..3490c27 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,12 +5,10 @@ import { DiscordModule } from '@discord-nestjs/core'; import { ConfigModule } from '@nestjs/config'; import { EventEmitterModule } from '@nestjs/event-emitter'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; +import { DiscordConfigService } from './clients/discord/discord.config.service'; import { DiscordClientModule } from './clients/discord/discord.module'; import { JellyfinClientModule } from './clients/jellyfin/jellyfin.module'; import { CommandModule } from './commands/command.module'; -import { DiscordConfigService } from './clients/discord/discord.config.service'; import { PlaybackModule } from './playback/playback.module'; @Module({ @@ -33,7 +31,7 @@ import { PlaybackModule } from './playback/playback.module'; JellyfinClientModule, PlaybackModule, ], - controllers: [AppController], - providers: [AppService], + controllers: [], + providers: [], }) export class AppModule {} diff --git a/src/app.service.ts b/src/app.service.ts deleted file mode 100644 index c699f07..0000000 --- a/src/app.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class AppService { - constructor() {} - getHello(): string { - return 'Hello World!'; - } -} diff --git a/src/clients/jellyfin/jellyfin.module.ts b/src/clients/jellyfin/jellyfin.module.ts index 40e8818..ab59e96 100644 --- a/src/clients/jellyfin/jellyfin.module.ts +++ b/src/clients/jellyfin/jellyfin.module.ts @@ -20,10 +20,7 @@ import { JellyinWebsocketService } from './jellyfin.websocket.service'; ], }) export class JellyfinClientModule implements OnModuleInit, OnModuleDestroy { - constructor( - private jellyfinService: JellyfinService, - private readonly jellyfinWebsocketService: JellyinWebsocketService, - ) {} + constructor(private jellyfinService: JellyfinService) {} onModuleDestroy() { this.jellyfinService.destroy(); @@ -32,9 +29,5 @@ export class JellyfinClientModule implements OnModuleInit, OnModuleDestroy { onModuleInit() { this.jellyfinService.init(); this.jellyfinService.authenticate(); - - setTimeout(() => { - this.jellyfinWebsocketService.openSocket(); - }, 5000); } } diff --git a/src/clients/jellyfin/jellyfin.service.ts b/src/clients/jellyfin/jellyfin.service.ts index 5bcfa21..fdab370 100644 --- a/src/clients/jellyfin/jellyfin.service.ts +++ b/src/clients/jellyfin/jellyfin.service.ts @@ -4,6 +4,7 @@ import { Api, Jellyfin } from '@jellyfin/sdk'; import { Constants } from '../../utils/constants'; import { SystemApi } from '@jellyfin/sdk/lib/generated-client/api/system-api'; import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; +import { EventEmitter2 } from '@nestjs/event-emitter'; @Injectable() export class JellyfinService { @@ -13,6 +14,8 @@ export class JellyfinService { private systemApi: SystemApi; private userId: string; + constructor(private readonly eventEmitter: EventEmitter2) {} + init() { this.jellyfin = new Jellyfin({ clientInfo: { @@ -20,8 +23,8 @@ export class JellyfinService { version: Constants.Metadata.Version, }, deviceInfo: { - id: 'test', - name: 'test', + id: 'jellyfin-discord-bot', + name: 'Jellyfin Discord Bot', }, }); @@ -49,6 +52,8 @@ export class JellyfinService { this.userId = response.data.SessionInfo.UserId; this.systemApi = getSystemApi(this.api); + + this.eventEmitter.emit('clients.jellyfin.ready'); }) .catch((test) => { this.logger.error(test); diff --git a/src/clients/jellyfin/jellyfin.stream.builder.service.ts b/src/clients/jellyfin/jellyfin.stream.builder.service.ts index 41741de..f8d6e8b 100644 --- a/src/clients/jellyfin/jellyfin.stream.builder.service.ts +++ b/src/clients/jellyfin/jellyfin.stream.builder.service.ts @@ -16,14 +16,20 @@ export class JellyfinStreamBuilderService { const accessToken = this.jellyfinService.getApi().accessToken; - const url = encodeURI( - `${ - api.basePath - }/Audio/${jellyfinItemId}/universal?UserId=${this.jellyfinService.getUserId()}&DeviceId=${ - this.jellyfinService.getJellyfin().clientInfo.name - }&MaxStreamingBitrate=${bitrate}&Container=ogg,opus&AudioCodec=opus&TranscodingContainer=ts&TranscodingProtocol=hls&api_key=${accessToken}`, + const uri = new URL(api.basePath); + uri.pathname = `/Audio/${jellyfinItemId}/universal`; + uri.searchParams.set('UserId', this.jellyfinService.getUserId()); + uri.searchParams.set( + 'DeviceId', + this.jellyfinService.getJellyfin().clientInfo.name, ); + uri.searchParams.set('MaxStreamingBitrate', `${bitrate}`); + uri.searchParams.set('Container', 'ogg,opus'); + uri.searchParams.set('AudioCodec', 'opus'); + uri.searchParams.set('TranscodingContainer', 'ts'); + uri.searchParams.set('TranscodingProtocol', 'hls'); + uri.searchParams.set('api_key', accessToken); - return url; + return uri.toString(); } } diff --git a/src/clients/jellyfin/jellyfin.websocket.service.ts b/src/clients/jellyfin/jellyfin.websocket.service.ts index b7c447d..e99ef76 100644 --- a/src/clients/jellyfin/jellyfin.websocket.service.ts +++ b/src/clients/jellyfin/jellyfin.websocket.service.ts @@ -2,12 +2,20 @@ import { Injectable } from '@nestjs/common'; import { JellyfinService } from './jellyfin.service'; import { getPlaystateApi } from '@jellyfin/sdk/lib/utils/api/playstate-api'; +import { OnEvent } from '@nestjs/event-emitter'; @Injectable() export class JellyinWebsocketService { constructor(private readonly jellyfinClientManager: JellyfinService) {} - async openSocket() { + @OnEvent('clients.jellyfin.ready') + handleJellyfinBotReady() { + console.log('ready!'); + + this.openSocket(); + } + + private async openSocket() { const systemApi = getPlaystateApi(this.jellyfinClientManager.getApi()); // TODO: Write socket playstate api to report playback progress diff --git a/src/commands/pause.command.ts b/src/commands/pause.command.ts index 6626ad8..3fc4e61 100644 --- a/src/commands/pause.command.ts +++ b/src/commands/pause.command.ts @@ -19,22 +19,12 @@ export class PausePlaybackCommand implements DiscordCommand { handler( commandInteraction: CommandInteraction, ): string | InteractionReplyOptions { - const newStatus = this.discordVoiceService.togglePaused(); - - if (newStatus) { - return { - embeds: [ - this.discordMessageService.buildMessage({ - title: 'Paused', - }), - ], - }; - } + const shouldBePaused = this.discordVoiceService.togglePaused(); return { embeds: [ this.discordMessageService.buildMessage({ - title: 'Unpaused', + title: shouldBePaused ? 'Paused' : 'Unpaused', }), ], }; diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index dbead9e..a2f0a2a 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -245,7 +245,7 @@ export class PlayItemCommand const milliseconds = jellyfinPlayable.RunTimeTicks / 10000; - return this.playbackService.eneuqueTrack({ + return this.playbackService.enqueueTrack({ jellyfinId: jellyfinPlayable.Id, name: jellyfinPlayable.Name, durationInMilliseconds: milliseconds, diff --git a/src/commands/playlist.command.ts b/src/commands/playlist.command.ts index 138db8c..46e7e1d 100644 --- a/src/commands/playlist.command.ts +++ b/src/commands/playlist.command.ts @@ -43,7 +43,7 @@ export class PlaylistCommand implements DiscordCommand { let point = this.getListPoint(isCurrent, index); point += `**${trimStringToFixedLength(track.track.name, 30)}**`; - if (isCurrent === true) { + if (isCurrent) { point += ' :loud_sound:'; } diff --git a/src/playback/playback.service.ts b/src/playback/playback.service.ts index beb4034..9d341b4 100644 --- a/src/playback/playback.service.ts +++ b/src/playback/playback.service.ts @@ -64,7 +64,7 @@ export class PlaybackService { return true; } - eneuqueTrack(track: Track) { + enqueueTrack(track: Track) { const uuid = uuidv4(); const emptyBefore = this.playlist.tracks.length === 0; From 152e603742b08f28d6dd1df845ef2990930e8fff Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 19:23:56 +0100 Subject: [PATCH 37/40] =?UTF-8?q?=F0=9F=90=9B=20Crash=20with=20unknown=20d?= =?UTF-8?q?escription?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clients/discord/discord.message.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clients/discord/discord.message.service.ts b/src/clients/discord/discord.message.service.ts index 6524b47..8a4a9c7 100644 --- a/src/clients/discord/discord.message.service.ts +++ b/src/clients/discord/discord.message.service.ts @@ -53,7 +53,7 @@ export class DiscordMessageService { text: `${date}`, }); - if (!description && description.length >= 1) { + if (description !== undefined && description.length >= 1) { embedBuilder = embedBuilder.setDescription(description); } From d9b399d25303bd3bbf193741a8706261ccd7a6c1 Mon Sep 17 00:00:00 2001 From: Manuel <30572287+manuel-rw@users.noreply.github.com> Date: Sun, 18 Dec 2022 19:25:11 +0100 Subject: [PATCH 38/40] =?UTF-8?q?=F0=9F=93=9D=20Code=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Meier Lukas --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 339e7fa..563b89d 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ ## ✨ Features - Leighweight and extendable using the [Nest](https://github.com/nestjs/nest) framework -- Easy ussage with Discord commands system (eg. ``/play``, ``/pause``, ...) +- Easy usage with Discord command system (eg. ``/play``, ``/pause``, ...) - Fast configuration via environment variables - Typesafe for faster and easier development From fa9f32fe4a16a73ba1db7a4f2b203a6d8afaca7e Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 19:39:03 +0100 Subject: [PATCH 39/40] =?UTF-8?q?=F0=9F=8E=A8=20Code=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discord/discord.message.service.ts | 3 ++ .../jellyfin/jellyfin.search.service.ts | 7 ++-- src/commands/help.command.ts | 38 ++++++++----------- src/commands/play.comands.ts | 11 +----- 4 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/clients/discord/discord.message.service.ts b/src/clients/discord/discord.message.service.ts index 8a4a9c7..74ef51b 100644 --- a/src/clients/discord/discord.message.service.ts +++ b/src/clients/discord/discord.message.service.ts @@ -35,10 +35,12 @@ export class DiscordMessageService { buildMessage({ title, description, + authorUrl, mixin = (builder) => builder, }: { title: string; description?: string; + authorUrl?: string; mixin?: (embedBuilder: EmbedBuilder) => EmbedBuilder; }): APIEmbed { const date = formatRFC7231(new Date()); @@ -48,6 +50,7 @@ export class DiscordMessageService { .setAuthor({ name: title, iconURL: Constants.Design.Icons.JellyfinLogo, + url: authorUrl, }) .setFooter({ text: `${date}`, diff --git a/src/clients/jellyfin/jellyfin.search.service.ts b/src/clients/jellyfin/jellyfin.search.service.ts index f342ea2..047d16c 100644 --- a/src/clients/jellyfin/jellyfin.search.service.ts +++ b/src/clients/jellyfin/jellyfin.search.service.ts @@ -2,16 +2,17 @@ import { Injectable } from '@nestjs/common'; import { JellyfinService } from './jellyfin.service'; import { - BaseItemDto, BaseItemKind, SearchHint, - SearchHintResult, } from '@jellyfin/sdk/lib/generated-client/models'; import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; import { getSearchApi } from '@jellyfin/sdk/lib/utils/api/search-api'; import { Logger } from '@nestjs/common/services'; -import { JellyfinAudioPlaylist, JellyfinMusicAlbum } from '../../models/jellyfinAudioItems'; +import { + JellyfinAudioPlaylist, + JellyfinMusicAlbum, +} from '../../models/jellyfinAudioItems'; @Injectable() export class JellyfinSearchService { diff --git a/src/commands/help.command.ts b/src/commands/help.command.ts index baa548c..0457dd1 100644 --- a/src/commands/help.command.ts +++ b/src/commands/help.command.ts @@ -17,31 +17,25 @@ export class HelpCommand implements DiscordCommand { return { embeds: [ this.discordMessageService.buildMessage({ - title: 'a', + title: 'Jellyfin Discord Bot', description: 'Jellyfin Discord Bot is an open source and self-hosted Discord bot, that integrates with your Jellyfin Media server and enables you to playback music from your libraries. You can use the Discord Slash Commands to invoke bot commands.', + authorUrl: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', mixin(embedBuilder) { - return embedBuilder - .setAuthor({ - name: 'Jellyfin Discord Bot', - iconURL: - 'https://github.com/walkxcode/dashboard-icons/blob/main/png/jellyfin.png?raw=true', - url: 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - }) - .addFields([ - { - name: 'Report an issue', - value: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', - inline: true, - }, - { - name: 'Source code', - value: - 'https://github.com/manuel-rw/jellyfin-discord-music-bot', - inline: true, - }, - ]); + return embedBuilder.addFields([ + { + name: 'Report an issue', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot/issues/new/choose', + inline: true, + }, + { + name: 'Source code', + value: + 'https://github.com/manuel-rw/jellyfin-discord-music-bot', + inline: true, + }, + ]); }, }), ], diff --git a/src/commands/play.comands.ts b/src/commands/play.comands.ts index 4bc58fc..fe7a97c 100644 --- a/src/commands/play.comands.ts +++ b/src/commands/play.comands.ts @@ -28,7 +28,6 @@ import { searchResultAsJellyfinAudio, } from '../models/jellyfinAudioItems'; import { PlaybackService } from '../playback/playback.service'; -import { Constants } from '../utils/constants'; @Command({ name: 'play', @@ -99,7 +98,7 @@ export class PlayItemCommand const selectOptions: { label: string; value: string; emoji?: string }[] = firstItems.map((item) => ({ - label: item.prettyPrint(dto.search), + label: item.prettyPrint(dto.search).replace(/\*/g, ''), value: item.getValueId(), emoji: item.getEmoji(), })); @@ -107,14 +106,8 @@ export class PlayItemCommand return { embeds: [ this.discordMessageService.buildMessage({ - title: 'a', + title: 'Jellyfin Search Results', description: description, - mixin(embedBuilder) { - return embedBuilder.setAuthor({ - name: 'Jellyfin Search Results', - iconURL: Constants.Design.Icons.JellyfinLogo, - }); - }, }), ], components: [ From 24fc01e70b9236186c3c2b7af822220fd53bc683 Mon Sep 17 00:00:00 2001 From: Manuel Ruwe Date: Sun, 18 Dec 2022 19:58:14 +0100 Subject: [PATCH 40/40] =?UTF-8?q?=F0=9F=93=9D=20Update=20Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 51 +++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 563b89d..1085a67 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@

Jellyfin Discord Bot

-

A simple Discord bot that enables you to broadcast your Jellyfin Media Server music collection to voice channels.

+

A simple Discord bot that enables you to broadcast
your Jellyfin Media Server music collection to voice channels.
It's Open Source and can easily be hosted by yourself!

- Thanky you KGT1 for starting this project! This is a fork of their original repository and re-uses some of their code. + Thanky you KGT1 for starting this project!
This is a fork of their original repository and re-uses some of their code.

@@ -21,17 +21,26 @@ - Leighweight and extendable using the [Nest](https://github.com/nestjs/nest) framework - Easy usage with Discord command system (eg. ``/play``, ``/pause``, ...) -- Fast configuration via environment variables -- Typesafe for faster and easier development +- Fast and validated configuration using environment variables +- Typesafe code for quicker development and less bugs +- Supports ``Music``, ``Playlists`` and ``Albums`` from your Jellyfin instance + +## 📌 About this project +This project was originally started by [KGT1 on Github](https://github.com/KGT1/jellyfin-discord-music-bot/) in 2020. I came accross this project in late 2021, when wanted to enjoy my music on Discord. I never got it to run as I wanted it to. Since the original project was created under the MIT license, I decided to make a fork in 2022 with my own version. Although this project re-uses some code of the original project, it has been completly rewritten in other parts using NestJs and features now a module-based approach. + +## ⛔ Limitations + +- Bot does not support shards. This means, you cannot use it in multiple servers concurrently. +- Displaying media covers or images in Discord (Jellyfin is self hosted, and other users woudln't be able to see those images) +- Streaming any video content in voice channels (See [this issue](https://github.com/discordjs/discord.js/issues/4116)) ## 🚀 Installation -```bash -$ git clone https://github.com/manuel-rw/jellyfin-discord-music-bot.git -$ cd jellyfin-discord-music-bot/ -$ yarn -$ yarn start:prod -``` +Please check out the Wiki section in the repository for installation instructions: + +https://github.com/manuel-rw/jellyfin-discord-music-bot/wiki + + > Docker container comming soon @@ -39,28 +48,6 @@ $ yarn start:prod I'm open to any contributions to this project. You can start contributing using the following commands, after executing the installation commands: -```bash -# development -$ npm run start - -# watch mode -$ npm run start:dev - -# production mode -$ npm run start:prod -``` - -```bash -# unit tests -$ npm run test - -# e2e tests -$ npm run test:e2e - -# test coverage -$ npm run test:cov -``` - ## 👤 Credits - https://tabler-icons.io/ (MIT) - https://docs.nestjs.com/ (MIT)