├── .github └── ISSUE_TEMPLATE │ ├── config.yml │ └── error-report.md ├── src ├── captcha │ ├── types │ │ ├── common.ts │ │ └── capreg-api.ts │ └── captcha.ts ├── noticer │ ├── types │ │ └── common.ts │ ├── queue.ts │ └── noticer.ts ├── sign │ ├── types │ │ ├── submit-sign-api.ts │ │ ├── preview-attachment-api.ts │ │ ├── get-upload-policy-api.ts │ │ ├── detail-sign-instance-api.ts │ │ ├── get-stu-sign-infos-in-one-day-api.ts │ │ └── common.ts │ └── sign.ts ├── login │ ├── types │ │ ├── do-login-api.ts │ │ └── common.ts │ └── login.ts ├── main.ts ├── school │ ├── types │ │ ├── tenant-info-api.ts │ │ ├── tenant-list-sort-api.ts │ │ └── common.ts │ └── school.ts ├── logger.ts ├── app.ts ├── config │ ├── app-config.ts │ ├── task-config.schema.ts │ ├── app-config.schema.ts │ └── task-config.ts ├── task │ └── task.ts └── user │ └── user.ts ├── .prettierrc ├── Dockerfile ├── .eslintrc.yaml ├── config-example.yaml ├── tsconfig.json ├── LICENSE ├── package.json ├── .gitignore ├── README.md └── yarn.lock /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /src/captcha/types/common.ts: -------------------------------------------------------------------------------- 1 | export interface IdentifyResult { 2 | id: string; 3 | result: string; 4 | } 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "printWidth": 90, 5 | "arrowParens": "avoid", 6 | "endOfLine": "lf" 7 | } 8 | -------------------------------------------------------------------------------- /src/noticer/types/common.ts: -------------------------------------------------------------------------------- 1 | export interface Message { 2 | readonly qq: number; 3 | readonly counter: number; 4 | readonly message: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/sign/types/submit-sign-api.ts: -------------------------------------------------------------------------------- 1 | export interface SubmitSignApi { 2 | readonly code: string; 3 | readonly message: string; 4 | readonly datas: unknown; 5 | } 6 | -------------------------------------------------------------------------------- /src/sign/types/preview-attachment-api.ts: -------------------------------------------------------------------------------- 1 | export interface PreviewAttachmentApi { 2 | readonly code: string; 3 | readonly datas: string; 4 | readonly message: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/login/types/do-login-api.ts: -------------------------------------------------------------------------------- 1 | export interface DoLoginApi { 2 | readonly resultCode: 3 | | 'REDIRECT' 4 | | 'CAPTCHA_NOTMATCH' 5 | | 'LT_NOTMATCH' 6 | | 'FAIL_UPNOTMATCH' 7 | | string; 8 | readonly needCaptcha?: boolean; 9 | readonly url?: string; 10 | } 11 | -------------------------------------------------------------------------------- /src/login/types/common.ts: -------------------------------------------------------------------------------- 1 | export interface LoginPostBody { 2 | readonly username: string; 3 | readonly password: string; 4 | readonly mobile: string; 5 | readonly dllt: string; 6 | readonly captcha: string; 7 | readonly rememberMe: boolean; 8 | readonly lt: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/captcha/types/capreg-api.ts: -------------------------------------------------------------------------------- 1 | export interface CapregApi { 2 | readonly RetCode: string; 3 | readonly ErrMsg?: string; 4 | readonly RequestId: string; 5 | readonly RspData: string; 6 | } 7 | 8 | export interface CapjustApi { 9 | readonly RetCode: string; 10 | readonly ErrMsg?: string; 11 | } 12 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import 'reflect-metadata'; // package class-transformer need it 2 | 3 | import { App } from '@/app'; 4 | import { Logger } from '@/logger'; 5 | 6 | async function bootstrap() { 7 | const app = new App(); 8 | await app.start(); 9 | } 10 | 11 | bootstrap().catch(reason => { 12 | Logger.error(reason); 13 | }); 14 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine3.14 2 | RUN apk add tzdata 3 | WORKDIR /app 4 | COPY package.json ./ 5 | COPY yarn.lock ./ 6 | COPY tsconfig.json ./ 7 | RUN yarn --registry https://registry.npmmirror.com/ install --production && mkdir tasks 8 | COPY dist ./dist 9 | ENV TZ=Asia/Shanghai 10 | VOLUME ["/app/config.yaml", "/app/tasks"] 11 | CMD ["yarn", "start"] 12 | -------------------------------------------------------------------------------- /src/noticer/queue.ts: -------------------------------------------------------------------------------- 1 | export class Queue { 2 | private readonly queue: T[]; 3 | 4 | constructor() { 5 | this.queue = []; 6 | } 7 | 8 | push(item: T): void { 9 | this.queue.push(item); 10 | } 11 | 12 | pop(): void { 13 | this.queue.splice(0, 1); 14 | } 15 | 16 | empty(): boolean { 17 | return !this.queue.length; 18 | } 19 | 20 | front(): T { 21 | return this.queue[0]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/school/types/tenant-info-api.ts: -------------------------------------------------------------------------------- 1 | export interface TenantInfoApiDataItem { 2 | readonly id: string; 3 | readonly name: string; 4 | readonly tenantCode: string; 5 | readonly joinType: string; 6 | readonly idsUrl: string; 7 | readonly ampUrl: string; 8 | } 9 | 10 | export interface TenantInfoApi { 11 | readonly errCode: number; 12 | readonly errMsg: string; 13 | readonly data: TenantInfoApiDataItem[]; 14 | } 15 | -------------------------------------------------------------------------------- /src/sign/types/get-upload-policy-api.ts: -------------------------------------------------------------------------------- 1 | interface GetUploadPolicyApiDatas { 2 | readonly accessid: string; 3 | readonly dir: string; 4 | readonly host: string; 5 | readonly policy: string; 6 | readonly signature: string; 7 | readonly fileName: string; 8 | } 9 | 10 | export interface GetUploadPolicyApi { 11 | readonly code: string; 12 | readonly datas: GetUploadPolicyApiDatas; 13 | readonly message: string; 14 | } 15 | -------------------------------------------------------------------------------- /src/school/types/tenant-list-sort-api.ts: -------------------------------------------------------------------------------- 1 | interface SchoolItem { 2 | readonly id: string; 3 | readonly name: string; 4 | readonly img: string; 5 | } 6 | 7 | interface TenantListSortDataItem { 8 | readonly sectionName: string; 9 | readonly datas: SchoolItem[]; 10 | } 11 | 12 | export interface TenantListSortApi { 13 | readonly errCode: number; 14 | readonly errMsg: string; 15 | readonly data: TenantListSortDataItem[]; 16 | } 17 | -------------------------------------------------------------------------------- /src/school/types/common.ts: -------------------------------------------------------------------------------- 1 | import type { TenantInfoApiDataItem } from './tenant-info-api'; 2 | 3 | export interface SchoolListItem { 4 | readonly id: string; 5 | readonly name: string; 6 | } 7 | 8 | export interface SchoolInfo extends TenantInfoApiDataItem { 9 | readonly id: string; 10 | readonly name: string; 11 | readonly tenantCode: string; 12 | readonly joinType: string; 13 | readonly idsUrl: string; 14 | readonly ampUrl: string; 15 | } 16 | -------------------------------------------------------------------------------- /src/logger.ts: -------------------------------------------------------------------------------- 1 | import { createLogger } from 'bunyan'; 2 | 3 | export class Logger { 4 | private static logger = createLogger({ 5 | name: 'Auto Sign', 6 | level: 'warn', 7 | }); 8 | 9 | static setLevel(level: 'debug' | 'info' | 'warn' | 'error') { 10 | Logger.logger = createLogger({ 11 | name: 'Auto Sign', 12 | level: level, 13 | }); 14 | } 15 | 16 | static debug(obj: unknown) { 17 | Logger.logger.debug(obj); 18 | } 19 | 20 | static info(obj: unknown) { 21 | Logger.logger.info(obj); 22 | } 23 | 24 | static warn(obj: unknown) { 25 | Logger.logger.warn(obj); 26 | } 27 | 28 | static error(obj: unknown) { 29 | Logger.logger.error(obj); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.eslintrc.yaml: -------------------------------------------------------------------------------- 1 | parser: '@typescript-eslint/parser' 2 | 3 | parserOptions: 4 | project: tsconfig.json 5 | sourceType: module 6 | 7 | plugins: 8 | - '@typescript-eslint/eslint-plugin' 9 | - simple-import-sort 10 | 11 | extends: 12 | - 'plugin:@typescript-eslint/recommended' 13 | - 'plugin:prettier/recommended' 14 | 15 | root: true 16 | 17 | env: 18 | node: true 19 | 20 | rules: 21 | '@typescript-eslint/interface-name-prefix': off 22 | '@typescript-eslint/explicit-function-return-type': off 23 | '@typescript-eslint/explicit-module-boundary-types': off 24 | '@typescript-eslint/no-explicit-any': off 25 | simple-import-sort/imports: error 26 | simple-import-sort/exports: error 27 | arrow-parens: [error, as-needed] 28 | -------------------------------------------------------------------------------- /config-example.yaml: -------------------------------------------------------------------------------- 1 | # 没有标注为选填项的一律必填,填写时请保证每一项类型一致 2 | # 如果是纯数字的字符串必须使用用''或""括起来 3 | # 以上规则也适用于自动生成的任务配置 4 | 5 | users: #用户列表 6 | - school: # 用户1 学校名称 7 | username: # 用户1 用户名,一个字符串 8 | password: # 用户1 密码,一个字符串 9 | qq: # 用户2 接收推送QQ号,一个数字,选填 10 | 11 | - school: # 用户2 格式同上 12 | username: 13 | password: 14 | qq: 15 | 16 | login: 17 | retryTimes: 5 # 登录重试次数,必须是大于0的数字 18 | captcha: # 自动打码 19 | enable: false # 必须是 true 或 false 20 | pdId: # 请前往 http://www.fateadm.com 获取,一个字符串,选填 21 | pdKey: # 请前往 http://www.fateadm.com 获取,一个字符串,选填 22 | 23 | noticer: # QQ消息推送 24 | enable: false # 必须是 true 或 false 25 | qq: # 负责推送消息的QQ号,一个数字,选填 26 | password: # 负责推送消息的QQ密码,一个字符串,选填 27 | 28 | # proxy: http://username:password@127.0.0.1:8080 # Optional 29 | 30 | logLevel: info # 日志级别 debug/info/warn/error 31 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "esModuleInterop": true, 5 | "declaration": true, 6 | "removeComments": true, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "allowSyntheticDefaultImports": true, 10 | "target": "es2019", 11 | "sourceMap": true, 12 | "outDir": "./dist", 13 | "baseUrl": "./", 14 | "incremental": true, 15 | "skipLibCheck": true, 16 | "strictNullChecks": false, 17 | "noImplicitAny": false, 18 | "strictBindCallApply": false, 19 | "forceConsistentCasingInFileNames": false, 20 | "noFallthroughCasesInSwitch": false, 21 | "paths": { 22 | "@/*": [ 23 | "src/*", 24 | "dist/*", 25 | ] 26 | } 27 | }, 28 | "exclude": [ 29 | "node_modules", 30 | "dist" 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import { AppConfig } from '@/config/app-config'; 2 | import { Logger } from '@/logger'; 3 | import { Noticer } from '@/noticer/noticer'; 4 | import { School } from '@/school/school'; 5 | import { User } from '@/user/user'; 6 | 7 | export class App { 8 | public readonly appConfig: AppConfig; 9 | public readonly users: User[]; 10 | public readonly noticer: Noticer; 11 | 12 | constructor() { 13 | this.appConfig = new AppConfig(); 14 | Logger.setLevel(this.appConfig.config.logLevel); 15 | this.noticer = new Noticer(this.appConfig.config.noticer); 16 | this.users = this.appConfig.config.users.map( 17 | userConfig => new User(this.appConfig, userConfig, this.noticer), 18 | ); 19 | } 20 | 21 | async start() { 22 | await School.initSchoolList(this.appConfig.config.proxy); 23 | for (const user of this.users) { 24 | try { 25 | await user.init(); 26 | user.start(); 27 | } catch (e) { 28 | Logger.error(e); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/sign/types/detail-sign-instance-api.ts: -------------------------------------------------------------------------------- 1 | interface ExtraFieldItem { 2 | content: string; 3 | wid: number; 4 | isOtherItems: number; 5 | value: string; 6 | isSelected: boolean; 7 | isAbnormal: boolean; 8 | } 9 | 10 | interface ExtraField { 11 | readonly wid: number; 12 | readonly title: string; 13 | readonly description: string; 14 | readonly hasOtherItems: number; 15 | readonly extraFieldItems: ExtraFieldItem[]; 16 | } 17 | 18 | interface SignPlace { 19 | readonly address: string; 20 | readonly longitude: number; 21 | readonly latitude: number; 22 | readonly radius: number; 23 | } 24 | 25 | export interface DetailSignInstanceApiDatas { 26 | readonly signInstanceWid: string; 27 | readonly taskName: string; 28 | readonly signPlaceSelected: SignPlace[]; 29 | readonly isMalposition: number; 30 | readonly isPhoto: number; 31 | readonly isNeedExtra: number; 32 | readonly extraField: ExtraField[]; 33 | } 34 | 35 | export interface DetailSignInstanceApi { 36 | readonly code: string; 37 | readonly message: string; 38 | readonly datas: DetailSignInstanceApiDatas; 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Antares 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/config/app-config.ts: -------------------------------------------------------------------------------- 1 | import { plainToClass } from 'class-transformer'; 2 | import { validateSync } from 'class-validator'; 3 | import fs from 'fs-extra'; 4 | import yaml from 'js-yaml'; 5 | import { join } from 'path'; 6 | 7 | import { AppConfigSchema } from './app-config.schema'; 8 | 9 | export class AppConfig { 10 | readonly config: AppConfigSchema; 11 | 12 | constructor() { 13 | const filePath = join(__dirname, '..', '..', 'config.yaml'); 14 | if (!fs.existsSync(filePath)) { 15 | throw new Error('Please Complete the Configuration File "config.yaml"'); 16 | } 17 | const config = yaml.load(fs.readFileSync(filePath).toString()); 18 | this.config = AppConfig.validateInput(config); 19 | } 20 | 21 | private static validateInput(inputConfig: unknown): AppConfigSchema { 22 | const config = plainToClass(AppConfigSchema, inputConfig); 23 | const errors = validateSync(config, { 24 | validationError: { 25 | target: false, 26 | }, 27 | }); 28 | 29 | if (errors.length > 0) { 30 | throw new Error(`Config validation error: ${JSON.stringify(errors, null, 2)}`); 31 | } 32 | return config; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/sign/types/get-stu-sign-infos-in-one-day-api.ts: -------------------------------------------------------------------------------- 1 | interface TaskItem { 2 | readonly stuSignWid: string; 3 | readonly signInstanceWid: string; 4 | readonly signWid: string; 5 | readonly signRate: string; 6 | readonly taskType: string; 7 | readonly taskName: string; 8 | readonly senderUserName: string; 9 | readonly signStatus: string; 10 | readonly isMalposition: string; 11 | readonly isLeave: string; 12 | readonly leavePcUrl: string; 13 | readonly leaveMobileUrl: string; 14 | readonly currentTime: string; 15 | readonly singleTaskBeginTime: string; 16 | readonly singleTaskEndTime: string; 17 | readonly rateSignDate: string; 18 | readonly rateTaskBeginTime: string; 19 | readonly rateTaskEndTime: string; 20 | } 21 | 22 | interface GetStuSignInfosInOneDayApiDatas { 23 | readonly dayInMonth: string; 24 | readonly codeRcvdTasks: TaskItem[]; 25 | readonly signedTasks: TaskItem[]; 26 | readonly unSignedTasks: TaskItem[]; 27 | readonly leaveTasks: TaskItem[]; 28 | } 29 | 30 | export interface GetStuSignInfosInOneDayApi { 31 | readonly code: string; 32 | readonly message: string; 33 | readonly datas: GetStuSignInfosInOneDayApiDatas; 34 | } 35 | -------------------------------------------------------------------------------- /src/sign/types/common.ts: -------------------------------------------------------------------------------- 1 | import { DetailSignInstanceApiDatas } from './detail-sign-instance-api'; 2 | 3 | export interface TasksResult { 4 | readonly signedTasks: DetailSignInstanceApiDatas[]; 5 | readonly unSignedTasks: DetailSignInstanceApiDatas[]; 6 | } 7 | 8 | interface ExtraFieldItem { 9 | extraFieldItemWid: number; 10 | extraFieldItemValue: string; 11 | } 12 | 13 | export interface Extension { 14 | readonly lon: number; 15 | readonly lat: number; 16 | readonly model: string; 17 | readonly appVersion: string; 18 | readonly systemVersion: string; 19 | readonly userId: string; 20 | readonly systemName: string; 21 | readonly deviceId: string; 22 | } 23 | 24 | export interface TaskForm { 25 | readonly signInstanceWid: string; 26 | readonly longitude: number; 27 | readonly latitude: number; 28 | readonly position: string; 29 | readonly isMalposition: number; 30 | readonly uaIsCpadaily: boolean; 31 | readonly abnormalReason: string; 32 | readonly signPhotoUrl: string; 33 | readonly isNeedExtra: number; 34 | readonly extraFieldItems?: ExtraFieldItem[]; 35 | } 36 | 37 | export interface CryptTaskForm extends Extension { 38 | readonly bodyString: string; 39 | readonly sign: string; 40 | readonly calVersion: string; 41 | readonly version: string; 42 | } 43 | 44 | export interface SubmitResult { 45 | readonly name: string; 46 | readonly success: boolean; 47 | readonly message: string; 48 | } 49 | -------------------------------------------------------------------------------- /src/config/task-config.schema.ts: -------------------------------------------------------------------------------- 1 | import { Type } from 'class-transformer'; 2 | import { 3 | IsArray, 4 | IsBoolean, 5 | IsNumber, 6 | IsOptional, 7 | IsString, 8 | Max, 9 | Min, 10 | ValidateNested, 11 | } from 'class-validator'; 12 | 13 | export class TaskConfigExtraFieldsItem { 14 | @IsString() 15 | title: string; 16 | 17 | @IsBoolean() 18 | hasOther: boolean; 19 | 20 | @IsArray() 21 | @Type(() => String) 22 | options: string[]; 23 | 24 | @IsString() 25 | answer: string; 26 | } 27 | 28 | export class TaskConfigPosition { 29 | @IsNumber() 30 | @Min(-180) 31 | @Max(180) 32 | longitude: number; 33 | 34 | @IsNumber() 35 | @Min(-90) 36 | @Max(90) 37 | latitude: number; 38 | } 39 | 40 | export class TaskConfigItem { 41 | @IsBoolean() 42 | enable: boolean; 43 | 44 | @IsString() 45 | cron: string; 46 | 47 | @IsString() 48 | titleRegex: string; 49 | 50 | @IsString() 51 | address: string; 52 | 53 | @ValidateNested() 54 | @Type(() => TaskConfigPosition) 55 | position: TaskConfigPosition; 56 | 57 | @IsString() 58 | @IsOptional() 59 | abnormalReason: string; 60 | 61 | @IsBoolean() 62 | needPhoto: boolean; 63 | 64 | @IsString() 65 | @IsOptional() 66 | photoPath: string; 67 | 68 | @IsBoolean() 69 | needExtra: boolean; 70 | 71 | @ValidateNested() 72 | @Type(() => TaskConfigExtraFieldsItem) 73 | extraFields: TaskConfigExtraFieldsItem[]; 74 | } 75 | 76 | export class TaskConfigSchema { 77 | @ValidateNested() 78 | @Type(() => TaskConfigItem) 79 | tasks: TaskConfigItem[]; 80 | } 81 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "campushoy-auto-sign", 3 | "version": "2.0.0", 4 | "description": "今日校园自动签到", 5 | "main": "dist/main.js", 6 | "repository": "https://github.com/AntaresQAQ/campushoy-auto-sign.git", 7 | "author": "Antares ", 8 | "license": "MIT", 9 | "private": false, 10 | "scripts": { 11 | "build": "tsc -p .", 12 | "clean": "rm -rf dist", 13 | "start": "node -r tsconfig-paths/register dist/main.js | bunyan -L", 14 | "start-dev": "ts-node -r tsconfig-paths/register src/main.ts | bunyan -L" 15 | }, 16 | "dependencies": { 17 | "axios": "^0.24.0", 18 | "axios-cookiejar-support": "^1.0.1", 19 | "bunyan": "^1.8.15", 20 | "class-transformer": "^0.5.1", 21 | "class-validator": "^0.13.1", 22 | "crypto-js": "^4.1.1", 23 | "form-data": "^4.0.0", 24 | "fs-extra": "^10.0.0", 25 | "https-proxy-agent": "^5.0.1", 26 | "js-yaml": "^4.1.0", 27 | "moment": "^2.29.1", 28 | "node-schedule": "^2.0.0", 29 | "oicq": "^2.1.8", 30 | "reflect-metadata": "^0.1.13", 31 | "tough-cookie": "^4.0.0", 32 | "tsconfig-paths": "^3.11.0", 33 | "uuid": "^8.3.2" 34 | }, 35 | "devDependencies": { 36 | "@types/bunyan": "^1.8.7", 37 | "@types/crypto-js": "^4.0.2", 38 | "@types/fs-extra": "^9.0.13", 39 | "@types/js-yaml": "^4.0.3", 40 | "@types/node": "^16.11.1", 41 | "@types/node-schedule": "^1.3.2", 42 | "@types/tough-cookie": "^4.0.1", 43 | "@types/uuid": "^8.3.1", 44 | "@typescript-eslint/eslint-plugin": "^5.1.0", 45 | "@typescript-eslint/parser": "^5.1.0", 46 | "eslint": "^7.30.0", 47 | "eslint-config-prettier": "^8.3.0", 48 | "eslint-plugin-prettier": "^4.0.0", 49 | "eslint-plugin-simple-import-sort": "^7.0.0", 50 | "prettier": "^2.4.1", 51 | "ts-node": "^10.3.0", 52 | "typescript": "^4.4.4" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/config/app-config.schema.ts: -------------------------------------------------------------------------------- 1 | import { Type } from 'class-transformer'; 2 | import { 3 | IsBoolean, 4 | IsIn, 5 | IsNotEmpty, 6 | IsNumber, 7 | IsOptional, 8 | IsString, 9 | IsUrl, 10 | Min, 11 | ValidateNested, 12 | } from 'class-validator'; 13 | 14 | export class NoticerConfig { 15 | @IsBoolean() 16 | readonly enable: boolean; 17 | 18 | @IsOptional() 19 | @IsNumber() 20 | readonly qq?: number; 21 | 22 | @IsOptional() 23 | @IsString() 24 | @IsNotEmpty() 25 | readonly password?: string; 26 | } 27 | 28 | export class UserConfig { 29 | @IsString() 30 | @IsNotEmpty() 31 | readonly school: string; 32 | 33 | @IsString() 34 | @IsNotEmpty() 35 | readonly username: string; 36 | 37 | @IsString() 38 | @IsNotEmpty() 39 | readonly password: string; 40 | 41 | @IsNumber() 42 | @IsOptional() 43 | readonly qq?: number; 44 | } 45 | 46 | class CaptchaLoginConfig { 47 | @IsBoolean() 48 | readonly enable: boolean; 49 | 50 | @IsString() 51 | @IsOptional() 52 | readonly pdId?: string; 53 | 54 | @IsString() 55 | @IsOptional() 56 | readonly pdKey?: string; 57 | } 58 | 59 | export class LoginConfig { 60 | @IsNumber() 61 | @Min(0) 62 | readonly retryTimes: number; 63 | 64 | @ValidateNested() 65 | @Type(() => CaptchaLoginConfig) 66 | readonly captcha: CaptchaLoginConfig; 67 | } 68 | 69 | export class AppConfigSchema { 70 | @ValidateNested() 71 | @Type(() => UserConfig) 72 | readonly users: UserConfig[]; 73 | 74 | @ValidateNested() 75 | @Type(() => LoginConfig) 76 | readonly login: LoginConfig; 77 | 78 | @ValidateNested() 79 | @Type(() => NoticerConfig) 80 | readonly noticer: NoticerConfig; 81 | 82 | @IsUrl() 83 | @IsOptional() 84 | readonly proxy?: string; 85 | 86 | @IsIn(['debug', 'info', 'warn', 'error']) 87 | readonly logLevel: 'debug' | 'info' | 'warn' | 'error'; 88 | } 89 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/error-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 报告错误 3 | about: 汇报一个错误以便于开发者解决和修复 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 环境 11 | >MacOS 11.6 20G165 x86_64 12 | >Node.js v17.0.1 13 | 14 | 去掉敏感信息的日志 15 | ``` 16 | yarn run v1.22.17 17 | $ node -r tsconfig-paths/register dist/main.js | bunyan -L 18 | [2021-10-28T20:48:05.102+08:00] DEBUG: Auto Sign/65894 on Antares-Macbook.local: Loading School List... 19 | [2021-10-28T20:48:05.311+08:00] DEBUG: Auto Sign/65894 on Antares-Macbook.local: Successfully Get 2888 Schools 20 | [2021-10-28T20:48:05.311+08:00] INFO: Auto Sign/65894 on Antares-Macbook.local: Initializing User 哈尔滨佛学院-这里是学号 21 | [2021-10-28T20:48:05.311+08:00] ERROR: Auto Sign/65894 on Antares-Macbook.local: User 哈尔滨佛学院-这里是学号 initialization failed 22 | [2021-10-28T20:48:05.312+08:00] ERROR: Auto Sign/65894 on Antares-Macbook.local: Could not find the school: 哈尔滨佛学院 23 | Error: Could not find the school: 哈尔滨佛学院 24 | at School.getSchoolItem (/Users/Antares/Repositories/campushoy-auto-sign/dist/school/school.js:28:19) 25 | at new School (/Users/Antares/Repositories/campushoy-auto-sign/dist/school/school.js:11:14) 26 | at User.init (/Users/Antares/Repositories/campushoy-auto-sign/dist/user/user.js:33:27) 27 | at App.start (/Users/Antares/Repositories/campushoy-auto-sign/dist/app.js:20:28) 28 | at processTicksAndRejections (node:internal/process/task_queues:96:5) 29 | at async bootstrap (/Users/Antares/Repositories/campushoy-auto-sign/dist/main.js:8:5) 30 | ✨ Done in 0.99s. 31 | ``` 32 | 33 | 去掉敏感信息的 config.yaml 34 | ```yaml 35 | users: #用户列表 36 | - school: 哈尔滨佛学院 37 | username: 这里是学号 38 | password: 这里是密码 39 | qq: 40 | 41 | login: 42 | retryTimes: 5 43 | captcha: 44 | enable: false 45 | pdId: 46 | pdKey: 47 | 48 | noticer: 49 | enable: false 50 | qq: 51 | password: 52 | 53 | logLevel: debug 54 | ``` 55 | 56 | 描述: 57 | 58 | 我使用APP可以找到我的学校 59 | 但脚本无法找到我的学校 60 | 我的学校是:哈尔滨佛学院 61 | -------------------------------------------------------------------------------- /src/config/task-config.ts: -------------------------------------------------------------------------------- 1 | import { plainToClass } from 'class-transformer'; 2 | import { validateSync } from 'class-validator'; 3 | import fs from 'fs-extra'; 4 | import yaml from 'js-yaml'; 5 | import { join } from 'path'; 6 | 7 | import { UserConfig } from './app-config.schema'; 8 | import { TaskConfigSchema } from './task-config.schema'; 9 | 10 | export class TaskConfig { 11 | private static readonly fileDir = join(__dirname, '..', '..', 'tasks'); 12 | private readonly filePath; 13 | private config: TaskConfigSchema; 14 | 15 | constructor(private readonly userConfig: UserConfig) { 16 | if (!fs.existsSync(TaskConfig.fileDir)) { 17 | fs.mkdirSync(TaskConfig.fileDir); 18 | } 19 | this.filePath = join( 20 | TaskConfig.fileDir, 21 | `${userConfig.school}-${userConfig.username}.yaml`, 22 | ); 23 | if (fs.existsSync(this.filePath)) { 24 | const config = yaml.load(fs.readFileSync(this.filePath).toString()); 25 | this.config = TaskConfig.validateInput(config); 26 | } 27 | } 28 | 29 | update(config: TaskConfigSchema) { 30 | this.config = config; 31 | } 32 | 33 | async saveFile(): Promise { 34 | if (this.config) { 35 | await fs.writeFile(this.filePath, yaml.dump(this.config)); 36 | } 37 | } 38 | 39 | getConfig(): TaskConfigSchema { 40 | return this.config; 41 | } 42 | 43 | private static validateInput(inputConfig: unknown): TaskConfigSchema { 44 | const config = plainToClass(TaskConfigSchema, inputConfig); 45 | const errors = validateSync(config, { 46 | validationError: { 47 | target: false, 48 | }, 49 | }); 50 | 51 | if (errors.length > 0) { 52 | throw new Error(`Config validation error: ${JSON.stringify(errors, null, 2)}`); 53 | } 54 | for (const task of config.tasks) { 55 | if (task.enable && task.needPhoto) { 56 | if (!fs.existsSync(task.photoPath)) { 57 | throw new Error(`File "${task.photoPath}" Not Found`); 58 | } 59 | } 60 | } 61 | return config; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/captcha/captcha.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { MD5 } from 'crypto-js'; 3 | import { stringify } from 'querystring'; 4 | 5 | import { Logger } from '@/logger'; 6 | 7 | import type { CapjustApi, CapregApi } from './types/capreg-api'; 8 | import type { IdentifyResult } from './types/common'; 9 | 10 | export class Captcha { 11 | constructor(private readonly pdId: string, private readonly pdKey: string) {} 12 | 13 | private calculateSign(timestamp): string { 14 | return MD5( 15 | `${this.pdId}${timestamp}${MD5(`${timestamp}${this.pdKey}`).toString()}`, 16 | ).toString(); 17 | } 18 | 19 | async identify(image: string): Promise { 20 | Logger.info('Identifying captcha...'); 21 | const timestamp = Math.ceil(Date.now() / 1000); 22 | const body = stringify({ 23 | user_id: this.pdId, 24 | timestamp, 25 | sign: this.calculateSign(timestamp), 26 | predict_type: '20500', 27 | img_data: image, 28 | }); 29 | const res = await axios.post('http://pred.fateadm.com/api/capreg', body, { 30 | headers: { 'Content-type': 'application/x-www-form-urlencoded' }, 31 | }); 32 | const response = res.data as CapregApi; 33 | if (response.RetCode === '0') { 34 | Logger.info(`Successfully Identify Captcha, RequestId=${response.RequestId}`); 35 | return { 36 | id: response.RequestId, 37 | result: JSON.parse(response.RspData).result, 38 | }; 39 | } else { 40 | throw new Error(`Identify Captcha Error, Msg=${response.ErrMsg}`); 41 | } 42 | } 43 | 44 | async requestRefund(id: string): Promise { 45 | const timestamp = Math.ceil(Date.now() / 1000); 46 | const body = stringify({ 47 | user_id: this.pdId, 48 | timestamp, 49 | sign: this.calculateSign(timestamp), 50 | request_id: id, 51 | }); 52 | const res = await axios.post('http://pred.fateadm.com/api/capjust', body, { 53 | headers: { 'Content-type': 'application/x-www-form-urlencoded' }, 54 | }); 55 | const response = res.data as CapjustApi; 56 | if (response.RetCode !== '0') { 57 | throw new Error(`Refund Request Error, Msg=${response.ErrMsg}`); 58 | } 59 | Logger.info(`Successfully Request Refund, RequestId=${id}`); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | # WebStorm 107 | .idea 108 | 109 | # Config 110 | config.yaml 111 | forms 112 | tasks 113 | 114 | # Data 115 | data 116 | -------------------------------------------------------------------------------- /src/school/school.ts: -------------------------------------------------------------------------------- 1 | import axios, { Axios } from 'axios'; 2 | import { HttpsProxyAgent } from 'https-proxy-agent'; 3 | 4 | import { Logger } from '@/logger'; 5 | 6 | import type { SchoolInfo, SchoolListItem } from './types/common'; 7 | import type { TenantInfoApi } from './types/tenant-info-api'; 8 | import type { TenantListSortApi } from './types/tenant-list-sort-api'; 9 | 10 | export class School { 11 | private static readonly schoolList: SchoolListItem[] = []; 12 | private static client: Axios; 13 | 14 | private schoolItem: SchoolListItem; 15 | private schoolInfo: SchoolInfo; 16 | 17 | constructor(schoolName) { 18 | this.getSchoolItem(schoolName); 19 | } 20 | 21 | static async initSchoolList(proxy?: string): Promise { 22 | School.client = axios.create({ 23 | proxy: false, 24 | ...(proxy && { httpsAgent: new HttpsProxyAgent(proxy) }), 25 | }); 26 | 27 | Logger.debug('Loading School List...'); 28 | const res = await School.client.get( 29 | 'https://static.campushoy.com/apicache/tenantListSort', 30 | ); 31 | 32 | const response = res.data as TenantListSortApi; 33 | if (response.errCode !== 0) { 34 | throw new Error(`Can Not Get Schools List: ${response.errMsg}`); 35 | } 36 | response.data.forEach(section => { 37 | School.schoolList.push(...section.datas); 38 | }); 39 | Logger.debug(`Successfully Get ${this.schoolList.length} Schools`); 40 | } 41 | 42 | private getSchoolItem(schoolName): void { 43 | const school = School.schoolList.find(value => value.name === schoolName); 44 | if (!school) { 45 | throw new Error(`Could not find the school: ${schoolName}`); 46 | } 47 | this.schoolItem = school; 48 | Logger.debug(`Your School Id is "${this.schoolItem.id}"`); 49 | } 50 | 51 | async loadSchoolInfo(): Promise { 52 | const res = await School.client.get( 53 | 'https://mobile.campushoy.com/v6/config/guest/tenant/info', 54 | { 55 | params: { ids: this.schoolItem.id }, 56 | }, 57 | ); 58 | const response = res.data as TenantInfoApi; 59 | if (response.errCode !== 0) { 60 | throw new Error( 61 | `Could not get the school information with id ${this.schoolItem.id}`, 62 | ); 63 | } 64 | this.schoolInfo = response.data[0]; 65 | 66 | if (this.schoolInfo.joinType !== 'CLOUD') { 67 | throw new Error('Only Support Cloud School'); 68 | } 69 | 70 | Logger.debug( 71 | `Your School Name is ${this.schoolInfo.name} And Url is ${this.schoolInfo.idsUrl}`, 72 | ); 73 | } 74 | 75 | getSchoolUrl(): string { 76 | return new URL(this.schoolInfo.idsUrl).origin; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/noticer/noticer.ts: -------------------------------------------------------------------------------- 1 | import type { Client } from 'oicq'; 2 | import { createClient } from 'oicq'; 3 | import { join } from 'path'; 4 | 5 | import type { NoticerConfig } from '@/config/app-config.schema'; 6 | import { Logger } from '@/logger'; 7 | 8 | import { Queue } from './queue'; 9 | import type { Message } from './types/common'; 10 | 11 | const INTERVAL_TIME = 1000; 12 | 13 | export class Noticer { 14 | private readonly client: Client; 15 | private readonly msgQueue: Queue; 16 | private job: NodeJS.Timer; 17 | 18 | constructor(private readonly noticerConfig: NoticerConfig) { 19 | if (!this.noticerConfig.enable) return; 20 | this.msgQueue = new Queue(); 21 | this.job = null; 22 | this.client = createClient(noticerConfig.qq, { 23 | platform: 2, 24 | log_level: 'off', 25 | data_dir: join(__dirname, '..', '..', 'data'), 26 | }); 27 | this.client 28 | .on('system.login.device', event => { 29 | Logger.error(event.url); 30 | Logger.error('Please Enter This Url to Finish Device Lock'); 31 | process.exit(-1); 32 | }) 33 | .login(noticerConfig.password) 34 | .then(() => { 35 | Logger.info(`Noticer QQ ${noticerConfig.qq} Logged Succeed`); 36 | }) 37 | .catch(e => { 38 | Logger.error(e); 39 | process.exit(-1); 40 | }); 41 | } 42 | 43 | private async send(): Promise { 44 | if (this.msgQueue.empty()) return false; 45 | const msg = this.msgQueue.front(); 46 | this.msgQueue.pop(); 47 | Logger.info(`Sending Message to ${msg.qq} ...`); 48 | try { 49 | await this.client.sendPrivateMsg(msg.qq, msg.message); 50 | Logger.info(`Sending Message to ${msg.qq} Succeed`); 51 | } catch (err) { 52 | if (msg.counter >= 3) throw err; 53 | Logger.warn(`Sending Message to ${msg.qq} Fail, Msg: ${err.message}`); 54 | this.msgQueue.push({ 55 | qq: msg.qq, 56 | message: msg.message, 57 | counter: msg.counter + 1, 58 | }); 59 | } 60 | return true; 61 | } 62 | 63 | private createSend(msg: Message): void { 64 | Logger.debug(`Pushing ${msg.qq} Message Into Queue...`); 65 | this.msgQueue.push(msg); 66 | if (this.job) return; 67 | this.job = setInterval(() => { 68 | this.send() 69 | .then(hasMessages => { 70 | if (!hasMessages) { 71 | clearInterval(this.job); 72 | this.job = null; 73 | } 74 | }) 75 | .catch(reason => { 76 | if (this.msgQueue.empty() && this.job) { 77 | clearInterval(this.job); 78 | this.job = null; 79 | } 80 | Logger.error(reason); 81 | }); 82 | }, INTERVAL_TIME); 83 | } 84 | 85 | sendMessage(msg: string, qq: number): void { 86 | if (!this.noticerConfig.enable) return; 87 | this.createSend({ message: msg, qq: qq, counter: 0 }); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/task/task.ts: -------------------------------------------------------------------------------- 1 | import moment from 'moment'; 2 | import type { Job } from 'node-schedule'; 3 | import { scheduleJob } from 'node-schedule'; 4 | 5 | import type { UserConfig } from '@/config/app-config.schema'; 6 | import type { TaskConfigItem } from '@/config/task-config.schema'; 7 | import { Logger } from '@/logger'; 8 | import type { Login } from '@/login/login'; 9 | import type { Noticer } from '@/noticer/noticer'; 10 | import type { Sign } from '@/sign/sign'; 11 | 12 | export class Task { 13 | private readonly job: Job; 14 | 15 | constructor( 16 | private readonly task: TaskConfigItem, 17 | private readonly login: Login, 18 | private readonly sign: Sign, 19 | private readonly noticer: Noticer, 20 | private readonly userConfig: UserConfig, 21 | ) { 22 | this.job = scheduleJob(this.task.cron, () => { 23 | this.handle().catch(reason => { 24 | Logger.error(reason); 25 | this.noticer.sendMessage( 26 | `User ${this.userConfig.school}-${this.userConfig.username}'s ` + 27 | `Task /${this.task.titleRegex}/ Submission Error: ${reason.toString()}`, 28 | this.userConfig.qq, 29 | ); 30 | }); 31 | }); 32 | Logger.info( 33 | `User ${this.userConfig.school}-${this.userConfig.username} Task's ` + 34 | `Name Like /${this.task.titleRegex}/ Will Run on ` + 35 | `${moment(this.getNextInvocation()).format('YYYY-MM-DD HH:mm:ss')}`, 36 | ); 37 | } 38 | 39 | getNextInvocation(): Date { 40 | return new Date(this.job.nextInvocation()); 41 | } 42 | 43 | private async handle() { 44 | Logger.info( 45 | `User ${this.userConfig.school}-${this.userConfig.username} Task's ` + 46 | `Name Like /${this.task.titleRegex}/ Running...`, 47 | ); 48 | await this.login.login(); 49 | const result = await this.sign.submit(this.task); 50 | if (result.success) { 51 | Logger.info( 52 | `User ${this.userConfig.school}-${this.userConfig.username}'s Task ` + 53 | `${result.name} Submitted Successfully, Message: ${result.message}`, 54 | ); 55 | this.noticer.sendMessage( 56 | `User ${this.userConfig.school}-${this.userConfig.username}'s ` + 57 | `Task "${result.name}" Submitted Successfully`, 58 | this.userConfig.qq, 59 | ); 60 | } else { 61 | Logger.warn( 62 | `User ${this.userConfig.school}-${this.userConfig.username}'s Task ` + 63 | `${result.name} Submission Failed, Message: ${result.message}`, 64 | ); 65 | this.noticer.sendMessage( 66 | `User ${this.userConfig.school}-${this.userConfig.username}'s ` + 67 | `Task "${result.name}" Submission Failed, Message: ${result.message}`, 68 | this.userConfig.qq, 69 | ); 70 | } 71 | Logger.info( 72 | `User ${this.userConfig.school}-${this.userConfig.username} Task's ` + 73 | `Name Like /${this.task.titleRegex}/ Will Run on ` + 74 | `${moment(this.getNextInvocation()).format('YYYY-MM-DD HH:mm:ss')}`, 75 | ); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/user/user.ts: -------------------------------------------------------------------------------- 1 | import axios, { Axios } from 'axios'; 2 | import wrapper from 'axios-cookiejar-support'; 3 | import { HttpsProxyAgent } from 'https-proxy-agent'; 4 | import { CookieJar } from 'tough-cookie'; 5 | 6 | import type { AppConfig } from '@/config/app-config'; 7 | import type { UserConfig } from '@/config/app-config.schema'; 8 | import { TaskConfig } from '@/config/task-config'; 9 | import { Logger } from '@/logger'; 10 | import { Login } from '@/login/login'; 11 | import type { Noticer } from '@/noticer/noticer'; 12 | import { School } from '@/school/school'; 13 | import { Sign } from '@/sign/sign'; 14 | import { Task } from '@/task/task'; 15 | 16 | export class User { 17 | // noinspection JSMismatchedCollectionQueryUpdate 18 | private readonly tasks: Task[]; 19 | private readonly client: Axios; 20 | private readonly taskConfig: TaskConfig; 21 | private school: School; 22 | private login: Login; 23 | private sign: Sign; 24 | constructor( 25 | private readonly appConfig: AppConfig, 26 | private readonly userConfig: UserConfig, 27 | private readonly noticer: Noticer, 28 | ) { 29 | this.tasks = []; 30 | this.taskConfig = new TaskConfig(this.userConfig); 31 | this.client = wrapper( 32 | axios.create({ 33 | headers: { 34 | Accept: 'application/json, text/plain, */*', 35 | 'User-Agent': 36 | 'Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Build/RKQ1.200826.002) ' + 37 | 'AppleWebKit/537.36 (KHTML, like Gecko) ' + 38 | 'Chrome/89.0.4389.82 ' + 39 | 'Safari/537.36', 40 | 'Accept-Encoding': 'gzip, deflate, br', 41 | 'Accept-Language': 'zh-CN,zh;q=0.9', 42 | Connection: 'Keep-Alive', 43 | 'X-Requested-With': 'XMLHttpRequest', 44 | }, 45 | jar: new CookieJar(), 46 | withCredentials: true, 47 | proxy: false, 48 | ...(appConfig.config.proxy && new HttpsProxyAgent(appConfig.config.proxy)), 49 | }), 50 | ); 51 | } 52 | 53 | async loadTaskConfig() { 54 | Logger.info( 55 | `Loading Config for User ${this.userConfig.school}-${this.userConfig.username}`, 56 | ); 57 | if (!this.taskConfig.getConfig()) { 58 | await this.login.login(); 59 | const newConfig = await this.sign.generateConfig(); 60 | this.taskConfig.update(newConfig); 61 | await this.taskConfig.saveFile(); 62 | throw new Error( 63 | `Please Finish Task Config ${this.userConfig.school}-${this.userConfig.username}.yaml`, 64 | ); 65 | } 66 | } 67 | 68 | async init() { 69 | try { 70 | Logger.info( 71 | `Initializing User ${this.userConfig.school}-${this.userConfig.username}`, 72 | ); 73 | this.school = new School(this.userConfig.school); 74 | await this.school.loadSchoolInfo(); 75 | this.login = new Login( 76 | this.appConfig.config.login, 77 | this.userConfig, 78 | this.school, 79 | this.client, 80 | ); 81 | this.sign = new Sign(this.school, this.userConfig, this.client); 82 | await this.loadTaskConfig(); 83 | } catch (e) { 84 | Logger.error( 85 | `User ${this.userConfig.school}-${this.userConfig.username} initialization failed`, 86 | ); 87 | throw e; 88 | } 89 | } 90 | 91 | start() { 92 | Logger.info( 93 | `Registering User ${this.userConfig.school}-${this.userConfig.username} Tasks...`, 94 | ); 95 | const { tasks } = this.taskConfig.getConfig(); 96 | tasks.forEach(task => { 97 | if (task.enable) { 98 | this.tasks.push( 99 | new Task(task, this.login, this.sign, this.noticer, this.userConfig), 100 | ); 101 | } 102 | }); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/login/login.ts: -------------------------------------------------------------------------------- 1 | import type { Axios } from 'axios'; 2 | import { stringify } from 'querystring'; 3 | import type { CookieJar } from 'tough-cookie'; 4 | 5 | import { Captcha } from '@/captcha/captcha'; 6 | import type { IdentifyResult } from '@/captcha/types/common'; 7 | import type { LoginConfig, UserConfig } from '@/config/app-config.schema'; 8 | import { Logger } from '@/logger'; 9 | import type { School } from '@/school/school'; 10 | 11 | import type { LoginPostBody } from './types/common'; 12 | import type { DoLoginApi } from './types/do-login-api'; 13 | 14 | function sleep(x) { 15 | return new Promise(resolve => setTimeout(resolve, x)); 16 | } 17 | 18 | export class Login { 19 | private readonly captcha: Captcha; 20 | private readonly schoolUrl: string; 21 | 22 | constructor( 23 | private readonly loginConfig: LoginConfig, 24 | private readonly userConfig: UserConfig, 25 | private readonly school: School, 26 | private readonly client: Axios, 27 | ) { 28 | this.schoolUrl = school.getSchoolUrl(); 29 | if (loginConfig.captcha.enable) { 30 | this.captcha = new Captcha(loginConfig.captcha.pdId, loginConfig.captcha.pdKey); 31 | } 32 | } 33 | 34 | private removeAllCookie(): Promise { 35 | return new Promise((resolve, reject) => { 36 | (this.client.defaults.jar as CookieJar).removeAllCookies(err => { 37 | if (err) reject(err); 38 | resolve(); 39 | }); 40 | }); 41 | } 42 | 43 | private async getLt(): Promise { 44 | const res = await this.client.get(this.schoolUrl + '/iap/login', { 45 | params: { service: this.schoolUrl + '/portal/login' }, 46 | }); 47 | const lt = /_2lBepC=([^&]+)/g.exec(res.request.path)[1]; 48 | Logger.debug(`Successfully Get lt=${lt}`); 49 | return lt; 50 | } 51 | 52 | private async getCaptcha(lt: string): Promise { 53 | Logger.debug('Getting Captcha...'); 54 | const res = await this.client.get(this.schoolUrl + '/iap/generateCaptcha', { 55 | params: { ltId: lt }, 56 | responseType: 'arraybuffer', 57 | }); 58 | const response = res.data as Buffer; 59 | return response.toString('base64'); 60 | } 61 | 62 | private async doLogin(): Promise { 63 | const { retryTimes } = this.loginConfig; 64 | const { username, password } = this.userConfig; 65 | let counter = 0; 66 | let needCaptcha = false; 67 | while (true) { 68 | const lt = await this.getLt(); 69 | if (counter) { 70 | Logger.info(`Retrying... Number of Retries ${counter}`); 71 | } 72 | let captchaResult: IdentifyResult; 73 | if (needCaptcha) { 74 | if (!this.loginConfig.captcha.enable) { 75 | throw new Error(`Require Enable Captcha Identify`); 76 | } 77 | const image = await this.getCaptcha(lt); 78 | try { 79 | captchaResult = await this.captcha.identify(image); 80 | } catch (e) { 81 | Logger.warn(e); 82 | } 83 | } 84 | const body: LoginPostBody = { 85 | username, 86 | password, 87 | lt, 88 | mobile: '', 89 | dllt: '', 90 | captcha: captchaResult ? captchaResult.result : '', 91 | rememberMe: false, 92 | }; 93 | const res = await this.client.post( 94 | this.schoolUrl + '/iap/doLogin', 95 | stringify(Object(body)), 96 | ); 97 | const response = res.data as DoLoginApi; 98 | if (response.resultCode === 'REDIRECT') { 99 | await this.client.get(response.url); 100 | Logger.info( 101 | `User ${this.userConfig.school}-${this.userConfig.username} Logged Succeed`, 102 | ); 103 | return; 104 | } 105 | counter++; 106 | needCaptcha = response.needCaptcha; 107 | if (response.resultCode === 'CAPTCHA_NOTMATCH') { 108 | Logger.warn( 109 | `User ${this.userConfig.school}-${this.userConfig.username} Error Captcha Code`, 110 | ); 111 | if (captchaResult) { 112 | try { 113 | await this.captcha.requestRefund(captchaResult.id); 114 | } catch (e) { 115 | Logger.warn(e); 116 | } 117 | } 118 | } else if (response.resultCode === 'LT_NOTMATCH') { 119 | Logger.warn( 120 | `User ${this.userConfig.school}-${this.userConfig.username} Error LT, lt=${lt}`, 121 | ); 122 | } else if (response.resultCode === 'FAIL_UPNOTMATCH') { 123 | throw new Error( 124 | `User ${this.userConfig.school}-${this.userConfig.username} Error Username or Password`, 125 | ); 126 | } else { 127 | Logger.warn( 128 | `User ${this.userConfig.school}-${this.userConfig.username} ` + 129 | `Unknown Error: ${response.resultCode}`, 130 | ); 131 | } 132 | if (counter > retryTimes) { 133 | throw new Error(`Login Error, resultCode=${response.resultCode}`); 134 | } 135 | await sleep(1000); 136 | } 137 | } 138 | 139 | async login(): Promise { 140 | Logger.debug(`Logging...`); 141 | await this.removeAllCookie(); 142 | await this.doLogin(); 143 | Logger.debug(`Logging Finished`); 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Campushoy Auto Sign 2 | 今日校园自动签到 3 | 4 | 目前仅支持以 CLOUD 方式接入的学校 5 | 6 | **本项目仅供学习用途,禁止用于任何违法行为,因违规使用造成一切不良后果由用户自行负责,与本作者无关。** 7 | 8 | ## 运行环境 9 | [Node.js](https://nodejs.org) 16+ 10 | 11 | ## 部署指南 12 | 13 | ### 本地构建 14 | 15 | 教程基于类UNIX操作系统,Windows操作系统请自行替换相关命令。 16 | 17 | 请确保安装好了 [Node.js](https://nodejs.org/zh-cn/download/) 和 [Yarn](https://yarn.bootcss.com/docs/install) 18 | 19 | 对于服务器位于中国大陆的用户,建议使用下面的命令更换更换镜像源 20 | ```bash 21 | yarn config set registry https://registry.npm.taobao.org 22 | ``` 23 | 24 | 执行以下命令 25 | ```bash 26 | git clone https://github.com/AntaresQAQ/campushoy-auto-sign.git 27 | cd campushoy-auto-sign 28 | yarn 29 | yarn build 30 | ``` 31 | 等待依赖包安装完成 32 | 33 | 复制一份模板配置文件 34 | 35 | ```bash 36 | cp config-example.yaml config.yaml 37 | ``` 38 | 39 | 编辑文件`config.yaml`,样例如下: 40 | 41 | ```yaml 42 | users: #用户列表 43 | - school: # 用户1 学校名称 44 | username: # 用户1 用户名,一个字符串 45 | password: # 用户1 密码,一个字符串 46 | qq: # 用户2 接收推送QQ号,一个数字,选填 47 | 48 | - school: # 用户2 格式同上,没有请删掉,但不可留空 49 | username: 50 | password: 51 | qq: 52 | 53 | login: 54 | retryTimes: 5 # 登录重试次数,必须是大于0的数字 55 | captcha: # 自动打码 56 | enable: false # 必须是 true 或 false 57 | pdId: # 请前往 http://www.fateadm.com 获取,一个字符串,选填 58 | pdKey: # 请前往 http://www.fateadm.com 获取,一个字符串,选填 59 | 60 | noticer: # QQ消息推送 61 | enable: false # 必须是 true 或 false 62 | qq: # 负责推送消息的QQ号,一个数字,选填 63 | password: # 负责推送消息的QQ密码,一个字符串,选填 64 | 65 | proxy: http://username:password@127.0.0.1:8080 # 代理,一个URL,支持http或https,选填 66 | 67 | logLevel: info # 日志级别 debug/info/warn/error 68 | ``` 69 | 70 | 完成后,执行 71 | 72 | ```bash 73 | yarn start 74 | ``` 75 | 76 | 程序会根据你今日校园的信息收集表在`tasks`目录下生成对应每个用户的配置文件`-.yaml` 77 | 78 | 生成的表单模板类似这样: 79 | 80 | ```yaml 81 | tasks: 82 | - enable: true 83 | titleRegex: '\d+月\d+日体温监测和定位签到' # 匹配任务名的正则表达式 84 | cron: 10 0 12 * * ? # 不带年的cron规则,每天 12:00:10 执行 85 | address: 'xx省xx市xx区xx路' 86 | position: 87 | latitude: 0.1234 # 纬度 88 | longitude: 5.6789 # 经度 89 | abnormalReason: '' # 异常原因,可不填 90 | needPhoto: false # 是否需要照片,无需修改 91 | photoPath: '' # 如果 needPhoto 为 true 则需要填写图片的绝对路径 92 | needExtra: true # 是否需要附加问题,无需修改 93 | extraFields: # 如果 needExtra 为 true 则需要填写以下表单 94 | - title: 你今天上午的体温是 95 | hasOther: true # 是否有其它选项 96 | answer: '36.5' # 填写下面的选项,如果 hasOther 为 true 可以按需填写 97 | options: 98 | - 其它 99 | - title: 你今天下午的体温是 100 | hasOther: true # 是否有其它选项 101 | answer: '36.5' # 填写下面的选项,如果 hasOther 为 true 可以按需填写 102 | options: 103 | - 其它 104 | - title: 近14天你是否有过以下情况 105 | hasOther: false # 是否有其它选项 106 | answer: 没有以上三种情况 # 填写下面的选项,如果 hasOther 为 true 可以按需填写 107 | options: 108 | - 接触过新冠肺炎病例、疑似病例、无症状感染者 109 | - 接触过境外返回人士 110 | - 接触过中高风险区人士 111 | - 没有以上三种情况 112 | - title: 目前你所在位置或校区 113 | hasOther: false # 是否有其它选项 114 | answer: B校区 115 | options: 116 | - 在校外 117 | - A校区 118 | - B校区 119 | - C校区 120 | 121 | ``` 122 | 请按照实际需求填写表单配置文件,如果不会填写cron规则,可以使用 来生成,不要填写年(去掉最后一项) 123 | 124 | 关于经纬度,要填写 [**BD-09坐标系**](https://lbsyun.baidu.com/index.php?title=coordinate) 的坐标,可以从百度提供的 [拾取坐标系统](https://api.map.baidu.com/lbsapi/getpoint/index.html) 获取,坐标尽量精确。 125 | 126 | 填写好以后重新执行: 127 | 128 | ```bash 129 | yarn start 130 | ``` 131 | 132 | 程序开始运行。 133 | 134 | ### 使用Docker 135 | 136 | 项目提供一个docker公共镜像,也可根据`Dockerfile`自行构建。 137 | 138 | 这里提供公共镜像使用指南。 139 | 140 | 请确保安装好Docker,以ubuntu为例,执行`apt install docker.io`即可安装。 141 | 142 | ```bash 143 | docker pull antaresqaq/campushoy-auto-sign:current 144 | ``` 145 | 146 | 在宿主机准备好`config.yaml`和`tasks`文件夹,`config.yaml`填写方式见[本地构建](#mkcfg),`tasks`留空即可。 147 | 148 | ```bash 149 | docker run -d --name auto-sign \ 150 | -v /path/to/config.yaml:/app/config.yaml \ 151 | -v /path/to/tasks:/app/tasks \ 152 | antaresqaq/campushoy-auto-sign:current 153 | ``` 154 | 155 | PS: 如果使用了消息推送,你可能需要检查docker日志获取验证链接完成设备认证. 156 | 157 | 完成`tasks`文件夹内的配置,填写方式见[本地构建](#mktsk)。 158 | 159 | 完成后执行以下命令重启容器即可。 160 | 161 | ```bash 162 | docker restart auto-sign 163 | ``` 164 | 165 | ### 自行构建Docker容器 166 | 167 | 先执行 `yarn build` 编译 TypeScript,然后执行 `docker build` 命令。 168 | 169 | ```bash 170 | git clone https://github.com/AntaresQAQ/campushoy-auto-sign.git 171 | cd campushoy-auto-sign 172 | yarn 173 | yarn build 174 | docker build --tag yourname/campushoy-auto-sign:current . 175 | ``` 176 | 177 | ## Q&A 178 | 179 | ### 如何后台运行 180 | 181 | 建议使用screen运行 182 | 183 | ```bash 184 | screen -S sign 185 | ``` 186 | 187 | 在新的终端内执行 188 | 189 | ```bash 190 | yarn start 191 | ``` 192 | 193 | 按下Ctrl+A后,按D即可将终端切后台运行。 194 | 195 | 执行 `screen -r sign` 可再次进入。 196 | 197 | ### 推送QQ配置 198 | 199 | 正确填写推送QQ的相关配置后,执行: 200 | 201 | ```bash 202 | yarn start 203 | ``` 204 | 205 | 如果需要登陆验证,日志会输出一个url,打开即可扫码。 206 | 207 | 扫码后重新运行程序即可。 208 | 209 | ### 配置文件错误 210 | 211 | 1. 检查配置文件是否有漏项。 212 | 2. 检查类型是否一致,纯数字字符串务必使用`''`或`""`。 213 | 214 | ### 没有按时运行 215 | 216 | 1. 请检查cron填写是否正确,必须是不带年份的合法规则 217 | 2. 请检查电脑时间是否正确,时区在调整为东八区 218 | 3. 尝试重启进程 219 | 220 | ### 表单提交失败 221 | 222 | 1. 检查所有必填项是否已经填写 223 | 2. 检查是否打开了选填项开关但是未填写 224 | 3. 正确填写了**BD-09坐标系**经纬度和位置 225 | 4. 检查表单一致性,不一致请重新生成表单 226 | 227 | ### Error: Require Enable Captcha Identify 228 | - **解决方案一:** 229 | 去[斐斐打码](http://www.fateadm.com)注册账号获取ID和KEY 230 | 在`config.yaml`中配置好验证码识别 231 | 232 | - **解决方案二:** 233 | 在`config.yaml`中修改`logLevel`为`debug` 234 | 在输出的日志内得到学校的登录链接 235 | 浏览器打开链接输入验证码登录一次 236 | 237 | ### HTTP ERROR CODE 418 238 | 原因:目前推测是IP地址被今日校园加入了黑名单,解决方案如下: 239 | - 方案一:使用代理 240 | - 方案二:换一个IP 241 | 242 | ### 设置环境变量代理后出现400 243 | axios的bug,目前通过其他方式绕过,请拉取最新代码并重新构建运行。 244 | 最新版本会忽略系统环境变量代理,并以`config.yaml`内代理设置作为唯一依据。 245 | 246 | ## 提出 Issues 247 | ### 准备 248 | 请在`config.yaml`中修改`logLevel`为`debug` 249 | 250 | ### 模板 251 | 请您**严格按照模板**填写您遇到的问题。 252 | -------------------------------------------------------------------------------- /src/sign/sign.ts: -------------------------------------------------------------------------------- 1 | import type { Axios } from 'axios'; 2 | import CryptoJS from 'crypto-js'; 3 | import FormData from 'form-data'; 4 | import { readFile } from 'fs-extra'; 5 | import { v1 as UUIDv1 } from 'uuid'; 6 | 7 | import type { UserConfig } from '@/config/app-config.schema'; 8 | import { 9 | TaskConfigExtraFieldsItem, 10 | TaskConfigItem, 11 | TaskConfigSchema, 12 | } from '@/config/task-config.schema'; 13 | import { Logger } from '@/logger'; 14 | import type { School } from '@/school/school'; 15 | 16 | import type { 17 | CryptTaskForm, 18 | Extension, 19 | SubmitResult, 20 | TaskForm, 21 | TasksResult, 22 | } from './types/common'; 23 | import type { 24 | DetailSignInstanceApi, 25 | DetailSignInstanceApiDatas, 26 | } from './types/detail-sign-instance-api'; 27 | import type { GetStuSignInfosInOneDayApi } from './types/get-stu-sign-infos-in-one-day-api'; 28 | import type { GetUploadPolicyApi } from './types/get-upload-policy-api'; 29 | import type { PreviewAttachmentApi } from './types/preview-attachment-api'; 30 | import type { SubmitSignApi } from './types/submit-sign-api'; 31 | 32 | const APP_VERSION = '9.0.12'; 33 | const AES_KEY = 'ytUQ7l2ZZu8mLvJZ'; 34 | const DES_KEY = 'b3L26XNL'; 35 | 36 | export class Sign { 37 | private readonly schoolUrl: string; 38 | 39 | constructor( 40 | private readonly school: School, 41 | private readonly userConfig: UserConfig, 42 | private readonly client: Axios, 43 | ) { 44 | this.schoolUrl = school.getSchoolUrl(); 45 | } 46 | 47 | private async getTaskDetails( 48 | signInstanceWid, 49 | signWid, 50 | ): Promise { 51 | const res = await this.client.post( 52 | this.schoolUrl + '/wec-counselor-sign-apps/stu/sign/detailSignInstance', 53 | { 54 | signInstanceWid, 55 | signWid, 56 | }, 57 | ); 58 | const response = res.data as DetailSignInstanceApi; 59 | return response.datas; 60 | } 61 | 62 | private async getTasks(): Promise { 63 | const res = await this.client.post( 64 | this.schoolUrl + '/wec-counselor-sign-apps/stu/sign/getStuSignInfosInOneDay', 65 | {}, 66 | ); 67 | const response = res.data as GetStuSignInfosInOneDayApi; 68 | const tasks: TasksResult = { 69 | signedTasks: [], 70 | unSignedTasks: [], 71 | }; 72 | for (const task of response.datas.unSignedTasks) { 73 | tasks.unSignedTasks.push( 74 | await this.getTaskDetails(task.signInstanceWid, task.signWid), 75 | ); 76 | } 77 | for (const task of response.datas.signedTasks) { 78 | tasks.signedTasks.push( 79 | await this.getTaskDetails(task.signInstanceWid, task.signWid), 80 | ); 81 | } 82 | return tasks; 83 | } 84 | 85 | async generateConfig(): Promise { 86 | const tasks = await this.getTasks(); 87 | const config = new TaskConfigSchema(); 88 | config.tasks = tasks.unSignedTasks.concat(tasks.signedTasks).map(task => { 89 | const taskConfigItem = new TaskConfigItem(); 90 | taskConfigItem.enable = true; 91 | taskConfigItem.titleRegex = task.taskName; 92 | taskConfigItem.cron = '0 0 8 * * *'; 93 | taskConfigItem.address = 'xx省xx市xx区xx路'; 94 | taskConfigItem.position = { latitude: 0.1234, longitude: 5.6789 }; 95 | taskConfigItem.abnormalReason = ''; 96 | taskConfigItem.needPhoto = !!task.isPhoto; 97 | taskConfigItem.photoPath = ''; 98 | taskConfigItem.needExtra = !!task.isNeedExtra; 99 | taskConfigItem.extraFields = task.extraField.map(extraField => { 100 | const configExtraFieldsItem = new TaskConfigExtraFieldsItem(); 101 | configExtraFieldsItem.title = extraField.title; 102 | configExtraFieldsItem.hasOther = !!extraField.hasOtherItems; 103 | configExtraFieldsItem.options = extraField.extraFieldItems.map(item => { 104 | configExtraFieldsItem.answer ||= item.value; 105 | return item.content; 106 | }); 107 | return configExtraFieldsItem; 108 | }); 109 | return taskConfigItem; 110 | }); 111 | return config; 112 | } 113 | 114 | private async uploadPhoto(path: string): Promise { 115 | const res1 = await this.client.post( 116 | this.schoolUrl + '/wec-counselor-sign-apps/stu/oss/getUploadPolicy', 117 | { fileType: 1 }, 118 | ); 119 | const response = res1.data as GetUploadPolicyApi; 120 | const file = await readFile(path); 121 | const form = new FormData(); 122 | form.append('key', response.datas.fileName); 123 | form.append('policy', response.datas.policy); 124 | form.append('OSSAccessKeyId', response.datas.accessid); 125 | form.append('success_action_status', '200'); 126 | form.append('signature', response.datas.signature); 127 | form.append('file', file); 128 | await this.client.post(response.datas.host, form, { 129 | headers: { 130 | ...form.getHeaders(), 131 | }, 132 | }); 133 | const res2 = await this.client.post( 134 | this.schoolUrl + '/wec-counselor-sign-apps/stu/sign/previewAttachment', 135 | { ossKey: response.datas.fileName }, 136 | ); 137 | return (res2.data as PreviewAttachmentApi).datas; 138 | } 139 | 140 | private async fillForm(configTask: TaskConfigItem): Promise<[string, TaskForm]> { 141 | Logger.debug(`Starting Fill From whose Task's Name Like ${configTask.titleRegex}`); 142 | const taskRegex = new RegExp(configTask.titleRegex); 143 | const tasks = await this.getTasks(); 144 | const task = tasks.unSignedTasks 145 | .concat(tasks.signedTasks) 146 | .find(task => taskRegex.test(task.taskName)); 147 | if (!task) { 148 | throw new Error(`Not Found a Task's Name Like ${configTask.titleRegex}`); 149 | } 150 | Logger.info(`Found Task ${task.taskName}, Filling...`); 151 | let photoUrl = ''; 152 | if (task.isPhoto && configTask.needPhoto) { 153 | photoUrl = await this.uploadPhoto(configTask.photoPath); 154 | } 155 | const form: TaskForm = { 156 | signInstanceWid: task.signInstanceWid, 157 | isMalposition: task.isMalposition, 158 | uaIsCpadaily: true, 159 | longitude: configTask.position.longitude, 160 | latitude: configTask.position.latitude, 161 | position: configTask.address, 162 | abnormalReason: configTask.abnormalReason, 163 | signPhotoUrl: photoUrl, 164 | isNeedExtra: task.isNeedExtra, 165 | extraFieldItems: task.isNeedExtra ? [] : undefined, 166 | }; 167 | if (task.isNeedExtra) { 168 | for ( 169 | let configIndex = 0, taskIndex = 0; 170 | configIndex < configTask.extraFields.length && taskIndex < task.extraField.length; 171 | configIndex++, taskIndex++ 172 | ) { 173 | const configExtraFieldItem = configTask.extraFields[configIndex]; 174 | const taskExtraFieldItem = task.extraField[taskIndex]; 175 | if (configExtraFieldItem.title !== taskExtraFieldItem.title) { 176 | throw new Error('An Error Field Title On the Task Config File'); 177 | } 178 | const option = taskExtraFieldItem.extraFieldItems.find( 179 | item => item.content === configExtraFieldItem.answer, 180 | ); 181 | if (option) { 182 | form.extraFieldItems.push({ 183 | extraFieldItemWid: option.wid, 184 | extraFieldItemValue: configExtraFieldItem.answer, 185 | }); 186 | } else { 187 | if (taskExtraFieldItem.hasOtherItems) { 188 | const otherOption = taskExtraFieldItem.extraFieldItems.find( 189 | item => !!item.isOtherItems, 190 | ); 191 | form.extraFieldItems.push({ 192 | extraFieldItemWid: otherOption.wid, 193 | extraFieldItemValue: configExtraFieldItem.answer, 194 | }); 195 | } else { 196 | throw new Error('An Error Option On the Task Config File'); 197 | } 198 | } 199 | } 200 | } 201 | Logger.debug('Filling Task Form Finished'); 202 | return [task.taskName, form]; 203 | } 204 | 205 | private static DESEncrypt(data: string): string { 206 | const key = CryptoJS.enc.Utf8.parse(DES_KEY); 207 | const iv = CryptoJS.enc.Hex.parse('0102030405060708'); 208 | return CryptoJS.DES.encrypt(data, key, { 209 | iv, 210 | mode: CryptoJS.mode.CBC, 211 | padding: CryptoJS.pad.Pkcs7, 212 | }).toString(); 213 | } 214 | 215 | private static encryptForm(form: TaskForm, extension: Extension): CryptTaskForm { 216 | const key = CryptoJS.enc.Utf8.parse(AES_KEY); 217 | const iv = CryptoJS.enc.Hex.parse('01020304050607080901020304050607'); 218 | const bodyString = CryptoJS.AES.encrypt(JSON.stringify(form), key, { iv }).toString(); 219 | const signBody = { 220 | appVersion: APP_VERSION, 221 | bodyString: bodyString, 222 | deviceId: extension.deviceId, 223 | lat: extension.lat, 224 | lon: extension.lon, 225 | model: extension.model, 226 | systemName: extension.systemName, 227 | systemVersion: extension.systemVersion, 228 | userId: extension.userId, 229 | }; 230 | let signString = ''; 231 | for (const key in signBody) { 232 | signString += `${key}=${signBody[key]}&`; 233 | } 234 | signString += AES_KEY; 235 | const sign = CryptoJS.MD5(signString).toString(); 236 | return { 237 | ...extension, 238 | bodyString: bodyString, 239 | calVersion: 'firstv', 240 | version: 'first_v2', 241 | sign: sign, 242 | }; 243 | } 244 | 245 | async submit(task: TaskConfigItem): Promise { 246 | const [name, form] = await this.fillForm(task); 247 | const extension: Extension = { 248 | lon: form.longitude, 249 | lat: form.latitude, 250 | model: 'Redmi K20 Pro', 251 | appVersion: APP_VERSION, 252 | systemVersion: '11', 253 | userId: this.userConfig.username, 254 | systemName: 'android', 255 | deviceId: UUIDv1(), 256 | }; 257 | const cryptTaskForm = Sign.encryptForm(form, extension); 258 | const res = await this.client.post( 259 | this.schoolUrl + '/wec-counselor-sign-apps/stu/sign/submitSign', 260 | cryptTaskForm, 261 | { 262 | headers: { 263 | 'User-Agent': 264 | 'Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Build/RKQ1.200826.002) ' + 265 | 'AppleWebKit/537.36 (KHTML, like Gecko) ' + 266 | 'Chrome/89.0.4389.82 ' + 267 | 'Safari/537.36', 268 | CpdailyStandAlone: '0', 269 | extension: '1', 270 | 'Cpdaily-Extension': Sign.DESEncrypt(JSON.stringify(extension)), 271 | 'Content-Type': 'application/json; charset=utf-8', 272 | Host: new URL(this.schoolUrl).host, 273 | Connection: 'Keep-Alive', 274 | 'Accept-Encoding': 'gzip', 275 | }, 276 | }, 277 | ); 278 | const response = res.data as SubmitSignApi; 279 | Logger.debug('Submitting Task Form Finished'); 280 | return { 281 | name, 282 | success: response.message === 'SUCCESS', 283 | message: response.message, 284 | }; 285 | } 286 | } 287 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.12.11": 6 | version "7.12.11" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" 8 | integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.18.6": 13 | version "7.19.1" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" 15 | integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.18.6" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 20 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.18.6" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@cspotcode/source-map-support@^0.8.0": 27 | version "0.8.1" 28 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 29 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 30 | dependencies: 31 | "@jridgewell/trace-mapping" "0.3.9" 32 | 33 | "@eslint/eslintrc@^0.4.3": 34 | version "0.4.3" 35 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" 36 | integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== 37 | dependencies: 38 | ajv "^6.12.4" 39 | debug "^4.1.1" 40 | espree "^7.3.0" 41 | globals "^13.9.0" 42 | ignore "^4.0.6" 43 | import-fresh "^3.2.1" 44 | js-yaml "^3.13.1" 45 | minimatch "^3.0.4" 46 | strip-json-comments "^3.1.1" 47 | 48 | "@humanwhocodes/config-array@^0.5.0": 49 | version "0.5.0" 50 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" 51 | integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== 52 | dependencies: 53 | "@humanwhocodes/object-schema" "^1.2.0" 54 | debug "^4.1.1" 55 | minimatch "^3.0.4" 56 | 57 | "@humanwhocodes/object-schema@^1.2.0": 58 | version "1.2.1" 59 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 60 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 61 | 62 | "@jridgewell/resolve-uri@^3.0.3": 63 | version "3.1.0" 64 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 65 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 66 | 67 | "@jridgewell/sourcemap-codec@^1.4.10": 68 | version "1.4.14" 69 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 70 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 71 | 72 | "@jridgewell/trace-mapping@0.3.9": 73 | version "0.3.9" 74 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 75 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 76 | dependencies: 77 | "@jridgewell/resolve-uri" "^3.0.3" 78 | "@jridgewell/sourcemap-codec" "^1.4.10" 79 | 80 | "@nodelib/fs.scandir@2.1.5": 81 | version "2.1.5" 82 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 83 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 84 | dependencies: 85 | "@nodelib/fs.stat" "2.0.5" 86 | run-parallel "^1.1.9" 87 | 88 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 89 | version "2.0.5" 90 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 91 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 92 | 93 | "@nodelib/fs.walk@^1.2.3": 94 | version "1.2.8" 95 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 96 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 97 | dependencies: 98 | "@nodelib/fs.scandir" "2.1.5" 99 | fastq "^1.6.0" 100 | 101 | "@tsconfig/node10@^1.0.7": 102 | version "1.0.9" 103 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 104 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 105 | 106 | "@tsconfig/node12@^1.0.7": 107 | version "1.0.11" 108 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 109 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 110 | 111 | "@tsconfig/node14@^1.0.0": 112 | version "1.0.3" 113 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 114 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 115 | 116 | "@tsconfig/node16@^1.0.2": 117 | version "1.0.3" 118 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 119 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 120 | 121 | "@types/bunyan@^1.8.7": 122 | version "1.8.8" 123 | resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.8.tgz#8d6d33f090f37c07e2a80af30ae728450a101008" 124 | integrity sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow== 125 | dependencies: 126 | "@types/node" "*" 127 | 128 | "@types/crypto-js@^4.0.2": 129 | version "4.1.1" 130 | resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" 131 | integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== 132 | 133 | "@types/fs-extra@^9.0.13": 134 | version "9.0.13" 135 | resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" 136 | integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== 137 | dependencies: 138 | "@types/node" "*" 139 | 140 | "@types/js-yaml@^4.0.3": 141 | version "4.0.5" 142 | resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" 143 | integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== 144 | 145 | "@types/json-schema@^7.0.9": 146 | version "7.0.11" 147 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 148 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 149 | 150 | "@types/json5@^0.0.29": 151 | version "0.0.29" 152 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 153 | integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== 154 | 155 | "@types/node-schedule@^1.3.2": 156 | version "1.3.2" 157 | resolved "https://registry.yarnpkg.com/@types/node-schedule/-/node-schedule-1.3.2.tgz#cc7e32c6795cbadc8de03d0e1f86311727375423" 158 | integrity sha512-Y0CqdAr+lCpArT8CJJjJq4U2v8Bb5e7ru2nV/NhDdaptCMCRdOL3Y7tAhen39HluQMaIKWvPbDuiFBUQpg7Srw== 159 | dependencies: 160 | "@types/node" "*" 161 | 162 | "@types/node@*": 163 | version "18.11.7" 164 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.7.tgz#8ccef136f240770c1379d50100796a6952f01f94" 165 | integrity sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ== 166 | 167 | "@types/node@^16.11.1": 168 | version "16.18.2" 169 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.2.tgz#77878acc68c5f6241454008beedd39513bd8e851" 170 | integrity sha512-KIGQJyya+opDCFvDSZMNNS899ov5jlNdtN7PypgHWeb8e+5vWISdwTRo/ClsNVlmDihzOGqFyNBDamUs7TQQCA== 171 | 172 | "@types/semver@^7.3.12": 173 | version "7.3.13" 174 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" 175 | integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== 176 | 177 | "@types/tough-cookie@^4.0.1": 178 | version "4.0.2" 179 | resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" 180 | integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== 181 | 182 | "@types/uuid@^8.3.1": 183 | version "8.3.4" 184 | resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" 185 | integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== 186 | 187 | "@typescript-eslint/eslint-plugin@^5.1.0": 188 | version "5.41.0" 189 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.41.0.tgz#f8eeb1c6bb2549f795f3ba71aec3b38d1ab6b1e1" 190 | integrity sha512-DXUS22Y57/LAFSg3x7Vi6RNAuLpTXwxB9S2nIA7msBb/Zt8p7XqMwdpdc1IU7CkOQUPgAqR5fWvxuKCbneKGmA== 191 | dependencies: 192 | "@typescript-eslint/scope-manager" "5.41.0" 193 | "@typescript-eslint/type-utils" "5.41.0" 194 | "@typescript-eslint/utils" "5.41.0" 195 | debug "^4.3.4" 196 | ignore "^5.2.0" 197 | regexpp "^3.2.0" 198 | semver "^7.3.7" 199 | tsutils "^3.21.0" 200 | 201 | "@typescript-eslint/parser@^5.1.0": 202 | version "5.41.0" 203 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.41.0.tgz#0414a6405007e463dc527b459af1f19430382d67" 204 | integrity sha512-HQVfix4+RL5YRWZboMD1pUfFN8MpRH4laziWkkAzyO1fvNOY/uinZcvo3QiFJVS/siNHupV8E5+xSwQZrl6PZA== 205 | dependencies: 206 | "@typescript-eslint/scope-manager" "5.41.0" 207 | "@typescript-eslint/types" "5.41.0" 208 | "@typescript-eslint/typescript-estree" "5.41.0" 209 | debug "^4.3.4" 210 | 211 | "@typescript-eslint/scope-manager@5.41.0": 212 | version "5.41.0" 213 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.41.0.tgz#28e3a41d626288d0628be14cf9de8d49fc30fadf" 214 | integrity sha512-xOxPJCnuktUkY2xoEZBKXO5DBCugFzjrVndKdUnyQr3+9aDWZReKq9MhaoVnbL+maVwWJu/N0SEtrtEUNb62QQ== 215 | dependencies: 216 | "@typescript-eslint/types" "5.41.0" 217 | "@typescript-eslint/visitor-keys" "5.41.0" 218 | 219 | "@typescript-eslint/type-utils@5.41.0": 220 | version "5.41.0" 221 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.41.0.tgz#2371601171e9f26a4e6da918a7913f7266890cdf" 222 | integrity sha512-L30HNvIG6A1Q0R58e4hu4h+fZqaO909UcnnPbwKiN6Rc3BUEx6ez2wgN7aC0cBfcAjZfwkzE+E2PQQ9nEuoqfA== 223 | dependencies: 224 | "@typescript-eslint/typescript-estree" "5.41.0" 225 | "@typescript-eslint/utils" "5.41.0" 226 | debug "^4.3.4" 227 | tsutils "^3.21.0" 228 | 229 | "@typescript-eslint/types@5.41.0": 230 | version "5.41.0" 231 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.41.0.tgz#6800abebc4e6abaf24cdf220fb4ce28f4ab09a85" 232 | integrity sha512-5BejraMXMC+2UjefDvrH0Fo/eLwZRV6859SXRg+FgbhA0R0l6lDqDGAQYhKbXhPN2ofk2kY5sgGyLNL907UXpA== 233 | 234 | "@typescript-eslint/typescript-estree@5.41.0": 235 | version "5.41.0" 236 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.41.0.tgz#bf5c6b3138adbdc73ba4871d060ae12c59366c61" 237 | integrity sha512-SlzFYRwFSvswzDSQ/zPkIWcHv8O5y42YUskko9c4ki+fV6HATsTODUPbRbcGDFYP86gaJL5xohUEytvyNNcXWg== 238 | dependencies: 239 | "@typescript-eslint/types" "5.41.0" 240 | "@typescript-eslint/visitor-keys" "5.41.0" 241 | debug "^4.3.4" 242 | globby "^11.1.0" 243 | is-glob "^4.0.3" 244 | semver "^7.3.7" 245 | tsutils "^3.21.0" 246 | 247 | "@typescript-eslint/utils@5.41.0": 248 | version "5.41.0" 249 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.41.0.tgz#f41ae5883994a249d00b2ce69f4188f3a23fa0f9" 250 | integrity sha512-QlvfwaN9jaMga9EBazQ+5DDx/4sAdqDkcs05AsQHMaopluVCUyu1bTRUVKzXbgjDlrRAQrYVoi/sXJ9fmG+KLQ== 251 | dependencies: 252 | "@types/json-schema" "^7.0.9" 253 | "@types/semver" "^7.3.12" 254 | "@typescript-eslint/scope-manager" "5.41.0" 255 | "@typescript-eslint/types" "5.41.0" 256 | "@typescript-eslint/typescript-estree" "5.41.0" 257 | eslint-scope "^5.1.1" 258 | eslint-utils "^3.0.0" 259 | semver "^7.3.7" 260 | 261 | "@typescript-eslint/visitor-keys@5.41.0": 262 | version "5.41.0" 263 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.41.0.tgz#d3510712bc07d5540160ed3c0f8f213b73e3bcd9" 264 | integrity sha512-vilqeHj267v8uzzakbm13HkPMl7cbYpKVjgFWZPIOHIJHZtinvypUhJ5xBXfWYg4eFKqztbMMpOgFpT9Gfx4fw== 265 | dependencies: 266 | "@typescript-eslint/types" "5.41.0" 267 | eslint-visitor-keys "^3.3.0" 268 | 269 | acorn-jsx@^5.3.1: 270 | version "5.3.2" 271 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 272 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 273 | 274 | acorn-walk@^8.1.1: 275 | version "8.2.0" 276 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 277 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 278 | 279 | acorn@^7.4.0: 280 | version "7.4.1" 281 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 282 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 283 | 284 | acorn@^8.4.1: 285 | version "8.8.1" 286 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" 287 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 288 | 289 | agent-base@6: 290 | version "6.0.2" 291 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 292 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 293 | dependencies: 294 | debug "4" 295 | 296 | ajv@^6.10.0, ajv@^6.12.4: 297 | version "6.12.6" 298 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 299 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 300 | dependencies: 301 | fast-deep-equal "^3.1.1" 302 | fast-json-stable-stringify "^2.0.0" 303 | json-schema-traverse "^0.4.1" 304 | uri-js "^4.2.2" 305 | 306 | ajv@^8.0.1: 307 | version "8.11.0" 308 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" 309 | integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== 310 | dependencies: 311 | fast-deep-equal "^3.1.1" 312 | json-schema-traverse "^1.0.0" 313 | require-from-string "^2.0.2" 314 | uri-js "^4.2.2" 315 | 316 | ansi-colors@^4.1.1: 317 | version "4.1.3" 318 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 319 | integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== 320 | 321 | ansi-regex@^5.0.1: 322 | version "5.0.1" 323 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 324 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 325 | 326 | ansi-styles@^3.2.1: 327 | version "3.2.1" 328 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 329 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 330 | dependencies: 331 | color-convert "^1.9.0" 332 | 333 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 334 | version "4.3.0" 335 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 336 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 337 | dependencies: 338 | color-convert "^2.0.1" 339 | 340 | arg@^4.1.0: 341 | version "4.1.3" 342 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 343 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 344 | 345 | argparse@^1.0.7: 346 | version "1.0.10" 347 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 348 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 349 | dependencies: 350 | sprintf-js "~1.0.2" 351 | 352 | argparse@^2.0.1: 353 | version "2.0.1" 354 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 355 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 356 | 357 | array-union@^2.1.0: 358 | version "2.1.0" 359 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 360 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 361 | 362 | astral-regex@^2.0.0: 363 | version "2.0.0" 364 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 365 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 366 | 367 | asynckit@^0.4.0: 368 | version "0.4.0" 369 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 370 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 371 | 372 | axios-cookiejar-support@^1.0.1: 373 | version "1.0.1" 374 | resolved "https://registry.yarnpkg.com/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz#7b32af7d932508546c68b1fc5ba8f562884162e1" 375 | integrity sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig== 376 | dependencies: 377 | is-redirect "^1.0.0" 378 | pify "^5.0.0" 379 | 380 | axios@^0.24.0: 381 | version "0.24.0" 382 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" 383 | integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== 384 | dependencies: 385 | follow-redirects "^1.14.4" 386 | 387 | axios@^0.27.2: 388 | version "0.27.2" 389 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" 390 | integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== 391 | dependencies: 392 | follow-redirects "^1.14.9" 393 | form-data "^4.0.0" 394 | 395 | balanced-match@^1.0.0: 396 | version "1.0.2" 397 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 398 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 399 | 400 | brace-expansion@^1.1.7: 401 | version "1.1.11" 402 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 403 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 404 | dependencies: 405 | balanced-match "^1.0.0" 406 | concat-map "0.0.1" 407 | 408 | braces@^3.0.2: 409 | version "3.0.2" 410 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 411 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 412 | dependencies: 413 | fill-range "^7.0.1" 414 | 415 | bunyan@^1.8.15: 416 | version "1.8.15" 417 | resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.15.tgz#8ce34ca908a17d0776576ca1b2f6cbd916e93b46" 418 | integrity sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig== 419 | optionalDependencies: 420 | dtrace-provider "~0.8" 421 | moment "^2.19.3" 422 | mv "~2" 423 | safe-json-stringify "~1" 424 | 425 | call-bind@^1.0.0: 426 | version "1.0.2" 427 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 428 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 429 | dependencies: 430 | function-bind "^1.1.1" 431 | get-intrinsic "^1.0.2" 432 | 433 | callsites@^3.0.0: 434 | version "3.1.0" 435 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 436 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 437 | 438 | chalk@^2.0.0: 439 | version "2.4.2" 440 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 441 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 442 | dependencies: 443 | ansi-styles "^3.2.1" 444 | escape-string-regexp "^1.0.5" 445 | supports-color "^5.3.0" 446 | 447 | chalk@^4.0.0: 448 | version "4.1.2" 449 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 450 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 451 | dependencies: 452 | ansi-styles "^4.1.0" 453 | supports-color "^7.1.0" 454 | 455 | class-transformer@^0.5.1: 456 | version "0.5.1" 457 | resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" 458 | integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== 459 | 460 | class-validator@^0.13.1: 461 | version "0.13.2" 462 | resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.2.tgz#64b031e9f3f81a1e1dcd04a5d604734608b24143" 463 | integrity sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw== 464 | dependencies: 465 | libphonenumber-js "^1.9.43" 466 | validator "^13.7.0" 467 | 468 | color-convert@^1.9.0: 469 | version "1.9.3" 470 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 471 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 472 | dependencies: 473 | color-name "1.1.3" 474 | 475 | color-convert@^2.0.1: 476 | version "2.0.1" 477 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 478 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 479 | dependencies: 480 | color-name "~1.1.4" 481 | 482 | color-name@1.1.3: 483 | version "1.1.3" 484 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 485 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 486 | 487 | color-name@~1.1.4: 488 | version "1.1.4" 489 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 490 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 491 | 492 | combined-stream@^1.0.8: 493 | version "1.0.8" 494 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 495 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 496 | dependencies: 497 | delayed-stream "~1.0.0" 498 | 499 | concat-map@0.0.1: 500 | version "0.0.1" 501 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 502 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 503 | 504 | create-require@^1.1.0: 505 | version "1.1.1" 506 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 507 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 508 | 509 | cron-parser@^3.5.0: 510 | version "3.5.0" 511 | resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-3.5.0.tgz#b1a9da9514c0310aa7ef99c2f3f1d0f8c235257c" 512 | integrity sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ== 513 | dependencies: 514 | is-nan "^1.3.2" 515 | luxon "^1.26.0" 516 | 517 | cross-spawn@^7.0.2: 518 | version "7.0.3" 519 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 520 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 521 | dependencies: 522 | path-key "^3.1.0" 523 | shebang-command "^2.0.0" 524 | which "^2.0.1" 525 | 526 | crypto-js@^4.1.1: 527 | version "4.1.1" 528 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" 529 | integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== 530 | 531 | date-format@^4.0.14: 532 | version "4.0.14" 533 | resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" 534 | integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== 535 | 536 | debug@2: 537 | version "2.6.9" 538 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 539 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 540 | dependencies: 541 | ms "2.0.0" 542 | 543 | debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.4: 544 | version "4.3.4" 545 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 546 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 547 | dependencies: 548 | ms "2.1.2" 549 | 550 | debug@^3.2.6: 551 | version "3.2.7" 552 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 553 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 554 | dependencies: 555 | ms "^2.1.1" 556 | 557 | deep-is@^0.1.3: 558 | version "0.1.4" 559 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 560 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 561 | 562 | define-properties@^1.1.3: 563 | version "1.1.4" 564 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" 565 | integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== 566 | dependencies: 567 | has-property-descriptors "^1.0.0" 568 | object-keys "^1.1.1" 569 | 570 | delayed-stream@~1.0.0: 571 | version "1.0.0" 572 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 573 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 574 | 575 | diff@^4.0.1: 576 | version "4.0.2" 577 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 578 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 579 | 580 | dir-glob@^3.0.1: 581 | version "3.0.1" 582 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 583 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 584 | dependencies: 585 | path-type "^4.0.0" 586 | 587 | doctrine@^3.0.0: 588 | version "3.0.0" 589 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 590 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 591 | dependencies: 592 | esutils "^2.0.2" 593 | 594 | dtrace-provider@~0.8: 595 | version "0.8.8" 596 | resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.8.tgz#2996d5490c37e1347be263b423ed7b297fb0d97e" 597 | integrity sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg== 598 | dependencies: 599 | nan "^2.14.0" 600 | 601 | emoji-regex@^8.0.0: 602 | version "8.0.0" 603 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 604 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 605 | 606 | enquirer@^2.3.5: 607 | version "2.3.6" 608 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 609 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 610 | dependencies: 611 | ansi-colors "^4.1.1" 612 | 613 | escape-string-regexp@^1.0.5: 614 | version "1.0.5" 615 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 616 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 617 | 618 | escape-string-regexp@^4.0.0: 619 | version "4.0.0" 620 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 621 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 622 | 623 | eslint-config-prettier@^8.3.0: 624 | version "8.5.0" 625 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" 626 | integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== 627 | 628 | eslint-plugin-prettier@^4.0.0: 629 | version "4.2.1" 630 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" 631 | integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== 632 | dependencies: 633 | prettier-linter-helpers "^1.0.0" 634 | 635 | eslint-plugin-simple-import-sort@^7.0.0: 636 | version "7.0.0" 637 | resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz#a1dad262f46d2184a90095a60c66fef74727f0f8" 638 | integrity sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw== 639 | 640 | eslint-scope@^5.1.1: 641 | version "5.1.1" 642 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 643 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 644 | dependencies: 645 | esrecurse "^4.3.0" 646 | estraverse "^4.1.1" 647 | 648 | eslint-utils@^2.1.0: 649 | version "2.1.0" 650 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 651 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 652 | dependencies: 653 | eslint-visitor-keys "^1.1.0" 654 | 655 | eslint-utils@^3.0.0: 656 | version "3.0.0" 657 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 658 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 659 | dependencies: 660 | eslint-visitor-keys "^2.0.0" 661 | 662 | eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: 663 | version "1.3.0" 664 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 665 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 666 | 667 | eslint-visitor-keys@^2.0.0: 668 | version "2.1.0" 669 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 670 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 671 | 672 | eslint-visitor-keys@^3.3.0: 673 | version "3.3.0" 674 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 675 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 676 | 677 | eslint@^7.30.0: 678 | version "7.32.0" 679 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" 680 | integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== 681 | dependencies: 682 | "@babel/code-frame" "7.12.11" 683 | "@eslint/eslintrc" "^0.4.3" 684 | "@humanwhocodes/config-array" "^0.5.0" 685 | ajv "^6.10.0" 686 | chalk "^4.0.0" 687 | cross-spawn "^7.0.2" 688 | debug "^4.0.1" 689 | doctrine "^3.0.0" 690 | enquirer "^2.3.5" 691 | escape-string-regexp "^4.0.0" 692 | eslint-scope "^5.1.1" 693 | eslint-utils "^2.1.0" 694 | eslint-visitor-keys "^2.0.0" 695 | espree "^7.3.1" 696 | esquery "^1.4.0" 697 | esutils "^2.0.2" 698 | fast-deep-equal "^3.1.3" 699 | file-entry-cache "^6.0.1" 700 | functional-red-black-tree "^1.0.1" 701 | glob-parent "^5.1.2" 702 | globals "^13.6.0" 703 | ignore "^4.0.6" 704 | import-fresh "^3.0.0" 705 | imurmurhash "^0.1.4" 706 | is-glob "^4.0.0" 707 | js-yaml "^3.13.1" 708 | json-stable-stringify-without-jsonify "^1.0.1" 709 | levn "^0.4.1" 710 | lodash.merge "^4.6.2" 711 | minimatch "^3.0.4" 712 | natural-compare "^1.4.0" 713 | optionator "^0.9.1" 714 | progress "^2.0.0" 715 | regexpp "^3.1.0" 716 | semver "^7.2.1" 717 | strip-ansi "^6.0.0" 718 | strip-json-comments "^3.1.0" 719 | table "^6.0.9" 720 | text-table "^0.2.0" 721 | v8-compile-cache "^2.0.3" 722 | 723 | espree@^7.3.0, espree@^7.3.1: 724 | version "7.3.1" 725 | resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" 726 | integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== 727 | dependencies: 728 | acorn "^7.4.0" 729 | acorn-jsx "^5.3.1" 730 | eslint-visitor-keys "^1.3.0" 731 | 732 | esprima@^4.0.0: 733 | version "4.0.1" 734 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 735 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 736 | 737 | esquery@^1.4.0: 738 | version "1.4.0" 739 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 740 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 741 | dependencies: 742 | estraverse "^5.1.0" 743 | 744 | esrecurse@^4.3.0: 745 | version "4.3.0" 746 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 747 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 748 | dependencies: 749 | estraverse "^5.2.0" 750 | 751 | estraverse@^4.1.1: 752 | version "4.3.0" 753 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 754 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 755 | 756 | estraverse@^5.1.0, estraverse@^5.2.0: 757 | version "5.3.0" 758 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 759 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 760 | 761 | esutils@^2.0.2: 762 | version "2.0.3" 763 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 764 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 765 | 766 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 767 | version "3.1.3" 768 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 769 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 770 | 771 | fast-diff@^1.1.2: 772 | version "1.2.0" 773 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 774 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 775 | 776 | fast-glob@^3.2.9: 777 | version "3.2.12" 778 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" 779 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== 780 | dependencies: 781 | "@nodelib/fs.stat" "^2.0.2" 782 | "@nodelib/fs.walk" "^1.2.3" 783 | glob-parent "^5.1.2" 784 | merge2 "^1.3.0" 785 | micromatch "^4.0.4" 786 | 787 | fast-json-stable-stringify@^2.0.0: 788 | version "2.1.0" 789 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 790 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 791 | 792 | fast-levenshtein@^2.0.6: 793 | version "2.0.6" 794 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 795 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 796 | 797 | fastq@^1.6.0: 798 | version "1.13.0" 799 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 800 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 801 | dependencies: 802 | reusify "^1.0.4" 803 | 804 | file-entry-cache@^6.0.1: 805 | version "6.0.1" 806 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 807 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 808 | dependencies: 809 | flat-cache "^3.0.4" 810 | 811 | fill-range@^7.0.1: 812 | version "7.0.1" 813 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 814 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 815 | dependencies: 816 | to-regex-range "^5.0.1" 817 | 818 | flat-cache@^3.0.4: 819 | version "3.0.4" 820 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 821 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 822 | dependencies: 823 | flatted "^3.1.0" 824 | rimraf "^3.0.2" 825 | 826 | flatted@^3.1.0, flatted@^3.2.7: 827 | version "3.2.7" 828 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 829 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 830 | 831 | follow-redirects@^1.14.4, follow-redirects@^1.14.9: 832 | version "1.15.2" 833 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 834 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 835 | 836 | form-data@^4.0.0: 837 | version "4.0.0" 838 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 839 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 840 | dependencies: 841 | asynckit "^0.4.0" 842 | combined-stream "^1.0.8" 843 | mime-types "^2.1.12" 844 | 845 | fs-extra@^10.0.0: 846 | version "10.1.0" 847 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" 848 | integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== 849 | dependencies: 850 | graceful-fs "^4.2.0" 851 | jsonfile "^6.0.1" 852 | universalify "^2.0.0" 853 | 854 | fs-extra@^8.1.0: 855 | version "8.1.0" 856 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 857 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 858 | dependencies: 859 | graceful-fs "^4.2.0" 860 | jsonfile "^4.0.0" 861 | universalify "^0.1.0" 862 | 863 | fs.realpath@^1.0.0: 864 | version "1.0.0" 865 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 866 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 867 | 868 | function-bind@^1.1.1: 869 | version "1.1.1" 870 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 871 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 872 | 873 | functional-red-black-tree@^1.0.1: 874 | version "1.0.1" 875 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 876 | integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== 877 | 878 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: 879 | version "1.1.3" 880 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 881 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 882 | dependencies: 883 | function-bind "^1.1.1" 884 | has "^1.0.3" 885 | has-symbols "^1.0.3" 886 | 887 | glob-parent@^5.1.2: 888 | version "5.1.2" 889 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 890 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 891 | dependencies: 892 | is-glob "^4.0.1" 893 | 894 | glob@^6.0.1: 895 | version "6.0.4" 896 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 897 | integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== 898 | dependencies: 899 | inflight "^1.0.4" 900 | inherits "2" 901 | minimatch "2 || 3" 902 | once "^1.3.0" 903 | path-is-absolute "^1.0.0" 904 | 905 | glob@^7.1.3: 906 | version "7.2.3" 907 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 908 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 909 | dependencies: 910 | fs.realpath "^1.0.0" 911 | inflight "^1.0.4" 912 | inherits "2" 913 | minimatch "^3.1.1" 914 | once "^1.3.0" 915 | path-is-absolute "^1.0.0" 916 | 917 | globals@^13.6.0, globals@^13.9.0: 918 | version "13.17.0" 919 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" 920 | integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== 921 | dependencies: 922 | type-fest "^0.20.2" 923 | 924 | globby@^11.1.0: 925 | version "11.1.0" 926 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 927 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 928 | dependencies: 929 | array-union "^2.1.0" 930 | dir-glob "^3.0.1" 931 | fast-glob "^3.2.9" 932 | ignore "^5.2.0" 933 | merge2 "^1.4.1" 934 | slash "^3.0.0" 935 | 936 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 937 | version "4.2.10" 938 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 939 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 940 | 941 | has-flag@^3.0.0: 942 | version "3.0.0" 943 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 944 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 945 | 946 | has-flag@^4.0.0: 947 | version "4.0.0" 948 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 949 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 950 | 951 | has-property-descriptors@^1.0.0: 952 | version "1.0.0" 953 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 954 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 955 | dependencies: 956 | get-intrinsic "^1.1.1" 957 | 958 | has-symbols@^1.0.3: 959 | version "1.0.3" 960 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 961 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 962 | 963 | has@^1.0.3: 964 | version "1.0.3" 965 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 966 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 967 | dependencies: 968 | function-bind "^1.1.1" 969 | 970 | https-proxy-agent@^5.0.1: 971 | version "5.0.1" 972 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" 973 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 974 | dependencies: 975 | agent-base "6" 976 | debug "4" 977 | 978 | iconv-lite@^0.4.4: 979 | version "0.4.24" 980 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 981 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 982 | dependencies: 983 | safer-buffer ">= 2.1.2 < 3" 984 | 985 | ignore@^4.0.6: 986 | version "4.0.6" 987 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 988 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 989 | 990 | ignore@^5.2.0: 991 | version "5.2.0" 992 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 993 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 994 | 995 | import-fresh@^3.0.0, import-fresh@^3.2.1: 996 | version "3.3.0" 997 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 998 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 999 | dependencies: 1000 | parent-module "^1.0.0" 1001 | resolve-from "^4.0.0" 1002 | 1003 | imurmurhash@^0.1.4: 1004 | version "0.1.4" 1005 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1006 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1007 | 1008 | inflight@^1.0.4: 1009 | version "1.0.6" 1010 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1011 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1012 | dependencies: 1013 | once "^1.3.0" 1014 | wrappy "1" 1015 | 1016 | inherits@2: 1017 | version "2.0.4" 1018 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1019 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1020 | 1021 | is-extglob@^2.1.1: 1022 | version "2.1.1" 1023 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1024 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1025 | 1026 | is-fullwidth-code-point@^3.0.0: 1027 | version "3.0.0" 1028 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1029 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1030 | 1031 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1032 | version "4.0.3" 1033 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1034 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1035 | dependencies: 1036 | is-extglob "^2.1.1" 1037 | 1038 | is-nan@^1.3.2: 1039 | version "1.3.2" 1040 | resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" 1041 | integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== 1042 | dependencies: 1043 | call-bind "^1.0.0" 1044 | define-properties "^1.1.3" 1045 | 1046 | is-number@^7.0.0: 1047 | version "7.0.0" 1048 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1049 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1050 | 1051 | is-redirect@^1.0.0: 1052 | version "1.0.0" 1053 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 1054 | integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== 1055 | 1056 | isexe@^2.0.0: 1057 | version "2.0.0" 1058 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1059 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1060 | 1061 | js-tokens@^4.0.0: 1062 | version "4.0.0" 1063 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1064 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1065 | 1066 | js-yaml@^3.13.1: 1067 | version "3.14.1" 1068 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 1069 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 1070 | dependencies: 1071 | argparse "^1.0.7" 1072 | esprima "^4.0.0" 1073 | 1074 | js-yaml@^4.1.0: 1075 | version "4.1.0" 1076 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1077 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1078 | dependencies: 1079 | argparse "^2.0.1" 1080 | 1081 | json-schema-traverse@^0.4.1: 1082 | version "0.4.1" 1083 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1084 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1085 | 1086 | json-schema-traverse@^1.0.0: 1087 | version "1.0.0" 1088 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1089 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1090 | 1091 | json-stable-stringify-without-jsonify@^1.0.1: 1092 | version "1.0.1" 1093 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1094 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1095 | 1096 | json5@^1.0.1: 1097 | version "1.0.1" 1098 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 1099 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 1100 | dependencies: 1101 | minimist "^1.2.0" 1102 | 1103 | jsonfile@^4.0.0: 1104 | version "4.0.0" 1105 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1106 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1107 | optionalDependencies: 1108 | graceful-fs "^4.1.6" 1109 | 1110 | jsonfile@^6.0.1: 1111 | version "6.1.0" 1112 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 1113 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 1114 | dependencies: 1115 | universalify "^2.0.0" 1116 | optionalDependencies: 1117 | graceful-fs "^4.1.6" 1118 | 1119 | levn@^0.4.1: 1120 | version "0.4.1" 1121 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1122 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1123 | dependencies: 1124 | prelude-ls "^1.2.1" 1125 | type-check "~0.4.0" 1126 | 1127 | libphonenumber-js@^1.9.43: 1128 | version "1.10.14" 1129 | resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.14.tgz#e29da7f539751f724ac54017a098e3c7ca23de94" 1130 | integrity sha512-McGS7GV/WjJ2KjfOGhJU1oJn29RYeo7Q+RpANRbUNMQ9gj5XArpbjurSuyYPTejFwbaUojstQ4XyWCrAzGOUXw== 1131 | 1132 | lodash.merge@^4.6.2: 1133 | version "4.6.2" 1134 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1135 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1136 | 1137 | lodash.truncate@^4.4.2: 1138 | version "4.4.2" 1139 | resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" 1140 | integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== 1141 | 1142 | log4js@^6.3.0: 1143 | version "6.7.0" 1144 | resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.7.0.tgz#fff671a74b2f6e956d135c3c756c79072809a23b" 1145 | integrity sha512-KA0W9ffgNBLDj6fZCq/lRbgR6ABAodRIDHrZnS48vOtfKa4PzWImb0Md1lmGCdO3n3sbCm/n1/WmrNlZ8kCI3Q== 1146 | dependencies: 1147 | date-format "^4.0.14" 1148 | debug "^4.3.4" 1149 | flatted "^3.2.7" 1150 | rfdc "^1.3.0" 1151 | streamroller "^3.1.3" 1152 | 1153 | long-timeout@0.1.1: 1154 | version "0.1.1" 1155 | resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" 1156 | integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== 1157 | 1158 | long@^4.0.0: 1159 | version "4.0.0" 1160 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1161 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1162 | 1163 | lru-cache@^6.0.0: 1164 | version "6.0.0" 1165 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1166 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1167 | dependencies: 1168 | yallist "^4.0.0" 1169 | 1170 | luxon@^1.26.0: 1171 | version "1.28.0" 1172 | resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf" 1173 | integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ== 1174 | 1175 | make-error@^1.1.1: 1176 | version "1.3.6" 1177 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1178 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1179 | 1180 | merge2@^1.3.0, merge2@^1.4.1: 1181 | version "1.4.1" 1182 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1183 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1184 | 1185 | micromatch@^4.0.4: 1186 | version "4.0.5" 1187 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1188 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1189 | dependencies: 1190 | braces "^3.0.2" 1191 | picomatch "^2.3.1" 1192 | 1193 | mime-db@1.52.0: 1194 | version "1.52.0" 1195 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1196 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1197 | 1198 | mime-types@^2.1.12: 1199 | version "2.1.35" 1200 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1201 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1202 | dependencies: 1203 | mime-db "1.52.0" 1204 | 1205 | "minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1: 1206 | version "3.1.2" 1207 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1208 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1209 | dependencies: 1210 | brace-expansion "^1.1.7" 1211 | 1212 | minimist@^1.2.0, minimist@^1.2.6: 1213 | version "1.2.7" 1214 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" 1215 | integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== 1216 | 1217 | mkdirp@~0.5.1: 1218 | version "0.5.6" 1219 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 1220 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 1221 | dependencies: 1222 | minimist "^1.2.6" 1223 | 1224 | moment@^2.19.3, moment@^2.29.1: 1225 | version "2.29.4" 1226 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" 1227 | integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== 1228 | 1229 | ms@2.0.0: 1230 | version "2.0.0" 1231 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1232 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1233 | 1234 | ms@2.1.2: 1235 | version "2.1.2" 1236 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1237 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1238 | 1239 | ms@^2.1.1: 1240 | version "2.1.3" 1241 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1242 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1243 | 1244 | mv@~2: 1245 | version "2.1.1" 1246 | resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" 1247 | integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== 1248 | dependencies: 1249 | mkdirp "~0.5.1" 1250 | ncp "~2.0.0" 1251 | rimraf "~2.4.0" 1252 | 1253 | nan@^2.14.0: 1254 | version "2.17.0" 1255 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" 1256 | integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== 1257 | 1258 | natural-compare@^1.4.0: 1259 | version "1.4.0" 1260 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1261 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1262 | 1263 | ncp@~2.0.0: 1264 | version "2.0.0" 1265 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" 1266 | integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== 1267 | 1268 | needle@^2.5.2: 1269 | version "2.9.1" 1270 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" 1271 | integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== 1272 | dependencies: 1273 | debug "^3.2.6" 1274 | iconv-lite "^0.4.4" 1275 | sax "^1.2.4" 1276 | 1277 | node-schedule@^2.0.0: 1278 | version "2.1.0" 1279 | resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.0.tgz#068ae38d7351c330616f7fe7cdb05036f977cbaf" 1280 | integrity sha512-nl4JTiZ7ZQDc97MmpTq9BQjYhq7gOtoh7SiPH069gBFBj0PzD8HI7zyFs6rzqL8Y5tTiEEYLxgtbx034YPrbyQ== 1281 | dependencies: 1282 | cron-parser "^3.5.0" 1283 | long-timeout "0.1.1" 1284 | sorted-array-functions "^1.3.0" 1285 | 1286 | object-keys@^1.1.1: 1287 | version "1.1.1" 1288 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1289 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1290 | 1291 | oicq@^2.1.8: 1292 | version "2.3.1" 1293 | resolved "https://registry.yarnpkg.com/oicq/-/oicq-2.3.1.tgz#833cfb239c08e201d3ef203e347aee94bc2392c1" 1294 | integrity sha512-mRw/GgdRKFMylnrlnnywzCIwvad6fF5E4WZfIlval070wEc3w9yMV49i9epFltWkU/JGNMDS4t5wWdZEYzW0EQ== 1295 | dependencies: 1296 | axios "^0.27.2" 1297 | log4js "^6.3.0" 1298 | long "^4.0.0" 1299 | pngjs "^6.0.0" 1300 | probe-image-size "^7.2.2" 1301 | 1302 | once@^1.3.0: 1303 | version "1.4.0" 1304 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1305 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1306 | dependencies: 1307 | wrappy "1" 1308 | 1309 | optionator@^0.9.1: 1310 | version "0.9.1" 1311 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1312 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1313 | dependencies: 1314 | deep-is "^0.1.3" 1315 | fast-levenshtein "^2.0.6" 1316 | levn "^0.4.1" 1317 | prelude-ls "^1.2.1" 1318 | type-check "^0.4.0" 1319 | word-wrap "^1.2.3" 1320 | 1321 | parent-module@^1.0.0: 1322 | version "1.0.1" 1323 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1324 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1325 | dependencies: 1326 | callsites "^3.0.0" 1327 | 1328 | path-is-absolute@^1.0.0: 1329 | version "1.0.1" 1330 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1331 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1332 | 1333 | path-key@^3.1.0: 1334 | version "3.1.1" 1335 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1336 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1337 | 1338 | path-type@^4.0.0: 1339 | version "4.0.0" 1340 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1341 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1342 | 1343 | picomatch@^2.3.1: 1344 | version "2.3.1" 1345 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1346 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1347 | 1348 | pify@^5.0.0: 1349 | version "5.0.0" 1350 | resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" 1351 | integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== 1352 | 1353 | pngjs@^6.0.0: 1354 | version "6.0.0" 1355 | resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" 1356 | integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== 1357 | 1358 | prelude-ls@^1.2.1: 1359 | version "1.2.1" 1360 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1361 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1362 | 1363 | prettier-linter-helpers@^1.0.0: 1364 | version "1.0.0" 1365 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1366 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1367 | dependencies: 1368 | fast-diff "^1.1.2" 1369 | 1370 | prettier@^2.4.1: 1371 | version "2.7.1" 1372 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" 1373 | integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== 1374 | 1375 | probe-image-size@^7.2.2: 1376 | version "7.2.3" 1377 | resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.3.tgz#d49c64be540ec8edea538f6f585f65a9b3ab4309" 1378 | integrity sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w== 1379 | dependencies: 1380 | lodash.merge "^4.6.2" 1381 | needle "^2.5.2" 1382 | stream-parser "~0.3.1" 1383 | 1384 | progress@^2.0.0: 1385 | version "2.0.3" 1386 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1387 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1388 | 1389 | psl@^1.1.33: 1390 | version "1.9.0" 1391 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" 1392 | integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== 1393 | 1394 | punycode@^2.1.0, punycode@^2.1.1: 1395 | version "2.1.1" 1396 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1397 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1398 | 1399 | querystringify@^2.1.1: 1400 | version "2.2.0" 1401 | resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" 1402 | integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== 1403 | 1404 | queue-microtask@^1.2.2: 1405 | version "1.2.3" 1406 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1407 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1408 | 1409 | reflect-metadata@^0.1.13: 1410 | version "0.1.13" 1411 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 1412 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 1413 | 1414 | regexpp@^3.1.0, regexpp@^3.2.0: 1415 | version "3.2.0" 1416 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1417 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1418 | 1419 | require-from-string@^2.0.2: 1420 | version "2.0.2" 1421 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1422 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1423 | 1424 | requires-port@^1.0.0: 1425 | version "1.0.0" 1426 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 1427 | integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== 1428 | 1429 | resolve-from@^4.0.0: 1430 | version "4.0.0" 1431 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1432 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1433 | 1434 | reusify@^1.0.4: 1435 | version "1.0.4" 1436 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1437 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1438 | 1439 | rfdc@^1.3.0: 1440 | version "1.3.0" 1441 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" 1442 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== 1443 | 1444 | rimraf@^3.0.2: 1445 | version "3.0.2" 1446 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1447 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1448 | dependencies: 1449 | glob "^7.1.3" 1450 | 1451 | rimraf@~2.4.0: 1452 | version "2.4.5" 1453 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" 1454 | integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== 1455 | dependencies: 1456 | glob "^6.0.1" 1457 | 1458 | run-parallel@^1.1.9: 1459 | version "1.2.0" 1460 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1461 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1462 | dependencies: 1463 | queue-microtask "^1.2.2" 1464 | 1465 | safe-json-stringify@~1: 1466 | version "1.2.0" 1467 | resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" 1468 | integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== 1469 | 1470 | "safer-buffer@>= 2.1.2 < 3": 1471 | version "2.1.2" 1472 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1473 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1474 | 1475 | sax@^1.2.4: 1476 | version "1.2.4" 1477 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1478 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1479 | 1480 | semver@^7.2.1, semver@^7.3.7: 1481 | version "7.3.8" 1482 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" 1483 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== 1484 | dependencies: 1485 | lru-cache "^6.0.0" 1486 | 1487 | shebang-command@^2.0.0: 1488 | version "2.0.0" 1489 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1490 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1491 | dependencies: 1492 | shebang-regex "^3.0.0" 1493 | 1494 | shebang-regex@^3.0.0: 1495 | version "3.0.0" 1496 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1497 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1498 | 1499 | slash@^3.0.0: 1500 | version "3.0.0" 1501 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1502 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1503 | 1504 | slice-ansi@^4.0.0: 1505 | version "4.0.0" 1506 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 1507 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 1508 | dependencies: 1509 | ansi-styles "^4.0.0" 1510 | astral-regex "^2.0.0" 1511 | is-fullwidth-code-point "^3.0.0" 1512 | 1513 | sorted-array-functions@^1.3.0: 1514 | version "1.3.0" 1515 | resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" 1516 | integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== 1517 | 1518 | sprintf-js@~1.0.2: 1519 | version "1.0.3" 1520 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1521 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 1522 | 1523 | stream-parser@~0.3.1: 1524 | version "0.3.1" 1525 | resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" 1526 | integrity sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ== 1527 | dependencies: 1528 | debug "2" 1529 | 1530 | streamroller@^3.1.3: 1531 | version "3.1.3" 1532 | resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.3.tgz#d95689a8c29b30d093525d0baffe6616fd62ca7e" 1533 | integrity sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w== 1534 | dependencies: 1535 | date-format "^4.0.14" 1536 | debug "^4.3.4" 1537 | fs-extra "^8.1.0" 1538 | 1539 | string-width@^4.2.3: 1540 | version "4.2.3" 1541 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1542 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1543 | dependencies: 1544 | emoji-regex "^8.0.0" 1545 | is-fullwidth-code-point "^3.0.0" 1546 | strip-ansi "^6.0.1" 1547 | 1548 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1549 | version "6.0.1" 1550 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1551 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1552 | dependencies: 1553 | ansi-regex "^5.0.1" 1554 | 1555 | strip-bom@^3.0.0: 1556 | version "3.0.0" 1557 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1558 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 1559 | 1560 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1561 | version "3.1.1" 1562 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1563 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1564 | 1565 | supports-color@^5.3.0: 1566 | version "5.5.0" 1567 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1568 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1569 | dependencies: 1570 | has-flag "^3.0.0" 1571 | 1572 | supports-color@^7.1.0: 1573 | version "7.2.0" 1574 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1575 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1576 | dependencies: 1577 | has-flag "^4.0.0" 1578 | 1579 | table@^6.0.9: 1580 | version "6.8.0" 1581 | resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" 1582 | integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== 1583 | dependencies: 1584 | ajv "^8.0.1" 1585 | lodash.truncate "^4.4.2" 1586 | slice-ansi "^4.0.0" 1587 | string-width "^4.2.3" 1588 | strip-ansi "^6.0.1" 1589 | 1590 | text-table@^0.2.0: 1591 | version "0.2.0" 1592 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1593 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1594 | 1595 | to-regex-range@^5.0.1: 1596 | version "5.0.1" 1597 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1598 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1599 | dependencies: 1600 | is-number "^7.0.0" 1601 | 1602 | tough-cookie@^4.0.0: 1603 | version "4.1.2" 1604 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" 1605 | integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== 1606 | dependencies: 1607 | psl "^1.1.33" 1608 | punycode "^2.1.1" 1609 | universalify "^0.2.0" 1610 | url-parse "^1.5.3" 1611 | 1612 | ts-node@^10.3.0: 1613 | version "10.9.1" 1614 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 1615 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 1616 | dependencies: 1617 | "@cspotcode/source-map-support" "^0.8.0" 1618 | "@tsconfig/node10" "^1.0.7" 1619 | "@tsconfig/node12" "^1.0.7" 1620 | "@tsconfig/node14" "^1.0.0" 1621 | "@tsconfig/node16" "^1.0.2" 1622 | acorn "^8.4.1" 1623 | acorn-walk "^8.1.1" 1624 | arg "^4.1.0" 1625 | create-require "^1.1.0" 1626 | diff "^4.0.1" 1627 | make-error "^1.1.1" 1628 | v8-compile-cache-lib "^3.0.1" 1629 | yn "3.1.1" 1630 | 1631 | tsconfig-paths@^3.11.0: 1632 | version "3.14.1" 1633 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" 1634 | integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== 1635 | dependencies: 1636 | "@types/json5" "^0.0.29" 1637 | json5 "^1.0.1" 1638 | minimist "^1.2.6" 1639 | strip-bom "^3.0.0" 1640 | 1641 | tslib@^1.8.1: 1642 | version "1.14.1" 1643 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1644 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1645 | 1646 | tsutils@^3.21.0: 1647 | version "3.21.0" 1648 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1649 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1650 | dependencies: 1651 | tslib "^1.8.1" 1652 | 1653 | type-check@^0.4.0, type-check@~0.4.0: 1654 | version "0.4.0" 1655 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1656 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1657 | dependencies: 1658 | prelude-ls "^1.2.1" 1659 | 1660 | type-fest@^0.20.2: 1661 | version "0.20.2" 1662 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1663 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1664 | 1665 | typescript@^4.4.4: 1666 | version "4.8.4" 1667 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" 1668 | integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== 1669 | 1670 | universalify@^0.1.0: 1671 | version "0.1.2" 1672 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1673 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1674 | 1675 | universalify@^0.2.0: 1676 | version "0.2.0" 1677 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" 1678 | integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== 1679 | 1680 | universalify@^2.0.0: 1681 | version "2.0.0" 1682 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 1683 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 1684 | 1685 | uri-js@^4.2.2: 1686 | version "4.4.1" 1687 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1688 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1689 | dependencies: 1690 | punycode "^2.1.0" 1691 | 1692 | url-parse@^1.5.3: 1693 | version "1.5.10" 1694 | resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" 1695 | integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== 1696 | dependencies: 1697 | querystringify "^2.1.1" 1698 | requires-port "^1.0.0" 1699 | 1700 | uuid@^8.3.2: 1701 | version "8.3.2" 1702 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 1703 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1704 | 1705 | v8-compile-cache-lib@^3.0.1: 1706 | version "3.0.1" 1707 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1708 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1709 | 1710 | v8-compile-cache@^2.0.3: 1711 | version "2.3.0" 1712 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 1713 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 1714 | 1715 | validator@^13.7.0: 1716 | version "13.7.0" 1717 | resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" 1718 | integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== 1719 | 1720 | which@^2.0.1: 1721 | version "2.0.2" 1722 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1723 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1724 | dependencies: 1725 | isexe "^2.0.0" 1726 | 1727 | word-wrap@^1.2.3: 1728 | version "1.2.3" 1729 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1730 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1731 | 1732 | wrappy@1: 1733 | version "1.0.2" 1734 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1735 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1736 | 1737 | yallist@^4.0.0: 1738 | version "4.0.0" 1739 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1740 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1741 | 1742 | yn@3.1.1: 1743 | version "3.1.1" 1744 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1745 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1746 | --------------------------------------------------------------------------------