├── .editorconfig ├── .eslintrc.js ├── .gitattributes ├── .gitignore ├── CHANGELOG.md ├── COMMANDS.md ├── LICENSE ├── README.md ├── app.js ├── channels.sample.json ├── config.sample.js ├── helpers.js ├── ignore.sample.json ├── index.sample.yaml ├── package-lock.json ├── package.json └── views ├── base.html └── home.html /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 4 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "es6": true, 4 | "node": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "rules": { 8 | "comma-dangle": ["error", { 9 | "arrays": "always-multiline", 10 | "objects": "always-multiline" 11 | }], 12 | "indent": [ 13 | "error", 14 | 4, 15 | { "SwitchCase": 1 }, 16 | ], 17 | "linebreak-style": [ 18 | "error", 19 | "unix" 20 | ], 21 | "no-console": 0, 22 | "quotes": [ 23 | "error", 24 | "single" 25 | ], 26 | "semi": [ 27 | "error", 28 | "always" 29 | ] 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js text eol=lf 2 | *.json text eol=lf 3 | *.md text eol=lf 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | config.js* 3 | channels.json 4 | ignore.json 5 | index.yaml 6 | npm-debug.log 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## Version 0.10.1 4 | 5 | - **Subscriptions**: Resubs with no message will no longer include ` - Message: ` at the end and simply omit it. 6 | - **Subscriptions**: Months should be reported correctly when resubscribing. 7 | - Resub messages only care about total months subscribed, not "streak months". 8 | - **Subscriptions**: Tiers will now display correctly as `Tier 1/Tier 2/Tier 3` instead of `1000/2000/3000` 9 | - This only applies to new messages. Older messages already logged will still include `1000/2000/3000`. 10 | - Twitch Prime subscriptions will still show as `Prime`, unless Twitch changes that in the future. 11 | - **Timeouts / Bans**: Reasons will be omitted from new messages, as timeout/ban reasons are no longer sent via chat. 12 | - This does not affect timeout lengths, they will still be included as-is. 13 | - Future bans will now only show up as `* BAN`. 14 | - **Web UI**: The `limit` and `offset` fields will be disabled while retrieving messages, preventing input mid-retrieval. 15 | 16 | ## Version 0.10.0 17 | 18 | - Added `userAgentBlacklist` option in the configuration file. 19 | - A simple `.includes()` match on the user agent, which returns a `403 Forbidden`. 20 | - Updated npm dependencies. 21 | 22 | ## Version 0.9.1 23 | 24 | - Fix error logs being spammed with exceptions whenever a username that does not exist (banned/deactivated) was looked up. 25 | - Fix messages over 1500 bytes not being logged. 26 | - Updated dependencies. 27 | 28 | ## Version 0.9.0 29 | 30 | - Added support for bans and timeouts, with (timeout) lengths and timeout/ban reason. 31 | - Updated a few project dependencies and the code using said dependencies. 32 | 33 | ## Version 0.8.3 34 | 35 | - Add username to table cell where display name is in certain cases. 36 | - Specifically where the lowercased version of the display name is different from the username (CJK names). 37 | - Allow people to search for user IDs directly, instead of usernames. 38 | - Fix an issue where channel data (such as IDs) wouldn't be cached when autoconnect wasn't enabled. 39 | - This would cause errors when trying to fetch messages from a specific channel. 40 | 41 | ## Version 0.8.2 42 | 43 | - Fallback to searching by username instead of user ID when unable to retrieve the ID. 44 | - Happens in instances where the Twitch API request fails, or the user doesn't "exist" (suspended, deactivated etc). 45 | - Fix "bug" (more of an oversight) where `twitchnotify` messages were being logged as normal messages. These are now ignored. 46 | - This was introduced in [Version 0.8.0](#version-080) where tmi.js was updated to 1.2.1 and subscription messages were changed. 47 | - Fix `index.sample.yaml` that should have been updated in [Version 0.7.0](#version-070) (I'm sorry). 48 | 49 | ## Version 0.8.1 50 | 51 | - Fix bug where the resub "plan" wasn't logging correctly due to referring to the wrong parameter on the event. 52 | 53 | ## Version 0.8.0 54 | 55 | - Twitch has [done some changes to the subscription system](https://discuss.dev.twitch.tv/t/subscriptions-beta-changes/10023), which allows new subscriptions to share a message, just like resubs. 56 | - Fix bug where quitting the bot wouldn't properly exit the process. 57 | 58 | ## Version 0.7.0 59 | 60 | - Lookups are now done via user IDs instead of names. This will account for users that have changed their names. 61 | 62 | ## Version 0.6.0 63 | 64 | - Added support for logging resub messages. The format is currently: 65 | - `Resub (X months) - Message: MSG` 66 | - Where `X` is the number of months and `MSG` is the message the user sent with their resub. 67 | - If the user didn't specify any message, `` will be used as a placeholder. 68 | 69 | ## Version 0.5.2 70 | 71 | - Fix bug/oversight where cheering/bit messages were not being logged. 72 | 73 | ## Version 0.5.1 74 | 75 | - Fix bug where `/me` (aka `ACTION`) messages were not being logged. 76 | 77 | ## Version 0.5.0 78 | 79 | - Adds support for specifying an "offset" in the web interface. 80 | - API for messages now allows query parameters instead of headers. 81 | - Headers are still allowed to keep it backwards-compatible. 82 | - API now allows messages to be returned in "plaintext", by specifying `plain` as a query parameter or header. 83 | 84 | ## Version 0.4.2 85 | 86 | - Fix error when ignore list for channel did not exist. 87 | - Fix minor error in home view for handling errors. 88 | - Add a `count` field in the `/api/messages` route. 89 | 90 | ## Version 0.4.1 91 | 92 | - Commands `ignore` and `unignore` will now display the correct username that was ignored, instead of the username of the admin that did the command. 93 | - This is just a minor fix, as the name saved to the ignore list was correct, but the message sent back to the admin was incorrect. 94 | 95 | ## Version 0.4.0 96 | 97 | - Add a per-channel ignore list. 98 | - Added `ignore` and `unignore` commands for use with the ignore list. 99 | 100 | ## Version 0.3.1 101 | 102 | - Adds a 'Refresh' button to the homepage, so that you can retrieve messages without changing from one channel to another, then back. 103 | - Error messages now properly work. 104 | - Added a proper `LICENSE` file to the repository. 105 | 106 | ## Version 0.3.0 107 | 108 | - Allows searching for just username. 109 | - Re-organized the table for messages in a little bit more logical structure. 110 | 111 | ## Version 0.2.1 112 | 113 | - Channels are now sorted alphabetically in the web interface's list. 114 | 115 | ## Version 0.2.0 116 | 117 | - Created a frontend that integrates with `/api/*` routes. 118 | - Add a property in `config.settings` that allows users to enable/disable the auto-connecting to Twitch channels (`true/false`). 119 | - As of right now, the bot does a strict check if that is set to `false`, so that version 0.1.0 users don't break instantly by updating the bot, but not the config-file. 120 | - Move API endpoints to `/api/*`, and serve frontend via `/`. 121 | - Rename the `channels.default.json` sample-file to `channels.sample.json` to stay consistent. 122 | 123 | ## Version 0.1.0 124 | 125 | - First release. 126 | - Has support for admin commands: `join`, `leave/part`, `ping` 127 | -------------------------------------------------------------------------------- /COMMANDS.md: -------------------------------------------------------------------------------- 1 | # Commands 2 | The bot supports commands that are fully controlled through whispers. Commands are, as of 0.1.0 and onwards, only available for admins (specified in the `config.js` file). 3 | 4 | All commands need to be prefixed with what is specified in the `config.js` file. By default it's `!`. 5 | 6 | Parameters are specified as ``, `[optional]` and `(none)`. 7 | 8 | | Command | Parameters | Description | 9 | | :---: | :---: | :---: | 10 | | `join` | `` | Joins the specified channel and adds it to the list of channels | 11 | | `ignore` | `` `` | Adds the username to the ignore list for the specified channel. | 12 | | `leave` | `` | Leaves the specified channel and removes it from the list of channels | 13 | | `part` | `` | Alias of `leave` | 14 | | `ping` | `(none)` | Replies with `PONG` (for testing purposes) | 15 | | `unignore` | `` `` | Removes the username from the ignore list for the specified channel. | 16 | | `version` | `(none)` | Replies with the app version. | 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016-2019 Alex Thomassen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Twitch Log Bot 2 | Twitch Log Bot is a bot that will join Twitch channels and store chat messages using Google Cloud Datastore. 3 | 4 | The web interface is just a basic interface to allow you to see past messages in a channel to see their chat history. 5 | It is designed to be simple and only do lookups per-channel (and optionally: per-user). 6 | If you want something that has more features, take a look at [CBenni's Logviewer](https://github.com/CBenni/logviewer) which is also hosted at [cbenni.com](https://cbenni.com/). 7 | 8 | ## Setup 9 | - Setup [Google Cloud Datastore](https://console.cloud.google.com/datastore/). 10 | - Setup [node & npm](https://nodejs.org/). 11 | - Install dependencies using `npm install`. 12 | - Copy `config.sample.js` to `config.js` and edit the values (see comments in the config-file). 13 | - Copy `index.sample.yaml` to `index.yaml` and edit each `kind` to what you wish to store it as in Google Cloud Datastore. Anything else should (by default) be left as-is. 14 | - The easiest way to create these indexes is by installing [Google Cloud SDK](https://cloud.google.com/sdk/), then running `gcloud init` after installing. 15 | - After that, while being in the directory of this bot, run `gcloud datastore create-indexes index.yaml` and it should create the indexes. 16 | - If you wanna make sure you don't have unnecessary indexes on GC Datastore, run `gcloud datastore cleanup-indexes index.yaml` in the same directory. 17 | - Copy `channels.sample.json` to `channels.json` and edit it. 18 | - **It's recommended to at least remove the example channels**. 19 | - Copy `ignore.sample.json` to `ignore.json`. 20 | - If you are familiar with JSON objects, feel free to manually edit it. Otherwise, I recommend using the [admin commands](COMMANDS.md). 21 | - Run the bot using `node app.js`, or alternatively use [pm2](http://pm2.keymetrics.io/). 22 | 23 | ## Updating 24 | - Download the [latest release](https://github.com/Decicus/twitch-log-bot/releases/latest) or pull directly from `master` using `git pull`. 25 | - Make sure dependencies are up-to-date by using `npm install`. 26 | - Make sure `config.js` has the same properties as `config.sample.js`. 27 | - Delete/move config.js elsewhere and make a new `config.js` based off `config.sample.js` **if you feel like you have to**. 28 | - Make sure `index.yaml` has the same values as `index.sample.yaml` (remember to edit the `kind`!) and update indexes using for example `gcloud datastore create-indexes index.yaml`. 29 | - Run the bot using `node app.js`, or alternatively use [pm2](http://pm2.keymetrics.io/). 30 | 31 | ## Changelog 32 | Changelog can be found here: [CHANGELOG](/CHANGELOG.md). 33 | 34 | ## Commands 35 | Commands can be found here: [COMMANDS](/COMMANDS.md). 36 | 37 | ## License 38 | This is licensed under the [MIT License](/LICENSE). 39 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const config = require('./config'); 3 | const h = require('./helpers'); 4 | const pkg = require('./package'); 5 | const settings = config.settings; 6 | const { Datastore } = require('@google-cloud/datastore'); 7 | const express = require('express'); 8 | const fs = require('fs'); 9 | const request = require('request'); 10 | const swig = require('swig'); 11 | const tmi = require('tmi.js'); 12 | 13 | const datastore = new Datastore(config.gcloud); 14 | const client = new tmi.client(config.tmi); 15 | const web = express(); 16 | const twitchSettings = config.settings.twitch || {}; 17 | const baseApi = request.defaults({ 18 | baseUrl: 'https://twitch-api-proxy.cactus.workers.dev', 19 | method: 'GET', 20 | json: true, 21 | }); 22 | 23 | /** 24 | * Channels the bot has joined (and will join on start). 25 | * 26 | * @type {Array} 27 | */ 28 | let channels = []; 29 | 30 | /** 31 | * Cache to map usernames to user IDs and vice versa. 32 | * 33 | * @type {Object} 34 | */ 35 | let cache = { 36 | ids: {}, 37 | names: {}, 38 | }; 39 | 40 | /** 41 | * Get user data based on username. 42 | * 43 | * @param {String} username 44 | * @param {Function} callback 45 | * @return {Void} 46 | */ 47 | const getUser = (username, callback) => { 48 | if (typeof callback !== 'function') { 49 | callback = () => {}; 50 | } 51 | 52 | if (cache.names[username]) { 53 | callback(cache.names[username]); 54 | return; 55 | } 56 | 57 | baseApi({ 58 | 'url': '/direct/users?login=' + username, 59 | }, (err, response, body) => { 60 | if (err) { 61 | callback(false); 62 | return console.error(err); 63 | } 64 | 65 | if (!body || !body.data || body.data.length === 0) { 66 | callback(false); 67 | return console.error(`User ${username} does not exist!`); 68 | } 69 | 70 | const user = body.data[0]; 71 | const {id, display_name, login} = user; 72 | const name = login; 73 | const _id = id; 74 | 75 | const userToCache = { 76 | display_name, 77 | _id, 78 | name, 79 | }; 80 | 81 | cache.ids[_id] = userToCache; 82 | cache.names[name] = userToCache; 83 | console.log(`Loaded ${name} (${_id}) into cache.`); 84 | 85 | callback(userToCache); 86 | }); 87 | }; 88 | 89 | /** 90 | * Which users to ignore in channels by the bot. 91 | * 92 | * @type {Object} 93 | */ 94 | let ignore = {}; 95 | 96 | /** 97 | * Reads a file and parses it as JSON. 98 | * 99 | * @return {Mixed} 100 | */ 101 | const readJson = (filename) => { 102 | try { 103 | return JSON.parse(fs.readFileSync(filename, 'utf-8')); 104 | } catch (error) { 105 | console.log(error); 106 | return false; 107 | } 108 | }; 109 | 110 | 111 | /** 112 | * JSON-encodes the input and writes it to the specified file path. 113 | * 114 | * @param {String} filename 115 | * @param {Object|Array} input 116 | * @return {Void} 117 | */ 118 | const saveJson = (filename, input) => { 119 | fs.writeFile(filename, JSON.stringify(input, null, 4), (error) => { 120 | if (error) { 121 | console.log(error); 122 | } 123 | }); 124 | }; 125 | 126 | /** 127 | * Loads channels from file 128 | * 129 | * @return {Void} 130 | */ 131 | const loadChannels = () => { 132 | let read = readJson(settings.channels || __dirname + '/channels.json'); 133 | 134 | if (read === false) { 135 | return; 136 | } 137 | 138 | channels = read; 139 | }; 140 | 141 | // Load channels on startup 142 | loadChannels(); 143 | 144 | // Cache channel data 145 | channels.forEach((chan) => { 146 | getUser(chan); 147 | }); 148 | 149 | /** 150 | * Saves channels to file. 151 | * 152 | * @return {Void} 153 | */ 154 | const saveChannels = () => { 155 | saveJson(settings.channels || __dirname + '/channels.json', channels); 156 | }; 157 | 158 | /** 159 | * Loads the ignore list from file. 160 | * 161 | * @return {Void} 162 | */ 163 | const loadIgnore = () => { 164 | let read = readJson(settings.ignore || __dirname + '/ignore.json'); 165 | 166 | if (read === false) { 167 | return; 168 | } 169 | 170 | ignore = read; 171 | }; 172 | 173 | // Load ignore list on startup. 174 | loadIgnore(); 175 | 176 | /** 177 | * Saves the ignore list to file. 178 | * 179 | * @return {Void} 180 | */ 181 | const saveIgnore = () => { 182 | saveJson(settings.ignore || __dirname + '/ignore.json', ignore); 183 | }; 184 | 185 | /** 186 | * Admin commands controlled by whispers. 187 | * 188 | * @type {Object} 189 | */ 190 | const cmds = {}; 191 | 192 | /** 193 | * Adds a user to the ignore list for the specified channel, then saves the ignore list. 194 | */ 195 | cmds['ignore'] = (username, user, input) => { 196 | if (!input[0] || !input[1]) { 197 | client.whisper(username, 'Both channel and username has to be specified'); 198 | return; 199 | } 200 | 201 | let channel = h.fmtChannel(input[0]); 202 | let name = h.fmtChannel(input[1]); 203 | 204 | if (!ignore[channel]) { 205 | ignore[channel] = []; 206 | } 207 | 208 | let list = ignore[channel]; 209 | if (list.indexOf(name) >= 0) { 210 | client.whisper(username, `${name} is already ignored in ${channel}`); 211 | return; 212 | } 213 | 214 | list.push(name); 215 | saveIgnore(); 216 | client.whisper(username, `${name} has been added to the ignore list for ${channel}`); 217 | }; 218 | 219 | /** 220 | * Attempts to join the channel if it hasn't already been joined, then saves the channel list. 221 | */ 222 | cmds['join'] = (username, user, input) => { 223 | if (input[0]) { 224 | let channel = h.fmtChannel(input[0]); 225 | if (channels.indexOf(channel) >= 0) { 226 | client.whisper(username, `${channel} is already joined.`); 227 | } else { 228 | getUser(channel, (user) => { 229 | if (!user) { 230 | client.whisper(username, `Error occurred getting data on ${channel}.`); 231 | return; 232 | } 233 | 234 | client.join(channel).then(() => { 235 | channels.push(channel); 236 | saveChannels(); 237 | client.whisper(username, `Successfully joined ${channel} and added the channel to the list.`); 238 | }).catch((err) => { 239 | client.whisper(username, `An error occurred joining ${channel}: ${err}`); 240 | }); 241 | }); 242 | } 243 | } else { 244 | client.whisper(username, 'A channel name has to be specified.'); 245 | } 246 | }; 247 | 248 | /** 249 | * Leaves the specified channel and removes it from the channel list. 250 | */ 251 | cmds['leave'] = (username, user, input) => { 252 | if (input[0]) { 253 | let channel = h.fmtChannel(input[0]); 254 | let index = channels.indexOf(channel); 255 | 256 | if (index >= 0) { 257 | client.part(channel).then(() => { 258 | channels.splice(index, 1); 259 | saveChannels(); 260 | client.whisper(username, `Successfully left ${channel} and removed the channel from the list.`); 261 | }).catch((err) => { 262 | client.whisper(username, `An error occurred leaving ${channel}: ${err}`); 263 | }); 264 | } else { 265 | client.whisper(username, `${channel} has not been added to the list yet.`); 266 | } 267 | } else { 268 | client.whisper(username, 'A channel name has to be specified.'); 269 | } 270 | }; 271 | 272 | /** 273 | * Alias of cmds.leave(). 274 | */ 275 | cmds['part'] = cmds['leave']; 276 | 277 | /** 278 | * Ping pong. 279 | */ 280 | cmds['ping'] = (username) => { 281 | client.whisper(username, 'PONG'); 282 | }; 283 | 284 | /** 285 | * Removes a user from the ignore list for the specified channel, then saves the ignore list. 286 | */ 287 | cmds['unignore'] = (username, user, input) => { 288 | if (!input[0] || !input[1]) { 289 | client.whisper(username, 'Both channel and username has to be specified'); 290 | return; 291 | } 292 | 293 | let channel = h.fmtChannel(input[0]); 294 | let name = h.fmtChannel(input[1]); 295 | 296 | if (!ignore[channel]) { 297 | ignore[channel] = []; 298 | } 299 | 300 | let list = ignore[channel]; 301 | let index = list.indexOf(name); 302 | if (index === -1) { 303 | client.whisper(username, `${name} isn't ignored in ${channel}`); 304 | return; 305 | } 306 | 307 | list.splice(index, 1); 308 | saveIgnore(); 309 | client.whisper(username, `${name} has been removed from the ignore list for ${channel}`); 310 | }; 311 | 312 | /** 313 | * Returns the app version. 314 | */ 315 | cmds['version'] = (username) => { 316 | client.whisper(username, pkg.version); 317 | }; 318 | 319 | /** 320 | * Handles chat messages 321 | */ 322 | const handleMessage = (channel, user, message) => { 323 | channel = h.fmtChannel(channel); 324 | 325 | /** 326 | * Ignore legacy "twitchnotify" subscriber messages. 327 | * 328 | * These should no longer show up anyways. 329 | */ 330 | if (user.username === 'twitchnotify') { 331 | return; 332 | } 333 | 334 | /** 335 | * Ignore users in the ignore list. 336 | */ 337 | if (ignore[channel] && ignore[channel].indexOf(user.username) >= 0) { 338 | return; 339 | } 340 | 341 | /** 342 | * Formats data so we don't log _all_ the junk included in the userstate. 343 | * 344 | * @type {Object} 345 | */ 346 | const data = { 347 | channel: channel, 348 | channel_id: user['room-id'], 349 | username: user.username, 350 | user_id: user['user-id'], 351 | user: { 352 | display_name: (user['display-name'] || user.username), 353 | type: user['user-type'], 354 | color: user.color, 355 | badges: user.badges, 356 | subscriber: user.subscriber, 357 | turbo: user.turbo, 358 | }, 359 | message: message, 360 | timestamp: user['tmi-sent-ts'], 361 | }; 362 | 363 | const key = datastore.key([settings.kind, user.id]); 364 | datastore 365 | .save({ 366 | key: key, 367 | data: data, 368 | excludeFromIndexes: ['message'], 369 | }) 370 | .catch(console.error); 371 | }; 372 | 373 | /** 374 | * Defines subscription plans/tiers. 375 | */ 376 | const subTiers = { 377 | '1000': 'Tier 1', 378 | '2000': 'Tier 2', 379 | '3000': 'Tier 3', 380 | }; 381 | 382 | /** 383 | * Handles the different subscription events 384 | */ 385 | const handleSubs = (channel, username, m, msg, state, methods) => { 386 | channel = h.fmtChannel(channel); 387 | 388 | if (ignore[channel] && ignore[channel].indexOf(username) >= 0) { 389 | return; 390 | } 391 | 392 | const ts = Date.now().toString(); 393 | 394 | getUser(username, (cachedUser) => { 395 | let user_id = null; 396 | if (cachedUser) { 397 | user_id = cachedUser._id; 398 | } 399 | 400 | /** 401 | * 'resub' event: This will be the amount of months the user has been subbed for 402 | * https://github.com/tmijs/docs/blob/gh-pages/_posts/v1.4.2/2019-03-03-Events.md#resub 403 | * 404 | * 'subscription' event: This will be an object with the plan/method information 405 | * https://github.com/tmijs/docs/blob/gh-pages/_posts/v1.4.2/2019-03-03-Events.md#subscription 406 | */ 407 | const isNumber = typeof m === 'number'; 408 | 409 | /** 410 | * Plan information will be part of `m` if it's a new subscription. 411 | * 412 | * Resubs pass another parameter `methods`, 413 | * which is normally undefined for new subscriptions. 414 | */ 415 | const {plan, planName} = (isNumber ? methods : m); 416 | 417 | /** 418 | * Tier 1/2/3 are predefined. If this changes or new tiers show up 419 | * it should just fall back to whatever Twitch sends via TMI. 420 | */ 421 | const tier = subTiers[plan] || plan; 422 | 423 | const months = state['msg-param-cumulative-months'] || (isNumber ? m : 0); 424 | const prefix = isNumber ? 425 | `Resub (${months} months) - Plan: [${tier}] ${planName}` : 426 | `Subscription - Plan: [${tier}] ${planName}`; 427 | 428 | /** 429 | * Check if a resubscription message is included. 430 | */ 431 | const hasMessage = typeof msg === 'string'; 432 | const data = { 433 | channel: channel, 434 | channel_id: cache.names[channel]._id, 435 | username: username, 436 | user_id: user_id, 437 | user: { 438 | display_name: username, 439 | }, 440 | message: prefix + (hasMessage ? `- Message: ${msg}` : ''), 441 | timestamp: ts, 442 | }; 443 | 444 | const key = datastore.key([settings.kind, username + '_' + ts]); 445 | datastore 446 | .save({ 447 | key: key, 448 | data: data, 449 | }) 450 | .catch(console.error); 451 | }); 452 | }; 453 | 454 | /** 455 | * Handles timeouts and bans in a channel. 456 | * 457 | * @param {String} channel Channel name where the ban/timeout occurred. 458 | * @param {String} username Username of user that got banned/timed out. 459 | * @param {null} reason Historically this contained the ban/timeout reason, but Twitch no longer sends this via TMI. 460 | * @param {Number|Object|undefined} length Length of time someone got timed out (in seconds). 461 | */ 462 | const handleTimeoutAndBan = (channel, username, timeout, length) => { 463 | channel = h.fmtChannel(channel); 464 | 465 | const isBan = length === undefined || typeof length === 'object'; 466 | const type = isBan ? 'BAN' : 'TIMEOUT'; 467 | const suffix = isBan ? '' : ` - Length (seconds): ${length}`; 468 | 469 | const ts = Date.now().toString(); 470 | getUser(username, (cachedUser) => { 471 | let userId = null; 472 | if (cachedUser) { 473 | userId = cachedUser._id; 474 | } 475 | 476 | const data = { 477 | channel: channel, 478 | channel_id: cache.names[channel]._id, 479 | username: username, 480 | user_id: userId, 481 | user: { 482 | display_name: username, 483 | }, 484 | message: `* ${type + suffix}`, 485 | timestamp: ts, 486 | }; 487 | 488 | const key = datastore.key([settings.kind, `${channel}_${username}_${ts}`]); 489 | datastore 490 | .save({ 491 | key, 492 | data, 493 | }) 494 | .catch(console.error); 495 | }); 496 | }; 497 | 498 | /** 499 | * Register all chat events with prepared handlers. 500 | */ 501 | client.on('action', handleMessage); 502 | client.on('ban', handleTimeoutAndBan); 503 | client.on('chat', handleMessage); 504 | client.on('cheer', handleMessage); 505 | client.on('resub', handleSubs); 506 | client.on('subscription', handleSubs); 507 | client.on('timeout', handleTimeoutAndBan); 508 | 509 | client.on('connected', () => { 510 | console.log(`[${h.now()}] Successfully connected.`); 511 | settings.autoconnect = settings.autoconnect || {}; 512 | 513 | if (channels.length > 0 && settings.autoconnect.enabled !== false) { 514 | // concat channels array to get a new array instance. 515 | let temp = channels.concat(); 516 | let queue = setInterval(() => { 517 | const chan = temp[0]; 518 | 519 | client.join(chan); 520 | temp.shift(); 521 | 522 | if (temp.length === 0) { 523 | clearInterval(queue); 524 | } 525 | }, settings.autoconnect.delay || 1000); 526 | } 527 | }); 528 | 529 | client.on('join', (channel, user, self) => { 530 | if (!self) { 531 | return; 532 | } 533 | 534 | console.log(`[${h.now()}] ${user} joined ${channel}`); 535 | }); 536 | 537 | client.on('whisper', (username, user, message) => { 538 | username = h.fmtChannel(username); 539 | /** 540 | * Handles admin commands through whispers 541 | */ 542 | if (settings.admins.indexOf(username) >= 0 && message.startsWith(settings.prefix)) { 543 | let input = message.split(' '); 544 | // remove prefix from command name 545 | let command = input[0].slice(settings.prefix.length).toLowerCase(); 546 | if (cmds[command]) { 547 | // remove the command name from input, because the methods don't need it 548 | input.shift(); 549 | cmds[command](username, user, input); 550 | } 551 | } 552 | }); 553 | 554 | if (settings.express.enabled) { 555 | web.engine('html', swig.renderFile); 556 | web.set('view engine', 'html'); 557 | web.set('views', __dirname + '/views'); 558 | 559 | web.get('/', (req, res) => { 560 | res.render('home'); 561 | }); 562 | 563 | web.get('/api/channels', (req, res) => { 564 | res.send({ 565 | success: true, 566 | channels: channels, 567 | }); 568 | }); 569 | 570 | /** 571 | * Blacklisted user agents. 572 | */ 573 | const blacklistedUserAgents = config.settings.userAgentBlacklist || []; 574 | web.get('/api/messages', (req, res) => { 575 | let channel = (h.requestValue(req, 'channel') || ''); 576 | let user = (h.requestValue(req, 'user') || ''); 577 | user = user.trim(); 578 | channel = channel.trim(); 579 | let limit = (parseInt(h.requestValue(req, 'limit')) || 25); 580 | let offset = (parseInt(h.requestValue(req, 'offset')) || 0); 581 | let plain = (typeof h.requestValue(req, 'plain') !== 'undefined' ? true : false); 582 | let useUserId = (typeof h.requestValue(req, 'userid') !== 'undefined' ? true : false); 583 | 584 | let max = (settings.queryLimit || 200); 585 | if (limit > max) { 586 | limit = max; 587 | } 588 | 589 | /** 590 | * Allow blacklisting of user agents, such as "Discordbot", to prevent their embeds 591 | * requesting messages. 592 | */ 593 | const userAgent = req.get('User-Agent'); 594 | for (let i in blacklistedUserAgents) { 595 | const blacklisted = blacklistedUserAgents[i]; 596 | if (userAgent.includes(blacklisted)) { 597 | console.log(`Blacklisted user agent: ${userAgent} matching ${blacklisted}`); 598 | res 599 | .status(403) 600 | .send({ 601 | success: false, 602 | message: 'Your user agent has been blacklisted.', 603 | }); 604 | 605 | return; 606 | } 607 | } 608 | 609 | if ((!channel || channel.length === 0) && (!user || user.length === 0)) { 610 | let message = 'No channel or user specified'; 611 | if (plain) { 612 | h.response(res, message); 613 | return; 614 | } 615 | 616 | h.response(res, { 617 | success: false, 618 | error: message, 619 | }); 620 | return; 621 | } 622 | 623 | let query = datastore.createQuery(settings.kind); 624 | 625 | if (channel && channel.length > 0) { 626 | query = query.filter('channel_id', '=', cache.names[channel]._id) 627 | .order('channel_id'); 628 | } 629 | 630 | if (user && user.length > 0) { 631 | user = user.toLowerCase(); 632 | } 633 | 634 | const userGet = (user && user.length > 0) ? user : channel; 635 | const handleUser = (cachedUser) => { 636 | if (!useUserId) { 637 | if (user && user.length > 0) { 638 | /** 639 | * User does not "exist", but may just be sitewide suspended/deleted. 640 | * Fallback to search by username. 641 | * 642 | * Eventually I wanna get the user_id from one of the resulting 643 | * messages in the query and use that to query more messages by 644 | * the user, but as of right now this is just a quickfix. 645 | * 646 | * This does not account for channels that are banned, which is 647 | * something else I'll have to "fix" at a later date. 648 | * For now: Don't get suspended. 649 | */ 650 | if (cachedUser) { 651 | query = query.filter('user_id', '=', cachedUser._id); 652 | } else { 653 | query = query.filter('username', '=', user); 654 | } 655 | } 656 | } else { 657 | query = query.filter('user_id', '=', cachedUser); 658 | } 659 | 660 | query = query 661 | .offset(offset) 662 | .limit(limit); 663 | 664 | query = query.order('timestamp', { 665 | descending: true, 666 | }); 667 | 668 | datastore 669 | .runQuery(query) 670 | .then((messages) => { 671 | messages = messages[0]; 672 | 673 | if (plain) { 674 | if (messages.length > 0) { 675 | let result = ''; 676 | for (let index in messages) { 677 | let msg = messages[index]; 678 | 679 | result += `[#${msg.channel}][${msg.user.display_name}][${h.formatDate(msg.timestamp)}] - ${msg.message}\r\n`; 680 | } 681 | 682 | h.response(res, result); 683 | } else { 684 | h.response(res, 'No messages found.'); 685 | } 686 | 687 | return; 688 | } 689 | 690 | h.response(res, { 691 | success: true, 692 | count: messages.length, 693 | messages: messages, 694 | }); 695 | }) 696 | .catch((err) => { 697 | const message = 'Unable to retrieve messages for this user/channel.'; 698 | console.error(err); 699 | res.status(404); 700 | 701 | if (plain) { 702 | h.response(res, message); 703 | return; 704 | } 705 | 706 | h.response(res, { 707 | success: false, 708 | error: message, 709 | }); 710 | }); 711 | }; 712 | 713 | if (useUserId) { 714 | handleUser(user); 715 | } else { 716 | getUser(userGet, handleUser); 717 | } 718 | }); 719 | 720 | web.get('/api/status', (req, res) => { 721 | const state = client.readyState(); 722 | 723 | // Set status code based on readyState status. 724 | const status = (state === 'OPEN' || state === 'CONNECTING') ? 200 : 500; 725 | res 726 | .status(status) 727 | .send({ 728 | success: status === 200, 729 | state, 730 | }); 731 | }); 732 | 733 | web.get('/api/*', function(req, res) { 734 | res.send({ 735 | success: false, 736 | error: '404 not found', 737 | }); 738 | }); 739 | 740 | /** 741 | * Basic error handling. 742 | */ 743 | web.use((err, req, res, next) => { // eslint-disable-line no-unused-vars 744 | if (err.status === 404) { 745 | res.send('Page not found.'); 746 | } 747 | 748 | res.send('Internal server error'); 749 | }); 750 | 751 | let webport = settings.express.port || 8000; 752 | web.listen(webport, () => { 753 | console.log(`Web interface listening on port ${webport}`); 754 | }); 755 | } 756 | 757 | client.connect(); 758 | 759 | process.on('SIGINT', () => { 760 | client.disconnect() 761 | .then(() => { 762 | console.log('Successfully disconnected from Twitch chat server.'); 763 | process.exit(0); 764 | }) 765 | .catch((err) => { 766 | console.error(`Error occurred disconnecting from Twitch chat server: ${err}`); 767 | process.exit(1); 768 | }); 769 | }); 770 | -------------------------------------------------------------------------------- /channels.sample.json: -------------------------------------------------------------------------------- 1 | [ 2 | "esl_csgo", 3 | "monstercat", 4 | "twitch" 5 | ] 6 | -------------------------------------------------------------------------------- /config.sample.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const config = {}; 4 | 5 | /** 6 | * See tmi.js docs for options: https://docs.tmijs.org/v1.1.2/Configuration.html 7 | * 8 | * @type {Object} 9 | */ 10 | config.tmi = { 11 | options: { 12 | debug: true, 13 | }, 14 | connection: { 15 | reconnect: true, 16 | secure: true, 17 | }, 18 | identity: { 19 | username: 'decicus', 20 | // The chat OAuth token can be retrieved using several methods. 21 | // Here are at least two: 22 | // - https://decicus.github.io/twitch-chat-token/ 23 | // - https://twitchapps.com/tmi/ 24 | password: 'oauth:KappaHey', 25 | }, 26 | }; 27 | 28 | /** 29 | * See Google Cloud options: https://googlecloudplatform.github.io/google-cloud-node/#/docs/google-cloud/0.42.2/google-cloud 30 | * 31 | * @type {Object} 32 | */ 33 | config.gcloud = { 34 | projectId: 'grape-spaceship-123', 35 | keyFilename: '/path/to/key.json', 36 | }; 37 | 38 | /** 39 | * Miscellaneous settings used by the bot. 40 | * 41 | * @type {Object} 42 | */ 43 | config.settings = { 44 | // The path to the JSON-file where channels are stored. 45 | channels: 'channels.json', 46 | // The path to the JSON-file where the ignore list is stored. 47 | ignore: 'ignore.json', 48 | // The name of the "Kind" on Google Cloud Datastore. 49 | kind: 'twitch-log-bot', 50 | // The command prefix for the admin commands. 51 | prefix: '!', 52 | // The maximum amount of chat messages the API should allow you to query. 53 | queryLimit: 200, 54 | // Array of Twitch usernames that are considered 'admins' and can use whisper commands. 55 | admins: [], 56 | // Settings related to when the bot auto-connects to channels on startup. 57 | autoconnect: { 58 | // If auto-connecting should be enabled 59 | enabled: true, 60 | // The delay between channel join in MILLISECONDS 61 | // Be careful of not putting this _too low_ due to rate-limits on Twitch's servers. 62 | delay: 1000, 63 | }, 64 | // Express-related settings 65 | express: { 66 | // Will not run the express/web server if this is set to 'false' 67 | enabled: false, 68 | // What port to run the express/web server on 69 | port: 8000, 70 | }, 71 | // Twitch API stuff. 72 | twitch: { 73 | clientId: '', 74 | }, 75 | /** 76 | * Partial matches for blacklisting user agent. 77 | * E.g. 'Discordbot' will match any user agent that contains 'Discordbot'. 78 | */ 79 | userAgentBlacklist: ['Discordbot'], 80 | }; 81 | 82 | module.exports = config; 83 | -------------------------------------------------------------------------------- /helpers.js: -------------------------------------------------------------------------------- 1 | const helpers = {}; 2 | 3 | /** 4 | * Formats channel names consistently. 5 | * 6 | * @param {String} channel The channel name to format 7 | * @return {String} 8 | */ 9 | helpers.fmtChannel = (channel) => { 10 | return channel.replace('#', '').toLowerCase(); 11 | }; 12 | 13 | /** 14 | * Returns a new date string of "now" when it's called. 15 | * 16 | * @return {String} 17 | */ 18 | helpers.now = () => { 19 | let date = new Date().toUTCString().split(' '); 20 | date.shift(); 21 | date.pop(); 22 | return date.join(' ') + ' UTC'; 23 | }; 24 | 25 | /** 26 | * Formats the timestamp into a UTC date. 27 | * 28 | * @param {Mixed} timestamp The timestamp to format. 29 | * @return {String} The formatted date. 30 | */ 31 | helpers.formatDate = (timestamp) => { 32 | timestamp = parseInt(timestamp); 33 | 34 | let date = new Date(timestamp).toUTCString().split(' '); 35 | date.shift(); 36 | date.pop(); 37 | 38 | return date.join(' '); 39 | }; 40 | 41 | /** 42 | * Retrieves either the header or query parameter value from the request. 43 | * 44 | * @param {Object} req The request object. 45 | * @param {String} name The name of the header/query parameter. 46 | * @return {Mixed} The value or undefined. 47 | */ 48 | helpers.requestValue = (req, name) => { 49 | return (typeof req.query[name] !== 'undefined' ? req.query[name] : req.get(name)); 50 | }; 51 | 52 | /** 53 | * Returns the proper response based on the input value. 54 | * 55 | * @param {Object} res The express response object. 56 | * @param {Mixed} value The value to send back in the response. 57 | * @return {Mixed} 58 | */ 59 | helpers.response = (res, value) => { 60 | if (typeof value !== 'object') { 61 | res.setHeader('Content-Type', 'text/plain'); 62 | return res.send(value); 63 | } 64 | 65 | return res.json(value); 66 | }; 67 | 68 | module.exports = helpers; 69 | -------------------------------------------------------------------------------- /ignore.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "esl_csgo": ["moobot", "ohbot"], 3 | "monstercat": ["monstercat", "nightbot"], 4 | "twitch": ["moobot", "ohbot"] 5 | } 6 | -------------------------------------------------------------------------------- /index.sample.yaml: -------------------------------------------------------------------------------- 1 | indexes: 2 | 3 | - kind: twitch-log-bot 4 | properties: 5 | - name: channel_id 6 | - name: timestamp 7 | direction: desc 8 | 9 | - kind: twitch-log-bot 10 | properties: 11 | - name: channel_id 12 | - name: user_id 13 | - name: timestamp 14 | direction: desc 15 | 16 | - kind: twitch-log-bot 17 | properties: 18 | - name: user_id 19 | - name: timestamp 20 | direction: desc 21 | 22 | - kind: twitch-log-bot 23 | properties: 24 | - name: channel_id 25 | - name: username 26 | - name: timestamp 27 | direction: desc 28 | 29 | - kind: twitch-log-bot 30 | properties: 31 | - name: username 32 | - name: timestamp 33 | direction: desc 34 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitch-log-bot", 3 | "version": "0.11.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "twitch-log-bot", 9 | "version": "0.11.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@google-cloud/datastore": "^6.1.1", 13 | "express": "^4.17.1", 14 | "request": "^2.88.2", 15 | "swig": "^1.4.2", 16 | "tmi.js": "^1.5.0" 17 | } 18 | }, 19 | "node_modules/@google-cloud/datastore": { 20 | "version": "6.6.2", 21 | "resolved": "https://registry.npmjs.org/@google-cloud/datastore/-/datastore-6.6.2.tgz", 22 | "integrity": "sha512-gQxSusM1gREtUogVqtl/KuoFrstYns8ZxY3guso2Mg2eJ+ygJwWdxXmG23T+aSbzkofh2OF3Mz0p3a+0F9KoPg==", 23 | "dependencies": { 24 | "@google-cloud/promisify": "^2.0.0", 25 | "arrify": "^2.0.1", 26 | "concat-stream": "^2.0.0", 27 | "extend": "^3.0.2", 28 | "google-gax": "^2.24.1", 29 | "is": "^3.3.0", 30 | "split-array-stream": "^2.0.0", 31 | "stream-events": "^1.0.5" 32 | }, 33 | "engines": { 34 | "node": ">=10" 35 | } 36 | }, 37 | "node_modules/@google-cloud/promisify": { 38 | "version": "2.0.4", 39 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", 40 | "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==", 41 | "engines": { 42 | "node": ">=10" 43 | } 44 | }, 45 | "node_modules/@grpc/grpc-js": { 46 | "version": "1.5.7", 47 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", 48 | "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", 49 | "dependencies": { 50 | "@grpc/proto-loader": "^0.6.4", 51 | "@types/node": ">=12.12.47" 52 | }, 53 | "engines": { 54 | "node": "^8.13.0 || >=10.10.0" 55 | } 56 | }, 57 | "node_modules/@grpc/proto-loader": { 58 | "version": "0.6.9", 59 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", 60 | "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", 61 | "dependencies": { 62 | "@types/long": "^4.0.1", 63 | "lodash.camelcase": "^4.3.0", 64 | "long": "^4.0.0", 65 | "protobufjs": "^6.10.0", 66 | "yargs": "^16.2.0" 67 | }, 68 | "bin": { 69 | "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" 70 | }, 71 | "engines": { 72 | "node": ">=6" 73 | } 74 | }, 75 | "node_modules/@protobufjs/aspromise": { 76 | "version": "1.1.2", 77 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 78 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 79 | }, 80 | "node_modules/@protobufjs/base64": { 81 | "version": "1.1.2", 82 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 83 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 84 | }, 85 | "node_modules/@protobufjs/codegen": { 86 | "version": "2.0.4", 87 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 88 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 89 | }, 90 | "node_modules/@protobufjs/eventemitter": { 91 | "version": "1.1.0", 92 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 93 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 94 | }, 95 | "node_modules/@protobufjs/fetch": { 96 | "version": "1.1.0", 97 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 98 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 99 | "dependencies": { 100 | "@protobufjs/aspromise": "^1.1.1", 101 | "@protobufjs/inquire": "^1.1.0" 102 | } 103 | }, 104 | "node_modules/@protobufjs/float": { 105 | "version": "1.0.2", 106 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 107 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 108 | }, 109 | "node_modules/@protobufjs/inquire": { 110 | "version": "1.1.0", 111 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 112 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 113 | }, 114 | "node_modules/@protobufjs/path": { 115 | "version": "1.1.2", 116 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 117 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 118 | }, 119 | "node_modules/@protobufjs/pool": { 120 | "version": "1.1.0", 121 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 122 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 123 | }, 124 | "node_modules/@protobufjs/utf8": { 125 | "version": "1.1.0", 126 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 127 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 128 | }, 129 | "node_modules/@types/long": { 130 | "version": "4.0.1", 131 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 132 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 133 | }, 134 | "node_modules/@types/node": { 135 | "version": "17.0.21", 136 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", 137 | "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" 138 | }, 139 | "node_modules/abort-controller": { 140 | "version": "3.0.0", 141 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 142 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 143 | "dependencies": { 144 | "event-target-shim": "^5.0.0" 145 | }, 146 | "engines": { 147 | "node": ">=6.5" 148 | } 149 | }, 150 | "node_modules/accepts": { 151 | "version": "1.3.8", 152 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 153 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 154 | "dependencies": { 155 | "mime-types": "~2.1.34", 156 | "negotiator": "0.6.3" 157 | }, 158 | "engines": { 159 | "node": ">= 0.6" 160 | } 161 | }, 162 | "node_modules/agent-base": { 163 | "version": "6.0.2", 164 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 165 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 166 | "dependencies": { 167 | "debug": "4" 168 | }, 169 | "engines": { 170 | "node": ">= 6.0.0" 171 | } 172 | }, 173 | "node_modules/agent-base/node_modules/debug": { 174 | "version": "4.3.3", 175 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 176 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 177 | "dependencies": { 178 | "ms": "2.1.2" 179 | }, 180 | "engines": { 181 | "node": ">=6.0" 182 | }, 183 | "peerDependenciesMeta": { 184 | "supports-color": { 185 | "optional": true 186 | } 187 | } 188 | }, 189 | "node_modules/agent-base/node_modules/ms": { 190 | "version": "2.1.2", 191 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 192 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 193 | }, 194 | "node_modules/ajv": { 195 | "version": "6.12.6", 196 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 197 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 198 | "dependencies": { 199 | "fast-deep-equal": "^3.1.1", 200 | "fast-json-stable-stringify": "^2.0.0", 201 | "json-schema-traverse": "^0.4.1", 202 | "uri-js": "^4.2.2" 203 | }, 204 | "funding": { 205 | "type": "github", 206 | "url": "https://github.com/sponsors/epoberezkin" 207 | } 208 | }, 209 | "node_modules/amdefine": { 210 | "version": "1.0.1", 211 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 212 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 213 | "engines": { 214 | "node": ">=0.4.2" 215 | } 216 | }, 217 | "node_modules/ansi-regex": { 218 | "version": "5.0.1", 219 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 220 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 221 | "engines": { 222 | "node": ">=8" 223 | } 224 | }, 225 | "node_modules/ansi-styles": { 226 | "version": "4.3.0", 227 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 228 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 229 | "dependencies": { 230 | "color-convert": "^2.0.1" 231 | }, 232 | "engines": { 233 | "node": ">=8" 234 | }, 235 | "funding": { 236 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 237 | } 238 | }, 239 | "node_modules/array-flatten": { 240 | "version": "1.1.1", 241 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 242 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 243 | }, 244 | "node_modules/arrify": { 245 | "version": "2.0.1", 246 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 247 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", 248 | "engines": { 249 | "node": ">=8" 250 | } 251 | }, 252 | "node_modules/asn1": { 253 | "version": "0.2.6", 254 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 255 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 256 | "dependencies": { 257 | "safer-buffer": "~2.1.0" 258 | } 259 | }, 260 | "node_modules/assert-plus": { 261 | "version": "1.0.0", 262 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 263 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 264 | "engines": { 265 | "node": ">=0.8" 266 | } 267 | }, 268 | "node_modules/async": { 269 | "version": "0.2.10", 270 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 271 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" 272 | }, 273 | "node_modules/asynckit": { 274 | "version": "0.4.0", 275 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 276 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 277 | }, 278 | "node_modules/aws-sign2": { 279 | "version": "0.7.0", 280 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 281 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 282 | "engines": { 283 | "node": "*" 284 | } 285 | }, 286 | "node_modules/aws4": { 287 | "version": "1.11.0", 288 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 289 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 290 | }, 291 | "node_modules/base64-js": { 292 | "version": "1.5.1", 293 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 294 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 295 | "funding": [ 296 | { 297 | "type": "github", 298 | "url": "https://github.com/sponsors/feross" 299 | }, 300 | { 301 | "type": "patreon", 302 | "url": "https://www.patreon.com/feross" 303 | }, 304 | { 305 | "type": "consulting", 306 | "url": "https://feross.org/support" 307 | } 308 | ] 309 | }, 310 | "node_modules/bcrypt-pbkdf": { 311 | "version": "1.0.2", 312 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 313 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 314 | "dependencies": { 315 | "tweetnacl": "^0.14.3" 316 | } 317 | }, 318 | "node_modules/bignumber.js": { 319 | "version": "9.0.2", 320 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", 321 | "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", 322 | "engines": { 323 | "node": "*" 324 | } 325 | }, 326 | "node_modules/body-parser": { 327 | "version": "1.19.2", 328 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", 329 | "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", 330 | "dependencies": { 331 | "bytes": "3.1.2", 332 | "content-type": "~1.0.4", 333 | "debug": "2.6.9", 334 | "depd": "~1.1.2", 335 | "http-errors": "1.8.1", 336 | "iconv-lite": "0.4.24", 337 | "on-finished": "~2.3.0", 338 | "qs": "6.9.7", 339 | "raw-body": "2.4.3", 340 | "type-is": "~1.6.18" 341 | }, 342 | "engines": { 343 | "node": ">= 0.8" 344 | } 345 | }, 346 | "node_modules/buffer-equal-constant-time": { 347 | "version": "1.0.1", 348 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 349 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 350 | }, 351 | "node_modules/buffer-from": { 352 | "version": "1.1.2", 353 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 354 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 355 | }, 356 | "node_modules/bytes": { 357 | "version": "3.1.2", 358 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 359 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 360 | "engines": { 361 | "node": ">= 0.8" 362 | } 363 | }, 364 | "node_modules/camelcase": { 365 | "version": "1.2.1", 366 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 367 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 368 | "engines": { 369 | "node": ">=0.10.0" 370 | } 371 | }, 372 | "node_modules/caseless": { 373 | "version": "0.12.0", 374 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 375 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 376 | }, 377 | "node_modules/cliui": { 378 | "version": "7.0.4", 379 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 380 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 381 | "dependencies": { 382 | "string-width": "^4.2.0", 383 | "strip-ansi": "^6.0.0", 384 | "wrap-ansi": "^7.0.0" 385 | } 386 | }, 387 | "node_modules/color-convert": { 388 | "version": "2.0.1", 389 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 390 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 391 | "dependencies": { 392 | "color-name": "~1.1.4" 393 | }, 394 | "engines": { 395 | "node": ">=7.0.0" 396 | } 397 | }, 398 | "node_modules/color-name": { 399 | "version": "1.1.4", 400 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 401 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 402 | }, 403 | "node_modules/combined-stream": { 404 | "version": "1.0.8", 405 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 406 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 407 | "dependencies": { 408 | "delayed-stream": "~1.0.0" 409 | }, 410 | "engines": { 411 | "node": ">= 0.8" 412 | } 413 | }, 414 | "node_modules/concat-stream": { 415 | "version": "2.0.0", 416 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 417 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 418 | "engines": [ 419 | "node >= 6.0" 420 | ], 421 | "dependencies": { 422 | "buffer-from": "^1.0.0", 423 | "inherits": "^2.0.3", 424 | "readable-stream": "^3.0.2", 425 | "typedarray": "^0.0.6" 426 | } 427 | }, 428 | "node_modules/content-disposition": { 429 | "version": "0.5.4", 430 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 431 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 432 | "dependencies": { 433 | "safe-buffer": "5.2.1" 434 | }, 435 | "engines": { 436 | "node": ">= 0.6" 437 | } 438 | }, 439 | "node_modules/content-type": { 440 | "version": "1.0.4", 441 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 442 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 443 | "engines": { 444 | "node": ">= 0.6" 445 | } 446 | }, 447 | "node_modules/cookie": { 448 | "version": "0.4.2", 449 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 450 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", 451 | "engines": { 452 | "node": ">= 0.6" 453 | } 454 | }, 455 | "node_modules/cookie-signature": { 456 | "version": "1.0.6", 457 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 458 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 459 | }, 460 | "node_modules/core-util-is": { 461 | "version": "1.0.2", 462 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 463 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 464 | }, 465 | "node_modules/dashdash": { 466 | "version": "1.14.1", 467 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 468 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 469 | "dependencies": { 470 | "assert-plus": "^1.0.0" 471 | }, 472 | "engines": { 473 | "node": ">=0.10" 474 | } 475 | }, 476 | "node_modules/debug": { 477 | "version": "2.6.9", 478 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 479 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 480 | "dependencies": { 481 | "ms": "2.0.0" 482 | } 483 | }, 484 | "node_modules/decamelize": { 485 | "version": "1.2.0", 486 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 487 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 488 | "engines": { 489 | "node": ">=0.10.0" 490 | } 491 | }, 492 | "node_modules/delayed-stream": { 493 | "version": "1.0.0", 494 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 495 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 496 | "engines": { 497 | "node": ">=0.4.0" 498 | } 499 | }, 500 | "node_modules/depd": { 501 | "version": "1.1.2", 502 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 503 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 504 | "engines": { 505 | "node": ">= 0.6" 506 | } 507 | }, 508 | "node_modules/destroy": { 509 | "version": "1.0.4", 510 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 511 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 512 | }, 513 | "node_modules/duplexify": { 514 | "version": "4.1.2", 515 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", 516 | "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", 517 | "dependencies": { 518 | "end-of-stream": "^1.4.1", 519 | "inherits": "^2.0.3", 520 | "readable-stream": "^3.1.1", 521 | "stream-shift": "^1.0.0" 522 | } 523 | }, 524 | "node_modules/ecc-jsbn": { 525 | "version": "0.1.2", 526 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 527 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 528 | "dependencies": { 529 | "jsbn": "~0.1.0", 530 | "safer-buffer": "^2.1.0" 531 | } 532 | }, 533 | "node_modules/ecdsa-sig-formatter": { 534 | "version": "1.0.11", 535 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 536 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 537 | "dependencies": { 538 | "safe-buffer": "^5.0.1" 539 | } 540 | }, 541 | "node_modules/ee-first": { 542 | "version": "1.1.1", 543 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 544 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 545 | }, 546 | "node_modules/emoji-regex": { 547 | "version": "8.0.0", 548 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 549 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 550 | }, 551 | "node_modules/encodeurl": { 552 | "version": "1.0.2", 553 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 554 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 555 | "engines": { 556 | "node": ">= 0.8" 557 | } 558 | }, 559 | "node_modules/end-of-stream": { 560 | "version": "1.4.4", 561 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 562 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 563 | "dependencies": { 564 | "once": "^1.4.0" 565 | } 566 | }, 567 | "node_modules/escalade": { 568 | "version": "3.1.1", 569 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 570 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 571 | "engines": { 572 | "node": ">=6" 573 | } 574 | }, 575 | "node_modules/escape-html": { 576 | "version": "1.0.3", 577 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 578 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 579 | }, 580 | "node_modules/etag": { 581 | "version": "1.8.1", 582 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 583 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 584 | "engines": { 585 | "node": ">= 0.6" 586 | } 587 | }, 588 | "node_modules/event-target-shim": { 589 | "version": "5.0.1", 590 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 591 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 592 | "engines": { 593 | "node": ">=6" 594 | } 595 | }, 596 | "node_modules/express": { 597 | "version": "4.17.3", 598 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", 599 | "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", 600 | "dependencies": { 601 | "accepts": "~1.3.8", 602 | "array-flatten": "1.1.1", 603 | "body-parser": "1.19.2", 604 | "content-disposition": "0.5.4", 605 | "content-type": "~1.0.4", 606 | "cookie": "0.4.2", 607 | "cookie-signature": "1.0.6", 608 | "debug": "2.6.9", 609 | "depd": "~1.1.2", 610 | "encodeurl": "~1.0.2", 611 | "escape-html": "~1.0.3", 612 | "etag": "~1.8.1", 613 | "finalhandler": "~1.1.2", 614 | "fresh": "0.5.2", 615 | "merge-descriptors": "1.0.1", 616 | "methods": "~1.1.2", 617 | "on-finished": "~2.3.0", 618 | "parseurl": "~1.3.3", 619 | "path-to-regexp": "0.1.7", 620 | "proxy-addr": "~2.0.7", 621 | "qs": "6.9.7", 622 | "range-parser": "~1.2.1", 623 | "safe-buffer": "5.2.1", 624 | "send": "0.17.2", 625 | "serve-static": "1.14.2", 626 | "setprototypeof": "1.2.0", 627 | "statuses": "~1.5.0", 628 | "type-is": "~1.6.18", 629 | "utils-merge": "1.0.1", 630 | "vary": "~1.1.2" 631 | }, 632 | "engines": { 633 | "node": ">= 0.10.0" 634 | } 635 | }, 636 | "node_modules/extend": { 637 | "version": "3.0.2", 638 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 639 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 640 | }, 641 | "node_modules/extsprintf": { 642 | "version": "1.3.0", 643 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 644 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 645 | "engines": [ 646 | "node >=0.6.0" 647 | ] 648 | }, 649 | "node_modules/fast-deep-equal": { 650 | "version": "3.1.3", 651 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 652 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 653 | }, 654 | "node_modules/fast-json-stable-stringify": { 655 | "version": "2.1.0", 656 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 657 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 658 | }, 659 | "node_modules/fast-text-encoding": { 660 | "version": "1.0.3", 661 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", 662 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" 663 | }, 664 | "node_modules/finalhandler": { 665 | "version": "1.1.2", 666 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 667 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 668 | "dependencies": { 669 | "debug": "2.6.9", 670 | "encodeurl": "~1.0.2", 671 | "escape-html": "~1.0.3", 672 | "on-finished": "~2.3.0", 673 | "parseurl": "~1.3.3", 674 | "statuses": "~1.5.0", 675 | "unpipe": "~1.0.0" 676 | }, 677 | "engines": { 678 | "node": ">= 0.8" 679 | } 680 | }, 681 | "node_modules/forever-agent": { 682 | "version": "0.6.1", 683 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 684 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 685 | "engines": { 686 | "node": "*" 687 | } 688 | }, 689 | "node_modules/form-data": { 690 | "version": "2.3.3", 691 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 692 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 693 | "dependencies": { 694 | "asynckit": "^0.4.0", 695 | "combined-stream": "^1.0.6", 696 | "mime-types": "^2.1.12" 697 | }, 698 | "engines": { 699 | "node": ">= 0.12" 700 | } 701 | }, 702 | "node_modules/forwarded": { 703 | "version": "0.2.0", 704 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 705 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 706 | "engines": { 707 | "node": ">= 0.6" 708 | } 709 | }, 710 | "node_modules/fresh": { 711 | "version": "0.5.2", 712 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 713 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 714 | "engines": { 715 | "node": ">= 0.6" 716 | } 717 | }, 718 | "node_modules/gaxios": { 719 | "version": "4.3.2", 720 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", 721 | "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", 722 | "dependencies": { 723 | "abort-controller": "^3.0.0", 724 | "extend": "^3.0.2", 725 | "https-proxy-agent": "^5.0.0", 726 | "is-stream": "^2.0.0", 727 | "node-fetch": "^2.6.1" 728 | }, 729 | "engines": { 730 | "node": ">=10" 731 | } 732 | }, 733 | "node_modules/gcp-metadata": { 734 | "version": "4.3.1", 735 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", 736 | "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", 737 | "dependencies": { 738 | "gaxios": "^4.0.0", 739 | "json-bigint": "^1.0.0" 740 | }, 741 | "engines": { 742 | "node": ">=10" 743 | } 744 | }, 745 | "node_modules/get-caller-file": { 746 | "version": "2.0.5", 747 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 748 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 749 | "engines": { 750 | "node": "6.* || 8.* || >= 10.*" 751 | } 752 | }, 753 | "node_modules/getpass": { 754 | "version": "0.1.7", 755 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 756 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 757 | "dependencies": { 758 | "assert-plus": "^1.0.0" 759 | } 760 | }, 761 | "node_modules/google-auth-library": { 762 | "version": "7.14.0", 763 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.0.tgz", 764 | "integrity": "sha512-or8r7qUqGVI3W8lVSdPh0ZpeFyQHeE73g5c0p+bLNTTUFXJ+GSeDQmZRZ2p4H8cF/RJYa4PNvi/A1ar1uVNLFA==", 765 | "dependencies": { 766 | "arrify": "^2.0.0", 767 | "base64-js": "^1.3.0", 768 | "ecdsa-sig-formatter": "^1.0.11", 769 | "fast-text-encoding": "^1.0.0", 770 | "gaxios": "^4.0.0", 771 | "gcp-metadata": "^4.2.0", 772 | "gtoken": "^5.0.4", 773 | "jws": "^4.0.0", 774 | "lru-cache": "^6.0.0" 775 | }, 776 | "engines": { 777 | "node": ">=10" 778 | } 779 | }, 780 | "node_modules/google-gax": { 781 | "version": "2.30.0", 782 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.30.0.tgz", 783 | "integrity": "sha512-JcZGDuSOzhPwOJfbK80cyyGLZkrlLBTiwfqrW46sC0I9h3FtFmbN7FwIQ3PHreYiE6iVK4InfEZiTp4laOmPfA==", 784 | "dependencies": { 785 | "@grpc/grpc-js": "~1.5.0", 786 | "@grpc/proto-loader": "^0.6.1", 787 | "@types/long": "^4.0.0", 788 | "abort-controller": "^3.0.0", 789 | "duplexify": "^4.0.0", 790 | "fast-text-encoding": "^1.0.3", 791 | "google-auth-library": "^7.14.0", 792 | "is-stream-ended": "^0.1.4", 793 | "node-fetch": "^2.6.1", 794 | "object-hash": "^3.0.0", 795 | "proto3-json-serializer": "^0.1.8", 796 | "protobufjs": "6.11.2", 797 | "retry-request": "^4.0.0" 798 | }, 799 | "bin": { 800 | "compileProtos": "build/tools/compileProtos.js" 801 | }, 802 | "engines": { 803 | "node": ">=10" 804 | } 805 | }, 806 | "node_modules/google-p12-pem": { 807 | "version": "3.1.3", 808 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", 809 | "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", 810 | "dependencies": { 811 | "node-forge": "^1.0.0" 812 | }, 813 | "bin": { 814 | "gp12-pem": "build/src/bin/gp12-pem.js" 815 | }, 816 | "engines": { 817 | "node": ">=10" 818 | } 819 | }, 820 | "node_modules/gtoken": { 821 | "version": "5.3.2", 822 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz", 823 | "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==", 824 | "dependencies": { 825 | "gaxios": "^4.0.0", 826 | "google-p12-pem": "^3.1.3", 827 | "jws": "^4.0.0" 828 | }, 829 | "engines": { 830 | "node": ">=10" 831 | } 832 | }, 833 | "node_modules/har-schema": { 834 | "version": "2.0.0", 835 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 836 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 837 | "engines": { 838 | "node": ">=4" 839 | } 840 | }, 841 | "node_modules/har-validator": { 842 | "version": "5.1.5", 843 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 844 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 845 | "deprecated": "this library is no longer supported", 846 | "dependencies": { 847 | "ajv": "^6.12.3", 848 | "har-schema": "^2.0.0" 849 | }, 850 | "engines": { 851 | "node": ">=6" 852 | } 853 | }, 854 | "node_modules/http-errors": { 855 | "version": "1.8.1", 856 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 857 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 858 | "dependencies": { 859 | "depd": "~1.1.2", 860 | "inherits": "2.0.4", 861 | "setprototypeof": "1.2.0", 862 | "statuses": ">= 1.5.0 < 2", 863 | "toidentifier": "1.0.1" 864 | }, 865 | "engines": { 866 | "node": ">= 0.6" 867 | } 868 | }, 869 | "node_modules/http-signature": { 870 | "version": "1.2.0", 871 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 872 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 873 | "dependencies": { 874 | "assert-plus": "^1.0.0", 875 | "jsprim": "^1.2.2", 876 | "sshpk": "^1.7.0" 877 | }, 878 | "engines": { 879 | "node": ">=0.8", 880 | "npm": ">=1.3.7" 881 | } 882 | }, 883 | "node_modules/https-proxy-agent": { 884 | "version": "5.0.0", 885 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 886 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 887 | "dependencies": { 888 | "agent-base": "6", 889 | "debug": "4" 890 | }, 891 | "engines": { 892 | "node": ">= 6" 893 | } 894 | }, 895 | "node_modules/https-proxy-agent/node_modules/debug": { 896 | "version": "4.3.3", 897 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 898 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 899 | "dependencies": { 900 | "ms": "2.1.2" 901 | }, 902 | "engines": { 903 | "node": ">=6.0" 904 | }, 905 | "peerDependenciesMeta": { 906 | "supports-color": { 907 | "optional": true 908 | } 909 | } 910 | }, 911 | "node_modules/https-proxy-agent/node_modules/ms": { 912 | "version": "2.1.2", 913 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 914 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 915 | }, 916 | "node_modules/iconv-lite": { 917 | "version": "0.4.24", 918 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 919 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 920 | "dependencies": { 921 | "safer-buffer": ">= 2.1.2 < 3" 922 | }, 923 | "engines": { 924 | "node": ">=0.10.0" 925 | } 926 | }, 927 | "node_modules/inherits": { 928 | "version": "2.0.4", 929 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 930 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 931 | }, 932 | "node_modules/ipaddr.js": { 933 | "version": "1.9.1", 934 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 935 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 936 | "engines": { 937 | "node": ">= 0.10" 938 | } 939 | }, 940 | "node_modules/is": { 941 | "version": "3.3.0", 942 | "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", 943 | "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", 944 | "engines": { 945 | "node": "*" 946 | } 947 | }, 948 | "node_modules/is-fullwidth-code-point": { 949 | "version": "3.0.0", 950 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 951 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 952 | "engines": { 953 | "node": ">=8" 954 | } 955 | }, 956 | "node_modules/is-stream": { 957 | "version": "2.0.1", 958 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 959 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 960 | "engines": { 961 | "node": ">=8" 962 | }, 963 | "funding": { 964 | "url": "https://github.com/sponsors/sindresorhus" 965 | } 966 | }, 967 | "node_modules/is-stream-ended": { 968 | "version": "0.1.4", 969 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 970 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" 971 | }, 972 | "node_modules/is-typedarray": { 973 | "version": "1.0.0", 974 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 975 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 976 | }, 977 | "node_modules/isstream": { 978 | "version": "0.1.2", 979 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 980 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 981 | }, 982 | "node_modules/jsbn": { 983 | "version": "0.1.1", 984 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 985 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 986 | }, 987 | "node_modules/json-bigint": { 988 | "version": "1.0.0", 989 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 990 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 991 | "dependencies": { 992 | "bignumber.js": "^9.0.0" 993 | } 994 | }, 995 | "node_modules/json-schema": { 996 | "version": "0.4.0", 997 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 998 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 999 | }, 1000 | "node_modules/json-schema-traverse": { 1001 | "version": "0.4.1", 1002 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1003 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1004 | }, 1005 | "node_modules/json-stringify-safe": { 1006 | "version": "5.0.1", 1007 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1008 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1009 | }, 1010 | "node_modules/jsprim": { 1011 | "version": "1.4.2", 1012 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 1013 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 1014 | "dependencies": { 1015 | "assert-plus": "1.0.0", 1016 | "extsprintf": "1.3.0", 1017 | "json-schema": "0.4.0", 1018 | "verror": "1.10.0" 1019 | }, 1020 | "engines": { 1021 | "node": ">=0.6.0" 1022 | } 1023 | }, 1024 | "node_modules/jwa": { 1025 | "version": "2.0.0", 1026 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 1027 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 1028 | "dependencies": { 1029 | "buffer-equal-constant-time": "1.0.1", 1030 | "ecdsa-sig-formatter": "1.0.11", 1031 | "safe-buffer": "^5.0.1" 1032 | } 1033 | }, 1034 | "node_modules/jws": { 1035 | "version": "4.0.0", 1036 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 1037 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 1038 | "dependencies": { 1039 | "jwa": "^2.0.0", 1040 | "safe-buffer": "^5.0.1" 1041 | } 1042 | }, 1043 | "node_modules/lodash.camelcase": { 1044 | "version": "4.3.0", 1045 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1046 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 1047 | }, 1048 | "node_modules/long": { 1049 | "version": "4.0.0", 1050 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1051 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1052 | }, 1053 | "node_modules/lru-cache": { 1054 | "version": "6.0.0", 1055 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1056 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1057 | "dependencies": { 1058 | "yallist": "^4.0.0" 1059 | }, 1060 | "engines": { 1061 | "node": ">=10" 1062 | } 1063 | }, 1064 | "node_modules/media-typer": { 1065 | "version": "0.3.0", 1066 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1067 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 1068 | "engines": { 1069 | "node": ">= 0.6" 1070 | } 1071 | }, 1072 | "node_modules/merge-descriptors": { 1073 | "version": "1.0.1", 1074 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1075 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1076 | }, 1077 | "node_modules/methods": { 1078 | "version": "1.1.2", 1079 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1080 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 1081 | "engines": { 1082 | "node": ">= 0.6" 1083 | } 1084 | }, 1085 | "node_modules/mime": { 1086 | "version": "1.6.0", 1087 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1088 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1089 | "bin": { 1090 | "mime": "cli.js" 1091 | }, 1092 | "engines": { 1093 | "node": ">=4" 1094 | } 1095 | }, 1096 | "node_modules/mime-db": { 1097 | "version": "1.51.0", 1098 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 1099 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 1100 | "engines": { 1101 | "node": ">= 0.6" 1102 | } 1103 | }, 1104 | "node_modules/mime-types": { 1105 | "version": "2.1.34", 1106 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 1107 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 1108 | "dependencies": { 1109 | "mime-db": "1.51.0" 1110 | }, 1111 | "engines": { 1112 | "node": ">= 0.6" 1113 | } 1114 | }, 1115 | "node_modules/minimist": { 1116 | "version": "0.0.10", 1117 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1118 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 1119 | }, 1120 | "node_modules/ms": { 1121 | "version": "2.0.0", 1122 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1123 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1124 | }, 1125 | "node_modules/negotiator": { 1126 | "version": "0.6.3", 1127 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1128 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1129 | "engines": { 1130 | "node": ">= 0.6" 1131 | } 1132 | }, 1133 | "node_modules/node-fetch": { 1134 | "version": "2.6.7", 1135 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1136 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1137 | "dependencies": { 1138 | "whatwg-url": "^5.0.0" 1139 | }, 1140 | "engines": { 1141 | "node": "4.x || >=6.0.0" 1142 | }, 1143 | "peerDependencies": { 1144 | "encoding": "^0.1.0" 1145 | }, 1146 | "peerDependenciesMeta": { 1147 | "encoding": { 1148 | "optional": true 1149 | } 1150 | } 1151 | }, 1152 | "node_modules/node-forge": { 1153 | "version": "1.2.1", 1154 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", 1155 | "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", 1156 | "engines": { 1157 | "node": ">= 6.13.0" 1158 | } 1159 | }, 1160 | "node_modules/oauth-sign": { 1161 | "version": "0.9.0", 1162 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1163 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1164 | "engines": { 1165 | "node": "*" 1166 | } 1167 | }, 1168 | "node_modules/object-hash": { 1169 | "version": "3.0.0", 1170 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1171 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1172 | "engines": { 1173 | "node": ">= 6" 1174 | } 1175 | }, 1176 | "node_modules/on-finished": { 1177 | "version": "2.3.0", 1178 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1179 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1180 | "dependencies": { 1181 | "ee-first": "1.1.1" 1182 | }, 1183 | "engines": { 1184 | "node": ">= 0.8" 1185 | } 1186 | }, 1187 | "node_modules/once": { 1188 | "version": "1.4.0", 1189 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1190 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1191 | "dependencies": { 1192 | "wrappy": "1" 1193 | } 1194 | }, 1195 | "node_modules/optimist": { 1196 | "version": "0.6.1", 1197 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1198 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1199 | "dependencies": { 1200 | "minimist": "~0.0.1", 1201 | "wordwrap": "~0.0.2" 1202 | } 1203 | }, 1204 | "node_modules/parseurl": { 1205 | "version": "1.3.3", 1206 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1207 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1208 | "engines": { 1209 | "node": ">= 0.8" 1210 | } 1211 | }, 1212 | "node_modules/path-to-regexp": { 1213 | "version": "0.1.7", 1214 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1215 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1216 | }, 1217 | "node_modules/performance-now": { 1218 | "version": "2.1.0", 1219 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1220 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1221 | }, 1222 | "node_modules/proto3-json-serializer": { 1223 | "version": "0.1.8", 1224 | "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.8.tgz", 1225 | "integrity": "sha512-ACilkB6s1U1gWnl5jtICpnDai4VCxmI9GFxuEaYdxtDG2oVI3sVFIUsvUZcQbJgtPM6p+zqKbjTKQZp6Y4FpQw==", 1226 | "dependencies": { 1227 | "protobufjs": "^6.11.2" 1228 | } 1229 | }, 1230 | "node_modules/protobufjs": { 1231 | "version": "6.11.2", 1232 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", 1233 | "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", 1234 | "hasInstallScript": true, 1235 | "dependencies": { 1236 | "@protobufjs/aspromise": "^1.1.2", 1237 | "@protobufjs/base64": "^1.1.2", 1238 | "@protobufjs/codegen": "^2.0.4", 1239 | "@protobufjs/eventemitter": "^1.1.0", 1240 | "@protobufjs/fetch": "^1.1.0", 1241 | "@protobufjs/float": "^1.0.2", 1242 | "@protobufjs/inquire": "^1.1.0", 1243 | "@protobufjs/path": "^1.1.2", 1244 | "@protobufjs/pool": "^1.1.0", 1245 | "@protobufjs/utf8": "^1.1.0", 1246 | "@types/long": "^4.0.1", 1247 | "@types/node": ">=13.7.0", 1248 | "long": "^4.0.0" 1249 | }, 1250 | "bin": { 1251 | "pbjs": "bin/pbjs", 1252 | "pbts": "bin/pbts" 1253 | } 1254 | }, 1255 | "node_modules/proxy-addr": { 1256 | "version": "2.0.7", 1257 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1258 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1259 | "dependencies": { 1260 | "forwarded": "0.2.0", 1261 | "ipaddr.js": "1.9.1" 1262 | }, 1263 | "engines": { 1264 | "node": ">= 0.10" 1265 | } 1266 | }, 1267 | "node_modules/psl": { 1268 | "version": "1.8.0", 1269 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1270 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1271 | }, 1272 | "node_modules/punycode": { 1273 | "version": "2.1.1", 1274 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1275 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1276 | "engines": { 1277 | "node": ">=6" 1278 | } 1279 | }, 1280 | "node_modules/qs": { 1281 | "version": "6.9.7", 1282 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", 1283 | "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", 1284 | "engines": { 1285 | "node": ">=0.6" 1286 | }, 1287 | "funding": { 1288 | "url": "https://github.com/sponsors/ljharb" 1289 | } 1290 | }, 1291 | "node_modules/range-parser": { 1292 | "version": "1.2.1", 1293 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1294 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1295 | "engines": { 1296 | "node": ">= 0.6" 1297 | } 1298 | }, 1299 | "node_modules/raw-body": { 1300 | "version": "2.4.3", 1301 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", 1302 | "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", 1303 | "dependencies": { 1304 | "bytes": "3.1.2", 1305 | "http-errors": "1.8.1", 1306 | "iconv-lite": "0.4.24", 1307 | "unpipe": "1.0.0" 1308 | }, 1309 | "engines": { 1310 | "node": ">= 0.8" 1311 | } 1312 | }, 1313 | "node_modules/readable-stream": { 1314 | "version": "3.6.0", 1315 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1316 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1317 | "dependencies": { 1318 | "inherits": "^2.0.3", 1319 | "string_decoder": "^1.1.1", 1320 | "util-deprecate": "^1.0.1" 1321 | }, 1322 | "engines": { 1323 | "node": ">= 6" 1324 | } 1325 | }, 1326 | "node_modules/request": { 1327 | "version": "2.88.2", 1328 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1329 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1330 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", 1331 | "dependencies": { 1332 | "aws-sign2": "~0.7.0", 1333 | "aws4": "^1.8.0", 1334 | "caseless": "~0.12.0", 1335 | "combined-stream": "~1.0.6", 1336 | "extend": "~3.0.2", 1337 | "forever-agent": "~0.6.1", 1338 | "form-data": "~2.3.2", 1339 | "har-validator": "~5.1.3", 1340 | "http-signature": "~1.2.0", 1341 | "is-typedarray": "~1.0.0", 1342 | "isstream": "~0.1.2", 1343 | "json-stringify-safe": "~5.0.1", 1344 | "mime-types": "~2.1.19", 1345 | "oauth-sign": "~0.9.0", 1346 | "performance-now": "^2.1.0", 1347 | "qs": "~6.5.2", 1348 | "safe-buffer": "^5.1.2", 1349 | "tough-cookie": "~2.5.0", 1350 | "tunnel-agent": "^0.6.0", 1351 | "uuid": "^3.3.2" 1352 | }, 1353 | "engines": { 1354 | "node": ">= 6" 1355 | } 1356 | }, 1357 | "node_modules/request/node_modules/qs": { 1358 | "version": "6.5.3", 1359 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 1360 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 1361 | "engines": { 1362 | "node": ">=0.6" 1363 | } 1364 | }, 1365 | "node_modules/require-directory": { 1366 | "version": "2.1.1", 1367 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1368 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1369 | "engines": { 1370 | "node": ">=0.10.0" 1371 | } 1372 | }, 1373 | "node_modules/retry-request": { 1374 | "version": "4.2.2", 1375 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", 1376 | "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", 1377 | "dependencies": { 1378 | "debug": "^4.1.1", 1379 | "extend": "^3.0.2" 1380 | }, 1381 | "engines": { 1382 | "node": ">=8.10.0" 1383 | } 1384 | }, 1385 | "node_modules/retry-request/node_modules/debug": { 1386 | "version": "4.3.3", 1387 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 1388 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 1389 | "dependencies": { 1390 | "ms": "2.1.2" 1391 | }, 1392 | "engines": { 1393 | "node": ">=6.0" 1394 | }, 1395 | "peerDependenciesMeta": { 1396 | "supports-color": { 1397 | "optional": true 1398 | } 1399 | } 1400 | }, 1401 | "node_modules/retry-request/node_modules/ms": { 1402 | "version": "2.1.2", 1403 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1404 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1405 | }, 1406 | "node_modules/safe-buffer": { 1407 | "version": "5.2.1", 1408 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1409 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1410 | "funding": [ 1411 | { 1412 | "type": "github", 1413 | "url": "https://github.com/sponsors/feross" 1414 | }, 1415 | { 1416 | "type": "patreon", 1417 | "url": "https://www.patreon.com/feross" 1418 | }, 1419 | { 1420 | "type": "consulting", 1421 | "url": "https://feross.org/support" 1422 | } 1423 | ] 1424 | }, 1425 | "node_modules/safer-buffer": { 1426 | "version": "2.1.2", 1427 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1428 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1429 | }, 1430 | "node_modules/send": { 1431 | "version": "0.17.2", 1432 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 1433 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 1434 | "dependencies": { 1435 | "debug": "2.6.9", 1436 | "depd": "~1.1.2", 1437 | "destroy": "~1.0.4", 1438 | "encodeurl": "~1.0.2", 1439 | "escape-html": "~1.0.3", 1440 | "etag": "~1.8.1", 1441 | "fresh": "0.5.2", 1442 | "http-errors": "1.8.1", 1443 | "mime": "1.6.0", 1444 | "ms": "2.1.3", 1445 | "on-finished": "~2.3.0", 1446 | "range-parser": "~1.2.1", 1447 | "statuses": "~1.5.0" 1448 | }, 1449 | "engines": { 1450 | "node": ">= 0.8.0" 1451 | } 1452 | }, 1453 | "node_modules/send/node_modules/ms": { 1454 | "version": "2.1.3", 1455 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1456 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1457 | }, 1458 | "node_modules/serve-static": { 1459 | "version": "1.14.2", 1460 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 1461 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 1462 | "dependencies": { 1463 | "encodeurl": "~1.0.2", 1464 | "escape-html": "~1.0.3", 1465 | "parseurl": "~1.3.3", 1466 | "send": "0.17.2" 1467 | }, 1468 | "engines": { 1469 | "node": ">= 0.8.0" 1470 | } 1471 | }, 1472 | "node_modules/setprototypeof": { 1473 | "version": "1.2.0", 1474 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1475 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1476 | }, 1477 | "node_modules/source-map": { 1478 | "version": "0.1.34", 1479 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", 1480 | "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", 1481 | "dependencies": { 1482 | "amdefine": ">=0.0.4" 1483 | }, 1484 | "engines": { 1485 | "node": ">=0.8.0" 1486 | } 1487 | }, 1488 | "node_modules/split-array-stream": { 1489 | "version": "2.0.0", 1490 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", 1491 | "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", 1492 | "dependencies": { 1493 | "is-stream-ended": "^0.1.4" 1494 | } 1495 | }, 1496 | "node_modules/sshpk": { 1497 | "version": "1.17.0", 1498 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", 1499 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", 1500 | "dependencies": { 1501 | "asn1": "~0.2.3", 1502 | "assert-plus": "^1.0.0", 1503 | "bcrypt-pbkdf": "^1.0.0", 1504 | "dashdash": "^1.12.0", 1505 | "ecc-jsbn": "~0.1.1", 1506 | "getpass": "^0.1.1", 1507 | "jsbn": "~0.1.0", 1508 | "safer-buffer": "^2.0.2", 1509 | "tweetnacl": "~0.14.0" 1510 | }, 1511 | "bin": { 1512 | "sshpk-conv": "bin/sshpk-conv", 1513 | "sshpk-sign": "bin/sshpk-sign", 1514 | "sshpk-verify": "bin/sshpk-verify" 1515 | }, 1516 | "engines": { 1517 | "node": ">=0.10.0" 1518 | } 1519 | }, 1520 | "node_modules/statuses": { 1521 | "version": "1.5.0", 1522 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1523 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1524 | "engines": { 1525 | "node": ">= 0.6" 1526 | } 1527 | }, 1528 | "node_modules/stream-events": { 1529 | "version": "1.0.5", 1530 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 1531 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 1532 | "dependencies": { 1533 | "stubs": "^3.0.0" 1534 | } 1535 | }, 1536 | "node_modules/stream-shift": { 1537 | "version": "1.0.1", 1538 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1539 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 1540 | }, 1541 | "node_modules/string_decoder": { 1542 | "version": "1.3.0", 1543 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1544 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1545 | "dependencies": { 1546 | "safe-buffer": "~5.2.0" 1547 | } 1548 | }, 1549 | "node_modules/string-width": { 1550 | "version": "4.2.3", 1551 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1552 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1553 | "dependencies": { 1554 | "emoji-regex": "^8.0.0", 1555 | "is-fullwidth-code-point": "^3.0.0", 1556 | "strip-ansi": "^6.0.1" 1557 | }, 1558 | "engines": { 1559 | "node": ">=8" 1560 | } 1561 | }, 1562 | "node_modules/strip-ansi": { 1563 | "version": "6.0.1", 1564 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1565 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1566 | "dependencies": { 1567 | "ansi-regex": "^5.0.1" 1568 | }, 1569 | "engines": { 1570 | "node": ">=8" 1571 | } 1572 | }, 1573 | "node_modules/stubs": { 1574 | "version": "3.0.0", 1575 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 1576 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" 1577 | }, 1578 | "node_modules/swig": { 1579 | "version": "1.4.2", 1580 | "resolved": "https://registry.npmjs.org/swig/-/swig-1.4.2.tgz", 1581 | "integrity": "sha1-QIXKBFM2kQS11IPihBs5t64aq6U=", 1582 | "deprecated": "This package is no longer maintained", 1583 | "dependencies": { 1584 | "optimist": "~0.6", 1585 | "uglify-js": "~2.4" 1586 | }, 1587 | "bin": { 1588 | "swig": "bin/swig.js" 1589 | }, 1590 | "engines": { 1591 | "node": ">=0.10.0" 1592 | } 1593 | }, 1594 | "node_modules/tmi.js": { 1595 | "version": "1.8.5", 1596 | "resolved": "https://registry.npmjs.org/tmi.js/-/tmi.js-1.8.5.tgz", 1597 | "integrity": "sha512-A9qrydfe1e0VWM9MViVhhxVgvLpnk7pFShVUWePsSTtoi+A1X+Zjdoa7OJd7/YsgHXGj3GkNEvnWop/1WwZuew==", 1598 | "dependencies": { 1599 | "node-fetch": "^2.6.1", 1600 | "ws": "^8.2.0" 1601 | }, 1602 | "engines": { 1603 | "node": ">=10.0.0" 1604 | } 1605 | }, 1606 | "node_modules/toidentifier": { 1607 | "version": "1.0.1", 1608 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1609 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1610 | "engines": { 1611 | "node": ">=0.6" 1612 | } 1613 | }, 1614 | "node_modules/tough-cookie": { 1615 | "version": "2.5.0", 1616 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1617 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1618 | "dependencies": { 1619 | "psl": "^1.1.28", 1620 | "punycode": "^2.1.1" 1621 | }, 1622 | "engines": { 1623 | "node": ">=0.8" 1624 | } 1625 | }, 1626 | "node_modules/tr46": { 1627 | "version": "0.0.3", 1628 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1629 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1630 | }, 1631 | "node_modules/tunnel-agent": { 1632 | "version": "0.6.0", 1633 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1634 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1635 | "dependencies": { 1636 | "safe-buffer": "^5.0.1" 1637 | }, 1638 | "engines": { 1639 | "node": "*" 1640 | } 1641 | }, 1642 | "node_modules/tweetnacl": { 1643 | "version": "0.14.5", 1644 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1645 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1646 | }, 1647 | "node_modules/type-is": { 1648 | "version": "1.6.18", 1649 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1650 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1651 | "dependencies": { 1652 | "media-typer": "0.3.0", 1653 | "mime-types": "~2.1.24" 1654 | }, 1655 | "engines": { 1656 | "node": ">= 0.6" 1657 | } 1658 | }, 1659 | "node_modules/typedarray": { 1660 | "version": "0.0.6", 1661 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1662 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1663 | }, 1664 | "node_modules/uglify-js": { 1665 | "version": "2.4.24", 1666 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", 1667 | "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", 1668 | "dependencies": { 1669 | "async": "~0.2.6", 1670 | "source-map": "0.1.34", 1671 | "uglify-to-browserify": "~1.0.0", 1672 | "yargs": "~3.5.4" 1673 | }, 1674 | "bin": { 1675 | "uglifyjs": "bin/uglifyjs" 1676 | }, 1677 | "engines": { 1678 | "node": ">=0.4.0" 1679 | } 1680 | }, 1681 | "node_modules/uglify-js/node_modules/wordwrap": { 1682 | "version": "0.0.2", 1683 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 1684 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 1685 | "engines": { 1686 | "node": ">=0.4.0" 1687 | } 1688 | }, 1689 | "node_modules/uglify-js/node_modules/yargs": { 1690 | "version": "3.5.4", 1691 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", 1692 | "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", 1693 | "dependencies": { 1694 | "camelcase": "^1.0.2", 1695 | "decamelize": "^1.0.0", 1696 | "window-size": "0.1.0", 1697 | "wordwrap": "0.0.2" 1698 | } 1699 | }, 1700 | "node_modules/uglify-to-browserify": { 1701 | "version": "1.0.2", 1702 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1703 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" 1704 | }, 1705 | "node_modules/unpipe": { 1706 | "version": "1.0.0", 1707 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1708 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1709 | "engines": { 1710 | "node": ">= 0.8" 1711 | } 1712 | }, 1713 | "node_modules/uri-js": { 1714 | "version": "4.4.1", 1715 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1716 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1717 | "dependencies": { 1718 | "punycode": "^2.1.0" 1719 | } 1720 | }, 1721 | "node_modules/util-deprecate": { 1722 | "version": "1.0.2", 1723 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1724 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1725 | }, 1726 | "node_modules/utils-merge": { 1727 | "version": "1.0.1", 1728 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1729 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 1730 | "engines": { 1731 | "node": ">= 0.4.0" 1732 | } 1733 | }, 1734 | "node_modules/uuid": { 1735 | "version": "3.4.0", 1736 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1737 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 1738 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 1739 | "bin": { 1740 | "uuid": "bin/uuid" 1741 | } 1742 | }, 1743 | "node_modules/vary": { 1744 | "version": "1.1.2", 1745 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1746 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 1747 | "engines": { 1748 | "node": ">= 0.8" 1749 | } 1750 | }, 1751 | "node_modules/verror": { 1752 | "version": "1.10.0", 1753 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1754 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1755 | "engines": [ 1756 | "node >=0.6.0" 1757 | ], 1758 | "dependencies": { 1759 | "assert-plus": "^1.0.0", 1760 | "core-util-is": "1.0.2", 1761 | "extsprintf": "^1.2.0" 1762 | } 1763 | }, 1764 | "node_modules/webidl-conversions": { 1765 | "version": "3.0.1", 1766 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1767 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1768 | }, 1769 | "node_modules/whatwg-url": { 1770 | "version": "5.0.0", 1771 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1772 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1773 | "dependencies": { 1774 | "tr46": "~0.0.3", 1775 | "webidl-conversions": "^3.0.0" 1776 | } 1777 | }, 1778 | "node_modules/window-size": { 1779 | "version": "0.1.0", 1780 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1781 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 1782 | "engines": { 1783 | "node": ">= 0.8.0" 1784 | } 1785 | }, 1786 | "node_modules/wordwrap": { 1787 | "version": "0.0.3", 1788 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1789 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 1790 | "engines": { 1791 | "node": ">=0.4.0" 1792 | } 1793 | }, 1794 | "node_modules/wrap-ansi": { 1795 | "version": "7.0.0", 1796 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1797 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1798 | "dependencies": { 1799 | "ansi-styles": "^4.0.0", 1800 | "string-width": "^4.1.0", 1801 | "strip-ansi": "^6.0.0" 1802 | }, 1803 | "engines": { 1804 | "node": ">=10" 1805 | }, 1806 | "funding": { 1807 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1808 | } 1809 | }, 1810 | "node_modules/wrappy": { 1811 | "version": "1.0.2", 1812 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1813 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1814 | }, 1815 | "node_modules/ws": { 1816 | "version": "8.5.0", 1817 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 1818 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 1819 | "engines": { 1820 | "node": ">=10.0.0" 1821 | }, 1822 | "peerDependencies": { 1823 | "bufferutil": "^4.0.1", 1824 | "utf-8-validate": "^5.0.2" 1825 | }, 1826 | "peerDependenciesMeta": { 1827 | "bufferutil": { 1828 | "optional": true 1829 | }, 1830 | "utf-8-validate": { 1831 | "optional": true 1832 | } 1833 | } 1834 | }, 1835 | "node_modules/y18n": { 1836 | "version": "5.0.8", 1837 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1838 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1839 | "engines": { 1840 | "node": ">=10" 1841 | } 1842 | }, 1843 | "node_modules/yallist": { 1844 | "version": "4.0.0", 1845 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1846 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1847 | }, 1848 | "node_modules/yargs": { 1849 | "version": "16.2.0", 1850 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1851 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1852 | "dependencies": { 1853 | "cliui": "^7.0.2", 1854 | "escalade": "^3.1.1", 1855 | "get-caller-file": "^2.0.5", 1856 | "require-directory": "^2.1.1", 1857 | "string-width": "^4.2.0", 1858 | "y18n": "^5.0.5", 1859 | "yargs-parser": "^20.2.2" 1860 | }, 1861 | "engines": { 1862 | "node": ">=10" 1863 | } 1864 | }, 1865 | "node_modules/yargs-parser": { 1866 | "version": "20.2.9", 1867 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1868 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1869 | "engines": { 1870 | "node": ">=10" 1871 | } 1872 | } 1873 | }, 1874 | "dependencies": { 1875 | "@google-cloud/datastore": { 1876 | "version": "6.6.2", 1877 | "resolved": "https://registry.npmjs.org/@google-cloud/datastore/-/datastore-6.6.2.tgz", 1878 | "integrity": "sha512-gQxSusM1gREtUogVqtl/KuoFrstYns8ZxY3guso2Mg2eJ+ygJwWdxXmG23T+aSbzkofh2OF3Mz0p3a+0F9KoPg==", 1879 | "requires": { 1880 | "@google-cloud/promisify": "^2.0.0", 1881 | "arrify": "^2.0.1", 1882 | "concat-stream": "^2.0.0", 1883 | "extend": "^3.0.2", 1884 | "google-gax": "^2.24.1", 1885 | "is": "^3.3.0", 1886 | "split-array-stream": "^2.0.0", 1887 | "stream-events": "^1.0.5" 1888 | } 1889 | }, 1890 | "@google-cloud/promisify": { 1891 | "version": "2.0.4", 1892 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", 1893 | "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==" 1894 | }, 1895 | "@grpc/grpc-js": { 1896 | "version": "1.5.7", 1897 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.7.tgz", 1898 | "integrity": "sha512-RAlSbZ9LXo0wNoHKeUlwP9dtGgVBDUbnBKFpfAv5iSqMG4qWz9um2yLH215+Wow1I48etIa1QMS+WAGmsE/7HQ==", 1899 | "requires": { 1900 | "@grpc/proto-loader": "^0.6.4", 1901 | "@types/node": ">=12.12.47" 1902 | } 1903 | }, 1904 | "@grpc/proto-loader": { 1905 | "version": "0.6.9", 1906 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", 1907 | "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", 1908 | "requires": { 1909 | "@types/long": "^4.0.1", 1910 | "lodash.camelcase": "^4.3.0", 1911 | "long": "^4.0.0", 1912 | "protobufjs": "^6.10.0", 1913 | "yargs": "^16.2.0" 1914 | } 1915 | }, 1916 | "@protobufjs/aspromise": { 1917 | "version": "1.1.2", 1918 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 1919 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 1920 | }, 1921 | "@protobufjs/base64": { 1922 | "version": "1.1.2", 1923 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 1924 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 1925 | }, 1926 | "@protobufjs/codegen": { 1927 | "version": "2.0.4", 1928 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 1929 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 1930 | }, 1931 | "@protobufjs/eventemitter": { 1932 | "version": "1.1.0", 1933 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 1934 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 1935 | }, 1936 | "@protobufjs/fetch": { 1937 | "version": "1.1.0", 1938 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 1939 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 1940 | "requires": { 1941 | "@protobufjs/aspromise": "^1.1.1", 1942 | "@protobufjs/inquire": "^1.1.0" 1943 | } 1944 | }, 1945 | "@protobufjs/float": { 1946 | "version": "1.0.2", 1947 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 1948 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 1949 | }, 1950 | "@protobufjs/inquire": { 1951 | "version": "1.1.0", 1952 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 1953 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 1954 | }, 1955 | "@protobufjs/path": { 1956 | "version": "1.1.2", 1957 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 1958 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 1959 | }, 1960 | "@protobufjs/pool": { 1961 | "version": "1.1.0", 1962 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 1963 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 1964 | }, 1965 | "@protobufjs/utf8": { 1966 | "version": "1.1.0", 1967 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 1968 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 1969 | }, 1970 | "@types/long": { 1971 | "version": "4.0.1", 1972 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 1973 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 1974 | }, 1975 | "@types/node": { 1976 | "version": "17.0.21", 1977 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", 1978 | "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" 1979 | }, 1980 | "abort-controller": { 1981 | "version": "3.0.0", 1982 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 1983 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1984 | "requires": { 1985 | "event-target-shim": "^5.0.0" 1986 | } 1987 | }, 1988 | "accepts": { 1989 | "version": "1.3.8", 1990 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1991 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1992 | "requires": { 1993 | "mime-types": "~2.1.34", 1994 | "negotiator": "0.6.3" 1995 | } 1996 | }, 1997 | "agent-base": { 1998 | "version": "6.0.2", 1999 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 2000 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 2001 | "requires": { 2002 | "debug": "4" 2003 | }, 2004 | "dependencies": { 2005 | "debug": { 2006 | "version": "4.3.3", 2007 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 2008 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 2009 | "requires": { 2010 | "ms": "2.1.2" 2011 | } 2012 | }, 2013 | "ms": { 2014 | "version": "2.1.2", 2015 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2016 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2017 | } 2018 | } 2019 | }, 2020 | "ajv": { 2021 | "version": "6.12.6", 2022 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 2023 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 2024 | "requires": { 2025 | "fast-deep-equal": "^3.1.1", 2026 | "fast-json-stable-stringify": "^2.0.0", 2027 | "json-schema-traverse": "^0.4.1", 2028 | "uri-js": "^4.2.2" 2029 | } 2030 | }, 2031 | "amdefine": { 2032 | "version": "1.0.1", 2033 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 2034 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 2035 | }, 2036 | "ansi-regex": { 2037 | "version": "5.0.1", 2038 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2039 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 2040 | }, 2041 | "ansi-styles": { 2042 | "version": "4.3.0", 2043 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2044 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2045 | "requires": { 2046 | "color-convert": "^2.0.1" 2047 | } 2048 | }, 2049 | "array-flatten": { 2050 | "version": "1.1.1", 2051 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 2052 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 2053 | }, 2054 | "arrify": { 2055 | "version": "2.0.1", 2056 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 2057 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" 2058 | }, 2059 | "asn1": { 2060 | "version": "0.2.6", 2061 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 2062 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 2063 | "requires": { 2064 | "safer-buffer": "~2.1.0" 2065 | } 2066 | }, 2067 | "assert-plus": { 2068 | "version": "1.0.0", 2069 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2070 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 2071 | }, 2072 | "async": { 2073 | "version": "0.2.10", 2074 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 2075 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" 2076 | }, 2077 | "asynckit": { 2078 | "version": "0.4.0", 2079 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 2080 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 2081 | }, 2082 | "aws-sign2": { 2083 | "version": "0.7.0", 2084 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 2085 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 2086 | }, 2087 | "aws4": { 2088 | "version": "1.11.0", 2089 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 2090 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 2091 | }, 2092 | "base64-js": { 2093 | "version": "1.5.1", 2094 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 2095 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 2096 | }, 2097 | "bcrypt-pbkdf": { 2098 | "version": "1.0.2", 2099 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 2100 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 2101 | "requires": { 2102 | "tweetnacl": "^0.14.3" 2103 | } 2104 | }, 2105 | "bignumber.js": { 2106 | "version": "9.0.2", 2107 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", 2108 | "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" 2109 | }, 2110 | "body-parser": { 2111 | "version": "1.19.2", 2112 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", 2113 | "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", 2114 | "requires": { 2115 | "bytes": "3.1.2", 2116 | "content-type": "~1.0.4", 2117 | "debug": "2.6.9", 2118 | "depd": "~1.1.2", 2119 | "http-errors": "1.8.1", 2120 | "iconv-lite": "0.4.24", 2121 | "on-finished": "~2.3.0", 2122 | "qs": "6.9.7", 2123 | "raw-body": "2.4.3", 2124 | "type-is": "~1.6.18" 2125 | } 2126 | }, 2127 | "buffer-equal-constant-time": { 2128 | "version": "1.0.1", 2129 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 2130 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 2131 | }, 2132 | "buffer-from": { 2133 | "version": "1.1.2", 2134 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 2135 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 2136 | }, 2137 | "bytes": { 2138 | "version": "3.1.2", 2139 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 2140 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 2141 | }, 2142 | "camelcase": { 2143 | "version": "1.2.1", 2144 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 2145 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 2146 | }, 2147 | "caseless": { 2148 | "version": "0.12.0", 2149 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 2150 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 2151 | }, 2152 | "cliui": { 2153 | "version": "7.0.4", 2154 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 2155 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 2156 | "requires": { 2157 | "string-width": "^4.2.0", 2158 | "strip-ansi": "^6.0.0", 2159 | "wrap-ansi": "^7.0.0" 2160 | } 2161 | }, 2162 | "color-convert": { 2163 | "version": "2.0.1", 2164 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2165 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2166 | "requires": { 2167 | "color-name": "~1.1.4" 2168 | } 2169 | }, 2170 | "color-name": { 2171 | "version": "1.1.4", 2172 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2173 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 2174 | }, 2175 | "combined-stream": { 2176 | "version": "1.0.8", 2177 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 2178 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 2179 | "requires": { 2180 | "delayed-stream": "~1.0.0" 2181 | } 2182 | }, 2183 | "concat-stream": { 2184 | "version": "2.0.0", 2185 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 2186 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 2187 | "requires": { 2188 | "buffer-from": "^1.0.0", 2189 | "inherits": "^2.0.3", 2190 | "readable-stream": "^3.0.2", 2191 | "typedarray": "^0.0.6" 2192 | } 2193 | }, 2194 | "content-disposition": { 2195 | "version": "0.5.4", 2196 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 2197 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 2198 | "requires": { 2199 | "safe-buffer": "5.2.1" 2200 | } 2201 | }, 2202 | "content-type": { 2203 | "version": "1.0.4", 2204 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 2205 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 2206 | }, 2207 | "cookie": { 2208 | "version": "0.4.2", 2209 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 2210 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" 2211 | }, 2212 | "cookie-signature": { 2213 | "version": "1.0.6", 2214 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 2215 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 2216 | }, 2217 | "core-util-is": { 2218 | "version": "1.0.2", 2219 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 2220 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 2221 | }, 2222 | "dashdash": { 2223 | "version": "1.14.1", 2224 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 2225 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 2226 | "requires": { 2227 | "assert-plus": "^1.0.0" 2228 | } 2229 | }, 2230 | "debug": { 2231 | "version": "2.6.9", 2232 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2233 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2234 | "requires": { 2235 | "ms": "2.0.0" 2236 | } 2237 | }, 2238 | "decamelize": { 2239 | "version": "1.2.0", 2240 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 2241 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 2242 | }, 2243 | "delayed-stream": { 2244 | "version": "1.0.0", 2245 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 2246 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 2247 | }, 2248 | "depd": { 2249 | "version": "1.1.2", 2250 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 2251 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 2252 | }, 2253 | "destroy": { 2254 | "version": "1.0.4", 2255 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 2256 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 2257 | }, 2258 | "duplexify": { 2259 | "version": "4.1.2", 2260 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", 2261 | "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", 2262 | "requires": { 2263 | "end-of-stream": "^1.4.1", 2264 | "inherits": "^2.0.3", 2265 | "readable-stream": "^3.1.1", 2266 | "stream-shift": "^1.0.0" 2267 | } 2268 | }, 2269 | "ecc-jsbn": { 2270 | "version": "0.1.2", 2271 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 2272 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 2273 | "requires": { 2274 | "jsbn": "~0.1.0", 2275 | "safer-buffer": "^2.1.0" 2276 | } 2277 | }, 2278 | "ecdsa-sig-formatter": { 2279 | "version": "1.0.11", 2280 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 2281 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 2282 | "requires": { 2283 | "safe-buffer": "^5.0.1" 2284 | } 2285 | }, 2286 | "ee-first": { 2287 | "version": "1.1.1", 2288 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 2289 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 2290 | }, 2291 | "emoji-regex": { 2292 | "version": "8.0.0", 2293 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2294 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 2295 | }, 2296 | "encodeurl": { 2297 | "version": "1.0.2", 2298 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 2299 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 2300 | }, 2301 | "end-of-stream": { 2302 | "version": "1.4.4", 2303 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 2304 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 2305 | "requires": { 2306 | "once": "^1.4.0" 2307 | } 2308 | }, 2309 | "escalade": { 2310 | "version": "3.1.1", 2311 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2312 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 2313 | }, 2314 | "escape-html": { 2315 | "version": "1.0.3", 2316 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 2317 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 2318 | }, 2319 | "etag": { 2320 | "version": "1.8.1", 2321 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 2322 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 2323 | }, 2324 | "event-target-shim": { 2325 | "version": "5.0.1", 2326 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 2327 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 2328 | }, 2329 | "express": { 2330 | "version": "4.17.3", 2331 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", 2332 | "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", 2333 | "requires": { 2334 | "accepts": "~1.3.8", 2335 | "array-flatten": "1.1.1", 2336 | "body-parser": "1.19.2", 2337 | "content-disposition": "0.5.4", 2338 | "content-type": "~1.0.4", 2339 | "cookie": "0.4.2", 2340 | "cookie-signature": "1.0.6", 2341 | "debug": "2.6.9", 2342 | "depd": "~1.1.2", 2343 | "encodeurl": "~1.0.2", 2344 | "escape-html": "~1.0.3", 2345 | "etag": "~1.8.1", 2346 | "finalhandler": "~1.1.2", 2347 | "fresh": "0.5.2", 2348 | "merge-descriptors": "1.0.1", 2349 | "methods": "~1.1.2", 2350 | "on-finished": "~2.3.0", 2351 | "parseurl": "~1.3.3", 2352 | "path-to-regexp": "0.1.7", 2353 | "proxy-addr": "~2.0.7", 2354 | "qs": "6.9.7", 2355 | "range-parser": "~1.2.1", 2356 | "safe-buffer": "5.2.1", 2357 | "send": "0.17.2", 2358 | "serve-static": "1.14.2", 2359 | "setprototypeof": "1.2.0", 2360 | "statuses": "~1.5.0", 2361 | "type-is": "~1.6.18", 2362 | "utils-merge": "1.0.1", 2363 | "vary": "~1.1.2" 2364 | } 2365 | }, 2366 | "extend": { 2367 | "version": "3.0.2", 2368 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 2369 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 2370 | }, 2371 | "extsprintf": { 2372 | "version": "1.3.0", 2373 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 2374 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 2375 | }, 2376 | "fast-deep-equal": { 2377 | "version": "3.1.3", 2378 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2379 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 2380 | }, 2381 | "fast-json-stable-stringify": { 2382 | "version": "2.1.0", 2383 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2384 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 2385 | }, 2386 | "fast-text-encoding": { 2387 | "version": "1.0.3", 2388 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", 2389 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" 2390 | }, 2391 | "finalhandler": { 2392 | "version": "1.1.2", 2393 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 2394 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 2395 | "requires": { 2396 | "debug": "2.6.9", 2397 | "encodeurl": "~1.0.2", 2398 | "escape-html": "~1.0.3", 2399 | "on-finished": "~2.3.0", 2400 | "parseurl": "~1.3.3", 2401 | "statuses": "~1.5.0", 2402 | "unpipe": "~1.0.0" 2403 | } 2404 | }, 2405 | "forever-agent": { 2406 | "version": "0.6.1", 2407 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 2408 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 2409 | }, 2410 | "form-data": { 2411 | "version": "2.3.3", 2412 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 2413 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 2414 | "requires": { 2415 | "asynckit": "^0.4.0", 2416 | "combined-stream": "^1.0.6", 2417 | "mime-types": "^2.1.12" 2418 | } 2419 | }, 2420 | "forwarded": { 2421 | "version": "0.2.0", 2422 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 2423 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 2424 | }, 2425 | "fresh": { 2426 | "version": "0.5.2", 2427 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 2428 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 2429 | }, 2430 | "gaxios": { 2431 | "version": "4.3.2", 2432 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", 2433 | "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", 2434 | "requires": { 2435 | "abort-controller": "^3.0.0", 2436 | "extend": "^3.0.2", 2437 | "https-proxy-agent": "^5.0.0", 2438 | "is-stream": "^2.0.0", 2439 | "node-fetch": "^2.6.1" 2440 | } 2441 | }, 2442 | "gcp-metadata": { 2443 | "version": "4.3.1", 2444 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", 2445 | "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", 2446 | "requires": { 2447 | "gaxios": "^4.0.0", 2448 | "json-bigint": "^1.0.0" 2449 | } 2450 | }, 2451 | "get-caller-file": { 2452 | "version": "2.0.5", 2453 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 2454 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 2455 | }, 2456 | "getpass": { 2457 | "version": "0.1.7", 2458 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 2459 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 2460 | "requires": { 2461 | "assert-plus": "^1.0.0" 2462 | } 2463 | }, 2464 | "google-auth-library": { 2465 | "version": "7.14.0", 2466 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.0.tgz", 2467 | "integrity": "sha512-or8r7qUqGVI3W8lVSdPh0ZpeFyQHeE73g5c0p+bLNTTUFXJ+GSeDQmZRZ2p4H8cF/RJYa4PNvi/A1ar1uVNLFA==", 2468 | "requires": { 2469 | "arrify": "^2.0.0", 2470 | "base64-js": "^1.3.0", 2471 | "ecdsa-sig-formatter": "^1.0.11", 2472 | "fast-text-encoding": "^1.0.0", 2473 | "gaxios": "^4.0.0", 2474 | "gcp-metadata": "^4.2.0", 2475 | "gtoken": "^5.0.4", 2476 | "jws": "^4.0.0", 2477 | "lru-cache": "^6.0.0" 2478 | } 2479 | }, 2480 | "google-gax": { 2481 | "version": "2.30.0", 2482 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.30.0.tgz", 2483 | "integrity": "sha512-JcZGDuSOzhPwOJfbK80cyyGLZkrlLBTiwfqrW46sC0I9h3FtFmbN7FwIQ3PHreYiE6iVK4InfEZiTp4laOmPfA==", 2484 | "requires": { 2485 | "@grpc/grpc-js": "~1.5.0", 2486 | "@grpc/proto-loader": "^0.6.1", 2487 | "@types/long": "^4.0.0", 2488 | "abort-controller": "^3.0.0", 2489 | "duplexify": "^4.0.0", 2490 | "fast-text-encoding": "^1.0.3", 2491 | "google-auth-library": "^7.14.0", 2492 | "is-stream-ended": "^0.1.4", 2493 | "node-fetch": "^2.6.1", 2494 | "object-hash": "^3.0.0", 2495 | "proto3-json-serializer": "^0.1.8", 2496 | "protobufjs": "6.11.2", 2497 | "retry-request": "^4.0.0" 2498 | } 2499 | }, 2500 | "google-p12-pem": { 2501 | "version": "3.1.3", 2502 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", 2503 | "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", 2504 | "requires": { 2505 | "node-forge": "^1.0.0" 2506 | } 2507 | }, 2508 | "gtoken": { 2509 | "version": "5.3.2", 2510 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz", 2511 | "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==", 2512 | "requires": { 2513 | "gaxios": "^4.0.0", 2514 | "google-p12-pem": "^3.1.3", 2515 | "jws": "^4.0.0" 2516 | } 2517 | }, 2518 | "har-schema": { 2519 | "version": "2.0.0", 2520 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 2521 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 2522 | }, 2523 | "har-validator": { 2524 | "version": "5.1.5", 2525 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 2526 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 2527 | "requires": { 2528 | "ajv": "^6.12.3", 2529 | "har-schema": "^2.0.0" 2530 | } 2531 | }, 2532 | "http-errors": { 2533 | "version": "1.8.1", 2534 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 2535 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 2536 | "requires": { 2537 | "depd": "~1.1.2", 2538 | "inherits": "2.0.4", 2539 | "setprototypeof": "1.2.0", 2540 | "statuses": ">= 1.5.0 < 2", 2541 | "toidentifier": "1.0.1" 2542 | } 2543 | }, 2544 | "http-signature": { 2545 | "version": "1.2.0", 2546 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 2547 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 2548 | "requires": { 2549 | "assert-plus": "^1.0.0", 2550 | "jsprim": "^1.2.2", 2551 | "sshpk": "^1.7.0" 2552 | } 2553 | }, 2554 | "https-proxy-agent": { 2555 | "version": "5.0.0", 2556 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 2557 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 2558 | "requires": { 2559 | "agent-base": "6", 2560 | "debug": "4" 2561 | }, 2562 | "dependencies": { 2563 | "debug": { 2564 | "version": "4.3.3", 2565 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 2566 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 2567 | "requires": { 2568 | "ms": "2.1.2" 2569 | } 2570 | }, 2571 | "ms": { 2572 | "version": "2.1.2", 2573 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2574 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2575 | } 2576 | } 2577 | }, 2578 | "iconv-lite": { 2579 | "version": "0.4.24", 2580 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2581 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2582 | "requires": { 2583 | "safer-buffer": ">= 2.1.2 < 3" 2584 | } 2585 | }, 2586 | "inherits": { 2587 | "version": "2.0.4", 2588 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2589 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2590 | }, 2591 | "ipaddr.js": { 2592 | "version": "1.9.1", 2593 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 2594 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 2595 | }, 2596 | "is": { 2597 | "version": "3.3.0", 2598 | "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", 2599 | "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==" 2600 | }, 2601 | "is-fullwidth-code-point": { 2602 | "version": "3.0.0", 2603 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2604 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 2605 | }, 2606 | "is-stream": { 2607 | "version": "2.0.1", 2608 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 2609 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" 2610 | }, 2611 | "is-stream-ended": { 2612 | "version": "0.1.4", 2613 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 2614 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" 2615 | }, 2616 | "is-typedarray": { 2617 | "version": "1.0.0", 2618 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 2619 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 2620 | }, 2621 | "isstream": { 2622 | "version": "0.1.2", 2623 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 2624 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 2625 | }, 2626 | "jsbn": { 2627 | "version": "0.1.1", 2628 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 2629 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 2630 | }, 2631 | "json-bigint": { 2632 | "version": "1.0.0", 2633 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 2634 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 2635 | "requires": { 2636 | "bignumber.js": "^9.0.0" 2637 | } 2638 | }, 2639 | "json-schema": { 2640 | "version": "0.4.0", 2641 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 2642 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 2643 | }, 2644 | "json-schema-traverse": { 2645 | "version": "0.4.1", 2646 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2647 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 2648 | }, 2649 | "json-stringify-safe": { 2650 | "version": "5.0.1", 2651 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 2652 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 2653 | }, 2654 | "jsprim": { 2655 | "version": "1.4.2", 2656 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 2657 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 2658 | "requires": { 2659 | "assert-plus": "1.0.0", 2660 | "extsprintf": "1.3.0", 2661 | "json-schema": "0.4.0", 2662 | "verror": "1.10.0" 2663 | } 2664 | }, 2665 | "jwa": { 2666 | "version": "2.0.0", 2667 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 2668 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 2669 | "requires": { 2670 | "buffer-equal-constant-time": "1.0.1", 2671 | "ecdsa-sig-formatter": "1.0.11", 2672 | "safe-buffer": "^5.0.1" 2673 | } 2674 | }, 2675 | "jws": { 2676 | "version": "4.0.0", 2677 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 2678 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 2679 | "requires": { 2680 | "jwa": "^2.0.0", 2681 | "safe-buffer": "^5.0.1" 2682 | } 2683 | }, 2684 | "lodash.camelcase": { 2685 | "version": "4.3.0", 2686 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 2687 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 2688 | }, 2689 | "long": { 2690 | "version": "4.0.0", 2691 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 2692 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 2693 | }, 2694 | "lru-cache": { 2695 | "version": "6.0.0", 2696 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2697 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2698 | "requires": { 2699 | "yallist": "^4.0.0" 2700 | } 2701 | }, 2702 | "media-typer": { 2703 | "version": "0.3.0", 2704 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2705 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2706 | }, 2707 | "merge-descriptors": { 2708 | "version": "1.0.1", 2709 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2710 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2711 | }, 2712 | "methods": { 2713 | "version": "1.1.2", 2714 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2715 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2716 | }, 2717 | "mime": { 2718 | "version": "1.6.0", 2719 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2720 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2721 | }, 2722 | "mime-db": { 2723 | "version": "1.51.0", 2724 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 2725 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 2726 | }, 2727 | "mime-types": { 2728 | "version": "2.1.34", 2729 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 2730 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 2731 | "requires": { 2732 | "mime-db": "1.51.0" 2733 | } 2734 | }, 2735 | "minimist": { 2736 | "version": "0.0.10", 2737 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 2738 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 2739 | }, 2740 | "ms": { 2741 | "version": "2.0.0", 2742 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2743 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2744 | }, 2745 | "negotiator": { 2746 | "version": "0.6.3", 2747 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2748 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 2749 | }, 2750 | "node-fetch": { 2751 | "version": "2.6.7", 2752 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 2753 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 2754 | "requires": { 2755 | "whatwg-url": "^5.0.0" 2756 | } 2757 | }, 2758 | "node-forge": { 2759 | "version": "1.2.1", 2760 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", 2761 | "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==" 2762 | }, 2763 | "oauth-sign": { 2764 | "version": "0.9.0", 2765 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2766 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 2767 | }, 2768 | "object-hash": { 2769 | "version": "3.0.0", 2770 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2771 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" 2772 | }, 2773 | "on-finished": { 2774 | "version": "2.3.0", 2775 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2776 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2777 | "requires": { 2778 | "ee-first": "1.1.1" 2779 | } 2780 | }, 2781 | "once": { 2782 | "version": "1.4.0", 2783 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2784 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2785 | "requires": { 2786 | "wrappy": "1" 2787 | } 2788 | }, 2789 | "optimist": { 2790 | "version": "0.6.1", 2791 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 2792 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 2793 | "requires": { 2794 | "minimist": "~0.0.1", 2795 | "wordwrap": "~0.0.2" 2796 | } 2797 | }, 2798 | "parseurl": { 2799 | "version": "1.3.3", 2800 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2801 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2802 | }, 2803 | "path-to-regexp": { 2804 | "version": "0.1.7", 2805 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2806 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2807 | }, 2808 | "performance-now": { 2809 | "version": "2.1.0", 2810 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2811 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2812 | }, 2813 | "proto3-json-serializer": { 2814 | "version": "0.1.8", 2815 | "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.8.tgz", 2816 | "integrity": "sha512-ACilkB6s1U1gWnl5jtICpnDai4VCxmI9GFxuEaYdxtDG2oVI3sVFIUsvUZcQbJgtPM6p+zqKbjTKQZp6Y4FpQw==", 2817 | "requires": { 2818 | "protobufjs": "^6.11.2" 2819 | } 2820 | }, 2821 | "protobufjs": { 2822 | "version": "6.11.2", 2823 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", 2824 | "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", 2825 | "requires": { 2826 | "@protobufjs/aspromise": "^1.1.2", 2827 | "@protobufjs/base64": "^1.1.2", 2828 | "@protobufjs/codegen": "^2.0.4", 2829 | "@protobufjs/eventemitter": "^1.1.0", 2830 | "@protobufjs/fetch": "^1.1.0", 2831 | "@protobufjs/float": "^1.0.2", 2832 | "@protobufjs/inquire": "^1.1.0", 2833 | "@protobufjs/path": "^1.1.2", 2834 | "@protobufjs/pool": "^1.1.0", 2835 | "@protobufjs/utf8": "^1.1.0", 2836 | "@types/long": "^4.0.1", 2837 | "@types/node": ">=13.7.0", 2838 | "long": "^4.0.0" 2839 | } 2840 | }, 2841 | "proxy-addr": { 2842 | "version": "2.0.7", 2843 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2844 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2845 | "requires": { 2846 | "forwarded": "0.2.0", 2847 | "ipaddr.js": "1.9.1" 2848 | } 2849 | }, 2850 | "psl": { 2851 | "version": "1.8.0", 2852 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 2853 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 2854 | }, 2855 | "punycode": { 2856 | "version": "2.1.1", 2857 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2858 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 2859 | }, 2860 | "qs": { 2861 | "version": "6.9.7", 2862 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", 2863 | "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" 2864 | }, 2865 | "range-parser": { 2866 | "version": "1.2.1", 2867 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2868 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2869 | }, 2870 | "raw-body": { 2871 | "version": "2.4.3", 2872 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", 2873 | "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", 2874 | "requires": { 2875 | "bytes": "3.1.2", 2876 | "http-errors": "1.8.1", 2877 | "iconv-lite": "0.4.24", 2878 | "unpipe": "1.0.0" 2879 | } 2880 | }, 2881 | "readable-stream": { 2882 | "version": "3.6.0", 2883 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2884 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2885 | "requires": { 2886 | "inherits": "^2.0.3", 2887 | "string_decoder": "^1.1.1", 2888 | "util-deprecate": "^1.0.1" 2889 | } 2890 | }, 2891 | "request": { 2892 | "version": "2.88.2", 2893 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 2894 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 2895 | "requires": { 2896 | "aws-sign2": "~0.7.0", 2897 | "aws4": "^1.8.0", 2898 | "caseless": "~0.12.0", 2899 | "combined-stream": "~1.0.6", 2900 | "extend": "~3.0.2", 2901 | "forever-agent": "~0.6.1", 2902 | "form-data": "~2.3.2", 2903 | "har-validator": "~5.1.3", 2904 | "http-signature": "~1.2.0", 2905 | "is-typedarray": "~1.0.0", 2906 | "isstream": "~0.1.2", 2907 | "json-stringify-safe": "~5.0.1", 2908 | "mime-types": "~2.1.19", 2909 | "oauth-sign": "~0.9.0", 2910 | "performance-now": "^2.1.0", 2911 | "qs": "~6.5.2", 2912 | "safe-buffer": "^5.1.2", 2913 | "tough-cookie": "~2.5.0", 2914 | "tunnel-agent": "^0.6.0", 2915 | "uuid": "^3.3.2" 2916 | }, 2917 | "dependencies": { 2918 | "qs": { 2919 | "version": "6.5.3", 2920 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 2921 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" 2922 | } 2923 | } 2924 | }, 2925 | "require-directory": { 2926 | "version": "2.1.1", 2927 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2928 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 2929 | }, 2930 | "retry-request": { 2931 | "version": "4.2.2", 2932 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", 2933 | "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", 2934 | "requires": { 2935 | "debug": "^4.1.1", 2936 | "extend": "^3.0.2" 2937 | }, 2938 | "dependencies": { 2939 | "debug": { 2940 | "version": "4.3.3", 2941 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 2942 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 2943 | "requires": { 2944 | "ms": "2.1.2" 2945 | } 2946 | }, 2947 | "ms": { 2948 | "version": "2.1.2", 2949 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2950 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2951 | } 2952 | } 2953 | }, 2954 | "safe-buffer": { 2955 | "version": "5.2.1", 2956 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2957 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2958 | }, 2959 | "safer-buffer": { 2960 | "version": "2.1.2", 2961 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2962 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2963 | }, 2964 | "send": { 2965 | "version": "0.17.2", 2966 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 2967 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 2968 | "requires": { 2969 | "debug": "2.6.9", 2970 | "depd": "~1.1.2", 2971 | "destroy": "~1.0.4", 2972 | "encodeurl": "~1.0.2", 2973 | "escape-html": "~1.0.3", 2974 | "etag": "~1.8.1", 2975 | "fresh": "0.5.2", 2976 | "http-errors": "1.8.1", 2977 | "mime": "1.6.0", 2978 | "ms": "2.1.3", 2979 | "on-finished": "~2.3.0", 2980 | "range-parser": "~1.2.1", 2981 | "statuses": "~1.5.0" 2982 | }, 2983 | "dependencies": { 2984 | "ms": { 2985 | "version": "2.1.3", 2986 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2987 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2988 | } 2989 | } 2990 | }, 2991 | "serve-static": { 2992 | "version": "1.14.2", 2993 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 2994 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 2995 | "requires": { 2996 | "encodeurl": "~1.0.2", 2997 | "escape-html": "~1.0.3", 2998 | "parseurl": "~1.3.3", 2999 | "send": "0.17.2" 3000 | } 3001 | }, 3002 | "setprototypeof": { 3003 | "version": "1.2.0", 3004 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 3005 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 3006 | }, 3007 | "source-map": { 3008 | "version": "0.1.34", 3009 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", 3010 | "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", 3011 | "requires": { 3012 | "amdefine": ">=0.0.4" 3013 | } 3014 | }, 3015 | "split-array-stream": { 3016 | "version": "2.0.0", 3017 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", 3018 | "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", 3019 | "requires": { 3020 | "is-stream-ended": "^0.1.4" 3021 | } 3022 | }, 3023 | "sshpk": { 3024 | "version": "1.17.0", 3025 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", 3026 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", 3027 | "requires": { 3028 | "asn1": "~0.2.3", 3029 | "assert-plus": "^1.0.0", 3030 | "bcrypt-pbkdf": "^1.0.0", 3031 | "dashdash": "^1.12.0", 3032 | "ecc-jsbn": "~0.1.1", 3033 | "getpass": "^0.1.1", 3034 | "jsbn": "~0.1.0", 3035 | "safer-buffer": "^2.0.2", 3036 | "tweetnacl": "~0.14.0" 3037 | } 3038 | }, 3039 | "statuses": { 3040 | "version": "1.5.0", 3041 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 3042 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 3043 | }, 3044 | "stream-events": { 3045 | "version": "1.0.5", 3046 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 3047 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 3048 | "requires": { 3049 | "stubs": "^3.0.0" 3050 | } 3051 | }, 3052 | "stream-shift": { 3053 | "version": "1.0.1", 3054 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 3055 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 3056 | }, 3057 | "string_decoder": { 3058 | "version": "1.3.0", 3059 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3060 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3061 | "requires": { 3062 | "safe-buffer": "~5.2.0" 3063 | } 3064 | }, 3065 | "string-width": { 3066 | "version": "4.2.3", 3067 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3068 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3069 | "requires": { 3070 | "emoji-regex": "^8.0.0", 3071 | "is-fullwidth-code-point": "^3.0.0", 3072 | "strip-ansi": "^6.0.1" 3073 | } 3074 | }, 3075 | "strip-ansi": { 3076 | "version": "6.0.1", 3077 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3078 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3079 | "requires": { 3080 | "ansi-regex": "^5.0.1" 3081 | } 3082 | }, 3083 | "stubs": { 3084 | "version": "3.0.0", 3085 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 3086 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" 3087 | }, 3088 | "swig": { 3089 | "version": "1.4.2", 3090 | "resolved": "https://registry.npmjs.org/swig/-/swig-1.4.2.tgz", 3091 | "integrity": "sha1-QIXKBFM2kQS11IPihBs5t64aq6U=", 3092 | "requires": { 3093 | "optimist": "~0.6", 3094 | "uglify-js": "~2.4" 3095 | } 3096 | }, 3097 | "tmi.js": { 3098 | "version": "1.8.5", 3099 | "resolved": "https://registry.npmjs.org/tmi.js/-/tmi.js-1.8.5.tgz", 3100 | "integrity": "sha512-A9qrydfe1e0VWM9MViVhhxVgvLpnk7pFShVUWePsSTtoi+A1X+Zjdoa7OJd7/YsgHXGj3GkNEvnWop/1WwZuew==", 3101 | "requires": { 3102 | "node-fetch": "^2.6.1", 3103 | "ws": "^8.2.0" 3104 | } 3105 | }, 3106 | "toidentifier": { 3107 | "version": "1.0.1", 3108 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 3109 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 3110 | }, 3111 | "tough-cookie": { 3112 | "version": "2.5.0", 3113 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 3114 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 3115 | "requires": { 3116 | "psl": "^1.1.28", 3117 | "punycode": "^2.1.1" 3118 | } 3119 | }, 3120 | "tr46": { 3121 | "version": "0.0.3", 3122 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3123 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 3124 | }, 3125 | "tunnel-agent": { 3126 | "version": "0.6.0", 3127 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3128 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3129 | "requires": { 3130 | "safe-buffer": "^5.0.1" 3131 | } 3132 | }, 3133 | "tweetnacl": { 3134 | "version": "0.14.5", 3135 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3136 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 3137 | }, 3138 | "type-is": { 3139 | "version": "1.6.18", 3140 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3141 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3142 | "requires": { 3143 | "media-typer": "0.3.0", 3144 | "mime-types": "~2.1.24" 3145 | } 3146 | }, 3147 | "typedarray": { 3148 | "version": "0.0.6", 3149 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3150 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 3151 | }, 3152 | "uglify-js": { 3153 | "version": "2.4.24", 3154 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", 3155 | "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", 3156 | "requires": { 3157 | "async": "~0.2.6", 3158 | "source-map": "0.1.34", 3159 | "uglify-to-browserify": "~1.0.0", 3160 | "yargs": "~3.5.4" 3161 | }, 3162 | "dependencies": { 3163 | "wordwrap": { 3164 | "version": "0.0.2", 3165 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 3166 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 3167 | }, 3168 | "yargs": { 3169 | "version": "3.5.4", 3170 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", 3171 | "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", 3172 | "requires": { 3173 | "camelcase": "^1.0.2", 3174 | "decamelize": "^1.0.0", 3175 | "window-size": "0.1.0", 3176 | "wordwrap": "0.0.2" 3177 | } 3178 | } 3179 | } 3180 | }, 3181 | "uglify-to-browserify": { 3182 | "version": "1.0.2", 3183 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 3184 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" 3185 | }, 3186 | "unpipe": { 3187 | "version": "1.0.0", 3188 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3189 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3190 | }, 3191 | "uri-js": { 3192 | "version": "4.4.1", 3193 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3194 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3195 | "requires": { 3196 | "punycode": "^2.1.0" 3197 | } 3198 | }, 3199 | "util-deprecate": { 3200 | "version": "1.0.2", 3201 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3202 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3203 | }, 3204 | "utils-merge": { 3205 | "version": "1.0.1", 3206 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3207 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3208 | }, 3209 | "uuid": { 3210 | "version": "3.4.0", 3211 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 3212 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 3213 | }, 3214 | "vary": { 3215 | "version": "1.1.2", 3216 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3217 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3218 | }, 3219 | "verror": { 3220 | "version": "1.10.0", 3221 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3222 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3223 | "requires": { 3224 | "assert-plus": "^1.0.0", 3225 | "core-util-is": "1.0.2", 3226 | "extsprintf": "^1.2.0" 3227 | } 3228 | }, 3229 | "webidl-conversions": { 3230 | "version": "3.0.1", 3231 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3232 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 3233 | }, 3234 | "whatwg-url": { 3235 | "version": "5.0.0", 3236 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3237 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 3238 | "requires": { 3239 | "tr46": "~0.0.3", 3240 | "webidl-conversions": "^3.0.0" 3241 | } 3242 | }, 3243 | "window-size": { 3244 | "version": "0.1.0", 3245 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 3246 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 3247 | }, 3248 | "wordwrap": { 3249 | "version": "0.0.3", 3250 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 3251 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 3252 | }, 3253 | "wrap-ansi": { 3254 | "version": "7.0.0", 3255 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3256 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3257 | "requires": { 3258 | "ansi-styles": "^4.0.0", 3259 | "string-width": "^4.1.0", 3260 | "strip-ansi": "^6.0.0" 3261 | } 3262 | }, 3263 | "wrappy": { 3264 | "version": "1.0.2", 3265 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3266 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3267 | }, 3268 | "ws": { 3269 | "version": "8.5.0", 3270 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 3271 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 3272 | "requires": {} 3273 | }, 3274 | "y18n": { 3275 | "version": "5.0.8", 3276 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3277 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 3278 | }, 3279 | "yallist": { 3280 | "version": "4.0.0", 3281 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3282 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 3283 | }, 3284 | "yargs": { 3285 | "version": "16.2.0", 3286 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 3287 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 3288 | "requires": { 3289 | "cliui": "^7.0.2", 3290 | "escalade": "^3.1.1", 3291 | "get-caller-file": "^2.0.5", 3292 | "require-directory": "^2.1.1", 3293 | "string-width": "^4.2.0", 3294 | "y18n": "^5.0.5", 3295 | "yargs-parser": "^20.2.2" 3296 | } 3297 | }, 3298 | "yargs-parser": { 3299 | "version": "20.2.9", 3300 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 3301 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 3302 | } 3303 | } 3304 | } 3305 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitch-log-bot", 3 | "version": "0.11.0", 4 | "description": "Twitch logging with Google Cloud Datastore", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Alex Thomassen", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@google-cloud/datastore": "^6.1.1", 13 | "express": "^4.17.1", 14 | "request": "^2.88.2", 15 | "swig": "^1.4.2", 16 | "tmi.js": "^1.5.0" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+ssh://git@github.com/Decicus/twitch-log-bot.git" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /views/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Twitch Log Bot 8 | 9 | 10 | 15 | 16 | 17 | 36 | 37 |
38 |
39 |

Twitch Log Bot

40 | 41 | {% block main %}{% endblock %} 42 |
43 |
44 | 45 | 46 | {% block scripts %}{% endblock %} 47 | 48 | 49 | -------------------------------------------------------------------------------- /views/home.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block main %} 4 |
5 |
6 | 9 |
10 | 11 |
12 | 13 | 16 |
17 | 18 |
19 | 20 | 21 |
22 | 23 |
24 | 28 |
29 | 30 |
31 | 32 | 33 |
34 | 35 |
36 | 37 | 38 |
39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 | {% endblock %} 57 | 58 | {% block scripts %} 59 | 249 | {% endblock %} 250 | --------------------------------------------------------------------------------