diff --git a/.env.json b/.env.json new file mode 100644 index 00000000..af52b84a --- /dev/null +++ b/.env.json @@ -0,0 +1,8 @@ +{ + "commit": { + "full": "8936331fda1a0a4f8bb5d02d06966580264fe447", + "short": "8936331" + }, + "node": "v12.9.0", + "npm": "6.10.2" +} diff --git a/.gitignore b/.gitignore index c08d1d39..2c5e518d 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,6 @@ jspm_packages dist/ tmp/ +.vscode/ *.swp .DS_Store diff --git a/demo/ankii_demo.mov b/demo/ankii_demo.mov new file mode 100644 index 00000000..98c2a45c Binary files /dev/null and b/demo/ankii_demo.mov differ diff --git a/demo/ankii_strategy.txt b/demo/ankii_strategy.txt new file mode 100644 index 00000000..73b438c4 --- /dev/null +++ b/demo/ankii_strategy.txt @@ -0,0 +1,5 @@ +again = 2day +hard = 当前复习时间间隔/2 +good = 当前复习时间间隔 +easy = 当前复习时间间隔*2 +future = 180day diff --git a/demo/iterm_and_note.png b/demo/iterm_and_note.png new file mode 100644 index 00000000..03d28cf0 Binary files /dev/null and b/demo/iterm_and_note.png differ diff --git a/demo/lcs_demo.mov b/demo/lcs_demo.mov new file mode 100644 index 00000000..88f1b303 Binary files /dev/null and b/demo/lcs_demo.mov differ diff --git a/demo/only-iterm.png b/demo/only-iterm.png new file mode 100644 index 00000000..9342451c Binary files /dev/null and b/demo/only-iterm.png differ diff --git a/docs/commands.md b/docs/commands.md index 1893dbc4..7980ee78 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -49,7 +49,7 @@ Display help message. It also shows examples of the commands. Options: -h, --help Show help [boolean] - Seek more help at https://skygragon.github.io/leetcode-cli/commands + Seek more help at https://skygragon.github.io/leetcode-cli/commands dd Show help on sub command: diff --git a/lib/cli.js b/lib/cli.js index e59cf7f5..453d7923 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -71,6 +71,19 @@ function initPlugins(cb) { } } +function initPluginsLt(cb) { + if (Plugin.initLt()) { + Plugin.save(); + return cb(); + } else { + Plugin.installMissings(function(e) { + if (e) return cb(e); + Plugin.init(); + return cb(); + }); + } +} + var cli = {}; function runCommand() { @@ -81,7 +94,7 @@ function runCommand() { .help('h') .alias('h', 'help') .version(false) - .epilog('Seek more help at https://skygragon.github.io/leetcode-cli/commands') + .epilog('Seek more help at https://skygragon.github.io/leetcode-cli/commands dd') .wrap(Math.min(h.width, 120)) .argv; } diff --git a/lib/commands/list.js b/lib/commands/list.js index c010de86..7f61ff9d 100644 --- a/lib/commands/list.js +++ b/lib/commands/list.js @@ -53,7 +53,19 @@ cmd.handler = function(argv) { if (word.endsWith(word.substr(-1).repeat(6))) { log.warn('Hmmm...you might need a new keyboard?'); } - problems = problems.filter(x => x.name.toLowerCase().includes(word)); + + let words = word.split("-"); + for(let i=0;i x.name.toLowerCase().includes(words[i])); + } + // problems = problems.filter(x => x.name.toLowerCase().includes(word)); + + //breaks the other possible parameters, need to fix in future + for(let i=1;i x.name.toLowerCase().includes(argv._[i])); + } } const stat = {}; diff --git a/lib/commands/show.js b/lib/commands/show.js index 7c66204a..983e44b4 100644 --- a/lib/commands/show.js +++ b/lib/commands/show.js @@ -1,6 +1,8 @@ 'use strict'; var util = require('util'); +var cheerio = require('cheerio'); +var he = require('he'); var _ = require('underscore'); var childProcess = require('child_process'); @@ -89,6 +91,19 @@ function genFileName(problem, opts) { } } +// removes html tags from problem description before printing it to the terminal +function cleanProblemDesc(desc){ + // Replace with '^' as the power operator + desc = desc.replace(/<\/sup>/gm, '').replace(//gm, '^'); + desc = he.decode(cheerio.load(desc).root().text()); + // NOTE: wordwrap internally uses '\n' as EOL, so here we have to + // remove all '\r' in the raw string. + desc = desc.replace(/\r\n/g, '\n').replace(/^ /mg, '⁠'); + // const wrap = require('wordwrap')(79); + // desc = wrap(desc); + return desc; +} + function showProblem(problem, argv) { const taglist = [problem.category] .concat(problem.companies || []) @@ -144,8 +159,8 @@ function showProblem(problem, argv) { if (argv.extra) { log.info(); log.info('Tags: ' + taglist); - log.info(); - log.info('Langs: ' + langlist); + // log.info(); + // log.info('Langs: ' + langlist); } log.info(); @@ -162,7 +177,7 @@ function showProblem(problem, argv) { log.printf('* Testcase Example: %s', chalk.yellow(util.inspect(problem.testcase))); log.info(); - log.info(problem.desc); + log.info(cleanProblemDesc(problem.desc)); } cmd.handler = function(argv) { diff --git a/lib/commands/submission.js b/lib/commands/submission.js index de0449a3..7ee2c0c2 100644 --- a/lib/commands/submission.js +++ b/lib/commands/submission.js @@ -101,8 +101,8 @@ function exportSubmission(problem, argv, cb) { file.mkdir(argv.outdir); // skip the existing cached submissions - if (file.exist(f)) - return cb(null, chalk.underline(f)); + // if (file.exist(f)) + // return cb(null, chalk.underline(f)); core.getSubmission(submission, function(e, submission) { if (e) return cb(e); diff --git a/lib/config.js b/lib/config.js index 373b9f0f..4658f5d9 100644 --- a/lib/config.js +++ b/lib/config.js @@ -8,7 +8,8 @@ const DEFAULT_CONFIG = { // usually you don't wanna change those sys: { categories: [ - 'algorithms', + 'all', + // 'algorithms', 'database', 'shell' ], @@ -28,7 +29,10 @@ const DEFAULT_CONFIG = { 'ruby', 'rust', 'scala', - 'swift' + 'swift', + 'any', + 'any2', + 'any3' ], urls: { base: 'https://leetcode.com', diff --git a/lib/plugin.js b/lib/plugin.js index bbd6da44..3c24fe17 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -94,6 +94,75 @@ Plugin.init = function(head) { p.file = f.file; p.enabled = stats[p.name]; + if(p.name==='lintcode'){ + p.enabled = false; + } + + if (!(p.name in stats)) { + if (p.builtin) { + log.trace('new builtin plugin, enable by default'); + p.enabled = true; + } else { + log.trace('new 3rd party plugin, disable by default'); + p.enabled = false; + } + } + installed.push(p); + } + // the one with bigger `id` comes first + installed = _.sortBy(installed, x => -x.id); + + // 2. init all in reversed order + for (let i = installed.length - 1; i >= 0; --i) { + const p = installed[i]; + if (p.enabled) { + p.init(); + log.trace('inited plugin: ' + p.name); + } else { + log.trace('skipped plugin: ' + p.name); + } + } + + // 3. chain together + const plugins = installed.filter(x => x.enabled); + let last = head; + for (let p of plugins) { + last.setNext(p); + last = p; + } + + // 4. check missing plugins + const missings = []; + for (let k of _.keys(stats)) { + if (installed.find(x => x.name === k)) continue; + const p = new Plugin(-1, k, 'missing'); + p.enabled = stats[k]; + missings.push(p); + log.trace('missing plugin:' + p.name); + } + + Plugin.plugins = installed.concat(missings); + return missings.length === 0; +}; + +Plugin.initLt = function(head) { + log.trace('initializing all plugins'); + head = head || require('./core'); + + const stats = cache.get(h.KEYS.plugins) || {}; + + // 1. find installed plugins + let installed = []; + for (let f of file.listCodeDir('lib/plugins')) { + const p = f.data; + if (!p) continue; + log.trace('found plugin: ' + p.name + '=' + p.ver); + + p.file = f.file; + p.enabled = stats[p.name]; + if(p.name==='lintcode'){ + p.enabled = true; + } if (!(p.name in stats)) { if (p.builtin) { diff --git a/lib/plugins/company.js b/lib/plugins/company.js new file mode 100644 index 00000000..ac48974e --- /dev/null +++ b/lib/plugins/company.js @@ -0,0 +1,1187 @@ +var Plugin = require('../plugin'); + +// +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/company.md +// +var plugin = new Plugin(100, 'company', '2017.12.18', + 'Plugin to query by company for free user.'); + +// NOTE: those data is collected from different websites that has similar questions: +// * careercup.com +// * lintcode.com +// * 1point3acres.com +// * other results from google search +var COMPONIES = { + '1': ['adobe', 'airbnb', 'amazon', 'apple', 'bloomberg', 'dropbox', 'facebook', 'linkedin', 'microsoft', 'uber', 'yahoo', 'yelp'], + '2': ['adobe', 'airbnb', 'amazon', 'bloomberg', 'microsoft'], + '3': ['adobe', 'amazon', 'bloomberg', 'yelp'], + '4': ['adobe', 'apple', 'dropbox', 'google', 'microsoft', 'yahoo', 'zenefits'], + '5': ['amazon', 'bloomberg', 'microsoft'], + '7': ['apple', 'bloomberg'], + '8': ['amazon', 'bloomberg', 'microsoft', 'uber'], + + '10': ['airbnb', 'facebook', 'google', 'twitter', 'uber'], + '11': ['bloomberg'], + '12': ['twitter'], + '13': ['bloomberg', 'facebook', 'microsoft', 'uber', 'yahoo'], + '14': ['yelp'], + '15': ['adobe', 'amazon', 'bloomberg', 'facebook', 'microsoft'], + '16': ['bloomberg'], + '17': ['amazon', 'dropbox', 'facebook', 'google', 'uber'], + '18': ['linkedin'], + '20': ['airbnb', 'amazon', 'bloomberg', 'facebook', 'google', 'microsoft', 'twitter', 'zenefits'], + '21': ['amazon', 'apple', 'linkedin', 'microsoft'], + '22': ['google', 'uber', 'zenefits'], + '23': ['airbnb', 'amazon', 'facebook', 'google', 'linkedin', 'microsoft', 'twitter', 'uber'], + '24': ['bloomberg', 'microsoft', 'uber'], + '25': ['facebook', 'microsoft'], + '26': ['bloomberg', 'facebook', 'microsoft'], + '28': ['apple', 'facebook', 'microsoft', 'pocketgems'], + '31': ['google'], + '33': ['bloomberg', 'facebook', 'linkedin', 'microsoft', 'uber'], + '34': ['linkedin'], + '36': ['apple', 'snapchat', 'uber'], + '37': ['snapchat', 'uber'], + '38': ['facebook'], + '39': ['snapchat', 'uber'], + '40': ['snapchat'], + '42': ['amazon', 'apple', 'bloomberg', 'google', 'twitter', 'zenefits'], + '43': ['facebook', 'twitter'], + '44': ['facebook', 'google', 'snapchat', 'twitter', 'twosigma'], + '46': ['linkedin', 'microsoft'], + '47': ['linkedin', 'microsoft'], + '48': ['amazon', 'apple', 'microsoft'], + '49': ['amazon', 'bloomberg', 'facebook', 'uber', 'yelp'], + '50': ['bloomberg', 'facebook', 'google', 'linkedin'], + '52': ['zenefits'], + '53': ['bloomberg', 'linkedin', 'microsoft'], + '54': ['google', 'microsoft', 'uber'], + '55': ['microsoft'], + '56': ['bloomberg', 'facebook', 'google', 'linkedin', 'microsoft', 'twitter', 'yelp'], + '57': ['facebook', 'google', 'linkedin'], + '60': ['twitter'], + '62': ['bloomberg'], + '63': ['bloomberg'], + '65': ['linkedin'], + '66': ['google'], + '67': ['facebook'], + '68': ['airbnb', 'facebook', 'linkedin'], + '69': ['apple', 'bloomberg', 'facebook'], + '70': ['adobe', 'apple'], + '71': ['facebook', 'microsoft'], + '73': ['amazon', 'microsoft'], + '75': ['facebook', 'microsoft', 'pocketgems'], + '76': ['facebook', 'linkedin', 'snapchat', 'uber'], + '78': ['amazon', 'bloomberg', 'facebook', 'uber'], + '79': ['bloomberg', 'facebook', 'microsoft'], + '80': ['facebook'], + '85': ['facebook'], + '88': ['bloomberg', 'facebook', 'microsoft'], + '89': ['amazon'], + '90': ['facebook'], + '91': ['facebook', 'microsoft', 'uber'], + '94': ['microsoft'], + '96': ['snapchat'], + '98': ['amazon', 'bloomberg', 'facebook', 'microsoft'], + + '100': ['bloomberg'], + '101': ['bloomberg', 'linkedin', 'microsoft'], + '102': ['amazon', 'apple', 'bloomberg', 'facebook', 'linkedin', 'microsoft'], + '103': ['bloomberg', 'linkedin', 'microsoft'], + '104': ['apple', 'linkedin', 'uber', 'yahoo'], + '105': ['bloomberg'], + '106': ['microsoft'], + '108': ['airbnb'], + '109': ['zenefits'], + '110': ['bloomberg'], + '112': ['microsoft'], + '113': ['bloomberg'], + '114': ['microsoft'], + '116': ['microsoft'], + '117': ['bloomberg', 'facebook', 'microsoft'], + '118': ['apple', 'twitter'], + '119': ['amazon'], + '121': ['amazon', 'bloomberg', 'facebook', 'microsoft', 'uber'], + '122': ['bloomberg'], + '124': ['baidu', 'microsoft'], + '125': ['facebook', 'microsoft', 'uber', 'zenefits'], + '126': ['amazon', 'yelp'], + '127': ['amazon', 'facebook', 'linkedin', 'snapchat', 'yelp'], + '128': ['facebook', 'google'], + '131': ['bloomberg'], + '133': ['facebook', 'google', 'pocketgems', 'uber'], + '136': ['airbnb', 'palantir'], + '138': ['amazon', 'bloomberg', 'microsoft', 'uber'], + '139': ['amazon', 'bloomberg', 'facebook', 'google', 'pocketgems', 'uber', 'yahoo'], + '140': ['dropbox', 'google', 'snapchat', 'twitter', 'uber'], + '141': ['amazon', 'bloomberg', 'microsoft', 'yahoo'], + '146': ['amazon', 'bloomberg', 'facebook', 'google', 'microsoft', 'palantir', 'snapchat', 'twitter', 'uber', 'yahoo', 'zenefits'], + '149': ['apple', 'linkedin', 'twitter'], + '150': ['linkedin'], + '151': ['apple', 'bloomberg', 'microsoft', 'snapchat', 'yelp'], + '152': ['linkedin'], + '153': ['microsoft'], + '155': ['amazon', 'bloomberg', 'google', 'snapchat', 'uber', 'zenefits'], + '156': ['linkedin'], + '157': ['facebook'], + '158': ['bloomberg', 'facebook', 'google'], + '159': ['google'], + '160': ['airbnb', 'amazon', 'bloomberg', 'microsoft'], + '161': ['facebook', 'snapchat', 'twitter', 'uber'], + '162': ['google', 'microsoft'], + '163': ['google'], + '165': ['apple', 'microsoft'], + '166': ['google'], + '167': ['amazon'], + '168': ['facebook', 'microsoft', 'zenefits'], + '169': ['adobe', 'zenefits'], + '170': ['linkedin'], + '171': ['microsoft', 'uber'], + '172': ['bloomberg'], + '173': ['facebook', 'google', 'linkedin', 'microsoft'], + '174': ['microsoft'], + '186': ['amazon', 'microsoft', 'uber'], + '187': ['linkedin'], + '189': ['amazon', 'bloomberg', 'microsoft'], + '190': ['airbnb', 'apple'], + '191': ['apple', 'microsoft'], + '195': ['adobe'], + '198': ['airbnb', 'linkedin'], + '199': ['amazon'], + '200': ['amazon', 'facebook', 'google', 'microsoft', 'zenefits'], + '202': ['airbnb', 'twitter', 'uber'], + '204': ['amazon', 'microsoft'], + '205': ['linkedin'], + '206': ['adobe', 'amazon', 'apple', 'bloomberg', 'facebook', 'microsoft', 'snapchat', 'twitter', 'uber', 'yahoo', 'yelp', 'zenefits'], + '207': ['apple', 'uber', 'yelp', 'zenefits'], + '208': ['bloomberg', 'facebook', 'google', 'microsoft', 'twitter', 'uber'], + '209': ['facebook'], + '210': ['facebook', 'zenefits'], + '211': ['facebook'], + '212': ['airbnb', 'google', 'microsoft'], + '213': ['microsoft'], + '214': ['google', 'pocketgems'], + '215': ['amazon', 'apple', 'bloomberg', 'facebook', 'microsoft', 'pocketgems'], + '217': ['airbnb', 'palantir', 'yahoo'], + '218': ['facebook', 'google', 'microsoft', 'twitter', 'yelp'], + '219': ['airbnb', 'palantir'], + '220': ['airbnb', 'palantir'], + '221': ['airbnb', 'apple', 'facebook'], + '224': ['google'], + '225': ['bloomberg'], + '227': ['airbnb'], + '228': ['google'], + '229': ['zenefits'], + '230': ['bloomberg', 'google', 'uber'], + '231': ['google'], + '232': ['bloomberg', 'microsoft'], + '234': ['amazon', 'facebook'], + '235': ['amazon', 'facebook', 'microsoft', 'twitter'], + '236': ['amazon', 'apple', 'facebook', 'linkedin', 'microsoft'], + '237': ['adobe', 'apple', 'microsoft'], + '238': ['amazon', 'apple', 'facebook', 'linkedin', 'microsoft'], + '239': ['amazon', 'google', 'zenefits'], + '240': ['amazon', 'apple', 'google'], + '242': ['amazon', 'uber', 'yelp'], + '243': ['linkedin'], + '244': ['linkedin'], + '245': ['linkedin'], + '246': ['google'], + '247': ['google'], + '249': ['google', 'uber'], + '251': ['airbnb', 'google', 'twitter', 'zenefits'], + '252': ['facebook'], + '253': ['facebook', 'google', 'snapchat'], + '254': ['linkedin', 'uber'], + '255': ['zenefits'], + '256': ['linkedin'], + '257': ['apple', 'facebook', 'google'], + '258': ['adobe', 'microsoft'], + '259': ['google'], + '261': ['facebook', 'google', 'zenefits'], + '262': ['uber'], + '265': ['facebook'], + '266': ['bloomberg', 'google', 'uber'], + '268': ['bloomberg', 'microsoft'], + '269': ['airbnb', 'facebook', 'google', 'pocketgems', 'snapchat', 'twitter'], + '270': ['google', 'microsoft', 'snapchat'], + '271': ['google'], + '272': ['google'], + '273': ['facebook', 'microsoft'], + '274': ['bloomberg', 'facebook', 'google'], + '275': ['facebook'], + '276': ['google'], + '277': ['facebook', 'linkedin'], + '278': ['facebook'], + '279': ['google'], + '280': ['google'], + '281': ['google'], + '282': ['facebook', 'google'], + '283': ['bloomberg', 'facebook'], + '284': ['apple', 'google', 'yahoo'], + '285': ['facebook', 'microsoft', 'pocketgems'], + '286': ['facebook', 'google'], + '287': ['bloomberg'], + '288': ['google'], + '289': ['dropbox', 'google', 'snapchat', 'twosigma'], + '290': ['dropbox', 'uber'], + '291': ['dropbox', 'uber'], + '292': ['adobe'], + '293': ['google'], + '294': ['google'], + '295': ['google'], + '296': ['twitter'], + '297': ['amazon', 'bloomberg', 'facebook', 'google', 'linkedin', 'microsoft', 'uber', 'yahoo'], + '298': ['google'], + '300': ['microsoft'], + '301': ['facebook'], + '302': ['google'], + '303': ['palantir'], + '305': ['google'], + '308': ['google'], + '309': ['google'], + '310': ['google'], + '311': ['facebook', 'linkedin'], + '312': ['google', 'snapchat'], + '313': ['google'], + '314': ['facebook', 'google', 'snapchat'], + '315': ['google'], + '316': ['google'], + '317': ['google', 'zenefits'], + '318': ['google'], + '320': ['google'], + '321': ['google'], + '323': ['google', 'twitter'], + '324': ['google'], + '325': ['facebook', 'palantir'], + '326': ['google'], + '327': ['google'], + '329': ['google'], + '330': ['google'], + '331': ['google'], + '332': ['google'], + '333': ['microsoft'], + '334': ['facebook'], + '336': ['airbnb', 'google'], + '337': ['uber'], + '339': ['linkedin'], + '340': ['google'], + '341': ['facebook', 'google', 'twitter'], + '342': ['twosigma'], + '345': ['google'], + '346': ['google'], + '347': ['pocketgems', 'yelp'], + '348': ['google', 'microsoft'], + '349': ['twosigma'], + '351': ['google'], + '353': ['google'], + '354': ['google'], + '355': ['amazon', 'twitter'], + '356': ['google'], + '357': ['google'], + '358': ['google'], + '359': ['google'], + '360': ['google'], + '361': ['google'], + '362': ['dropbox', 'google'], + '363': ['google'], + '364': ['linkedin'], + '365': ['microsoft'], + '366': ['linkedin'], + '367': ['linkedin'], + '368': ['google'], + '369': ['google'], + '370': ['google'], + '373': ['google', 'uber'], + '374': ['google'], + '375': ['google'], + '377': ['facebook', 'google', 'snapchat'], + '378': ['google', 'twitter'], + '379': ['google'], + '380': ['amazon', 'facebook', 'google', 'pocketgems', 'twitter', 'uber', 'yelp'], + '381': ['yelp'], + '382': ['google'], + '383': ['apple'], + '385': ['airbnb'], + '386': ['bloomberg'], + '387': ['amazon', 'bloomberg', 'microsoft'], + '388': ['google'], + '389': ['google'], + '391': ['google'], + '393': ['google'], + '394': ['google', 'yelp'], + '395': ['baidu'], + '396': ['amazon'], + '397': ['baidu', 'google'], + '398': ['facebook'], + '399': ['google'], + '400': ['google'], + '401': ['google'], + '402': ['google', 'snapchat'], + '403': ['snapchat'], + '404': ['facebook'], + '406': ['google'], + '407': ['google', 'twitter'], + '408': ['google'], + '409': ['google'], + '410': ['baidu', 'facebook'], + '411': ['google'], + '413': ['baidu'], + '414': ['amazon'], + '415': ['airbnb', 'google'], + '416': ['ebay'], + '417': ['google'], + '418': ['google'], + '419': ['microsoft'], + '421': ['google'], + '422': ['google'], + '424': ['pocketgems'], + '425': ['google'], + '432': ['uber'], + '433': ['twitter'], + '438': ['amazon'], + '439': ['snapchat'], + '442': ['pocketgems'], + '443': ['bloomberg', 'microsoft', 'snapchat', 'yelp'], + '444': ['google'], + '445': ['bloomberg', 'microsoft'], + '446': ['baidu'], + '447': ['google'], + '448': ['google'], + '449': ['amazon'], + '450': ['uber'], + '451': ['amazon', 'google'], + '452': ['microsoft'], + '453': ['indeed'], + '459': ['amazon', 'google'], + '460': ['amazon', 'google'], + '461': ['facebook'], + '463': ['google'], + '464': ['linkedin'], + '465': ['google'], + '468': ['twitter'], + '469': ['google'], + '471': ['google'], + '474': ['google'], + '475': ['google'], + '477': ['facebook'], + '479': ['yahoo'], + '480': ['google'], + '481': ['google'], + '482': ['google'], + '483': ['google'], + '484': ['google'], + '485': ['google'], + '486': ['google'], + '487': ['google'], + '488': ['baidu'], + '490': ['google'], + '491': ['yahoo'], + '493': ['google'], + '494': ['facebook', 'google'], + '498': ['google'], + '500': ['mathworks'], + '501': ['google'], + '503': ['google'], + '505': ['google'], + '506': ['google'], + '508': ['amazon'], + '513': ['microsoft'], + '514': ['google'], + '515': ['linkedin'], + '516': ['amazon', 'uber'], + '517': ['amazon'], + '520': ['google'], + '521': ['google'], + '522': ['google'], + '523': ['facebook'], + '524': ['google'], + '525': ['facebook'], + '526': ['google'], + '527': ['google', 'snapchat'], + '529': ['amazon'], + '530': ['google'], + '531': ['google'], + '532': ['amazon'], + '533': ['google'], + '534': ['amazon', 'facebook', 'google', 'uber'], + '535': ['amazon', 'facebook', 'google', 'uber'], + '536': ['amazon'], + '537': ['amazon'], + '538': ['amazon'], + '541': ['google'], + '542': ['google'], + '543': ['facebook', 'google'], + '544': ['google'], + '545': ['amazon', 'google'], + '547': ['bloomberg', 'twosigma'], + '548': ['alibaba'], + '549': ['google'], + '551': ['google'], + '552': ['google'], + '553': ['amazon'], + '554': ['facebook'], + '555': ['alibaba'], + '556': ['bloomberg'], + '557': ['zappos'], + '560': ['google'], + '562': ['google'], + '563': ['indeed'], + '564': ['yelp'], + '566': ['mathworks'], + '567': ['microsoft'], + '568': ['google'], + '569': ['google'], + '570': ['bloomberg'], + '572': ['ebay', 'facebook', 'google'], + '576': ['baidu'], + '578': ['facebook'], + '579': ['amazon'], + '580': ['twitter'], + '581': ['google'], + '582': ['bloomberg'], + '583': ['google'], + '585': ['twitter'], + '586': ['twitter'], + '587': ['google'], + '591': ['microsoft'], + '597': ['facebook'], + '599': ['yelp'], + '602': ['facebook'], + '604': ['google'], + '605': ['linkedin'], + '606': ['amazon'], + '608': ['twitter'], + '616': ['google'], + '617': ['amazon'], + '621': ['facebook'], + '631': ['microsoft'], + '633': ['linkedin'], + '635': ['snapchat'], + '636': ['facebook', 'uber'], + '637': ['facebook'], + '638': ['google'], + '639': ['facebook'], + '640': ['amazon'], + '642': ['facebook', 'microsoft'], + '643': ['google'], + '644': ['google'], + '645': ['amazon'], + '646': ['amazon'], + '647': ['facebook', 'linkedin'], + '648': ['uber'], + '650': ['microsoft'], + '651': ['google', 'microsoft'], + '652': ['google'], + '653': ['facebook'], + '654': ['microsoft'], + '656': ['google'], + '657': ['google'], + '658': ['google'], + '659': ['google'], + '661': ['amazon'], + '662': ['amazon'], + '663': ['amazon'], + '665': ['google'], + '667': ['google'], + '668': ['google'], + '669': ['bloomberg'], + '670': ['facebook'], + '671': ['linkedin'], + '672': ['microsoft'], + '673': ['facebook'], + '674': ['facebook'], + '675': ['amazon'], + '676': ['google'], + '679': ['google'], + '680': ['facebook'], + '681': ['google'], + '682': ['amazon'], + '683': ['google'], + '684': ['google'], + '685': ['google'], + '686': ['google'], + '687': ['google'], + '689': ['facebook', 'google'], + '690': ['uber'], + '692': ['amazon', 'bloomberg', 'uber', 'yelp'], + '694': ['amazon'], + '698': ['linkedin'], + '699': ['uber'], + '711': ['amazon'], + '714': ['bloomberg', 'facebook'], + '716': ['linkedin'], + '719': ['google'], + '721': ['facebook'], + '722': ['microsoft'], + '725': ['amazon'], + '726': ['google'], + '727': ['google'], + '729': ['google'], + '730': ['linkedin'], + '731': ['google'] +}; + +var TAGS = { + '1': ['array', 'hash-table'], + '2': ['linked-list', 'math'], + '3': ['hash-table', 'string', 'two-pointers'], + '4': ['array', 'binary-search', 'divide-and-conquer'], + '5': ['string'], + '6': ['string'], + '7': ['math'], + '8': ['math', 'string'], + '9': ['math'], + + '10': ['backtracking', 'dynamic-programming', 'string'], + '11': ['array', 'two-pointers'], + '12': ['math', 'string'], + '13': ['math', 'string'], + '14': ['string'], + '15': ['array', 'two-pointers'], + '16': ['array', 'two-pointers'], + '17': ['backtracking', 'string'], + '18': ['array', 'hash-table', 'two-pointers'], + '19': ['linked-list', 'two-pointers'], + '20': ['stack', 'string'], + '21': ['linked-list'], + '22': ['backtracking', 'string'], + '23': ['divide-and-conquer', 'heap', 'linked-list'], + '24': ['linked-list'], + '25': ['linked-list'], + '26': ['array', 'two-pointers'], + '27': ['array', 'two-pointers'], + '28': ['string', 'two-pointers'], + '29': ['binary-search', 'math'], + '30': ['hash-table', 'string', 'two-pointers'], + '31': ['array'], + '32': ['dynamic-programming', 'string'], + '33': ['array', 'binary-search'], + '34': ['array', 'binary-search'], + '35': ['array', 'binary-search'], + '36': ['hash-table'], + '37': ['backtracking', 'hash-table'], + '38': ['string'], + '39': ['array', 'backtracking'], + '40': ['array', 'backtracking'], + '41': ['array'], + '42': ['array', 'stack', 'two-pointers'], + '43': ['math', 'string'], + '44': ['backtracking', 'dynamic-programming', 'greedy', 'string'], + '45': ['array', 'greedy'], + '46': ['backtracking'], + '47': ['backtracking'], + '48': ['array'], + '49': ['hash-table', 'string'], + '50': ['binary-search', 'math'], + '51': ['backtracking'], + '52': ['backtracking'], + '53': ['array', 'divide-and-conquer', 'dynamic-programming'], + '54': ['array'], + '55': ['array', 'greedy'], + '56': ['array', 'sort'], + '57': ['array', 'sort'], + '58': ['string'], + '59': ['array'], + '60': ['backtracking', 'math'], + '61': ['linked-list', 'two-pointers'], + '62': ['array', 'dynamic-programming'], + '63': ['array', 'dynamic-programming'], + '64': ['array', 'dynamic-programming'], + '65': ['math', 'string'], + '66': ['array', 'math'], + '67': ['math', 'string'], + '68': ['string'], + '69': ['binary-search', 'math'], + '70': ['dynamic-programming'], + '71': ['stack', 'string'], + '72': ['dynamic-programming', 'string'], + '73': ['array'], + '74': ['array', 'binary-search'], + '75': ['array', 'sort', 'two-pointers'], + '76': ['hash-table', 'string', 'two-pointers'], + '77': ['backtracking'], + '78': ['array', 'backtracking', 'bit-manipulation'], + '79': ['array', 'backtracking'], + '80': ['array', 'two-pointers'], + '81': ['array', 'binary-search'], + '82': ['linked-list'], + '83': ['linked-list'], + '84': ['array', 'stack'], + '85': ['array', 'dynamic-programming', 'hash-table', 'stack'], + '86': ['linked-list', 'two-pointers'], + '87': ['dynamic-programming', 'string'], + '88': ['array', 'two-pointers'], + '89': ['backtracking'], + '90': ['array', 'backtracking'], + '91': ['dynamic-programming', 'string'], + '92': ['linked-list'], + '93': ['backtracking', 'string'], + '94': ['hash-table', 'stack', 'tree'], + '95': ['dynamic-programming', 'tree'], + '96': ['dynamic-programming', 'tree'], + '97': ['dynamic-programming', 'string'], + '98': ['depth-first-search', 'tree'], + '99': ['depth-first-search', 'tree'], + + '100': ['depth-first-search', 'tree'], + '101': ['breadth-first-search', 'depth-first-search', 'tree'], + '102': ['breadth-first-search', 'tree'], + '103': ['breadth-first-search', 'stack', 'tree'], + '104': ['depth-first-search', 'tree'], + '105': ['array', 'depth-first-search', 'tree'], + '106': ['array', 'depth-first-search', 'tree'], + '107': ['breadth-first-search', 'tree'], + '108': ['depth-first-search', 'tree'], + '109': ['depth-first-search', 'linked-list'], + '110': ['depth-first-search', 'tree'], + '111': ['breadth-first-search', 'depth-first-search', 'tree'], + '112': ['depth-first-search', 'tree'], + '113': ['depth-first-search', 'tree'], + '114': ['depth-first-search', 'tree'], + '115': ['dynamic-programming', 'string'], + '116': ['depth-first-search', 'tree'], + '117': ['depth-first-search', 'tree'], + '118': ['array'], + '119': ['array'], + '120': ['array', 'dynamic-programming'], + '121': ['array', 'dynamic-programming'], + '122': ['array', 'greedy'], + '123': ['array', 'dynamic-programming'], + '124': ['depth-first-search', 'tree'], + '125': ['string', 'two-pointers'], + '126': ['array', 'backtracking', 'breadth-first-search', 'string'], + '127': ['breadth-first-search'], + '128': ['array', 'union-find'], + '129': ['depth-first-search', 'tree'], + '130': ['breadth-first-search', 'depth-first-search', 'union-find'], + '131': ['backtracking'], + '132': ['dynamic-programming'], + '133': ['breadth-first-search', 'depth-first-search', 'graph'], + '134': ['greedy'], + '135': ['greedy'], + '136': ['bit-manipulation', 'hash-table'], + '137': ['bit-manipulation'], + '138': ['hash-table', 'linked-list'], + '139': ['dynamic-programming'], + '140': ['backtracking', 'dynamic-programming'], + '141': ['linked-list', 'two-pointers'], + '142': ['linked-list', 'two-pointers'], + '143': ['linked-list'], + '144': ['stack', 'tree'], + '145': ['stack', 'tree'], + '146': ['design'], + '147': ['linked-list', 'sort'], + '148': ['linked-list', 'sort'], + '149': ['hash-table', 'math'], + '150': ['stack'], + '151': ['string'], + '152': ['array', 'dynamic-programming'], + '153': ['array', 'binary-search'], + '154': ['array', 'binary-search'], + '155': ['design', 'stack'], + '156': ['tree'], + '157': ['string'], + '158': ['string'], + '159': ['hash-table', 'string', 'two-pointers'], + '160': ['linked-list'], + '161': ['string'], + '162': ['array', 'binary-search'], + '163': ['array'], + '164': ['sort'], + '165': ['string'], + '166': ['hash-table', 'math'], + '167': ['array', 'binary-search', 'two-pointers'], + '168': ['math'], + '169': ['array', 'bit-manipulation', 'divide-and-conquer'], + '170': ['design', 'hash-table'], + '171': ['math'], + '172': ['math'], + '173': ['design', 'stack', 'tree'], + '174': ['binary-search', 'dynamic-programming'], + '179': ['sort'], + '186': ['string'], + '187': ['bit-manipulation', 'hash-table'], + '188': ['dynamic-programming'], + '189': ['array'], + '190': ['bit-manipulation'], + '191': ['bit-manipulation'], + '198': ['dynamic-programming'], + '199': ['breadth-first-search', 'depth-first-search', 'tree'], + '200': ['breadth-first-search', 'depth-first-search', 'union-find'], + '201': ['bit-manipulation'], + '202': ['hash-table', 'math'], + '203': ['linked-list'], + '204': ['hash-table', 'math'], + '205': ['hash-table'], + '206': ['linked-list'], + '207': ['breadth-first-search', 'depth-first-search', 'graph', 'topological-sort'], + '208': ['design', 'trie'], + '209': ['array', 'binary-search', 'two-pointers'], + '210': ['breadth-first-search', 'depth-first-search', 'graph', 'topological-sort'], + '211': ['backtracking', 'design', 'trie'], + '212': ['backtracking', 'trie'], + '213': ['dynamic-programming'], + '214': ['string'], + '215': ['divide-and-conquer', 'heap'], + '216': ['array', 'backtracking'], + '217': ['array', 'hash-table'], + '218': ['binary-indexed-tree', 'divide-and-conquer', 'heap', 'segment-tree'], + '219': ['array', 'hash-table'], + '220': ['binary-search-tree'], + '221': ['dynamic-programming'], + '222': ['binary-search', 'tree'], + '223': ['math'], + '224': ['math', 'stack'], + '225': ['design', 'stack'], + '226': ['tree'], + '227': ['string'], + '228': ['array'], + '229': ['array'], + '230': ['binary-search', 'tree'], + '231': ['bit-manipulation', 'math'], + '232': ['design', 'stack'], + '233': ['math'], + '234': ['linked-list', 'two-pointers'], + '235': ['tree'], + '236': ['tree'], + '237': ['linked-list'], + '238': ['array'], + '239': ['heap'], + '240': ['binary-search', 'divide-and-conquer'], + '241': ['divide-and-conquer'], + '242': ['hash-table', 'sort'], + '243': ['array'], + '244': ['design', 'hash-table'], + '245': ['array'], + '246': ['hash-table', 'math'], + '247': ['math'], + '248': ['math'], + '249': ['hash-table', 'string'], + '250': ['tree'], + '251': ['design'], + '252': ['sort'], + '253': ['greedy', 'heap', 'sort'], + '254': ['backtracking'], + '255': ['stack', 'tree'], + '256': ['dynamic-programming'], + '257': ['depth-first-search', 'tree'], + '258': ['math'], + '259': ['array', 'two-pointers'], + '260': ['bit-manipulation'], + '261': ['breadth-first-search', 'depth-first-search', 'graph', 'union-find'], + '263': ['math'], + '264': ['dynamic-programming', 'heap', 'math'], + '265': ['dynamic-programming'], + '266': ['hash-table'], + '267': ['backtracking'], + '268': ['array', 'bit-manipulation', 'math'], + '269': ['graph', 'topological-sort'], + '270': ['binary-search', 'tree'], + '271': ['string'], + '272': ['stack', 'tree'], + '273': ['math', 'string'], + '274': ['hash-table', 'sort'], + '275': ['binary-search'], + '276': ['dynamic-programming'], + '277': ['array'], + '278': ['binary-search'], + '279': ['breadth-first-search', 'dynamic-programming', 'math'], + '280': ['array', 'sort'], + '281': ['design'], + '282': ['divide-and-conquer'], + '283': ['array', 'two-pointers'], + '284': ['design'], + '285': ['tree'], + '286': ['breadth-first-search'], + '287': ['array', 'binary-search', 'two-pointers'], + '288': ['design', 'hash-table'], + '289': ['array'], + '290': ['hash-table'], + '291': ['backtracking'], + '293': ['string'], + '294': ['backtracking'], + '295': ['design', 'heap'], + '296': ['math', 'sort'], + '297': ['design', 'tree'], + '298': ['tree'], + '299': ['hash-table'], + '300': ['binary-search', 'dynamic-programming'], + '301': ['breadth-first-search', 'depth-first-search'], + '302': ['binary-search'], + '303': ['dynamic-programming'], + '304': ['dynamic-programming'], + '305': ['union-find'], + '307': ['binary-indexed-tree', 'segment-tree'], + '308': ['binary-indexed-tree', 'segment-tree'], + '309': ['dynamic-programming'], + '310': ['breadth-first-search', 'graph'], + '311': ['hash-table'], + '312': ['divide-and-conquer', 'dynamic-programming'], + '313': ['heap', 'math'], + '314': ['hash-table'], + '315': ['binary-indexed-tree', 'divide-and-conquer', 'segment-tree', 'binary-search-tree'], + '316': ['greedy', 'stack'], + '317': ['breadth-first-search'], + '318': ['bit-manipulation'], + '319': ['math'], + '320': ['backtracking', 'bit-manipulation'], + '321': ['dynamic-programming', 'greedy'], + '322': ['dynamic-programming'], + '323': ['breadth-first-search', 'depth-first-search', 'graph', 'union-find'], + '324': ['sort'], + '325': ['hash-table'], + '326': ['math'], + '327': ['divide-and-conquer', 'binary-search-tree'], + '328': ['linked-list'], + '329': ['depth-first-search', 'topological-sort'], + '330': ['greedy'], + '331': ['stack'], + '332': ['depth-first-search', 'graph'], + '333': ['tree'], + '335': ['math'], + '336': ['hash-table', 'string', 'trie'], + '337': ['depth-first-search', 'tree'], + '338': ['bit-manipulation', 'dynamic-programming'], + '339': ['depth-first-search'], + '340': ['hash-table', 'string'], + '341': ['design', 'stack'], + '342': ['bit-manipulation'], + '343': ['dynamic-programming', 'math'], + '344': ['string', 'two-pointers'], + '345': ['string', 'two-pointers'], + '346': ['design', 'queue'], + '347': ['hash-table', 'heap'], + '348': ['design'], + '349': ['binary-search', 'hash-table', 'sort', 'two-pointers'], + '350': ['binary-search', 'hash-table', 'sort', 'two-pointers'], + '351': ['backtracking', 'dynamic-programming'], + '352': ['binary-search-tree'], + '353': ['design', 'queue'], + '354': ['binary-search', 'dynamic-programming'], + '355': ['design', 'hash-table', 'heap'], + '356': ['hash-table', 'math'], + '357': ['backtracking', 'dynamic-programming', 'math'], + '358': ['greedy', 'hash-table', 'heap'], + '359': ['design', 'hash-table'], + '360': ['math', 'two-pointers'], + '361': ['dynamic-programming'], + '362': ['design'], + '363': ['binary-search', 'dynamic-programming', 'queue'], + '364': ['depth-first-search'], + '365': ['math'], + '366': ['depth-first-search', 'tree'], + '367': ['binary-search', 'math'], + '368': ['dynamic-programming', 'math'], + '369': ['linked-list'], + '370': ['array'], + '371': ['bit-manipulation'], + '372': ['math'], + '373': ['heap'], + '374': ['binary-search'], + '375': ['dynamic-programming'], + '376': ['dynamic-programming', 'greedy'], + '377': ['dynamic-programming'], + '378': ['binary-search', 'heap'], + '379': ['design', 'linked-list'], + '380': ['array', 'design', 'hash-table'], + '381': ['array', 'design', 'hash-table'], + '382': ['reservoir-sampling'], + '383': ['string'], + '385': ['stack', 'string'], + '387': ['hash-table', 'string'], + '389': ['bit-manipulation', 'hash-table'], + '392': ['binary-search', 'dynamic-programming', 'greedy'], + '393': ['bit-manipulation'], + '394': ['depth-first-search', 'stack'], + '396': ['math'], + '397': ['bit-manipulation', 'math'], + '398': ['reservoir-sampling'], + '399': ['graph'], + '400': ['math'], + '401': ['backtracking', 'bit-manipulation'], + '402': ['greedy', 'stack'], + '403': ['dynamic-programming'], + '404': ['tree'], + '405': ['bit-manipulation'], + '406': ['greedy'], + '407': ['breadth-first-search', 'heap'], + '408': ['string'], + '409': ['hash-table'], + '410': ['binary-search', 'dynamic-programming'], + '411': ['backtracking', 'bit-manipulation'], + '413': ['dynamic-programming', 'math'], + '414': ['array'], + '415': ['math'], + '416': ['dynamic-programming'], + '417': ['breadth-first-search', 'depth-first-search'], + '418': ['dynamic-programming'], + '421': ['bit-manipulation', 'trie'], + '423': ['math'], + '425': ['backtracking', 'trie'], + '432': ['design'], + '434': ['string'], + '435': ['greedy'], + '436': ['binary-search'], + '437': ['tree'], + '438': ['hash-table'], + '439': ['depth-first-search', 'stack'], + '441': ['binary-search', 'math'], + '442': ['array'], + '443': ['string'], + '444': ['graph', 'topological-sort'], + '445': ['linked-list'], + '446': ['dynamic-programming'], + '447': ['hash-table'], + '448': ['array'], + '449': ['tree'], + '450': ['tree'], + '451': ['hash-table', 'heap'], + '452': ['greedy'], + '453': ['math'], + '454': ['binary-search', 'hash-table'], + '455': ['greedy'], + '456': ['stack'], + '459': ['string'], + '460': ['design'], + '461': ['bit-manipulation'], + '462': ['math'], + '463': ['hash-table'], + '464': ['dynamic-programming'], + '466': ['dynamic-programming'], + '467': ['dynamic-programming'], + '468': ['string'], + '469': ['math'], + '471': ['dynamic-programming'], + '472': ['depth-first-search', 'dynamic-programming', 'trie'], + '473': ['depth-first-search'], + '474': ['dynamic-programming'], + '475': ['binary-search'], + '476': ['bit-manipulation'], + '477': ['bit-manipulation'], + '483': ['binary-search', 'math'], + '484': ['greedy'], + '485': ['array'], + '486': ['dynamic-programming'], + '487': ['two-pointers'], + '488': ['depth-first-search'], + '490': ['breadth-first-search', 'depth-first-search'], + '491': ['depth-first-search'], + '493': ['binary-indexed-tree', 'divide-and-conquer', 'segment-tree', 'binary-search-tree'], + '494': ['depth-first-search', 'dynamic-programming'], + '495': ['array'], + '496': ['stack'], + '499': ['breadth-first-search', 'depth-first-search'], + '500': ['hash-table'], + '501': ['tree'], + '502': ['greedy', 'heap'], + '503': ['stack'], + '505': ['breadth-first-search', 'depth-first-search'], + '507': ['math'], + '508': ['hash-table', 'tree'], + '513': ['breadth-first-search', 'depth-first-search', 'tree'], + '514': ['depth-first-search', 'divide-and-conquer', 'dynamic-programming'], + '515': ['breadth-first-search', 'depth-first-search', 'tree'], + '516': ['dynamic-programming'], + '517': ['dynamic-programming', 'math'], + '520': ['string'], + '521': ['string'], + '522': ['string'], + '523': ['dynamic-programming', 'math'], + '524': ['sort', 'two-pointers'], + '525': ['hash-table'], + '526': ['backtracking'], + '527': ['sort', 'string'], + '529': ['breadth-first-search', 'depth-first-search'], + '530': ['array', 'depth-first-search', 'binary-search-tree'], + '531': ['array', 'depth-first-search'], + '532': ['array', 'two-pointers'], + '533': ['array', 'depth-first-search'], + '535': ['hash-table', 'math'], + '536': ['string', 'tree'], + '537': ['math', 'string'], + '538': ['tree'], + '539': ['string'], + '541': ['string'], + '542': ['breadth-first-search', 'depth-first-search'], + '543': ['tree'], + '544': ['string'], + '545': ['tree'], + '546': ['depth-first-search', 'dynamic-programming'], + '547': ['depth-first-search', 'union-find'], + '548': ['array'], + '549': ['tree'], + '551': ['string'], + '552': ['dynamic-programming'], + '553': ['math', 'string'], + '554': ['hash-table'], + '555': ['string'], + '556': ['string'], + '557': ['string'], + '560': ['array', 'map'], + '561': ['array'], + '562': ['array'], + '563': ['tree'], + '564': ['string'], + '565': ['array'], + '566': ['array'], + '567': ['two-pointers'], + '568': ['dynamic-programming'], + '572': ['tree'], + '573': ['math'], + '575': ['hash-table'], + '576': ['depth-first-search', 'dynamic-programming'], + '581': ['array'], + '582': ['queue', 'tree'], + '583': ['string'], + '588': ['design'], + '591': ['stack', 'string'], + '592': ['math'], + '593': ['math'], + '594': ['hash-table'], + '598': ['math'], + '599': ['hash-table'], + '600': ['dynamic-programming'], + '604': ['design'], + '605': ['array'], + '606': ['string', 'tree'], + '609': ['hash-table', 'string'], + '611': ['array'], + '616': ['string'], + '617': ['tree'], + '621': ['array', 'greedy', 'queue'], + '623': ['tree'], + '624': ['array', 'hash-table'], + '625': ['math'], + '628': ['array', 'math'], + '629': ['dynamic-programming'], + '630': ['greedy'], + '631': ['design'], + '632': ['hash-table', 'string', 'two-pointers'], + '633': ['math'], + '634': ['math'], + '635': ['design', 'string'], + '636': ['stack'], + '637': ['tree'], + '638': ['depth-first-search', 'dynamic-programming'], + '639': ['dynamic-programming'], + '640': ['math'], + '642': ['design', 'trie'], + '643': ['array'], + '644': ['array', 'binary-search'], + '645': ['hash-table', 'math'], + '646': ['dynamic-programming'], + '647': ['dynamic-programming', 'string'], + '648': ['hash-table', 'trie'], + '649': ['greedy'], + '650': ['dynamic-programming'], + '651': ['dynamic-programming', 'greedy', 'math'], + '652': ['tree'], + '653': ['tree'], + '654': ['tree'], + '655': ['tree'], + '656': ['dynamic-programming'], + '657': ['string'], + '658': ['binary-search'], + '659': ['greedy', 'heap'], + '660': ['math'], + '661': ['array'], + '662': ['tree'], + '663': ['tree'], + '664': ['depth-first-search', 'dynamic-programming'], + '665': ['array'], + '666': ['tree'], + '667': ['array'], + '668': ['binary-search'], + '669': ['tree'], + '670': ['array', 'math'], + '671': ['tree'], + '672': ['math'], + '673': ['dynamic-programming'], + '674': ['array'], + '675': ['breadth-first-search'], + '676': ['hash-table', 'trie'], + '677': ['trie'], + '678': ['string'], + '679': ['depth-first-search'], + '680': ['string'], + '681': ['string'], + '682': ['stack'], + '683': ['array', 'binary-search-tree'], + '684': ['graph', 'tree', 'union-find'], + '685': ['depth-first-search', 'graph', 'tree', 'union-find'], + '686': ['string'], + '687': ['tree'], + '688': ['dynamic-programming'], + '689': ['array', 'dynamic-programming'], + '690': ['breadth-first-search', 'depth-first-search', 'hash-table'], + '691': ['backtracking', 'dynamic-programming'], + '692': ['hash-table', 'heap', 'trie'], + '693': ['bit-manipulation'], + '694': ['depth-first-search', 'hash-table'], + '695': ['array', 'depth-first-search'], + '696': ['string'], + '697': ['array'], + '698': ['dynamic-programming'], + '699': ['segment-tree', 'binary-search-tree'], + '711': ['depth-first-search', 'hash-table'], + '712': ['dynamic-programming'], + '713': ['array', 'two-pointers'], + '714': ['array', 'dynamic-programming', 'greedy'], + '715': ['array', 'segment-tree', 'binary-search-tree'], + '716': ['design'], + '717': ['array'], + '718': ['array', 'binary-search', 'dynamic-programming', 'hash-table'], + '719': ['array', 'binary-search', 'heap'], + '720': ['hash-table', 'trie'], + '721': ['depth-first-search', 'union-find'], + '722': ['string'], + '723': ['array', 'two-pointers'], + '724': ['array'], + '725': ['linked-list'], + '726': ['hash-table', 'stack'], + '727': ['dynamic-programming'], + '728': ['math'], + '729': ['array'], + '730': ['dynamic-programming', 'string'], + '731': ['array', 'binary-search-tree'], + '732': ['segment-tree', 'binary-search-tree'], + '733': ['depth-first-search'], + '734': ['hash-table'], + '735': ['stack'], + '736': ['string'], + '737': ['depth-first-search', 'union-find'], + '738': ['greedy'], + '739': ['hash-table', 'stack'], + '740': ['dynamic-programming'], + '741': ['dynamic-programming'], + '742': ['tree'], + '743': ['breadth-first-search', 'depth-first-search', 'graph', 'heap'], + '744': ['binary-search'], + '745': ['trie'], + '746': ['array', 'dynamic-programming'], + '748': ['hash-table'], + '749': ['depth-first-search'], + '750': ['dynamic-programming'] +}; + +plugin.getProblems = function(cb) { + plugin.next.getProblems(function(e, problems) { + if (e) return cb(e); + + problems.forEach(function(problem) { + var id = String(problem.id); + if (id in COMPONIES) { + problem.companies = (problem.companies || []).concat(COMPONIES[id]); + } + if (id in TAGS) { + problem.tags = (problem.tags || []).concat(TAGS[id]); + } + }); + return cb(null, problems); + }); +}; + +module.exports = plugin; diff --git a/lib/plugins/cookie.chrome.js b/lib/plugins/cookie.chrome.js new file mode 100644 index 00000000..e2d42780 --- /dev/null +++ b/lib/plugins/cookie.chrome.js @@ -0,0 +1,184 @@ +var path = require('path'); + +var log = require('../log'); +var Plugin = require('../plugin'); +var Queue = require('../queue'); +var session = require('../session'); + +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/cookie.chrome.md +// +var plugin = new Plugin(13, 'cookie.chrome', '2018.11.18', + 'Plugin to reuse Chrome\'s leetcode cookie.', + ['ffi:win32', 'keytar:darwin', 'ref:win32', 'ref-struct:win32', 'sqlite3']); + +plugin.help = function() { + switch (process.platform) { + case 'darwin': + break; + case 'linux': + log.warn('To complete the install: sudo apt install libsecret-tools'); + break; + case 'win32': + break; + } +}; + +var Chrome = {}; + +var ChromeMAC = { + getDBPath: function() { + return `${process.env.HOME}/Library/Application Support/Google/Chrome/${this.profile}/Cookies`; + }, + iterations: 1003, + getPassword: function(cb) { + var keytar = require('keytar'); + keytar.getPassword('Chrome Safe Storage', 'Chrome').then(cb); + } +}; + +var ChromeLinux = { + getDBPath: function() { + return `${process.env.HOME}/.config/google-chrome/${this.profile}/Cookies`; + }, + iterations: 1, + getPassword: function(cb) { + // FIXME: keytar failed to read gnome-keyring on ubuntu?? + var cmd = 'secret-tool lookup application chrome'; + var password = require('child_process').execSync(cmd).toString(); + return cb(password); + } +}; + +var ChromeWindows = { + getDBPath: function() { + return path.resolve(process.env.APPDATA || '', `../Local/Google/Chrome/User Data/${this.profile}/Cookies`); + }, + getPassword: function(cb) { cb(); } +}; + +Object.setPrototypeOf(ChromeMAC, Chrome); +Object.setPrototypeOf(ChromeLinux, Chrome); +Object.setPrototypeOf(ChromeWindows, Chrome); + +Chrome.getInstance = function() { + switch (process.platform) { + case 'darwin': return ChromeMAC; + case 'linux': return ChromeLinux; + case 'win32': return ChromeWindows; + } +}; +var my = Chrome.getInstance(); + +ChromeWindows.decodeCookie = function(cookie, cb) { + var ref = require('ref'); + var ffi = require('ffi'); + var Struct = require('ref-struct'); + + var DATA_BLOB = Struct({ + cbData: ref.types.uint32, + pbData: ref.refType(ref.types.byte) + }); + var PDATA_BLOB = new ref.refType(DATA_BLOB); + var Crypto = new ffi.Library('Crypt32', { + 'CryptUnprotectData': ['bool', [PDATA_BLOB, 'string', 'string', 'void *', 'string', 'int', PDATA_BLOB]] + }); + + var inBlob = new DATA_BLOB(); + inBlob.pbData = cookie; + inBlob.cbData = cookie.length; + var outBlob = ref.alloc(DATA_BLOB); + + Crypto.CryptUnprotectData(inBlob.ref(), null, null, null, null, 0, outBlob); + var outDeref = outBlob.deref(); + var buf = ref.reinterpret(outDeref.pbData, outDeref.cbData, 0); + + return cb(null, buf.toString('utf8')); +}; + +Chrome.decodeCookie = function(cookie, cb) { + var crypto = require('crypto'); + crypto.pbkdf2(my.password, 'saltysalt', my.iterations, 16, 'sha1', function(e, key) { + if (e) return cb(e); + + var iv = new Buffer(' '.repeat(16)); + var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); + decipher.setAutoPadding(false); + + var buf = decipher.update(cookie.slice(3)); // remove prefix "v10" or "v11" + var final = decipher.final(); + final.copy(buf, buf.length - 1); + + var padding = buf[buf.length - 1]; + if (padding) buf = buf.slice(0, buf.length - padding); + + return cb(null, buf.toString('utf8')); + }); +}; + +function doDecode(key, queue, cb) { + var ctx = queue.ctx; + var cookie = ctx[key]; + if (!cookie) return cb('Not found cookie: ' + key); + + my.decodeCookie(cookie, function(e, cookie) { + ctx[key] = cookie; + return cb(); + }); +} + +Chrome.getCookies = function(cb) { + var sqlite3 = require('sqlite3'); + var db = new sqlite3.Database(my.getDBPath()); + db.on('error', cb); + var KEYS = ['csrftoken', 'LEETCODE_SESSION']; + + db.serialize(function() { + var cookies = {}; + var sql = 'select name, encrypted_value from cookies where host_key like "%leetcode.com"'; + db.each(sql, function(e, x) { + if (e) return cb(e); + if (KEYS.indexOf(x.name) < 0) return; + cookies[x.name] = x.encrypted_value; + }); + + db.close(function() { + my.getPassword(function(password) { + my.password = password; + var q = new Queue(KEYS, cookies, doDecode); + q.run(null, cb); + }); + }); + }); +}; + +plugin.signin = function(user, cb) { + log.debug('running cookie.chrome.signin'); + log.debug('try to copy leetcode cookies from chrome ...'); + + my.profile = plugin.config.profile || 'Default'; + my.getCookies(function(e, cookies) { + if (e) { + log.error(`Failed to copy cookies from profile "${my.profile}"`); + log.error(e); + return plugin.next.signin(user, cb); + } + + log.debug('Successfully copied leetcode cookies!'); + user.sessionId = cookies.LEETCODE_SESSION; + user.sessionCSRF = cookies.csrftoken; + session.saveUser(user); + return cb(null, user); + }); +}; + +plugin.login = function(user, cb) { + log.debug('running cookie.chrome.login'); + plugin.signin(user, function(e, user) { + if (e) return cb(e); + plugin.getUser(user, cb); + }); +}; + +module.exports = plugin; diff --git a/lib/plugins/cookie.firefox.js b/lib/plugins/cookie.firefox.js new file mode 100644 index 00000000..f69f8699 --- /dev/null +++ b/lib/plugins/cookie.firefox.js @@ -0,0 +1,83 @@ +var log = require('../log'); +var Plugin = require('../plugin'); +var session = require('../session'); + +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/cookie.firefox.md +// +var plugin = new Plugin(13, 'cookie.firefox', '2018.11.19', + 'Plugin to reuse firefox\'s leetcode cookie.', + ['glob', 'sqlite3']); + +function getCookieFile(cb) { + var f; + switch (process.platform) { + case 'darwin': + f = process.env.HOME + '/Library/Application Support/Firefox/Profiles/*.default*/cookies.sqlite'; + break; + case 'linux': + f = process.env.HOME + '/.mozilla/firefox/*.default*/cookies.sqlite'; + break; + case 'win32': + f = (process.env.APPDATA || '') + '/Mozilla/Firefox/Profiles/*.default*/cookies.sqlite'; + break; + } + require('glob')(f, {}, cb); +} + +function getCookies(cb) { + getCookieFile(function(e, files) { + if (e || files.length === 0) return cb('Not found cookie file!'); + + var sqlite3 = require('sqlite3'); + var db = new sqlite3.Database(files[0]); + var KEYS = ['csrftoken', 'LEETCODE_SESSION']; + + db.serialize(function() { + var cookies = {}; + var sql = 'select name, value from moz_cookies where host like "%leetcode.com"'; + db.each(sql, function(e, x) { + if (e) return cb(e); + if (KEYS.indexOf(x.name) < 0) return; + cookies[x.name] = x.value; + }); + + db.close(function() { + return cb(null, cookies); + }); + }); + }); +} + +plugin.signin = function(user, cb) { + log.debug('running cookie.firefox.signin'); + log.debug('try to copy leetcode cookies from firefox ...'); + getCookies(function(e, cookies) { + if (e) { + log.error('Failed to copy cookies: ' + e); + return plugin.next.signin(user, cb); + } + + if (!cookies.LEETCODE_SESSION || !cookies.csrftoken) { + log.error('Got invalid cookies: ' + JSON.stringify(cookies)); + return plugin.next.signin(user, cb); + } + + log.debug('Successfully copied leetcode cookies!'); + user.sessionId = cookies.LEETCODE_SESSION; + user.sessionCSRF = cookies.csrftoken; + session.saveUser(user); + return cb(null, user); + }); +}; + +plugin.login = function(user, cb) { + log.debug('running cookie.firefox.login'); + plugin.signin(user, function(e, user) { + if (e) return cb(e); + plugin.getUser(user, cb); + }); +}; + +module.exports = plugin; diff --git a/lib/plugins/cpp.lint.js b/lib/plugins/cpp.lint.js new file mode 100644 index 00000000..a892cd54 --- /dev/null +++ b/lib/plugins/cpp.lint.js @@ -0,0 +1,47 @@ +var cp = require('child_process'); + +var log = require('../log'); +var Plugin = require('../plugin'); + +// +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/cpp.lint.md +// +var plugin = new Plugin(100, 'cpp.lint', '2017.07.27', + 'Plugin to do static code check on c++ code.'); + +var DEFAULT_FLAGS = [ + '-legal/copyright', + '-build/include_what_you_use' +]; + +plugin.testProblem = function(problem, cb) { + // TODO: unify error handling + if (!plugin.config.bin) + return log.error('cpplint.py not configured correctly! (plugins:cpp.lint:bin)'); + + var flags = DEFAULT_FLAGS.concat(plugin.config.flags || []); + + var cmd = [ + plugin.config.bin, + '--filter=' + flags.join(','), + problem.file + ].join(' '); + + log.info('\nRunning cpplint ...'); + log.debug(cmd); + log.info(); + + cp.exec(cmd, function(e, stdout, stderr) { + if (e) { + stderr.split('\n').forEach(function(line) { + if (line.length > 0) log.error(line); + }); + } else { + plugin.next.testProblem(problem, cb); + } + }); +}; + +module.exports = plugin; diff --git a/lib/plugins/cpp.run.js b/lib/plugins/cpp.run.js new file mode 100644 index 00000000..6f206f8f --- /dev/null +++ b/lib/plugins/cpp.run.js @@ -0,0 +1,225 @@ +var cp = require('child_process'); +var fs = require('fs'); + +var h = require('../helper'); +var log = require('../log'); +var Plugin = require('../plugin.js'); +var session = require('../session'); + +// Please note that we DON'T want implement a lightweight judge engine +// here, thus we are NOT going to support all the problems!!! +// +// Only works for those problems could be easily tested. +// +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/cpp.run.md +// +var plugin = new Plugin(100, 'cpp.run', '2017.07.29', + 'Plugin to run cpp code locally for debugging.'); + +var FILE_SRC = '.tmp.cpp.run.cpp'; +var FILE_EXEC = '.tmp.cpp.run.exe'; + +plugin.testProblem = function(problem, cb) { + if (!session.argv.local || h.extToLang(problem.file) !== 'cpp') + return plugin.next.testProblem(problem, cb); + + log.info('\nTesting locally ...\n'); + + // generate full cpp source code that runnable + var meta = problem.templateMeta; + + var code = fs.readFileSync(problem.file).toString(); + var re = code.match(new RegExp(' ' + meta.name + '\\((.+)\\)')); + if (!re) return cb('failed to generate runnable code!'); + + var types = re[1].split(',').map(function(x) { + var parts = x.trim().split(' '); + parts.pop(); // skip param name + return parts.join(' '); + }); + + var values = problem.testcase.split('\n').map(function(x, i) { + // TODO: handle more special types?? + // array, list, tree, etc + var t = meta.params[i].type; + if (t.indexOf('[]') >= 0 || t === 'ListNode' || t === 'TreeNode') + x = x.replace(/\[/g, '{').replace(/\]/g, '}'); + if (t === 'ListNode') x = 'make_listnode(' + x + ')'; + if (t === 'TreeNode') x = 'make_treenode(' + x + ')'; + + return x; + }); + + var data = DATA.replace('$code', code) + .replace('$method', meta.name) + .replace('$argDefs', values.map(function(x, i) { + return ' decay<' + types[i] + '>::type ' + 'p' + i + ' = ' + x + ';'; + }).join('\n')) + .replace('$args', values.map(function(x, i) { + return 'p' + i; + }).join(',')); + + fs.writeFileSync(FILE_SRC, data); + + // compile and run + var cmd = [ + 'g++', + '-std=c++11', + '-o', + FILE_EXEC, + FILE_SRC, + '&&', + './' + FILE_EXEC + ].join(' '); + cp.exec(cmd, function(e, stdout, stderr) { + if (e) { + stderr.split('\n').forEach(function(line) { + if (line.length > 0) log.error(line); + }); + } else { + stdout.split('\n').forEach(function(line) { + if (line.length > 0) log.info(line); + }); + } + }); +}; + +// FIXME: use file template!! +var DATA = ` +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __cplusplus >= 201103L +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +using namespace std; + +/// leetcode defined data types /// +struct ListNode { + int val; + ListNode *next; + ListNode(int x) : val(x), next(NULL) {} +}; + +struct TreeNode { + int val; + TreeNode *left, *right; + TreeNode(int x) : val(x), left(NULL), right(NULL) {} +}; + +ListNode* make_listnode(const vector &v) { + ListNode head(0), *p = &head, *cur; + for (auto x: v) { cur = new ListNode(x); p->next = cur; p = cur; } + return head.next; +} + +constexpr long long null = numeric_limits::min(); + +TreeNode* make_treenode(const vector &v) { + vector cur, next; + TreeNode root(0); cur.push_back(&root); + long long i = 0, n = v.size(), x; + while (i < n) { + for (auto p: cur) { + if ((x = v[i++]) != null) { p->left = new TreeNode(x); next.push_back(p->left); } + if (i == n || p == &root) continue; + if ((x = v[i++]) != null) { p->right = new TreeNode(x); next.push_back(p->right); } + } + cur.swap(next); next.clear(); + } + return root.left; +} + +template +ostream& operator<<(ostream &os, const vector &v) { + os << "["; + for (int i = 0; i < v.size(); ++i) os << (i > 0 ? "," : "") << v[i]; + os << "]"; + return os; +} + +ostream& operator<<(ostream &os, const ListNode *p) { + vector v; + while (p) { v.push_back(p->val); p = p->next; } + return os << v; +} + +ostream& operator<<(ostream &os, const TreeNode *t) { + vector v; + queue cur, next; + if (t) cur.push(t); + + while (!cur.empty()) { + t = cur.front(); cur.pop(); + v.push_back(t ? to_string(t->val) : "null"); + if (t && (t->left || t->right)) { + next.push(t->left); + if (t->right || !cur.empty()) next.push(t->right); + } + if (cur.empty()) cur.swap(next); + } + return os << v; +} + +$code +int main() { + Solution s; +$argDefs + auto res = s.$method($args); + cout << res << endl; + return 0; +} +`; + +module.exports = plugin; diff --git a/lib/plugins/github.js b/lib/plugins/github.js new file mode 100644 index 00000000..6c94e9ec --- /dev/null +++ b/lib/plugins/github.js @@ -0,0 +1,79 @@ +var path = require('path'); +var url = require('url'); + +var h = require('../helper'); +var file = require('../file'); +var log = require('../log'); +var Plugin = require('../plugin'); + +// +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/github.md +// +var plugin = new Plugin(100, 'github', '2018.11.18', + 'Plugin to commit accepted code to your own github repo.', + ['github@13']); + +var ctx = {}; + +plugin.submitProblem = function(problem, cb) { + // TODO: unify error handling + if (!plugin.config.repo) + return log.error('GitHub repo not configured correctly! (plugins:github:repo)'); + if (!plugin.config.token) + return log.error('GitHub token not configured correctly! (plugins:github:token)'); + + var parts = url.parse(plugin.config.repo).pathname.split('/'); + var filename = path.basename(problem.file); + parts.push(filename); + + if (parts[0] === '') parts.shift(); + ctx.owner = parts.shift(); + ctx.repo = parts.shift(); + ctx.path = parts.join('/'); + + var GitHubApi = require('github'); + var github = new GitHubApi({host: 'api.github.com'}); + github.authenticate({type: 'token', token: plugin.config.token}); + + plugin.next.submitProblem(problem, function(_e, results) { + cb(_e, results); + if (_e || !results[0].ok) return; + + log.debug('running github.getContent: ' + filename); + github.repos.getContent(ctx, function(e, res) { + if (e && e.code !== 404) { + return log.info(' ' + h.prettyText(' ' + e.message, false)); + } + + ctx.message = 'update ' + filename; + ctx.content = new Buffer(file.data(problem.file)).toString('base64'); + + var onFileDone = function(e, res) { + if (e) + return log.info(' ' + h.prettyText(' ' + e.message, false)); + + log.debug(res.meta.status); + log.debug('updated current file version = ' + res.data.content.sha); + log.debug('updated current commit = ' + res.data.commit.sha); + log.info(' ' + h.prettyText(' Committed to ' + plugin.config.repo, true)); + }; + + if (e) { + log.debug('no previous file version found'); + + log.debug('running github.createFile'); + github.repos.createFile(ctx, onFileDone); + } else { + ctx.sha = res.data.sha; + log.debug('found previous file version = ' + ctx.sha); + + log.debug('running github.updateFile'); + github.repos.updateFile(ctx, onFileDone); + } + }); + }); +}; + +module.exports = plugin; diff --git a/lib/plugins/leetcode.cn.js b/lib/plugins/leetcode.cn.js new file mode 100644 index 00000000..07d5d2d7 --- /dev/null +++ b/lib/plugins/leetcode.cn.js @@ -0,0 +1,126 @@ +'use strict' +var request = require('request'); + +var config = require('../config'); +var h = require('../helper'); +var log = require('../log'); +var Plugin = require('../plugin'); +var session = require('../session'); + +// +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/leetcode.cn.md +// +var plugin = new Plugin(15, 'leetcode.cn', '2018.11.25', + 'Plugin to talk with leetcode-cn APIs.'); + +plugin.init = function() { + config.app = 'leetcode.cn'; + config.sys.urls.base = 'https://leetcode-cn.com'; + config.sys.urls.login = 'https://leetcode-cn.com/accounts/login/'; + config.sys.urls.problems = 'https://leetcode-cn.com/api/problems/$category/'; + config.sys.urls.problem = 'https://leetcode-cn.com/problems/$slug/description/'; + config.sys.urls.graphql = 'https://leetcode-cn.com/graphql'; + config.sys.urls.problem_detail = 'https://leetcode-cn.com/graphql'; + config.sys.urls.test = 'https://leetcode-cn.com/problems/$slug/interpret_solution/'; + config.sys.urls.session = 'https://leetcode-cn.com/session/'; + config.sys.urls.submit = 'https://leetcode-cn.com/problems/$slug/submit/'; + config.sys.urls.submissions = 'https://leetcode-cn.com/api/submissions/$slug'; + config.sys.urls.submission = 'https://leetcode-cn.com/submissions/detail/$id/'; + config.sys.urls.verify = 'https://leetcode-cn.com/submissions/detail/$id/check/'; + config.sys.urls.favorites = 'https://leetcode-cn.com/list/api/questions'; + config.sys.urls.favorite_delete = 'https://leetcode-cn.com/list/api/questions/$hash/$id'; +}; + +// FIXME: refactor those +// update options with user credentials +function signOpts(opts, user) { + opts.headers.Cookie = 'LEETCODE_SESSION=' + user.sessionId + + ';csrftoken=' + user.sessionCSRF + ';'; + opts.headers['X-CSRFToken'] = user.sessionCSRF; + opts.headers['X-Requested-With'] = 'XMLHttpRequest'; +} + +function makeOpts(url) { + const opts = {}; + opts.url = url; + opts.headers = {}; + + if (session.isLogin()) + signOpts(opts, session.getUser()); + return opts; +} + +function checkError(e, resp, expectedStatus) { + if (!e && resp && resp.statusCode !== expectedStatus) { + const code = resp.statusCode; + log.debug('http error: ' + code); + + if (code === 403 || code === 401) { + e = session.errors.EXPIRED; + } else { + e = {msg: 'http error', statusCode: code}; + } + } + return e; +} + +plugin.getProblems = function(cb) { + plugin.next.getProblems(function(e, problems) { + if (e) return cb(e); + + plugin.getProblemsTitle(function(e, titles) { + if (e) return cb(e); + + problems.forEach(function(problem) { + const title = titles[problem.fid]; + if (title) + problem.name = title; + }); + + return cb(null, problems); + }); + }); +}; + +plugin.getProblemsTitle = function(cb) { + log.debug('running leetcode.cn.getProblemNames'); + + const opts = makeOpts(config.sys.urls.graphql); + opts.headers.Origin = config.sys.urls.base; + opts.headers.Referer = 'https://leetcode-cn.com/api/problems/algorithms/'; + + opts.json = true; + opts.body = { + query: [ + 'query getQuestionTranslation($lang: String) {', + ' translations: allAppliedQuestionTranslations(lang: $lang) {', + ' title', + ' question {', + ' questionId', + ' }', + ' }', + '}', + '' + ].join('\n'), + variables: {}, + operationName: 'getQuestionTranslation' + }; + + const spin = h.spin('Downloading questions titles'); + request.post(opts, function(e, resp, body) { + spin.stop(); + e = checkError(e, resp, 200); + if (e) return cb(e); + + const titles = []; + body.data.translations.forEach(function(x) { + titles[x.question.questionId] = x.title; + }); + + return cb(null, titles); + }); +}; + +module.exports = plugin; diff --git a/lib/plugins/lintcode.js b/lib/plugins/lintcode.js new file mode 100644 index 00000000..b9d5d5b5 --- /dev/null +++ b/lib/plugins/lintcode.js @@ -0,0 +1,410 @@ +var _ = require('underscore'); +var cheerio = require('cheerio'); +var request = require('request'); +var util = require('util'); + +var h = require('../helper'); +var file = require('../file'); +var config = require('../config'); +var log = require('../log'); +var Plugin = require('../plugin'); +var Queue = require('../queue'); +var session = require('../session'); + +// Still working in progress! +// +// TODO: star/submissions/submission +// FIXME: why [ERROR] Error: read ECONNRESET [0]?? +// +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/lintcode.md +// +const plugin = new Plugin(15, 'lintcode', '2018.11.18', + 'Plugin to talk with lintcode APIs.'); + +// FIXME: add more langs +const LANGS = [ + {value: 'cpp', text: 'C++'}, + {value: 'java', text: 'Java'}, + {value: 'python', text: 'Python'} +]; + +const LEVELS = { + 0: 'Naive', + 1: 'Easy', + 2: 'Medium', + 3: 'Hard', + 4: 'Super' +}; + +var spin; + +function signOpts(opts, user) { + opts.headers.Cookie = 'sessionid=' + user.sessionId + + ';csrftoken=' + user.sessionCSRF + ';'; + opts.headers['x-csrftoken'] = user.sessionCSRF; +} + +function makeOpts(url) { + const opts = { + url: url, + headers: {} + }; + if (session.isLogin()) + signOpts(opts, session.getUser()); + return opts; +} + +function checkError(e, resp, expectedStatus) { + if (!e && resp && resp.statusCode !== expectedStatus) { + const code = resp.statusCode; + log.debug('http error: ' + code); + + if (code === 403 || code === 401) { + e = session.errors.EXPIRED; + } else { + e = {msg: 'http error', statusCode: code}; + } + } + return e; +} + +function _split(s, delim) { + return (s || '').split(delim).map(function(x) { + return x.trim(); + }).filter(function(x) { + return x.length > 0; + }); +} + +function _strip(s) { + if(s === null){return null;} + s = s.replace(/^
/, '').replace(/<\/code><\/pre>$/, '');
+  return util.inspect(s.trim());
+}
+
+plugin.init = function() {
+  config.app = 'lintcode';
+  config.sys.urls.base           = 'https://www.lintcode.com';
+  config.sys.urls.problems       = 'https://www.lintcode.com/api/problems/?page=$page';
+  config.sys.urls.problem        = 'https://www.lintcode.com/problem/$slug/description';
+  config.sys.urls.problem_detail = 'https://www.lintcode.com/api/problems/detailinfo/?unique_name_or_alias=$slug&_format=detail';
+  config.sys.urls.problem_code   = 'https://www.lintcode.com/api/problems/$id/reset/?language=$lang';
+  config.sys.urls.test           = 'https://www.lintcode.com/api/submissions/';
+  config.sys.urls.test_verify    = 'https://www.lintcode.com/api/submissions/refresh/?id=$id&is_test_submission=true';
+  config.sys.urls.submit_verify  = 'https://www.lintcode.com/api/submissions/refresh/?id=$id';
+  config.sys.urls.login          = 'https://www.lintcode.com/api/accounts/signin/?next=%2F';
+
+  config.sys.urls.submissions    = 'https://www.lintcode.com/api/submissions/?problem_id=$id&status=&language=';
+  config.sys.urls.submission     = 'https://www.lintcode.com/api/submissions/$id';
+};
+
+plugin.getProblems = function(cb) {
+  log.debug('running lintcode.getProblems');
+
+  var problems = [];
+  const getPage = function(page, queue, cb) {
+    plugin.getPageProblems(page, function(e, _problems, ctx) {
+      if (!e) {
+        problems = problems.concat(_problems);
+        queue.tasks = _.reject(queue.tasks, x => ctx.pages > 0 && x > ctx.pages);
+      }
+      return cb(e);
+    });
+  };
+
+  const pages = _.range(1, 100);
+  const q = new Queue(pages, {}, getPage);
+  spin = h.spin('Downloading problems');
+  q.run(null, function(e, ctx) {
+    spin.stop();
+    problems = _.sortBy(problems, x => -x.id);
+    return cb(e, problems);
+  });
+};
+
+plugin.getPageProblems = function(page, cb) {
+  log.debug('running lintcode.getPageProblems: ' + page);
+  const opts = makeOpts(config.sys.urls.problems.replace('$page', page));
+
+  spin.text = 'Downloading page ' + page;
+  request(opts, function(e, resp, body) {
+    e = checkError(e, resp, 200);
+    if (e) return cb(e);
+
+    const ctx = {};
+    const json = JSON.parse(body);
+    const problems = json.problems.map(function(p, a) {
+      const problem = {
+        id:        p.id, 
+        fid:       p.id,
+        name:      p.title,
+        slug:      p.unique_name,
+        category:  'lintcode',
+        level:     LEVELS[p.level],
+        locked:    false,
+        percent:   p.accepted_rate,
+        starred:   p.is_favorited,
+        companies: p.company_tags,
+        tags:      []
+      };
+      problem.link = config.sys.urls.problem.replace('$slug', problem.slug);
+      switch (p.user_status) {
+        case 'Accepted': problem.state = 'ac'; break;
+        case 'Failed':   problem.state = 'notac'; break;
+        default:         problem.state = 'None';
+      }
+      return problem;
+    });
+
+    ctx.count = json.count;
+    ctx.pages = json.maximum_page;
+    return cb(null, problems, ctx);
+  });
+};
+
+plugin.getProblem = function(problem, cb) {
+  log.debug('running lintcode.getProblem');
+  const link = config.sys.urls.problem_detail.replace('$slug', problem.slug);
+  const opts = makeOpts(link);
+  // console.log(link)
+
+  const spin = h.spin('Downloading ' + problem.slug);
+  
+  request(opts, function(e, resp, body) {
+    spin.stop();
+    e = checkError(e, resp, 200);
+    if (e) return cb(e);
+
+    const json = JSON.parse(body);
+    problem.testcase = json.testcase_sample;
+    if(problem.testcase===undefined){
+      problem.testcase = new Array();
+    }
+    problem.testable = problem.testcase.length > 0;
+    if(json.tags===undefined){
+      json.tags = new Array();
+    }
+    problem.tags = json.tags.map(x => x.name);
+    if(json.related_problems===undefined){
+      json.related_problems = new Array();
+    }
+    problem.desc = cheerio.load(json.description + '\n\nExample:\n' + json.example + '\n\nChallenge\n' + json.challenge + '\n\nRelated Questions:\n' + json.related_problems.map(e => e.unique_name).join(",") + '\n\nTags:\n' + json.tags.map(e => e.name).join(",")).root().text();
+    problem.totalAC = json.total_accepted;
+    problem.totalSubmit = json.total_submissions;
+    problem.templates = [];
+
+    const getLang = function(lang, queue, cb) {
+      plugin.getProblemCode(problem, lang, function(e, code) {
+        if (!e) {
+          lang = _.clone(lang);
+          lang.defaultCode = code;
+          problem.templates.push(lang);
+        }
+        return cb(e);
+      });
+    };
+
+    const q = new Queue(LANGS, {}, getLang);
+    q.run(null, e => cb(e, problem));
+  });
+};
+
+plugin.getProblemCode = function(problem, lang, cb) {
+  log.debug('running lintcode.getProblemCode:' + lang.value);
+  const url = config.sys.urls.problem_code.replace('$id', problem.id)
+                                          .replace('$lang', lang.text.replace(/\+/g, '%2B'));
+  const opts = makeOpts(url);
+
+  const spin = h.spin('Downloading code for ' + lang.text);
+  request(opts, function(e, resp, body) {
+    spin.stop();
+    e = checkError(e, resp, 200);
+    if (e) return cb(e);
+
+    var json = JSON.parse(body);
+    return cb(null, json.code);
+  });
+};
+
+function runCode(problem, isTest, cb) {
+  const lang = _.find(LANGS, x => x.value === h.extToLang(problem.file));
+  const opts = makeOpts(config.sys.urls.test);
+  opts.headers.referer = problem.link;
+  opts.form = {
+    problem_id: problem.id,
+    code:       file.data(problem.file),
+    language:   lang.text
+  };
+  if (isTest) {
+    opts.form.input = problem.testcase;
+    opts.form.is_test_submission = true;
+  }
+
+  spin = h.spin('Sending code to judge');
+  request.post(opts, function(e, resp, body) {
+    spin.stop();
+    e = checkError(e, resp, 200);
+    if (e) return cb(e);
+
+    var json = JSON.parse(body);
+    if (!json.id) return cb('Failed to start judge!');
+
+    spin = h.spin('Waiting for judge result');
+    verifyResult(json.id, isTest, cb);
+  });
+}
+
+function verifyResult(id, isTest, cb) {
+  log.debug('running verifyResult:' + id);
+  var url = isTest ? config.sys.urls.test_verify : config.sys.urls.submit_verify;
+  var opts = makeOpts(url.replace('$id', id));
+
+  request(opts, function(e, resp, body) {
+    e = checkError(e, resp, 200);
+    if (e) return cb(e);
+
+    var result = JSON.parse(body);
+    if (result.status === 'Compiling' || result.status === 'Running')
+      return setTimeout(verifyResult, 1000, id, isTest, cb);
+
+    return cb(null, formatResult(result));
+  });
+}
+
+function formatResult(result) {
+  spin.stop();
+  var x = {
+    ok:              result.status === 'Accepted',
+    type:            'Actual',
+    state:           result.status,
+    runtime:         result.time_cost + ' ms',
+    answer:          _strip(result.output),
+    stdout:          _strip(result.stdout),
+    expected_answer: _strip(result.expected),
+    testcase:        _strip(result.input),
+    passed:          result.data_accepted_count || 0,
+    total:           result.data_total_count || 0
+  };
+
+  var error = [];
+  if (result.compile_info.length > 0)
+    error = error.concat(_split(result.compile_info, '
')); + if (result.error_message.length > 0) + error = error.concat(_split(result.error_message, '
')); + x.error = error; + + // make sure everything is ok + if (error.length > 0) x.ok = false; + if (x.passed !== x.total) x.ok = false; + + return x; +} + +plugin.testProblem = function(problem, cb) { + log.debug('running lintcode.testProblem'); + runCode(problem, true, function(e, result) { + if (e) return cb(e); + + const expected = { + ok: true, + type: 'Expected', + answer: result.expected_answer, + stdout: "''" + }; + return cb(null, [result, expected]); + }); +}; + +plugin.submitProblem = function(problem, cb) { + log.debug('running lintcode.submitProblem'); + runCode(problem, false, function(e, result) { + if (e) return cb(e); + return cb(null, [result]); + }); +}; + +// plugin.getSubmissions = function(problem, cb) { +// return cb('Not implemented'); +// }; + +// plugin.getSubmission = function(submission, cb) { +// return cb('Not implemented'); +// }; + +plugin.getSubmissions = function(problem, cb) { + log.debug('running lintcode.getSubmissions'); + // yji: use makeOpts to get cookie, don't use plugins.makeOpts + const opts = makeOpts(config.sys.urls.submissions.replace('$id', problem.id)); + request(opts, function(e, resp, body) { + e = checkError(e, resp, 200); + if (e) return cb(e); + + // FIXME: this only return the 1st 20 submissions, we should get next if necessary. + const submissions = JSON.parse(body).submissions; + + for (let submission of submissions){ + //translate to enable submission.js -> exportSubmission to use it + if (submission.language.toUpperCase() === 'C++'.toUpperCase()){ + submission.lang = 'cpp'; + } + + if (submission.language.toUpperCase() === 'java'.toUpperCase()){ + submission.lang = 'java'; + } + + if (submission.status === 1){ + submission.status_display = 'Accepted'; + } + } + + return cb(null, submissions); + }); +}; + +plugin.getSubmission = function(submission, cb) { + log.debug('running lintcode.getSubmission'); + const opts = makeOpts(config.sys.urls.submission.replace('$id', submission.id)); + + request(opts, function(e, resp, body) { + e = checkError(e, resp, 200); + if (e) return cb(e); + + submission.code = JSON.parse(body).code; + return cb(null, submission); + }); +}; + +plugin.starProblem = function(problem, starred, cb) { + return cb('Not implemented'); +}; + +plugin.login = function(user, cb) { + log.debug('running lintcode.login'); + const opts = { + url: config.sys.urls.login, + headers: { + 'x-csrftoken': null + }, + form: { + account: user.login, + password: user.pass + } + }; + + const spin = h.spin('Signing in lintcode.com'); + request.post(opts, function(e, resp, body) { + spin.stop(); + if (e) return cb(e); + if (resp.statusCode !== 200) return cb('invalid password?'); + + user.sessionCSRF = h.getSetCookieValue(resp, 'csrftoken'); + user.sessionId = h.getSetCookieValue(resp, 'sessionid'); + user.name = user.login; // FIXME + + return cb(null, user); + }); +}; + +module.exports = plugin; diff --git a/lib/plugins/solution.discuss.js b/lib/plugins/solution.discuss.js new file mode 100644 index 00000000..238967cb --- /dev/null +++ b/lib/plugins/solution.discuss.js @@ -0,0 +1,105 @@ +var request = require('request'); + +var log = require('../log'); +var chalk = require('../chalk'); +var Plugin = require('../plugin'); +var session = require('../session'); + +// +// [Usage] +// +// https://github.com/skygragon/leetcode-cli-plugins/blob/master/docs/solution.discuss.md +// +var plugin = new Plugin(200, 'solution.discuss', '2019.02.03', + 'Plugin to fetch most voted solution in discussions.'); + +var URL_DISCUSSES = 'https://leetcode.com/graphql'; +var URL_DISCUSS = 'https://leetcode.com/problems/$slug/discuss/$id'; + +function getSolution(problem, lang, cb) { + if (!problem) return cb(); + + if (lang === 'python3') lang = 'python'; + + var discuss_num = 1; + if (lang === 'any') discuss_num = 1; + else if (lang === 'any2') discuss_num = 2; + else if (lang === 'any3') discuss_num = 3; + + var opts = { + url: URL_DISCUSSES, + json: true, + body: { + query: [ + 'query questionTopicsList($questionId: String!, $orderBy: TopicSortingOption, $skip: Int, $query: String, $first: Int!, $tags: [String!]) {', + ' questionTopicsList(questionId: $questionId, orderBy: $orderBy, skip: $skip, query: $query, first: $first, tags: $tags) {', + ' ...TopicsList', + ' }', + '}', + 'fragment TopicsList on TopicConnection {', + ' totalNum', + ' edges {', + ' node {', + ' id', + ' title', + ' post {', + ' content', + ' voteCount', + ' author {', + ' username', + ' }', + ' }', + ' }', + ' }', + '}' + ].join('\n'), + + operationName: 'questionTopicsList', + variables: JSON.stringify({ + query: '', + first: discuss_num, + skip: 0, + orderBy: 'most_votes', + questionId: '' + problem.id, + tags: (lang === 'any'||'any2'||'any3')? undefined:[lang] + }) + } + }; + request(opts, function(e, resp, body) { + if (e) return cb(e); + if (resp.statusCode !== 200) + return cb({msg: 'http error', statusCode: resp.statusCode}); + + const solutions = body.data.questionTopicsList.edges; + const solution = solutions.length > (discuss_num-1) ? solutions[discuss_num-1].node : null; + return cb(null, solution); + }); +} + +plugin.getProblem = function(problem, cb) { + plugin.next.getProblem(problem, function(e, problem) { + if (e || !session.argv.solution) return cb(e, problem); + + var lang = session.argv.lang; + getSolution(problem, lang, function(e, solution) { + if (e) return cb(e); + if (!solution) return log.error('Solution not found for ' + lang); + + var link = URL_DISCUSS.replace('$slug', problem.slug).replace('$id', solution.id); + var content = solution.post.content.replace(/\\n/g, '\n').replace(/\\t/g, '\t'); + + log.info(); + log.info(solution.title); + log.info(); + log.info(chalk.underline(link)); + log.info(); + log.info('* Lang: ' + lang); + log.info('* Author: ' + solution.post.author.username); + log.info('* Votes: ' + solution.post.voteCount); + log.info(); + log.info(content); + }); + }); +}; + +module.exports = plugin; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..f135f008 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2191 @@ +{ + "name": "leetcode-cli", + "version": "2.6.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "optional": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "optional": true + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "optional": true, + "requires": { + "acorn": "^2.1.0" + } + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "jsdom": "^7.0.2", + "lodash": "^4.1.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "optional": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "optional": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "deep-equal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "optional": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "optional": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "optional": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "optional": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "optional": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "optional": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/github/-/github-13.1.1.tgz", + "integrity": "sha512-BpItPaOCuvotnNUGXSSEDkB86eqQ7+k7j8/+lu5gbRmNnFPW/uQyFezH1fjy7XojieVNzD/+MgPhBngaw+Ocfw==", + "requires": { + "debug": "^3.1.0", + "dotenv": "^4.0.0", + "https-proxy-agent": "^2.1.0", + "is-stream": "^1.1.0", + "lodash": "^4.17.4", + "proxy-from-env": "^1.0.0", + "url-template": "^2.0.8" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "i": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", + "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "optional": true, + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keytar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-6.0.1.tgz", + "integrity": "sha512-1Ihpf2tdM3sLwGMkYHXYhVC/hx5BDR7CWFL4IrBA3IDZo0xHhS2nM+tU9Y+u/U7okNfbVkwmKsieLkcWRMh93g==", + "requires": { + "node-addon-api": "^3.0.0", + "prebuild-install": "5.3.4" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "nconf": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", + "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", + "requires": { + "async": "^1.4.0", + "ini": "^1.3.0", + "secure-keys": "^1.0.0", + "yargs": "^3.19.0" + }, + "dependencies": { + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "ncp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", + "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=" + }, + "needle": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", + "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-abi": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", + "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", + "requires": { + "semver": "^5.4.1" + } + }, + "node-addon-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", + "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "optional": true + } + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + } + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "optional": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.0.0.tgz", + "integrity": "sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg==", + "requires": { + "chalk": "^2.3.1", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.1.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^4.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "optional": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" + }, + "prebuild-install": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.4.tgz", + "integrity": "sha512-AkKN+pf4fSEihjapLEEj8n85YIw/tN6BQqkhzbDc0RvEZGdkpJBGMUYx66AAMcPG2KzmPQS7Cm16an4HVBRRMA==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp": "^0.5.1", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "prompt": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz", + "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=", + "requires": { + "colors": "^1.1.2", + "pkginfo": "0.x.x", + "read": "1.0.x", + "revalidator": "0.1.x", + "utile": "0.3.x", + "winston": "2.1.x" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "requires": { + "mute-stream": "~0.0.4" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "sqlite3": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz", + "integrity": "sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw==", + "requires": { + "node-addon-api": "2.0.0", + "node-gyp": "3.x", + "node-pre-gyp": "^0.11.0" + }, + "dependencies": { + "node-addon-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", + "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==" + } + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "optional": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", + "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "optional": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utile": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz", + "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=", + "requires": { + "async": "~0.9.0", + "deep-equal": "~0.2.1", + "i": "0.3.x", + "mkdirp": "0.x.x", + "ncp": "1.0.x", + "rimraf": "2.x.x" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "optional": true + }, + "whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "optional": true, + "requires": { + "tr46": "~0.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "winston": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz", + "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=", + "requires": { + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "optional": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.4.tgz", + "integrity": "sha512-f5esswlPO351AnejaO2A1ZZr0zesz19RehQKwiRDqWtrraWrJy16tsUIKgDXFMVytvNOHPVmTiaTh3wO67I0fQ==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + } + } +} diff --git a/package.json b/package.json index a9af9f7c..c6221f03 100644 --- a/package.json +++ b/package.json @@ -52,13 +52,17 @@ "dependencies": { "ansi-styles": "3.2.1", "cheerio": "0.20.0", + "github": "^13.1.1", + "glob": "^7.1.6", "he": "1.2.0", + "keytar": "^6.0.1", "mkdirp": "0.5.1", "moment": "^2.20.1", "nconf": "0.10.0", "ora": "3.0.0", "prompt": "1.0.0", "request": "2.88.0", + "sqlite3": "^5.0.0", "supports-color": "5.5.0", "underscore": "1.9.1", "wordwrap": "1.0.0",