├── .dockerignore ├── app ├── prisma │ ├── migrations │ │ ├── migrate.lock │ │ └── 20201001022914-init │ │ │ ├── schema.prisma │ │ │ ├── README.md │ │ │ └── steps.json │ ├── dev.db.init │ └── schema.prisma ├── src │ ├── commandGroup.ts │ ├── views │ │ ├── index.ejs │ │ ├── success.ejs │ │ ├── error.ejs │ │ ├── signup.ejs │ │ └── template.ejs │ ├── db.ts │ ├── config.ts │ ├── markdown.ts │ ├── commands │ │ └── config │ │ │ ├── link.ts │ │ │ ├── csv.ts │ │ │ ├── description.ts │ │ │ ├── loggingChannel.ts │ │ │ └── roleMapping.ts │ ├── discord.ts │ └── server.ts ├── Dockerfile ├── package.json ├── tsconfig.json └── package-lock.json ├── db.env.template ├── .gitignore ├── app.env.template ├── shibboleth ├── shibboleth.conf ├── shib_clear_headers ├── itrust.pem ├── Dockerfile ├── nginx.conf ├── shibboleth2.xml └── attribute-map.xml ├── README.md ├── docker-compose.yml └── init-letsencrypt.sh /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | *.iml 4 | .idea/ -------------------------------------------------------------------------------- /app/prisma/migrations/migrate.lock: -------------------------------------------------------------------------------- 1 | # Prisma Migrate lockfile v1 2 | 3 | 20201001022914-init -------------------------------------------------------------------------------- /db.env.template: -------------------------------------------------------------------------------- 1 | POSTGRES_DB=postgresdb 2 | POSTGRES_USER=dbuser 3 | POSTGRES_PASSWORD=dbpassword -------------------------------------------------------------------------------- /app/prisma/dev.db.init: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sigpwny/shibboleth-link/HEAD/app/prisma/dev.db.init -------------------------------------------------------------------------------- /app/src/commandGroup.ts: -------------------------------------------------------------------------------- 1 | enum CommandGroup { 2 | CONFIG = "config" 3 | } 4 | 5 | export default CommandGroup; -------------------------------------------------------------------------------- /app/src/views/index.ejs: -------------------------------------------------------------------------------- 1 |

2 | Currently running on <%= guildCount %> servers with <%= memberCount %> members. 3 |

-------------------------------------------------------------------------------- /app/src/db.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from '@prisma/client' 2 | 3 | // init db connection via prisma 4 | const prisma = new PrismaClient() 5 | 6 | export default prisma; -------------------------------------------------------------------------------- /app/src/views/success.ejs: -------------------------------------------------------------------------------- 1 |

2 | You have successfully authenticated! You should have received your roles in discord, and can now close this tab. 3 |

-------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .idea/ 3 | .vscode 4 | node_modules/ 5 | /data/ 6 | /app/dist/ 7 | docker-compose-local.yml 8 | .env 9 | app.env 10 | db.env 11 | app/commando.db 12 | app/prisma/dev.db -------------------------------------------------------------------------------- /app/src/views/error.ejs: -------------------------------------------------------------------------------- 1 |

2 | An unexpected error occurred - <%= err.status %> 3 |

4 | <% if (env === "development") { %> 5 | 6 | <%= err.message %> 7 | 8 | <% } %> -------------------------------------------------------------------------------- /app.env.template: -------------------------------------------------------------------------------- 1 | DATABASE_URL=postgresql://dbuser:dbpassword@db:5432/postgresdb 2 | DISCORD_CLIENT_ID= 3 | DISCORD_CLIENT_SECRET= 4 | DISCORD_BOT_TOKEN= 5 | APP_HOSTNAME=https://shib.sigpwny.com 6 | JWT_SECRET=changeme123 7 | SUPERADMIN_USER_IDS=181927679195480064 -------------------------------------------------------------------------------- /app/src/config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | DISCORD_CLIENT_ID: "" || process.env.DISCORD_CLIENT_ID, 3 | DISCORD_CLIENT_SECRET: "" || process.env.DISCORD_CLIENT_SECRET, 4 | DISCORD_BOT_TOKEN: "" || process.env.DISCORD_BOT_TOKEN, 5 | APP_HOSTNAME: "" || process.env.APP_HOSTNAME, 6 | JWT_SECRET: "" || process.env.JWT_SECRET, 7 | SUPERADMIN_USER_IDS: process.env.SUPERADMIN_USER_IDS?.replace(" ", "").split(",") 8 | } -------------------------------------------------------------------------------- /app/src/markdown.ts: -------------------------------------------------------------------------------- 1 | import hubdown from "hubdown"; 2 | import createDOMPurify from 'dompurify'; 3 | import {JSDOM} from 'jsdom'; 4 | 5 | 6 | const window = new JSDOM('').window; 7 | const DOMPurify = createDOMPurify(window); 8 | 9 | export async function markdownToSafeHtml(markdown: string) { 10 | const unsafeHtml = await hubdown(markdown); 11 | return DOMPurify.sanitize(unsafeHtml.content); 12 | } 13 | -------------------------------------------------------------------------------- /app/src/views/signup.ejs: -------------------------------------------------------------------------------- 1 |

Authenticate with Discord Server: <%= title %>

2 |

3 | The following information will be recorded: NetID, Discord ID, University Affiliation 4 |

5 |
6 |

Server Info

7 |
8 | <%- sanitizedHtmlDescription %> 9 |
10 |
11 |
12 | 13 | 14 | Authenticate 15 | -------------------------------------------------------------------------------- /app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:12 2 | RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app 3 | WORKDIR /home/node/app 4 | # install deps 5 | RUN npm install -g @prisma/cli 6 | COPY package*.json ./ 7 | USER node 8 | RUN npm install 9 | # prisma 10 | COPY --chown=node:node prisma/ ./prisma/ 11 | RUN npx prisma generate 12 | 13 | # copy src code 14 | COPY --chown=node:node src/ ./src/ 15 | COPY --chown=node:node tsconfig.json ./ 16 | 17 | RUN npm run build 18 | # run server 19 | EXPOSE 8080 20 | CMD [ "node", "dist/server.js" ] -------------------------------------------------------------------------------- /app/src/commands/config/link.ts: -------------------------------------------------------------------------------- 1 | import {Command, CommandoClient, CommandoMessage} from "discord.js-commando" 2 | import CommandGroup from "../../commandGroup"; 3 | import config from "../../config"; 4 | 5 | export default class LinkCommand extends Command { 6 | constructor(client: CommandoClient) { 7 | super(client, { 8 | name: 'link', 9 | group: CommandGroup.CONFIG, 10 | memberName: 'link', 11 | description: 'Get the signup link', 12 | guildOnly: true, 13 | examples: [ 14 | "shib!link" 15 | ] 16 | }); 17 | } 18 | 19 | public async run(message: CommandoMessage) { 20 | return message.reply(`${config.APP_HOSTNAME}/signup/${message.guild.id}`); 21 | } 22 | }; -------------------------------------------------------------------------------- /shibboleth/shibboleth.conf: -------------------------------------------------------------------------------- 1 | ; [supervisord] 2 | ; nodaemon=true 3 | 4 | ; [program:shibd] 5 | ; command=/usr/sbin/shibd -F 6 | ; user=_shibd 7 | ; autorestart=true 8 | 9 | [fcgi-program:shibauthorizer] 10 | command=/usr/lib/x86_64-linux-gnu/shibboleth/shibauthorizer 11 | socket=unix:///etc/shibboleth/shibauthorizer.sock 12 | socket_owner=_shibd:_shibd 13 | socket_mode=0666 14 | user=_shibd 15 | stdout_logfile=/var/log/supervisor/shibauthorizer.log 16 | stderr_logfile=/var/log/supervisor/shibauthorizer.error.log 17 | 18 | [fcgi-program:shibresponder] 19 | command=/usr/lib/x86_64-linux-gnu/shibboleth/shibresponder 20 | socket=unix:///etc/shibboleth/shibresponder.sock 21 | socket_owner=_shibd:_shibd 22 | socket_mode=0666 23 | user=_shibd 24 | stdout_logfile=/var/log/supervisor/shibresponder.log 25 | stderr_logfile=/var/log/supervisor/shibresponder.error.log 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dockerized shibboleth service provider for SIGPwny authorization 2 | 3 | How it works TL;DR: 4 | - App is proxy-protected by shibboleth. 5 | - When they sign in, we store their uid and affiliation (student, alum, etc) in their session. 6 | - We then redirect them to discord OAuth to get their discord account 7 | - Discord bot changes their role based on their affiliation 8 | 9 | 10 | 11 | 12 | # Changes to make for your own app (run your own service provider) 13 | shibboleth2.xml: 14 | - In the line ``: Replace https://sp.example.org with your entity ID. 15 | - In the line ``: 16 | Replace consult@illinois.edu with the appropriate support email address for services on this server. 17 | 18 | attribute-map.xml: 19 | - Uncomment your required attributes 20 | 21 | Dockerfile: 22 | - Change shib-keygen cmd to use your entityID instead 23 | -------------------------------------------------------------------------------- /shibboleth/shib_clear_headers: -------------------------------------------------------------------------------- 1 | # Ensure that you add directives to clear input headers for *all* attributes 2 | # that your backend application uses. This may also include variations on these 3 | # headers, such as differing capitalisations and replacing hyphens with 4 | # underscores etc -- it all depends on what your application is reading. 5 | # 6 | # Note that Nginx silently drops headers with underscores 7 | # unless the non-default `underscores_in_headers` is enabled. 8 | 9 | # Shib-* doesn't currently work because * isn't (yet) supported 10 | more_clear_input_headers 11 | Auth-Type 12 | Shib-Application-Id 13 | Shib-Authentication-Instant 14 | Shib-Authentication-Method 15 | Shib-Authncontext-Class 16 | Shib-Identity-Provider 17 | Shib-Session-Id 18 | Shib-Session-Index 19 | Remote-User; 20 | 21 | more_clear_input_headers 22 | EPPN 23 | UID 24 | Affiliation 25 | cn 26 | Unscoped-Affiliation 27 | Entitlement 28 | Targeted-Id 29 | Persistent-Id 30 | Transient-Name 31 | Commonname 32 | DisplayName 33 | Email 34 | OrganizationName; 35 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | app: 4 | build: ./app 5 | expose: 6 | - "8080" 7 | env_file: 8 | - ./app.env 9 | volumes: 10 | - ./app/prisma:/home/node/app/prisma 11 | # depends_on: 12 | # - db 13 | #db: 14 | # image: "postgres:alpine" 15 | # restart: always 16 | # volumes: 17 | # - ./postgres-data:/var/lib/postgresql/data 18 | # env_file: 19 | # - ./db.env 20 | # networks: 21 | # internal: 22 | nginx: 23 | build: ./shibboleth 24 | command: "/bin/sh -c '/usr/bin/supervisord; /etc/init.d/shibd restart; while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'" 25 | ports: 26 | - "80:80" 27 | - "443:443" 28 | volumes: 29 | - ./data/certbot/conf:/etc/letsencrypt 30 | - ./data/certbot/www:/var/www/certbot 31 | - ./data/shib/sp-cert.pem:/etc/shibboleth/sp-cert.pem 32 | - ./data/shib/sp-key.pem:/etc/shibboleth/sp-key.pem 33 | depends_on: 34 | - app 35 | certbot: 36 | image: certbot/certbot 37 | entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" 38 | volumes: 39 | - ./data/certbot/conf:/etc/letsencrypt 40 | - ./data/certbot/www:/var/www/certbot -------------------------------------------------------------------------------- /app/src/commands/config/csv.ts: -------------------------------------------------------------------------------- 1 | import { Readable } from "stream" 2 | import { MessageAttachment } from "discord.js"; 3 | import {Command, CommandoClient, CommandoMessage} from "discord.js-commando" 4 | import CommandGroup from "../../commandGroup"; 5 | import db from "../../db"; 6 | 7 | export default class DescriptionCommand extends Command { 8 | constructor(client: CommandoClient) { 9 | super(client, { 10 | name: 'csv', 11 | group: CommandGroup.CONFIG, 12 | memberName: 'csv', 13 | description: 'Export signups as a CSV file', 14 | guildOnly: true, 15 | userPermissions: [ 'ADMINISTRATOR' ] 16 | }); 17 | } 18 | 19 | public async run(message: CommandoMessage, { text }: {text: string}) { 20 | const signups = await db.user.findMany({ 21 | where: { 22 | discordServerId: message.guild.id 23 | } 24 | }); 25 | let csvString = "discordId,shibId,shibAffiliations\n"; 26 | for (let signup of signups) { 27 | csvString += `${signup.discordId},${signup.shibId},${signup.shibAffiliations}\n`; 28 | } 29 | const now = new Date(); 30 | return message.reply("CSV generated", new MessageAttachment(Readable.from([csvString]), `signups-${now.getDay()}-${now.getMonth()}-${now.getFullYear()}.csv`)); 31 | } 32 | }; -------------------------------------------------------------------------------- /shibboleth/itrust.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIID6DCCAtACCQCMA0BzGdh1YzANBgkqhkiG9w0BAQUFADCBtTELMAkGA1UEBhMC 3 | VVMxETAPBgNVBAgMCElsbGlub2lzMQ8wDQYDVQQHDAZVcmJhbmExGzAZBgNVBAoM 4 | EkktVHJ1c3QgRmVkZXJhdGlvbjEZMBcGA1UECwwQTWV0YWRhdGEgc2lnbmluZzEi 5 | MCAGA1UEAwwZZmVkb3AuaXRydXN0LmlsbGlub2lzLmVkdTEmMCQGCSqGSIb3DQEJ 6 | ARYXaXRydXN0LW1nckBpbGxpbm9pcy5lZHUwHhcNMTIxMTE1MTYyOTExWhcNMzIx 7 | MTEwMTYyOTExWjCBtTELMAkGA1UEBhMCVVMxETAPBgNVBAgMCElsbGlub2lzMQ8w 8 | DQYDVQQHDAZVcmJhbmExGzAZBgNVBAoMEkktVHJ1c3QgRmVkZXJhdGlvbjEZMBcG 9 | A1UECwwQTWV0YWRhdGEgc2lnbmluZzEiMCAGA1UEAwwZZmVkb3AuaXRydXN0Lmls 10 | bGlub2lzLmVkdTEmMCQGCSqGSIb3DQEJARYXaXRydXN0LW1nckBpbGxpbm9pcy5l 11 | ZHUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDWknoWXZG7rsKBjf4n 12 | N0xv/BiidspJArpdDW7b+tYm6EzX4/75fluM8h/2ioUe68m9rnEd+gNHiIx6fA2M 13 | c/DRSZSMc3zcTT+uQhC1TQ1ohnZWdnZj6DTOvqb1Q7W2RvlL7v6loZZmX/xCF8aG 14 | oDuzAzJ+872vaZCIk2bzpgvRLZIwNz5QRMOUPLRK6KMoDpBQMFAsTThnws/StibK 15 | OTU/Pl9AM5VIlqNz8tPWJSJYXecTyyih8HbYjr+MXRJNBUQ1/L/0JS2aTfFEVgBC 16 | s6WwUrZp5TqU06rW5l6wc3RINhWr20ZU3+HOClogrnIq/Jytc3qx9tXyTj7VWsa3 17 | rLQxAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAHsDU120uP0ED1MyImbzUuXMfKKG 18 | 9AaBiT4TzQUG5In8rz8u59xuA4hJUB58IZIei85fQrqvpPdNmFBwYgzVjOLIEvsr 19 | gUU7PwqyOY40iPdba0ZY2MY7wu3UbNlMRa/rHbdLOg8+pt33ESXov3qVZLibQsuS 20 | qEEOC3Y5p/waMKdBcPwx5ewmkIsTWfTKwQfNOI0f7BQD/mIXRcsjU1G1Ffu/ZrsK 21 | H6boGYNHeROXt10NRBmxgiqUV4n6tbi80YiAe9hcNTWl+Yh9QWuHPNFJTjhwTH0A 22 | DIde/RBj/4NC63KU7LNSa/od+jB2STZqBsCHnIrRfpIUr60fv1q11ZM5eDI= 23 | -----END CERTIFICATE----- 24 | -------------------------------------------------------------------------------- /app/src/commands/config/description.ts: -------------------------------------------------------------------------------- 1 | import {Command, CommandoClient, CommandoMessage} from "discord.js-commando" 2 | import CommandGroup from "../../commandGroup"; 3 | import db from "../../db"; 4 | 5 | export default class DescriptionCommand extends Command { 6 | constructor(client: CommandoClient) { 7 | super(client, { 8 | name: 'description', 9 | group: CommandGroup.CONFIG, 10 | memberName: 'description', 11 | description: 'Set the server description info block on the web login page', 12 | guildOnly: true, 13 | argsType: 'single', 14 | args: [ 15 | { 16 | key: 'text', 17 | prompt: 'What would you like to set the signup page description to?', 18 | type: 'string' 19 | }, 20 | ], 21 | userPermissions: [ 'ADMINISTRATOR' ] 22 | }); 23 | } 24 | 25 | public async run(message: CommandoMessage, { text }: {text: string}) { 26 | console.log(`description: ${text}`); 27 | const discordServer = await db.discordServer.findOne({where: {id: message.guild.id}}); 28 | if (discordServer) { 29 | await db.discordServer.update({ 30 | where: {id: message.guild.id}, 31 | data: {description: text} 32 | }); 33 | return message.reply("Description updated!"); 34 | } 35 | else return message.reply("Error - could not find server"); 36 | } 37 | }; -------------------------------------------------------------------------------- /app/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | datasource db { 5 | provider = "sqlite" 6 | url = env("DATABASE_URL") 7 | } 8 | 9 | generator client { 10 | provider = "prisma-client-js" 11 | } 12 | 13 | model User { 14 | id Int @id @default(autoincrement()) 15 | shibId String 16 | discordId String 17 | shibAffiliations String 18 | server DiscordServer @relation(references: [id]) // server that they are part of 19 | } 20 | 21 | model DiscordServer { 22 | // discord guild id 23 | id String @id 24 | name String @default("temp name") 25 | description String @default("temp description") 26 | // whether to use the allowlist 27 | allowlistEnabled Boolean @default(false) 28 | // list of allowed shibIds 29 | //allowlist String[] 30 | // list of discord user ids of managers 31 | //managers String[] 32 | // list of all authenticated users 33 | users User[] 34 | // roleId to give all authenticated users 35 | authRole String? 36 | // affiliation -> roleId mappings 37 | roleMappings AffiliationToRoleMapping[] 38 | // channel id to dump logs in 39 | loggingChannelId String? 40 | } 41 | 42 | model AffiliationToRoleMapping { 43 | //id Int @id @default(autoincrement()) 44 | shibAffiliation String 45 | discordRole String 46 | discordServer DiscordServer @relation(fields: [discordServerId], references: [id]) 47 | discordServerId String 48 | 49 | @@id([shibAffiliation, discordServerId]) 50 | } -------------------------------------------------------------------------------- /app/prisma/migrations/20201001022914-init/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | datasource db { 5 | provider = "sqlite" 6 | url = "***" 7 | } 8 | 9 | generator client { 10 | provider = "prisma-client-js" 11 | } 12 | 13 | model User { 14 | id Int @id @default(autoincrement()) 15 | shibId String 16 | discordId String 17 | shibAffiliations String 18 | server DiscordServer @relation(references: [id]) // server that they are part of 19 | } 20 | 21 | model DiscordServer { 22 | // discord guild id 23 | id String @id 24 | name String @default("temp name") 25 | description String @default("temp description") 26 | // whether to use the allowlist 27 | allowlistEnabled Boolean @default(false) 28 | // list of allowed shibIds 29 | //allowlist String[] 30 | // list of discord user ids of managers 31 | //managers String[] 32 | // list of all authenticated users 33 | users User[] 34 | // roleId to give all authenticated users 35 | authRole String? 36 | // affiliation -> roleId mappings 37 | roleMappings AffiliationToRoleMapping[] 38 | // channel id to dump logs in 39 | loggingChannelId String? 40 | } 41 | 42 | model AffiliationToRoleMapping { 43 | //id Int @id @default(autoincrement()) 44 | shibAffiliation String 45 | discordRole String 46 | discordServer DiscordServer @relation(fields: [discordServerId], references: [id]) 47 | discordServerId String 48 | 49 | @@id([shibAffiliation, discordServerId]) 50 | } -------------------------------------------------------------------------------- /app/src/commands/config/loggingChannel.ts: -------------------------------------------------------------------------------- 1 | import { Channel } from "discord.js"; 2 | import {Command, CommandoClient, CommandoMessage} from "discord.js-commando" 3 | import CommandGroup from "../../commandGroup"; 4 | import db from "../../db"; 5 | 6 | export default class LoggingChannelCommand extends Command { 7 | constructor(client: CommandoClient) { 8 | super(client, { 9 | name: 'logging_channel', 10 | group: CommandGroup.CONFIG, 11 | memberName: 'logging_channel', 12 | description: 'Set the channel to log successful logins to', 13 | guildOnly: true, 14 | userPermissions: [ 'ADMINISTRATOR' ], 15 | examples: [ 16 | "shib!logging_channel #admin-logs" 17 | ], 18 | args: [ 19 | { 20 | key: 'channel', 21 | prompt: 'Private channel to log successful logins to? (e.g. #admin-logs)', 22 | type: 'channel' 23 | }, 24 | ], 25 | }); 26 | } 27 | 28 | public async run(message: CommandoMessage, { channel }: { channel: Channel }) { 29 | console.log(`channel: ${channel.id}`); 30 | const discordServer = await db.discordServer.findOne({where: {id: message.guild.id}}); 31 | if (discordServer) { 32 | await db.discordServer.update({ 33 | where: {id: message.guild.id}, 34 | data: {loggingChannelId: channel.id} 35 | }); 36 | return message.reply("Logging channel updated!"); 37 | } 38 | else return message.reply("Error - could not find server"); 39 | } 40 | }; -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shibboleth-discord-auth", 3 | "version": "1.0.0", 4 | "description": "auth discord users via shibboleth", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "ts-node src/server.ts", 8 | "dev": "ts-node src/server.ts", 9 | "build": "tsc -p . && cp -R src/views dist/", 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "keywords": [ 13 | "shibboleth", 14 | "discord", 15 | "auth", 16 | "bot" 17 | ], 18 | "author": "arxenix", 19 | "license": "MIT", 20 | "devDependencies": { 21 | "@prisma/cli": "^2.8.0", 22 | "@types/better-sqlite3": "^5.4.0", 23 | "@types/dompurify": "^2.0.4", 24 | "@types/jsdom": "^16.2.4", 25 | "@types/jsonwebtoken": "^8.5.0", 26 | "@types/keyv": "^3.1.1", 27 | "@types/koa": "^2.11.4", 28 | "@types/koa-bodyparser": "^4.3.0", 29 | "@types/koa-ejs": "^4.2.2", 30 | "@types/koa-joi-router": "^5.2.3", 31 | "@types/koa-jwt": "^3.3.0", 32 | "@types/node": "^14.11.2", 33 | "@types/node-fetch": "^2.5.7", 34 | "@types/uuid": "^8.3.0", 35 | "ts-node": "^8.10.2", 36 | "typescript": "^3.9.7" 37 | }, 38 | "dependencies": { 39 | "@prisma/client": "^2.8.0", 40 | "better-sqlite3": "^7.1.1", 41 | "client-oauth2": "^4.3.3", 42 | "discord.js": "^12.3.1", 43 | "discord.js-commando": "github:discordjs/Commando", 44 | "dompurify": "^2.1.1", 45 | "hubdown": "^2.6.0", 46 | "jsdom": "^16.4.0", 47 | "jsonwebtoken": "^8.5.1", 48 | "koa": "^2.13.0", 49 | "koa-bodyparser": "^4.3.0", 50 | "koa-ejs": "^4.3.0", 51 | "koa-joi-router": "^6.0.2", 52 | "koa-jwt": "^4.0.0", 53 | "node-fetch": "^2.6.1", 54 | "uuid": "^8.3.0" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/views/template.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | UIUC Shibboleth Discord Auth 5 | 6 | 7 | 31 | 32 | 33 |
34 | 41 |
42 |
43 |
44 | <%- body %> 45 |
46 |
47 | 48 | -------------------------------------------------------------------------------- /shibboleth/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:buster 2 | 3 | # -- VARIOUS DEPENDENCIES -- 4 | RUN apt-get update 5 | # saml2/shib stuff 6 | RUN apt-get install -y opensaml2-schemas xmltooling-schemas libshibsp8 libshibsp-plugins shibboleth-sp2-common shibboleth-sp2-utils 7 | # nginx stuff 8 | RUN apt-get install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev php7.3-fpm 9 | # etc stuff 10 | RUN apt-get install -y wget curl git 11 | 12 | 13 | # -- BUILD AND INSTALL NGINX W/ nginx-shib MODULE -- 14 | RUN echo "deb http://nginx.org/packages/debian/ buster nginx" >> /etc/apt/sources.list 15 | RUN echo "deb-src http://nginx.org/packages/debian/ buster nginx" >> /etc/apt/sources.list 16 | 17 | WORKDIR /tmp 18 | RUN wget http://nginx.org/keys/nginx_signing.key 19 | RUN apt-key add nginx_signing.key 20 | RUN apt-get update 21 | 22 | WORKDIR /opt 23 | RUN git clone https://github.com/openresty/headers-more-nginx-module.git 24 | RUN git clone https://github.com/nginx-shib/nginx-http-shibboleth.git 25 | RUN mkdir buildnginx && cd buildnginx 26 | RUN cat /etc/apt/sources.list 27 | RUN apt-get source nginx 28 | RUN apt-get build-dep -y nginx 29 | # add the shib module to the build file 30 | WORKDIR /opt/nginx-1.16.1 31 | RUN sed -i 's;--with-ld-opt="$(LDFLAGS)";--with-ld-opt="$(LDFLAGS)" --add-module=/opt/headers-more-nginx-module --add-module=/opt/nginx-http-shibboleth;g' debian/rules 32 | # build the package 33 | RUN dpkg-buildpackage -b 34 | # install it 35 | WORKDIR /opt 36 | RUN dpkg -i nginx_1.16.1-1~buster_amd64.deb 37 | COPY shib_clear_headers /etc/nginx/shib_clear_headers 38 | 39 | 40 | 41 | # -- INSTALL & CONFIGURE SUPERVISOR -- 42 | RUN apt-get install -y supervisor 43 | COPY shibboleth.conf /etc/supervisor/conf.d/shibboleth.conf 44 | 45 | 46 | # -- CONFIGURATION -- 47 | # RUN shib-keygen -f 48 | # RUN cat /etc/shibboleth/sp-cert.pem /etc/shibboleth/sp-key.pem 49 | COPY nginx.conf /etc/nginx/conf.d/default.conf 50 | COPY attribute-map.xml /etc/shibboleth/attribute-map.xml 51 | COPY shibboleth2.xml /etc/shibboleth/shibboleth2.xml 52 | COPY itrust.pem /etc/shibboleth/itrust.pem 53 | 54 | CMD ["/usr/bin/supervisord"] 55 | # CMD ["service", "supervisor", "start"] 56 | -------------------------------------------------------------------------------- /shibboleth/nginx.conf: -------------------------------------------------------------------------------- 1 | upstream docker-app { 2 | server app:8080; 3 | } 4 | 5 | 6 | server { 7 | listen 80; 8 | 9 | server_name shib.sigpwny.com; 10 | 11 | #rewrite ^(.*) https://sp.example.it$1 permanent; 12 | 13 | location /.well-known/acme-challenge/ { 14 | root /var/www/certbot; 15 | } 16 | 17 | location / { 18 | return 301 https://$host$request_uri; 19 | } 20 | } 21 | 22 | server { 23 | listen 443 ssl; 24 | server_name shib.sigpwny.com; 25 | root /var/www/; 26 | ssl_certificate /etc/letsencrypt/live/shib.sigpwny.com/fullchain.pem; 27 | ssl_certificate_key /etc/letsencrypt/live/shib.sigpwny.com/privkey.pem; 28 | include /etc/letsencrypt/options-ssl-nginx.conf; 29 | ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 30 | access_log /var/log/nginx/access.log; 31 | error_log /var/log/nginx/error.log; 32 | 33 | 34 | #FastCGI authorizer for Auth Request module 35 | location = /shibauthorizer { 36 | internal; 37 | include fastcgi_params; 38 | fastcgi_pass unix:/etc/shibboleth/shibauthorizer.sock; 39 | } 40 | 41 | #FastCGI responder 42 | location /Shibboleth.sso { 43 | include fastcgi_params; 44 | fastcgi_pass unix:/etc/shibboleth/shibresponder.sock; 45 | } 46 | 47 | #Resources for the Shibboleth error pages. 48 | location /shibboleth-sp { 49 | alias /usr/share/shibboleth/; 50 | } 51 | 52 | #A secured location. 53 | location /login { 54 | include shib_clear_headers; 55 | shib_request /shibauthorizer; 56 | shib_request_use_headers on; 57 | 58 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 59 | proxy_set_header X-Forwarded-Proto http; 60 | proxy_set_header Host $http_host; 61 | proxy_redirect off; 62 | proxy_buffering off; 63 | proxy_pass http://docker-app; 64 | } 65 | 66 | location / { 67 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 68 | proxy_set_header X-Forwarded-Proto http; 69 | proxy_set_header Host $http_host; 70 | proxy_redirect off; 71 | proxy_buffering off; 72 | proxy_pass http://docker-app; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/commands/config/roleMapping.ts: -------------------------------------------------------------------------------- 1 | import { Role } from "discord.js"; 2 | import {Command, CommandoClient, CommandoMessage} from "discord.js-commando" 3 | import CommandGroup from "../../commandGroup"; 4 | import db from "../../db"; 5 | 6 | export default class RoleMappingCommand extends Command { 7 | constructor(client: CommandoClient) { 8 | super(client, { 9 | name: 'role_mapping', 10 | group: CommandGroup.CONFIG, 11 | memberName: 'role_mapping', 12 | description: 'Sets up a mapping from shibboleth affiliation -> discord role', 13 | guildOnly: true, 14 | userPermissions: [ 'ADMINISTRATOR' ], 15 | examples: [ 16 | "shib!role_mapping student @UIUC-Role", 17 | "shib!role_mapping alum @Alumni-Role" 18 | ], 19 | args: [ 20 | { 21 | key: 'affiliation', 22 | prompt: 'Shibboleth affiliation to map? (e.g. student, alum)', 23 | type: 'string', 24 | }, 25 | { 26 | key: 'role', 27 | prompt: 'Discord role to map to? (e.g. @UIUC-Role)', 28 | type: 'role', 29 | }, 30 | ], 31 | }); 32 | } 33 | 34 | public async run(message: CommandoMessage, { affiliation, role }: { affiliation: string, role: Role }) { 35 | console.log(`affiliation: ${affiliation}, role: ${role.id}, ${role.name}`); 36 | const discordServer = await db.discordServer.findOne({where: {id: message.guild.id}}); 37 | if (discordServer) { 38 | // update or create (upsert) the mapping 39 | await db.discordServer.update({ 40 | where: {id: message.guild.id}, 41 | data: { 42 | roleMappings: { 43 | upsert: [ 44 | { 45 | create: {shibAffiliation: affiliation, discordRole: role.id}, 46 | update: {discordRole: role.id}, 47 | where: { 48 | shibAffiliation_discordServerId: { 49 | shibAffiliation: affiliation, 50 | discordServerId: message.guild.id 51 | } 52 | }, 53 | } 54 | ] 55 | } 56 | } 57 | }); 58 | return message.reply(`Affiliation mapping updated: ${affiliation} -> ${role.id}`); 59 | } 60 | else return message.reply("Error - could not find server"); 61 | } 62 | }; -------------------------------------------------------------------------------- /init-letsencrypt.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if ! [ -x "$(command -v docker-compose)" ]; then 4 | echo 'Error: docker-compose is not installed.' >&2 5 | exit 1 6 | fi 7 | 8 | domains=(shib.sigpwny.com) 9 | rsa_key_size=4096 10 | data_path="./data/certbot" 11 | email="sigpwny@gmail.com" # Adding a valid address is strongly recommended 12 | staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits 13 | 14 | if [ -d "$data_path" ]; then 15 | read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision 16 | if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then 17 | exit 18 | fi 19 | fi 20 | 21 | 22 | if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then 23 | echo "### Downloading recommended TLS parameters ..." 24 | mkdir -p "$data_path/conf" 25 | curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf" 26 | curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem" 27 | echo 28 | fi 29 | 30 | echo "### Creating dummy certificate for $domains ..." 31 | path="/etc/letsencrypt/live/$domains" 32 | mkdir -p "$data_path/conf/live/$domains" 33 | docker-compose run --rm --entrypoint "\ 34 | openssl req -x509 -nodes -newkey rsa:2048 -days 1\ 35 | -keyout '$path/privkey.pem' \ 36 | -out '$path/fullchain.pem' \ 37 | -subj '/CN=localhost'" certbot 38 | echo 39 | 40 | echo "### Starting nginx ..." 41 | docker-compose up --force-recreate -d nginx app 42 | echo 43 | 44 | echo "### Deleting dummy certificate for $domains ..." 45 | docker-compose run --rm --entrypoint "\ 46 | rm -Rf /etc/letsencrypt/live/$domains && \ 47 | rm -Rf /etc/letsencrypt/archive/$domains && \ 48 | rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot 49 | echo 50 | 51 | 52 | echo "### Requesting Let's Encrypt certificate for $domains ..." 53 | #Join $domains to -d args 54 | domain_args="" 55 | for domain in "${domains[@]}"; do 56 | domain_args="$domain_args -d $domain" 57 | done 58 | 59 | # Select appropriate email arg 60 | case "$email" in 61 | "") email_arg="--register-unsafely-without-email" ;; 62 | *) email_arg="--email $email" ;; 63 | esac 64 | 65 | # Enable staging mode if needed 66 | if [ $staging != "0" ]; then staging_arg="--staging"; fi 67 | 68 | docker-compose run --rm --entrypoint "\ 69 | certbot certonly --webroot -w /var/www/certbot \ 70 | $staging_arg \ 71 | $email_arg \ 72 | $domain_args \ 73 | --rsa-key-size $rsa_key_size \ 74 | --agree-tos \ 75 | --force-renewal" certbot 76 | echo 77 | 78 | echo "### Reloading nginx ..." 79 | docker-compose exec nginx nginx -s reload 80 | -------------------------------------------------------------------------------- /app/prisma/migrations/20201001022914-init/README.md: -------------------------------------------------------------------------------- 1 | # Migration `20201001022914-init` 2 | 3 | This migration has been generated by Ankur Sundara at 9/30/2020, 10:29:14 PM. 4 | You can check out the [state of the schema](./schema.prisma) after the migration. 5 | 6 | ## Database Steps 7 | 8 | ```sql 9 | CREATE TABLE "User" ( 10 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 11 | "shibId" TEXT NOT NULL, 12 | "discordId" TEXT NOT NULL, 13 | "shibAffiliations" TEXT NOT NULL, 14 | "discordServerId" TEXT NOT NULL, 15 | 16 | FOREIGN KEY ("discordServerId") REFERENCES "DiscordServer"("id") ON DELETE CASCADE ON UPDATE CASCADE 17 | ) 18 | 19 | CREATE TABLE "DiscordServer" ( 20 | "id" TEXT NOT NULL, 21 | "name" TEXT NOT NULL DEFAULT 'temp name', 22 | "description" TEXT NOT NULL DEFAULT 'temp description', 23 | "allowlistEnabled" BOOLEAN NOT NULL DEFAULT false, 24 | "authRole" TEXT, 25 | "loggingChannelId" TEXT, 26 | PRIMARY KEY ("id") 27 | ) 28 | 29 | CREATE TABLE "AffiliationToRoleMapping" ( 30 | "shibAffiliation" TEXT NOT NULL, 31 | "discordRole" TEXT NOT NULL, 32 | "discordServerId" TEXT NOT NULL, 33 | 34 | FOREIGN KEY ("discordServerId") REFERENCES "DiscordServer"("id") ON DELETE CASCADE ON UPDATE CASCADE, 35 | PRIMARY KEY ("shibAffiliation","discordServerId") 36 | ) 37 | ``` 38 | 39 | ## Changes 40 | 41 | ```diff 42 | diff --git schema.prisma schema.prisma 43 | migration ..20201001022914-init 44 | --- datamodel.dml 45 | +++ datamodel.dml 46 | @@ -1,0 +1,50 @@ 47 | +// This is your Prisma schema file, 48 | +// learn more about it in the docs: https://pris.ly/d/prisma-schema 49 | + 50 | +datasource db { 51 | + provider = "sqlite" 52 | + url = "***" 53 | +} 54 | + 55 | +generator client { 56 | + provider = "prisma-client-js" 57 | +} 58 | + 59 | +model User { 60 | + id Int @id @default(autoincrement()) 61 | + shibId String 62 | + discordId String 63 | + shibAffiliations String 64 | + server DiscordServer @relation(references: [id]) // server that they are part of 65 | +} 66 | + 67 | +model DiscordServer { 68 | + // discord guild id 69 | + id String @id 70 | + name String @default("temp name") 71 | + description String @default("temp description") 72 | + // whether to use the allowlist 73 | + allowlistEnabled Boolean @default(false) 74 | + // list of allowed shibIds 75 | + //allowlist String[] 76 | + // list of discord user ids of managers 77 | + //managers String[] 78 | + // list of all authenticated users 79 | + users User[] 80 | + // roleId to give all authenticated users 81 | + authRole String? 82 | + // affiliation -> roleId mappings 83 | + roleMappings AffiliationToRoleMapping[] 84 | + // channel id to dump logs in 85 | + loggingChannelId String? 86 | +} 87 | + 88 | +model AffiliationToRoleMapping { 89 | + //id Int @id @default(autoincrement()) 90 | + shibAffiliation String 91 | + discordRole String 92 | + discordServer DiscordServer @relation(fields: [discordServerId], references: [id]) 93 | + discordServerId String 94 | + 95 | + @@id([shibAffiliation, discordServerId]) 96 | +} 97 | ``` 98 | 99 | 100 | -------------------------------------------------------------------------------- /shibboleth/shibboleth2.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 13 | 14 | 15 | 16 | 17 | 23 | 25 | 29 | 31 | 35 | 37 | SAML2 SAML1 38 | 39 | SAML2 Local 40 | 41 | 42 | 43 | 44 | 45 | 49 | 52 | 53 | 55 | 56 | 57 | 58 | 59 | urn:mace:incommon:uiuc.edu 60 | 61 | 62 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /app/src/discord.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | 3 | import { CommandoClient, SyncSQLiteProvider } from 'discord.js-commando'; 4 | import sqlite3 from 'better-sqlite3'; 5 | import { GuildMember, GuildChannel, Guild } from 'discord.js'; 6 | 7 | import config from './config'; 8 | import CommandGroup from './commandGroup'; 9 | import db from "./db"; 10 | import DescriptionCommand from "./commands/config/description"; 11 | import RoleMappingCommand from "./commands/config/roleMapping"; 12 | import LoggingChannelCommand from "./commands/config/loggingChannel"; 13 | import LinkCommand from "./commands/config/link"; 14 | import CSVCommand from "./commands/config/csv"; 15 | import { DiscordServer } from '@prisma/client'; 16 | 17 | const commando = new CommandoClient({ 18 | commandPrefix: 'shib!', 19 | owner: config.SUPERADMIN_USER_IDS, 20 | invite: 'https://discord.gg/cWcZ6a9', 21 | }); 22 | // TODO - store commando settings (guild bot prefix, guild enabled commands, etc.) in same DB as bot settings? 23 | commando.setProvider(new SyncSQLiteProvider(sqlite3("commando.db"))) 24 | 25 | commando.registry 26 | // Registers your custom command groups 27 | .registerGroups([ 28 | [CommandGroup.CONFIG, 'Commands for server administrators to configure the bot & web interface settings'] 29 | ]) 30 | 31 | // Registers all built-in groups, commands, and argument types 32 | .registerDefaults() 33 | .registerCommands([ 34 | DescriptionCommand, 35 | LoggingChannelCommand, 36 | RoleMappingCommand, 37 | LinkCommand, 38 | CSVCommand 39 | ]); 40 | 41 | commando.on("guildCreate", function(guild){ 42 | console.log(`the client joined guild ${guild.id}`); 43 | const success = createServerIfNotExists(guild); 44 | if (success) { 45 | console.log("added guild to db"); 46 | } 47 | }); 48 | 49 | commando.on("ready", async function(){ 50 | console.log(`I am ready! Logged in as ${commando.user?.tag}!`); 51 | console.log(`Bot has started - #${commando.guilds.cache.size} guilds`); 52 | 53 | for (let guild of commando.guilds.cache.values()) { 54 | console.log(guild.name); 55 | const success = await createServerIfNotExists(guild); 56 | if (success) { 57 | console.log("added guild to db"); 58 | } 59 | } 60 | //commando.user?.setActivity("testing1"); 61 | const link = await commando.generateInvite(['SEND_MESSAGES', 'MANAGE_ROLES']); 62 | console.log(`Generated bot invite link: ${link}`); 63 | }); 64 | 65 | commando.login(config.DISCORD_BOT_TOKEN); 66 | 67 | async function createServerIfNotExists(guild: Guild): Promise { 68 | const server = await db.discordServer.findOne({where: {id: guild.id}}); 69 | if (!server) { 70 | await db.discordServer.create({data: {id: guild.id, name: guild.name}}); 71 | return true; 72 | } 73 | return false; 74 | } 75 | 76 | function getGuildMember(guildId: string, userId: string): GuildMember | undefined { 77 | return commando.guilds.cache.get(guildId)?.members.cache.get(userId) 78 | } 79 | 80 | function logToChannel(server: DiscordServer, message: string) { 81 | console.log(`Server ${server.id} - ${message}`); 82 | if (server.loggingChannelId) { 83 | const channel = commando.guilds.cache.get(server.id)?.channels.cache.get(server.loggingChannelId); 84 | if (channel) 85 | channel.send(message); 86 | } 87 | } 88 | 89 | export { 90 | getGuildMember, 91 | logToChannel, 92 | commando 93 | } -------------------------------------------------------------------------------- /shibboleth/attribute-map.xml: -------------------------------------------------------------------------------- 1 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 33 | 34 | 35 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ 8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./dist", /* Redirect output structure to the directory. */ 18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true, /* Enable all strict type-checking options. */ 29 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | 43 | /* Module Resolution Options */ 44 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 54 | 55 | /* Source Map Options */ 56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 60 | 61 | /* Experimental Options */ 62 | "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 64 | 65 | /* Advanced Options */ 66 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 68 | }, 69 | "include": [ 70 | "./src/**/*" 71 | ] 72 | } 73 | -------------------------------------------------------------------------------- /app/src/server.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import Koa from 'koa'; 3 | import Router from 'koa-joi-router'; 4 | import bodyParser from 'koa-bodyparser'; 5 | import ClientOAuth2 from 'client-oauth2'; 6 | import koaJwt from 'koa-jwt'; 7 | import jsonwebtoken from 'jsonwebtoken'; 8 | import render from 'koa-ejs' 9 | import { v4 as uuidv4 } from 'uuid'; 10 | import fetch from 'node-fetch'; 11 | 12 | import config from './config'; 13 | import { getGuildMember, commando, logToChannel } from './discord'; 14 | import db from './db'; 15 | import { markdownToSafeHtml } from './markdown'; 16 | 17 | const app = new Koa(); 18 | // ejs templating 19 | render(app, { 20 | root: path.join(__dirname, 'views'), 21 | layout: 'template', 22 | viewExt: 'ejs', 23 | cache: false, 24 | debug: false 25 | }); 26 | 27 | // middleware to parse form bodies 28 | app.use(bodyParser()); 29 | const Joi = Router.Joi; 30 | const router = Router(); 31 | 32 | const discordAuth = new ClientOAuth2({ 33 | clientId: config.DISCORD_CLIENT_ID, 34 | clientSecret: config.DISCORD_CLIENT_SECRET, 35 | accessTokenUri: 'https://discordapp.com/api/oauth2/token', 36 | authorizationUri: 'https://discordapp.com/api/oauth2/authorize', 37 | redirectUri: `${config.APP_HOSTNAME}/auth/discord/callback` 38 | }); 39 | 40 | const jwtMiddleware = koaJwt({ 41 | secret: config.JWT_SECRET as string, 42 | cookie: 'session', 43 | key: 'jwtdata' 44 | }); 45 | 46 | app.use( async (ctx, next) => { 47 | try { 48 | await next() 49 | } catch(err) { 50 | console.log(err.status); 51 | console.error(err.message); 52 | ctx.status = err.status || 500; 53 | // unsafe cast because of unsafe types somewhere... 54 | await ( ctx).render('error', {err: err, env: app.env}); 55 | } 56 | }); 57 | 58 | // ONLY the /login endpoint is protected by shib (shibboleth2.xml). We must get the headers from here and store them in user session. 59 | router.get('/login', { 60 | validate: { 61 | header: Joi.object({ 62 | 'unscoped-affiliation': Joi.string().required(), 63 | 'uid': Joi.string().required(), 64 | }).options({allowUnknown: true}), 65 | query: Joi.object({ 66 | 'server': Joi.string().required() 67 | }).options({allowUnknown: true}), 68 | } 69 | }, async (ctx) => { 70 | const state = uuidv4(); 71 | const data = { 72 | affiliations: ctx.request.headers['unscoped-affiliation'].split(';'), 73 | uid: ctx.request.headers['uid'], 74 | discordServer: ctx.request.query['server'], 75 | state: state 76 | }; 77 | console.log(data); 78 | 79 | const server = await db.discordServer.findOne({where: {id: data.discordServer}}); 80 | ctx.assert(server, 400, 'invalid discord server'); 81 | 82 | const jwt = jsonwebtoken.sign(data, config.JWT_SECRET as string); 83 | ctx.cookies.set('session', jwt, {httpOnly: true}); 84 | ctx.redirect(discordAuth.code.getUri({scopes: ["identify"], state: state})); 85 | }); 86 | 87 | router.use('/auth/discord/callback', jwtMiddleware); 88 | router.get('/auth/discord/callback', { 89 | validate: { 90 | query: Joi.object({ 91 | 'code': Joi.string().required(), 92 | 'state': Joi.string().required(), 93 | }).options({allowUnknown: true}), 94 | } 95 | }, async (ctx) => { 96 | const {discordServer: discordServerId, affiliations: shibAffiliations, uid: shibId, state: oAuthState} = ctx.state.jwtdata; 97 | // assert that state is correct 98 | ctx.assert(ctx.query['state'] === oAuthState, 400, 'Invalid OAuth state'); 99 | 100 | // get auth token (takes original urlstring, so it gets the code query param) 101 | const userToken = await discordAuth.code.getToken(ctx.url); 102 | const userResponse = await fetch(`https://discordapp.com/api/users/@me`, 103 | { 104 | method: 'GET', 105 | headers: { 106 | Authorization: `Bearer ${userToken.accessToken}`, 107 | }, 108 | }); 109 | const userJson = await userResponse.json(); 110 | console.log(userJson); 111 | const userId = userJson.id; 112 | 113 | // check they are actually in the discord server 114 | const guildMember = getGuildMember(discordServerId, userId); 115 | if ( guildMember ) { 116 | const discordServer = await db.discordServer.findOne({where: {id: discordServerId}}); 117 | if (discordServer) { 118 | // create or update user 119 | await db.discordServer.update({ 120 | where: {id: discordServerId}, 121 | data: { 122 | users: { 123 | create: { 124 | shibId: shibId, 125 | discordId: userId, 126 | shibAffiliations: shibAffiliations.join(";") 127 | } 128 | } 129 | } 130 | }); 131 | console.log("user registered"); 132 | 133 | // get all mappings 134 | const affiliationToRoleMappings = await db.affiliationToRoleMapping.findMany({ 135 | where: {discordServerId: discordServerId} 136 | }); 137 | 138 | // find appropriate roles 139 | for (let affiliationToRoleMapping of affiliationToRoleMappings) { 140 | // if his affiliations contains this mapping 141 | if (shibAffiliations.includes(affiliationToRoleMapping.shibAffiliation)) { 142 | const role = commando.guilds.cache.get(discordServerId)?.roles.cache.get(affiliationToRoleMapping.discordRole); 143 | 144 | if (role) { 145 | guildMember.roles.add(role); 146 | } 147 | else { 148 | logToChannel(discordServer, `WARNING: could not find role ${affiliationToRoleMapping.discordRole} for affiliation ${affiliationToRoleMapping.shibAffiliation}`); 149 | } 150 | } 151 | } 152 | logToChannel(discordServer, `<@${userId}>, ${shibId}, ${shibAffiliations.join(";")}`); 153 | } 154 | else { 155 | throw new Error(`could not retrieve discord server - ${discordServerId}`); 156 | } 157 | } 158 | else throw new Error(`User ${userId} not in server ${discordServerId}`); 159 | await ctx.render('success'); 160 | }); 161 | router.get('/', async (ctx) => { 162 | await ctx.render('index', { 163 | guildCount: commando.guilds.cache.size, 164 | memberCount: commando.users.cache.size 165 | }); 166 | }); 167 | 168 | router.get('/signup/:id', { 169 | validate: { 170 | params: { 171 | 'id': Joi.string().required(), 172 | } 173 | } 174 | }, async (ctx) => { 175 | const server = await db.discordServer.findOne({where: {id: ctx.params.id}}); 176 | ctx.assert(server, 400, 'invalid discord server'); 177 | console.log(server); 178 | let description = server!.description.trim(); 179 | if (description.startsWith("```") && description.endsWith("```")) { 180 | description = description.substring(3, description.length-3); 181 | } 182 | else if (description.startsWith("`") && description.endsWith("`")) { 183 | description = description.substring(1, description.length-1); 184 | } 185 | const sanitizedHtmlDescription = await markdownToSafeHtml(description); 186 | await ctx.render('signup', {server, title: commando.guilds.cache.get(server!.id)?.name ?? 'ERROR', sanitizedHtmlDescription}); 187 | }); 188 | 189 | app.use(router.middleware()); 190 | 191 | app.listen(8080); 192 | 193 | console.log('Server running on port 8080'); -------------------------------------------------------------------------------- /app/prisma/migrations/20201001022914-init/steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.14-fixed", 3 | "steps": [ 4 | { 5 | "tag": "CreateSource", 6 | "source": "db" 7 | }, 8 | { 9 | "tag": "CreateArgument", 10 | "location": { 11 | "tag": "Source", 12 | "source": "db" 13 | }, 14 | "argument": "provider", 15 | "value": "\"sqlite\"" 16 | }, 17 | { 18 | "tag": "CreateArgument", 19 | "location": { 20 | "tag": "Source", 21 | "source": "db" 22 | }, 23 | "argument": "url", 24 | "value": "\"***\"" 25 | }, 26 | { 27 | "tag": "CreateModel", 28 | "model": "User" 29 | }, 30 | { 31 | "tag": "CreateField", 32 | "model": "User", 33 | "field": "id", 34 | "type": "Int", 35 | "arity": "Required" 36 | }, 37 | { 38 | "tag": "CreateDirective", 39 | "location": { 40 | "path": { 41 | "tag": "Field", 42 | "model": "User", 43 | "field": "id" 44 | }, 45 | "directive": "id" 46 | } 47 | }, 48 | { 49 | "tag": "CreateDirective", 50 | "location": { 51 | "path": { 52 | "tag": "Field", 53 | "model": "User", 54 | "field": "id" 55 | }, 56 | "directive": "default" 57 | } 58 | }, 59 | { 60 | "tag": "CreateArgument", 61 | "location": { 62 | "tag": "Directive", 63 | "path": { 64 | "tag": "Field", 65 | "model": "User", 66 | "field": "id" 67 | }, 68 | "directive": "default" 69 | }, 70 | "argument": "", 71 | "value": "autoincrement()" 72 | }, 73 | { 74 | "tag": "CreateField", 75 | "model": "User", 76 | "field": "shibId", 77 | "type": "String", 78 | "arity": "Required" 79 | }, 80 | { 81 | "tag": "CreateField", 82 | "model": "User", 83 | "field": "discordId", 84 | "type": "String", 85 | "arity": "Required" 86 | }, 87 | { 88 | "tag": "CreateField", 89 | "model": "User", 90 | "field": "shibAffiliations", 91 | "type": "String", 92 | "arity": "Required" 93 | }, 94 | { 95 | "tag": "CreateField", 96 | "model": "User", 97 | "field": "server", 98 | "type": "DiscordServer", 99 | "arity": "Required" 100 | }, 101 | { 102 | "tag": "CreateDirective", 103 | "location": { 104 | "path": { 105 | "tag": "Field", 106 | "model": "User", 107 | "field": "server" 108 | }, 109 | "directive": "relation" 110 | } 111 | }, 112 | { 113 | "tag": "CreateArgument", 114 | "location": { 115 | "tag": "Directive", 116 | "path": { 117 | "tag": "Field", 118 | "model": "User", 119 | "field": "server" 120 | }, 121 | "directive": "relation" 122 | }, 123 | "argument": "references", 124 | "value": "[id]" 125 | }, 126 | { 127 | "tag": "CreateModel", 128 | "model": "DiscordServer" 129 | }, 130 | { 131 | "tag": "CreateField", 132 | "model": "DiscordServer", 133 | "field": "id", 134 | "type": "String", 135 | "arity": "Required" 136 | }, 137 | { 138 | "tag": "CreateDirective", 139 | "location": { 140 | "path": { 141 | "tag": "Field", 142 | "model": "DiscordServer", 143 | "field": "id" 144 | }, 145 | "directive": "id" 146 | } 147 | }, 148 | { 149 | "tag": "CreateField", 150 | "model": "DiscordServer", 151 | "field": "name", 152 | "type": "String", 153 | "arity": "Required" 154 | }, 155 | { 156 | "tag": "CreateDirective", 157 | "location": { 158 | "path": { 159 | "tag": "Field", 160 | "model": "DiscordServer", 161 | "field": "name" 162 | }, 163 | "directive": "default" 164 | } 165 | }, 166 | { 167 | "tag": "CreateArgument", 168 | "location": { 169 | "tag": "Directive", 170 | "path": { 171 | "tag": "Field", 172 | "model": "DiscordServer", 173 | "field": "name" 174 | }, 175 | "directive": "default" 176 | }, 177 | "argument": "", 178 | "value": "\"temp name\"" 179 | }, 180 | { 181 | "tag": "CreateField", 182 | "model": "DiscordServer", 183 | "field": "description", 184 | "type": "String", 185 | "arity": "Required" 186 | }, 187 | { 188 | "tag": "CreateDirective", 189 | "location": { 190 | "path": { 191 | "tag": "Field", 192 | "model": "DiscordServer", 193 | "field": "description" 194 | }, 195 | "directive": "default" 196 | } 197 | }, 198 | { 199 | "tag": "CreateArgument", 200 | "location": { 201 | "tag": "Directive", 202 | "path": { 203 | "tag": "Field", 204 | "model": "DiscordServer", 205 | "field": "description" 206 | }, 207 | "directive": "default" 208 | }, 209 | "argument": "", 210 | "value": "\"temp description\"" 211 | }, 212 | { 213 | "tag": "CreateField", 214 | "model": "DiscordServer", 215 | "field": "allowlistEnabled", 216 | "type": "Boolean", 217 | "arity": "Required" 218 | }, 219 | { 220 | "tag": "CreateDirective", 221 | "location": { 222 | "path": { 223 | "tag": "Field", 224 | "model": "DiscordServer", 225 | "field": "allowlistEnabled" 226 | }, 227 | "directive": "default" 228 | } 229 | }, 230 | { 231 | "tag": "CreateArgument", 232 | "location": { 233 | "tag": "Directive", 234 | "path": { 235 | "tag": "Field", 236 | "model": "DiscordServer", 237 | "field": "allowlistEnabled" 238 | }, 239 | "directive": "default" 240 | }, 241 | "argument": "", 242 | "value": "false" 243 | }, 244 | { 245 | "tag": "CreateField", 246 | "model": "DiscordServer", 247 | "field": "users", 248 | "type": "User", 249 | "arity": "List" 250 | }, 251 | { 252 | "tag": "CreateField", 253 | "model": "DiscordServer", 254 | "field": "authRole", 255 | "type": "String", 256 | "arity": "Optional" 257 | }, 258 | { 259 | "tag": "CreateField", 260 | "model": "DiscordServer", 261 | "field": "roleMappings", 262 | "type": "AffiliationToRoleMapping", 263 | "arity": "List" 264 | }, 265 | { 266 | "tag": "CreateField", 267 | "model": "DiscordServer", 268 | "field": "loggingChannelId", 269 | "type": "String", 270 | "arity": "Optional" 271 | }, 272 | { 273 | "tag": "CreateModel", 274 | "model": "AffiliationToRoleMapping" 275 | }, 276 | { 277 | "tag": "CreateField", 278 | "model": "AffiliationToRoleMapping", 279 | "field": "shibAffiliation", 280 | "type": "String", 281 | "arity": "Required" 282 | }, 283 | { 284 | "tag": "CreateField", 285 | "model": "AffiliationToRoleMapping", 286 | "field": "discordRole", 287 | "type": "String", 288 | "arity": "Required" 289 | }, 290 | { 291 | "tag": "CreateField", 292 | "model": "AffiliationToRoleMapping", 293 | "field": "discordServer", 294 | "type": "DiscordServer", 295 | "arity": "Required" 296 | }, 297 | { 298 | "tag": "CreateDirective", 299 | "location": { 300 | "path": { 301 | "tag": "Field", 302 | "model": "AffiliationToRoleMapping", 303 | "field": "discordServer" 304 | }, 305 | "directive": "relation" 306 | } 307 | }, 308 | { 309 | "tag": "CreateArgument", 310 | "location": { 311 | "tag": "Directive", 312 | "path": { 313 | "tag": "Field", 314 | "model": "AffiliationToRoleMapping", 315 | "field": "discordServer" 316 | }, 317 | "directive": "relation" 318 | }, 319 | "argument": "fields", 320 | "value": "[discordServerId]" 321 | }, 322 | { 323 | "tag": "CreateArgument", 324 | "location": { 325 | "tag": "Directive", 326 | "path": { 327 | "tag": "Field", 328 | "model": "AffiliationToRoleMapping", 329 | "field": "discordServer" 330 | }, 331 | "directive": "relation" 332 | }, 333 | "argument": "references", 334 | "value": "[id]" 335 | }, 336 | { 337 | "tag": "CreateField", 338 | "model": "AffiliationToRoleMapping", 339 | "field": "discordServerId", 340 | "type": "String", 341 | "arity": "Required" 342 | }, 343 | { 344 | "tag": "CreateDirective", 345 | "location": { 346 | "path": { 347 | "tag": "Model", 348 | "model": "AffiliationToRoleMapping" 349 | }, 350 | "directive": "id" 351 | } 352 | }, 353 | { 354 | "tag": "CreateArgument", 355 | "location": { 356 | "tag": "Directive", 357 | "path": { 358 | "tag": "Model", 359 | "model": "AffiliationToRoleMapping" 360 | }, 361 | "directive": "id" 362 | }, 363 | "argument": "", 364 | "value": "[shibAffiliation, discordServerId]" 365 | } 366 | ] 367 | } -------------------------------------------------------------------------------- /app/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shibboleth-discord-auth", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discordjs/collection": { 8 | "version": "0.1.6", 9 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 10 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 11 | }, 12 | "@discordjs/form-data": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 15 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 16 | "requires": { 17 | "asynckit": "^0.4.0", 18 | "combined-stream": "^1.0.8", 19 | "mime-types": "^2.1.12" 20 | } 21 | }, 22 | "@hapi/address": { 23 | "version": "2.1.4", 24 | "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", 25 | "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" 26 | }, 27 | "@hapi/bourne": { 28 | "version": "1.3.2", 29 | "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", 30 | "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" 31 | }, 32 | "@hapi/hoek": { 33 | "version": "8.5.1", 34 | "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", 35 | "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" 36 | }, 37 | "@hapi/joi": { 38 | "version": "15.1.1", 39 | "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", 40 | "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", 41 | "requires": { 42 | "@hapi/address": "2.x.x", 43 | "@hapi/bourne": "1.x.x", 44 | "@hapi/hoek": "8.x.x", 45 | "@hapi/topo": "3.x.x" 46 | } 47 | }, 48 | "@hapi/topo": { 49 | "version": "3.1.6", 50 | "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", 51 | "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", 52 | "requires": { 53 | "@hapi/hoek": "^8.3.0" 54 | } 55 | }, 56 | "@koa/router": { 57 | "version": "8.0.2", 58 | "resolved": "https://registry.npmjs.org/@koa/router/-/router-8.0.2.tgz", 59 | "integrity": "sha512-7Wa8yXBmz9HjmZOr+xfMVuxFPNObdkiQFBiwF9SQ8zFqHykwBHcJA/mLqqxU2NKoeXRPBKUOPeOjwgR+gyadcA==", 60 | "requires": { 61 | "debug": "^3.1.0", 62 | "http-errors": "^1.3.1", 63 | "koa-compose": "^3.0.0", 64 | "methods": "^1.0.1", 65 | "path-to-regexp": "^1.1.1", 66 | "urijs": "^1.19.0" 67 | }, 68 | "dependencies": { 69 | "debug": { 70 | "version": "3.2.6", 71 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 72 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 73 | "requires": { 74 | "ms": "^2.1.1" 75 | } 76 | }, 77 | "koa-compose": { 78 | "version": "3.2.1", 79 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", 80 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 81 | "requires": { 82 | "any-promise": "^1.1.0" 83 | } 84 | } 85 | } 86 | }, 87 | "@prisma/cli": { 88 | "version": "2.8.0", 89 | "resolved": "https://registry.npmjs.org/@prisma/cli/-/cli-2.8.0.tgz", 90 | "integrity": "sha512-Kg1C47d75jdEIMmJif8TMlv/2Ihx08E1qWp0euwoZhjd807HGnjgC9tJYjTfkdf+NMJSAUbvoPXKInEX0HoOMw==", 91 | "dev": true 92 | }, 93 | "@prisma/client": { 94 | "version": "2.8.0", 95 | "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.8.0.tgz", 96 | "integrity": "sha512-5+GzRTkPnmv4OEV2tB8kwQt/xLLxBR/daJBcMt6pnnonJvrREsu0tSTdz2LJNPaj3kTT0fSS/OaeGMMdfVYSpw==", 97 | "requires": { 98 | "pkg-up": "^3.1.0" 99 | } 100 | }, 101 | "@servie/events": { 102 | "version": "1.0.0", 103 | "resolved": "https://registry.npmjs.org/@servie/events/-/events-1.0.0.tgz", 104 | "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==" 105 | }, 106 | "@types/accepts": { 107 | "version": "1.3.5", 108 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 109 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 110 | "dev": true, 111 | "requires": { 112 | "@types/node": "*" 113 | } 114 | }, 115 | "@types/better-sqlite3": { 116 | "version": "5.4.0", 117 | "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-5.4.0.tgz", 118 | "integrity": "sha512-nzm7lJ7l3jBmGUbtkL8cdOMhPkN6Pw2IM+b0V7iIKba+YKiLrjkIy7vVLsBIVnd7+lgzBzrHsXZxCaFTcmw5Ow==", 119 | "dev": true, 120 | "requires": { 121 | "@types/integer": "*" 122 | } 123 | }, 124 | "@types/body-parser": { 125 | "version": "1.19.0", 126 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 127 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 128 | "dev": true, 129 | "requires": { 130 | "@types/connect": "*", 131 | "@types/node": "*" 132 | } 133 | }, 134 | "@types/co-body": { 135 | "version": "5.1.0", 136 | "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-5.1.0.tgz", 137 | "integrity": "sha512-iRL97yYTJNGFv495U63ikKG9r60thDtQ403jEzBEFR4IY6kMxw2IfcPoxI8+HY3nRNLrwHFYuCnWGEB/0hFVwg==", 138 | "dev": true, 139 | "requires": { 140 | "@types/node": "*", 141 | "@types/qs": "*" 142 | } 143 | }, 144 | "@types/connect": { 145 | "version": "3.4.33", 146 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 147 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 148 | "dev": true, 149 | "requires": { 150 | "@types/node": "*" 151 | } 152 | }, 153 | "@types/content-disposition": { 154 | "version": "0.5.3", 155 | "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", 156 | "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==", 157 | "dev": true 158 | }, 159 | "@types/cookies": { 160 | "version": "0.7.4", 161 | "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz", 162 | "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==", 163 | "dev": true, 164 | "requires": { 165 | "@types/connect": "*", 166 | "@types/express": "*", 167 | "@types/keygrip": "*", 168 | "@types/node": "*" 169 | } 170 | }, 171 | "@types/dompurify": { 172 | "version": "2.0.4", 173 | "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.0.4.tgz", 174 | "integrity": "sha512-y6K7NyXTQvjr8hJNsAFAD8yshCsIJ0d+OYEFzULuIqWyWOKL2hRru1I+rorI5U0K4SLAROTNuSUFXPDTu278YA==", 175 | "dev": true, 176 | "requires": { 177 | "@types/trusted-types": "*" 178 | } 179 | }, 180 | "@types/express": { 181 | "version": "4.17.8", 182 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", 183 | "integrity": "sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==", 184 | "dev": true, 185 | "requires": { 186 | "@types/body-parser": "*", 187 | "@types/express-serve-static-core": "*", 188 | "@types/qs": "*", 189 | "@types/serve-static": "*" 190 | } 191 | }, 192 | "@types/express-serve-static-core": { 193 | "version": "4.17.13", 194 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz", 195 | "integrity": "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==", 196 | "dev": true, 197 | "requires": { 198 | "@types/node": "*", 199 | "@types/qs": "*", 200 | "@types/range-parser": "*" 201 | } 202 | }, 203 | "@types/http-assert": { 204 | "version": "1.5.1", 205 | "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", 206 | "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==", 207 | "dev": true 208 | }, 209 | "@types/http-errors": { 210 | "version": "1.8.0", 211 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", 212 | "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==", 213 | "dev": true 214 | }, 215 | "@types/integer": { 216 | "version": "1.0.1", 217 | "resolved": "https://registry.npmjs.org/@types/integer/-/integer-1.0.1.tgz", 218 | "integrity": "sha512-DmZDpSVnsuBrOhtHwE1oKmUJ3qVjHhhNQ7WnZy9/RhH3A24Ar+9o4SoaCWcTzQhalpRDIAMsfdoZLWNJtdBR7A==", 219 | "dev": true 220 | }, 221 | "@types/joi": { 222 | "version": "14.3.4", 223 | "resolved": "https://registry.npmjs.org/@types/joi/-/joi-14.3.4.tgz", 224 | "integrity": "sha512-1TQNDJvIKlgYXGNIABfgFp9y0FziDpuGrd799Q5RcnsDu+krD+eeW/0Fs5PHARvWWFelOhIG2OPCo6KbadBM4A==", 225 | "dev": true 226 | }, 227 | "@types/jsdom": { 228 | "version": "16.2.4", 229 | "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.4.tgz", 230 | "integrity": "sha512-RssgLa5ptjVKRkHho/Ex0+DJWkVsYuV8oh2PSG3gKxFp8n/VNyB7kOrZGQkk2zgPlcBkIKOItUc/T5BXit9uhg==", 231 | "dev": true, 232 | "requires": { 233 | "@types/node": "*", 234 | "@types/parse5": "*", 235 | "@types/tough-cookie": "*" 236 | } 237 | }, 238 | "@types/jsonwebtoken": { 239 | "version": "8.5.0", 240 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", 241 | "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", 242 | "dev": true, 243 | "requires": { 244 | "@types/node": "*" 245 | } 246 | }, 247 | "@types/keygrip": { 248 | "version": "1.0.2", 249 | "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", 250 | "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", 251 | "dev": true 252 | }, 253 | "@types/keyv": { 254 | "version": "3.1.1", 255 | "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", 256 | "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", 257 | "dev": true, 258 | "requires": { 259 | "@types/node": "*" 260 | } 261 | }, 262 | "@types/koa": { 263 | "version": "2.11.4", 264 | "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.4.tgz", 265 | "integrity": "sha512-Etqs0kdqbuAsNr5k6mlZQelpZKVwMu9WPRHVVTLnceZlhr0pYmblRNJbCgoCMzKWWePldydU0AYEOX4Q9fnGUQ==", 266 | "dev": true, 267 | "requires": { 268 | "@types/accepts": "*", 269 | "@types/content-disposition": "*", 270 | "@types/cookies": "*", 271 | "@types/http-assert": "*", 272 | "@types/http-errors": "*", 273 | "@types/keygrip": "*", 274 | "@types/koa-compose": "*", 275 | "@types/node": "*" 276 | } 277 | }, 278 | "@types/koa-bodyparser": { 279 | "version": "4.3.0", 280 | "resolved": "https://registry.npmjs.org/@types/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", 281 | "integrity": "sha512-aB/vwwq4G9FAtKzqZ2p8UHTscXxZvICFKVjuckqxCtkX1Ro7F5KHkTCUqTRZFBgDoEkmeca+bFLI1bIsdPPZTA==", 282 | "dev": true, 283 | "requires": { 284 | "@types/koa": "*" 285 | } 286 | }, 287 | "@types/koa-compose": { 288 | "version": "3.2.5", 289 | "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", 290 | "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", 291 | "dev": true, 292 | "requires": { 293 | "@types/koa": "*" 294 | } 295 | }, 296 | "@types/koa-ejs": { 297 | "version": "4.2.2", 298 | "resolved": "https://registry.npmjs.org/@types/koa-ejs/-/koa-ejs-4.2.2.tgz", 299 | "integrity": "sha512-87mMSdvMj9HVKGTvX2IsG40HUsH3ucEzE03r/vMxtSu9AXekxeOJVOyfK5dDoL+fEw7ZtY0AuFwccqShsMVlzQ==", 300 | "dev": true, 301 | "requires": { 302 | "@types/koa": "*" 303 | } 304 | }, 305 | "@types/koa-joi-router": { 306 | "version": "5.2.3", 307 | "resolved": "https://registry.npmjs.org/@types/koa-joi-router/-/koa-joi-router-5.2.3.tgz", 308 | "integrity": "sha512-tLHS3aV+17K/8zX1oUU2bGzQx0y8qlFr9oqP4YRO+32TdC8HeySZNM8J3aAnOwHtdXDVGNdlJcQaA8zpZvj/NA==", 309 | "dev": true, 310 | "requires": { 311 | "@types/co-body": "*", 312 | "@types/joi": "*", 313 | "@types/koa": "*", 314 | "@types/koa-router": "*" 315 | } 316 | }, 317 | "@types/koa-jwt": { 318 | "version": "3.3.0", 319 | "resolved": "https://registry.npmjs.org/@types/koa-jwt/-/koa-jwt-3.3.0.tgz", 320 | "integrity": "sha512-XSVz27M0HaJ0EcB5/PoaUlXpM2JClnF3kH/VmuDk2tr3frYqPkoBmxwZz+vHXykNO22Q6JA3Tcmgo4e8Z8Qhsg==", 321 | "dev": true, 322 | "requires": { 323 | "koa-jwt": "*" 324 | } 325 | }, 326 | "@types/koa-router": { 327 | "version": "7.4.1", 328 | "resolved": "https://registry.npmjs.org/@types/koa-router/-/koa-router-7.4.1.tgz", 329 | "integrity": "sha512-Hg78TXz78QYfEgdq3nTeRmQFEwJKZljsXb/DhtexmyrpRDRnl59oMglh9uPj3/WgKor0woANrYTnxA8gaWGK2A==", 330 | "dev": true, 331 | "requires": { 332 | "@types/koa": "*" 333 | } 334 | }, 335 | "@types/mime": { 336 | "version": "2.0.3", 337 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", 338 | "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", 339 | "dev": true 340 | }, 341 | "@types/node": { 342 | "version": "14.11.2", 343 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", 344 | "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", 345 | "dev": true 346 | }, 347 | "@types/node-fetch": { 348 | "version": "2.5.7", 349 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", 350 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", 351 | "dev": true, 352 | "requires": { 353 | "@types/node": "*", 354 | "form-data": "^3.0.0" 355 | }, 356 | "dependencies": { 357 | "form-data": { 358 | "version": "3.0.0", 359 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", 360 | "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", 361 | "dev": true, 362 | "requires": { 363 | "asynckit": "^0.4.0", 364 | "combined-stream": "^1.0.8", 365 | "mime-types": "^2.1.12" 366 | } 367 | } 368 | } 369 | }, 370 | "@types/parse5": { 371 | "version": "5.0.3", 372 | "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", 373 | "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", 374 | "dev": true 375 | }, 376 | "@types/qs": { 377 | "version": "6.9.4", 378 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz", 379 | "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==", 380 | "dev": true 381 | }, 382 | "@types/range-parser": { 383 | "version": "1.2.3", 384 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 385 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 386 | "dev": true 387 | }, 388 | "@types/serve-static": { 389 | "version": "1.13.5", 390 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", 391 | "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", 392 | "dev": true, 393 | "requires": { 394 | "@types/express-serve-static-core": "*", 395 | "@types/mime": "*" 396 | } 397 | }, 398 | "@types/tough-cookie": { 399 | "version": "2.3.7", 400 | "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.7.tgz", 401 | "integrity": "sha512-rMQbgMGxnLsdn8e9aPVyuN+zMQLrZ2QW8xlv7eWS1mydfGXN+tsTKffcIzd8rGCcLdmi3xvQw2MDaZI1bBNTaw==" 402 | }, 403 | "@types/trusted-types": { 404 | "version": "1.0.6", 405 | "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-1.0.6.tgz", 406 | "integrity": "sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==", 407 | "dev": true 408 | }, 409 | "@types/unist": { 410 | "version": "2.0.3", 411 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", 412 | "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" 413 | }, 414 | "@types/uuid": { 415 | "version": "8.3.0", 416 | "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", 417 | "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", 418 | "dev": true 419 | }, 420 | "abab": { 421 | "version": "2.0.5", 422 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", 423 | "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" 424 | }, 425 | "abort-controller": { 426 | "version": "3.0.0", 427 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 428 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 429 | "requires": { 430 | "event-target-shim": "^5.0.0" 431 | } 432 | }, 433 | "accepts": { 434 | "version": "1.3.7", 435 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 436 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 437 | "requires": { 438 | "mime-types": "~2.1.24", 439 | "negotiator": "0.6.2" 440 | } 441 | }, 442 | "acorn": { 443 | "version": "7.4.0", 444 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", 445 | "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" 446 | }, 447 | "acorn-globals": { 448 | "version": "6.0.0", 449 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", 450 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", 451 | "requires": { 452 | "acorn": "^7.1.1", 453 | "acorn-walk": "^7.1.1" 454 | } 455 | }, 456 | "acorn-walk": { 457 | "version": "7.2.0", 458 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 459 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" 460 | }, 461 | "aggregate-error": { 462 | "version": "3.0.1", 463 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", 464 | "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", 465 | "requires": { 466 | "clean-stack": "^2.0.0", 467 | "indent-string": "^4.0.0" 468 | } 469 | }, 470 | "ajv": { 471 | "version": "6.12.5", 472 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", 473 | "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", 474 | "requires": { 475 | "fast-deep-equal": "^3.1.1", 476 | "fast-json-stable-stringify": "^2.0.0", 477 | "json-schema-traverse": "^0.4.1", 478 | "uri-js": "^4.2.2" 479 | } 480 | }, 481 | "ansi-regex": { 482 | "version": "2.1.1", 483 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 484 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 485 | }, 486 | "any-promise": { 487 | "version": "1.3.0", 488 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 489 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 490 | }, 491 | "aproba": { 492 | "version": "1.2.0", 493 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 494 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 495 | }, 496 | "are-we-there-yet": { 497 | "version": "1.1.5", 498 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 499 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 500 | "requires": { 501 | "delegates": "^1.0.0", 502 | "readable-stream": "^2.0.6" 503 | } 504 | }, 505 | "arg": { 506 | "version": "4.1.3", 507 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 508 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 509 | "dev": true 510 | }, 511 | "argparse": { 512 | "version": "1.0.10", 513 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 514 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 515 | "requires": { 516 | "sprintf-js": "~1.0.2" 517 | } 518 | }, 519 | "asn1": { 520 | "version": "0.2.4", 521 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 522 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 523 | "requires": { 524 | "safer-buffer": "~2.1.0" 525 | } 526 | }, 527 | "assert-plus": { 528 | "version": "1.0.0", 529 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 530 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 531 | }, 532 | "asynckit": { 533 | "version": "0.4.0", 534 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 535 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 536 | }, 537 | "await-busboy": { 538 | "version": "1.0.3", 539 | "resolved": "https://registry.npmjs.org/await-busboy/-/await-busboy-1.0.3.tgz", 540 | "integrity": "sha512-u2TaZLepph/OHrJZgD/qu0vMFl17ahkTz4HJYbnaRLqJX6q1x8SMbFNV1nJnIYRbUr3jyHuTwaCN0hIKfMA8YA==", 541 | "requires": { 542 | "black-hole-stream": "0.0.1", 543 | "busboy": "0.3.0" 544 | } 545 | }, 546 | "aws-sign2": { 547 | "version": "0.7.0", 548 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 549 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 550 | }, 551 | "aws4": { 552 | "version": "1.10.1", 553 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", 554 | "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" 555 | }, 556 | "bail": { 557 | "version": "1.0.5", 558 | "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", 559 | "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" 560 | }, 561 | "base64-js": { 562 | "version": "1.3.1", 563 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 564 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 565 | }, 566 | "bcrypt-pbkdf": { 567 | "version": "1.0.2", 568 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 569 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 570 | "requires": { 571 | "tweetnacl": "^0.14.3" 572 | }, 573 | "dependencies": { 574 | "tweetnacl": { 575 | "version": "0.14.5", 576 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 577 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 578 | } 579 | } 580 | }, 581 | "better-sqlite3": { 582 | "version": "7.1.1", 583 | "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.1.tgz", 584 | "integrity": "sha512-AkvGGyhAVZhRBOul2WT+5CB2EuveM3ZkebEKe1wxMqDZUy1XB/1RBgM66t0ybHC4DIni8+pr7NaLqEX87NUTwg==", 585 | "requires": { 586 | "bindings": "^1.5.0", 587 | "prebuild-install": "^5.3.3", 588 | "tar": "4.4.10" 589 | } 590 | }, 591 | "bindings": { 592 | "version": "1.5.0", 593 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 594 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 595 | "requires": { 596 | "file-uri-to-path": "1.0.0" 597 | } 598 | }, 599 | "bl": { 600 | "version": "4.0.3", 601 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", 602 | "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", 603 | "requires": { 604 | "buffer": "^5.5.0", 605 | "inherits": "^2.0.4", 606 | "readable-stream": "^3.4.0" 607 | }, 608 | "dependencies": { 609 | "readable-stream": { 610 | "version": "3.6.0", 611 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 612 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 613 | "requires": { 614 | "inherits": "^2.0.3", 615 | "string_decoder": "^1.1.1", 616 | "util-deprecate": "^1.0.1" 617 | } 618 | } 619 | } 620 | }, 621 | "black-hole-stream": { 622 | "version": "0.0.1", 623 | "resolved": "https://registry.npmjs.org/black-hole-stream/-/black-hole-stream-0.0.1.tgz", 624 | "integrity": "sha1-M7ega58edFPWBBuCl0SB0hUq6kI=" 625 | }, 626 | "browser-process-hrtime": { 627 | "version": "1.0.0", 628 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", 629 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" 630 | }, 631 | "buffer": { 632 | "version": "5.6.0", 633 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 634 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 635 | "requires": { 636 | "base64-js": "^1.0.2", 637 | "ieee754": "^1.1.4" 638 | } 639 | }, 640 | "buffer-equal-constant-time": { 641 | "version": "1.0.1", 642 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 643 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 644 | }, 645 | "buffer-from": { 646 | "version": "1.1.1", 647 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 648 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 649 | "dev": true 650 | }, 651 | "busboy": { 652 | "version": "0.3.0", 653 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.0.tgz", 654 | "integrity": "sha512-e+kzZRAbbvJPLjQz2z+zAyr78BSi9IFeBTyLwF76g78Q2zRt/RZ1NtS3MS17v2yLqYfLz69zHdC+1L4ja8PwqQ==", 655 | "requires": { 656 | "dicer": "0.3.0" 657 | } 658 | }, 659 | "byte-length": { 660 | "version": "1.0.2", 661 | "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", 662 | "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==" 663 | }, 664 | "bytes": { 665 | "version": "3.1.0", 666 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 667 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 668 | }, 669 | "cache-content-type": { 670 | "version": "1.0.1", 671 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", 672 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", 673 | "requires": { 674 | "mime-types": "^2.1.18", 675 | "ylru": "^1.2.0" 676 | } 677 | }, 678 | "caseless": { 679 | "version": "0.12.0", 680 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 681 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 682 | }, 683 | "ccount": { 684 | "version": "1.0.5", 685 | "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", 686 | "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==" 687 | }, 688 | "character-entities": { 689 | "version": "1.2.4", 690 | "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", 691 | "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" 692 | }, 693 | "character-entities-html4": { 694 | "version": "1.1.4", 695 | "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", 696 | "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==" 697 | }, 698 | "character-entities-legacy": { 699 | "version": "1.1.4", 700 | "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", 701 | "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" 702 | }, 703 | "character-reference-invalid": { 704 | "version": "1.1.4", 705 | "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", 706 | "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" 707 | }, 708 | "chownr": { 709 | "version": "1.1.4", 710 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 711 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 712 | }, 713 | "clean-stack": { 714 | "version": "2.2.0", 715 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 716 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" 717 | }, 718 | "client-oauth2": { 719 | "version": "4.3.3", 720 | "resolved": "https://registry.npmjs.org/client-oauth2/-/client-oauth2-4.3.3.tgz", 721 | "integrity": "sha512-k8AvUYJon0vv75ufoVo4nALYb/qwFFicO3I0+39C6xEdflqVtr+f9cy+0ZxAduoVSTfhP5DX2tY2XICAd5hy6Q==", 722 | "requires": { 723 | "popsicle": "^12.0.5", 724 | "safe-buffer": "^5.2.0" 725 | }, 726 | "dependencies": { 727 | "safe-buffer": { 728 | "version": "5.2.1", 729 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 730 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 731 | } 732 | } 733 | }, 734 | "clone": { 735 | "version": "2.1.2", 736 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 737 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" 738 | }, 739 | "co": { 740 | "version": "4.6.0", 741 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 742 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 743 | }, 744 | "co-body": { 745 | "version": "6.0.0", 746 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.0.0.tgz", 747 | "integrity": "sha512-9ZIcixguuuKIptnY8yemEOuhb71L/lLf+Rl5JfJEUiDNJk0e02MBt7BPxR2GEh5mw8dPthQYR4jPI/BnS1MQgw==", 748 | "requires": { 749 | "inflation": "^2.0.0", 750 | "qs": "^6.5.2", 751 | "raw-body": "^2.3.3", 752 | "type-is": "^1.6.16" 753 | } 754 | }, 755 | "code-point-at": { 756 | "version": "1.1.0", 757 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 758 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 759 | }, 760 | "collapse-white-space": { 761 | "version": "1.0.6", 762 | "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", 763 | "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" 764 | }, 765 | "combined-stream": { 766 | "version": "1.0.8", 767 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 768 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 769 | "requires": { 770 | "delayed-stream": "~1.0.0" 771 | } 772 | }, 773 | "comma-separated-tokens": { 774 | "version": "1.0.8", 775 | "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", 776 | "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" 777 | }, 778 | "common-tags": { 779 | "version": "1.8.0", 780 | "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", 781 | "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" 782 | }, 783 | "console-control-strings": { 784 | "version": "1.1.0", 785 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 786 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 787 | }, 788 | "content-disposition": { 789 | "version": "0.5.3", 790 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 791 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 792 | "requires": { 793 | "safe-buffer": "5.1.2" 794 | } 795 | }, 796 | "content-type": { 797 | "version": "1.0.4", 798 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 799 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 800 | }, 801 | "cookies": { 802 | "version": "0.8.0", 803 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", 804 | "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", 805 | "requires": { 806 | "depd": "~2.0.0", 807 | "keygrip": "~1.1.0" 808 | }, 809 | "dependencies": { 810 | "depd": { 811 | "version": "2.0.0", 812 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 813 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 814 | } 815 | } 816 | }, 817 | "copy-to": { 818 | "version": "2.0.1", 819 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 820 | "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" 821 | }, 822 | "core-util-is": { 823 | "version": "1.0.2", 824 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 825 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 826 | }, 827 | "cssom": { 828 | "version": "0.4.4", 829 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", 830 | "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" 831 | }, 832 | "cssstyle": { 833 | "version": "2.3.0", 834 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", 835 | "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", 836 | "requires": { 837 | "cssom": "~0.3.6" 838 | }, 839 | "dependencies": { 840 | "cssom": { 841 | "version": "0.3.8", 842 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", 843 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" 844 | } 845 | } 846 | }, 847 | "dashdash": { 848 | "version": "1.14.1", 849 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 850 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 851 | "requires": { 852 | "assert-plus": "^1.0.0" 853 | } 854 | }, 855 | "data-urls": { 856 | "version": "2.0.0", 857 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", 858 | "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", 859 | "requires": { 860 | "abab": "^2.0.3", 861 | "whatwg-mimetype": "^2.3.0", 862 | "whatwg-url": "^8.0.0" 863 | } 864 | }, 865 | "debug": { 866 | "version": "4.1.1", 867 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 868 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 869 | "requires": { 870 | "ms": "^2.1.1" 871 | } 872 | }, 873 | "decimal.js": { 874 | "version": "10.2.1", 875 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", 876 | "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" 877 | }, 878 | "decompress-response": { 879 | "version": "4.2.1", 880 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 881 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 882 | "requires": { 883 | "mimic-response": "^2.0.0" 884 | } 885 | }, 886 | "deep-equal": { 887 | "version": "1.0.1", 888 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 889 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 890 | }, 891 | "deep-extend": { 892 | "version": "0.6.0", 893 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 894 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 895 | }, 896 | "deep-is": { 897 | "version": "0.1.3", 898 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 899 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 900 | }, 901 | "delayed-stream": { 902 | "version": "1.0.0", 903 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 904 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 905 | }, 906 | "delegates": { 907 | "version": "1.0.0", 908 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 909 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 910 | }, 911 | "depd": { 912 | "version": "1.1.2", 913 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 914 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 915 | }, 916 | "destroy": { 917 | "version": "1.0.4", 918 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 919 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 920 | }, 921 | "detab": { 922 | "version": "2.0.3", 923 | "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz", 924 | "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==", 925 | "requires": { 926 | "repeat-string": "^1.5.4" 927 | } 928 | }, 929 | "detect-libc": { 930 | "version": "1.0.3", 931 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 932 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 933 | }, 934 | "dicer": { 935 | "version": "0.3.0", 936 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 937 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 938 | "requires": { 939 | "streamsearch": "0.1.2" 940 | } 941 | }, 942 | "diff": { 943 | "version": "4.0.2", 944 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 945 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 946 | "dev": true 947 | }, 948 | "discord.js": { 949 | "version": "12.3.1", 950 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.3.1.tgz", 951 | "integrity": "sha512-mSFyV/mbvzH12UXdS4zadmeUf8IMQOo/YdunubG1wWt1xjWvtaJz/s9CGsFD2B5pTw1W/LXxxUbrQjIZ/xlUdw==", 952 | "requires": { 953 | "@discordjs/collection": "^0.1.6", 954 | "@discordjs/form-data": "^3.0.1", 955 | "abort-controller": "^3.0.0", 956 | "node-fetch": "^2.6.0", 957 | "prism-media": "^1.2.2", 958 | "setimmediate": "^1.0.5", 959 | "tweetnacl": "^1.0.3", 960 | "ws": "^7.3.1" 961 | } 962 | }, 963 | "discord.js-commando": { 964 | "version": "github:discordjs/Commando#198d7604e3725ee88dceab9b5f296edb1b7580a5", 965 | "from": "github:discordjs/Commando", 966 | "requires": { 967 | "common-tags": "^1.8.0", 968 | "require-all": "^3.0.0" 969 | } 970 | }, 971 | "domexception": { 972 | "version": "2.0.1", 973 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", 974 | "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", 975 | "requires": { 976 | "webidl-conversions": "^5.0.0" 977 | }, 978 | "dependencies": { 979 | "webidl-conversions": { 980 | "version": "5.0.0", 981 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", 982 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" 983 | } 984 | } 985 | }, 986 | "dompurify": { 987 | "version": "2.1.1", 988 | "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.1.1.tgz", 989 | "integrity": "sha512-NijiNVkS/OL8mdQL1hUbCD6uty/cgFpmNiuFxrmJ5YPH2cXrPKIewoixoji56rbZ6XBPmtM8GA8/sf9unlSuwg==" 990 | }, 991 | "ecc-jsbn": { 992 | "version": "0.1.2", 993 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 994 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 995 | "requires": { 996 | "jsbn": "~0.1.0", 997 | "safer-buffer": "^2.1.0" 998 | } 999 | }, 1000 | "ecdsa-sig-formatter": { 1001 | "version": "1.0.11", 1002 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1003 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1004 | "requires": { 1005 | "safe-buffer": "^5.0.1" 1006 | } 1007 | }, 1008 | "ee-first": { 1009 | "version": "1.1.1", 1010 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1011 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1012 | }, 1013 | "ejs": { 1014 | "version": "2.7.4", 1015 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", 1016 | "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" 1017 | }, 1018 | "emoji-regex": { 1019 | "version": "6.1.1", 1020 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", 1021 | "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" 1022 | }, 1023 | "encodeurl": { 1024 | "version": "1.0.2", 1025 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1026 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1027 | }, 1028 | "end-of-stream": { 1029 | "version": "1.4.4", 1030 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1031 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1032 | "requires": { 1033 | "once": "^1.4.0" 1034 | } 1035 | }, 1036 | "escape-html": { 1037 | "version": "1.0.3", 1038 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1039 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1040 | }, 1041 | "escodegen": { 1042 | "version": "1.14.3", 1043 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", 1044 | "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", 1045 | "requires": { 1046 | "esprima": "^4.0.1", 1047 | "estraverse": "^4.2.0", 1048 | "esutils": "^2.0.2", 1049 | "optionator": "^0.8.1", 1050 | "source-map": "~0.6.1" 1051 | } 1052 | }, 1053 | "esprima": { 1054 | "version": "4.0.1", 1055 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1056 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 1057 | }, 1058 | "estraverse": { 1059 | "version": "4.3.0", 1060 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1061 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 1062 | }, 1063 | "esutils": { 1064 | "version": "2.0.3", 1065 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1066 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 1067 | }, 1068 | "event-target-shim": { 1069 | "version": "5.0.1", 1070 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1071 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 1072 | }, 1073 | "expand-template": { 1074 | "version": "2.0.3", 1075 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 1076 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 1077 | }, 1078 | "extend": { 1079 | "version": "3.0.2", 1080 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1081 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1082 | }, 1083 | "extend-shallow": { 1084 | "version": "2.0.1", 1085 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1086 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1087 | "requires": { 1088 | "is-extendable": "^0.1.0" 1089 | } 1090 | }, 1091 | "extsprintf": { 1092 | "version": "1.3.0", 1093 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 1094 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 1095 | }, 1096 | "fast-deep-equal": { 1097 | "version": "3.1.3", 1098 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1099 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 1100 | }, 1101 | "fast-json-stable-stringify": { 1102 | "version": "2.1.0", 1103 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1104 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1105 | }, 1106 | "fast-levenshtein": { 1107 | "version": "2.0.6", 1108 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1109 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 1110 | }, 1111 | "fault": { 1112 | "version": "1.0.4", 1113 | "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", 1114 | "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", 1115 | "requires": { 1116 | "format": "^0.2.0" 1117 | } 1118 | }, 1119 | "file-uri-to-path": { 1120 | "version": "1.0.0", 1121 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 1122 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 1123 | }, 1124 | "find-up": { 1125 | "version": "3.0.0", 1126 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1127 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1128 | "requires": { 1129 | "locate-path": "^3.0.0" 1130 | } 1131 | }, 1132 | "flatten": { 1133 | "version": "1.0.3", 1134 | "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", 1135 | "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" 1136 | }, 1137 | "forever-agent": { 1138 | "version": "0.6.1", 1139 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1140 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 1141 | }, 1142 | "form-data": { 1143 | "version": "2.3.3", 1144 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 1145 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 1146 | "requires": { 1147 | "asynckit": "^0.4.0", 1148 | "combined-stream": "^1.0.6", 1149 | "mime-types": "^2.1.12" 1150 | } 1151 | }, 1152 | "format": { 1153 | "version": "0.2.2", 1154 | "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", 1155 | "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" 1156 | }, 1157 | "fresh": { 1158 | "version": "0.5.2", 1159 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1160 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1161 | }, 1162 | "fs-constants": { 1163 | "version": "1.0.0", 1164 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1165 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 1166 | }, 1167 | "fs-minipass": { 1168 | "version": "1.2.7", 1169 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 1170 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 1171 | "requires": { 1172 | "minipass": "^2.6.0" 1173 | } 1174 | }, 1175 | "gauge": { 1176 | "version": "2.7.4", 1177 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 1178 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 1179 | "requires": { 1180 | "aproba": "^1.0.3", 1181 | "console-control-strings": "^1.0.0", 1182 | "has-unicode": "^2.0.0", 1183 | "object-assign": "^4.1.0", 1184 | "signal-exit": "^3.0.0", 1185 | "string-width": "^1.0.1", 1186 | "strip-ansi": "^3.0.1", 1187 | "wide-align": "^1.1.0" 1188 | } 1189 | }, 1190 | "gemoji": { 1191 | "version": "4.2.1", 1192 | "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-4.2.1.tgz", 1193 | "integrity": "sha512-V9lUpRSn+KQGavZx8Pk+6mxG3kaz21ae2kTCXuT36KaRPNgYU8eHtj/RcUCNFVvmwppsYYz3nnNS9lmcP5kTsg==" 1194 | }, 1195 | "getpass": { 1196 | "version": "0.1.7", 1197 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1198 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1199 | "requires": { 1200 | "assert-plus": "^1.0.0" 1201 | } 1202 | }, 1203 | "github-from-package": { 1204 | "version": "0.0.0", 1205 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1206 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 1207 | }, 1208 | "github-slugger": { 1209 | "version": "1.3.0", 1210 | "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", 1211 | "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", 1212 | "requires": { 1213 | "emoji-regex": ">=6.0.0 <=6.1.1" 1214 | } 1215 | }, 1216 | "gray-matter": { 1217 | "version": "3.1.1", 1218 | "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-3.1.1.tgz", 1219 | "integrity": "sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA==", 1220 | "requires": { 1221 | "extend-shallow": "^2.0.1", 1222 | "js-yaml": "^3.10.0", 1223 | "kind-of": "^5.0.2", 1224 | "strip-bom-string": "^1.0.0" 1225 | } 1226 | }, 1227 | "har-schema": { 1228 | "version": "2.0.0", 1229 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1230 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1231 | }, 1232 | "har-validator": { 1233 | "version": "5.1.5", 1234 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 1235 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 1236 | "requires": { 1237 | "ajv": "^6.12.3", 1238 | "har-schema": "^2.0.0" 1239 | } 1240 | }, 1241 | "has-unicode": { 1242 | "version": "2.0.1", 1243 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1244 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 1245 | }, 1246 | "hasha": { 1247 | "version": "3.0.0", 1248 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", 1249 | "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", 1250 | "requires": { 1251 | "is-stream": "^1.0.1" 1252 | } 1253 | }, 1254 | "hast-to-hyperscript": { 1255 | "version": "7.0.4", 1256 | "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz", 1257 | "integrity": "sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA==", 1258 | "requires": { 1259 | "comma-separated-tokens": "^1.0.0", 1260 | "property-information": "^5.3.0", 1261 | "space-separated-tokens": "^1.0.0", 1262 | "style-to-object": "^0.2.1", 1263 | "unist-util-is": "^3.0.0", 1264 | "web-namespaces": "^1.1.2" 1265 | } 1266 | }, 1267 | "hast-util-from-parse5": { 1268 | "version": "5.0.3", 1269 | "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", 1270 | "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", 1271 | "requires": { 1272 | "ccount": "^1.0.3", 1273 | "hastscript": "^5.0.0", 1274 | "property-information": "^5.0.0", 1275 | "web-namespaces": "^1.1.2", 1276 | "xtend": "^4.0.1" 1277 | } 1278 | }, 1279 | "hast-util-has-property": { 1280 | "version": "1.0.4", 1281 | "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz", 1282 | "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==" 1283 | }, 1284 | "hast-util-is-element": { 1285 | "version": "1.1.0", 1286 | "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", 1287 | "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==" 1288 | }, 1289 | "hast-util-parse-selector": { 1290 | "version": "2.2.4", 1291 | "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz", 1292 | "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==" 1293 | }, 1294 | "hast-util-raw": { 1295 | "version": "5.0.2", 1296 | "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-5.0.2.tgz", 1297 | "integrity": "sha512-3ReYQcIHmzSgMq8UrDZHFL0oGlbuVGdLKs8s/Fe8BfHFAyZDrdv1fy/AGn+Fim8ZuvAHcJ61NQhVMtyfHviT/g==", 1298 | "requires": { 1299 | "hast-util-from-parse5": "^5.0.0", 1300 | "hast-util-to-parse5": "^5.0.0", 1301 | "html-void-elements": "^1.0.0", 1302 | "parse5": "^5.0.0", 1303 | "unist-util-position": "^3.0.0", 1304 | "web-namespaces": "^1.0.0", 1305 | "xtend": "^4.0.0", 1306 | "zwitch": "^1.0.0" 1307 | } 1308 | }, 1309 | "hast-util-to-html": { 1310 | "version": "6.1.0", 1311 | "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-6.1.0.tgz", 1312 | "integrity": "sha512-IlC+LG2HGv0Y8js3wqdhg9O2sO4iVpRDbHOPwXd7qgeagpGsnY49i8yyazwqS35RA35WCzrBQE/n0M6GG/ewxA==", 1313 | "requires": { 1314 | "ccount": "^1.0.0", 1315 | "comma-separated-tokens": "^1.0.1", 1316 | "hast-util-is-element": "^1.0.0", 1317 | "hast-util-whitespace": "^1.0.0", 1318 | "html-void-elements": "^1.0.0", 1319 | "property-information": "^5.2.0", 1320 | "space-separated-tokens": "^1.0.0", 1321 | "stringify-entities": "^2.0.0", 1322 | "unist-util-is": "^3.0.0", 1323 | "xtend": "^4.0.1" 1324 | } 1325 | }, 1326 | "hast-util-to-parse5": { 1327 | "version": "5.1.2", 1328 | "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-5.1.2.tgz", 1329 | "integrity": "sha512-ZgYLJu9lYknMfsBY0rBV4TJn2xiwF1fXFFjbP6EE7S0s5mS8LIKBVWzhA1MeIs1SWW6GnnE4In6c3kPb+CWhog==", 1330 | "requires": { 1331 | "hast-to-hyperscript": "^7.0.0", 1332 | "property-information": "^5.0.0", 1333 | "web-namespaces": "^1.0.0", 1334 | "xtend": "^4.0.0", 1335 | "zwitch": "^1.0.0" 1336 | } 1337 | }, 1338 | "hast-util-to-string": { 1339 | "version": "1.0.4", 1340 | "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", 1341 | "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==" 1342 | }, 1343 | "hast-util-to-text": { 1344 | "version": "1.0.1", 1345 | "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-1.0.1.tgz", 1346 | "integrity": "sha512-Xvp9fWiWVb4WaHc1E1g6dtyYlcVwyjRT0CC9oXtVUNhbmIB1gqRVBuBIFJgrFkYxdo+T3UIl5i5ipPGaPRnUOw==", 1347 | "requires": { 1348 | "hast-util-is-element": "^1.0.2", 1349 | "repeat-string": "^1.6.1", 1350 | "unist-util-find-after": "^2.0.3" 1351 | } 1352 | }, 1353 | "hast-util-whitespace": { 1354 | "version": "1.0.4", 1355 | "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", 1356 | "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==" 1357 | }, 1358 | "hastscript": { 1359 | "version": "5.1.2", 1360 | "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", 1361 | "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", 1362 | "requires": { 1363 | "comma-separated-tokens": "^1.0.0", 1364 | "hast-util-parse-selector": "^2.0.0", 1365 | "property-information": "^5.0.0", 1366 | "space-separated-tokens": "^1.0.0" 1367 | } 1368 | }, 1369 | "highlight.js": { 1370 | "version": "10.2.0", 1371 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.2.0.tgz", 1372 | "integrity": "sha512-OryzPiqqNCfO/wtFo619W+nPYALM6u7iCQkum4bqRmmlcTikOkmlL06i009QelynBPAlNByTQU6cBB2cOBQtCw==" 1373 | }, 1374 | "highlightjs-graphql": { 1375 | "version": "1.0.2", 1376 | "resolved": "https://registry.npmjs.org/highlightjs-graphql/-/highlightjs-graphql-1.0.2.tgz", 1377 | "integrity": "sha512-jShTftpKQDwMXc+7OHOpHXRYSweT08EO2YOIcLbwU00e9yuwJMYXGLF1eiDO0aUPeQU4/5EjAh5HtPt3ly7rvg==" 1378 | }, 1379 | "html-encoding-sniffer": { 1380 | "version": "2.0.1", 1381 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", 1382 | "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", 1383 | "requires": { 1384 | "whatwg-encoding": "^1.0.5" 1385 | } 1386 | }, 1387 | "html-void-elements": { 1388 | "version": "1.0.5", 1389 | "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", 1390 | "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" 1391 | }, 1392 | "http-assert": { 1393 | "version": "1.4.1", 1394 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", 1395 | "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", 1396 | "requires": { 1397 | "deep-equal": "~1.0.1", 1398 | "http-errors": "~1.7.2" 1399 | }, 1400 | "dependencies": { 1401 | "http-errors": { 1402 | "version": "1.7.3", 1403 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 1404 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 1405 | "requires": { 1406 | "depd": "~1.1.2", 1407 | "inherits": "2.0.4", 1408 | "setprototypeof": "1.1.1", 1409 | "statuses": ">= 1.5.0 < 2", 1410 | "toidentifier": "1.0.0" 1411 | } 1412 | } 1413 | } 1414 | }, 1415 | "http-errors": { 1416 | "version": "1.8.0", 1417 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", 1418 | "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", 1419 | "requires": { 1420 | "depd": "~1.1.2", 1421 | "inherits": "2.0.4", 1422 | "setprototypeof": "1.2.0", 1423 | "statuses": ">= 1.5.0 < 2", 1424 | "toidentifier": "1.0.0" 1425 | }, 1426 | "dependencies": { 1427 | "setprototypeof": { 1428 | "version": "1.2.0", 1429 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1430 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1431 | } 1432 | } 1433 | }, 1434 | "http-signature": { 1435 | "version": "1.2.0", 1436 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1437 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1438 | "requires": { 1439 | "assert-plus": "^1.0.0", 1440 | "jsprim": "^1.2.2", 1441 | "sshpk": "^1.7.0" 1442 | } 1443 | }, 1444 | "hubdown": { 1445 | "version": "2.6.0", 1446 | "resolved": "https://registry.npmjs.org/hubdown/-/hubdown-2.6.0.tgz", 1447 | "integrity": "sha512-gqC4TfGK/gEuAElYRZh4HUEz+TCM4BZ6NQZkNOvWurhQu+PwaF6PVPPTb9DN1h1DUn/kEsFL37XsUJPnJWae+Q==", 1448 | "requires": { 1449 | "gray-matter": "^3.0.7", 1450 | "hasha": "^3.0.0", 1451 | "highlightjs-graphql": "^1.0.1", 1452 | "json-stable-stringify": "^1.0.1", 1453 | "rehype-autolink-headings": "^2.0.5", 1454 | "rehype-highlight": "^3.0.0", 1455 | "rehype-raw": "^4.0.1", 1456 | "rehype-slug": "^2.0.3", 1457 | "rehype-stringify": "^6.0.0", 1458 | "remark-gemoji-to-emoji": "^1.1.0", 1459 | "remark-parse": "^7.0.0", 1460 | "remark-rehype": "^5.0.0", 1461 | "unified": "^8.3.2" 1462 | } 1463 | }, 1464 | "iconv-lite": { 1465 | "version": "0.4.24", 1466 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1467 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1468 | "requires": { 1469 | "safer-buffer": ">= 2.1.2 < 3" 1470 | } 1471 | }, 1472 | "ieee754": { 1473 | "version": "1.1.13", 1474 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1475 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 1476 | }, 1477 | "indent-string": { 1478 | "version": "4.0.0", 1479 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1480 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" 1481 | }, 1482 | "inflation": { 1483 | "version": "2.0.0", 1484 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", 1485 | "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" 1486 | }, 1487 | "inherits": { 1488 | "version": "2.0.4", 1489 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1490 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1491 | }, 1492 | "ini": { 1493 | "version": "1.3.5", 1494 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1495 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 1496 | }, 1497 | "inline-style-parser": { 1498 | "version": "0.1.1", 1499 | "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", 1500 | "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" 1501 | }, 1502 | "ip-regex": { 1503 | "version": "2.1.0", 1504 | "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", 1505 | "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" 1506 | }, 1507 | "is-alphabetical": { 1508 | "version": "1.0.4", 1509 | "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", 1510 | "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" 1511 | }, 1512 | "is-alphanumerical": { 1513 | "version": "1.0.4", 1514 | "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", 1515 | "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", 1516 | "requires": { 1517 | "is-alphabetical": "^1.0.0", 1518 | "is-decimal": "^1.0.0" 1519 | } 1520 | }, 1521 | "is-buffer": { 1522 | "version": "2.0.4", 1523 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 1524 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" 1525 | }, 1526 | "is-decimal": { 1527 | "version": "1.0.4", 1528 | "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", 1529 | "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" 1530 | }, 1531 | "is-extendable": { 1532 | "version": "0.1.1", 1533 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1534 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1535 | }, 1536 | "is-fullwidth-code-point": { 1537 | "version": "1.0.0", 1538 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1539 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1540 | "requires": { 1541 | "number-is-nan": "^1.0.0" 1542 | } 1543 | }, 1544 | "is-gen-fn": { 1545 | "version": "0.0.1", 1546 | "resolved": "https://registry.npmjs.org/is-gen-fn/-/is-gen-fn-0.0.1.tgz", 1547 | "integrity": "sha1-8na/KgCDVxq9Aa3UfNTaEFpkzhM=" 1548 | }, 1549 | "is-generator-function": { 1550 | "version": "1.0.7", 1551 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", 1552 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" 1553 | }, 1554 | "is-hexadecimal": { 1555 | "version": "1.0.4", 1556 | "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", 1557 | "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" 1558 | }, 1559 | "is-plain-obj": { 1560 | "version": "2.1.0", 1561 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1562 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" 1563 | }, 1564 | "is-potential-custom-element-name": { 1565 | "version": "1.0.0", 1566 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", 1567 | "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" 1568 | }, 1569 | "is-stream": { 1570 | "version": "1.1.0", 1571 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1572 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1573 | }, 1574 | "is-typedarray": { 1575 | "version": "1.0.0", 1576 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1577 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1578 | }, 1579 | "is-whitespace-character": { 1580 | "version": "1.0.4", 1581 | "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", 1582 | "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" 1583 | }, 1584 | "is-word-character": { 1585 | "version": "1.0.4", 1586 | "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", 1587 | "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" 1588 | }, 1589 | "isarray": { 1590 | "version": "0.0.1", 1591 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1592 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1593 | }, 1594 | "isstream": { 1595 | "version": "0.1.2", 1596 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1597 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1598 | }, 1599 | "js-yaml": { 1600 | "version": "3.14.0", 1601 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 1602 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 1603 | "requires": { 1604 | "argparse": "^1.0.7", 1605 | "esprima": "^4.0.0" 1606 | } 1607 | }, 1608 | "jsbn": { 1609 | "version": "0.1.1", 1610 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1611 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1612 | }, 1613 | "jsdom": { 1614 | "version": "16.4.0", 1615 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", 1616 | "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", 1617 | "requires": { 1618 | "abab": "^2.0.3", 1619 | "acorn": "^7.1.1", 1620 | "acorn-globals": "^6.0.0", 1621 | "cssom": "^0.4.4", 1622 | "cssstyle": "^2.2.0", 1623 | "data-urls": "^2.0.0", 1624 | "decimal.js": "^10.2.0", 1625 | "domexception": "^2.0.1", 1626 | "escodegen": "^1.14.1", 1627 | "html-encoding-sniffer": "^2.0.1", 1628 | "is-potential-custom-element-name": "^1.0.0", 1629 | "nwsapi": "^2.2.0", 1630 | "parse5": "5.1.1", 1631 | "request": "^2.88.2", 1632 | "request-promise-native": "^1.0.8", 1633 | "saxes": "^5.0.0", 1634 | "symbol-tree": "^3.2.4", 1635 | "tough-cookie": "^3.0.1", 1636 | "w3c-hr-time": "^1.0.2", 1637 | "w3c-xmlserializer": "^2.0.0", 1638 | "webidl-conversions": "^6.1.0", 1639 | "whatwg-encoding": "^1.0.5", 1640 | "whatwg-mimetype": "^2.3.0", 1641 | "whatwg-url": "^8.0.0", 1642 | "ws": "^7.2.3", 1643 | "xml-name-validator": "^3.0.0" 1644 | } 1645 | }, 1646 | "json-schema": { 1647 | "version": "0.2.3", 1648 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1649 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1650 | }, 1651 | "json-schema-traverse": { 1652 | "version": "0.4.1", 1653 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1654 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1655 | }, 1656 | "json-stable-stringify": { 1657 | "version": "1.0.1", 1658 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1659 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1660 | "requires": { 1661 | "jsonify": "~0.0.0" 1662 | } 1663 | }, 1664 | "json-stringify-safe": { 1665 | "version": "5.0.1", 1666 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1667 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1668 | }, 1669 | "jsonify": { 1670 | "version": "0.0.0", 1671 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1672 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 1673 | }, 1674 | "jsonwebtoken": { 1675 | "version": "8.5.1", 1676 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 1677 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 1678 | "requires": { 1679 | "jws": "^3.2.2", 1680 | "lodash.includes": "^4.3.0", 1681 | "lodash.isboolean": "^3.0.3", 1682 | "lodash.isinteger": "^4.0.4", 1683 | "lodash.isnumber": "^3.0.3", 1684 | "lodash.isplainobject": "^4.0.6", 1685 | "lodash.isstring": "^4.0.1", 1686 | "lodash.once": "^4.0.0", 1687 | "ms": "^2.1.1", 1688 | "semver": "^5.6.0" 1689 | } 1690 | }, 1691 | "jsprim": { 1692 | "version": "1.4.1", 1693 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1694 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1695 | "requires": { 1696 | "assert-plus": "1.0.0", 1697 | "extsprintf": "1.3.0", 1698 | "json-schema": "0.2.3", 1699 | "verror": "1.10.0" 1700 | } 1701 | }, 1702 | "jwa": { 1703 | "version": "1.4.1", 1704 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1705 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1706 | "requires": { 1707 | "buffer-equal-constant-time": "1.0.1", 1708 | "ecdsa-sig-formatter": "1.0.11", 1709 | "safe-buffer": "^5.0.1" 1710 | } 1711 | }, 1712 | "jws": { 1713 | "version": "3.2.2", 1714 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1715 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1716 | "requires": { 1717 | "jwa": "^1.4.1", 1718 | "safe-buffer": "^5.0.1" 1719 | } 1720 | }, 1721 | "keygrip": { 1722 | "version": "1.1.0", 1723 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", 1724 | "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", 1725 | "requires": { 1726 | "tsscmp": "1.0.6" 1727 | } 1728 | }, 1729 | "kind-of": { 1730 | "version": "5.1.0", 1731 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1732 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 1733 | }, 1734 | "koa": { 1735 | "version": "2.13.0", 1736 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.0.tgz", 1737 | "integrity": "sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ==", 1738 | "requires": { 1739 | "accepts": "^1.3.5", 1740 | "cache-content-type": "^1.0.0", 1741 | "content-disposition": "~0.5.2", 1742 | "content-type": "^1.0.4", 1743 | "cookies": "~0.8.0", 1744 | "debug": "~3.1.0", 1745 | "delegates": "^1.0.0", 1746 | "depd": "^1.1.2", 1747 | "destroy": "^1.0.4", 1748 | "encodeurl": "^1.0.2", 1749 | "escape-html": "^1.0.3", 1750 | "fresh": "~0.5.2", 1751 | "http-assert": "^1.3.0", 1752 | "http-errors": "^1.6.3", 1753 | "is-generator-function": "^1.0.7", 1754 | "koa-compose": "^4.1.0", 1755 | "koa-convert": "^1.2.0", 1756 | "on-finished": "^2.3.0", 1757 | "only": "~0.0.2", 1758 | "parseurl": "^1.3.2", 1759 | "statuses": "^1.5.0", 1760 | "type-is": "^1.6.16", 1761 | "vary": "^1.1.2" 1762 | }, 1763 | "dependencies": { 1764 | "debug": { 1765 | "version": "3.1.0", 1766 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1767 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1768 | "requires": { 1769 | "ms": "2.0.0" 1770 | } 1771 | }, 1772 | "ms": { 1773 | "version": "2.0.0", 1774 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1775 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1776 | } 1777 | } 1778 | }, 1779 | "koa-bodyparser": { 1780 | "version": "4.3.0", 1781 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", 1782 | "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", 1783 | "requires": { 1784 | "co-body": "^6.0.0", 1785 | "copy-to": "^2.0.1" 1786 | } 1787 | }, 1788 | "koa-compose": { 1789 | "version": "4.1.0", 1790 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 1791 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 1792 | }, 1793 | "koa-convert": { 1794 | "version": "1.2.0", 1795 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", 1796 | "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", 1797 | "requires": { 1798 | "co": "^4.6.0", 1799 | "koa-compose": "^3.0.0" 1800 | }, 1801 | "dependencies": { 1802 | "koa-compose": { 1803 | "version": "3.2.1", 1804 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", 1805 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 1806 | "requires": { 1807 | "any-promise": "^1.1.0" 1808 | } 1809 | } 1810 | } 1811 | }, 1812 | "koa-ejs": { 1813 | "version": "4.3.0", 1814 | "resolved": "https://registry.npmjs.org/koa-ejs/-/koa-ejs-4.3.0.tgz", 1815 | "integrity": "sha512-KK1B1YEeq8TOt7hrHwohfHxH03ZqsdhQWeFjmvcWk3arVI/uQOyE4FHQVlg0Ud9eXxlgUfkYqA2MJhfK4ADkAw==", 1816 | "requires": { 1817 | "debug": "^2.6.1", 1818 | "ejs": "^2.6.1", 1819 | "mz": "^2.6.0" 1820 | }, 1821 | "dependencies": { 1822 | "debug": { 1823 | "version": "2.6.9", 1824 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1825 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1826 | "requires": { 1827 | "ms": "2.0.0" 1828 | } 1829 | }, 1830 | "ms": { 1831 | "version": "2.0.0", 1832 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1833 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1834 | } 1835 | } 1836 | }, 1837 | "koa-joi-router": { 1838 | "version": "6.0.2", 1839 | "resolved": "https://registry.npmjs.org/koa-joi-router/-/koa-joi-router-6.0.2.tgz", 1840 | "integrity": "sha512-XgHC7veI10SZP24ZO1fnAEfC2l1BVTyykGUfAR2b2Bn+mFfAmNxmyZWe07O9pt8uKzw+MW1O0tgCoKlEz79Flw==", 1841 | "requires": { 1842 | "@hapi/joi": "15.1.1", 1843 | "@koa/router": "8.0.2", 1844 | "await-busboy": "1.0.3", 1845 | "clone": "2.1.2", 1846 | "co-body": "6.0.0", 1847 | "debug": "4.1.1", 1848 | "delegates": "1.0.0", 1849 | "flatten": "1.0.3", 1850 | "is-gen-fn": "0.0.1", 1851 | "methods": "1.1.2", 1852 | "sliced": "1.0.1" 1853 | } 1854 | }, 1855 | "koa-jwt": { 1856 | "version": "4.0.0", 1857 | "resolved": "https://registry.npmjs.org/koa-jwt/-/koa-jwt-4.0.0.tgz", 1858 | "integrity": "sha512-n56AG98tWQDtvVZwtVFKuPn1pGPOvtkKFEotSPRsdqKmZJqRdppDRD0toiiK7kefMLnVBzFbocaPyaI5WK/iyQ==", 1859 | "requires": { 1860 | "jsonwebtoken": "^8.5.1", 1861 | "koa-unless": "^1.0.7", 1862 | "p-any": "^2.1.0" 1863 | } 1864 | }, 1865 | "koa-unless": { 1866 | "version": "1.0.7", 1867 | "resolved": "https://registry.npmjs.org/koa-unless/-/koa-unless-1.0.7.tgz", 1868 | "integrity": "sha1-ud83XitNowQ5GNSGIlIMLAt58DI=" 1869 | }, 1870 | "levn": { 1871 | "version": "0.3.0", 1872 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1873 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1874 | "requires": { 1875 | "prelude-ls": "~1.1.2", 1876 | "type-check": "~0.3.2" 1877 | } 1878 | }, 1879 | "locate-path": { 1880 | "version": "3.0.0", 1881 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1882 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1883 | "requires": { 1884 | "p-locate": "^3.0.0", 1885 | "path-exists": "^3.0.0" 1886 | } 1887 | }, 1888 | "lodash": { 1889 | "version": "4.17.20", 1890 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1891 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 1892 | }, 1893 | "lodash.includes": { 1894 | "version": "4.3.0", 1895 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1896 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1897 | }, 1898 | "lodash.isboolean": { 1899 | "version": "3.0.3", 1900 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1901 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1902 | }, 1903 | "lodash.isinteger": { 1904 | "version": "4.0.4", 1905 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1906 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1907 | }, 1908 | "lodash.isnumber": { 1909 | "version": "3.0.3", 1910 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1911 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1912 | }, 1913 | "lodash.isplainobject": { 1914 | "version": "4.0.6", 1915 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1916 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1917 | }, 1918 | "lodash.isstring": { 1919 | "version": "4.0.1", 1920 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1921 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1922 | }, 1923 | "lodash.once": { 1924 | "version": "4.1.1", 1925 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1926 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1927 | }, 1928 | "lodash.sortby": { 1929 | "version": "4.7.0", 1930 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1931 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1932 | }, 1933 | "lowlight": { 1934 | "version": "1.15.0", 1935 | "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.15.0.tgz", 1936 | "integrity": "sha512-GhG/R+2zt5Wg8kCfOhapH8wDdJSHSIvdDW/DOPXCeResVqgHYLnOHBp6g9DoUIPVIyBpvQYCG4SV7XeelYFpyA==", 1937 | "requires": { 1938 | "fault": "^1.0.0", 1939 | "highlight.js": "~10.2.0" 1940 | } 1941 | }, 1942 | "make-error": { 1943 | "version": "1.3.6", 1944 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1945 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" 1946 | }, 1947 | "make-error-cause": { 1948 | "version": "2.3.0", 1949 | "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-2.3.0.tgz", 1950 | "integrity": "sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==", 1951 | "requires": { 1952 | "make-error": "^1.3.5" 1953 | } 1954 | }, 1955 | "markdown-escapes": { 1956 | "version": "1.0.4", 1957 | "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", 1958 | "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" 1959 | }, 1960 | "mdast-util-definitions": { 1961 | "version": "1.2.5", 1962 | "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", 1963 | "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", 1964 | "requires": { 1965 | "unist-util-visit": "^1.0.0" 1966 | } 1967 | }, 1968 | "mdast-util-to-hast": { 1969 | "version": "6.0.2", 1970 | "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-6.0.2.tgz", 1971 | "integrity": "sha512-GjcOimC9qHI0yNFAQdBesrZXzUkRdFleQlcoU8+TVNfDW6oLUazUx8MgUoTaUyCJzBOnE5AOgqhpURrSlf0QwQ==", 1972 | "requires": { 1973 | "collapse-white-space": "^1.0.0", 1974 | "detab": "^2.0.0", 1975 | "mdast-util-definitions": "^1.2.0", 1976 | "mdurl": "^1.0.1", 1977 | "trim": "0.0.1", 1978 | "trim-lines": "^1.0.0", 1979 | "unist-builder": "^1.0.1", 1980 | "unist-util-generated": "^1.1.0", 1981 | "unist-util-position": "^3.0.0", 1982 | "unist-util-visit": "^1.1.0", 1983 | "xtend": "^4.0.1" 1984 | } 1985 | }, 1986 | "mdurl": { 1987 | "version": "1.0.1", 1988 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 1989 | "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" 1990 | }, 1991 | "media-typer": { 1992 | "version": "0.3.0", 1993 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1994 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1995 | }, 1996 | "methods": { 1997 | "version": "1.1.2", 1998 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1999 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2000 | }, 2001 | "mime-db": { 2002 | "version": "1.44.0", 2003 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 2004 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 2005 | }, 2006 | "mime-types": { 2007 | "version": "2.1.27", 2008 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 2009 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 2010 | "requires": { 2011 | "mime-db": "1.44.0" 2012 | } 2013 | }, 2014 | "mimic-response": { 2015 | "version": "2.1.0", 2016 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 2017 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 2018 | }, 2019 | "minimist": { 2020 | "version": "1.2.5", 2021 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2022 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 2023 | }, 2024 | "minipass": { 2025 | "version": "2.9.0", 2026 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 2027 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 2028 | "requires": { 2029 | "safe-buffer": "^5.1.2", 2030 | "yallist": "^3.0.0" 2031 | } 2032 | }, 2033 | "minizlib": { 2034 | "version": "1.3.3", 2035 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 2036 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 2037 | "requires": { 2038 | "minipass": "^2.9.0" 2039 | } 2040 | }, 2041 | "mkdirp": { 2042 | "version": "0.5.5", 2043 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 2044 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 2045 | "requires": { 2046 | "minimist": "^1.2.5" 2047 | } 2048 | }, 2049 | "mkdirp-classic": { 2050 | "version": "0.5.3", 2051 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 2052 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 2053 | }, 2054 | "ms": { 2055 | "version": "2.1.2", 2056 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2057 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2058 | }, 2059 | "mz": { 2060 | "version": "2.7.0", 2061 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 2062 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 2063 | "requires": { 2064 | "any-promise": "^1.0.0", 2065 | "object-assign": "^4.0.1", 2066 | "thenify-all": "^1.0.0" 2067 | } 2068 | }, 2069 | "napi-build-utils": { 2070 | "version": "1.0.2", 2071 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 2072 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 2073 | }, 2074 | "negotiator": { 2075 | "version": "0.6.2", 2076 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 2077 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 2078 | }, 2079 | "node-abi": { 2080 | "version": "2.19.1", 2081 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz", 2082 | "integrity": "sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A==", 2083 | "requires": { 2084 | "semver": "^5.4.1" 2085 | } 2086 | }, 2087 | "node-fetch": { 2088 | "version": "2.6.1", 2089 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 2090 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 2091 | }, 2092 | "noop-logger": { 2093 | "version": "0.1.1", 2094 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 2095 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 2096 | }, 2097 | "npmlog": { 2098 | "version": "4.1.2", 2099 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 2100 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 2101 | "requires": { 2102 | "are-we-there-yet": "~1.1.2", 2103 | "console-control-strings": "~1.1.0", 2104 | "gauge": "~2.7.3", 2105 | "set-blocking": "~2.0.0" 2106 | } 2107 | }, 2108 | "number-is-nan": { 2109 | "version": "1.0.1", 2110 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2111 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2112 | }, 2113 | "nwsapi": { 2114 | "version": "2.2.0", 2115 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", 2116 | "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" 2117 | }, 2118 | "oauth-sign": { 2119 | "version": "0.9.0", 2120 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2121 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 2122 | }, 2123 | "object-assign": { 2124 | "version": "4.1.1", 2125 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2126 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2127 | }, 2128 | "on-finished": { 2129 | "version": "2.3.0", 2130 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2131 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2132 | "requires": { 2133 | "ee-first": "1.1.1" 2134 | } 2135 | }, 2136 | "once": { 2137 | "version": "1.4.0", 2138 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2139 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2140 | "requires": { 2141 | "wrappy": "1" 2142 | } 2143 | }, 2144 | "only": { 2145 | "version": "0.0.2", 2146 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 2147 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" 2148 | }, 2149 | "optionator": { 2150 | "version": "0.8.3", 2151 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 2152 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 2153 | "requires": { 2154 | "deep-is": "~0.1.3", 2155 | "fast-levenshtein": "~2.0.6", 2156 | "levn": "~0.3.0", 2157 | "prelude-ls": "~1.1.2", 2158 | "type-check": "~0.3.2", 2159 | "word-wrap": "~1.2.3" 2160 | } 2161 | }, 2162 | "p-any": { 2163 | "version": "2.1.0", 2164 | "resolved": "https://registry.npmjs.org/p-any/-/p-any-2.1.0.tgz", 2165 | "integrity": "sha512-JAERcaMBLYKMq+voYw36+x5Dgh47+/o7yuv2oQYuSSUml4YeqJEFznBrY2UeEkoSHqBua6hz518n/PsowTYLLg==", 2166 | "requires": { 2167 | "p-cancelable": "^2.0.0", 2168 | "p-some": "^4.0.0", 2169 | "type-fest": "^0.3.0" 2170 | } 2171 | }, 2172 | "p-cancelable": { 2173 | "version": "2.0.0", 2174 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", 2175 | "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" 2176 | }, 2177 | "p-limit": { 2178 | "version": "2.3.0", 2179 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2180 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2181 | "requires": { 2182 | "p-try": "^2.0.0" 2183 | } 2184 | }, 2185 | "p-locate": { 2186 | "version": "3.0.0", 2187 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 2188 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 2189 | "requires": { 2190 | "p-limit": "^2.0.0" 2191 | } 2192 | }, 2193 | "p-some": { 2194 | "version": "4.1.0", 2195 | "resolved": "https://registry.npmjs.org/p-some/-/p-some-4.1.0.tgz", 2196 | "integrity": "sha512-MF/HIbq6GeBqTrTIl5OJubzkGU+qfFhAFi0gnTAK6rgEIJIknEiABHOTtQu4e6JiXjIwuMPMUFQzyHh5QjCl1g==", 2197 | "requires": { 2198 | "aggregate-error": "^3.0.0", 2199 | "p-cancelable": "^2.0.0" 2200 | } 2201 | }, 2202 | "p-try": { 2203 | "version": "2.2.0", 2204 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2205 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 2206 | }, 2207 | "parse-entities": { 2208 | "version": "1.2.2", 2209 | "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", 2210 | "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", 2211 | "requires": { 2212 | "character-entities": "^1.0.0", 2213 | "character-entities-legacy": "^1.0.0", 2214 | "character-reference-invalid": "^1.0.0", 2215 | "is-alphanumerical": "^1.0.0", 2216 | "is-decimal": "^1.0.0", 2217 | "is-hexadecimal": "^1.0.0" 2218 | } 2219 | }, 2220 | "parse5": { 2221 | "version": "5.1.1", 2222 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", 2223 | "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" 2224 | }, 2225 | "parseurl": { 2226 | "version": "1.3.3", 2227 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2228 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2229 | }, 2230 | "path-exists": { 2231 | "version": "3.0.0", 2232 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2233 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 2234 | }, 2235 | "path-to-regexp": { 2236 | "version": "1.8.0", 2237 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 2238 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 2239 | "requires": { 2240 | "isarray": "0.0.1" 2241 | } 2242 | }, 2243 | "performance-now": { 2244 | "version": "2.1.0", 2245 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2246 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2247 | }, 2248 | "pkg-up": { 2249 | "version": "3.1.0", 2250 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", 2251 | "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", 2252 | "requires": { 2253 | "find-up": "^3.0.0" 2254 | } 2255 | }, 2256 | "popsicle": { 2257 | "version": "12.0.6", 2258 | "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.0.6.tgz", 2259 | "integrity": "sha512-RWGZAJ50Dg4uKbGfcce3TSenUJEvbrostGbJ1/HLLblZGljCQs0ASAPfaqeG2slODCMDposeAZTbMT5rx0DUOQ==", 2260 | "requires": { 2261 | "popsicle-content-encoding": "^1.0.0", 2262 | "popsicle-cookie-jar": "^1.0.0", 2263 | "popsicle-redirects": "^1.1.0", 2264 | "popsicle-transport-http": "^1.0.8", 2265 | "popsicle-transport-xhr": "^1.0.2", 2266 | "popsicle-user-agent": "^1.0.0", 2267 | "servie": "^4.3.3", 2268 | "throwback": "^4.1.0", 2269 | "tough-cookie": "^3.0.1" 2270 | } 2271 | }, 2272 | "popsicle-content-encoding": { 2273 | "version": "1.0.0", 2274 | "resolved": "https://registry.npmjs.org/popsicle-content-encoding/-/popsicle-content-encoding-1.0.0.tgz", 2275 | "integrity": "sha512-4Df+vTfM8wCCJVTzPujiI6eOl3SiWQkcZg0AMrOkD1enMXsF3glIkFUZGvour1Sj7jOWCsNSEhBxpbbhclHhzw==" 2276 | }, 2277 | "popsicle-cookie-jar": { 2278 | "version": "1.0.0", 2279 | "resolved": "https://registry.npmjs.org/popsicle-cookie-jar/-/popsicle-cookie-jar-1.0.0.tgz", 2280 | "integrity": "sha512-vrlOGvNVELko0+J8NpGC5lHWDGrk8LQJq9nwAMIVEVBfN1Lib3BLxAaLRGDTuUnvl45j5N9dT2H85PULz6IjjQ==", 2281 | "requires": { 2282 | "@types/tough-cookie": "^2.3.5", 2283 | "tough-cookie": "^3.0.1" 2284 | } 2285 | }, 2286 | "popsicle-redirects": { 2287 | "version": "1.1.0", 2288 | "resolved": "https://registry.npmjs.org/popsicle-redirects/-/popsicle-redirects-1.1.0.tgz", 2289 | "integrity": "sha512-XCpzVjVk7tty+IJnSdqWevmOr1n8HNDhL86v7mZ6T1JIIf2KGybxUk9mm7ZFOhWMkGB0e8XkacHip7BV8AQWQA==" 2290 | }, 2291 | "popsicle-transport-http": { 2292 | "version": "1.0.9", 2293 | "resolved": "https://registry.npmjs.org/popsicle-transport-http/-/popsicle-transport-http-1.0.9.tgz", 2294 | "integrity": "sha512-55Os0JdCs35FI8cAsgMoKG6XXKR4Wh8qZIbL3rY5+IZqqjMIo3/3q3wSE98mUhHyLgjg9HQ6ep5wNfhbYCI7GQ==", 2295 | "requires": { 2296 | "make-error-cause": "^2.2.0", 2297 | "pump": "^3.0.0" 2298 | } 2299 | }, 2300 | "popsicle-transport-xhr": { 2301 | "version": "1.0.2", 2302 | "resolved": "https://registry.npmjs.org/popsicle-transport-xhr/-/popsicle-transport-xhr-1.0.2.tgz", 2303 | "integrity": "sha512-v9eAJnj1tydT4VmDdyKFE1z/+oL01vB7AS3LfSFMAYv33dzqlxtbApKALcYWBQotIqw3FoIqd2FiDR6qJsOxtA==" 2304 | }, 2305 | "popsicle-user-agent": { 2306 | "version": "1.0.0", 2307 | "resolved": "https://registry.npmjs.org/popsicle-user-agent/-/popsicle-user-agent-1.0.0.tgz", 2308 | "integrity": "sha512-epKaq3TTfTzXcxBxjpoKYMcTTcAX8Rykus6QZu77XNhJuRHSRxMd+JJrbX/3PFI0opFGSN0BabbAYCbGxbu0mA==" 2309 | }, 2310 | "prebuild-install": { 2311 | "version": "5.3.5", 2312 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.5.tgz", 2313 | "integrity": "sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==", 2314 | "requires": { 2315 | "detect-libc": "^1.0.3", 2316 | "expand-template": "^2.0.3", 2317 | "github-from-package": "0.0.0", 2318 | "minimist": "^1.2.3", 2319 | "mkdirp": "^0.5.1", 2320 | "napi-build-utils": "^1.0.1", 2321 | "node-abi": "^2.7.0", 2322 | "noop-logger": "^0.1.1", 2323 | "npmlog": "^4.0.1", 2324 | "pump": "^3.0.0", 2325 | "rc": "^1.2.7", 2326 | "simple-get": "^3.0.3", 2327 | "tar-fs": "^2.0.0", 2328 | "tunnel-agent": "^0.6.0", 2329 | "which-pm-runs": "^1.0.0" 2330 | } 2331 | }, 2332 | "prelude-ls": { 2333 | "version": "1.1.2", 2334 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2335 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 2336 | }, 2337 | "prism-media": { 2338 | "version": "1.2.2", 2339 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", 2340 | "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" 2341 | }, 2342 | "process-nextick-args": { 2343 | "version": "2.0.1", 2344 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2345 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2346 | }, 2347 | "property-information": { 2348 | "version": "5.5.0", 2349 | "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", 2350 | "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", 2351 | "requires": { 2352 | "xtend": "^4.0.0" 2353 | } 2354 | }, 2355 | "psl": { 2356 | "version": "1.8.0", 2357 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 2358 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 2359 | }, 2360 | "pump": { 2361 | "version": "3.0.0", 2362 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2363 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2364 | "requires": { 2365 | "end-of-stream": "^1.1.0", 2366 | "once": "^1.3.1" 2367 | } 2368 | }, 2369 | "punycode": { 2370 | "version": "2.1.1", 2371 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2372 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 2373 | }, 2374 | "qs": { 2375 | "version": "6.9.4", 2376 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", 2377 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" 2378 | }, 2379 | "raw-body": { 2380 | "version": "2.4.1", 2381 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", 2382 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", 2383 | "requires": { 2384 | "bytes": "3.1.0", 2385 | "http-errors": "1.7.3", 2386 | "iconv-lite": "0.4.24", 2387 | "unpipe": "1.0.0" 2388 | }, 2389 | "dependencies": { 2390 | "http-errors": { 2391 | "version": "1.7.3", 2392 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 2393 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 2394 | "requires": { 2395 | "depd": "~1.1.2", 2396 | "inherits": "2.0.4", 2397 | "setprototypeof": "1.1.1", 2398 | "statuses": ">= 1.5.0 < 2", 2399 | "toidentifier": "1.0.0" 2400 | } 2401 | } 2402 | } 2403 | }, 2404 | "rc": { 2405 | "version": "1.2.8", 2406 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2407 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2408 | "requires": { 2409 | "deep-extend": "^0.6.0", 2410 | "ini": "~1.3.0", 2411 | "minimist": "^1.2.0", 2412 | "strip-json-comments": "~2.0.1" 2413 | } 2414 | }, 2415 | "readable-stream": { 2416 | "version": "2.3.7", 2417 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2418 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2419 | "requires": { 2420 | "core-util-is": "~1.0.0", 2421 | "inherits": "~2.0.3", 2422 | "isarray": "~1.0.0", 2423 | "process-nextick-args": "~2.0.0", 2424 | "safe-buffer": "~5.1.1", 2425 | "string_decoder": "~1.1.1", 2426 | "util-deprecate": "~1.0.1" 2427 | }, 2428 | "dependencies": { 2429 | "isarray": { 2430 | "version": "1.0.0", 2431 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2432 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2433 | } 2434 | } 2435 | }, 2436 | "rehype-autolink-headings": { 2437 | "version": "2.0.5", 2438 | "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-2.0.5.tgz", 2439 | "integrity": "sha512-gxG72uj8wV2WnjlanTu5qxV5xqLkI3H1q8HSWbof7fHa12FuT+X3fGj275KwxgXESi8hJvHtZiDUwcZ9rjcHRg==", 2440 | "requires": { 2441 | "extend": "^3.0.1", 2442 | "hast-util-has-property": "^1.0.0", 2443 | "hast-util-is-element": "^1.0.0", 2444 | "unist-util-visit": "^1.1.0" 2445 | } 2446 | }, 2447 | "rehype-highlight": { 2448 | "version": "3.1.0", 2449 | "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-3.1.0.tgz", 2450 | "integrity": "sha512-5MzqLWUUMS4II+jWisOzF4mIgXJxt+QI3yvXLO/tTdzXuwYMGA7vRR3H60BiGOtlL30N/2267oefm+zdh8lePw==", 2451 | "requires": { 2452 | "hast-util-to-text": "^1.0.0", 2453 | "lowlight": "^1.10.0", 2454 | "unist-util-visit": "^1.1.0" 2455 | } 2456 | }, 2457 | "rehype-raw": { 2458 | "version": "4.0.2", 2459 | "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-4.0.2.tgz", 2460 | "integrity": "sha512-xQt94oXfDaO7sK9mJBtsZXkjW/jm6kArCoYN+HqKZ51O19AFHlp3Xa5UfZZ2tJkbpAZzKtgVUYvnconk9IsFuA==", 2461 | "requires": { 2462 | "hast-util-raw": "^5.0.0" 2463 | } 2464 | }, 2465 | "rehype-slug": { 2466 | "version": "2.0.3", 2467 | "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-2.0.3.tgz", 2468 | "integrity": "sha512-7hgS91klce+p/1CrgMjV/JKyVmEevTM3YMkFtxF29twydKBSYVcy2x44z74SgCnzANj8H8N0g0O8F1OH1/OXJA==", 2469 | "requires": { 2470 | "github-slugger": "^1.1.1", 2471 | "hast-util-has-property": "^1.0.0", 2472 | "hast-util-is-element": "^1.0.0", 2473 | "hast-util-to-string": "^1.0.0", 2474 | "unist-util-visit": "^1.1.0" 2475 | } 2476 | }, 2477 | "rehype-stringify": { 2478 | "version": "6.0.1", 2479 | "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-6.0.1.tgz", 2480 | "integrity": "sha512-JfEPRDD4DiG7jet4md7sY07v6ACeb2x+9HWQtRPm2iA6/ic31hCv1SNBUtpolJASxQ/D8gicXiviW4TJKEMPKQ==", 2481 | "requires": { 2482 | "hast-util-to-html": "^6.0.0", 2483 | "xtend": "^4.0.0" 2484 | } 2485 | }, 2486 | "remark-gemoji-to-emoji": { 2487 | "version": "1.1.0", 2488 | "resolved": "https://registry.npmjs.org/remark-gemoji-to-emoji/-/remark-gemoji-to-emoji-1.1.0.tgz", 2489 | "integrity": "sha1-Pc0KiBGgyBu2NROsCzbyJYpVMPU=", 2490 | "requires": { 2491 | "gemoji": "^4.0.0", 2492 | "unist-util-visit": "^1.0.0" 2493 | } 2494 | }, 2495 | "remark-parse": { 2496 | "version": "7.0.2", 2497 | "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz", 2498 | "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==", 2499 | "requires": { 2500 | "collapse-white-space": "^1.0.2", 2501 | "is-alphabetical": "^1.0.0", 2502 | "is-decimal": "^1.0.0", 2503 | "is-whitespace-character": "^1.0.0", 2504 | "is-word-character": "^1.0.0", 2505 | "markdown-escapes": "^1.0.0", 2506 | "parse-entities": "^1.1.0", 2507 | "repeat-string": "^1.5.4", 2508 | "state-toggle": "^1.0.0", 2509 | "trim": "0.0.1", 2510 | "trim-trailing-lines": "^1.0.0", 2511 | "unherit": "^1.0.4", 2512 | "unist-util-remove-position": "^1.0.0", 2513 | "vfile-location": "^2.0.0", 2514 | "xtend": "^4.0.1" 2515 | } 2516 | }, 2517 | "remark-rehype": { 2518 | "version": "5.0.0", 2519 | "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-5.0.0.tgz", 2520 | "integrity": "sha512-tgo+AeOotuh9FnGMkEPbE6C3OfdARqqSxT0H/KNGAiTwJLiDoRSm6x/ytqPZTyYSiQ/exbi/kx7k6uUvqYL1wQ==", 2521 | "requires": { 2522 | "mdast-util-to-hast": "^6.0.0" 2523 | } 2524 | }, 2525 | "repeat-string": { 2526 | "version": "1.6.1", 2527 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2528 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 2529 | }, 2530 | "replace-ext": { 2531 | "version": "1.0.0", 2532 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", 2533 | "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" 2534 | }, 2535 | "request": { 2536 | "version": "2.88.2", 2537 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 2538 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 2539 | "requires": { 2540 | "aws-sign2": "~0.7.0", 2541 | "aws4": "^1.8.0", 2542 | "caseless": "~0.12.0", 2543 | "combined-stream": "~1.0.6", 2544 | "extend": "~3.0.2", 2545 | "forever-agent": "~0.6.1", 2546 | "form-data": "~2.3.2", 2547 | "har-validator": "~5.1.3", 2548 | "http-signature": "~1.2.0", 2549 | "is-typedarray": "~1.0.0", 2550 | "isstream": "~0.1.2", 2551 | "json-stringify-safe": "~5.0.1", 2552 | "mime-types": "~2.1.19", 2553 | "oauth-sign": "~0.9.0", 2554 | "performance-now": "^2.1.0", 2555 | "qs": "~6.5.2", 2556 | "safe-buffer": "^5.1.2", 2557 | "tough-cookie": "~2.5.0", 2558 | "tunnel-agent": "^0.6.0", 2559 | "uuid": "^3.3.2" 2560 | }, 2561 | "dependencies": { 2562 | "qs": { 2563 | "version": "6.5.2", 2564 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2565 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2566 | }, 2567 | "tough-cookie": { 2568 | "version": "2.5.0", 2569 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 2570 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 2571 | "requires": { 2572 | "psl": "^1.1.28", 2573 | "punycode": "^2.1.1" 2574 | } 2575 | }, 2576 | "uuid": { 2577 | "version": "3.4.0", 2578 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 2579 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 2580 | } 2581 | } 2582 | }, 2583 | "request-promise-core": { 2584 | "version": "1.1.4", 2585 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", 2586 | "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", 2587 | "requires": { 2588 | "lodash": "^4.17.19" 2589 | } 2590 | }, 2591 | "request-promise-native": { 2592 | "version": "1.0.9", 2593 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", 2594 | "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", 2595 | "requires": { 2596 | "request-promise-core": "1.1.4", 2597 | "stealthy-require": "^1.1.1", 2598 | "tough-cookie": "^2.3.3" 2599 | }, 2600 | "dependencies": { 2601 | "tough-cookie": { 2602 | "version": "2.5.0", 2603 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 2604 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 2605 | "requires": { 2606 | "psl": "^1.1.28", 2607 | "punycode": "^2.1.1" 2608 | } 2609 | } 2610 | } 2611 | }, 2612 | "require-all": { 2613 | "version": "3.0.0", 2614 | "resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz", 2615 | "integrity": "sha1-Rz1JcEvjEBFc4ST3c4Ox69hnExI=" 2616 | }, 2617 | "safe-buffer": { 2618 | "version": "5.1.2", 2619 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2620 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2621 | }, 2622 | "safer-buffer": { 2623 | "version": "2.1.2", 2624 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2625 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2626 | }, 2627 | "saxes": { 2628 | "version": "5.0.1", 2629 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", 2630 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", 2631 | "requires": { 2632 | "xmlchars": "^2.2.0" 2633 | } 2634 | }, 2635 | "semver": { 2636 | "version": "5.7.1", 2637 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2638 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 2639 | }, 2640 | "servie": { 2641 | "version": "4.3.3", 2642 | "resolved": "https://registry.npmjs.org/servie/-/servie-4.3.3.tgz", 2643 | "integrity": "sha512-b0IrY3b1gVMsWvJppCf19g1p3JSnS0hQi6xu4Hi40CIhf0Lx8pQHcvBL+xunShpmOiQzg1NOia812NAWdSaShw==", 2644 | "requires": { 2645 | "@servie/events": "^1.0.0", 2646 | "byte-length": "^1.0.2", 2647 | "ts-expect": "^1.1.0" 2648 | } 2649 | }, 2650 | "set-blocking": { 2651 | "version": "2.0.0", 2652 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2653 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 2654 | }, 2655 | "setimmediate": { 2656 | "version": "1.0.5", 2657 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2658 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 2659 | }, 2660 | "setprototypeof": { 2661 | "version": "1.1.1", 2662 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 2663 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 2664 | }, 2665 | "signal-exit": { 2666 | "version": "3.0.3", 2667 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2668 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 2669 | }, 2670 | "simple-concat": { 2671 | "version": "1.0.1", 2672 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 2673 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 2674 | }, 2675 | "simple-get": { 2676 | "version": "3.1.0", 2677 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 2678 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 2679 | "requires": { 2680 | "decompress-response": "^4.2.0", 2681 | "once": "^1.3.1", 2682 | "simple-concat": "^1.0.0" 2683 | } 2684 | }, 2685 | "sliced": { 2686 | "version": "1.0.1", 2687 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 2688 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 2689 | }, 2690 | "source-map": { 2691 | "version": "0.6.1", 2692 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2693 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 2694 | }, 2695 | "source-map-support": { 2696 | "version": "0.5.19", 2697 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 2698 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 2699 | "dev": true, 2700 | "requires": { 2701 | "buffer-from": "^1.0.0", 2702 | "source-map": "^0.6.0" 2703 | } 2704 | }, 2705 | "space-separated-tokens": { 2706 | "version": "1.1.5", 2707 | "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", 2708 | "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" 2709 | }, 2710 | "sprintf-js": { 2711 | "version": "1.0.3", 2712 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2713 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 2714 | }, 2715 | "sshpk": { 2716 | "version": "1.16.1", 2717 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 2718 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 2719 | "requires": { 2720 | "asn1": "~0.2.3", 2721 | "assert-plus": "^1.0.0", 2722 | "bcrypt-pbkdf": "^1.0.0", 2723 | "dashdash": "^1.12.0", 2724 | "ecc-jsbn": "~0.1.1", 2725 | "getpass": "^0.1.1", 2726 | "jsbn": "~0.1.0", 2727 | "safer-buffer": "^2.0.2", 2728 | "tweetnacl": "~0.14.0" 2729 | }, 2730 | "dependencies": { 2731 | "tweetnacl": { 2732 | "version": "0.14.5", 2733 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2734 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 2735 | } 2736 | } 2737 | }, 2738 | "state-toggle": { 2739 | "version": "1.0.3", 2740 | "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", 2741 | "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" 2742 | }, 2743 | "statuses": { 2744 | "version": "1.5.0", 2745 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2746 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2747 | }, 2748 | "stealthy-require": { 2749 | "version": "1.1.1", 2750 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 2751 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 2752 | }, 2753 | "streamsearch": { 2754 | "version": "0.1.2", 2755 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 2756 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 2757 | }, 2758 | "string-width": { 2759 | "version": "1.0.2", 2760 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2761 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2762 | "requires": { 2763 | "code-point-at": "^1.0.0", 2764 | "is-fullwidth-code-point": "^1.0.0", 2765 | "strip-ansi": "^3.0.0" 2766 | } 2767 | }, 2768 | "string_decoder": { 2769 | "version": "1.1.1", 2770 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2771 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2772 | "requires": { 2773 | "safe-buffer": "~5.1.0" 2774 | } 2775 | }, 2776 | "stringify-entities": { 2777 | "version": "2.0.0", 2778 | "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz", 2779 | "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==", 2780 | "requires": { 2781 | "character-entities-html4": "^1.0.0", 2782 | "character-entities-legacy": "^1.0.0", 2783 | "is-alphanumerical": "^1.0.0", 2784 | "is-decimal": "^1.0.2", 2785 | "is-hexadecimal": "^1.0.0" 2786 | } 2787 | }, 2788 | "strip-ansi": { 2789 | "version": "3.0.1", 2790 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2791 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2792 | "requires": { 2793 | "ansi-regex": "^2.0.0" 2794 | } 2795 | }, 2796 | "strip-bom-string": { 2797 | "version": "1.0.0", 2798 | "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", 2799 | "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" 2800 | }, 2801 | "strip-json-comments": { 2802 | "version": "2.0.1", 2803 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2804 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 2805 | }, 2806 | "style-to-object": { 2807 | "version": "0.2.3", 2808 | "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", 2809 | "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", 2810 | "requires": { 2811 | "inline-style-parser": "0.1.1" 2812 | } 2813 | }, 2814 | "symbol-tree": { 2815 | "version": "3.2.4", 2816 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 2817 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" 2818 | }, 2819 | "tar": { 2820 | "version": "4.4.10", 2821 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", 2822 | "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", 2823 | "requires": { 2824 | "chownr": "^1.1.1", 2825 | "fs-minipass": "^1.2.5", 2826 | "minipass": "^2.3.5", 2827 | "minizlib": "^1.2.1", 2828 | "mkdirp": "^0.5.0", 2829 | "safe-buffer": "^5.1.2", 2830 | "yallist": "^3.0.3" 2831 | } 2832 | }, 2833 | "tar-fs": { 2834 | "version": "2.1.0", 2835 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", 2836 | "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", 2837 | "requires": { 2838 | "chownr": "^1.1.1", 2839 | "mkdirp-classic": "^0.5.2", 2840 | "pump": "^3.0.0", 2841 | "tar-stream": "^2.0.0" 2842 | } 2843 | }, 2844 | "tar-stream": { 2845 | "version": "2.1.4", 2846 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", 2847 | "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", 2848 | "requires": { 2849 | "bl": "^4.0.3", 2850 | "end-of-stream": "^1.4.1", 2851 | "fs-constants": "^1.0.0", 2852 | "inherits": "^2.0.3", 2853 | "readable-stream": "^3.1.1" 2854 | }, 2855 | "dependencies": { 2856 | "readable-stream": { 2857 | "version": "3.6.0", 2858 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2859 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2860 | "requires": { 2861 | "inherits": "^2.0.3", 2862 | "string_decoder": "^1.1.1", 2863 | "util-deprecate": "^1.0.1" 2864 | } 2865 | } 2866 | } 2867 | }, 2868 | "thenify": { 2869 | "version": "3.3.1", 2870 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 2871 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2872 | "requires": { 2873 | "any-promise": "^1.0.0" 2874 | } 2875 | }, 2876 | "thenify-all": { 2877 | "version": "1.6.0", 2878 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2879 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", 2880 | "requires": { 2881 | "thenify": ">= 3.1.0 < 4" 2882 | } 2883 | }, 2884 | "throwback": { 2885 | "version": "4.1.0", 2886 | "resolved": "https://registry.npmjs.org/throwback/-/throwback-4.1.0.tgz", 2887 | "integrity": "sha512-dLFe8bU8SeH0xeqeKL7BNo8XoPC/o91nz9/ooeplZPiso+DZukhoyZcSz9TFnUNScm+cA9qjU1m1853M6sPOng==" 2888 | }, 2889 | "toidentifier": { 2890 | "version": "1.0.0", 2891 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2892 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 2893 | }, 2894 | "tough-cookie": { 2895 | "version": "3.0.1", 2896 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", 2897 | "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", 2898 | "requires": { 2899 | "ip-regex": "^2.1.0", 2900 | "psl": "^1.1.28", 2901 | "punycode": "^2.1.1" 2902 | } 2903 | }, 2904 | "tr46": { 2905 | "version": "2.0.2", 2906 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", 2907 | "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", 2908 | "requires": { 2909 | "punycode": "^2.1.1" 2910 | } 2911 | }, 2912 | "trim": { 2913 | "version": "0.0.1", 2914 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 2915 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" 2916 | }, 2917 | "trim-lines": { 2918 | "version": "1.1.3", 2919 | "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz", 2920 | "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==" 2921 | }, 2922 | "trim-trailing-lines": { 2923 | "version": "1.1.3", 2924 | "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", 2925 | "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==" 2926 | }, 2927 | "trough": { 2928 | "version": "1.0.5", 2929 | "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", 2930 | "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" 2931 | }, 2932 | "ts-expect": { 2933 | "version": "1.1.0", 2934 | "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.1.0.tgz", 2935 | "integrity": "sha512-cKoBZ47X85x/Qh7taf30m3BhOJOhtNbb7KFHz9CCuWeRSAh0wzprnmiN9TSOQ0FWp3+qDWS5f2FDnxkY93Kdfw==" 2936 | }, 2937 | "ts-node": { 2938 | "version": "8.10.2", 2939 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", 2940 | "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", 2941 | "dev": true, 2942 | "requires": { 2943 | "arg": "^4.1.0", 2944 | "diff": "^4.0.1", 2945 | "make-error": "^1.1.1", 2946 | "source-map-support": "^0.5.17", 2947 | "yn": "3.1.1" 2948 | } 2949 | }, 2950 | "tsscmp": { 2951 | "version": "1.0.6", 2952 | "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", 2953 | "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" 2954 | }, 2955 | "tunnel-agent": { 2956 | "version": "0.6.0", 2957 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2958 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2959 | "requires": { 2960 | "safe-buffer": "^5.0.1" 2961 | } 2962 | }, 2963 | "tweetnacl": { 2964 | "version": "1.0.3", 2965 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 2966 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 2967 | }, 2968 | "type-check": { 2969 | "version": "0.3.2", 2970 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2971 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2972 | "requires": { 2973 | "prelude-ls": "~1.1.2" 2974 | } 2975 | }, 2976 | "type-fest": { 2977 | "version": "0.3.1", 2978 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", 2979 | "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" 2980 | }, 2981 | "type-is": { 2982 | "version": "1.6.18", 2983 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2984 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2985 | "requires": { 2986 | "media-typer": "0.3.0", 2987 | "mime-types": "~2.1.24" 2988 | } 2989 | }, 2990 | "typescript": { 2991 | "version": "3.9.7", 2992 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 2993 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 2994 | "dev": true 2995 | }, 2996 | "unherit": { 2997 | "version": "1.1.3", 2998 | "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", 2999 | "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", 3000 | "requires": { 3001 | "inherits": "^2.0.0", 3002 | "xtend": "^4.0.0" 3003 | } 3004 | }, 3005 | "unified": { 3006 | "version": "8.4.2", 3007 | "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", 3008 | "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", 3009 | "requires": { 3010 | "bail": "^1.0.0", 3011 | "extend": "^3.0.0", 3012 | "is-plain-obj": "^2.0.0", 3013 | "trough": "^1.0.0", 3014 | "vfile": "^4.0.0" 3015 | } 3016 | }, 3017 | "unist-builder": { 3018 | "version": "1.0.4", 3019 | "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz", 3020 | "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==", 3021 | "requires": { 3022 | "object-assign": "^4.1.0" 3023 | } 3024 | }, 3025 | "unist-util-find-after": { 3026 | "version": "2.0.4", 3027 | "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-2.0.4.tgz", 3028 | "integrity": "sha512-zo0ShIr+E/aU9xSK7JC9Kb+WP9seTFCuqVYdo5+HJSjN009XMfhiA1FIExEKzdDP1UsgvKGleGlB/pSdTSqZww==", 3029 | "requires": { 3030 | "unist-util-is": "^3.0.0" 3031 | } 3032 | }, 3033 | "unist-util-generated": { 3034 | "version": "1.1.5", 3035 | "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.5.tgz", 3036 | "integrity": "sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw==" 3037 | }, 3038 | "unist-util-is": { 3039 | "version": "3.0.0", 3040 | "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", 3041 | "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" 3042 | }, 3043 | "unist-util-position": { 3044 | "version": "3.1.0", 3045 | "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", 3046 | "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" 3047 | }, 3048 | "unist-util-remove-position": { 3049 | "version": "1.1.4", 3050 | "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", 3051 | "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", 3052 | "requires": { 3053 | "unist-util-visit": "^1.1.0" 3054 | } 3055 | }, 3056 | "unist-util-stringify-position": { 3057 | "version": "2.0.3", 3058 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", 3059 | "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", 3060 | "requires": { 3061 | "@types/unist": "^2.0.2" 3062 | } 3063 | }, 3064 | "unist-util-visit": { 3065 | "version": "1.4.1", 3066 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", 3067 | "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", 3068 | "requires": { 3069 | "unist-util-visit-parents": "^2.0.0" 3070 | } 3071 | }, 3072 | "unist-util-visit-parents": { 3073 | "version": "2.1.2", 3074 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", 3075 | "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", 3076 | "requires": { 3077 | "unist-util-is": "^3.0.0" 3078 | } 3079 | }, 3080 | "unpipe": { 3081 | "version": "1.0.0", 3082 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3083 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3084 | }, 3085 | "uri-js": { 3086 | "version": "4.4.0", 3087 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 3088 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 3089 | "requires": { 3090 | "punycode": "^2.1.0" 3091 | } 3092 | }, 3093 | "urijs": { 3094 | "version": "1.19.2", 3095 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", 3096 | "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==" 3097 | }, 3098 | "util-deprecate": { 3099 | "version": "1.0.2", 3100 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3101 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3102 | }, 3103 | "uuid": { 3104 | "version": "8.3.0", 3105 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", 3106 | "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" 3107 | }, 3108 | "vary": { 3109 | "version": "1.1.2", 3110 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3111 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3112 | }, 3113 | "verror": { 3114 | "version": "1.10.0", 3115 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3116 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3117 | "requires": { 3118 | "assert-plus": "^1.0.0", 3119 | "core-util-is": "1.0.2", 3120 | "extsprintf": "^1.2.0" 3121 | } 3122 | }, 3123 | "vfile": { 3124 | "version": "4.2.0", 3125 | "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz", 3126 | "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==", 3127 | "requires": { 3128 | "@types/unist": "^2.0.0", 3129 | "is-buffer": "^2.0.0", 3130 | "replace-ext": "1.0.0", 3131 | "unist-util-stringify-position": "^2.0.0", 3132 | "vfile-message": "^2.0.0" 3133 | } 3134 | }, 3135 | "vfile-location": { 3136 | "version": "2.0.6", 3137 | "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", 3138 | "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" 3139 | }, 3140 | "vfile-message": { 3141 | "version": "2.0.4", 3142 | "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", 3143 | "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", 3144 | "requires": { 3145 | "@types/unist": "^2.0.0", 3146 | "unist-util-stringify-position": "^2.0.0" 3147 | } 3148 | }, 3149 | "w3c-hr-time": { 3150 | "version": "1.0.2", 3151 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", 3152 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", 3153 | "requires": { 3154 | "browser-process-hrtime": "^1.0.0" 3155 | } 3156 | }, 3157 | "w3c-xmlserializer": { 3158 | "version": "2.0.0", 3159 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", 3160 | "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", 3161 | "requires": { 3162 | "xml-name-validator": "^3.0.0" 3163 | } 3164 | }, 3165 | "web-namespaces": { 3166 | "version": "1.1.4", 3167 | "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", 3168 | "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" 3169 | }, 3170 | "webidl-conversions": { 3171 | "version": "6.1.0", 3172 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", 3173 | "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" 3174 | }, 3175 | "whatwg-encoding": { 3176 | "version": "1.0.5", 3177 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", 3178 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", 3179 | "requires": { 3180 | "iconv-lite": "0.4.24" 3181 | } 3182 | }, 3183 | "whatwg-mimetype": { 3184 | "version": "2.3.0", 3185 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", 3186 | "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" 3187 | }, 3188 | "whatwg-url": { 3189 | "version": "8.3.0", 3190 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.3.0.tgz", 3191 | "integrity": "sha512-BQRf/ej5Rp3+n7k0grQXZj9a1cHtsp4lqj01p59xBWFKdezR8sO37XnpafwNqiFac/v2Il12EIMjX/Y4VZtT8Q==", 3192 | "requires": { 3193 | "lodash.sortby": "^4.7.0", 3194 | "tr46": "^2.0.2", 3195 | "webidl-conversions": "^6.1.0" 3196 | } 3197 | }, 3198 | "which-pm-runs": { 3199 | "version": "1.0.0", 3200 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 3201 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 3202 | }, 3203 | "wide-align": { 3204 | "version": "1.1.3", 3205 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 3206 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 3207 | "requires": { 3208 | "string-width": "^1.0.2 || 2" 3209 | } 3210 | }, 3211 | "word-wrap": { 3212 | "version": "1.2.3", 3213 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3214 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" 3215 | }, 3216 | "wrappy": { 3217 | "version": "1.0.2", 3218 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3219 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3220 | }, 3221 | "ws": { 3222 | "version": "7.3.1", 3223 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", 3224 | "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" 3225 | }, 3226 | "xml-name-validator": { 3227 | "version": "3.0.0", 3228 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", 3229 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" 3230 | }, 3231 | "xmlchars": { 3232 | "version": "2.2.0", 3233 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 3234 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" 3235 | }, 3236 | "xtend": { 3237 | "version": "4.0.2", 3238 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3239 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 3240 | }, 3241 | "yallist": { 3242 | "version": "3.1.1", 3243 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3244 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 3245 | }, 3246 | "ylru": { 3247 | "version": "1.2.1", 3248 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", 3249 | "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" 3250 | }, 3251 | "yn": { 3252 | "version": "3.1.1", 3253 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 3254 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 3255 | "dev": true 3256 | }, 3257 | "zwitch": { 3258 | "version": "1.0.5", 3259 | "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", 3260 | "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" 3261 | } 3262 | } 3263 | } 3264 | --------------------------------------------------------------------------------