├── .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 |
--------------------------------------------------------------------------------