├── .gitignore ├── .dockerignore ├── Dockerfile ├── site ├── index.html └── ui │ └── ui.ts ├── src ├── tsconfig.json ├── tslint.json ├── hls │ ├── level-key.ts │ ├── level.ts │ ├── codecs.ts │ ├── attr-list.ts │ ├── fragment.ts │ └── m3u8-parser.ts ├── db.ts ├── index.ts ├── queue.ts └── analyze.ts ├── docker-compose.yml ├── LICENSE ├── package.json ├── README.md ├── wait-for-it.sh └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | app/* 2 | node_modules/* -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:11.9.0 2 | WORKDIR /usr/src/app 3 | 4 | COPY package*.json ./ 5 | COPY wait-for-it.sh /wait-for-it.sh 6 | RUN chmod +x /wait-for-it.sh 7 | RUN npm install 8 | COPY . . 9 | EXPOSE 3000 10 | -------------------------------------------------------------------------------- /site/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Media Lighthouse 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../app", 4 | "sourceMap": true, 5 | "module": "commonjs", 6 | "target": "ESNext", 7 | "noImplicitAny": false, 8 | "removeComments": true, 9 | "moduleResolution": "node", 10 | "baseUrl": "../", 11 | "paths": { 12 | "src/*": ["src/*"] 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:recommended" 4 | ], 5 | "rules": { 6 | "quotemark": { 7 | "options": ["single", "avoid-escape"] 8 | }, 9 | "no-bitwise": false, 10 | "variable-name": [true, "allow-leading-underscore"], 11 | "no-console": false, 12 | "interface-name" : [true, "never-prefix"] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/hls/level-key.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import * as URLToolkit from 'url-toolkit'; 3 | 4 | export default class LevelKey { 5 | public method: string = null; 6 | public key = null; 7 | public iv = null; 8 | public reluri: string = null; 9 | public baseuri: string = null; 10 | 11 | private _uri = null; 12 | 13 | get uri() { 14 | if (!this._uri && this.reluri) { 15 | this._uri = URLToolkit.buildAbsoluteURL(this.baseuri, this.reluri, { alwaysNormalize: true }); 16 | } 17 | 18 | return this._uri; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | media-lighthouse: 5 | build: 6 | context: . 7 | dockerfile: Dockerfile 8 | container_name: media-lighthouse 9 | ports: 10 | - '3000:3000' 11 | depends_on: 12 | - redis 13 | - mongo 14 | command: ["./wait-for-it.sh", "db:27017", "--", "npm", "start"] 15 | mongo: 16 | container_name: mongo 17 | image: mongo 18 | volumes: 19 | - ./data:/data/db 20 | ports: 21 | - "27017:27017" 22 | redis: 23 | container_name: redis 24 | image: redis:alpine 25 | ports: 26 | - "6379:6379" 27 | 28 | -------------------------------------------------------------------------------- /src/hls/level.ts: -------------------------------------------------------------------------------- 1 | import Fragment from './fragment'; 2 | 3 | export default class Level { 4 | public endSN: number = 0; 5 | public endCC: number = 0; 6 | public fragments: Fragment[] = []; 7 | public initSegment: Fragment; 8 | public live: boolean; 9 | public needSidxRanges: boolean; 10 | public startCC: number = 0; 11 | public startSN: number = 0; 12 | public startTimeOffset: number; 13 | public targetduration: number = 0; 14 | public totalduration: number = 0; 15 | public type: string; 16 | public url: string; 17 | public version: number; 18 | public averagetargetduration: number; 19 | 20 | constructor(baseUrl) { 21 | this.url = baseUrl; 22 | } 23 | 24 | get hasProgramDateTime() { 25 | return !!(this.fragments[0] && Number.isFinite(this.fragments[0].programDateTime)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 video-dev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "media-lighthouse", 3 | "version": "1.0.0", 4 | "main": "./app/index.js", 5 | "repository": "git@github.com:video-dev/media-lighthouse.git", 6 | "author": "John Bartos ", 7 | "license": "MIT", 8 | "private": false, 9 | "scripts": { 10 | "build": "tsc -p ./src", 11 | "lint": "tslint 'src/**/*.ts'", 12 | "watch": "tsc -w -p ./src", 13 | "serve": "node --max-old-space-size=4096 ./app/index.js", 14 | "start": "npm run build && npm run serve" 15 | }, 16 | "dependencies": { 17 | "chart.js": "^2.7.3", 18 | "express": "^4.16.4", 19 | "mongodb": "^3.1.10", 20 | "request": "^2.88.0", 21 | "request-promise-native": "^1.0.5", 22 | "rsmq": "^0.9.3", 23 | "thumbcoil": "^1.2.3-hackweek2", 24 | "url-toolkit": "^2.1.6" 25 | }, 26 | "devDependencies": { 27 | "@types/chart.js": "^2.7.41", 28 | "@types/express": "^4.16.0", 29 | "@types/mongodb": "^3.1.17", 30 | "@types/request-promise-native": "^1.0.15", 31 | "@types/rsmq": "^0.3.27", 32 | "nodemon": "^1.18.9", 33 | "ts-node": "^7.0.1", 34 | "tslint": "^5.11.0", 35 | "typescript": "^3.2.2" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/hls/codecs.ts: -------------------------------------------------------------------------------- 1 | // from http://mp4ra.org/codecs.html 2 | const sampleEntryCodesISO = { 3 | audio: { 4 | 'a3ds': true, 5 | 'ac-3': true, 6 | 'ac-4': true, 7 | 'alac': true, 8 | 'alaw': true, 9 | 'dra1': true, 10 | 'dts+': true, 11 | 'dts-': true, 12 | 'dtsc': true, 13 | 'dtse': true, 14 | 'dtsh': true, 15 | 'ec-3': true, 16 | 'enca': true, 17 | 'g719': true, 18 | 'g726': true, 19 | 'm4ae': true, 20 | 'mha1': true, 21 | 'mha2': true, 22 | 'mhm1': true, 23 | 'mhm2': true, 24 | 'mlpa': true, 25 | 'mp4a': true, 26 | 'raw ': true, 27 | 'Opus': true, 28 | 'samr': true, 29 | 'sawb': true, 30 | 'sawp': true, 31 | 'sevc': true, 32 | 'sqcp': true, 33 | 'ssmv': true, 34 | 'twos': true, 35 | 'ulaw': true, 36 | }, 37 | video: { 38 | 'avc1': true, 39 | 'avc2': true, 40 | 'avc3': true, 41 | 'avc4': true, 42 | 'avcp': true, 43 | 'drac': true, 44 | 'dvav': true, 45 | 'dvhe': true, 46 | 'encv': true, 47 | 'hev1': true, 48 | 'hvc1': true, 49 | 'mjp2': true, 50 | 'mp4v': true, 51 | 'mvc1': true, 52 | 'mvc2': true, 53 | 'mvc3': true, 54 | 'mvc4': true, 55 | 'resv': true, 56 | 'rv60': true, 57 | 's263': true, 58 | 'svc1': true, 59 | 'svc2': true, 60 | 'vc-1': true, 61 | 'vp08': true, 62 | 'vp09': true, 63 | }, 64 | }; 65 | 66 | function isCodecType(codec, type) { 67 | const typeCodes = sampleEntryCodesISO[type]; 68 | return !!typeCodes && typeCodes[codec.slice(0, 4)] === true; 69 | } 70 | 71 | function isCodecSupportedInMp4(codec, type) { 72 | // @ts-ignore 73 | return window.MediaSource.isTypeSupported(`${type || 'video'}/mp4;codecs="${codec}"`); 74 | } 75 | 76 | export { isCodecType, isCodecSupportedInMp4 }; 77 | -------------------------------------------------------------------------------- /src/db.ts: -------------------------------------------------------------------------------- 1 | import { Collection, Db, MongoClient } from 'mongodb'; 2 | import { Playlist } from './analyze'; 3 | import Fragment from './hls/fragment'; 4 | 5 | export enum ProcessingStatus { 6 | Unprocessed = 0, 7 | Partial, 8 | Done, 9 | } 10 | 11 | export default class Database { 12 | private url: string = 'mongodb://mongo:27017'; 13 | private dbName: string = 'media-lighthouse'; 14 | private collectionName: string = 'streams'; 15 | private db: Db; 16 | private collection: Collection; 17 | 18 | public async connect() { 19 | const { collectionName, dbName, url } = this; 20 | const client = await MongoClient.connect(url, { useNewUrlParser: true }); 21 | console.log(`Connected to Mongo instance an ${url}`); 22 | const db = this.db = client.db(dbName); 23 | 24 | const collections = await db.collections(); 25 | const collection = this.collection = collections.find((c) => c.collectionName === collectionName); 26 | if (!collection) { 27 | this.collection = await db.createCollection(collectionName); 28 | console.log(`${collectionName} collection created`); 29 | } else { 30 | console.log(`collection ${collectionName} already exists`); 31 | } 32 | } 33 | 34 | public async createPlaylistEntry(playlist: Playlist) { 35 | const { collection } = this; 36 | 37 | if (await collection.findOne({ url: playlist.url})) { 38 | console.log(`${playlist.url} document already exists`); 39 | return; 40 | } 41 | await collection.insertOne(playlist); 42 | console.log('wrote playlist to collection'); 43 | } 44 | 45 | public async insertFrag(playlist, frag: Fragment, fragData) { 46 | console.log(`levels.${frag.level}.fragments.${frag.sn}.data`); 47 | return this.collection.findOneAndUpdate( 48 | { url: playlist.url }, 49 | { $set: {[`levels.${frag.level}.fragments.${frag.sn}.data`]: fragData }}, 50 | { upsert: true }, 51 | ((error, result) => { 52 | console.log(error, result); 53 | }), 54 | ); 55 | } 56 | 57 | public async getPlaylist(url: string) { 58 | return this.collection.findOne({ url }); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # media-lighthouse 2 | 🗼See problems before debugging 3 | 4 | 5 | ### Problems 6 | * Experienced player developers spend a lot of time answering the question: is this bug caused by bad media, or our player? To answer the question they analyze the instrinsics (timing, etc.) of media to see if it's well-formed - we use ffprobe to do this, and it can be fairly time consuming to extract basic info. We also analyze the playlist itself to see if it corroborates the media. 7 | * Inexperienced player developers aren't skilled in analyzing streams. ffprobe is a complex tool, and the commands to extract the data you need are arcane. And furthermore, they may not know the significance of timing, and how it can cause unsolvable playback errors. 8 | * There are certain "must-haves" in media - for example, if you have a discontinuity during a live stream, you must use the DISCONTINUITY-SEQUENCE tag. A bot could take the extracted manifest/media information and run unit tests against them. 9 | * Debugging media is pretty difficult, even for an experienced developer. Neat visualizations would help expose problems that may be hard to see when scrolling through text. 10 | 11 | ### Solution 12 | 13 | The solution to these above problems is being called "Media Lighthouse". The project was proposed at FOMS 2018 with a breakout session of player developers, including Shaka, Hls.js, JW, VideoJS, and Kaltura. 14 | 15 | * Expose media information (both manifest and media intrinsics) via an API. Live streams require additonal work, and need to specify a capture window. 16 | * Program a git bot to use this API and to automatically run it against new issues, leaving a comment with the media information. 17 | * Write a unit testing framework with this API as the center, so that developers may write unit tests against media 18 | * Create visualizations using this API, and wire it into the git bot. 19 | * Wire this information into our player harness, so that we can correlate media playback with the underlying media ([~rob]) 20 | 21 | 22 | ### Notes 23 | * Thumbcoil (https://github.com/videojs/thumbcoil) sounds like a great starting point for this effort. 24 | * There is significant interest from other video developers around this project. Check out the #media-lighthouse chat in the video-dev slack to get involved. The goal of this project is to create an open-source tool for use by the video-dev community. 25 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express'; 2 | import * as RedisSMQ from 'rsmq'; 3 | import { analyze, parsePlaylist } from './analyze'; 4 | import Database from './db'; 5 | import MediaQueue from './queue'; 6 | 7 | const port = 3000; 8 | const app = express(); 9 | const rsmq = this.rsmq = new RedisSMQ( { host: 'redis', port: 6379, ns: 'rsmq' } ); 10 | const db = new Database(); 11 | 12 | async function processFrags(queue, playlist) { 13 | while (true) { 14 | const frag = await queue.getFragment(); 15 | if (!frag) { 16 | break; 17 | } 18 | const fragData = await analyze(frag); 19 | db.insertFrag(playlist, frag, fragData); 20 | } 21 | } 22 | 23 | async function processMedia(url: string) { 24 | const queue = new MediaQueue(rsmq, url); 25 | queue.init(); 26 | 27 | const playlist = await parsePlaylist(url); 28 | if (await queue.hasFragmentsEnqueued()) { 29 | await processFrags(queue, playlist); 30 | } else { 31 | await db.createPlaylistEntry(playlist); 32 | await Promise.all(playlist.levels.map(async (level) => { 33 | return await queue.pushFragments(level.fragments); 34 | })); 35 | await processFrags(queue, playlist); 36 | } 37 | } 38 | 39 | (async () => { 40 | await db.connect(); 41 | 42 | app.get('/report', async (req, res) => { 43 | let url = req.query.stream; 44 | if (!url) { 45 | console.log('Stream param not provided'); 46 | res.send(404); 47 | return; 48 | } 49 | url = decodeURIComponent(url); 50 | const playlist = await db.getPlaylist(url); 51 | res.header('Access-Control-Allow-Origin', '*'); 52 | res.status(200); 53 | res.send(JSON.stringify(playlist)); 54 | }); 55 | 56 | app.post('/analyze', async (req, res) => { 57 | let url = req.query.stream; 58 | if (!url) { 59 | console.log('Stream param not provided'); 60 | res.send(200); 61 | return; 62 | } 63 | url = decodeURIComponent(url); 64 | console.log(`Analyzing ${url}`); 65 | res.send(200); 66 | await processMedia(url); 67 | console.log('done'); 68 | }); 69 | 70 | app.listen(port, () => console.log(`Listening on port ${port}`)); 71 | })(); 72 | 73 | // (async (url) => { 74 | // })('https://playertest.longtailvideo.com/adaptive/bbbfull/bbbfull.m3u8'); 75 | -------------------------------------------------------------------------------- /src/hls/attr-list.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | const DECIMAL_RESOLUTION_REGEX = /^(\d+)x(\d+)$/; // eslint-disable-line no-useless-escape 3 | const ATTR_LIST_REGEX = /\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g; // eslint-disable-line no-useless-escape 4 | 5 | // adapted from https://github.com/kanongil/node-m3u8parse/blob/master/attrlist.js 6 | class AttrList { 7 | constructor(attrs) { 8 | if (typeof attrs === 'string') { 9 | attrs = AttrList.parseAttrList(attrs); 10 | } 11 | 12 | for (const attr in attrs) { 13 | if (attrs.hasOwnProperty(attr)) { 14 | this[attr] = attrs[attr]; 15 | } 16 | } 17 | } 18 | 19 | public decimalInteger(attrName) { 20 | const intValue = parseInt(this[attrName], 10); 21 | if (intValue > Number.MAX_SAFE_INTEGER) { 22 | return Infinity; 23 | } 24 | 25 | return intValue; 26 | } 27 | 28 | public hexadecimalInteger(attrName) { 29 | if (this[attrName]) { 30 | let stringValue = (this[attrName] || '0x').slice(2); 31 | stringValue = ((stringValue.length & 1) ? '0' : '') + stringValue; 32 | 33 | const value = new Uint8Array(stringValue.length / 2); 34 | for (let i = 0; i < stringValue.length / 2; i++) { 35 | value[i] = parseInt(stringValue.slice(i * 2, i * 2 + 2), 16); 36 | } 37 | 38 | return value; 39 | } else { 40 | return null; 41 | } 42 | } 43 | 44 | public hexadecimalIntegerAsNumber(attrName) { 45 | const intValue = parseInt(this[attrName], 16); 46 | if (intValue > Number.MAX_SAFE_INTEGER) { 47 | return Infinity; 48 | } 49 | 50 | return intValue; 51 | } 52 | 53 | public decimalFloatingPoint(attrName) { 54 | return parseFloat(this[attrName]); 55 | } 56 | 57 | public enumeratedString(attrName) { 58 | return this[attrName]; 59 | } 60 | 61 | public decimalResolution(attrName) { 62 | const res = DECIMAL_RESOLUTION_REGEX.exec(this[attrName]); 63 | if (res === null) { 64 | return undefined; 65 | } 66 | 67 | return { 68 | width: parseInt(res[1], 10), 69 | height: parseInt(res[2], 10), 70 | }; 71 | } 72 | 73 | public static parseAttrList(input) { 74 | let match, attrs = {}; 75 | ATTR_LIST_REGEX.lastIndex = 0; 76 | while ((match = ATTR_LIST_REGEX.exec(input)) !== null) { 77 | let value = match[2], quote = '"'; 78 | 79 | if (value.indexOf(quote) === 0 && 80 | value.lastIndexOf(quote) === (value.length - 1)) { 81 | value = value.slice(1, -1); 82 | } 83 | 84 | attrs[match[1]] = value; 85 | } 86 | return attrs; 87 | } 88 | } 89 | 90 | export default AttrList; 91 | -------------------------------------------------------------------------------- /src/queue.ts: -------------------------------------------------------------------------------- 1 | import * as RedisSMQ from 'rsmq'; 2 | import Fragment from './hls/fragment'; 3 | 4 | function hash(s) { 5 | let h; 6 | for (let i = 0; i < s.length; i++) { 7 | h = Math.imul(31, h) + s.charCodeAt(i) | 0; 8 | } 9 | 10 | return h; 11 | } 12 | 13 | export default class MediaQueue { 14 | private rsmq: RedisSMQ; 15 | private qname: string; 16 | 17 | constructor(rsmq: RedisSMQ, playlistUrl: string) { 18 | this.rsmq = rsmq; 19 | this.qname = hash(playlistUrl); 20 | } 21 | 22 | public init() { 23 | const { rsmq, qname } = this; 24 | console.log(`creating queue for ${qname}`); 25 | rsmq.createQueue({ qname }, (err, resp) => { 26 | if (resp === 1) { 27 | console.log('mediaQueue created'); 28 | } else if (err) { 29 | if (err.name === 'queueExists') { 30 | console.log('mediaQueue already exists'); 31 | } else { 32 | console.log(err); 33 | } 34 | } 35 | }); 36 | } 37 | 38 | public async hasFragmentsEnqueued(): Promise { 39 | const { rsmq, qname } = this; 40 | return new Promise((resolve, reject) => { 41 | rsmq.getQueueAttributes({ qname }, (err, resp) => { 42 | if (err) { 43 | reject(err); 44 | } else { 45 | resolve(!!resp.msgs); 46 | } 47 | }); 48 | }); 49 | } 50 | 51 | public async pushFragment(frag: Fragment) { 52 | const { rsmq, qname } = this; 53 | return new Promise((resolve, reject) => { 54 | rsmq.sendMessage({ qname, message: JSON.stringify(frag) }, (err, resp) => { 55 | if (resp) { 56 | console.log(`Successfully enqueued ${frag.url}`); 57 | resolve(); 58 | } else { 59 | console.log(`Failed to enqueue ${frag.url}`, err); 60 | reject(err); 61 | } 62 | }); 63 | }); 64 | } 65 | 66 | public async pushFragments(fragments: Fragment[]) { 67 | return new Promise((resolve, reject) => { 68 | for (const frag of fragments) { 69 | try { 70 | this.pushFragment(frag); 71 | } catch (e) { 72 | reject(new Error(`Failed to enqueue frag ${e}`)); 73 | } 74 | } 75 | resolve(); 76 | }); 77 | } 78 | 79 | public async getFragment(): Promise { 80 | const { rsmq, qname } = this; 81 | return new Promise((resolve, reject) => { 82 | rsmq.popMessage({ qname }, (err, resp) => { 83 | const msg = resp as any; 84 | if (msg.id) { 85 | resolve(Object.assign(new Fragment(), JSON.parse(msg.message))); 86 | } else { 87 | resolve(null); 88 | } 89 | }); 90 | }); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/analyze.ts: -------------------------------------------------------------------------------- 1 | import { get } from 'request-promise-native'; 2 | import * as Thumbcoil from 'thumbcoil'; 3 | import Fragment from './hls/fragment'; 4 | import Level from './hls/level'; 5 | import M3U8Parser from './hls/m3u8-parser.js'; 6 | 7 | export interface Playlist { 8 | levels: Level[]; 9 | url: string; 10 | } 11 | 12 | function isLevelPlaylist(playlist: string) { 13 | return playlist.indexOf('#EXTINF:') > 0 || playlist.indexOf('#EXT-X-TARGETDURATION:') > 0; 14 | } 15 | 16 | const batchDownload = async (frags: Fragment[]) => { 17 | const maxBatchSize = 50; 18 | let i = 0; 19 | while (i < frags.length) { 20 | const batchSize = Math.min(maxBatchSize, frags.length - i); 21 | await Promise.all(frags.slice(i, i + batchSize).map(async (frag) => { 22 | const data = await get({ url: frag.url, encoding: null }); 23 | frag.data = Thumbcoil.tsInspector.inspect(data); 24 | return Promise.resolve(); 25 | })); 26 | i += batchSize; 27 | } 28 | return Promise.resolve; 29 | }; 30 | 31 | const filterPackets = (esMap) => { 32 | const audio = { pts: [], dts: [] }; 33 | const video = { pts: [], dts: [] }; 34 | esMap.forEach((packet) => { 35 | if (packet.type === 'audio') { 36 | audio.pts.push(packet.pts); 37 | audio.dts.push(packet.dts); 38 | } else if (packet.type === 'video') { 39 | video.pts.push(packet.pts); 40 | video.dts.push(packet.dts); 41 | } 42 | }); 43 | 44 | return { audio, video }; 45 | }; 46 | 47 | function collapseRanges(data) { 48 | const result = []; 49 | let i = 0; 50 | let j = 1; 51 | let equalSigns = false; 52 | 53 | while (i < data.length) { 54 | const sign = Math.sign(data[j] - data[i]); 55 | do { 56 | j++; 57 | equalSigns = !sign || Math.sign(data[j] - data[j - 1]) === sign; 58 | } while (j < data.length && equalSigns); 59 | 60 | if (j === data.length - 1) { 61 | if (equalSigns) { 62 | result.push([data[i], data[j]]); 63 | } else { 64 | result.push([data[i], data[j - 1]], [data[j]]); 65 | } 66 | break; 67 | } else { 68 | result.push([data[i], data[j - 1]]); 69 | i = j; 70 | j++; 71 | } 72 | } 73 | 74 | return result.flat(); 75 | } 76 | 77 | export async function analyze(frag: Fragment) { 78 | const fragUrl = frag.url; 79 | console.log(`analyzing frag ${fragUrl}`); 80 | const tsData = await get({ url: fragUrl, encoding: null }); 81 | const thumbFrag = Thumbcoil.tsInspector.inspect(tsData); 82 | return collapseLevelTiming(thumbFrag.esMap); 83 | } 84 | 85 | export function collapseLevelTiming(esMap) { 86 | const { audio, video } = filterPackets(esMap); 87 | return { 88 | audio: { 89 | dts: collapseRanges(audio.dts), 90 | pts: collapseRanges(audio.pts), 91 | }, 92 | video: { 93 | dts: collapseRanges(video.dts), 94 | pts: collapseRanges(video.pts), 95 | }, 96 | }; 97 | } 98 | 99 | export async function parsePlaylist(url: string): Promise { 100 | const masterResponse = await get(url); 101 | let levels; 102 | if (isLevelPlaylist(masterResponse)) { 103 | levels = [M3U8Parser.parseLevelPlaylist(masterResponse, url, 0, 'main', 0)]; 104 | } else { 105 | const parsedMaster = M3U8Parser.parseMasterPlaylist(masterResponse, url); 106 | levels = await Promise.all(parsedMaster.map(async (level, index) => { 107 | const levelString = await get(level.url); 108 | return M3U8Parser.parseLevelPlaylist(levelString, level.url, index, 'main', 0); 109 | })); 110 | } 111 | 112 | return { 113 | levels, 114 | url, 115 | }; 116 | } 117 | -------------------------------------------------------------------------------- /site/ui/ui.ts: -------------------------------------------------------------------------------- 1 | const canvas = document.querySelector('canvas'); 2 | const context = canvas.getContext('2d'); 3 | const width = canvas.width = window.innerWidth; 4 | const height = canvas.height = window.innerHeight; 5 | 6 | const randomHexColor = () => '#' + Math.floor(Math.random() * 16777215).toString(16); 7 | 8 | function create2DPtsPoint(pts) { 9 | return { 10 | x: pts / 90000, 11 | y: pts, 12 | }; 13 | } 14 | 15 | function splitAV(fragments) { 16 | const audio = []; 17 | const video = []; 18 | fragments.forEach((frag) => { 19 | audio.push(frag.data.audio.pts); 20 | video.push(frag.data.video.pts); 21 | }); 22 | 23 | return { audio, video }; 24 | } 25 | 26 | function createLineSet(level) { 27 | const { audio, video } = splitAV(level.fragments); 28 | return [ 29 | { 30 | borderColor: randomHexColor(), 31 | cubicInterpolationMode: 'monotone', 32 | data: audio.flat(), 33 | fill: false, 34 | label: 'Audio', 35 | type: 'line', 36 | }, 37 | { 38 | borderColor: randomHexColor(), 39 | cubicInterpolationMode: 'monotone', 40 | data: video.flat(), 41 | fill: false, 42 | label: 'Video', 43 | type: 'line', 44 | }, 45 | ]; 46 | } 47 | 48 | function createScatterSet(level) { 49 | return createLineSet(level) 50 | .map((set) => { 51 | set.data = set.data.flat().map(create2DPtsPoint); 52 | set.type = 'scatter'; 53 | return set; 54 | }); 55 | } 56 | 57 | function createBarSet(level) { 58 | const { audio, video } = splitAV(level.fragments); 59 | barSet.map((set) => { 60 | const diff = []; 61 | set.data.forEach((val, index) => { 62 | if (set.data[index + 1]) { 63 | diff.push(set.data[index + 1] - val); 64 | } 65 | }); 66 | set.data = diff; 67 | set.type = 'bar'; 68 | }); 69 | return barSet; 70 | } 71 | 72 | function createPerFragDataset(level) { 73 | const borderColor = randomHexColor(); 74 | return level.fragments.map((frag, index) => { 75 | return [ 76 | { 77 | backgroundColor: borderColor, 78 | borderColor, 79 | data: frag.data.audio.pts.flat(), 80 | fill: true, 81 | label: `Frag ${index} audio`, 82 | }, 83 | { 84 | backgroundColor: borderColor, 85 | borderColor, 86 | data: frag.data.video.pts.flat(), 87 | fill: true, 88 | label: `Frag ${index} video`, 89 | }, 90 | ]; 91 | }).flat(); 92 | } 93 | 94 | (async () => { 95 | let response; 96 | try { 97 | response = await fetch( 98 | 'http://localhost:3000/report?stream=https%3A%2F%2Fvideo-dev.github.io%2Fstreams%2Fpts_shift%2Fmaster.m3u8' 99 | ); 100 | } catch (e) { 101 | console.error(e); 102 | return; 103 | } 104 | const report = await response.json(); 105 | console.log(report); 106 | 107 | const lineDataSet = createLineSet(report.levels[0]); 108 | const scatterDataSet = createScatterSet(report.levels[0]); 109 | const barDataSet = createBarSet(report.levels[0]); 110 | 111 | const chart = new Chart(context, { 112 | data: { 113 | labels: report.levels[0].fragments.map((f, i) => `Frag ${i}`), 114 | datasets: [ 115 | ...lineDataSet, 116 | ...scatterDataSet, 117 | ], 118 | }, 119 | type: 'line', 120 | options: { 121 | scales: { 122 | yAxes: [{ 123 | ticks: { 124 | // max: datasets[1].data[datasets[1].data.length - 1].y, 125 | }, 126 | }], 127 | }, 128 | }, 129 | }); 130 | })(); 131 | -------------------------------------------------------------------------------- /src/hls/fragment.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import * as URLToolkit from 'url-toolkit'; 3 | 4 | import LevelKey from './level-key'; 5 | 6 | export default class Fragment { 7 | public tagList: string[][] = []; 8 | public programDateTime: number; 9 | public rawProgramDateTime: string; 10 | public relurl: string; 11 | public baseurl: string; 12 | public rawByteRange: string; 13 | public duration: number; 14 | public levelkey: LevelKey; 15 | public sn: number | string = 0; 16 | public data: any = null; 17 | public title: string; 18 | public start: number; 19 | public type: string; 20 | public cc: number; 21 | public level: number; 22 | public urlId: string; 23 | public lastByteRangeEndOffset: number = 0; 24 | 25 | private _url: string; 26 | private _byteRange: number[]; 27 | private _decryptdata: { 28 | uri: string, 29 | key: string, 30 | }; 31 | private _elementaryStreams: {}; 32 | 33 | constructor() { 34 | // Holds the types of data this fragment supports 35 | this._elementaryStreams = { 36 | [Fragment.ElementaryStreamTypes.AUDIO]: false, 37 | [Fragment.ElementaryStreamTypes.VIDEO]: false, 38 | }; 39 | } 40 | 41 | /** 42 | * `type` property for this._elementaryStreams 43 | * 44 | * @enum 45 | */ 46 | static get ElementaryStreamTypes() { 47 | return { 48 | AUDIO: 'audio', 49 | VIDEO: 'video', 50 | }; 51 | } 52 | 53 | get url() { 54 | if (!this._url && this.relurl) { 55 | this._url = URLToolkit.buildAbsoluteURL(this.baseurl, this.relurl, { alwaysNormalize: true }); 56 | } 57 | 58 | return this._url; 59 | } 60 | 61 | set url(value) { 62 | this._url = value; 63 | } 64 | 65 | get byteRange() { 66 | if (!this._byteRange && !this.rawByteRange) { 67 | return []; 68 | } 69 | 70 | if (this._byteRange) { 71 | return this._byteRange; 72 | } 73 | 74 | const byteRange = []; 75 | if (this.rawByteRange) { 76 | const params = this.rawByteRange.split('@', 2); 77 | if (params.length === 1) { 78 | const lastByteRangeEndOffset = this.lastByteRangeEndOffset; 79 | byteRange[0] = lastByteRangeEndOffset || 0; 80 | } else { 81 | byteRange[0] = parseInt(params[1], 10); 82 | } 83 | byteRange[1] = parseInt(params[0], 10) + byteRange[0]; 84 | this._byteRange = byteRange; 85 | } 86 | return byteRange; 87 | } 88 | 89 | get byteRangeStartOffset() { 90 | return this.byteRange[0]; 91 | } 92 | 93 | get byteRangeEndOffset() { 94 | return this.byteRange[1]; 95 | } 96 | 97 | get decryptdata() { 98 | if (!this._decryptdata) { 99 | this._decryptdata = this.fragmentDecryptdataFromLevelkey(this.levelkey, this.sn); 100 | } 101 | 102 | return this._decryptdata; 103 | } 104 | 105 | get endProgramDateTime() { 106 | if (!Number.isFinite(this.programDateTime)) { 107 | return null; 108 | } 109 | 110 | const duration = !Number.isFinite(this.duration) ? 0 : this.duration; 111 | 112 | return this.programDateTime + (duration * 1000); 113 | } 114 | 115 | get encrypted() { 116 | return !!((this.decryptdata && this.decryptdata.uri !== null) && (this.decryptdata.key === null)); 117 | } 118 | 119 | public addElementaryStream(type) { 120 | this._elementaryStreams[type] = true; 121 | } 122 | 123 | public hasElementaryStream(type) { 124 | return this._elementaryStreams[type] === true; 125 | } 126 | 127 | /** 128 | * Utility method for parseLevelPlaylist to create an initialization vector for a given segment 129 | * @returns {Uint8Array} 130 | */ 131 | public createInitializationVector(segmentNumber) { 132 | const uint8View = new Uint8Array(16); 133 | 134 | for (let i = 12; i < 16; i++) { 135 | uint8View[i] = (segmentNumber >> 8 * (15 - i)) & 0xff; 136 | } 137 | 138 | return uint8View; 139 | } 140 | 141 | /** 142 | * Utility method for parseLevelPlaylist to get a fragment's decryption data from the currently parsed encryption key 143 | * data. 144 | * @param levelkey - a playlist's encryption info 145 | * @param segmentNumber - the fragment's segment number 146 | * @returns {*} - an object to be applied as a fragment's decryptdata 147 | */ 148 | public fragmentDecryptdataFromLevelkey(levelkey, segmentNumber) { 149 | let decryptdata = levelkey; 150 | 151 | if (levelkey && levelkey.method && levelkey.uri && !levelkey.iv) { 152 | decryptdata = new LevelKey(); 153 | decryptdata.method = levelkey.method; 154 | decryptdata.baseuri = levelkey.baseuri; 155 | decryptdata.reluri = levelkey.reluri; 156 | decryptdata.iv = this.createInitializationVector(segmentNumber); 157 | } 158 | 159 | return decryptdata; 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /wait-for-it.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Use this script to test if a given TCP host/port are available 3 | 4 | WAITFORIT_cmdname=${0##*/} 5 | 6 | echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } 7 | 8 | usage() 9 | { 10 | cat << USAGE >&2 11 | Usage: 12 | $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] 13 | -h HOST | --host=HOST Host or IP under test 14 | -p PORT | --port=PORT TCP port under test 15 | Alternatively, you specify the host and port as host:port 16 | -s | --strict Only execute subcommand if the test succeeds 17 | -q | --quiet Don't output any status messages 18 | -t TIMEOUT | --timeout=TIMEOUT 19 | Timeout in seconds, zero for no timeout 20 | -- COMMAND ARGS Execute command with args after the test finishes 21 | USAGE 22 | exit 1 23 | } 24 | 25 | wait_for() 26 | { 27 | if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then 28 | echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" 29 | else 30 | echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" 31 | fi 32 | WAITFORIT_start_ts=$(date +%s) 33 | while : 34 | do 35 | if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then 36 | nc -z $WAITFORIT_HOST $WAITFORIT_PORT 37 | WAITFORIT_result=$? 38 | else 39 | (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 40 | WAITFORIT_result=$? 41 | fi 42 | if [[ $WAITFORIT_result -eq 0 ]]; then 43 | WAITFORIT_end_ts=$(date +%s) 44 | echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" 45 | break 46 | fi 47 | sleep 1 48 | done 49 | return $WAITFORIT_result 50 | } 51 | 52 | wait_for_wrapper() 53 | { 54 | # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 55 | if [[ $WAITFORIT_QUIET -eq 1 ]]; then 56 | timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & 57 | else 58 | timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & 59 | fi 60 | WAITFORIT_PID=$! 61 | trap "kill -INT -$WAITFORIT_PID" INT 62 | wait $WAITFORIT_PID 63 | WAITFORIT_RESULT=$? 64 | if [[ $WAITFORIT_RESULT -ne 0 ]]; then 65 | echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" 66 | fi 67 | return $WAITFORIT_RESULT 68 | } 69 | 70 | # process arguments 71 | while [[ $# -gt 0 ]] 72 | do 73 | case "$1" in 74 | *:* ) 75 | WAITFORIT_hostport=(${1//:/ }) 76 | WAITFORIT_HOST=${WAITFORIT_hostport[0]} 77 | WAITFORIT_PORT=${WAITFORIT_hostport[1]} 78 | shift 1 79 | ;; 80 | --child) 81 | WAITFORIT_CHILD=1 82 | shift 1 83 | ;; 84 | -q | --quiet) 85 | WAITFORIT_QUIET=1 86 | shift 1 87 | ;; 88 | -s | --strict) 89 | WAITFORIT_STRICT=1 90 | shift 1 91 | ;; 92 | -h) 93 | WAITFORIT_HOST="$2" 94 | if [[ $WAITFORIT_HOST == "" ]]; then break; fi 95 | shift 2 96 | ;; 97 | --host=*) 98 | WAITFORIT_HOST="${1#*=}" 99 | shift 1 100 | ;; 101 | -p) 102 | WAITFORIT_PORT="$2" 103 | if [[ $WAITFORIT_PORT == "" ]]; then break; fi 104 | shift 2 105 | ;; 106 | --port=*) 107 | WAITFORIT_PORT="${1#*=}" 108 | shift 1 109 | ;; 110 | -t) 111 | WAITFORIT_TIMEOUT="$2" 112 | if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi 113 | shift 2 114 | ;; 115 | --timeout=*) 116 | WAITFORIT_TIMEOUT="${1#*=}" 117 | shift 1 118 | ;; 119 | --) 120 | shift 121 | WAITFORIT_CLI=("$@") 122 | break 123 | ;; 124 | --help) 125 | usage 126 | ;; 127 | *) 128 | echoerr "Unknown argument: $1" 129 | usage 130 | ;; 131 | esac 132 | done 133 | 134 | if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then 135 | echoerr "Error: you need to provide a host and port to test." 136 | usage 137 | fi 138 | 139 | WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} 140 | WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} 141 | WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} 142 | WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} 143 | 144 | # check to see if timeout is from busybox? 145 | WAITFORIT_TIMEOUT_PATH=$(type -p timeout) 146 | WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) 147 | if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then 148 | WAITFORIT_ISBUSY=1 149 | WAITFORIT_BUSYTIMEFLAG="-t" 150 | 151 | else 152 | WAITFORIT_ISBUSY=0 153 | WAITFORIT_BUSYTIMEFLAG="" 154 | fi 155 | 156 | if [[ $WAITFORIT_CHILD -gt 0 ]]; then 157 | wait_for 158 | WAITFORIT_RESULT=$? 159 | exit $WAITFORIT_RESULT 160 | else 161 | if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then 162 | wait_for_wrapper 163 | WAITFORIT_RESULT=$? 164 | else 165 | wait_for 166 | WAITFORIT_RESULT=$? 167 | fi 168 | fi 169 | 170 | if [[ $WAITFORIT_CLI != "" ]]; then 171 | if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then 172 | echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" 173 | exit $WAITFORIT_RESULT 174 | fi 175 | exec "${WAITFORIT_CLI[@]}" 176 | else 177 | exit $WAITFORIT_RESULT 178 | fi 179 | -------------------------------------------------------------------------------- /src/hls/m3u8-parser.ts: -------------------------------------------------------------------------------- 1 | import * as URLToolkit from 'url-toolkit'; 2 | 3 | import Fragment from './fragment'; 4 | import Level from './level'; 5 | import LevelKey from './level-key'; 6 | 7 | import AttrList from './attr-list'; 8 | // import { logger } from '../utils/logger'; 9 | import { isCodecType } from './codecs'; 10 | 11 | /** 12 | * M3U8 parser 13 | * @module 14 | */ 15 | 16 | // https://regex101.com is your friend 17 | const MASTER_PLAYLIST_REGEX = /#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g; 18 | const MASTER_PLAYLIST_MEDIA_REGEX = /#EXT-X-MEDIA:(.*)/g; 19 | 20 | const LEVEL_PLAYLIST_REGEX_FAST = new RegExp([ 21 | /#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source, // duration (#EXTINF:,), group 1 => duration, group 2 => title 22 | /|(?!#)([\S+ ?]+)/.source, // segment URI, group 3 => the URI (note newline is not eaten) 23 | /|#EXT-X-BYTERANGE:*(.+)/.source, // next segment's byterange, group 4 => range spec (x@y) 24 | /|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source, // next segment's program date/time group 5 => the datetime spec 25 | /|#.*/.source, // All other non-segment oriented tags will match with all groups empty 26 | ].join(''), 'g'); 27 | 28 | const LEVEL_PLAYLIST_REGEX_SLOW = /(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/; 29 | 30 | const MP4_REGEX_SUFFIX = /\.(mp4|m4s|m4v|m4a)$/i; 31 | 32 | export default class M3U8Parser { 33 | public static findGroup(groups, mediaGroupId) { 34 | if (!groups) { 35 | return null; 36 | } 37 | 38 | let matchingGroup = null; 39 | 40 | for (let i = 0; i < groups.length; i++) { 41 | const group = groups[i]; 42 | if (group.id === mediaGroupId) { 43 | matchingGroup = group; 44 | } 45 | } 46 | 47 | return matchingGroup; 48 | } 49 | 50 | public pulic; public static convertAVC1ToAVCOTI(codec) { 51 | let result, avcdata = codec.split('.'); 52 | if (avcdata.length > 2) { 53 | result = avcdata.shift() + '.'; 54 | result += parseInt(avcdata.shift(), 10).toString(16); 55 | result += ('000' + parseInt(avcdata.shift(), 10).toString(16)).substr(-4); 56 | } else { 57 | result = codec; 58 | } 59 | return result; 60 | } 61 | 62 | public static resolve(url, baseUrl) { 63 | return URLToolkit.buildAbsoluteURL(baseUrl, url, { alwaysNormalize: true }); 64 | } 65 | 66 | public static parseMasterPlaylist(string, baseurl) { 67 | let levels = [], result; 68 | MASTER_PLAYLIST_REGEX.lastIndex = 0; 69 | 70 | function setCodecs(codecs, level) { 71 | ['video', 'audio'].forEach((type) => { 72 | const filtered = codecs.filter((codec) => isCodecType(codec, type)); 73 | if (filtered.length) { 74 | const preferred = filtered.filter((codec) => { 75 | return codec.lastIndexOf('avc1', 0) === 0 || codec.lastIndexOf('mp4a', 0) === 0; 76 | }); 77 | level[`${type}Codec`] = preferred.length > 0 ? preferred[0] : filtered[0]; 78 | 79 | // remove from list 80 | codecs = codecs.filter((codec) => filtered.indexOf(codec) === -1); 81 | } 82 | }); 83 | 84 | level.unknownCodecs = codecs; 85 | } 86 | 87 | while ((result = MASTER_PLAYLIST_REGEX.exec(string)) != null) { 88 | const level = {} as any; 89 | 90 | const attrs = level.attrs = new AttrList(result[1]) as any; 91 | level.url = M3U8Parser.resolve(result[2], baseurl); 92 | 93 | const resolution = attrs.decimalResolution('RESOLUTION'); 94 | if (resolution) { 95 | level.width = resolution.width; 96 | level.height = resolution.height; 97 | } 98 | level.bitrate = attrs.decimalInteger('AVERAGE-BANDWIDTH') || attrs.decimalInteger('BANDWIDTH'); 99 | level.name = attrs.NAME; 100 | 101 | setCodecs([].concat((attrs.CODECS || '').split(/[ ,]+/)), level); 102 | 103 | if (level.videoCodec && level.videoCodec.indexOf('avc1') !== -1) { 104 | level.videoCodec = M3U8Parser.convertAVC1ToAVCOTI(level.videoCodec); 105 | } 106 | 107 | levels.push(level); 108 | } 109 | return levels; 110 | } 111 | 112 | public static parseMasterPlaylistMedia(string, baseurl, type, audioGroups = []) { 113 | let result; 114 | const medias = []; 115 | let id = 0; 116 | MASTER_PLAYLIST_MEDIA_REGEX.lastIndex = 0; 117 | while ((result = MASTER_PLAYLIST_MEDIA_REGEX.exec(string)) !== null) { 118 | const media = {} as any; 119 | const attrs = new AttrList(result[1]) as any; 120 | if (attrs.TYPE === type) { 121 | media.groupId = attrs['GROUP-ID']; 122 | media.name = attrs.NAME; 123 | media.type = type; 124 | media.default = (attrs.DEFAULT === 'YES'); 125 | media.autoselect = (attrs.AUTOSELECT === 'YES'); 126 | media.forced = (attrs.FORCED === 'YES'); 127 | if (attrs.URI) { 128 | media.url = M3U8Parser.resolve(attrs.URI, baseurl); 129 | } 130 | 131 | media.lang = attrs.LANGUAGE; 132 | if (!media.name) { 133 | media.name = media.lang; 134 | } 135 | 136 | if (audioGroups.length) { 137 | const groupCodec = M3U8Parser.findGroup(audioGroups, media.groupId); 138 | media.audioCodec = groupCodec ? groupCodec.codec : audioGroups[0].codec; 139 | } 140 | media.id = id++; 141 | medias.push(media); 142 | } 143 | } 144 | return medias; 145 | } 146 | 147 | public static parseLevelPlaylist(string, baseurl, id, type, levelUrlId) { 148 | let currentSN = 0; 149 | let totalduration = 0; 150 | const level = new Level(baseurl); 151 | let levelkey = new LevelKey(); 152 | let cc = 0; 153 | let prevFrag = null; 154 | let frag = new Fragment(); 155 | let result; 156 | let i; 157 | 158 | let firstPdtIndex = null; 159 | 160 | LEVEL_PLAYLIST_REGEX_FAST.lastIndex = 0; 161 | 162 | while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) { 163 | const duration = result[1]; 164 | if (duration) { // INF 165 | frag.duration = parseFloat(duration); 166 | // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 167 | const title = (' ' + result[2]).slice(1); 168 | frag.title = title || null; 169 | frag.tagList.push(title ? [ 'INF', duration + '', title ] : [ 'INF', duration + '' ]); 170 | } else if (result[3]) { // url 171 | if (Number.isFinite(frag.duration)) { 172 | const sn = currentSN++; 173 | frag.type = type; 174 | frag.start = totalduration; 175 | frag.levelkey = levelkey; 176 | frag.sn = sn; 177 | frag.level = id; 178 | frag.cc = cc; 179 | frag.urlId = levelUrlId; 180 | frag.baseurl = baseurl; 181 | // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 182 | frag.relurl = (' ' + result[3]).slice(1); 183 | assignProgramDateTime(frag, prevFrag); 184 | 185 | level.fragments.push(frag); 186 | prevFrag = frag; 187 | totalduration += frag.duration; 188 | 189 | frag = new Fragment(); 190 | } 191 | } else if (result[4]) { // X-BYTERANGE 192 | frag.rawByteRange = (' ' + result[4]).slice(1); 193 | if (prevFrag) { 194 | const lastByteRangeEndOffset = prevFrag.byteRangeEndOffset; 195 | if (lastByteRangeEndOffset) { 196 | frag.lastByteRangeEndOffset = lastByteRangeEndOffset; 197 | } 198 | } 199 | } else if (result[5]) { // PROGRAM-DATE-TIME 200 | // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 201 | frag.rawProgramDateTime = (' ' + result[5]).slice(1); 202 | frag.tagList.push(['PROGRAM-DATE-TIME', frag.rawProgramDateTime]); 203 | if (firstPdtIndex === null) { 204 | firstPdtIndex = level.fragments.length; 205 | } 206 | } else { 207 | result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW); 208 | for (i = 1; i < result.length; i++) { 209 | if (result[i] !== undefined) { 210 | break; 211 | } 212 | } 213 | 214 | // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 215 | const value1 = (' ' + result[i + 1]).slice(1); 216 | const value2 = (' ' + result[i + 2]).slice(1); 217 | 218 | switch (result[i]) { 219 | case '#': 220 | frag.tagList.push(value2 ? [ value1, value2 ] : [ value1 ]); 221 | break; 222 | case 'PLAYLIST-TYPE': 223 | level.type = value1.toUpperCase(); 224 | break; 225 | case 'MEDIA-SEQUENCE': 226 | currentSN = level.startSN = parseInt(value1, 10); 227 | break; 228 | case 'TARGETDURATION': 229 | level.targetduration = parseFloat(value1); 230 | break; 231 | case 'VERSION': 232 | level.version = parseInt(value1, 10); 233 | break; 234 | case 'EXTM3U': 235 | break; 236 | case 'ENDLIST': 237 | level.live = false; 238 | break; 239 | case 'DIS': 240 | cc++; 241 | frag.tagList.push(['DIS']); 242 | break; 243 | case 'DISCONTINUITY-SEQ': 244 | cc = parseInt(value1, 10); 245 | break; 246 | case 'KEY': 247 | // https://tools.ietf.org/html/draft-pantos-http-live-streaming-08#section-3.4.4 248 | const keyAttrs = new AttrList(value1) as any; 249 | const decryptmethod = keyAttrs.enumeratedString('METHOD'); 250 | const decrypturi = keyAttrs.URI; 251 | const decryptiv = keyAttrs.hexadecimalInteger('IV'); 252 | if (decryptmethod) { 253 | levelkey = new LevelKey(); 254 | if ((decrypturi) && (['AES-128', 'SAMPLE-AES', 'SAMPLE-AES-CENC'].indexOf(decryptmethod) >= 0)) { 255 | levelkey.method = decryptmethod; 256 | // URI to get the key 257 | levelkey.baseuri = baseurl; 258 | levelkey.reluri = decrypturi; 259 | levelkey.key = null; 260 | // Initialization Vector (IV) 261 | levelkey.iv = decryptiv; 262 | } 263 | } 264 | break; 265 | case 'START': 266 | const startParams = value1; 267 | const startAttrs = new AttrList(startParams); 268 | const startTimeOffset = startAttrs.decimalFloatingPoint('TIME-OFFSET'); 269 | // TIME-OFFSET can be 0 270 | if (Number.isFinite(startTimeOffset)) { 271 | level.startTimeOffset = startTimeOffset; 272 | } 273 | 274 | break; 275 | case 'MAP': 276 | const mapAttrs = new AttrList(value1) as any; 277 | frag.relurl = mapAttrs.URI; 278 | frag.rawByteRange = mapAttrs.BYTERANGE; 279 | frag.baseurl = baseurl; 280 | frag.level = id; 281 | frag.type = type; 282 | frag.sn = 'initSegment'; 283 | level.initSegment = frag; 284 | frag = new Fragment(); 285 | frag.rawProgramDateTime = level.initSegment.rawProgramDateTime; 286 | break; 287 | default: 288 | // logger.warn(`line parsed but not handled: ${result}`); 289 | break; 290 | } 291 | } 292 | } 293 | frag = prevFrag; 294 | // logger.log('found ' + level.fragments.length + ' fragments'); 295 | if (frag && !frag.relurl) { 296 | level.fragments.pop(); 297 | totalduration -= frag.duration; 298 | } 299 | level.totalduration = totalduration; 300 | level.averagetargetduration = totalduration / level.fragments.length; 301 | level.endSN = currentSN - 1; 302 | level.startCC = level.fragments[0] ? level.fragments[0].cc : 0; 303 | level.endCC = cc; 304 | 305 | if (!level.initSegment && level.fragments.length) { 306 | // this is a bit lurky but HLS really has no other way to tell us 307 | // if the fragments are TS or MP4, except if we download them :/ 308 | // but this is to be able to handle SIDX. 309 | if (level.fragments.every((frag) => MP4_REGEX_SUFFIX.test(frag.relurl))) { 310 | // logger.warn('MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX'); 311 | 312 | frag = new Fragment(); 313 | frag.relurl = level.fragments[0].relurl; 314 | frag.baseurl = baseurl; 315 | frag.level = id; 316 | frag.type = type; 317 | frag.sn = 'initSegment'; 318 | 319 | level.initSegment = frag; 320 | level.needSidxRanges = true; 321 | } 322 | } 323 | 324 | /** 325 | * Backfill any missing PDT values 326 | "If the first EXT-X-PROGRAM-DATE-TIME tag in a Playlist appears after 327 | one or more Media Segment URIs, the client SHOULD extrapolate 328 | backward from that tag (using EXTINF durations and/or media 329 | timestamps) to associate dates with those segments." 330 | * We have already extrapolated forward, but all fragments up to the first instance of PDT do not have their PDTs 331 | * computed. 332 | */ 333 | if (firstPdtIndex) { 334 | backfillProgramDateTimes(level.fragments, firstPdtIndex); 335 | } 336 | 337 | return level; 338 | } 339 | } 340 | 341 | function backfillProgramDateTimes(fragments, startIndex) { 342 | let fragPrev = fragments[startIndex]; 343 | for (let i = startIndex - 1; i >= 0; i--) { 344 | const frag = fragments[i]; 345 | frag.programDateTime = fragPrev.programDateTime - (frag.duration * 1000); 346 | fragPrev = frag; 347 | } 348 | } 349 | 350 | function assignProgramDateTime(frag, prevFrag) { 351 | if (frag.rawProgramDateTime) { 352 | frag.programDateTime = Date.parse(frag.rawProgramDateTime); 353 | } else if (prevFrag && prevFrag.programDateTime) { 354 | frag.programDateTime = prevFrag.endProgramDateTime; 355 | } 356 | 357 | if (!Number.isFinite(frag.programDateTime)) { 358 | frag.programDateTime = null; 359 | frag.rawProgramDateTime = null; 360 | } 361 | } 362 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/body-parser@*": 6 | version "1.17.0" 7 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 8 | integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== 9 | dependencies: 10 | "@types/connect" "*" 11 | "@types/node" "*" 12 | 13 | "@types/bson@*": 14 | version "1.0.11" 15 | resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.11.tgz#c95ad69bb0b3f5c33b4bb6cc86d86cafb273335c" 16 | integrity sha512-j+UcCWI+FsbI5/FQP/Kj2CXyplWAz39ktHFkXk84h7dNblKRSoNJs95PZFRd96NQGqsPEPgeclqnznWZr14ZDA== 17 | dependencies: 18 | "@types/node" "*" 19 | 20 | "@types/caseless@*": 21 | version "0.12.1" 22 | resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" 23 | integrity sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A== 24 | 25 | "@types/chart.js@^2.7.41": 26 | version "2.7.41" 27 | resolved "https://registry.yarnpkg.com/@types/chart.js/-/chart.js-2.7.41.tgz#3e59d82fbfd536dfec8c092bfbf218cac567ab2e" 28 | integrity sha512-AkxGv6oqAfd93sv2B2uAOm6z/elj/O62p8WZCPr9EStr85ykcw7bETVMaK0+4XLuHhGui7Fdm+tfQk0EatRFKA== 29 | 30 | "@types/connect@*": 31 | version "3.4.32" 32 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 33 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 34 | dependencies: 35 | "@types/node" "*" 36 | 37 | "@types/events@*": 38 | version "1.2.0" 39 | resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" 40 | integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== 41 | 42 | "@types/express-serve-static-core@*": 43 | version "4.16.0" 44 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" 45 | integrity sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w== 46 | dependencies: 47 | "@types/events" "*" 48 | "@types/node" "*" 49 | "@types/range-parser" "*" 50 | 51 | "@types/express@^4.16.0": 52 | version "4.16.0" 53 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" 54 | integrity sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w== 55 | dependencies: 56 | "@types/body-parser" "*" 57 | "@types/express-serve-static-core" "*" 58 | "@types/serve-static" "*" 59 | 60 | "@types/form-data@*": 61 | version "2.2.1" 62 | resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" 63 | integrity sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ== 64 | dependencies: 65 | "@types/node" "*" 66 | 67 | "@types/mime@*": 68 | version "2.0.0" 69 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" 70 | integrity sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA== 71 | 72 | "@types/mongodb@^3.1.17": 73 | version "3.1.17" 74 | resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.1.17.tgz#11351b147b68e7674cff9055ea82072521bc6fe3" 75 | integrity sha512-u6tSIpfdsgK74aE0TuyqZYhHscw+gHs6dQNSsFUTFXubhhxCqovmV3nJRS0YKSw0sfqbzUgGzbG5+yorUPRnFg== 76 | dependencies: 77 | "@types/bson" "*" 78 | "@types/node" "*" 79 | 80 | "@types/node@*": 81 | version "10.12.15" 82 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz#20e85651b62fd86656e57c9c9bc771ab1570bc59" 83 | integrity sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA== 84 | 85 | "@types/range-parser@*": 86 | version "1.2.3" 87 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 88 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 89 | 90 | "@types/redis@*", "@types/redis@^2.8.0": 91 | version "2.8.9" 92 | resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.9.tgz#3addfdbd81cc773c2446e34225c0911c43b960fc" 93 | integrity sha512-pmKQsTy/g37+XOFrunNXGn9nDjcXpOkaL0Xm6T4eEfZOED09A9AQuJvLiSQwNeeQ7pPL42MBOrTy/4+6p9MqvA== 94 | dependencies: 95 | "@types/node" "*" 96 | 97 | "@types/request-promise-native@^1.0.15": 98 | version "1.0.15" 99 | resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.15.tgz#5b3369fc6aaf9e7fef7b6b688aef4c5759623e16" 100 | integrity sha512-uYPjTChD9TpjlvbBjNpZfNc64TBejBS52u7pbxhQLnlxw+5Em7wLb6DU2wdJVhJ2Mou7v50N0qgL4Gia5mmRYg== 101 | dependencies: 102 | "@types/request" "*" 103 | 104 | "@types/request@*": 105 | version "2.48.1" 106 | resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.1.tgz#e402d691aa6670fbbff1957b15f1270230ab42fa" 107 | integrity sha512-ZgEZ1TiD+KGA9LiAAPPJL68Id2UWfeSO62ijSXZjFJArVV+2pKcsVHmrcu+1oiE3q6eDGiFiSolRc4JHoerBBg== 108 | dependencies: 109 | "@types/caseless" "*" 110 | "@types/form-data" "*" 111 | "@types/node" "*" 112 | "@types/tough-cookie" "*" 113 | 114 | "@types/rsmq@^0.3.27": 115 | version "0.3.27" 116 | resolved "https://registry.yarnpkg.com/@types/rsmq/-/rsmq-0.3.27.tgz#a063c5663482ab015837013a0ed0057badb7b35c" 117 | integrity sha1-oGPFZjSCqwFYNwE6DtAFe623s1w= 118 | dependencies: 119 | "@types/redis" "*" 120 | 121 | "@types/serve-static@*": 122 | version "1.13.2" 123 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 124 | integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== 125 | dependencies: 126 | "@types/express-serve-static-core" "*" 127 | "@types/mime" "*" 128 | 129 | "@types/tough-cookie@*": 130 | version "2.3.4" 131 | resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.4.tgz#821878b81bfab971b93a265a561d54ea61f9059f" 132 | integrity sha512-Set5ZdrAaKI/qHdFlVMgm/GsAv/wkXhSTuZFkJ+JI7HK+wIkIlOaUXSXieIvJ0+OvGIqtREFoE+NHJtEq0gtEw== 133 | 134 | abbrev@1: 135 | version "1.1.1" 136 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 137 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 138 | 139 | accepts@~1.3.5: 140 | version "1.3.5" 141 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 142 | integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= 143 | dependencies: 144 | mime-types "~2.1.18" 145 | negotiator "0.6.1" 146 | 147 | ajv@^6.5.5: 148 | version "6.6.2" 149 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" 150 | integrity sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g== 151 | dependencies: 152 | fast-deep-equal "^2.0.1" 153 | fast-json-stable-stringify "^2.0.0" 154 | json-schema-traverse "^0.4.1" 155 | uri-js "^4.2.2" 156 | 157 | ansi-align@^2.0.0: 158 | version "2.0.0" 159 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 160 | integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= 161 | dependencies: 162 | string-width "^2.0.0" 163 | 164 | ansi-regex@^2.0.0: 165 | version "2.1.1" 166 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 167 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 168 | 169 | ansi-regex@^3.0.0: 170 | version "3.0.0" 171 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 172 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 173 | 174 | ansi-styles@^2.2.1: 175 | version "2.2.1" 176 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 177 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 178 | 179 | ansi-styles@^3.2.1: 180 | version "3.2.1" 181 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 182 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 183 | dependencies: 184 | color-convert "^1.9.0" 185 | 186 | anymatch@^2.0.0: 187 | version "2.0.0" 188 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 189 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 190 | dependencies: 191 | micromatch "^3.1.4" 192 | normalize-path "^2.1.1" 193 | 194 | aproba@^1.0.3: 195 | version "1.2.0" 196 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 197 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 198 | 199 | are-we-there-yet@~1.1.2: 200 | version "1.1.5" 201 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 202 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 203 | dependencies: 204 | delegates "^1.0.0" 205 | readable-stream "^2.0.6" 206 | 207 | argparse@^1.0.7: 208 | version "1.0.10" 209 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 210 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 211 | dependencies: 212 | sprintf-js "~1.0.2" 213 | 214 | arr-diff@^4.0.0: 215 | version "4.0.0" 216 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 217 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 218 | 219 | arr-flatten@^1.1.0: 220 | version "1.1.0" 221 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 222 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 223 | 224 | arr-union@^3.1.0: 225 | version "3.1.0" 226 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 227 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 228 | 229 | array-flatten@1.1.1: 230 | version "1.1.1" 231 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 232 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 233 | 234 | array-unique@^0.3.2: 235 | version "0.3.2" 236 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 237 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 238 | 239 | arrify@^1.0.0: 240 | version "1.0.1" 241 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 242 | integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 243 | 244 | asn1@~0.2.3: 245 | version "0.2.4" 246 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 247 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 248 | dependencies: 249 | safer-buffer "~2.1.0" 250 | 251 | assert-plus@1.0.0, assert-plus@^1.0.0: 252 | version "1.0.0" 253 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 254 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 255 | 256 | assign-symbols@^1.0.0: 257 | version "1.0.0" 258 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 259 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 260 | 261 | async-each@^1.0.0: 262 | version "1.0.1" 263 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 264 | integrity sha1-GdOGodntxufByF04iu28xW0zYC0= 265 | 266 | asynckit@^0.4.0: 267 | version "0.4.0" 268 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 269 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 270 | 271 | atob@^2.1.1: 272 | version "2.1.2" 273 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 274 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 275 | 276 | aws-sign2@~0.7.0: 277 | version "0.7.0" 278 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 279 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 280 | 281 | aws4@^1.8.0: 282 | version "1.8.0" 283 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 284 | integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 285 | 286 | babel-code-frame@^6.22.0: 287 | version "6.26.0" 288 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 289 | integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= 290 | dependencies: 291 | chalk "^1.1.3" 292 | esutils "^2.0.2" 293 | js-tokens "^3.0.2" 294 | 295 | balanced-match@^1.0.0: 296 | version "1.0.0" 297 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 298 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 299 | 300 | base@^0.11.1: 301 | version "0.11.2" 302 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 303 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 304 | dependencies: 305 | cache-base "^1.0.1" 306 | class-utils "^0.3.5" 307 | component-emitter "^1.2.1" 308 | define-property "^1.0.0" 309 | isobject "^3.0.1" 310 | mixin-deep "^1.2.0" 311 | pascalcase "^0.1.1" 312 | 313 | bcrypt-pbkdf@^1.0.0: 314 | version "1.0.2" 315 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 316 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 317 | dependencies: 318 | tweetnacl "^0.14.3" 319 | 320 | binary-extensions@^1.0.0: 321 | version "1.12.0" 322 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" 323 | integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== 324 | 325 | body-parser@1.18.3: 326 | version "1.18.3" 327 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 328 | integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= 329 | dependencies: 330 | bytes "3.0.0" 331 | content-type "~1.0.4" 332 | debug "2.6.9" 333 | depd "~1.1.2" 334 | http-errors "~1.6.3" 335 | iconv-lite "0.4.23" 336 | on-finished "~2.3.0" 337 | qs "6.5.2" 338 | raw-body "2.3.3" 339 | type-is "~1.6.16" 340 | 341 | boxen@^1.2.1: 342 | version "1.3.0" 343 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" 344 | integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== 345 | dependencies: 346 | ansi-align "^2.0.0" 347 | camelcase "^4.0.0" 348 | chalk "^2.0.1" 349 | cli-boxes "^1.0.0" 350 | string-width "^2.0.0" 351 | term-size "^1.2.0" 352 | widest-line "^2.0.0" 353 | 354 | brace-expansion@^1.1.7: 355 | version "1.1.11" 356 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 357 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 358 | dependencies: 359 | balanced-match "^1.0.0" 360 | concat-map "0.0.1" 361 | 362 | braces@^2.3.0, braces@^2.3.1: 363 | version "2.3.2" 364 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 365 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 366 | dependencies: 367 | arr-flatten "^1.1.0" 368 | array-unique "^0.3.2" 369 | extend-shallow "^2.0.1" 370 | fill-range "^4.0.0" 371 | isobject "^3.0.1" 372 | repeat-element "^1.1.2" 373 | snapdragon "^0.8.1" 374 | snapdragon-node "^2.0.1" 375 | split-string "^3.0.2" 376 | to-regex "^3.0.1" 377 | 378 | bson@^1.1.0: 379 | version "1.1.0" 380 | resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.0.tgz#bee57d1fb6a87713471af4e32bcae36de814b5b0" 381 | integrity sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA== 382 | 383 | buffer-from@^1.0.0, buffer-from@^1.1.0: 384 | version "1.1.1" 385 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 386 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 387 | 388 | builtin-modules@^1.1.1: 389 | version "1.1.1" 390 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 391 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 392 | 393 | bytes@3.0.0: 394 | version "3.0.0" 395 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 396 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 397 | 398 | cache-base@^1.0.1: 399 | version "1.0.1" 400 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 401 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 402 | dependencies: 403 | collection-visit "^1.0.0" 404 | component-emitter "^1.2.1" 405 | get-value "^2.0.6" 406 | has-value "^1.0.0" 407 | isobject "^3.0.1" 408 | set-value "^2.0.0" 409 | to-object-path "^0.3.0" 410 | union-value "^1.0.0" 411 | unset-value "^1.0.0" 412 | 413 | camelcase@^4.0.0: 414 | version "4.1.0" 415 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 416 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 417 | 418 | capture-stack-trace@^1.0.0: 419 | version "1.0.1" 420 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" 421 | integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== 422 | 423 | caseless@~0.12.0: 424 | version "0.12.0" 425 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 426 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 427 | 428 | chalk@^1.1.3: 429 | version "1.1.3" 430 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 431 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 432 | dependencies: 433 | ansi-styles "^2.2.1" 434 | escape-string-regexp "^1.0.2" 435 | has-ansi "^2.0.0" 436 | strip-ansi "^3.0.0" 437 | supports-color "^2.0.0" 438 | 439 | chalk@^2.0.1, chalk@^2.3.0: 440 | version "2.4.1" 441 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 442 | integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== 443 | dependencies: 444 | ansi-styles "^3.2.1" 445 | escape-string-regexp "^1.0.5" 446 | supports-color "^5.3.0" 447 | 448 | chart.js@^2.7.3: 449 | version "2.7.3" 450 | resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.7.3.tgz#cdb61618830bf216dc887e2f7b1b3c228b73c57e" 451 | integrity sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g== 452 | dependencies: 453 | chartjs-color "^2.1.0" 454 | moment "^2.10.2" 455 | 456 | chartjs-color-string@^0.5.0: 457 | version "0.5.0" 458 | resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz#8d3752d8581d86687c35bfe2cb80ac5213ceb8c1" 459 | integrity sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ== 460 | dependencies: 461 | color-name "^1.0.0" 462 | 463 | chartjs-color@^2.1.0: 464 | version "2.2.0" 465 | resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.2.0.tgz#84a2fb755787ed85c39dd6dd8c7b1d88429baeae" 466 | integrity sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4= 467 | dependencies: 468 | chartjs-color-string "^0.5.0" 469 | color-convert "^0.5.3" 470 | 471 | chokidar@^2.0.4: 472 | version "2.0.4" 473 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" 474 | integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== 475 | dependencies: 476 | anymatch "^2.0.0" 477 | async-each "^1.0.0" 478 | braces "^2.3.0" 479 | glob-parent "^3.1.0" 480 | inherits "^2.0.1" 481 | is-binary-path "^1.0.0" 482 | is-glob "^4.0.0" 483 | lodash.debounce "^4.0.8" 484 | normalize-path "^2.1.1" 485 | path-is-absolute "^1.0.0" 486 | readdirp "^2.0.0" 487 | upath "^1.0.5" 488 | optionalDependencies: 489 | fsevents "^1.2.2" 490 | 491 | chownr@^1.1.1: 492 | version "1.1.1" 493 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 494 | integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== 495 | 496 | ci-info@^1.5.0: 497 | version "1.6.0" 498 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" 499 | integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== 500 | 501 | class-utils@^0.3.5: 502 | version "0.3.6" 503 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 504 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 505 | dependencies: 506 | arr-union "^3.1.0" 507 | define-property "^0.2.5" 508 | isobject "^3.0.0" 509 | static-extend "^0.1.1" 510 | 511 | cli-boxes@^1.0.0: 512 | version "1.0.0" 513 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 514 | integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= 515 | 516 | code-point-at@^1.0.0: 517 | version "1.1.0" 518 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 519 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 520 | 521 | collection-visit@^1.0.0: 522 | version "1.0.0" 523 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 524 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 525 | dependencies: 526 | map-visit "^1.0.0" 527 | object-visit "^1.0.0" 528 | 529 | color-convert@^0.5.3: 530 | version "0.5.3" 531 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" 532 | integrity sha1-vbbGnOZg+t/+CwAHzER+G59ygr0= 533 | 534 | color-convert@^1.9.0: 535 | version "1.9.3" 536 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 537 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 538 | dependencies: 539 | color-name "1.1.3" 540 | 541 | color-name@1.1.3: 542 | version "1.1.3" 543 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 544 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 545 | 546 | color-name@^1.0.0: 547 | version "1.1.4" 548 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 549 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 550 | 551 | combined-stream@^1.0.6, combined-stream@~1.0.6: 552 | version "1.0.7" 553 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 554 | integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== 555 | dependencies: 556 | delayed-stream "~1.0.0" 557 | 558 | commander@^2.12.1: 559 | version "2.19.0" 560 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 561 | integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== 562 | 563 | component-emitter@^1.2.1: 564 | version "1.2.1" 565 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 566 | integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= 567 | 568 | concat-map@0.0.1: 569 | version "0.0.1" 570 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 571 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 572 | 573 | configstore@^3.0.0: 574 | version "3.1.2" 575 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" 576 | integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== 577 | dependencies: 578 | dot-prop "^4.1.0" 579 | graceful-fs "^4.1.2" 580 | make-dir "^1.0.0" 581 | unique-string "^1.0.0" 582 | write-file-atomic "^2.0.0" 583 | xdg-basedir "^3.0.0" 584 | 585 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 586 | version "1.1.0" 587 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 588 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 589 | 590 | content-disposition@0.5.2: 591 | version "0.5.2" 592 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 593 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 594 | 595 | content-type@~1.0.4: 596 | version "1.0.4" 597 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 598 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 599 | 600 | cookie-signature@1.0.6: 601 | version "1.0.6" 602 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 603 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 604 | 605 | cookie@0.3.1: 606 | version "0.3.1" 607 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 608 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 609 | 610 | copy-descriptor@^0.1.0: 611 | version "0.1.1" 612 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 613 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 614 | 615 | core-util-is@1.0.2, core-util-is@~1.0.0: 616 | version "1.0.2" 617 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 618 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 619 | 620 | create-error-class@^3.0.0: 621 | version "3.0.2" 622 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 623 | integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= 624 | dependencies: 625 | capture-stack-trace "^1.0.0" 626 | 627 | cross-spawn@^5.0.1: 628 | version "5.1.0" 629 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 630 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 631 | dependencies: 632 | lru-cache "^4.0.1" 633 | shebang-command "^1.2.0" 634 | which "^1.2.9" 635 | 636 | crypto-random-string@^1.0.0: 637 | version "1.0.0" 638 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 639 | integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= 640 | 641 | dashdash@^1.12.0: 642 | version "1.14.1" 643 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 644 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 645 | dependencies: 646 | assert-plus "^1.0.0" 647 | 648 | debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: 649 | version "2.6.9" 650 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 651 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 652 | dependencies: 653 | ms "2.0.0" 654 | 655 | debug@^3.1.0: 656 | version "3.2.6" 657 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 658 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 659 | dependencies: 660 | ms "^2.1.1" 661 | 662 | decode-uri-component@^0.2.0: 663 | version "0.2.0" 664 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 665 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 666 | 667 | deep-extend@^0.6.0: 668 | version "0.6.0" 669 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 670 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 671 | 672 | define-property@^0.2.5: 673 | version "0.2.5" 674 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 675 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 676 | dependencies: 677 | is-descriptor "^0.1.0" 678 | 679 | define-property@^1.0.0: 680 | version "1.0.0" 681 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 682 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 683 | dependencies: 684 | is-descriptor "^1.0.0" 685 | 686 | define-property@^2.0.2: 687 | version "2.0.2" 688 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 689 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 690 | dependencies: 691 | is-descriptor "^1.0.2" 692 | isobject "^3.0.1" 693 | 694 | delayed-stream@~1.0.0: 695 | version "1.0.0" 696 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 697 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 698 | 699 | delegates@^1.0.0: 700 | version "1.0.0" 701 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 702 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 703 | 704 | depd@~1.1.2: 705 | version "1.1.2" 706 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 707 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 708 | 709 | destroy@~1.0.4: 710 | version "1.0.4" 711 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 712 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 713 | 714 | detect-libc@^1.0.2: 715 | version "1.0.3" 716 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 717 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 718 | 719 | diff@^3.1.0, diff@^3.2.0: 720 | version "3.5.0" 721 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 722 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 723 | 724 | dot-prop@^4.1.0: 725 | version "4.2.0" 726 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 727 | integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== 728 | dependencies: 729 | is-obj "^1.0.0" 730 | 731 | double-ended-queue@^2.1.0-0: 732 | version "2.1.0-0" 733 | resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" 734 | integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= 735 | 736 | duplexer3@^0.1.4: 737 | version "0.1.4" 738 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 739 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 740 | 741 | ecc-jsbn@~0.1.1: 742 | version "0.1.2" 743 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 744 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 745 | dependencies: 746 | jsbn "~0.1.0" 747 | safer-buffer "^2.1.0" 748 | 749 | ee-first@1.1.1: 750 | version "1.1.1" 751 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 752 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 753 | 754 | encodeurl@~1.0.2: 755 | version "1.0.2" 756 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 757 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 758 | 759 | escape-html@~1.0.3: 760 | version "1.0.3" 761 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 762 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 763 | 764 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 765 | version "1.0.5" 766 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 767 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 768 | 769 | esprima@^4.0.0: 770 | version "4.0.1" 771 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 772 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 773 | 774 | esutils@^2.0.2: 775 | version "2.0.2" 776 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 777 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 778 | 779 | etag@~1.8.1: 780 | version "1.8.1" 781 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 782 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 783 | 784 | execa@^0.7.0: 785 | version "0.7.0" 786 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 787 | integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 788 | dependencies: 789 | cross-spawn "^5.0.1" 790 | get-stream "^3.0.0" 791 | is-stream "^1.1.0" 792 | npm-run-path "^2.0.0" 793 | p-finally "^1.0.0" 794 | signal-exit "^3.0.0" 795 | strip-eof "^1.0.0" 796 | 797 | expand-brackets@^2.1.4: 798 | version "2.1.4" 799 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 800 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 801 | dependencies: 802 | debug "^2.3.3" 803 | define-property "^0.2.5" 804 | extend-shallow "^2.0.1" 805 | posix-character-classes "^0.1.0" 806 | regex-not "^1.0.0" 807 | snapdragon "^0.8.1" 808 | to-regex "^3.0.1" 809 | 810 | express@^4.16.4: 811 | version "4.16.4" 812 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" 813 | integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== 814 | dependencies: 815 | accepts "~1.3.5" 816 | array-flatten "1.1.1" 817 | body-parser "1.18.3" 818 | content-disposition "0.5.2" 819 | content-type "~1.0.4" 820 | cookie "0.3.1" 821 | cookie-signature "1.0.6" 822 | debug "2.6.9" 823 | depd "~1.1.2" 824 | encodeurl "~1.0.2" 825 | escape-html "~1.0.3" 826 | etag "~1.8.1" 827 | finalhandler "1.1.1" 828 | fresh "0.5.2" 829 | merge-descriptors "1.0.1" 830 | methods "~1.1.2" 831 | on-finished "~2.3.0" 832 | parseurl "~1.3.2" 833 | path-to-regexp "0.1.7" 834 | proxy-addr "~2.0.4" 835 | qs "6.5.2" 836 | range-parser "~1.2.0" 837 | safe-buffer "5.1.2" 838 | send "0.16.2" 839 | serve-static "1.13.2" 840 | setprototypeof "1.1.0" 841 | statuses "~1.4.0" 842 | type-is "~1.6.16" 843 | utils-merge "1.0.1" 844 | vary "~1.1.2" 845 | 846 | extend-shallow@^2.0.1: 847 | version "2.0.1" 848 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 849 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 850 | dependencies: 851 | is-extendable "^0.1.0" 852 | 853 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 854 | version "3.0.2" 855 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 856 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 857 | dependencies: 858 | assign-symbols "^1.0.0" 859 | is-extendable "^1.0.1" 860 | 861 | extend@~3.0.2: 862 | version "3.0.2" 863 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 864 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 865 | 866 | extglob@^2.0.4: 867 | version "2.0.4" 868 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 869 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 870 | dependencies: 871 | array-unique "^0.3.2" 872 | define-property "^1.0.0" 873 | expand-brackets "^2.1.4" 874 | extend-shallow "^2.0.1" 875 | fragment-cache "^0.2.1" 876 | regex-not "^1.0.0" 877 | snapdragon "^0.8.1" 878 | to-regex "^3.0.1" 879 | 880 | extsprintf@1.3.0: 881 | version "1.3.0" 882 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 883 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 884 | 885 | extsprintf@^1.2.0: 886 | version "1.4.0" 887 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 888 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 889 | 890 | fast-deep-equal@^2.0.1: 891 | version "2.0.1" 892 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 893 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 894 | 895 | fast-json-stable-stringify@^2.0.0: 896 | version "2.0.0" 897 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 898 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 899 | 900 | fill-range@^4.0.0: 901 | version "4.0.0" 902 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 903 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 904 | dependencies: 905 | extend-shallow "^2.0.1" 906 | is-number "^3.0.0" 907 | repeat-string "^1.6.1" 908 | to-regex-range "^2.1.0" 909 | 910 | finalhandler@1.1.1: 911 | version "1.1.1" 912 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 913 | integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== 914 | dependencies: 915 | debug "2.6.9" 916 | encodeurl "~1.0.2" 917 | escape-html "~1.0.3" 918 | on-finished "~2.3.0" 919 | parseurl "~1.3.2" 920 | statuses "~1.4.0" 921 | unpipe "~1.0.0" 922 | 923 | for-in@^1.0.2: 924 | version "1.0.2" 925 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 926 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 927 | 928 | forever-agent@~0.6.1: 929 | version "0.6.1" 930 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 931 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 932 | 933 | form-data@~2.3.2: 934 | version "2.3.3" 935 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 936 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 937 | dependencies: 938 | asynckit "^0.4.0" 939 | combined-stream "^1.0.6" 940 | mime-types "^2.1.12" 941 | 942 | forwarded@~0.1.2: 943 | version "0.1.2" 944 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 945 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 946 | 947 | fragment-cache@^0.2.1: 948 | version "0.2.1" 949 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 950 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 951 | dependencies: 952 | map-cache "^0.2.2" 953 | 954 | fresh@0.5.2: 955 | version "0.5.2" 956 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 957 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 958 | 959 | fs-minipass@^1.2.5: 960 | version "1.2.5" 961 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 962 | integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== 963 | dependencies: 964 | minipass "^2.2.1" 965 | 966 | fs.realpath@^1.0.0: 967 | version "1.0.0" 968 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 969 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 970 | 971 | fsevents@^1.2.2: 972 | version "1.2.4" 973 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" 974 | integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== 975 | dependencies: 976 | nan "^2.9.2" 977 | node-pre-gyp "^0.10.0" 978 | 979 | gauge@~2.7.3: 980 | version "2.7.4" 981 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 982 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 983 | dependencies: 984 | aproba "^1.0.3" 985 | console-control-strings "^1.0.0" 986 | has-unicode "^2.0.0" 987 | object-assign "^4.1.0" 988 | signal-exit "^3.0.0" 989 | string-width "^1.0.1" 990 | strip-ansi "^3.0.1" 991 | wide-align "^1.1.0" 992 | 993 | get-stream@^3.0.0: 994 | version "3.0.0" 995 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 996 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 997 | 998 | get-value@^2.0.3, get-value@^2.0.6: 999 | version "2.0.6" 1000 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 1001 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 1002 | 1003 | getpass@^0.1.1: 1004 | version "0.1.7" 1005 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1006 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 1007 | dependencies: 1008 | assert-plus "^1.0.0" 1009 | 1010 | glob-parent@^3.1.0: 1011 | version "3.1.0" 1012 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 1013 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 1014 | dependencies: 1015 | is-glob "^3.1.0" 1016 | path-dirname "^1.0.0" 1017 | 1018 | glob@^7.0.5, glob@^7.1.1: 1019 | version "7.1.3" 1020 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 1021 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 1022 | dependencies: 1023 | fs.realpath "^1.0.0" 1024 | inflight "^1.0.4" 1025 | inherits "2" 1026 | minimatch "^3.0.4" 1027 | once "^1.3.0" 1028 | path-is-absolute "^1.0.0" 1029 | 1030 | global-dirs@^0.1.0: 1031 | version "0.1.1" 1032 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" 1033 | integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= 1034 | dependencies: 1035 | ini "^1.3.4" 1036 | 1037 | got@^6.7.1: 1038 | version "6.7.1" 1039 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 1040 | integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= 1041 | dependencies: 1042 | create-error-class "^3.0.0" 1043 | duplexer3 "^0.1.4" 1044 | get-stream "^3.0.0" 1045 | is-redirect "^1.0.0" 1046 | is-retry-allowed "^1.0.0" 1047 | is-stream "^1.0.0" 1048 | lowercase-keys "^1.0.0" 1049 | safe-buffer "^5.0.1" 1050 | timed-out "^4.0.0" 1051 | unzip-response "^2.0.1" 1052 | url-parse-lax "^1.0.0" 1053 | 1054 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 1055 | version "4.1.15" 1056 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 1057 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 1058 | 1059 | har-schema@^2.0.0: 1060 | version "2.0.0" 1061 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 1062 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 1063 | 1064 | har-validator@~5.1.0: 1065 | version "5.1.3" 1066 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 1067 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 1068 | dependencies: 1069 | ajv "^6.5.5" 1070 | har-schema "^2.0.0" 1071 | 1072 | has-ansi@^2.0.0: 1073 | version "2.0.0" 1074 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1075 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 1076 | dependencies: 1077 | ansi-regex "^2.0.0" 1078 | 1079 | has-flag@^3.0.0: 1080 | version "3.0.0" 1081 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1082 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1083 | 1084 | has-unicode@^2.0.0: 1085 | version "2.0.1" 1086 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1087 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 1088 | 1089 | has-value@^0.3.1: 1090 | version "0.3.1" 1091 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 1092 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 1093 | dependencies: 1094 | get-value "^2.0.3" 1095 | has-values "^0.1.4" 1096 | isobject "^2.0.0" 1097 | 1098 | has-value@^1.0.0: 1099 | version "1.0.0" 1100 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 1101 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 1102 | dependencies: 1103 | get-value "^2.0.6" 1104 | has-values "^1.0.0" 1105 | isobject "^3.0.0" 1106 | 1107 | has-values@^0.1.4: 1108 | version "0.1.4" 1109 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 1110 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 1111 | 1112 | has-values@^1.0.0: 1113 | version "1.0.0" 1114 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 1115 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 1116 | dependencies: 1117 | is-number "^3.0.0" 1118 | kind-of "^4.0.0" 1119 | 1120 | http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 1121 | version "1.6.3" 1122 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 1123 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 1124 | dependencies: 1125 | depd "~1.1.2" 1126 | inherits "2.0.3" 1127 | setprototypeof "1.1.0" 1128 | statuses ">= 1.4.0 < 2" 1129 | 1130 | http-signature@~1.2.0: 1131 | version "1.2.0" 1132 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1133 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 1134 | dependencies: 1135 | assert-plus "^1.0.0" 1136 | jsprim "^1.2.2" 1137 | sshpk "^1.7.0" 1138 | 1139 | iconv-lite@0.4.23: 1140 | version "0.4.23" 1141 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 1142 | integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== 1143 | dependencies: 1144 | safer-buffer ">= 2.1.2 < 3" 1145 | 1146 | iconv-lite@^0.4.4: 1147 | version "0.4.24" 1148 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1149 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1150 | dependencies: 1151 | safer-buffer ">= 2.1.2 < 3" 1152 | 1153 | ignore-by-default@^1.0.1: 1154 | version "1.0.1" 1155 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 1156 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 1157 | 1158 | ignore-walk@^3.0.1: 1159 | version "3.0.1" 1160 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 1161 | integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== 1162 | dependencies: 1163 | minimatch "^3.0.4" 1164 | 1165 | import-lazy@^2.1.0: 1166 | version "2.1.0" 1167 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 1168 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 1169 | 1170 | imurmurhash@^0.1.4: 1171 | version "0.1.4" 1172 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1173 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1174 | 1175 | inflight@^1.0.4: 1176 | version "1.0.6" 1177 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1178 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1179 | dependencies: 1180 | once "^1.3.0" 1181 | wrappy "1" 1182 | 1183 | inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.3: 1184 | version "2.0.3" 1185 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1186 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1187 | 1188 | ini@^1.3.4, ini@~1.3.0: 1189 | version "1.3.5" 1190 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1191 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1192 | 1193 | ipaddr.js@1.8.0: 1194 | version "1.8.0" 1195 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" 1196 | integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= 1197 | 1198 | is-accessor-descriptor@^0.1.6: 1199 | version "0.1.6" 1200 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 1201 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 1202 | dependencies: 1203 | kind-of "^3.0.2" 1204 | 1205 | is-accessor-descriptor@^1.0.0: 1206 | version "1.0.0" 1207 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 1208 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 1209 | dependencies: 1210 | kind-of "^6.0.0" 1211 | 1212 | is-binary-path@^1.0.0: 1213 | version "1.0.1" 1214 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1215 | integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 1216 | dependencies: 1217 | binary-extensions "^1.0.0" 1218 | 1219 | is-buffer@^1.1.5: 1220 | version "1.1.6" 1221 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1222 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1223 | 1224 | is-ci@^1.0.10: 1225 | version "1.2.1" 1226 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" 1227 | integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== 1228 | dependencies: 1229 | ci-info "^1.5.0" 1230 | 1231 | is-data-descriptor@^0.1.4: 1232 | version "0.1.4" 1233 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1234 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 1235 | dependencies: 1236 | kind-of "^3.0.2" 1237 | 1238 | is-data-descriptor@^1.0.0: 1239 | version "1.0.0" 1240 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1241 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1242 | dependencies: 1243 | kind-of "^6.0.0" 1244 | 1245 | is-descriptor@^0.1.0: 1246 | version "0.1.6" 1247 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1248 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1249 | dependencies: 1250 | is-accessor-descriptor "^0.1.6" 1251 | is-data-descriptor "^0.1.4" 1252 | kind-of "^5.0.0" 1253 | 1254 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1255 | version "1.0.2" 1256 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1257 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1258 | dependencies: 1259 | is-accessor-descriptor "^1.0.0" 1260 | is-data-descriptor "^1.0.0" 1261 | kind-of "^6.0.2" 1262 | 1263 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1264 | version "0.1.1" 1265 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1266 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 1267 | 1268 | is-extendable@^1.0.1: 1269 | version "1.0.1" 1270 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1271 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1272 | dependencies: 1273 | is-plain-object "^2.0.4" 1274 | 1275 | is-extglob@^2.1.0, is-extglob@^2.1.1: 1276 | version "2.1.1" 1277 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1278 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1279 | 1280 | is-fullwidth-code-point@^1.0.0: 1281 | version "1.0.0" 1282 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1283 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1284 | dependencies: 1285 | number-is-nan "^1.0.0" 1286 | 1287 | is-fullwidth-code-point@^2.0.0: 1288 | version "2.0.0" 1289 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1290 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1291 | 1292 | is-glob@^3.1.0: 1293 | version "3.1.0" 1294 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1295 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 1296 | dependencies: 1297 | is-extglob "^2.1.0" 1298 | 1299 | is-glob@^4.0.0: 1300 | version "4.0.0" 1301 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" 1302 | integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= 1303 | dependencies: 1304 | is-extglob "^2.1.1" 1305 | 1306 | is-installed-globally@^0.1.0: 1307 | version "0.1.0" 1308 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" 1309 | integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= 1310 | dependencies: 1311 | global-dirs "^0.1.0" 1312 | is-path-inside "^1.0.0" 1313 | 1314 | is-npm@^1.0.0: 1315 | version "1.0.0" 1316 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 1317 | integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= 1318 | 1319 | is-number@^3.0.0: 1320 | version "3.0.0" 1321 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1322 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 1323 | dependencies: 1324 | kind-of "^3.0.2" 1325 | 1326 | is-obj@^1.0.0: 1327 | version "1.0.1" 1328 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1329 | integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 1330 | 1331 | is-path-inside@^1.0.0: 1332 | version "1.0.1" 1333 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 1334 | integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= 1335 | dependencies: 1336 | path-is-inside "^1.0.1" 1337 | 1338 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1339 | version "2.0.4" 1340 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1341 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1342 | dependencies: 1343 | isobject "^3.0.1" 1344 | 1345 | is-redirect@^1.0.0: 1346 | version "1.0.0" 1347 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 1348 | integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= 1349 | 1350 | is-retry-allowed@^1.0.0: 1351 | version "1.1.0" 1352 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 1353 | integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= 1354 | 1355 | is-stream@^1.0.0, is-stream@^1.1.0: 1356 | version "1.1.0" 1357 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1358 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1359 | 1360 | is-typedarray@~1.0.0: 1361 | version "1.0.0" 1362 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1363 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1364 | 1365 | is-windows@^1.0.2: 1366 | version "1.0.2" 1367 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1368 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1369 | 1370 | isarray@1.0.0, isarray@~1.0.0: 1371 | version "1.0.0" 1372 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1373 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1374 | 1375 | isexe@^2.0.0: 1376 | version "2.0.0" 1377 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1378 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1379 | 1380 | isobject@^2.0.0: 1381 | version "2.1.0" 1382 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1383 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1384 | dependencies: 1385 | isarray "1.0.0" 1386 | 1387 | isobject@^3.0.0, isobject@^3.0.1: 1388 | version "3.0.1" 1389 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1390 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1391 | 1392 | isstream@~0.1.2: 1393 | version "0.1.2" 1394 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1395 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 1396 | 1397 | js-tokens@^3.0.2: 1398 | version "3.0.2" 1399 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1400 | integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 1401 | 1402 | js-yaml@^3.7.0: 1403 | version "3.12.0" 1404 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 1405 | integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== 1406 | dependencies: 1407 | argparse "^1.0.7" 1408 | esprima "^4.0.0" 1409 | 1410 | jsbn@~0.1.0: 1411 | version "0.1.1" 1412 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1413 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 1414 | 1415 | json-schema-traverse@^0.4.1: 1416 | version "0.4.1" 1417 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1418 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1419 | 1420 | json-schema@0.2.3: 1421 | version "0.2.3" 1422 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1423 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 1424 | 1425 | json-stringify-safe@~5.0.1: 1426 | version "5.0.1" 1427 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1428 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 1429 | 1430 | jsprim@^1.2.2: 1431 | version "1.4.1" 1432 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1433 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 1434 | dependencies: 1435 | assert-plus "1.0.0" 1436 | extsprintf "1.3.0" 1437 | json-schema "0.2.3" 1438 | verror "1.10.0" 1439 | 1440 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1441 | version "3.2.2" 1442 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1443 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1444 | dependencies: 1445 | is-buffer "^1.1.5" 1446 | 1447 | kind-of@^4.0.0: 1448 | version "4.0.0" 1449 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1450 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1451 | dependencies: 1452 | is-buffer "^1.1.5" 1453 | 1454 | kind-of@^5.0.0: 1455 | version "5.1.0" 1456 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1457 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1458 | 1459 | kind-of@^6.0.0, kind-of@^6.0.2: 1460 | version "6.0.2" 1461 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1462 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 1463 | 1464 | latest-version@^3.0.0: 1465 | version "3.1.0" 1466 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 1467 | integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= 1468 | dependencies: 1469 | package-json "^4.0.0" 1470 | 1471 | lodash.debounce@^4.0.8: 1472 | version "4.0.8" 1473 | resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 1474 | integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= 1475 | 1476 | lodash@^4.13.1, lodash@^4.17.10: 1477 | version "4.17.11" 1478 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 1479 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 1480 | 1481 | lowercase-keys@^1.0.0: 1482 | version "1.0.1" 1483 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1484 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1485 | 1486 | lru-cache@^4.0.1: 1487 | version "4.1.5" 1488 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 1489 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 1490 | dependencies: 1491 | pseudomap "^1.0.2" 1492 | yallist "^2.1.2" 1493 | 1494 | make-dir@^1.0.0: 1495 | version "1.3.0" 1496 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 1497 | integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 1498 | dependencies: 1499 | pify "^3.0.0" 1500 | 1501 | make-error@^1.1.1: 1502 | version "1.3.5" 1503 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 1504 | integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== 1505 | 1506 | map-cache@^0.2.2: 1507 | version "0.2.2" 1508 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1509 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1510 | 1511 | map-visit@^1.0.0: 1512 | version "1.0.0" 1513 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1514 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1515 | dependencies: 1516 | object-visit "^1.0.0" 1517 | 1518 | media-typer@0.3.0: 1519 | version "0.3.0" 1520 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1521 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1522 | 1523 | memory-pager@^1.0.2: 1524 | version "1.4.0" 1525 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.4.0.tgz#8902c72ce2fa34319adc0dae586b7d83cec6d6ac" 1526 | integrity sha512-ycuyV5gKpZln7HB/A11wCpAxEY9VQ2EhYU1F56pUAxvmj6OyOHtB9tkLLjAyFsPdghSP2S3Ujk3aYJCusgiMZg== 1527 | 1528 | merge-descriptors@1.0.1: 1529 | version "1.0.1" 1530 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1531 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1532 | 1533 | methods@~1.1.2: 1534 | version "1.1.2" 1535 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1536 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1537 | 1538 | micromatch@^3.1.10, micromatch@^3.1.4: 1539 | version "3.1.10" 1540 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1541 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1542 | dependencies: 1543 | arr-diff "^4.0.0" 1544 | array-unique "^0.3.2" 1545 | braces "^2.3.1" 1546 | define-property "^2.0.2" 1547 | extend-shallow "^3.0.2" 1548 | extglob "^2.0.4" 1549 | fragment-cache "^0.2.1" 1550 | kind-of "^6.0.2" 1551 | nanomatch "^1.2.9" 1552 | object.pick "^1.3.0" 1553 | regex-not "^1.0.0" 1554 | snapdragon "^0.8.1" 1555 | to-regex "^3.0.2" 1556 | 1557 | mime-db@~1.37.0: 1558 | version "1.37.0" 1559 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 1560 | integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== 1561 | 1562 | mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: 1563 | version "2.1.21" 1564 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 1565 | integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== 1566 | dependencies: 1567 | mime-db "~1.37.0" 1568 | 1569 | mime@1.4.1: 1570 | version "1.4.1" 1571 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 1572 | integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== 1573 | 1574 | minimatch@^3.0.4: 1575 | version "3.0.4" 1576 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1577 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1578 | dependencies: 1579 | brace-expansion "^1.1.7" 1580 | 1581 | minimist@0.0.8: 1582 | version "0.0.8" 1583 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1584 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1585 | 1586 | minimist@^1.2.0: 1587 | version "1.2.0" 1588 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1589 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1590 | 1591 | minipass@^2.2.1, minipass@^2.3.4: 1592 | version "2.3.5" 1593 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 1594 | integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 1595 | dependencies: 1596 | safe-buffer "^5.1.2" 1597 | yallist "^3.0.0" 1598 | 1599 | minizlib@^1.1.1: 1600 | version "1.2.1" 1601 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" 1602 | integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== 1603 | dependencies: 1604 | minipass "^2.2.1" 1605 | 1606 | mixin-deep@^1.2.0: 1607 | version "1.3.1" 1608 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 1609 | integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== 1610 | dependencies: 1611 | for-in "^1.0.2" 1612 | is-extendable "^1.0.1" 1613 | 1614 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1615 | version "0.5.1" 1616 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1617 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1618 | dependencies: 1619 | minimist "0.0.8" 1620 | 1621 | moment@^2.10.2: 1622 | version "2.23.0" 1623 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" 1624 | integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== 1625 | 1626 | mongodb-core@3.1.9: 1627 | version "3.1.9" 1628 | resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.1.9.tgz#c31ee407bf932b0149eaed775c17ee09974e4ca3" 1629 | integrity sha512-MJpciDABXMchrZphh3vMcqu8hkNf/Mi+Gk6btOimVg1XMxLXh87j6FAvRm+KmwD1A9fpu3qRQYcbQe4egj23og== 1630 | dependencies: 1631 | bson "^1.1.0" 1632 | require_optional "^1.0.1" 1633 | safe-buffer "^5.1.2" 1634 | optionalDependencies: 1635 | saslprep "^1.0.0" 1636 | 1637 | mongodb@^3.1.10: 1638 | version "3.1.10" 1639 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.1.10.tgz#45ad9b74ea376f4122d0881b75e5489b9e504ed7" 1640 | integrity sha512-Uml42GeFxhTGQVml1XQ4cD0o/rp7J2ROy0fdYUcVitoE7vFqEhKH4TYVqRDpQr/bXtCJVxJdNQC1ntRxNREkPQ== 1641 | dependencies: 1642 | mongodb-core "3.1.9" 1643 | safe-buffer "^5.1.2" 1644 | 1645 | ms@2.0.0: 1646 | version "2.0.0" 1647 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1648 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1649 | 1650 | ms@^2.1.1: 1651 | version "2.1.1" 1652 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1653 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1654 | 1655 | nan@^2.9.2: 1656 | version "2.12.1" 1657 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" 1658 | integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== 1659 | 1660 | nanomatch@^1.2.9: 1661 | version "1.2.13" 1662 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1663 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1664 | dependencies: 1665 | arr-diff "^4.0.0" 1666 | array-unique "^0.3.2" 1667 | define-property "^2.0.2" 1668 | extend-shallow "^3.0.2" 1669 | fragment-cache "^0.2.1" 1670 | is-windows "^1.0.2" 1671 | kind-of "^6.0.2" 1672 | object.pick "^1.3.0" 1673 | regex-not "^1.0.0" 1674 | snapdragon "^0.8.1" 1675 | to-regex "^3.0.1" 1676 | 1677 | needle@^2.2.1: 1678 | version "2.2.4" 1679 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" 1680 | integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== 1681 | dependencies: 1682 | debug "^2.1.2" 1683 | iconv-lite "^0.4.4" 1684 | sax "^1.2.4" 1685 | 1686 | negotiator@0.6.1: 1687 | version "0.6.1" 1688 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1689 | integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 1690 | 1691 | node-pre-gyp@^0.10.0: 1692 | version "0.10.3" 1693 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 1694 | integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== 1695 | dependencies: 1696 | detect-libc "^1.0.2" 1697 | mkdirp "^0.5.1" 1698 | needle "^2.2.1" 1699 | nopt "^4.0.1" 1700 | npm-packlist "^1.1.6" 1701 | npmlog "^4.0.2" 1702 | rc "^1.2.7" 1703 | rimraf "^2.6.1" 1704 | semver "^5.3.0" 1705 | tar "^4" 1706 | 1707 | nodemon@^1.18.9: 1708 | version "1.18.9" 1709 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.9.tgz#90b467efd3b3c81b9453380aeb2a2cba535d0ead" 1710 | integrity sha512-oj/eEVTEI47pzYAjGkpcNw0xYwTl4XSTUQv2NPQI6PpN3b75PhpuYk3Vb3U80xHCyM2Jm+1j68ULHXl4OR3Afw== 1711 | dependencies: 1712 | chokidar "^2.0.4" 1713 | debug "^3.1.0" 1714 | ignore-by-default "^1.0.1" 1715 | minimatch "^3.0.4" 1716 | pstree.remy "^1.1.6" 1717 | semver "^5.5.0" 1718 | supports-color "^5.2.0" 1719 | touch "^3.1.0" 1720 | undefsafe "^2.0.2" 1721 | update-notifier "^2.5.0" 1722 | 1723 | nopt@^4.0.1: 1724 | version "4.0.1" 1725 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1726 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 1727 | dependencies: 1728 | abbrev "1" 1729 | osenv "^0.1.4" 1730 | 1731 | nopt@~1.0.10: 1732 | version "1.0.10" 1733 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1734 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 1735 | dependencies: 1736 | abbrev "1" 1737 | 1738 | normalize-path@^2.1.1: 1739 | version "2.1.1" 1740 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1741 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1742 | dependencies: 1743 | remove-trailing-separator "^1.0.1" 1744 | 1745 | npm-bundled@^1.0.1: 1746 | version "1.0.5" 1747 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 1748 | integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== 1749 | 1750 | npm-packlist@^1.1.6: 1751 | version "1.1.12" 1752 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" 1753 | integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== 1754 | dependencies: 1755 | ignore-walk "^3.0.1" 1756 | npm-bundled "^1.0.1" 1757 | 1758 | npm-run-path@^2.0.0: 1759 | version "2.0.2" 1760 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1761 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1762 | dependencies: 1763 | path-key "^2.0.0" 1764 | 1765 | npmlog@^4.0.2: 1766 | version "4.1.2" 1767 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1768 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1769 | dependencies: 1770 | are-we-there-yet "~1.1.2" 1771 | console-control-strings "~1.1.0" 1772 | gauge "~2.7.3" 1773 | set-blocking "~2.0.0" 1774 | 1775 | number-is-nan@^1.0.0: 1776 | version "1.0.1" 1777 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1778 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1779 | 1780 | oauth-sign@~0.9.0: 1781 | version "0.9.0" 1782 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1783 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1784 | 1785 | object-assign@^4.1.0: 1786 | version "4.1.1" 1787 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1788 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1789 | 1790 | object-copy@^0.1.0: 1791 | version "0.1.0" 1792 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1793 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1794 | dependencies: 1795 | copy-descriptor "^0.1.0" 1796 | define-property "^0.2.5" 1797 | kind-of "^3.0.3" 1798 | 1799 | object-visit@^1.0.0: 1800 | version "1.0.1" 1801 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1802 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1803 | dependencies: 1804 | isobject "^3.0.0" 1805 | 1806 | object.pick@^1.3.0: 1807 | version "1.3.0" 1808 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1809 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1810 | dependencies: 1811 | isobject "^3.0.1" 1812 | 1813 | on-finished@~2.3.0: 1814 | version "2.3.0" 1815 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1816 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1817 | dependencies: 1818 | ee-first "1.1.1" 1819 | 1820 | once@^1.3.0: 1821 | version "1.4.0" 1822 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1823 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1824 | dependencies: 1825 | wrappy "1" 1826 | 1827 | os-homedir@^1.0.0: 1828 | version "1.0.2" 1829 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1830 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1831 | 1832 | os-tmpdir@^1.0.0: 1833 | version "1.0.2" 1834 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1835 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1836 | 1837 | osenv@^0.1.4: 1838 | version "0.1.5" 1839 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1840 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1841 | dependencies: 1842 | os-homedir "^1.0.0" 1843 | os-tmpdir "^1.0.0" 1844 | 1845 | p-finally@^1.0.0: 1846 | version "1.0.0" 1847 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1848 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1849 | 1850 | package-json@^4.0.0: 1851 | version "4.0.1" 1852 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 1853 | integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= 1854 | dependencies: 1855 | got "^6.7.1" 1856 | registry-auth-token "^3.0.1" 1857 | registry-url "^3.0.3" 1858 | semver "^5.1.0" 1859 | 1860 | parseurl@~1.3.2: 1861 | version "1.3.2" 1862 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 1863 | integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= 1864 | 1865 | pascalcase@^0.1.1: 1866 | version "0.1.1" 1867 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1868 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1869 | 1870 | path-dirname@^1.0.0: 1871 | version "1.0.2" 1872 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1873 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 1874 | 1875 | path-is-absolute@^1.0.0: 1876 | version "1.0.1" 1877 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1878 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1879 | 1880 | path-is-inside@^1.0.1: 1881 | version "1.0.2" 1882 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1883 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 1884 | 1885 | path-key@^2.0.0: 1886 | version "2.0.1" 1887 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1888 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1889 | 1890 | path-parse@^1.0.6: 1891 | version "1.0.6" 1892 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1893 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1894 | 1895 | path-to-regexp@0.1.7: 1896 | version "0.1.7" 1897 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1898 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1899 | 1900 | performance-now@^2.1.0: 1901 | version "2.1.0" 1902 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1903 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1904 | 1905 | pify@^3.0.0: 1906 | version "3.0.0" 1907 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1908 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1909 | 1910 | posix-character-classes@^0.1.0: 1911 | version "0.1.1" 1912 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1913 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1914 | 1915 | prepend-http@^1.0.1: 1916 | version "1.0.4" 1917 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1918 | integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 1919 | 1920 | process-nextick-args@~2.0.0: 1921 | version "2.0.0" 1922 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1923 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 1924 | 1925 | proxy-addr@~2.0.4: 1926 | version "2.0.4" 1927 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" 1928 | integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== 1929 | dependencies: 1930 | forwarded "~0.1.2" 1931 | ipaddr.js "1.8.0" 1932 | 1933 | pseudomap@^1.0.2: 1934 | version "1.0.2" 1935 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1936 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1937 | 1938 | psl@^1.1.24, psl@^1.1.28: 1939 | version "1.1.31" 1940 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" 1941 | integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== 1942 | 1943 | pstree.remy@^1.1.6: 1944 | version "1.1.6" 1945 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.6.tgz#73a55aad9e2d95814927131fbf4dc1b62d259f47" 1946 | integrity sha512-NdF35+QsqD7EgNEI5mkI/X+UwaxVEbQaz9f4IooEmMUv6ZPmlTQYGjBPJGgrlzNdjSvIy4MWMg6Q6vCgBO2K+w== 1947 | 1948 | punycode@^1.4.1: 1949 | version "1.4.1" 1950 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1951 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1952 | 1953 | punycode@^2.1.0, punycode@^2.1.1: 1954 | version "2.1.1" 1955 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1956 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1957 | 1958 | qs@6.5.2, qs@~6.5.2: 1959 | version "6.5.2" 1960 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1961 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1962 | 1963 | range-parser@~1.2.0: 1964 | version "1.2.0" 1965 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 1966 | integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= 1967 | 1968 | raw-body@2.3.3: 1969 | version "2.3.3" 1970 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 1971 | integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== 1972 | dependencies: 1973 | bytes "3.0.0" 1974 | http-errors "1.6.3" 1975 | iconv-lite "0.4.23" 1976 | unpipe "1.0.0" 1977 | 1978 | rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: 1979 | version "1.2.8" 1980 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1981 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1982 | dependencies: 1983 | deep-extend "^0.6.0" 1984 | ini "~1.3.0" 1985 | minimist "^1.2.0" 1986 | strip-json-comments "~2.0.1" 1987 | 1988 | readable-stream@^2.0.2, readable-stream@^2.0.6: 1989 | version "2.3.6" 1990 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1991 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1992 | dependencies: 1993 | core-util-is "~1.0.0" 1994 | inherits "~2.0.3" 1995 | isarray "~1.0.0" 1996 | process-nextick-args "~2.0.0" 1997 | safe-buffer "~5.1.1" 1998 | string_decoder "~1.1.1" 1999 | util-deprecate "~1.0.1" 2000 | 2001 | readdirp@^2.0.0: 2002 | version "2.2.1" 2003 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 2004 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 2005 | dependencies: 2006 | graceful-fs "^4.1.11" 2007 | micromatch "^3.1.10" 2008 | readable-stream "^2.0.2" 2009 | 2010 | redis-commands@^1.2.0: 2011 | version "1.4.0" 2012 | resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.4.0.tgz#52f9cf99153efcce56a8f86af986bd04e988602f" 2013 | integrity sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw== 2014 | 2015 | redis-parser@^2.6.0: 2016 | version "2.6.0" 2017 | resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" 2018 | integrity sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs= 2019 | 2020 | redis@^2.8.0: 2021 | version "2.8.0" 2022 | resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" 2023 | integrity sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A== 2024 | dependencies: 2025 | double-ended-queue "^2.1.0-0" 2026 | redis-commands "^1.2.0" 2027 | redis-parser "^2.6.0" 2028 | 2029 | regex-not@^1.0.0, regex-not@^1.0.2: 2030 | version "1.0.2" 2031 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 2032 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 2033 | dependencies: 2034 | extend-shallow "^3.0.2" 2035 | safe-regex "^1.1.0" 2036 | 2037 | registry-auth-token@^3.0.1: 2038 | version "3.3.2" 2039 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" 2040 | integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== 2041 | dependencies: 2042 | rc "^1.1.6" 2043 | safe-buffer "^5.0.1" 2044 | 2045 | registry-url@^3.0.3: 2046 | version "3.1.0" 2047 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 2048 | integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= 2049 | dependencies: 2050 | rc "^1.0.1" 2051 | 2052 | remove-trailing-separator@^1.0.1: 2053 | version "1.1.0" 2054 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 2055 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 2056 | 2057 | repeat-element@^1.1.2: 2058 | version "1.1.3" 2059 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 2060 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 2061 | 2062 | repeat-string@^1.6.1: 2063 | version "1.6.1" 2064 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2065 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 2066 | 2067 | request-promise-core@1.1.1: 2068 | version "1.1.1" 2069 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" 2070 | integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= 2071 | dependencies: 2072 | lodash "^4.13.1" 2073 | 2074 | request-promise-native@^1.0.5: 2075 | version "1.0.5" 2076 | resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" 2077 | integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= 2078 | dependencies: 2079 | request-promise-core "1.1.1" 2080 | stealthy-require "^1.1.0" 2081 | tough-cookie ">=2.3.3" 2082 | 2083 | request@^2.88.0: 2084 | version "2.88.0" 2085 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 2086 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 2087 | dependencies: 2088 | aws-sign2 "~0.7.0" 2089 | aws4 "^1.8.0" 2090 | caseless "~0.12.0" 2091 | combined-stream "~1.0.6" 2092 | extend "~3.0.2" 2093 | forever-agent "~0.6.1" 2094 | form-data "~2.3.2" 2095 | har-validator "~5.1.0" 2096 | http-signature "~1.2.0" 2097 | is-typedarray "~1.0.0" 2098 | isstream "~0.1.2" 2099 | json-stringify-safe "~5.0.1" 2100 | mime-types "~2.1.19" 2101 | oauth-sign "~0.9.0" 2102 | performance-now "^2.1.0" 2103 | qs "~6.5.2" 2104 | safe-buffer "^5.1.2" 2105 | tough-cookie "~2.4.3" 2106 | tunnel-agent "^0.6.0" 2107 | uuid "^3.3.2" 2108 | 2109 | require_optional@^1.0.1: 2110 | version "1.0.1" 2111 | resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" 2112 | integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== 2113 | dependencies: 2114 | resolve-from "^2.0.0" 2115 | semver "^5.1.0" 2116 | 2117 | resolve-from@^2.0.0: 2118 | version "2.0.0" 2119 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 2120 | integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= 2121 | 2122 | resolve-url@^0.2.1: 2123 | version "0.2.1" 2124 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 2125 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 2126 | 2127 | resolve@^1.3.2: 2128 | version "1.9.0" 2129 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" 2130 | integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== 2131 | dependencies: 2132 | path-parse "^1.0.6" 2133 | 2134 | ret@~0.1.10: 2135 | version "0.1.15" 2136 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 2137 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 2138 | 2139 | rimraf@^2.6.1: 2140 | version "2.6.2" 2141 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 2142 | integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== 2143 | dependencies: 2144 | glob "^7.0.5" 2145 | 2146 | rsmq@^0.9.3: 2147 | version "0.9.3" 2148 | resolved "https://registry.yarnpkg.com/rsmq/-/rsmq-0.9.3.tgz#de1b1f795bfd845869aa3528cd11d4e5985f73a1" 2149 | integrity sha512-Gf0dRJ+CkzGqrZ81TRok+YOtFOJdiX9bqvz28pT0ythA5gTkMxDrFWEuj937Ogd+fpWpnu+2Yc2ro/kr7tpPTg== 2150 | dependencies: 2151 | "@types/redis" "^2.8.0" 2152 | lodash "^4.17.10" 2153 | redis "^2.8.0" 2154 | 2155 | safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2156 | version "5.1.2" 2157 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2158 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2159 | 2160 | safe-regex@^1.1.0: 2161 | version "1.1.0" 2162 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 2163 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 2164 | dependencies: 2165 | ret "~0.1.10" 2166 | 2167 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 2168 | version "2.1.2" 2169 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2170 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2171 | 2172 | saslprep@^1.0.0: 2173 | version "1.0.2" 2174 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.2.tgz#da5ab936e6ea0bbae911ffec77534be370c9f52d" 2175 | integrity sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw== 2176 | dependencies: 2177 | sparse-bitfield "^3.0.3" 2178 | 2179 | sax@^1.2.4: 2180 | version "1.2.4" 2181 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2182 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 2183 | 2184 | semver-diff@^2.0.0: 2185 | version "2.1.0" 2186 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 2187 | integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= 2188 | dependencies: 2189 | semver "^5.0.3" 2190 | 2191 | semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: 2192 | version "5.6.0" 2193 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 2194 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 2195 | 2196 | send@0.16.2: 2197 | version "0.16.2" 2198 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 2199 | integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== 2200 | dependencies: 2201 | debug "2.6.9" 2202 | depd "~1.1.2" 2203 | destroy "~1.0.4" 2204 | encodeurl "~1.0.2" 2205 | escape-html "~1.0.3" 2206 | etag "~1.8.1" 2207 | fresh "0.5.2" 2208 | http-errors "~1.6.2" 2209 | mime "1.4.1" 2210 | ms "2.0.0" 2211 | on-finished "~2.3.0" 2212 | range-parser "~1.2.0" 2213 | statuses "~1.4.0" 2214 | 2215 | serve-static@1.13.2: 2216 | version "1.13.2" 2217 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 2218 | integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== 2219 | dependencies: 2220 | encodeurl "~1.0.2" 2221 | escape-html "~1.0.3" 2222 | parseurl "~1.3.2" 2223 | send "0.16.2" 2224 | 2225 | set-blocking@~2.0.0: 2226 | version "2.0.0" 2227 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2228 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 2229 | 2230 | set-value@^0.4.3: 2231 | version "0.4.3" 2232 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 2233 | integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= 2234 | dependencies: 2235 | extend-shallow "^2.0.1" 2236 | is-extendable "^0.1.1" 2237 | is-plain-object "^2.0.1" 2238 | to-object-path "^0.3.0" 2239 | 2240 | set-value@^2.0.0: 2241 | version "2.0.0" 2242 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 2243 | integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== 2244 | dependencies: 2245 | extend-shallow "^2.0.1" 2246 | is-extendable "^0.1.1" 2247 | is-plain-object "^2.0.3" 2248 | split-string "^3.0.1" 2249 | 2250 | setprototypeof@1.1.0: 2251 | version "1.1.0" 2252 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 2253 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 2254 | 2255 | shebang-command@^1.2.0: 2256 | version "1.2.0" 2257 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2258 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 2259 | dependencies: 2260 | shebang-regex "^1.0.0" 2261 | 2262 | shebang-regex@^1.0.0: 2263 | version "1.0.0" 2264 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2265 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 2266 | 2267 | signal-exit@^3.0.0, signal-exit@^3.0.2: 2268 | version "3.0.2" 2269 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2270 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 2271 | 2272 | snapdragon-node@^2.0.1: 2273 | version "2.1.1" 2274 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 2275 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 2276 | dependencies: 2277 | define-property "^1.0.0" 2278 | isobject "^3.0.0" 2279 | snapdragon-util "^3.0.1" 2280 | 2281 | snapdragon-util@^3.0.1: 2282 | version "3.0.1" 2283 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 2284 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 2285 | dependencies: 2286 | kind-of "^3.2.0" 2287 | 2288 | snapdragon@^0.8.1: 2289 | version "0.8.2" 2290 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 2291 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 2292 | dependencies: 2293 | base "^0.11.1" 2294 | debug "^2.2.0" 2295 | define-property "^0.2.5" 2296 | extend-shallow "^2.0.1" 2297 | map-cache "^0.2.2" 2298 | source-map "^0.5.6" 2299 | source-map-resolve "^0.5.0" 2300 | use "^3.1.0" 2301 | 2302 | source-map-resolve@^0.5.0: 2303 | version "0.5.2" 2304 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 2305 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 2306 | dependencies: 2307 | atob "^2.1.1" 2308 | decode-uri-component "^0.2.0" 2309 | resolve-url "^0.2.1" 2310 | source-map-url "^0.4.0" 2311 | urix "^0.1.0" 2312 | 2313 | source-map-support@^0.5.6: 2314 | version "0.5.9" 2315 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" 2316 | integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== 2317 | dependencies: 2318 | buffer-from "^1.0.0" 2319 | source-map "^0.6.0" 2320 | 2321 | source-map-url@^0.4.0: 2322 | version "0.4.0" 2323 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 2324 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 2325 | 2326 | source-map@^0.5.6: 2327 | version "0.5.7" 2328 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2329 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2330 | 2331 | source-map@^0.6.0: 2332 | version "0.6.1" 2333 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2334 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2335 | 2336 | sparse-bitfield@^3.0.3: 2337 | version "3.0.3" 2338 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 2339 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= 2340 | dependencies: 2341 | memory-pager "^1.0.2" 2342 | 2343 | split-string@^3.0.1, split-string@^3.0.2: 2344 | version "3.1.0" 2345 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 2346 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 2347 | dependencies: 2348 | extend-shallow "^3.0.0" 2349 | 2350 | sprintf-js@~1.0.2: 2351 | version "1.0.3" 2352 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2353 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2354 | 2355 | sshpk@^1.7.0: 2356 | version "1.15.2" 2357 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" 2358 | integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== 2359 | dependencies: 2360 | asn1 "~0.2.3" 2361 | assert-plus "^1.0.0" 2362 | bcrypt-pbkdf "^1.0.0" 2363 | dashdash "^1.12.0" 2364 | ecc-jsbn "~0.1.1" 2365 | getpass "^0.1.1" 2366 | jsbn "~0.1.0" 2367 | safer-buffer "^2.0.2" 2368 | tweetnacl "~0.14.0" 2369 | 2370 | static-extend@^0.1.1: 2371 | version "0.1.2" 2372 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 2373 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 2374 | dependencies: 2375 | define-property "^0.2.5" 2376 | object-copy "^0.1.0" 2377 | 2378 | "statuses@>= 1.4.0 < 2": 2379 | version "1.5.0" 2380 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 2381 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 2382 | 2383 | statuses@~1.4.0: 2384 | version "1.4.0" 2385 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 2386 | integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== 2387 | 2388 | stealthy-require@^1.1.0: 2389 | version "1.1.1" 2390 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 2391 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 2392 | 2393 | string-width@^1.0.1: 2394 | version "1.0.2" 2395 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2396 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2397 | dependencies: 2398 | code-point-at "^1.0.0" 2399 | is-fullwidth-code-point "^1.0.0" 2400 | strip-ansi "^3.0.0" 2401 | 2402 | "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 2403 | version "2.1.1" 2404 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2405 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2406 | dependencies: 2407 | is-fullwidth-code-point "^2.0.0" 2408 | strip-ansi "^4.0.0" 2409 | 2410 | string_decoder@~1.1.1: 2411 | version "1.1.1" 2412 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2413 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2414 | dependencies: 2415 | safe-buffer "~5.1.0" 2416 | 2417 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2418 | version "3.0.1" 2419 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2420 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2421 | dependencies: 2422 | ansi-regex "^2.0.0" 2423 | 2424 | strip-ansi@^4.0.0: 2425 | version "4.0.0" 2426 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2427 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2428 | dependencies: 2429 | ansi-regex "^3.0.0" 2430 | 2431 | strip-eof@^1.0.0: 2432 | version "1.0.0" 2433 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 2434 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 2435 | 2436 | strip-json-comments@~2.0.1: 2437 | version "2.0.1" 2438 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2439 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2440 | 2441 | supports-color@^2.0.0: 2442 | version "2.0.0" 2443 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2444 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 2445 | 2446 | supports-color@^5.2.0, supports-color@^5.3.0: 2447 | version "5.5.0" 2448 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2449 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2450 | dependencies: 2451 | has-flag "^3.0.0" 2452 | 2453 | tar@^4: 2454 | version "4.4.8" 2455 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" 2456 | integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== 2457 | dependencies: 2458 | chownr "^1.1.1" 2459 | fs-minipass "^1.2.5" 2460 | minipass "^2.3.4" 2461 | minizlib "^1.1.1" 2462 | mkdirp "^0.5.0" 2463 | safe-buffer "^5.1.2" 2464 | yallist "^3.0.2" 2465 | 2466 | term-size@^1.2.0: 2467 | version "1.2.0" 2468 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 2469 | integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= 2470 | dependencies: 2471 | execa "^0.7.0" 2472 | 2473 | thumbcoil@^1.2.3-hackweek2: 2474 | version "1.2.3-hackweek2" 2475 | resolved "https://registry.yarnpkg.com/thumbcoil/-/thumbcoil-1.2.3-hackweek2.tgz#1e6413dbfa16333d20a19ee4db55fc94c7fc628b" 2476 | integrity sha1-HmQT2/oWMz0goZ7k21X8lMf8Yos= 2477 | 2478 | timed-out@^4.0.0: 2479 | version "4.0.1" 2480 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 2481 | integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 2482 | 2483 | to-object-path@^0.3.0: 2484 | version "0.3.0" 2485 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 2486 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 2487 | dependencies: 2488 | kind-of "^3.0.2" 2489 | 2490 | to-regex-range@^2.1.0: 2491 | version "2.1.1" 2492 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 2493 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 2494 | dependencies: 2495 | is-number "^3.0.0" 2496 | repeat-string "^1.6.1" 2497 | 2498 | to-regex@^3.0.1, to-regex@^3.0.2: 2499 | version "3.0.2" 2500 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 2501 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2502 | dependencies: 2503 | define-property "^2.0.2" 2504 | extend-shallow "^3.0.2" 2505 | regex-not "^1.0.2" 2506 | safe-regex "^1.1.0" 2507 | 2508 | touch@^3.1.0: 2509 | version "3.1.0" 2510 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 2511 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 2512 | dependencies: 2513 | nopt "~1.0.10" 2514 | 2515 | tough-cookie@>=2.3.3: 2516 | version "2.5.0" 2517 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 2518 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 2519 | dependencies: 2520 | psl "^1.1.28" 2521 | punycode "^2.1.1" 2522 | 2523 | tough-cookie@~2.4.3: 2524 | version "2.4.3" 2525 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 2526 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 2527 | dependencies: 2528 | psl "^1.1.24" 2529 | punycode "^1.4.1" 2530 | 2531 | ts-node@^7.0.1: 2532 | version "7.0.1" 2533 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" 2534 | integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== 2535 | dependencies: 2536 | arrify "^1.0.0" 2537 | buffer-from "^1.1.0" 2538 | diff "^3.1.0" 2539 | make-error "^1.1.1" 2540 | minimist "^1.2.0" 2541 | mkdirp "^0.5.1" 2542 | source-map-support "^0.5.6" 2543 | yn "^2.0.0" 2544 | 2545 | tslib@^1.8.0, tslib@^1.8.1: 2546 | version "1.9.3" 2547 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 2548 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 2549 | 2550 | tslint@^5.11.0: 2551 | version "5.11.0" 2552 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" 2553 | integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= 2554 | dependencies: 2555 | babel-code-frame "^6.22.0" 2556 | builtin-modules "^1.1.1" 2557 | chalk "^2.3.0" 2558 | commander "^2.12.1" 2559 | diff "^3.2.0" 2560 | glob "^7.1.1" 2561 | js-yaml "^3.7.0" 2562 | minimatch "^3.0.4" 2563 | resolve "^1.3.2" 2564 | semver "^5.3.0" 2565 | tslib "^1.8.0" 2566 | tsutils "^2.27.2" 2567 | 2568 | tsutils@^2.27.2: 2569 | version "2.29.0" 2570 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 2571 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 2572 | dependencies: 2573 | tslib "^1.8.1" 2574 | 2575 | tunnel-agent@^0.6.0: 2576 | version "0.6.0" 2577 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2578 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2579 | dependencies: 2580 | safe-buffer "^5.0.1" 2581 | 2582 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2583 | version "0.14.5" 2584 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2585 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 2586 | 2587 | type-is@~1.6.16: 2588 | version "1.6.16" 2589 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 2590 | integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== 2591 | dependencies: 2592 | media-typer "0.3.0" 2593 | mime-types "~2.1.18" 2594 | 2595 | typescript@^3.2.2: 2596 | version "3.2.2" 2597 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5" 2598 | integrity sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg== 2599 | 2600 | undefsafe@^2.0.2: 2601 | version "2.0.2" 2602 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" 2603 | integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= 2604 | dependencies: 2605 | debug "^2.2.0" 2606 | 2607 | union-value@^1.0.0: 2608 | version "1.0.0" 2609 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 2610 | integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= 2611 | dependencies: 2612 | arr-union "^3.1.0" 2613 | get-value "^2.0.6" 2614 | is-extendable "^0.1.1" 2615 | set-value "^0.4.3" 2616 | 2617 | unique-string@^1.0.0: 2618 | version "1.0.0" 2619 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 2620 | integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= 2621 | dependencies: 2622 | crypto-random-string "^1.0.0" 2623 | 2624 | unpipe@1.0.0, unpipe@~1.0.0: 2625 | version "1.0.0" 2626 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2627 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2628 | 2629 | unset-value@^1.0.0: 2630 | version "1.0.0" 2631 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2632 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 2633 | dependencies: 2634 | has-value "^0.3.1" 2635 | isobject "^3.0.0" 2636 | 2637 | unzip-response@^2.0.1: 2638 | version "2.0.1" 2639 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 2640 | integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= 2641 | 2642 | upath@^1.0.5: 2643 | version "1.1.0" 2644 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" 2645 | integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== 2646 | 2647 | update-notifier@^2.5.0: 2648 | version "2.5.0" 2649 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" 2650 | integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== 2651 | dependencies: 2652 | boxen "^1.2.1" 2653 | chalk "^2.0.1" 2654 | configstore "^3.0.0" 2655 | import-lazy "^2.1.0" 2656 | is-ci "^1.0.10" 2657 | is-installed-globally "^0.1.0" 2658 | is-npm "^1.0.0" 2659 | latest-version "^3.0.0" 2660 | semver-diff "^2.0.0" 2661 | xdg-basedir "^3.0.0" 2662 | 2663 | uri-js@^4.2.2: 2664 | version "4.2.2" 2665 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 2666 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 2667 | dependencies: 2668 | punycode "^2.1.0" 2669 | 2670 | urix@^0.1.0: 2671 | version "0.1.0" 2672 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2673 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 2674 | 2675 | url-parse-lax@^1.0.0: 2676 | version "1.0.0" 2677 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 2678 | integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= 2679 | dependencies: 2680 | prepend-http "^1.0.1" 2681 | 2682 | url-toolkit@^2.1.6: 2683 | version "2.1.6" 2684 | resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2" 2685 | integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw== 2686 | 2687 | use@^3.1.0: 2688 | version "3.1.1" 2689 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 2690 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 2691 | 2692 | util-deprecate@~1.0.1: 2693 | version "1.0.2" 2694 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2695 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2696 | 2697 | utils-merge@1.0.1: 2698 | version "1.0.1" 2699 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2700 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 2701 | 2702 | uuid@^3.3.2: 2703 | version "3.3.2" 2704 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 2705 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 2706 | 2707 | vary@~1.1.2: 2708 | version "1.1.2" 2709 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2710 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2711 | 2712 | verror@1.10.0: 2713 | version "1.10.0" 2714 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2715 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 2716 | dependencies: 2717 | assert-plus "^1.0.0" 2718 | core-util-is "1.0.2" 2719 | extsprintf "^1.2.0" 2720 | 2721 | which@^1.2.9: 2722 | version "1.3.1" 2723 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2724 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2725 | dependencies: 2726 | isexe "^2.0.0" 2727 | 2728 | wide-align@^1.1.0: 2729 | version "1.1.3" 2730 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2731 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2732 | dependencies: 2733 | string-width "^1.0.2 || 2" 2734 | 2735 | widest-line@^2.0.0: 2736 | version "2.0.1" 2737 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" 2738 | integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== 2739 | dependencies: 2740 | string-width "^2.1.1" 2741 | 2742 | wrappy@1: 2743 | version "1.0.2" 2744 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2745 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2746 | 2747 | write-file-atomic@^2.0.0: 2748 | version "2.3.0" 2749 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" 2750 | integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== 2751 | dependencies: 2752 | graceful-fs "^4.1.11" 2753 | imurmurhash "^0.1.4" 2754 | signal-exit "^3.0.2" 2755 | 2756 | xdg-basedir@^3.0.0: 2757 | version "3.0.0" 2758 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 2759 | integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= 2760 | 2761 | yallist@^2.1.2: 2762 | version "2.1.2" 2763 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2764 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 2765 | 2766 | yallist@^3.0.0, yallist@^3.0.2: 2767 | version "3.0.3" 2768 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 2769 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 2770 | 2771 | yn@^2.0.0: 2772 | version "2.0.0" 2773 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 2774 | integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= 2775 | --------------------------------------------------------------------------------