├── .gitignore ├── .npmignore ├── README.md ├── orca-snapshot.png ├── package.json ├── src └── index.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | output 3 | orca-output 4 | .env 5 | .DS_Store 6 | package-lock.json 7 | orca.config.json 8 | .vscode -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | orca-output 3 | orca.png 4 | orca.config.json -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Orca 2 | 3 | ![Orca](orca-snapshot.png) 4 | 5 | Orca is a CLI tool for downloading your Reddit data; 6 | - Upvoted 7 | - Saved 8 | - Submissions 9 | - Comments 10 | 11 | ## Help 12 | 13 | ```terminal 14 | npx @uxdx/orca -h 15 | ``` 16 | 17 | ## Usage 18 | 19 | ```terminal 20 | npx @uxdx/orca --access-token=70162531-eWBggyup_FAKE_Usdf1cz7u-G9pM_dhrVf3g 21 | ``` 22 | 23 | ### Install globally 24 | 25 | ```terminal 26 | npm i @uxdx/orca -g 27 | orca -h 28 | ``` 29 | -------------------------------------------------------------------------------- /orca-snapshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uxdxdev/orca/515906729c0288e70f80d8873c5066225b7c486d/orca-snapshot.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uxdx/orca", 3 | "version": "1.3.6", 4 | "description": "", 5 | "main": "./src/index.js", 6 | "bin": { 7 | "orca": "./src/index.js" 8 | }, 9 | "scripts": { 10 | "start": "node src/index.js" 11 | }, 12 | "author": "", 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/uxdxdev/orca.git" 16 | }, 17 | "keywords": [ 18 | "reddit" 19 | ], 20 | "license": "MIT", 21 | "dependencies": { 22 | "boxen": "^4.2.0", 23 | "chalk": "^4.1.0", 24 | "commander": "^6.2.0", 25 | "ora": "^5.1.0", 26 | "snoowrap": "^1.21.0" 27 | } 28 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const snoowrap = require('snoowrap'); 4 | const fs = require("fs"); 5 | const { program } = require('commander'); 6 | const chalk = require('chalk'); 7 | const boxen = require('boxen'); 8 | const ora = require('ora'); 9 | 10 | const clientId = 'FlF8aE_FAKE_gpYa_LNw' 11 | const clientSecret = 'z1KNAUb_c0MF7_FAKE_hGyR8lfHCQjnzJtGw' 12 | const accessToken = '70162531-eWBggyup_FAKE_Usdf1cz7u-G9pM_dhrVf3g' 13 | const heading = boxen(`${chalk.magentaBright('Orca')} - ${chalk.bold('Download your Reddit data.')}`, { padding: 1, margin: 1, borderStyle: 'round' }) 14 | 15 | const configFileName = 'orca.config.json' 16 | 17 | program 18 | .name("orca") 19 | .usage("--access-token=") 20 | .helpOption('-h, --help', 'Display setup steps and options') 21 | .description(`${heading} 22 | Setup steps: 23 | - Open https://www.reddit.com/prefs/apps/ 24 | - Click ${chalk.bold('Create app')} button 25 | - Pick a name, e.g. ${chalk.bold('Orca web app')} 26 | - Select ${chalk.bold('web app')} as the application type 27 | - Set ${chalk.bold('redirect url')} to https://not-an-aardvark.github.io/reddit-oauth-helper/ 28 | - Click ${chalk.bold('Create app')} button 29 | - Copy your ${chalk.magenta('client id')}, e.g. 30 | 31 | Orca 32 | web app 33 | ${chalk.magenta(clientId)} (client id) 34 | 35 | - Copy your ${chalk.cyan('client secret')}, e.g. 36 | 37 | secret ${chalk.cyan(clientSecret)} 38 | 39 | - Open https://not-an-aardvark.github.io/reddit-oauth-helper/ 40 | - Input your ${chalk.bold('client id')} and ${chalk.bold('client secret')} at the top of the page 41 | - Select scopes 42 | - history 43 | - identity 44 | - read 45 | - Click ${chalk.bold('Generate tokens')} button and then click ${chalk.bold('Allow')} 46 | - Copy your ${chalk.blue('access token')} from the bottom of the page, e.g. 47 | 48 | Access token: ${chalk.blue(accessToken)} 49 | 50 | - Run Orca 51 | 52 | npx @mortond/orca --access-token=${chalk.blue(accessToken)} 53 | `) 54 | .option('--only-latest', 'Only download the latest data. See orca.config.json') 55 | .option('--data ', 'Data to download in a comma separated string e.g. upvoted,saved', 'upvoted,saved,submissions,comments') 56 | .option('--config-dir ', 'Path to directory containing orca.config.json file', './') 57 | .option('--output-dir ', 'Output directory for data files', './orca-output') 58 | .option('--format ', 'Format of the downloaded data e.g. csv, text, json', 'csv') 59 | .option('--client-id ', 'Reddit application client Id. See https://www.reddit.com/prefs/apps/') 60 | .option('--client-secret ', 'Reddit application client secret. See https://www.reddit.com/prefs/apps/') 61 | .option('--access-token ', 'Access token generated using https://not-an-aardvark.github.io/reddit-oauth-helper/. This token type is only valid for a short time') 62 | .option('--refresh-token ', 'Refresh token generated using https://not-an-aardvark.github.io/reddit-oauth-helper/. Use this for longer running jobs e.g. cron') 63 | 64 | program.parse(process.argv); 65 | 66 | const r = new snoowrap({ 67 | userAgent: 'Orca app', 68 | clientId: program.clientId, 69 | clientSecret: program.clientSecret, 70 | accessToken: program.accessToken, 71 | refreshToken: program.refreshToken 72 | }); 73 | 74 | // queue requests if rate limit is hit 75 | r.config({ continueAfterRatelimitError: true }); 76 | 77 | const writeDataToFile = async ({ rootOutputDirectory, dataType, filename, data, format }) => { 78 | const fileExtension = '.' + format 79 | const directory = rootOutputDirectory + '/' + dataType + '/' 80 | const spinner = getSpinner(`Writing data to ${chalk.magentaBright(`${directory + filename + fileExtension}`)}`).start(); 81 | 82 | if (!data) { 83 | spinner.fail(`Cannot write invalid ${chalk.magentaBright(`${directory + filename + fileExtension}`)} data`) 84 | return; 85 | } 86 | 87 | return new Promise((resolve, reject) => { 88 | fs.mkdir(directory, { recursive: true }, (err) => { 89 | if (err) { 90 | spinner.fail(`Writing data to ${chalk.magentaBright(`${directory + filename + fileExtension}`)}`) 91 | reject(err); 92 | } 93 | 94 | fs.writeFile(directory + filename + fileExtension, data, err => { 95 | if (err) { 96 | spinner.fail(err) 97 | reject(err); 98 | } 99 | spinner.succeed() 100 | resolve(); 101 | }); 102 | }); 103 | }) 104 | 105 | } 106 | 107 | const getOptions = ({ dataType, dataIdPrefix, config, onlyLatest }) => { 108 | let options = {} 109 | let data = config.data; 110 | 111 | // get the latest entry for this data type 112 | if (onlyLatest) { 113 | const latestEntry = data[dataType].latest 114 | if (latestEntry) { 115 | options.before = `${dataIdPrefix}${latestEntry}` 116 | } 117 | } 118 | return options 119 | } 120 | 121 | const getSpinner = (text) => { 122 | const spinner = ora({ 123 | prefixText: ' ', 124 | text: text 125 | }) 126 | return { 127 | start: () => spinner.start(), 128 | fail: (error) => spinner.fail(error), 129 | succeed: () => spinner.succeed() 130 | } 131 | 132 | } 133 | const getSavedContent = async ({ config, onlyLatest }) => { 134 | const dataType = 'saved' 135 | 136 | const options = getOptions({ dataType, dataIdPrefix: 't3_', config, onlyLatest }) 137 | 138 | const spinner = getSpinner(`Fetching ${chalk.magentaBright(dataType)} content`) 139 | spinner.start(); 140 | 141 | let data = await r.getMe().getSavedContent(options) 142 | .then(async listing => { 143 | if (!onlyLatest) return await listing.fetchAll() 144 | return listing 145 | }) 146 | .catch(error => error.statusCode) 147 | 148 | 149 | if (!Array.isArray(data)) { 150 | spinner.fail(`Failed to fetch ${chalk.magentaBright(dataType)} content. ${data}`) 151 | throw data 152 | } 153 | 154 | spinner.succeed(); 155 | 156 | return data.map(item => { 157 | return { 158 | id: item.id, 159 | type: dataType, 160 | link: 'https://www.reddit.com' + item.permalink, 161 | } 162 | }) 163 | } 164 | 165 | const getUpvotedContent = async ({ config, onlyLatest }) => { 166 | const dataType = 'upvoted' 167 | 168 | const options = getOptions({ dataType, dataIdPrefix: 't3_', config, onlyLatest }) 169 | 170 | const spinner = getSpinner(`Fetching ${chalk.magentaBright(dataType)} content`) 171 | spinner.start(); 172 | 173 | let data = await r.getMe().getUpvotedContent(options) 174 | .then(async listing => { 175 | if (!onlyLatest) return await listing.fetchAll() 176 | return listing 177 | }) 178 | .catch(error => error.statusCode) 179 | 180 | if (!Array.isArray(data)) { 181 | spinner.fail(`Failed to fetch ${chalk.magentaBright(dataType)} content. ${data}`) 182 | throw data; 183 | } 184 | 185 | spinner.succeed() 186 | 187 | return data.map(item => { 188 | return { 189 | id: item.id, 190 | type: dataType, 191 | link: 'https://www.reddit.com' + item.permalink, 192 | } 193 | }) 194 | } 195 | 196 | const getSubmissionsContent = async ({ config, onlyLatest }) => { 197 | const dataType = 'submissions' 198 | 199 | const options = getOptions({ dataType, dataIdPrefix: 't3_', config, onlyLatest }) 200 | 201 | const spinner = getSpinner(`Fetching ${chalk.magentaBright(dataType)} content`) 202 | spinner.start(); 203 | 204 | let data = await r.getMe().getSubmissions(options) 205 | .then(async listing => { 206 | if (!onlyLatest) return await listing.fetchAll() 207 | return listing 208 | }) 209 | .catch(error => error.statusCode) 210 | 211 | 212 | if (!Array.isArray(data)) { 213 | spinner.fail(`Failed to fetch ${chalk.magentaBright(dataType)} content. ${data}`) 214 | throw data 215 | } 216 | 217 | spinner.succeed(); 218 | 219 | const result = [] 220 | for (const submission of data) { 221 | let submissionsContentData = '' 222 | if (submission.comments) { 223 | const comments = await submission.comments.fetchAll().catch(() => console.log(`Error fetching all ${dataType} comments`)) 224 | comments.forEach(comment => { 225 | submissionsContentData += ' > ' + comment.body.replace(/\n/g, '') 226 | }) 227 | } 228 | result.push({ 229 | id: submission.id, 230 | type: dataType, 231 | title: submission.title, 232 | body: submission.selftext === '' ? submission.url : submission.selftext, 233 | comments: submissionsContentData, 234 | }) 235 | } 236 | 237 | return result; 238 | } 239 | 240 | const getCommentsContent = async ({ config, onlyLatest }) => { 241 | const dataType = 'comments' 242 | 243 | const options = getOptions({ dataType, dataIdPrefix: 't1_', config, onlyLatest }) 244 | 245 | const spinner = getSpinner(`Fetching ${chalk.magentaBright(dataType)} content`) 246 | spinner.start(); 247 | 248 | let data = await r.getMe().getComments(options) 249 | .then(async listing => { 250 | if (!onlyLatest) return await listing.fetchAll() 251 | return listing 252 | }) 253 | .catch(error => error.statusCode) 254 | 255 | if (!Array.isArray(data)) { 256 | spinner.fail(`Failed to fetch ${chalk.magentaBright(dataType)} content. ${data}`) 257 | throw data 258 | } 259 | 260 | spinner.succeed(); 261 | 262 | return data.map(item => { 263 | return { 264 | id: item.id, 265 | type: dataType, 266 | title: item.link_title, 267 | body: item.body.replace(/\n/gm, ''), 268 | link: 'https://www.reddit.com' + item.permalink, 269 | } 270 | }) 271 | } 272 | 273 | const formatCsv = (data) => { 274 | if (!data || !data.length) return [] 275 | 276 | const array = [Object.keys(data[0])].concat(data) 277 | return array.map(item => { 278 | return Object.values(item).map(entry => entry.replace(/\n|\r|,/gm, ' ')).toString() 279 | }).join('\n') 280 | } 281 | 282 | const formatTxt = (data) => { 283 | if (!data || !data.length) return [] 284 | 285 | let result = '' 286 | data.forEach(item => { 287 | Object.keys(item).forEach(key => { 288 | result += `${key}: ${item[key].replace(/\n|\r/gm, ' ')}\n` 289 | }) 290 | 291 | result += `---` + `\n` 292 | }) 293 | return result 294 | } 295 | 296 | const formatJson = (data) => { 297 | if (!data || !data.length) return [] 298 | 299 | return JSON.stringify(data) 300 | } 301 | 302 | const loadConfigFile = () => { 303 | 304 | // --config 305 | const configFilePath = program.configDir + configFileName; 306 | 307 | // if the config file does not exist create it 308 | if (!fs.existsSync(configFilePath)) { 309 | const config = { 310 | data: { 311 | saved: { 312 | latest: '' 313 | }, 314 | submissions: { 315 | latest: '' 316 | }, 317 | comments: { 318 | latest: '' 319 | }, 320 | upvoted: { 321 | latest: '' 322 | } 323 | } 324 | } 325 | saveConfigFile({ configFilePath, config }) 326 | } 327 | 328 | const config = fs.readFileSync(configFilePath, { encoding: 'utf-8' }, (err, data) => { 329 | if (err) { 330 | console.log('reading config file error') 331 | } else { 332 | return data; 333 | } 334 | }) 335 | return JSON.parse(config) 336 | } 337 | 338 | const saveConfigFile = ({ config }) => { 339 | // --config 340 | const configFilePath = program.configDir + configFileName; 341 | 342 | fs.writeFileSync(configFilePath, JSON.stringify(config)) 343 | } 344 | 345 | const saveLatestEntry = data => { 346 | if (!data || !data.length) return [] 347 | 348 | const config = loadConfigFile(); 349 | 350 | const latestId = data[0].id 351 | const dataType = data[0].type 352 | 353 | // save the latest entry of the downloaded data 354 | config.data[dataType].latest = latestId 355 | 356 | saveConfigFile({ config }) 357 | 358 | return data; 359 | } 360 | 361 | const main = () => { 362 | 363 | console.log(heading) 364 | 365 | // --output-dir 366 | let rootOutputDirectory = program.outputDir.replace(/\/$/, ''); 367 | 368 | // --format 369 | let formatter; 370 | let format = program.format.split(',')[0].replace(/'.'/g, ''); 371 | if (format === 'txt') { 372 | formatter = formatTxt 373 | } else if (format === 'json') { 374 | formatter = formatJson 375 | } else { 376 | formatter = formatCsv 377 | 378 | // if the user provides an incorrect format string e.g. --format=jsozzz 379 | // then the formatter will default to csv and reset the format string 380 | // for the data writer. 381 | format = 'csv' 382 | } 383 | 384 | // --data 385 | const dataToDownload = program.data.split(','); 386 | 387 | // --config 388 | const configFilePath = program.configDir + configFileName 389 | const config = loadConfigFile({ configFilePath }) 390 | 391 | // --onlyLatest 392 | let onlyLatest = program.onlyLatest 393 | 394 | const promises = [] 395 | const dataTypeDownloaderMap = { 396 | saved: getSavedContent, 397 | upvoted: getUpvotedContent, 398 | submissions: getSubmissionsContent, 399 | comments: getCommentsContent 400 | } 401 | dataToDownload.forEach(dataType => { 402 | const downloader = dataTypeDownloaderMap[dataType] 403 | const promise = downloader({ config, onlyLatest }) 404 | .then(saveLatestEntry) 405 | .then(formatter) 406 | .then(data => { 407 | const filename = `reddit_${dataType}`; 408 | return writeDataToFile({ rootOutputDirectory, dataType, filename, data, format }); 409 | }).catch(error => { 410 | // do nothing 411 | }) 412 | promises.push(promise) 413 | }) 414 | 415 | Promise.all(promises).then(() => console.log('\n')) 416 | } 417 | 418 | main(); -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ajv@^6.12.3: 6 | version "6.12.6" 7 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 8 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 9 | dependencies: 10 | fast-deep-equal "^3.1.1" 11 | fast-json-stable-stringify "^2.0.0" 12 | json-schema-traverse "^0.4.1" 13 | uri-js "^4.2.2" 14 | 15 | ansi-align@^3.0.0: 16 | version "3.0.0" 17 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" 18 | integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== 19 | dependencies: 20 | string-width "^3.0.0" 21 | 22 | ansi-regex@^4.1.0: 23 | version "4.1.0" 24 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 25 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 26 | 27 | ansi-regex@^5.0.0: 28 | version "5.0.0" 29 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 30 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 31 | 32 | ansi-styles@^4.1.0: 33 | version "4.3.0" 34 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 35 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 36 | dependencies: 37 | color-convert "^2.0.1" 38 | 39 | asn1@~0.2.3: 40 | version "0.2.4" 41 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 42 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 43 | dependencies: 44 | safer-buffer "~2.1.0" 45 | 46 | assert-plus@1.0.0, assert-plus@^1.0.0: 47 | version "1.0.0" 48 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 49 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 50 | 51 | async-limiter@~1.0.0: 52 | version "1.0.1" 53 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" 54 | integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== 55 | 56 | asynckit@^0.4.0: 57 | version "0.4.0" 58 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 59 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 60 | 61 | aws-sign2@~0.7.0: 62 | version "0.7.0" 63 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 64 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 65 | 66 | aws4@^1.8.0: 67 | version "1.11.0" 68 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" 69 | integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== 70 | 71 | bcrypt-pbkdf@^1.0.0: 72 | version "1.0.2" 73 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 74 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 75 | dependencies: 76 | tweetnacl "^0.14.3" 77 | 78 | bluebird@^3.5.0, bluebird@^3.5.5: 79 | version "3.7.2" 80 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 81 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 82 | 83 | boxen@^4.2.0: 84 | version "4.2.0" 85 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" 86 | integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== 87 | dependencies: 88 | ansi-align "^3.0.0" 89 | camelcase "^5.3.1" 90 | chalk "^3.0.0" 91 | cli-boxes "^2.2.0" 92 | string-width "^4.1.0" 93 | term-size "^2.1.0" 94 | type-fest "^0.8.1" 95 | widest-line "^3.1.0" 96 | 97 | camelcase@^5.3.1: 98 | version "5.3.1" 99 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 100 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 101 | 102 | caseless@~0.12.0: 103 | version "0.12.0" 104 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 105 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 106 | 107 | chalk@^3.0.0: 108 | version "3.0.0" 109 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 110 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 111 | dependencies: 112 | ansi-styles "^4.1.0" 113 | supports-color "^7.1.0" 114 | 115 | chalk@^4.0.0, chalk@^4.1.0: 116 | version "4.1.0" 117 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 118 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 119 | dependencies: 120 | ansi-styles "^4.1.0" 121 | supports-color "^7.1.0" 122 | 123 | cli-boxes@^2.2.0: 124 | version "2.2.1" 125 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 126 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 127 | 128 | cli-cursor@^3.1.0: 129 | version "3.1.0" 130 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 131 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 132 | dependencies: 133 | restore-cursor "^3.1.0" 134 | 135 | cli-spinners@^2.4.0: 136 | version "2.5.0" 137 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" 138 | integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== 139 | 140 | clone@^1.0.2: 141 | version "1.0.4" 142 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 143 | integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= 144 | 145 | color-convert@^2.0.1: 146 | version "2.0.1" 147 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 148 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 149 | dependencies: 150 | color-name "~1.1.4" 151 | 152 | color-name@~1.1.4: 153 | version "1.1.4" 154 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 155 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 156 | 157 | combined-stream@^1.0.6, combined-stream@~1.0.6: 158 | version "1.0.8" 159 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 160 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 161 | dependencies: 162 | delayed-stream "~1.0.0" 163 | 164 | commander@^6.2.0: 165 | version "6.2.0" 166 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" 167 | integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== 168 | 169 | core-util-is@1.0.2: 170 | version "1.0.2" 171 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 172 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 173 | 174 | dashdash@^1.12.0: 175 | version "1.14.1" 176 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 177 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 178 | dependencies: 179 | assert-plus "^1.0.0" 180 | 181 | defaults@^1.0.3: 182 | version "1.0.3" 183 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 184 | integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= 185 | dependencies: 186 | clone "^1.0.2" 187 | 188 | delayed-stream@~1.0.0: 189 | version "1.0.0" 190 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 191 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 192 | 193 | ecc-jsbn@~0.1.1: 194 | version "0.1.2" 195 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 196 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 197 | dependencies: 198 | jsbn "~0.1.0" 199 | safer-buffer "^2.1.0" 200 | 201 | emoji-regex@^7.0.1: 202 | version "7.0.3" 203 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 204 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 205 | 206 | emoji-regex@^8.0.0: 207 | version "8.0.0" 208 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 209 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 210 | 211 | extend@~3.0.2: 212 | version "3.0.2" 213 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 214 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 215 | 216 | extsprintf@1.3.0: 217 | version "1.3.0" 218 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 219 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 220 | 221 | extsprintf@^1.2.0: 222 | version "1.4.0" 223 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 224 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 225 | 226 | fast-deep-equal@^3.1.1: 227 | version "3.1.3" 228 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 229 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 230 | 231 | fast-json-stable-stringify@^2.0.0: 232 | version "2.1.0" 233 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 234 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 235 | 236 | forever-agent@~0.6.1: 237 | version "0.6.1" 238 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 239 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 240 | 241 | form-data@~2.3.2: 242 | version "2.3.3" 243 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 244 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 245 | dependencies: 246 | asynckit "^0.4.0" 247 | combined-stream "^1.0.6" 248 | mime-types "^2.1.12" 249 | 250 | getpass@^0.1.1: 251 | version "0.1.7" 252 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 253 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 254 | dependencies: 255 | assert-plus "^1.0.0" 256 | 257 | har-schema@^2.0.0: 258 | version "2.0.0" 259 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 260 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 261 | 262 | har-validator@~5.1.3: 263 | version "5.1.5" 264 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" 265 | integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== 266 | dependencies: 267 | ajv "^6.12.3" 268 | har-schema "^2.0.0" 269 | 270 | harmony-reflect@^1.4.3: 271 | version "1.6.1" 272 | resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" 273 | integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== 274 | 275 | has-flag@^4.0.0: 276 | version "4.0.0" 277 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 278 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 279 | 280 | http-signature@~1.2.0: 281 | version "1.2.0" 282 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 283 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 284 | dependencies: 285 | assert-plus "^1.0.0" 286 | jsprim "^1.2.2" 287 | sshpk "^1.7.0" 288 | 289 | is-fullwidth-code-point@^2.0.0: 290 | version "2.0.0" 291 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 292 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 293 | 294 | is-fullwidth-code-point@^3.0.0: 295 | version "3.0.0" 296 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 297 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 298 | 299 | is-interactive@^1.0.0: 300 | version "1.0.0" 301 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" 302 | integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== 303 | 304 | is-typedarray@~1.0.0: 305 | version "1.0.0" 306 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 307 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 308 | 309 | isstream@~0.1.2: 310 | version "0.1.2" 311 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 312 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 313 | 314 | jsbn@~0.1.0: 315 | version "0.1.1" 316 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 317 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 318 | 319 | json-schema-traverse@^0.4.1: 320 | version "0.4.1" 321 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 322 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 323 | 324 | json-schema@0.2.3: 325 | version "0.2.3" 326 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 327 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 328 | 329 | json-stringify-safe@~5.0.1: 330 | version "5.0.1" 331 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 332 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 333 | 334 | jsprim@^1.2.2: 335 | version "1.4.1" 336 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 337 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 338 | dependencies: 339 | assert-plus "1.0.0" 340 | extsprintf "1.3.0" 341 | json-schema "0.2.3" 342 | verror "1.10.0" 343 | 344 | lodash@^4.17.15, lodash@^4.17.19: 345 | version "4.17.20" 346 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 347 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 348 | 349 | log-symbols@^4.0.0: 350 | version "4.0.0" 351 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" 352 | integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== 353 | dependencies: 354 | chalk "^4.0.0" 355 | 356 | mime-db@1.44.0: 357 | version "1.44.0" 358 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 359 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 360 | 361 | mime-types@^2.1.12, mime-types@~2.1.19: 362 | version "2.1.27" 363 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 364 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 365 | dependencies: 366 | mime-db "1.44.0" 367 | 368 | mimic-fn@^2.1.0: 369 | version "2.1.0" 370 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 371 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 372 | 373 | mute-stream@0.0.8: 374 | version "0.0.8" 375 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 376 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 377 | 378 | oauth-sign@~0.9.0: 379 | version "0.9.0" 380 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 381 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 382 | 383 | onetime@^5.1.0: 384 | version "5.1.2" 385 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 386 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 387 | dependencies: 388 | mimic-fn "^2.1.0" 389 | 390 | ora@^5.1.0: 391 | version "5.1.0" 392 | resolved "https://registry.yarnpkg.com/ora/-/ora-5.1.0.tgz#b188cf8cd2d4d9b13fd25383bc3e5cba352c94f8" 393 | integrity sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w== 394 | dependencies: 395 | chalk "^4.1.0" 396 | cli-cursor "^3.1.0" 397 | cli-spinners "^2.4.0" 398 | is-interactive "^1.0.0" 399 | log-symbols "^4.0.0" 400 | mute-stream "0.0.8" 401 | strip-ansi "^6.0.0" 402 | wcwidth "^1.0.1" 403 | 404 | performance-now@^2.1.0: 405 | version "2.1.0" 406 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 407 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 408 | 409 | promise-chains@^0.3.11: 410 | version "0.3.12" 411 | resolved "https://registry.yarnpkg.com/promise-chains/-/promise-chains-0.3.12.tgz#68e63484c9b962f1d6e2ab672324d14f5909ee21" 412 | integrity sha1-aOY0hMm5YvHW4qtnIyTRT1kJ7iE= 413 | dependencies: 414 | harmony-reflect "^1.4.3" 415 | 416 | psl@^1.1.28: 417 | version "1.8.0" 418 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 419 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 420 | 421 | punycode@^2.1.0, punycode@^2.1.1: 422 | version "2.1.1" 423 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 424 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 425 | 426 | qs@~6.5.2: 427 | version "6.5.2" 428 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 429 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 430 | 431 | request-promise-core@1.1.4: 432 | version "1.1.4" 433 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" 434 | integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== 435 | dependencies: 436 | lodash "^4.17.19" 437 | 438 | request-promise@^4.2.2: 439 | version "4.2.6" 440 | resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.6.tgz#7e7e5b9578630e6f598e3813c0f8eb342a27f0a2" 441 | integrity sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ== 442 | dependencies: 443 | bluebird "^3.5.0" 444 | request-promise-core "1.1.4" 445 | stealthy-require "^1.1.1" 446 | tough-cookie "^2.3.3" 447 | 448 | request@^2.87.0: 449 | version "2.88.2" 450 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 451 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 452 | dependencies: 453 | aws-sign2 "~0.7.0" 454 | aws4 "^1.8.0" 455 | caseless "~0.12.0" 456 | combined-stream "~1.0.6" 457 | extend "~3.0.2" 458 | forever-agent "~0.6.1" 459 | form-data "~2.3.2" 460 | har-validator "~5.1.3" 461 | http-signature "~1.2.0" 462 | is-typedarray "~1.0.0" 463 | isstream "~0.1.2" 464 | json-stringify-safe "~5.0.1" 465 | mime-types "~2.1.19" 466 | oauth-sign "~0.9.0" 467 | performance-now "^2.1.0" 468 | qs "~6.5.2" 469 | safe-buffer "^5.1.2" 470 | tough-cookie "~2.5.0" 471 | tunnel-agent "^0.6.0" 472 | uuid "^3.3.2" 473 | 474 | restore-cursor@^3.1.0: 475 | version "3.1.0" 476 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 477 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 478 | dependencies: 479 | onetime "^5.1.0" 480 | signal-exit "^3.0.2" 481 | 482 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 483 | version "5.2.1" 484 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 485 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 486 | 487 | safe-buffer@~5.1.0: 488 | version "5.1.2" 489 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 490 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 491 | 492 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 493 | version "2.1.2" 494 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 495 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 496 | 497 | signal-exit@^3.0.2: 498 | version "3.0.3" 499 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 500 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 501 | 502 | snoowrap@^1.21.0: 503 | version "1.21.0" 504 | resolved "https://registry.yarnpkg.com/snoowrap/-/snoowrap-1.21.0.tgz#559d30a11152860d3a4322f113963308c62df969" 505 | integrity sha512-vSQlfm0ikek6mezBhTGtYw0vk4hdpgIrtm2o4kZPDzg0HVs4b/Kw7COEfD8TujQP0zzp9EGSwa1rkHufBrwkEw== 506 | dependencies: 507 | bluebird "^3.5.5" 508 | lodash "^4.17.15" 509 | promise-chains "^0.3.11" 510 | request "^2.87.0" 511 | request-promise "^4.2.2" 512 | ws "^3.3.1" 513 | 514 | sshpk@^1.7.0: 515 | version "1.16.1" 516 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 517 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 518 | dependencies: 519 | asn1 "~0.2.3" 520 | assert-plus "^1.0.0" 521 | bcrypt-pbkdf "^1.0.0" 522 | dashdash "^1.12.0" 523 | ecc-jsbn "~0.1.1" 524 | getpass "^0.1.1" 525 | jsbn "~0.1.0" 526 | safer-buffer "^2.0.2" 527 | tweetnacl "~0.14.0" 528 | 529 | stealthy-require@^1.1.1: 530 | version "1.1.1" 531 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 532 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 533 | 534 | string-width@^3.0.0: 535 | version "3.1.0" 536 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 537 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 538 | dependencies: 539 | emoji-regex "^7.0.1" 540 | is-fullwidth-code-point "^2.0.0" 541 | strip-ansi "^5.1.0" 542 | 543 | string-width@^4.0.0, string-width@^4.1.0: 544 | version "4.2.0" 545 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 546 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 547 | dependencies: 548 | emoji-regex "^8.0.0" 549 | is-fullwidth-code-point "^3.0.0" 550 | strip-ansi "^6.0.0" 551 | 552 | strip-ansi@^5.1.0: 553 | version "5.2.0" 554 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 555 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 556 | dependencies: 557 | ansi-regex "^4.1.0" 558 | 559 | strip-ansi@^6.0.0: 560 | version "6.0.0" 561 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 562 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 563 | dependencies: 564 | ansi-regex "^5.0.0" 565 | 566 | supports-color@^7.1.0: 567 | version "7.2.0" 568 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 569 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 570 | dependencies: 571 | has-flag "^4.0.0" 572 | 573 | term-size@^2.1.0: 574 | version "2.2.1" 575 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" 576 | integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== 577 | 578 | tough-cookie@^2.3.3, tough-cookie@~2.5.0: 579 | version "2.5.0" 580 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 581 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 582 | dependencies: 583 | psl "^1.1.28" 584 | punycode "^2.1.1" 585 | 586 | tunnel-agent@^0.6.0: 587 | version "0.6.0" 588 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 589 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 590 | dependencies: 591 | safe-buffer "^5.0.1" 592 | 593 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 594 | version "0.14.5" 595 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 596 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 597 | 598 | type-fest@^0.8.1: 599 | version "0.8.1" 600 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 601 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 602 | 603 | ultron@~1.1.0: 604 | version "1.1.1" 605 | resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" 606 | integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== 607 | 608 | uri-js@^4.2.2: 609 | version "4.4.0" 610 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" 611 | integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== 612 | dependencies: 613 | punycode "^2.1.0" 614 | 615 | uuid@^3.3.2: 616 | version "3.4.0" 617 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 618 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 619 | 620 | verror@1.10.0: 621 | version "1.10.0" 622 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 623 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 624 | dependencies: 625 | assert-plus "^1.0.0" 626 | core-util-is "1.0.2" 627 | extsprintf "^1.2.0" 628 | 629 | wcwidth@^1.0.1: 630 | version "1.0.1" 631 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 632 | integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= 633 | dependencies: 634 | defaults "^1.0.3" 635 | 636 | widest-line@^3.1.0: 637 | version "3.1.0" 638 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 639 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 640 | dependencies: 641 | string-width "^4.0.0" 642 | 643 | ws@^3.3.1: 644 | version "3.3.3" 645 | resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" 646 | integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== 647 | dependencies: 648 | async-limiter "~1.0.0" 649 | safe-buffer "~5.1.0" 650 | ultron "~1.1.0" 651 | --------------------------------------------------------------------------------