From 74e21623b3beff5dc560a01b5ca149f48543c885 Mon Sep 17 00:00:00 2001 From: G Date: Fri, 20 May 2022 11:45:15 -1000 Subject: [PATCH] add multichannel, split farm vs whale mons, updated deps etc --- package.json | 4 +- src/app.module.ts | 6 +- src/monitor/farm-monitoring-service.ts | 126 ++++++++ ...service.ts => whale-monitoring-service.ts} | 105 ++----- yarn.lock | 281 +++++++++++++++++- 5 files changed, 423 insertions(+), 99 deletions(-) create mode 100644 src/monitor/farm-monitoring-service.ts rename src/monitor/{saber-monitoring-service.ts => whale-monitoring-service.ts} (53%) diff --git a/package.json b/package.json index 5393a27..9a066e7 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { - "@dialectlabs/monitor": "^1.2.12", + "@dialectlabs/monitor": "^2.0.6", "@dialectlabs/web3": "^0.2.0", "@gokiprotocol/client": "^0.6.1", "@nestjs/common": "^8.0.0", @@ -64,7 +64,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "jest": "^27.2.5", - "prettier": "^2.3.2", + "prettier": "^2.6.2", "source-map-support": "^0.5.20", "supertest": "^6.1.3", "ts-jest": "^27.0.3", diff --git a/src/app.module.ts b/src/app.module.ts index 1684b90..b5c9d14 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,7 +1,8 @@ import { Module } from '@nestjs/common'; -import { SaberMonitoringService } from './monitor/saber-monitoring-service'; import { ScheduleModule } from '@nestjs/schedule'; import { DialectConnection } from './monitor/dialect-connection'; +import { WhaleMonitoringService } from './monitor/whale-monitoring-service'; +import { FarmMonitoringService } from './monitor/farm-monitoring-service'; @Module({ imports: [ScheduleModule.forRoot()], @@ -11,7 +12,8 @@ import { DialectConnection } from './monitor/dialect-connection'; provide: DialectConnection, useValue: DialectConnection.initialize(), }, - SaberMonitoringService, + WhaleMonitoringService, + FarmMonitoringService, ], }) export class AppModule {} diff --git a/src/monitor/farm-monitoring-service.ts b/src/monitor/farm-monitoring-service.ts new file mode 100644 index 0000000..2892ef9 --- /dev/null +++ b/src/monitor/farm-monitoring-service.ts @@ -0,0 +1,126 @@ +import { + Injectable, + Logger, + OnModuleDestroy, + OnModuleInit, +} from '@nestjs/common'; +import { + DialectNotification, + Monitors, + SourceData, +} from '@dialectlabs/monitor'; +import { + toDecimals, +} from '../saber-wars-api/saber-wars-api'; +import { DialectConnection } from './dialect-connection'; +import { Subject } from 'rxjs'; +import { QuarryEventSubscription } from '../saber-wars-api/quarry-event-api'; +import { getOwner, quarrySDK } from '../saber-wars-api/quarry-sdk-factory'; +import { getTokenInfo } from '../saber-wars-api/token-info-api'; +import { OnChainSubscriberRepository } from '@dialectlabs/monitor/lib/cjs/internal/on-chain-subscriber.repository'; +import { InMemorySubscriberRepository } from '@dialectlabs/monitor/lib/cjs/internal/in-memory-subscriber.repository'; +import { PublicKey } from '@solana/web3.js'; + +@Injectable() +export class FarmMonitoringService implements OnModuleInit, OnModuleDestroy { + private readonly logger = new Logger(FarmMonitoringService.name); + private readonly numberFormat = new Intl.NumberFormat('en-US'); + constructor(private readonly dialectConnection: DialectConnection) {} + + onModuleInit() { + this.initFarmMonitor(); + } + + async onModuleDestroy() { + await Monitors.shutdown(); + } + + private initFarmMonitor() { + const onChainSubscriberRepository = new OnChainSubscriberRepository( + this.dialectConnection.getProgram(), + this.dialectConnection.getKeypair(), + ); + const subscriberRepository = InMemorySubscriberRepository.decorate( + onChainSubscriberRepository, + ); + + const quarryEvents = new Subject>(); + new QuarryEventSubscription(quarrySDK.programs.Mine, async (evt) => { + if ((await subscriberRepository.findAll()).length === 0) { + this.logger.warn('No subscribers, skipping event'); + return; + } + const resourceId = process.env.TEST_MODE + ? (await subscriberRepository.findAll())[0] + : await getOwner(evt.data.authority); + if (evt.name === 'StakeEvent') { + const tokenInfo = await getTokenInfo(evt.data.token); + quarryEvents.next({ + data: { + message: `Success! You staked ${this.numberFormat.format( + toDecimals(evt.data.amount, tokenInfo.decimals), + )} ${tokenInfo.symbol} to ${tokenInfo.name}`, + }, + groupingKey: resourceId.toBase58(), + }); + } + if (evt.name === 'ClaimEvent') { + const tokenInfo = await getTokenInfo(evt.data.stakedToken); + quarryEvents.next({ + data: { + message: `Success! You claimed ${this.numberFormat.format( + toDecimals(evt.data.amount, tokenInfo.decimals), + )} ${tokenInfo.symbol} from ${tokenInfo.name}`, + }, + groupingKey: resourceId.toBase58(), + }); + } + }).start(); + + const farmMonitor = Monitors.builder({ + subscriberRepository, + monitorKeypair: this.dialectConnection.getKeypair(), + dialectProgram: this.dialectConnection.getProgram(), + }) + .defineDataSource() + .push(quarryEvents) + .notify() + .dialectThread( + ({ value }) => { + this.logger.log(`Sending message ${value.message}`); + return { + message: value.message, + }; + }, + { dispatch: 'unicast', to: ({ groupingKey }) => new PublicKey(groupingKey) }, + ) + .telegram( + ({ value }) => { + return { + body: `⚔️ SABER: ` + value.message, + }; + }, + { dispatch: 'unicast', to: ({ groupingKey }) => new PublicKey(groupingKey) }, + ) + .sms( + ({ value }) => { + return { + body: `⚔️ SABER: ` + value.message, + }; + }, + { dispatch: 'unicast', to: ({ groupingKey }) => new PublicKey(groupingKey) }, + ) + .email( + ({ value }) => { + return { + subject: `⚔️ SABER: Succesful ${value.message.includes("claimed") ? "Claim" : "Stake"}`, + text: value.message, + }; + }, + { dispatch: 'unicast', to: ({ groupingKey }) => new PublicKey(groupingKey) }, + ) + .and() + .build(); + farmMonitor.start(); + } +} diff --git a/src/monitor/saber-monitoring-service.ts b/src/monitor/whale-monitoring-service.ts similarity index 53% rename from src/monitor/saber-monitoring-service.ts rename to src/monitor/whale-monitoring-service.ts index 8ff73ac..6e03a0c 100644 --- a/src/monitor/saber-monitoring-service.ts +++ b/src/monitor/whale-monitoring-service.ts @@ -6,7 +6,6 @@ import { } from '@nestjs/common'; import { Context, - DialectNotification, Monitor, Monitors, Pipelines, @@ -17,27 +16,19 @@ import { Duration } from 'luxon'; import { getWarsInfo, PoolInfo, - toDecimals, } from '../saber-wars-api/saber-wars-api'; import { NoopSubscriberRepository } from './noop-subscriber-repository'; import { Cron } from '@nestjs/schedule'; import { DialectConnection } from './dialect-connection'; -import { Subject } from 'rxjs'; -import { QuarryEventSubscription } from '../saber-wars-api/quarry-event-api'; -import { getOwner, quarrySDK } from '../saber-wars-api/quarry-sdk-factory'; -import { getTokenInfo } from '../saber-wars-api/token-info-api'; import { TwitterNotificationSink } from './twitter-notification-sink'; -import { OnChainSubscriberRepository } from '@dialectlabs/monitor/lib/cjs/internal/on-chain-subscriber.repository'; -import { InMemorySubscriberRepository } from '@dialectlabs/monitor/lib/cjs/internal/in-memory-subscriber.repository'; +import { PublicKey } from '@solana/web3.js'; @Injectable() -export class SaberMonitoringService implements OnModuleInit, OnModuleDestroy { - private readonly notificationSink: TwitterNotificationSink = +export class WhaleMonitoringService implements OnModuleInit, OnModuleDestroy { + private readonly twitterNotificationSink: TwitterNotificationSink = new TwitterNotificationSink(); - - private readonly logger = new Logger(SaberMonitoringService.name); + private readonly logger = new Logger(WhaleMonitoringService.name); private readonly numberFormat = new Intl.NumberFormat('en-US'); - constructor(private readonly dialectConnection: DialectConnection) {} private static getTriggerOutput(trace: Trace[]) { @@ -46,7 +37,6 @@ export class SaberMonitoringService implements OnModuleInit, OnModuleDestroy { onModuleInit() { this.initWhaleAlertMonitor(); - this.initFarmMonitor(); } @Cron('0 0 11,19 * * *', { @@ -84,72 +74,13 @@ Time remaining in epoch: ${epochInfo.currentEpochRemainingTime.toFormat( )} ⚔️⚔️⚔️⚔️⚔️#SABERWARS⚔️⚔️⚔️⚔️⚔️`; - await this.notificationSink.push({ message }); + await this.twitterNotificationSink.push({ message }); } async onModuleDestroy() { await Monitors.shutdown(); } - private initFarmMonitor() { - const onChainSubscriberRepository = new OnChainSubscriberRepository( - this.dialectConnection.getProgram(), - this.dialectConnection.getKeypair(), - ); - const subscriberRepository = InMemorySubscriberRepository.decorate( - onChainSubscriberRepository, - ); - - const quarryEvents = new Subject>(); - new QuarryEventSubscription(quarrySDK.programs.Mine, async (evt) => { - if ((await subscriberRepository.findAll()).length === 0) { - this.logger.warn('No subscribers, skipping event'); - return; - } - const resourceId = process.env.TEST_MODE - ? (await subscriberRepository.findAll())[0] - : await getOwner(evt.data.authority); - if (evt.name === 'StakeEvent') { - const tokenInfo = await getTokenInfo(evt.data.token); - quarryEvents.next({ - data: { - message: `Success! You staked ${this.numberFormat.format( - toDecimals(evt.data.amount, tokenInfo.decimals), - )} ${tokenInfo.symbol} to ${tokenInfo.name}`, - }, - resourceId, - }); - } - if (evt.name === 'ClaimEvent') { - const tokenInfo = await getTokenInfo(evt.data.stakedToken); - quarryEvents.next({ - data: { - message: `Success! You claimed ${this.numberFormat.format( - toDecimals(evt.data.amount, tokenInfo.decimals), - )} ${tokenInfo.symbol} from ${tokenInfo.name}`, - }, - resourceId, - }); - } - }).start(); - const builder = Monitors.builder({ - subscriberRepository, - monitorKeypair: this.dialectConnection.getKeypair(), - dialectProgram: this.dialectConnection.getProgram(), - }) - .defineDataSource() - .push(quarryEvents) - .notify() - .dialectThread(({ value }) => { - this.logger.log(`Sending message ${value.message}`); - return value; - }) - .and() - .dispatch('unicast'); - const monitor: Monitor = builder.build(); - monitor.start(); - } - private initWhaleAlertMonitor() { const threshold = parseInt(process.env.WHALE_MONITOR_THRESHOLD!); @@ -163,7 +94,7 @@ Time remaining in epoch: ${epochInfo.currentEpochRemainingTime.toFormat( const sourceData: SourceData[] = warsInfo.poolsInfo.map( (data) => ({ data, - resourceId: data.address, + groupingKey: data.address.toBase58(), }), ); return Promise.resolve(sourceData); @@ -178,15 +109,21 @@ Time remaining in epoch: ${epochInfo.currentEpochRemainingTime.toFormat( ], }) .notify() - .custom(({ context }) => { - const message = this.createWhaleAlert(context); - this.logger.log(message); - return { - message, - }; - }, this.notificationSink) + .custom( + (val) => { + const message = this.createWhaleAlert(val.context); + this.logger.log(message); + return { + message, + }; + }, + this.twitterNotificationSink, + { + dispatch: 'unicast', + to: (val) => new PublicKey(val.groupingKey), + } + ) .and() - .dispatch('unicast') .build(); monitor.start(); } @@ -195,7 +132,7 @@ Time remaining in epoch: ${epochInfo.currentEpochRemainingTime.toFormat( trace, origin: { name: poolName, nextEpochRewardsPerDay: rewardsPerDay }, }: Context) { - const triggerOutput = SaberMonitoringService.getTriggerOutput(trace)!; + const triggerOutput = WhaleMonitoringService.getTriggerOutput(trace)!; return `⚔️🐳🚨 Whale alert! 🚨🐳⚔️ ${this.numberFormat.format( diff --git a/yarn.lock b/yarn.lock index a4f295a..b258dc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -370,17 +370,20 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" -"@dialectlabs/monitor@^1.2.12": - version "1.2.12" - resolved "https://registry.yarnpkg.com/@dialectlabs/monitor/-/monitor-1.2.12.tgz#5a8b094006c1c3aec8efcc9b06dcced17cc3fccc" - integrity sha512-y56S0l+Gs3ej9ZU5prkH4Y2UyCqetXQ9IWUKeMdQauIopTe6KdW5C+2XiOJdDY/juQM8ABnd69iRcGOkcknwEg== +"@dialectlabs/monitor@^2.0.6": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@dialectlabs/monitor/-/monitor-2.1.0.tgz#52fd13f494e45218208234ba2333873294d8d3c5" + integrity sha512-zlCxWbmauWwQqAxO6MbcbsN+twsooyQvldpfU7HCb1yQFzcxMEyKlLVxxHeMxfRK6SAgdnspUz5R9gOibL8RdA== dependencies: "@dialectlabs/web3" "^0.2.0" "@project-serum/anchor" "0.23.0" "@sendgrid/mail" "^7.6.2" "@solana/web3.js" "^1.27.0" + axios "^0.27.2" luxon "^2.3.0" rxjs "^7.5.2" + telegraf "^4.7.0" + twilio "^3.76.1" "@dialectlabs/web3@^0.2.0": version "0.2.0" @@ -1557,6 +1560,13 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== +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" + accepts@~1.3.7: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1750,6 +1760,21 @@ axios@*, axios@0.26.0, axios@^0.26.0: dependencies: follow-redirects "^1.14.8" +axios@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" @@ -1949,6 +1974,29 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2353,6 +2401,11 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +dayjs@^1.8.29: + version "1.11.2" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.2.tgz#fa0f5223ef0d6724b3d8327134890cfe3d72fbe5" + integrity sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2484,6 +2537,13 @@ dotenv@10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ed2curve@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/ed2curve/-/ed2curve-0.3.0.tgz#322b575152a45305429d546b071823a93129a05d" @@ -2744,6 +2804,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +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== + eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -2966,6 +3031,11 @@ follow-redirects@^1.14.8: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== +follow-redirects@^1.14.9: + version "1.15.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + fork-ts-checker-webpack-plugin@6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz#0282b335fa495a97e167f69018f566ea7d2a2b5e" @@ -4062,6 +4132,39 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -4110,6 +4213,36 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + lodash.mapvalues@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" @@ -4125,6 +4258,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -4282,6 +4420,11 @@ minimist@1.2.5, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +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== + mkdirp@^0.5.4: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -4289,6 +4432,11 @@ mkdirp@^0.5.4: dependencies: minimist "^1.2.5" +module-alias@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" + integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== + moment-timezone@^0.5.x: version "0.5.34" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" @@ -4311,7 +4459,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, 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== @@ -4370,7 +4518,7 @@ node-emoji@1.11.0: dependencies: lodash "^4.17.21" -node-fetch@2.6.7, node-fetch@^2.6.1: +node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -4516,6 +4664,11 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-timeout@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-4.1.0.tgz#788253c0452ab0ffecf18a62dff94ff1bd09ca0a" + integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -4615,6 +4768,11 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +pop-iterate@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pop-iterate/-/pop-iterate-1.0.1.tgz#ceacfdab4abf353d7a0f2aaa2c1fc7b3f9413ba3" + integrity sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M= + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4632,10 +4790,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.3.2: - version "2.5.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" - integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== +prettier@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== pretty-format@^27.0.0, pretty-format@^27.5.1: version "27.5.1" @@ -4693,6 +4851,15 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +q@2.0.x: + version "2.0.3" + resolved "https://registry.yarnpkg.com/q/-/q-2.0.3.tgz#75b8db0255a1a5af82f58c3f3aaa1efec7d0d134" + integrity sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ= + dependencies: + asap "^2.0.0" + pop-iterate "^1.0.1" + weak-map "^1.0.5" + qs@6.9.3: version "6.9.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" @@ -4703,13 +4870,18 @@ qs@6.9.6: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== -qs@^6.10.1: +qs@^6.10.1, qs@^6.9.4: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4813,6 +4985,11 @@ require-from-string@^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== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -4874,6 +5051,11 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rootpath@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/rootpath/-/rootpath-0.1.2.tgz#5b379a87dca906e9b91d690a599439bef267ea6b" + integrity sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms= + rpc-websockets@^7.4.2: version "7.4.17" resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.17.tgz#f38845dd96db0442bff9e15fba9df781beb44cc0" @@ -4924,11 +5106,23 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-compare@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/safe-compare/-/safe-compare-1.1.4.tgz#5e0128538a82820e2e9250cd78e45da6786ba593" + integrity sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ== + dependencies: + buffer-alloc "^1.2.0" + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sandwich-stream@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sandwich-stream/-/sandwich-stream-2.0.2.tgz#6d1feb6cf7e9fe9fadb41513459a72c2e84000fa" + integrity sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ== + saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -4954,6 +5148,11 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +scmp@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/scmp/-/scmp-2.1.0.tgz#37b8e197c425bdeb570ab91cc356b311a11f9c9a" + integrity sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q== + secp256k1@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" @@ -4970,6 +5169,11 @@ semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.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.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -5271,6 +5475,21 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +telegraf@^4.7.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/telegraf/-/telegraf-4.8.2.tgz#6357102712be3d2472b6d5afc099be86e677ccb4" + integrity sha512-FFxdhFVnoAzxK6x6980rDPqadLI6AWjKhYe/dwkzd29+hmzVPzOQBKRujjkv4iVIfIJGt2QbuNtJUBukdDwBLg== + dependencies: + abort-controller "^3.0.0" + debug "^4.3.3" + minimist "^1.2.6" + module-alias "^2.2.2" + node-fetch "^2.6.7" + p-timeout "^4.1.0" + safe-compare "^1.1.4" + sandwich-stream "^2.0.2" + typegram "^3.9.0" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -5492,6 +5711,23 @@ tweetnacl@1.0.3, tweetnacl@1.x.x, tweetnacl@^1.0.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +twilio@^3.76.1: + version "3.77.1" + resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.77.1.tgz#4550e3bd227c1b63761691f7816c22d86db4dcce" + integrity sha512-0G8HMwIwc7Wq2x7CdMIqjOE3/XXCwu2jnERXRCaLJTpDIi6CxVkaM9W8iCAyuISb3bPjvON+RWpLcDbTDARiTQ== + dependencies: + axios "^0.26.1" + dayjs "^1.8.29" + https-proxy-agent "^5.0.0" + jsonwebtoken "^8.5.1" + lodash "^4.17.21" + q "2.0.x" + qs "^6.9.4" + rootpath "^0.1.2" + scmp "^2.1.0" + url-parse "^1.5.9" + xmlbuilder "^13.0.2" + twitter-api-v2@^1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/twitter-api-v2/-/twitter-api-v2-1.11.0.tgz#babf2ade5644af627501482e449af51ba96f6192" @@ -5546,6 +5782,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typegram@^3.9.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/typegram/-/typegram-3.9.1.tgz#b4ebfc83579ab01e8e95391e8f10e84abe265cdd" + integrity sha512-vfFr2o0iX+amnUj1h/0c49y8bCvGwt6DgdmTVD732Kf81XG26vgFwNWj+33Ol+xORC7m0cqU2hPYGRtcGinwZg== + typescript@4.5.5, typescript@^4.3.5: version "4.5.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" @@ -5573,6 +5814,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.9: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + utf-8-validate@^5.0.2: version "5.0.8" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" @@ -5655,6 +5904,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +weak-map@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.8.tgz#394c18a9e8262e790544ed8b55c6a4ddad1cb1a3" + integrity sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -5792,6 +6046,11 @@ xml-name-validator@^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== +xmlbuilder@^13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" + integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"