From 1f7d64c9052c8d31624ad276a33cec9e7798b617 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 9 Sep 2019 15:48:50 -0700 Subject: [PATCH 01/39] Initial commit for tests --- .babelrc | 21 - .babelrc.js | 29 + .editorconfig | 5 - .gitignore | 2 +- .npmignore | 10 - __tests__/constants.json | 6 + __tests__/happy.postActivity.js | 81 + __tests__/setup/createDirectLineOptions.js | 67 + __tests__/setup/createPromiseQueue.js | 24 + __tests__/setup/createUserId.js | 3 + __tests__/setup/getEchoActivity.js | 9 + __tests__/setup/observableToPromise.js | 19 + __tests__/setup/postActivity.js | 17 + __tests__/setup/waitForActivity.js | 5 + __tests__/setup/waitForBotEcho.js | 10 + __tests__/setup/waitForConnected.js | 9 + __tests__/setup/waitForObservable.js | 24 + jest.config.js | 14 +- lib/directLine.js | 635 +++ lib/directLine.test.js | 68 + package-lock.json | 5176 ++++++++++++++------ package.json | 73 +- webpack-development.config.js | 6 + webpack-instrumented.config.js | 12 - webpack-watch.config.js | 3 +- webpack.config.js | 1 - 26 files changed, 4742 insertions(+), 1587 deletions(-) delete mode 100644 .babelrc create mode 100644 .babelrc.js delete mode 100644 .editorconfig delete mode 100644 .npmignore create mode 100644 __tests__/constants.json create mode 100644 __tests__/happy.postActivity.js create mode 100644 __tests__/setup/createDirectLineOptions.js create mode 100644 __tests__/setup/createPromiseQueue.js create mode 100644 __tests__/setup/createUserId.js create mode 100644 __tests__/setup/getEchoActivity.js create mode 100644 __tests__/setup/observableToPromise.js create mode 100644 __tests__/setup/postActivity.js create mode 100644 __tests__/setup/waitForActivity.js create mode 100644 __tests__/setup/waitForBotEcho.js create mode 100644 __tests__/setup/waitForConnected.js create mode 100644 __tests__/setup/waitForObservable.js create mode 100644 lib/directLine.js create mode 100644 lib/directLine.test.js create mode 100644 webpack-development.config.js delete mode 100644 webpack-instrumented.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index bc1dfb61f..000000000 --- a/.babelrc +++ /dev/null @@ -1,21 +0,0 @@ -{ - "env": { - "test": { - "plugins": [ - "babel-plugin-istanbul" - ] - } - }, - "plugins": [ - "@babel/plugin-proposal-class-properties", - "@babel/plugin-proposal-object-rest-spread", - "@babel/plugin-transform-runtime" - ], - "presets": [ - "@babel/preset-typescript", - ["@babel/preset-env", { - "forceAllTransforms": true, - "modules": "commonjs" - }] - ] -} diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 000000000..cfb22ef13 --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,29 @@ +module.exports = { + env: { + test: { + plugins: [ + 'babel-plugin-istanbul' + ] + } + }, + ignore: [ + './src/*.spec.js', + './src/*.spec.ts', + './src/*.test.js', + './src/*.test.ts' + ], + plugins: [ + '@babel/plugin-proposal-class-properties', + '@babel/plugin-proposal-object-rest-spread', + '@babel/plugin-transform-runtime', + 'babel-plugin-transform-inline-environment-variables' + ], + presets: [ + ['@babel/preset-env', { + forceAllTransforms: true, + modules: 'commonjs' + }], + '@babel/preset-typescript' + ], + sourceMaps: 'inline' +}; diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 2b2985d5b..000000000 --- a/.editorconfig +++ /dev/null @@ -1,5 +0,0 @@ -[*] -charset=utf-8 -insert_final_newline=true -indent_style=space -indent_size=2 diff --git a/.gitignore b/.gitignore index 16fe7b9c5..224ea6055 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -/.idea +/.env /built /node_modules diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 01d61073c..000000000 --- a/.npmignore +++ /dev/null @@ -1,10 +0,0 @@ -/node_modules -/samples -/test -/tsconfig.json -/*.config.js -/*.js.map -/.gitattributes -/.gitignore -/.npmignore -/.vscode diff --git a/__tests__/constants.json b/__tests__/constants.json new file mode 100644 index 000000000..93469db04 --- /dev/null +++ b/__tests__/constants.json @@ -0,0 +1,6 @@ +{ + "timeouts": { + "default": 5000, + "rest": 10000 + } +} diff --git a/__tests__/happy.postActivity.js b/__tests__/happy.postActivity.js new file mode 100644 index 000000000..86e79da42 --- /dev/null +++ b/__tests__/happy.postActivity.js @@ -0,0 +1,81 @@ +import 'dotenv/config'; + +import onErrorResumeNext from 'on-error-resume-next'; + +import { DirectLine } from '../src/directLine'; +import { timeouts } from './constants.json'; +import * as createDirectLineOptions from './setup/createDirectLineOptions'; +import postActivity from './setup/postActivity'; +import waitForBotEcho from './setup/waitForBotEcho'; +import waitForConnected from './setup/waitForConnected'; + +beforeAll(() => { + jest.setTimeout(timeouts.default); + + const { ResourceLoader } = require('jsdom'); + const { HTTP_PROXY } = process.env; + + const resources = new ResourceLoader({ + proxy: HTTP_PROXY, + strictSSL: !HTTP_PROXY + }); + + // HACK: We cannot set ResourceLoader thru testEnvironmentOptions.resources. + // This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic). + // Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeeded when running without watch. + window._resourceLoader = resources; +}); + +function sleep(ms = 1000) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +describe('Happy path', () => { + let unsubscribes; + + beforeEach(() => unsubscribes = []); + afterEach(() => unsubscribes.forEach(fn => onErrorResumeNext(fn))); + + describe('should connect, send messaage, and receive echo from bot', () => { + let directLine; + + afterEach(async () => { + if (directLine) { + unsubscribes.push(await waitForConnected(directLine)); + + await sleep(100); + + await Promise.all([ + postActivity(directLine, { text: 'Hello, World!', type: 'message' }), + waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') + ]); + } + }); + + describe('using REST', () => { + beforeEach(() => jest.setTimeout(timeouts.rest)); + + test('with secret', async () => { + directLine = new DirectLine(await createDirectLineOptions.forREST({ token: false })); + }); + + test('with token', async () => { + directLine = new DirectLine(await createDirectLineOptions.forREST({ token: true })); + }); + }); + + // test('using Streaming Extensions', async () => { + // directLine = new DirectLine(await createDirectLineOptions.forStreamingExtensions()); + // }); + + describe('using Web Socket', () => { + test('with secret', async () => { + directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + }); + + test('with token', async () => { + directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + }); + }); + }); +}); diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js new file mode 100644 index 000000000..5851f2729 --- /dev/null +++ b/__tests__/setup/createDirectLineOptions.js @@ -0,0 +1,67 @@ +import fetch from 'node-fetch'; + +const { + DEFAULT_USER_ID = 'u-12345', + DIRECT_LINE_SECRET, + // STREAMING_EXTENSIONS_DOMAIN = 'http://localhost:5002/.bot/v3/directline' + STREAMING_EXTENSIONS_DOMAIN = 'https://webchat-waterbottle.azurewebsites.net/.bot/v3/directline' +} = process.env; + +const DEFAULT_DOMAIN = 'https://directline.botframework.com/v3/directline'; + +async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { + let cres; + + cres = await fetch(`${ domain }/tokens/generate`, { + body: JSON.stringify({ User: { Id: DEFAULT_USER_ID } }), + headers: { + authorization: `Bearer ${ DIRECT_LINE_SECRET }`, + 'Content-Type': 'application/json' + }, + method: 'POST' + }); + + if (cres.status === 200) { + const json = await cres.json(); + + if ('error' in json) { + throw new Error(`Direct Line service responded ${ JSON.stringify(json.error) } while generating new token`); + } else { + return json; + } + } else { + throw new Error(`Direct Line service returned ${ cres.status } while generating new token`); + } +} + +export async function forREST({ token } = {}) { + token = token && (await generateDirectLineToken()).token; + + return { + ...token ? {} : { secret: DIRECT_LINE_SECRET }, + ...token ? { token } : {}, + webSocket: false + }; +} + +export async function forStreamingExtensions() { + const { conversationId, token } = (await generateDirectLineToken(STREAMING_EXTENSIONS_DOMAIN)); + + return { + conversationId, + domain: STREAMING_EXTENSIONS_DOMAIN, + streamingWebSocket: true, + token, + webSocket: true + }; +} + +export async function forWebSocket({ token } = {}) { + token = token && (await generateDirectLineToken()).token; + + return { + ...token ? {} : { secret: DIRECT_LINE_SECRET }, + ...token ? { token } : {}, + webSocket: true + }; +} diff --git a/__tests__/setup/createPromiseQueue.js b/__tests__/setup/createPromiseQueue.js new file mode 100644 index 000000000..7531f1def --- /dev/null +++ b/__tests__/setup/createPromiseQueue.js @@ -0,0 +1,24 @@ +import createDeferred from 'p-defer'; + +export default function createPromiseQueue() { + const deferreds = []; + const queue = []; + const processOne = () => { + deferreds.length && queue.length && deferreds.shift().resolve(queue.shift()); + }; + + return { + pop() { + const deferred = createDeferred(); + + deferreds.push(deferred); + processOne(); + + return deferred.promise; + }, + push(value) { + queue.push(value); + processOne(); + } + }; +} diff --git a/__tests__/setup/createUserId.js b/__tests__/setup/createUserId.js new file mode 100644 index 000000000..c601e51bb --- /dev/null +++ b/__tests__/setup/createUserId.js @@ -0,0 +1,3 @@ +export default function createUserId() { + return `u-${ Math.random().toString(36).substr(2, 5) }`; +} diff --git a/__tests__/setup/getEchoActivity.js b/__tests__/setup/getEchoActivity.js new file mode 100644 index 000000000..82d910ccb --- /dev/null +++ b/__tests__/setup/getEchoActivity.js @@ -0,0 +1,9 @@ +export default function getEchoActivity(activity) { + const { + channelData: { + originalActivity + } = {} + } = activity; + + return originalActivity; +} diff --git a/__tests__/setup/observableToPromise.js b/__tests__/setup/observableToPromise.js new file mode 100644 index 000000000..6f838c582 --- /dev/null +++ b/__tests__/setup/observableToPromise.js @@ -0,0 +1,19 @@ +import createPromiseQueue from './createPromiseQueue'; + +export default function observableToPromise(observable) { + let errors = createPromiseQueue(); + let completes = createPromiseQueue(); + let nexts = createPromiseQueue(); + const subscription = observable.subscribe({ + complete: completes.push, + error: errors.push, + next: nexts.push + }); + + return { + complete: () => completes.pop(), + error: () => errors.pop(), + next: () => nexts.pop(), + unsubscribe: subscription.unsubscribe.bind(subscription) + }; +} diff --git a/__tests__/setup/postActivity.js b/__tests__/setup/postActivity.js new file mode 100644 index 000000000..df084b17b --- /dev/null +++ b/__tests__/setup/postActivity.js @@ -0,0 +1,17 @@ +import updateIn from 'simple-update-in'; + +import waitForActivity from './waitForActivity'; +import waitForObservable from './waitForObservable'; + +const DEFAULT_USER_ID = 'u-12345'; + +export default async function postActivity(directLine, activity) { + const activityId = await waitForObservable( + directLine.postActivity( + updateIn(activity, ['from', 'id'], userId => userId || DEFAULT_USER_ID) + ), + () => true + ); + + await waitForActivity(directLine, ({ id }) => id === activityId); +} diff --git a/__tests__/setup/waitForActivity.js b/__tests__/setup/waitForActivity.js new file mode 100644 index 000000000..cc6876ea7 --- /dev/null +++ b/__tests__/setup/waitForActivity.js @@ -0,0 +1,5 @@ +import waitForObservable from './waitForObservable'; + +export default function waitForBotRespond(directLine, equalityFn) { + return waitForObservable(directLine.activity$, activity => equalityFn(activity)); +} diff --git a/__tests__/setup/waitForBotEcho.js b/__tests__/setup/waitForBotEcho.js new file mode 100644 index 000000000..87e44fe7b --- /dev/null +++ b/__tests__/setup/waitForBotEcho.js @@ -0,0 +1,10 @@ +import getEchoActivity from './getEchoActivity'; +import waitForObservable from './waitForObservable'; + +export default function waitForBotEcho(directLine, equalityFn) { + return waitForObservable(directLine.activity$, activity => { + const echoActivity = getEchoActivity(activity); + + return echoActivity && equalityFn(echoActivity); + }); +} diff --git a/__tests__/setup/waitForConnected.js b/__tests__/setup/waitForConnected.js new file mode 100644 index 000000000..db440e412 --- /dev/null +++ b/__tests__/setup/waitForConnected.js @@ -0,0 +1,9 @@ +import waitForObservable from './waitForObservable'; + +export default async function waitForConnected(directLine) { + const subscription = directLine.activity$.subscribe(); + + await waitForObservable(directLine.connectionStatus$, 2); + + return subscription.unsubscribe.bind(subscription); +} diff --git a/__tests__/setup/waitForObservable.js b/__tests__/setup/waitForObservable.js new file mode 100644 index 000000000..8e28e2ad9 --- /dev/null +++ b/__tests__/setup/waitForObservable.js @@ -0,0 +1,24 @@ +import promiseRaceMap from 'promise-race-map'; + +import observableToPromise from './observableToPromise'; + +export default async function waitForObservable(observable, target) { + const observer = observableToPromise(observable); + + try { + for (;;) { + const { error, next } = await promiseRaceMap({ + error: observer.error(), + next: observer.next() + }); + + if (error) { + throw error; + } else if (typeof target === 'function' ? target(next) : Object.is(next, target)) { + return next; + } + } + } finally { + observer.unsubscribe(); + } +} diff --git a/jest.config.js b/jest.config.js index 47f65663e..2c2f3561d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,12 +1,12 @@ module.exports = { - "testMatch": [ - "**/__tests__/**/*.[jt]s?(x)", - "**/?(*.)(spec|test).[jt]s?(x)" + testMatch: [ + '**/__tests__/**/*.[jt]s?(x)', + '**/?(*.)(spec|test).[jt]s?(x)' ], - "testPathIgnorePatterns": [ - "/__tests__/setup/" + testPathIgnorePatterns: [ + '/__tests__/setup/' ], - "transform": { - "^.+\\.[jt]sx?$": "babel-jest" + transform: { + '^.+\\.[jt]sx?$': 'babel-jest' } }; diff --git a/lib/directLine.js b/lib/directLine.js new file mode 100644 index 000000000..d64e99b67 --- /dev/null +++ b/lib/directLine.js @@ -0,0 +1,635 @@ +"use strict"; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DirectLine = exports.ConnectionStatus = void 0; + +var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); + +var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); + +var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); + +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); + +var _BehaviorSubject = require("rxjs/BehaviorSubject"); + +var _Observable = require("rxjs/Observable"); + +require("rxjs/add/operator/catch"); + +require("rxjs/add/operator/combineLatest"); + +require("rxjs/add/operator/count"); + +require("rxjs/add/operator/delay"); + +require("rxjs/add/operator/do"); + +require("rxjs/add/operator/filter"); + +require("rxjs/add/operator/map"); + +require("rxjs/add/operator/mergeMap"); + +require("rxjs/add/operator/retryWhen"); + +require("rxjs/add/operator/share"); + +require("rxjs/add/operator/take"); + +require("rxjs/add/observable/dom/ajax"); + +require("rxjs/add/observable/empty"); + +require("rxjs/add/observable/from"); + +require("rxjs/add/observable/interval"); + +require("rxjs/add/observable/of"); + +require("rxjs/add/observable/throw"); + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +var DIRECT_LINE_VERSION = 'DirectLine/3.0'; +// These types are specific to this client library, not to Direct Line 3.0 +var ConnectionStatus; +exports.ConnectionStatus = ConnectionStatus; + +(function (ConnectionStatus) { + ConnectionStatus[ConnectionStatus["Uninitialized"] = 0] = "Uninitialized"; + ConnectionStatus[ConnectionStatus["Connecting"] = 1] = "Connecting"; + ConnectionStatus[ConnectionStatus["Online"] = 2] = "Online"; + ConnectionStatus[ConnectionStatus["ExpiredToken"] = 3] = "ExpiredToken"; + ConnectionStatus[ConnectionStatus["FailedToConnect"] = 4] = "FailedToConnect"; + ConnectionStatus[ConnectionStatus["Ended"] = 5] = "Ended"; +})(ConnectionStatus || (exports.ConnectionStatus = ConnectionStatus = {})); + +var lifetimeRefreshToken = 30 * 60 * 1000; +var intervalRefreshToken = lifetimeRefreshToken / 2; +var timeout = 20 * 1000; +var retries = (lifetimeRefreshToken - intervalRefreshToken) / timeout; +var POLLING_INTERVAL_LOWER_BOUND = 200; //ms + +var errorExpiredToken = new Error("expired token"); +var errorConversationEnded = new Error("conversation ended"); +var errorFailedToConnect = new Error("failed to connect"); +var konsole = { + log: function log(message) { + var _console; + + for (var _len = arguments.length, optionalParams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + optionalParams[_key - 1] = arguments[_key]; + } + + if (typeof window !== 'undefined' && window["botchatDebug"] && message) (_console = console).log.apply(_console, [message].concat(optionalParams)); + } +}; + +var DirectLine = +/*#__PURE__*/ +function () { + //ms + function DirectLine(options) { + (0, _classCallCheck2["default"])(this, DirectLine); + (0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(ConnectionStatus.Uninitialized)); + (0, _defineProperty2["default"])(this, "activity$", void 0); + (0, _defineProperty2["default"])(this, "domain", "https://directline.botframework.com/v3/directline"); + (0, _defineProperty2["default"])(this, "webSocket", void 0); + (0, _defineProperty2["default"])(this, "conversationId", void 0); + (0, _defineProperty2["default"])(this, "expiredTokenExhaustion", void 0); + (0, _defineProperty2["default"])(this, "secret", void 0); + (0, _defineProperty2["default"])(this, "token", void 0); + (0, _defineProperty2["default"])(this, "watermark", ''); + (0, _defineProperty2["default"])(this, "streamUrl", void 0); + (0, _defineProperty2["default"])(this, "_botAgent", ''); + (0, _defineProperty2["default"])(this, "_userAgent", void 0); + (0, _defineProperty2["default"])(this, "referenceGrammarId", void 0); + (0, _defineProperty2["default"])(this, "pollingInterval", 1000); + (0, _defineProperty2["default"])(this, "tokenRefreshSubscription", void 0); + this.secret = options.secret; + this.token = options.secret || options.token; + this.webSocket = (options.webSocket === undefined ? true : options.webSocket) && typeof WebSocket !== 'undefined' && WebSocket !== undefined; + + if (options.domain) { + this.domain = options.domain; + } + + if (options.conversationId) { + this.conversationId = options.conversationId; + } + + if (options.watermark) { + this.watermark = options.watermark; + } + + if (options.streamUrl) { + if (options.token && options.conversationId) { + this.streamUrl = options.streamUrl; + } else { + console.warn('DirectLineJS: streamUrl was ignored: you need to provide a token and a conversationid'); + } + } + + this._botAgent = this.getBotAgent(options.botAgent); + var parsedPollingInterval = ~~options.pollingInterval; + + if (parsedPollingInterval < POLLING_INTERVAL_LOWER_BOUND) { + if (typeof options.pollingInterval !== 'undefined') { + console.warn("DirectLineJS: provided pollingInterval (".concat(options.pollingInterval, ") is under lower bound (200ms), using default of 1000ms")); + } + } else { + this.pollingInterval = parsedPollingInterval; + } + + this.expiredTokenExhaustion = this.setConnectionStatusFallback(ConnectionStatus.ExpiredToken, ConnectionStatus.FailedToConnect, 5); + this.activity$ = (this.webSocket ? this.webSocketActivity$() : this.pollingGetActivity$()).share(); + } // Every time we're about to make a Direct Line REST call, we call this first to see check the current connection status. + // Either throws an error (indicating an error state) or emits a null, indicating a (presumably) healthy connection + + + (0, _createClass2["default"])(DirectLine, [{ + key: "checkConnection", + value: function checkConnection() { + var _this = this; + + var once = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var obs = this.connectionStatus$.flatMap(function (connectionStatus) { + if (connectionStatus === ConnectionStatus.Uninitialized) { + _this.connectionStatus$.next(ConnectionStatus.Connecting); //if token and streamUrl are defined it means reconnect has already been done. Skipping it. + + + if (_this.token && _this.streamUrl) { + _this.connectionStatus$.next(ConnectionStatus.Online); + + return _Observable.Observable.of(connectionStatus); + } else { + return _this.startConversation()["do"](function (conversation) { + _this.conversationId = conversation.conversationId; + _this.token = _this.secret || conversation.token; + _this.streamUrl = conversation.streamUrl; + _this.referenceGrammarId = conversation.referenceGrammarId; + if (!_this.secret) _this.refreshTokenLoop(); + + _this.connectionStatus$.next(ConnectionStatus.Online); + }, function (error) { + _this.connectionStatus$.next(ConnectionStatus.FailedToConnect); + }).map(function (_) { + return connectionStatus; + }); + } + } else { + return _Observable.Observable.of(connectionStatus); + } + }).filter(function (connectionStatus) { + return connectionStatus != ConnectionStatus.Uninitialized && connectionStatus != ConnectionStatus.Connecting; + }).flatMap(function (connectionStatus) { + switch (connectionStatus) { + case ConnectionStatus.Ended: + return _Observable.Observable["throw"](errorConversationEnded); + + case ConnectionStatus.FailedToConnect: + return _Observable.Observable["throw"](errorFailedToConnect); + + case ConnectionStatus.ExpiredToken: + return _Observable.Observable.of(connectionStatus); + + default: + return _Observable.Observable.of(connectionStatus); + } + }); + return once ? obs.take(1) : obs; + } + }, { + key: "setConnectionStatusFallback", + value: function setConnectionStatusFallback(connectionStatusFrom, connectionStatusTo) { + var maxAttempts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5; + maxAttempts--; + var attempts = 0; + var currStatus = null; + return function (status) { + if (status === connectionStatusFrom && currStatus === status && attempts >= maxAttempts) { + attempts = 0; + return connectionStatusTo; + } + + attempts++; + currStatus = status; + return status; + }; + } + }, { + key: "expiredToken", + value: function expiredToken() { + var connectionStatus = this.connectionStatus$.getValue(); + if (connectionStatus != ConnectionStatus.Ended && connectionStatus != ConnectionStatus.FailedToConnect) this.connectionStatus$.next(ConnectionStatus.ExpiredToken); + var protectedConnectionStatus = this.expiredTokenExhaustion(this.connectionStatus$.getValue()); + this.connectionStatus$.next(protectedConnectionStatus); + } + }, { + key: "startConversation", + value: function startConversation() { + //if conversationid is set here, it means we need to call the reconnect api, else it is a new conversation + var url = this.conversationId ? "".concat(this.domain, "/conversations/").concat(this.conversationId, "?watermark=").concat(this.watermark) : "".concat(this.domain, "/conversations"); + var method = this.conversationId ? "GET" : "POST"; + return _Observable.Observable.ajax({ + method: method, + url: url, + timeout: timeout, + headers: _objectSpread({ + "Accept": "application/json" + }, this.commonHeaders()) + }) // .do(ajaxResponse => konsole.log("conversation ajaxResponse", ajaxResponse.response)) + .map(function (ajaxResponse) { + return ajaxResponse.response; + }).retryWhen(function (error$) { + return (// for now we deem 4xx and 5xx errors as unrecoverable + // for everything else (timeouts), retry for a while + error$.mergeMap(function (error) { + return error.status >= 400 && error.status < 600 ? _Observable.Observable["throw"](error) : _Observable.Observable.of(error); + }).delay(timeout).take(retries) + ); + }); + } + }, { + key: "refreshTokenLoop", + value: function refreshTokenLoop() { + var _this2 = this; + + this.tokenRefreshSubscription = _Observable.Observable.interval(intervalRefreshToken).flatMap(function (_) { + return _this2.refreshToken(); + }).subscribe(function (token) { + konsole.log("refreshing token", token, "at", new Date()); + _this2.token = token; + }); + } + }, { + key: "refreshToken", + value: function refreshToken() { + var _this3 = this; + + return this.checkConnection(true).flatMap(function (_) { + return _Observable.Observable.ajax({ + method: "POST", + url: "".concat(_this3.domain, "/tokens/refresh"), + timeout: timeout, + headers: _objectSpread({}, _this3.commonHeaders()) + }).map(function (ajaxResponse) { + return ajaxResponse.response.token; + }).retryWhen(function (error$) { + return error$.mergeMap(function (error) { + if (error.status === 403) { + // if the token is expired there's no reason to keep trying + _this3.expiredToken(); + + return _Observable.Observable["throw"](error); + } else if (error.status === 404) { + // If the bot is gone, we should stop retrying + return _Observable.Observable["throw"](error); + } + + return _Observable.Observable.of(error); + }).delay(timeout).take(retries); + }); + }); + } + }, { + key: "reconnect", + value: function reconnect(conversation) { + this.token = conversation.token; + this.streamUrl = conversation.streamUrl; + if (this.connectionStatus$.getValue() === ConnectionStatus.ExpiredToken) this.connectionStatus$.next(ConnectionStatus.Online); + } + }, { + key: "end", + value: function end() { + if (this.tokenRefreshSubscription) this.tokenRefreshSubscription.unsubscribe(); + + try { + this.connectionStatus$.next(ConnectionStatus.Ended); + } catch (e) { + if (e === errorConversationEnded) return; + throw e; + } + } + }, { + key: "getSessionId", + value: function getSessionId() { + var _this4 = this; + + // If we're not connected to the bot, get connected + // Will throw an error if we are not connected + konsole.log("getSessionId"); + return this.checkConnection(true).flatMap(function (_) { + return _Observable.Observable.ajax({ + method: "GET", + url: "".concat(_this4.domain, "/session/getsessionid"), + withCredentials: true, + timeout: timeout, + headers: _objectSpread({ + "Content-Type": "application/json" + }, _this4.commonHeaders()) + }).map(function (ajaxResponse) { + if (ajaxResponse && ajaxResponse.response && ajaxResponse.response.sessionId) { + konsole.log("getSessionId response: " + ajaxResponse.response.sessionId); + return ajaxResponse.response.sessionId; + } + + return ''; + })["catch"](function (error) { + konsole.log("getSessionId error: " + error.status); + return _Observable.Observable.of(''); + }); + })["catch"](function (error) { + return _this4.catchExpiredToken(error); + }); + } + }, { + key: "postActivity", + value: function postActivity(activity) { + var _this5 = this; + + // Use postMessageWithAttachments for messages with attachments that are local files (e.g. an image to upload) + // Technically we could use it for *all* activities, but postActivity is much lighter weight + // So, since WebChat is partially a reference implementation of Direct Line, we implement both. + if (activity.type === "message" && activity.attachments && activity.attachments.length > 0) return this.postMessageWithAttachments(activity); // If we're not connected to the bot, get connected + // Will throw an error if we are not connected + + konsole.log("postActivity", activity); + return this.checkConnection(true).flatMap(function (_) { + return _Observable.Observable.ajax({ + method: "POST", + url: "".concat(_this5.domain, "/conversations/").concat(_this5.conversationId, "/activities"), + body: activity, + timeout: timeout, + headers: _objectSpread({ + "Content-Type": "application/json" + }, _this5.commonHeaders()) + }).map(function (ajaxResponse) { + return ajaxResponse.response.id; + })["catch"](function (error) { + return _this5.catchPostError(error); + }); + })["catch"](function (error) { + return _this5.catchExpiredToken(error); + }); + } + }, { + key: "postMessageWithAttachments", + value: function postMessageWithAttachments(_ref) { + var _this6 = this; + + var attachments = _ref.attachments, + messageWithoutAttachments = (0, _objectWithoutProperties2["default"])(_ref, ["attachments"]); + var formData; // If we're not connected to the bot, get connected + // Will throw an error if we are not connected + + return this.checkConnection(true).flatMap(function (_) { + // To send this message to DirectLine we need to deconstruct it into a "template" activity + // and one blob for each attachment. + formData = new FormData(); + formData.append('activity', new Blob([JSON.stringify(messageWithoutAttachments)], { + type: 'application/vnd.microsoft.activity' + })); + return _Observable.Observable.from(attachments || []).flatMap(function (media) { + return _Observable.Observable.ajax({ + method: "GET", + url: media.contentUrl, + responseType: 'arraybuffer' + })["do"](function (ajaxResponse) { + return formData.append('file', new Blob([ajaxResponse.response], { + type: media.contentType + }), media.name); + }); + }).count(); + }).flatMap(function (_) { + return _Observable.Observable.ajax({ + method: "POST", + url: "".concat(_this6.domain, "/conversations/").concat(_this6.conversationId, "/upload?userId=").concat(messageWithoutAttachments.from.id), + body: formData, + timeout: timeout, + headers: _objectSpread({}, _this6.commonHeaders()) + }).map(function (ajaxResponse) { + return ajaxResponse.response.id; + })["catch"](function (error) { + return _this6.catchPostError(error); + }); + })["catch"](function (error) { + return _this6.catchPostError(error); + }); + } + }, { + key: "catchPostError", + value: function catchPostError(error) { + if (error.status === 403) // token has expired (will fall through to return "retry") + this.expiredToken();else if (error.status >= 400 && error.status < 500) // more unrecoverable errors + return _Observable.Observable["throw"](error); + return _Observable.Observable.of("retry"); + } + }, { + key: "catchExpiredToken", + value: function catchExpiredToken(error) { + return error === errorExpiredToken ? _Observable.Observable.of("retry") : _Observable.Observable["throw"](error); + } + }, { + key: "pollingGetActivity$", + value: function pollingGetActivity$() { + var _this7 = this; + + var poller$ = _Observable.Observable.create(function (subscriber) { + // A BehaviorSubject to trigger polling. Since it is a BehaviorSubject + // the first event is produced immediately. + var trigger$ = new _BehaviorSubject.BehaviorSubject({}); + trigger$.subscribe(function () { + if (_this7.connectionStatus$.getValue() === ConnectionStatus.Online) { + var startTimestamp = Date.now(); + + _Observable.Observable.ajax({ + headers: _objectSpread({ + Accept: 'application/json' + }, _this7.commonHeaders()), + method: 'GET', + url: "".concat(_this7.domain, "/conversations/").concat(_this7.conversationId, "/activities?watermark=").concat(_this7.watermark), + timeout: timeout + }).subscribe(function (result) { + subscriber.next(result); + setTimeout(function () { + return trigger$.next(null); + }, Math.max(0, _this7.pollingInterval - Date.now() + startTimestamp)); + }, function (error) { + switch (error.status) { + case 403: + _this7.connectionStatus$.next(ConnectionStatus.ExpiredToken); + + setTimeout(function () { + return trigger$.next(null); + }, _this7.pollingInterval); + break; + + case 404: + _this7.connectionStatus$.next(ConnectionStatus.Ended); + + break; + + default: + // propagate the error + subscriber.error(error); + break; + } + }); + } + }); + }); + + return this.checkConnection().flatMap(function (_) { + return poller$["catch"](function () { + return _Observable.Observable.empty(); + }).map(function (ajaxResponse) { + return ajaxResponse.response; + }).flatMap(function (activityGroup) { + return _this7.observableFromActivityGroup(activityGroup); + }); + }); + } + }, { + key: "observableFromActivityGroup", + value: function observableFromActivityGroup(activityGroup) { + if (activityGroup.watermark) this.watermark = activityGroup.watermark; + return _Observable.Observable.from(activityGroup.activities); + } + }, { + key: "webSocketActivity$", + value: function webSocketActivity$() { + var _this8 = this; + + return this.checkConnection().flatMap(function (_) { + return _this8.observableWebSocket() // WebSockets can be closed by the server or the browser. In the former case we need to + // retrieve a new streamUrl. In the latter case we could first retry with the current streamUrl, + // but it's simpler just to always fetch a new one. + .retryWhen(function (error$) { + return error$.delay(_this8.getRetryDelay()).mergeMap(function (error) { + return _this8.reconnectToConversation(); + }); + }); + }).flatMap(function (activityGroup) { + return _this8.observableFromActivityGroup(activityGroup); + }); + } // Returns the delay duration in milliseconds + + }, { + key: "getRetryDelay", + value: function getRetryDelay() { + return Math.floor(3000 + Math.random() * 12000); + } // Originally we used Observable.webSocket, but it's fairly opionated and I ended up writing + // a lot of code to work around their implemention details. Since WebChat is meant to be a reference + // implementation, I decided roll the below, where the logic is more purposeful. - @billba + + }, { + key: "observableWebSocket", + value: function observableWebSocket() { + var _this9 = this; + + return _Observable.Observable.create(function (subscriber) { + konsole.log("creating WebSocket", _this9.streamUrl); + var ws = new WebSocket(_this9.streamUrl); + var sub; + + ws.onopen = function (open) { + konsole.log("WebSocket open", open); // Chrome is pretty bad at noticing when a WebSocket connection is broken. + // If we periodically ping the server with empty messages, it helps Chrome + // realize when connection breaks, and close the socket. We then throw an + // error, and that give us the opportunity to attempt to reconnect. + + sub = _Observable.Observable.interval(timeout).subscribe(function (_) { + try { + ws.send(""); + } catch (e) { + konsole.log("Ping error", e); + } + }); + }; + + ws.onclose = function (close) { + konsole.log("WebSocket close", close); + if (sub) sub.unsubscribe(); + subscriber.error(close); + }; + + ws.onmessage = function (message) { + return message.data && subscriber.next(JSON.parse(message.data)); + }; // This is the 'unsubscribe' method, which is called when this observable is disposed. + // When the WebSocket closes itself, we throw an error, and this function is eventually called. + // When the observable is closed first (e.g. when tearing down a WebChat instance) then + // we need to manually close the WebSocket. + + + return function () { + if (ws.readyState === 0 || ws.readyState === 1) ws.close(); + }; + }); + } + }, { + key: "reconnectToConversation", + value: function reconnectToConversation() { + var _this10 = this; + + return this.checkConnection(true).flatMap(function (_) { + return _Observable.Observable.ajax({ + method: "GET", + url: "".concat(_this10.domain, "/conversations/").concat(_this10.conversationId, "?watermark=").concat(_this10.watermark), + timeout: timeout, + headers: _objectSpread({ + "Accept": "application/json" + }, _this10.commonHeaders()) + })["do"](function (result) { + if (!_this10.secret) _this10.token = result.response.token; + _this10.streamUrl = result.response.streamUrl; + }).map(function (_) { + return null; + }).retryWhen(function (error$) { + return error$.mergeMap(function (error) { + if (error.status === 403) { + // token has expired. We can't recover from this here, but the embedding + // website might eventually call reconnect() with a new token and streamUrl. + _this10.expiredToken(); + } else if (error.status === 404) { + return _Observable.Observable["throw"](errorConversationEnded); + } + + return _Observable.Observable.of(error); + }).delay(timeout).take(retries); + }); + }); + } + }, { + key: "commonHeaders", + value: function commonHeaders() { + return { + "Authorization": "Bearer ".concat(this.token), + "x-ms-bot-agent": this._botAgent + }; + } + }, { + key: "getBotAgent", + value: function getBotAgent() { + var customAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var clientAgent = 'directlinejs'; + + if (customAgent) { + clientAgent += "; ".concat(customAgent); + } + + return "".concat(DIRECT_LINE_VERSION, " (").concat(clientAgent, ")"); + } + }]); + return DirectLine; +}(); + +exports.DirectLine = DirectLine; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJDb25uZWN0aW9uU3RhdHVzIiwibGlmZXRpbWVSZWZyZXNoVG9rZW4iLCJpbnRlcnZhbFJlZnJlc2hUb2tlbiIsInRpbWVvdXQiLCJyZXRyaWVzIiwiUE9MTElOR19JTlRFUlZBTF9MT1dFUl9CT1VORCIsImVycm9yRXhwaXJlZFRva2VuIiwiRXJyb3IiLCJlcnJvckNvbnZlcnNhdGlvbkVuZGVkIiwiZXJyb3JGYWlsZWRUb0Nvbm5lY3QiLCJrb25zb2xlIiwibG9nIiwibWVzc2FnZSIsIm9wdGlvbmFsUGFyYW1zIiwid2luZG93IiwiY29uc29sZSIsIkRpcmVjdExpbmUiLCJvcHRpb25zIiwiQmVoYXZpb3JTdWJqZWN0IiwiVW5pbml0aWFsaXplZCIsInNlY3JldCIsInRva2VuIiwid2ViU29ja2V0IiwidW5kZWZpbmVkIiwiV2ViU29ja2V0IiwiZG9tYWluIiwiY29udmVyc2F0aW9uSWQiLCJ3YXRlcm1hcmsiLCJzdHJlYW1VcmwiLCJ3YXJuIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInBhcnNlZFBvbGxpbmdJbnRlcnZhbCIsInBvbGxpbmdJbnRlcnZhbCIsImV4cGlyZWRUb2tlbkV4aGF1c3Rpb24iLCJzZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2siLCJFeHBpcmVkVG9rZW4iLCJGYWlsZWRUb0Nvbm5lY3QiLCJhY3Rpdml0eSQiLCJ3ZWJTb2NrZXRBY3Rpdml0eSQiLCJwb2xsaW5nR2V0QWN0aXZpdHkkIiwic2hhcmUiLCJvbmNlIiwib2JzIiwiY29ubmVjdGlvblN0YXR1cyQiLCJmbGF0TWFwIiwiY29ubmVjdGlvblN0YXR1cyIsIm5leHQiLCJDb25uZWN0aW5nIiwiT25saW5lIiwiT2JzZXJ2YWJsZSIsIm9mIiwic3RhcnRDb252ZXJzYXRpb24iLCJjb252ZXJzYXRpb24iLCJyZWZlcmVuY2VHcmFtbWFySWQiLCJyZWZyZXNoVG9rZW5Mb29wIiwiZXJyb3IiLCJtYXAiLCJfIiwiZmlsdGVyIiwiRW5kZWQiLCJ0YWtlIiwiY29ubmVjdGlvblN0YXR1c0Zyb20iLCJjb25uZWN0aW9uU3RhdHVzVG8iLCJtYXhBdHRlbXB0cyIsImF0dGVtcHRzIiwiY3VyclN0YXR1cyIsInN0YXR1cyIsImdldFZhbHVlIiwicHJvdGVjdGVkQ29ubmVjdGlvblN0YXR1cyIsInVybCIsIm1ldGhvZCIsImFqYXgiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsImFqYXhSZXNwb25zZSIsInJlc3BvbnNlIiwicmV0cnlXaGVuIiwiZXJyb3IkIiwibWVyZ2VNYXAiLCJkZWxheSIsInRva2VuUmVmcmVzaFN1YnNjcmlwdGlvbiIsImludGVydmFsIiwicmVmcmVzaFRva2VuIiwic3Vic2NyaWJlIiwiRGF0ZSIsImNoZWNrQ29ubmVjdGlvbiIsImV4cGlyZWRUb2tlbiIsInVuc3Vic2NyaWJlIiwiZSIsIndpdGhDcmVkZW50aWFscyIsInNlc3Npb25JZCIsImNhdGNoRXhwaXJlZFRva2VuIiwiYWN0aXZpdHkiLCJ0eXBlIiwiYXR0YWNobWVudHMiLCJsZW5ndGgiLCJwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyIsImJvZHkiLCJpZCIsImNhdGNoUG9zdEVycm9yIiwibWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJCbG9iIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb20iLCJtZWRpYSIsImNvbnRlbnRVcmwiLCJyZXNwb25zZVR5cGUiLCJjb250ZW50VHlwZSIsIm5hbWUiLCJjb3VudCIsInBvbGxlciQiLCJjcmVhdGUiLCJzdWJzY3JpYmVyIiwidHJpZ2dlciQiLCJzdGFydFRpbWVzdGFtcCIsIm5vdyIsIkFjY2VwdCIsInJlc3VsdCIsInNldFRpbWVvdXQiLCJNYXRoIiwibWF4IiwiZW1wdHkiLCJhY3Rpdml0eUdyb3VwIiwib2JzZXJ2YWJsZUZyb21BY3Rpdml0eUdyb3VwIiwiYWN0aXZpdGllcyIsIm9ic2VydmFibGVXZWJTb2NrZXQiLCJnZXRSZXRyeURlbGF5IiwicmVjb25uZWN0VG9Db252ZXJzYXRpb24iLCJmbG9vciIsInJhbmRvbSIsIndzIiwic3ViIiwib25vcGVuIiwib3BlbiIsInNlbmQiLCJvbmNsb3NlIiwiY2xvc2UiLCJvbm1lc3NhZ2UiLCJkYXRhIiwicGFyc2UiLCJyZWFkeVN0YXRlIiwiY3VzdG9tQWdlbnQiLCJjbGllbnRBZ2VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsbUJBQW1CLEdBQUcsZ0JBQTVCO0FBdVRBO0lBRVlDLGdCOzs7V0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7R0FBQUEsZ0IsZ0NBQUFBLGdCOztBQXNCWixJQUFNQyxvQkFBb0IsR0FBRyxLQUFLLEVBQUwsR0FBVSxJQUF2QztBQUNBLElBQU1DLG9CQUFvQixHQUFHRCxvQkFBb0IsR0FBRyxDQUFwRDtBQUNBLElBQU1FLE9BQU8sR0FBRyxLQUFLLElBQXJCO0FBQ0EsSUFBTUMsT0FBTyxHQUFHLENBQUNILG9CQUFvQixHQUFHQyxvQkFBeEIsSUFBZ0RDLE9BQWhFO0FBRUEsSUFBTUUsNEJBQW9DLEdBQUcsR0FBN0MsQyxDQUFrRDs7QUFFbEQsSUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsS0FBSixDQUFVLGVBQVYsQ0FBMUI7QUFDQSxJQUFNQyxzQkFBc0IsR0FBRyxJQUFJRCxLQUFKLENBQVUsb0JBQVYsQ0FBL0I7QUFDQSxJ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QVcsZ0JBQVNELFdBQVQsQ0FBWDtBQUNIOztBQUVELHVCQUFVcEosbUJBQVYsZUFBa0NxSixXQUFsQztBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW4gb3JkZXIgdG8ga2VlcCBmaWxlIHNpemUgZG93biwgb25seSBpbXBvcnQgdGhlIHBhcnRzIG9mIHJ4anMgdGhhdCB3ZSB1c2VcblxuaW1wb3J0IHsgQWpheFJlc3BvbnNlLCBBamF4UmVxdWVzdCB9IGZyb20gJ3J4anMvb2JzZXJ2YWJsZS9kb20vQWpheE9ic2VydmFibGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMvU3Vic2NyaXB0aW9uJztcblxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9jYXRjaCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL2NvbWJpbmVMYXRlc3QnO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9jb3VudCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL2RlbGF5JztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvZG8nO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9maWx0ZXInO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tZXJnZU1hcCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL3JldHJ5V2hlbic7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL3NoYXJlJztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvdGFrZSc7XG5cbmltcG9ydCAncnhqcy9hZGQvb2JzZXJ2YWJsZS9kb20vYWpheCc7XG5pbXBvcnQgJ3J4anMvYWRkL29ic2VydmFibGUvZW1wdHknO1xuaW1wb3J0ICdyeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb20nO1xuaW1wb3J0ICdyeGpzL2FkZC9vYnNlcnZhYmxlL2ludGVydmFsJztcbmltcG9ydCAncnhqcy9hZGQvb2JzZXJ2YWJsZS9vZic7XG5pbXBvcnQgJ3J4anMvYWRkL29ic2VydmFibGUvdGhyb3cnO1xuXG5jb25zdCBESVJFQ1RfTElORV9WRVJTSU9OID0gJ0RpcmVjdExpbmUvMy4wJztcblxuZGVjbGFyZSB2YXIgcHJvY2Vzczoge1xuICAgIGFyY2g6IHN0cmluZztcbiAgICBlbnY6IHtcbiAgICAgICAgVkVSU0lPTjogc3RyaW5nO1xuICAgIH07XG4gICAgcGxhdGZvcm06IHN0cmluZztcbiAgICByZWxlYXNlOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxuLy8gRGlyZWN0IExpbmUgMy4wIHR5cGVzXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uIHtcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgZVRhZz86IHN0cmluZyxcbiAgICBzdHJlYW1Vcmw/OiBzdHJpbmcsXG4gICAgcmVmZXJlbmNlR3JhbW1hcklkPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIE1lZGlhVHlwZSA9IFwiaW1hZ2UvcG5nXCIgfCBcImltYWdlL2pwZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL2dpZlwiIHwgXCJpbWFnZS9zdmcreG1sXCIgfCBcImF1ZGlvL21wZWdcIiB8IFwiYXVkaW8vbXA0XCIgfCBcInZpZGVvL21wNFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhIHtcbiAgICBjb250ZW50VHlwZTogTWVkaWFUeXBlLFxuICAgIGNvbnRlbnRVcmw6IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHRodW1ibmFpbFVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVua25vd25NZWRpYXtcbiAgICBjb250ZW50VHlwZTogc3RyaW5nLFxuICAgIGNvbnRlbnRVcmw6IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHRodW1ibmFpbFVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDYXJkQWN0aW9uVHlwZXMgPSBcImNhbGxcIiB8IFwiZG93bmxvYWRGaWxlXCJ8IFwiaW1CYWNrXCIgfCBcIm1lc3NhZ2VCYWNrXCIgfCBcIm9wZW5VcmxcIiB8IFwicGxheUF1ZGlvXCIgfCBcInBsYXlWaWRlb1wiIHwgXCJwb3N0QmFja1wiIHwgXCJzaWduaW5cIiB8IFwic2hvd0ltYWdlXCI7XG5cbmV4cG9ydCB0eXBlIENhcmRBY3Rpb24gPSBDYWxsQ2FyZEFjdGlvbiB8IERvd25sb2FkRmlsZUNhcmRBY3Rpb24gfCBJTUJhY2tDYXJkQWN0aW9uIHwgTWVzc2FnZUJhY2tDYXJkQWN0aW9uIHwgT3BlblVSTENhcmRBY3Rpb24gfCBQbGF5QXVkaW9DYXJkQWN0aW9uIHwgUGxheVZpZGVvQ2FyZEFjdGlvbiB8IFBvc3RCYWNrQ2FyZEFjdGlvbiB8IFNpZ25JbkNhcmRBY3Rpb24gfCBTaG93SW1hZ2VDYXJkQWN0aW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwiY2FsbFwiLFxuICAgIHZhbHVlOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb3dubG9hZEZpbGVDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwiZG93bmxvYWRGaWxlXCIsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNQmFja0NhcmRBY3Rpb24ge1xuICAgIGltYWdlPzogc3RyaW5nLFxuICAgIHRpdGxlPzogc3RyaW5nLFxuICAgIHR5cGU6IFwiaW1CYWNrXCIsXG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlQmFja0NhcmRBY3Rpb24gPSBNZXNzYWdlQmFja1dpdGhJbWFnZSB8IE1lc3NhZ2VCYWNrV2l0aFRpdGxlXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUJhY2tXaXRoSW1hZ2Uge1xuICAgIGRpc3BsYXlUZXh0Pzogc3RyaW5nLFxuICAgIGltYWdlOiBzdHJpbmcsXG4gICAgdGV4dD86IHN0cmluZyxcbiAgICB0aXRsZT86IHN0cmluZyxcbiAgICB0eXBlOiBcIm1lc3NhZ2VCYWNrXCIsXG4gICAgdmFsdWU/OiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQmFja1dpdGhUaXRsZSB7XG4gICAgZGlzcGxheVRleHQ/OiBzdHJpbmcsXG4gICAgaW1hZ2U/OiBzdHJpbmcsXG4gICAgdGV4dD86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwibWVzc2FnZUJhY2tcIixcbiAgICB2YWx1ZT86IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5VUkxDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwib3BlblVybFwiLFxuICAgIHZhbHVlOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5QXVkaW9DYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwicGxheUF1ZGlvXCIsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlWaWRlb0NhcmRBY3Rpb24ge1xuICAgIGltYWdlPzogc3RyaW5nLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgdHlwZTogXCJwbGF5VmlkZW9cIixcbiAgICB2YWx1ZTogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdEJhY2tDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZT86IHN0cmluZyxcbiAgICB0eXBlOiBcInBvc3RCYWNrXCIsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNob3dJbWFnZUNhcmRBY3Rpb24ge1xuICAgIGltYWdlPzogc3RyaW5nLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgdHlwZTogXCJzaG93SW1hZ2VcIixcbiAgICB2YWx1ZTogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluQ2FyZEFjdGlvbiB7XG4gICAgaW1hZ2U/OiBzdHJpbmcsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICB0eXBlOiBcInNpZ25pblwiLFxuICAgIHZhbHVlOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJkSW1hZ2Uge1xuICAgIGFsdD86IHN0cmluZyxcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YXA/OiBDYXJkQWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVyb0NhcmQge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5oZXJvXCIsXG4gICAgY29udGVudDoge1xuICAgICAgICB0aXRsZT86IHN0cmluZyxcbiAgICAgICAgc3VidGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHRleHQ/OiBzdHJpbmcsXG4gICAgICAgIGltYWdlcz86IENhcmRJbWFnZVtdLFxuICAgICAgICBidXR0b25zPzogQ2FyZEFjdGlvbltdLFxuICAgICAgICB0YXA/OiBDYXJkQWN0aW9uXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRodW1ibmFpbCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLnRodW1ibmFpbFwiLFxuICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHN1YnRpdGxlPzogc3RyaW5nLFxuICAgICAgICB0ZXh0Pzogc3RyaW5nLFxuICAgICAgICBpbWFnZXM/OiBDYXJkSW1hZ2VbXSxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXSxcbiAgICAgICAgdGFwPzogQ2FyZEFjdGlvblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduaW4ge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5zaWduaW5cIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRleHQ/OiBzdHJpbmcsXG4gICAgICAgIGJ1dHRvbnM/OiBDYXJkQWN0aW9uW11cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGgge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5vYXV0aFwiLFxuICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgY29ubmVjdGlvbm5hbWU6IHN0cmluZyxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXVxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNlaXB0SXRlbSB7XG4gICAgdGl0bGU/OiBzdHJpbmcsXG4gICAgc3VidGl0bGU/OiBzdHJpbmcsXG4gICAgdGV4dD86IHN0cmluZyxcbiAgICBpbWFnZT86IENhcmRJbWFnZSxcbiAgICBwcmljZT86IHN0cmluZyxcbiAgICBxdWFudGl0eT86IHN0cmluZyxcbiAgICB0YXA/OiBDYXJkQWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjZWlwdCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLnJlY2VpcHRcIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBmYWN0cz86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfVtdLFxuICAgICAgICBpdGVtcz86IFJlY2VpcHRJdGVtW10sXG4gICAgICAgIHRhcD86IENhcmRBY3Rpb24sXG4gICAgICAgIHRheD86IHN0cmluZyxcbiAgICAgICAgdmF0Pzogc3RyaW5nLFxuICAgICAgICB0b3RhbD86IHN0cmluZyxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXVxuICAgIH1cbn1cblxuLy8gRGVwcmVjYXRlZCBmb3JtYXQgZm9yIFNreXBlIGNoYW5uZWxzLiBGb3IgdGVzdGluZyBsZWdhY3kgYm90cyBpbiBFbXVsYXRvciBvbmx5LlxuZXhwb3J0IGludGVyZmFjZSBGbGV4Q2FyZCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLmZsZXhcIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBzdWJ0aXRsZT86IHN0cmluZyxcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgaW1hZ2VzPzogQ2FyZEltYWdlW10sXG4gICAgICAgIGJ1dHRvbnM/OiBDYXJkQWN0aW9uW10sXG4gICAgICAgIGFzcGVjdD86IHN0cmluZ1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0NhcmQge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hdWRpb1wiLFxuICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHN1YnRpdGxlPzogc3RyaW5nLFxuICAgICAgICB0ZXh0Pzogc3RyaW5nLFxuICAgICAgICBtZWRpYT86IHsgdXJsOiBzdHJpbmcsIHByb2ZpbGU/OiBzdHJpbmcgfVtdLFxuICAgICAgICBidXR0b25zPzogQ2FyZEFjdGlvbltdLFxuICAgICAgICBhdXRvbG9vcD86IGJvb2xlYW4sXG4gICAgICAgIGF1dG9zdGFydD86IGJvb2xlYW5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9DYXJkIHtcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmNhcmQudmlkZW9cIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBzdWJ0aXRsZT86IHN0cmluZyxcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgbWVkaWE/OiB7IHVybDogc3RyaW5nLCBwcm9maWxlPzogc3RyaW5nIH1bXSxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXSxcbiAgICAgICAgaW1hZ2U/OiB7IHVybDogc3RyaW5nLCBhbHQ/OiBzdHJpbmcgfSxcbiAgICAgICAgYXV0b2xvb3A/OiBib29sZWFuLFxuICAgICAgICBhdXRvc3RhcnQ/OiBib29sZWFuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0aXZlQ2FyZCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLmFkYXB0aXZlXCIsXG4gICAgY29udGVudDogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkNhcmQge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hbmltYXRpb25cIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBzdWJ0aXRsZT86IHN0cmluZyxcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgbWVkaWE/OiB7IHVybDogc3RyaW5nLCBwcm9maWxlPzogc3RyaW5nIH1bXSxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXSxcbiAgICAgICAgaW1hZ2U/OiB7IHVybDogc3RyaW5nLCBhbHQ/OiBzdHJpbmcgfSxcbiAgICAgICAgYXV0b2xvb3A/OiBib29sZWFuLFxuICAgICAgICBhdXRvc3RhcnQ/OiBib29sZWFuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBLbm93bk1lZGlhID0gTWVkaWEgfCBIZXJvQ2FyZCB8IFRodW1ibmFpbCB8IFNpZ25pbiB8IE9BdXRoIHwgUmVjZWlwdCB8IEF1ZGlvQ2FyZCB8IFZpZGVvQ2FyZCB8IEFuaW1hdGlvbkNhcmQgfCBGbGV4Q2FyZCB8IEFkYXB0aXZlQ2FyZDtcbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnQgPSBLbm93bk1lZGlhIHwgVW5rbm93bk1lZGlhO1xuXG5leHBvcnQgdHlwZSBVc2VyUm9sZSA9IFwiYm90XCIgfCBcImNoYW5uZWxcIiB8IFwidXNlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBpY29uVXJsPzogc3RyaW5nLFxuICAgIHJvbGU/OiBVc2VyUm9sZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBY3Rpdml0eSB7XG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGNoYW5uZWxEYXRhPzogYW55LFxuICAgIGNoYW5uZWxJZD86IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb24/OiB7IGlkOiBzdHJpbmcgfSxcbiAgICBlVGFnPzogc3RyaW5nLFxuICAgIGZyb206IFVzZXIsXG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgdGltZXN0YW1wPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRMYXlvdXQgPSBcImxpc3RcIiB8IFwiY2Fyb3VzZWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIGV4dGVuZHMgSUFjdGl2aXR5IHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICB0ZXh0Pzogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZyxcbiAgICB0ZXh0Rm9ybWF0PzogXCJwbGFpblwiIHwgXCJtYXJrZG93blwiIHwgXCJ4bWxcIixcbiAgICBhdHRhY2htZW50TGF5b3V0PzogQXR0YWNobWVudExheW91dCxcbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRbXSxcbiAgICBlbnRpdGllcz86IGFueVtdLFxuICAgIHN1Z2dlc3RlZEFjdGlvbnM/OiB7IGFjdGlvbnM6IENhcmRBY3Rpb25bXSwgdG8/OiBzdHJpbmdbXSB9LFxuICAgIHNwZWFrPzogc3RyaW5nLFxuICAgIGlucHV0SGludD86IHN0cmluZyxcbiAgICB2YWx1ZT86IG9iamVjdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGluZyBleHRlbmRzIElBY3Rpdml0eSB7XG4gICAgdHlwZTogXCJ0eXBpbmdcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50QWN0aXZpdHkgZXh0ZW5kcyBJQWN0aXZpdHkge1xuICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgdHlwZSBBY3Rpdml0eSA9IE1lc3NhZ2UgfCBUeXBpbmcgfCBFdmVudEFjdGl2aXR5O1xuXG5pbnRlcmZhY2UgQWN0aXZpdHlHcm91cCB7XG4gICAgYWN0aXZpdGllczogQWN0aXZpdHlbXSxcbiAgICB3YXRlcm1hcms6IHN0cmluZ1xufVxuXG4vLyBUaGVzZSB0eXBlcyBhcmUgc3BlY2lmaWMgdG8gdGhpcyBjbGllbnQgbGlicmFyeSwgbm90IHRvIERpcmVjdCBMaW5lIDMuMFxuXG5leHBvcnQgZW51bSBDb25uZWN0aW9uU3RhdHVzIHtcbiAgICBVbmluaXRpYWxpemVkLCAgICAgICAgICAgICAgLy8gdGhlIHN0YXR1cyB3aGVuIHRoZSBEaXJlY3RMaW5lIG9iamVjdCBpcyBmaXJzdCBjcmVhdGVkL2NvbnN0cnVjdGVkXG4gICAgQ29ubmVjdGluZywgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgY29udmVyc2F0aW9uXG4gICAgT25saW5lLCAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gdGhlIGNvbnZlcnN0YWlvbi4gQ29ubmVjdGlvbiBpcyBoZWFsdGh5IHNvIGZhciBhcyB3ZSBrbm93LlxuICAgIEV4cGlyZWRUb2tlbiwgICAgICAgICAgICAgICAvLyBsYXN0IG9wZXJhdGlvbiBlcnJvcmVkIG91dCB3aXRoIGFuIGV4cGlyZWQgdG9rZW4uIFBvc3NpYmx5IHdhaXRpbmcgZm9yIHNvbWVvbmUgdG8gc3VwcGx5IGEgbmV3IG9uZS5cbiAgICBGYWlsZWRUb0Nvbm5lY3QsICAgICAgICAgICAgLy8gdGhlIGluaXRpYWwgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoZSBjb252ZXJzYXRpb24gZmFpbGVkLiBObyByZWNvdmVyeSBwb3NzaWJsZS5cbiAgICBFbmRlZCAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdCBlbmRlZCB0aGUgY29udmVyc2F0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0TGluZU9wdGlvbnMge1xuICAgIHNlY3JldD86IHN0cmluZyxcbiAgICB0b2tlbj86IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgICB3YXRlcm1hcms/OiBzdHJpbmcsXG4gICAgZG9tYWluPzogc3RyaW5nLFxuICAgIHdlYlNvY2tldD86IGJvb2xlYW4sXG4gICAgcG9sbGluZ0ludGVydmFsPzogbnVtYmVyLFxuICAgIHN0cmVhbVVybD86IHN0cmluZyxcbiAgICAvLyBBdHRhY2hlZCB0byBhbGwgcmVxdWVzdHMgdG8gaWRlbnRpZnkgcmVxdWVzdGluZyBhZ2VudC5cbiAgICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jb25zdCBsaWZldGltZVJlZnJlc2hUb2tlbiA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgaW50ZXJ2YWxSZWZyZXNoVG9rZW4gPSBsaWZldGltZVJlZnJlc2hUb2tlbiAvIDI7XG5jb25zdCB0aW1lb3V0ID0gMjAgKiAxMDAwO1xuY29uc3QgcmV0cmllcyA9IChsaWZldGltZVJlZnJlc2hUb2tlbiAtIGludGVydmFsUmVmcmVzaFRva2VuKSAvIHRpbWVvdXQ7XG5cbmNvbnN0IFBPTExJTkdfSU5URVJWQUxfTE9XRVJfQk9VTkQ6IG51bWJlciA9IDIwMDsgLy9tc1xuXG5jb25zdCBlcnJvckV4cGlyZWRUb2tlbiA9IG5ldyBFcnJvcihcImV4cGlyZWQgdG9rZW5cIik7XG5jb25zdCBlcnJvckNvbnZlcnNhdGlvbkVuZGVkID0gbmV3IEVycm9yKFwiY29udmVyc2F0aW9uIGVuZGVkXCIpO1xuY29uc3QgZXJyb3JGYWlsZWRUb0Nvbm5lY3QgPSBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gY29ubmVjdFwiKTtcblxuY29uc3Qga29uc29sZSA9IHtcbiAgICBsb2c6IChtZXNzYWdlPzogYW55LCAuLi4gb3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAod2luZG93IGFzIGFueSlbXCJib3RjaGF0RGVidWdcIl0gJiYgbWVzc2FnZSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UsIC4uLiBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCb3RDb25uZWN0aW9uIHtcbiAgICBjb25uZWN0aW9uU3RhdHVzJDogQmVoYXZpb3JTdWJqZWN0PENvbm5lY3Rpb25TdGF0dXM+LFxuICAgIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT4sXG4gICAgZW5kKCk6IHZvaWQsXG4gICAgcmVmZXJlbmNlR3JhbW1hcklkPzogc3RyaW5nLFxuICAgIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpOiBPYnNlcnZhYmxlPHN0cmluZz4sXG4gICAgZ2V0U2Vzc2lvbklkPyA6ICgpID0+IE9ic2VydmFibGU8c3RyaW5nPlxufVxuXG5leHBvcnQgY2xhc3MgRGlyZWN0TGluZSBpbXBsZW1lbnRzIElCb3RDb25uZWN0aW9uIHtcbiAgICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gICAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgICBwcml2YXRlIGRvbWFpbiA9IFwiaHR0cHM6Ly9kaXJlY3RsaW5lLmJvdGZyYW1ld29yay5jb20vdjMvZGlyZWN0bGluZVwiO1xuICAgIHByaXZhdGUgd2ViU29ja2V0OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICAgIHByaXZhdGUgZXhwaXJlZFRva2VuRXhoYXVzdGlvbjogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBzZWNyZXQ6IHN0cmluZztcbiAgICBwcml2YXRlIHRva2VuOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB3YXRlcm1hcmsgPSAnJztcbiAgICBwcml2YXRlIHN0cmVhbVVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2JvdEFnZW50ID0gJyc7XG4gICAgcHJpdmF0ZSBfdXNlckFnZW50OiBzdHJpbmc7XG4gICAgcHVibGljIHJlZmVyZW5jZUdyYW1tYXJJZDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBwb2xsaW5nSW50ZXJ2YWw6IG51bWJlciA9IDEwMDA7IC8vbXNcblxuICAgIHByaXZhdGUgdG9rZW5SZWZyZXNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNlY3JldCA9IG9wdGlvbnMuc2VjcmV0O1xuICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucy5zZWNyZXQgfHwgb3B0aW9ucy50b2tlbjtcbiAgICAgICAgdGhpcy53ZWJTb2NrZXQgPSAob3B0aW9ucy53ZWJTb2NrZXQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLndlYlNvY2tldCkgJiYgdHlwZW9mIFdlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcgJiYgV2ViU29ja2V0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZG9tYWluKSB7XG4gICAgICAgICAgICB0aGlzLmRvbWFpbiA9IG9wdGlvbnMuZG9tYWluO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBvcHRpb25zLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMud2F0ZXJtYXJrKSB7XG4gICAgICAgICAgICB0aGlzLndhdGVybWFyayA9ICBvcHRpb25zLndhdGVybWFyaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmVhbVVybCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudG9rZW4gJiYgb3B0aW9ucy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtVXJsID0gb3B0aW9ucy5zdHJlYW1Vcmw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRGlyZWN0TGluZUpTOiBzdHJlYW1Vcmwgd2FzIGlnbm9yZWQ6IHlvdSBuZWVkIHRvIHByb3ZpZGUgYSB0b2tlbiBhbmQgYSBjb252ZXJzYXRpb25pZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYm90QWdlbnQgPSB0aGlzLmdldEJvdEFnZW50KG9wdGlvbnMuYm90QWdlbnQpO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFBvbGxpbmdJbnRlcnZhbCA9IH5+b3B0aW9ucy5wb2xsaW5nSW50ZXJ2YWw7XG5cbiAgICAgICAgaWYgKHBhcnNlZFBvbGxpbmdJbnRlcnZhbCA8IFBPTExJTkdfSU5URVJWQUxfTE9XRVJfQk9VTkQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wb2xsaW5nSW50ZXJ2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBEaXJlY3RMaW5lSlM6IHByb3ZpZGVkIHBvbGxpbmdJbnRlcnZhbCAoJHsgb3B0aW9ucy5wb2xsaW5nSW50ZXJ2YWwgfSkgaXMgdW5kZXIgbG93ZXIgYm91bmQgKDIwMG1zKSwgdXNpbmcgZGVmYXVsdCBvZiAxMDAwbXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9sbGluZ0ludGVydmFsID0gcGFyc2VkUG9sbGluZ0ludGVydmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBpcmVkVG9rZW5FeGhhdXN0aW9uID0gdGhpcy5zZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2soXG4gICAgICAgICAgICBDb25uZWN0aW9uU3RhdHVzLkV4cGlyZWRUb2tlbixcbiAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0LFxuICAgICAgICAgICAgNVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuYWN0aXZpdHkkID0gKHRoaXMud2ViU29ja2V0XG4gICAgICAgICAgICA/IHRoaXMud2ViU29ja2V0QWN0aXZpdHkkKClcbiAgICAgICAgICAgIDogdGhpcy5wb2xsaW5nR2V0QWN0aXZpdHkkKClcbiAgICAgICAgKS5zaGFyZSgpO1xuICAgIH1cblxuICAgIC8vIEV2ZXJ5IHRpbWUgd2UncmUgYWJvdXQgdG8gbWFrZSBhIERpcmVjdCBMaW5lIFJFU1QgY2FsbCwgd2UgY2FsbCB0aGlzIGZpcnN0IHRvIHNlZSBjaGVjayB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXR1cy5cbiAgICAvLyBFaXRoZXIgdGhyb3dzIGFuIGVycm9yIChpbmRpY2F0aW5nIGFuIGVycm9yIHN0YXRlKSBvciBlbWl0cyBhIG51bGwsIGluZGljYXRpbmcgYSAocHJlc3VtYWJseSkgaGVhbHRoeSBjb25uZWN0aW9uXG4gICAgcHJpdmF0ZSBjaGVja0Nvbm5lY3Rpb24ob25jZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBvYnMgPSAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJFxuICAgICAgICAuZmxhdE1hcChjb25uZWN0aW9uU3RhdHVzID0+IHtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uU3RhdHVzID09PSBDb25uZWN0aW9uU3RhdHVzLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcblxuICAgICAgICAgICAgICAgIC8vaWYgdG9rZW4gYW5kIHN0cmVhbVVybCBhcmUgZGVmaW5lZCBpdCBtZWFucyByZWNvbm5lY3QgaGFzIGFscmVhZHkgYmVlbiBkb25lLiBTa2lwcGluZyBpdC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b2tlbiAmJiB0aGlzLnN0cmVhbVVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihjb25uZWN0aW9uU3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydENvbnZlcnNhdGlvbigpLmRvKGNvbnZlcnNhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRoaXMuc2VjcmV0IHx8IGNvbnZlcnNhdGlvbi50b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtVXJsID0gY29udmVyc2F0aW9uLnN0cmVhbVVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlR3JhbW1hcklkID0gY29udmVyc2F0aW9uLnJlZmVyZW5jZUdyYW1tYXJJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWNyZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5Mb29wKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoXyA9PiBjb25uZWN0aW9uU3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihjb25uZWN0aW9uU3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcihjb25uZWN0aW9uU3RhdHVzID0+IGNvbm5lY3Rpb25TdGF0dXMgIT0gQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkICYmIGNvbm5lY3Rpb25TdGF0dXMgIT0gQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKVxuICAgICAgICAuZmxhdE1hcChjb25uZWN0aW9uU3RhdHVzID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoY29ubmVjdGlvblN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXR1cy5FbmRlZDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coZXJyb3JDb252ZXJzYXRpb25FbmRlZCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvckZhaWxlZFRvQ29ubmVjdCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihjb25uZWN0aW9uU3RhdHVzKTtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLm9mKGNvbm5lY3Rpb25TdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBvbmNlID8gb2JzLnRha2UoMSkgOiBvYnM7XG4gICAgfVxuXG4gICAgc2V0Q29ubmVjdGlvblN0YXR1c0ZhbGxiYWNrKFxuICAgICAgICBjb25uZWN0aW9uU3RhdHVzRnJvbTogQ29ubmVjdGlvblN0YXR1cyxcbiAgICAgICAgY29ubmVjdGlvblN0YXR1c1RvOiBDb25uZWN0aW9uU3RhdHVzLFxuICAgICAgICBtYXhBdHRlbXB0cyA9IDVcbiAgICApIHtcbiAgICAgICAgbWF4QXR0ZW1wdHMtLTtcbiAgICAgICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICAgICAgbGV0IGN1cnJTdGF0dXMgPSBudWxsO1xuICAgICAgICByZXR1cm4gKHN0YXR1czogQ29ubmVjdGlvblN0YXR1cyk6IENvbm5lY3Rpb25TdGF0dXMgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gY29ubmVjdGlvblN0YXR1c0Zyb20gJiYgY3VyclN0YXR1cyA9PT0gc3RhdHVzICYmIGF0dGVtcHRzID49IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdHMgPSAwXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25TdGF0dXNUbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgICAgICBjdXJyU3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGlyZWRUb2tlbigpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvblN0YXR1cyA9IHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb25TdGF0dXMgIT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCAmJiBjb25uZWN0aW9uU3RhdHVzICE9IENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KVxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuKTtcblxuICAgICAgICBjb25zdCBwcm90ZWN0ZWRDb25uZWN0aW9uU3RhdHVzID0gdGhpcy5leHBpcmVkVG9rZW5FeGhhdXN0aW9uKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChwcm90ZWN0ZWRDb25uZWN0aW9uU3RhdHVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0Q29udmVyc2F0aW9uKCkge1xuICAgICAgICAvL2lmIGNvbnZlcnNhdGlvbmlkIGlzIHNldCBoZXJlLCBpdCBtZWFucyB3ZSBuZWVkIHRvIGNhbGwgdGhlIHJlY29ubmVjdCBhcGksIGVsc2UgaXQgaXMgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY29udmVyc2F0aW9uSWRcbiAgICAgICAgICAgID8gYCR7dGhpcy5kb21haW59L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfT93YXRlcm1hcms9JHt0aGlzLndhdGVybWFya31gXG4gICAgICAgICAgICA6IGAke3RoaXMuZG9tYWlufS9jb252ZXJzYXRpb25zYDtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gdGhpcy5jb252ZXJzYXRpb25JZCA/IFwiR0VUXCIgOiBcIlBPU1RcIjtcblxuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5hamF4KHtcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb21tb25IZWFkZXJzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbi8vICAgICAgLmRvKGFqYXhSZXNwb25zZSA9PiBrb25zb2xlLmxvZyhcImNvbnZlcnNhdGlvbiBhamF4UmVzcG9uc2VcIiwgYWpheFJlc3BvbnNlLnJlc3BvbnNlKSlcbiAgICAgICAgLm1hcChhamF4UmVzcG9uc2UgPT4gYWpheFJlc3BvbnNlLnJlc3BvbnNlIGFzIENvbnZlcnNhdGlvbilcbiAgICAgICAgLnJldHJ5V2hlbihlcnJvciQgPT5cbiAgICAgICAgICAgIC8vIGZvciBub3cgd2UgZGVlbSA0eHggYW5kIDV4eCBlcnJvcnMgYXMgdW5yZWNvdmVyYWJsZVxuICAgICAgICAgICAgLy8gZm9yIGV2ZXJ5dGhpbmcgZWxzZSAodGltZW91dHMpLCByZXRyeSBmb3IgYSB3aGlsZVxuICAgICAgICAgICAgZXJyb3IkLm1lcmdlTWFwKGVycm9yID0+IGVycm9yLnN0YXR1cyA+PSA0MDAgJiYgZXJyb3Iuc3RhdHVzIDwgNjAwXG4gICAgICAgICAgICAgICAgPyBPYnNlcnZhYmxlLnRocm93KGVycm9yKVxuICAgICAgICAgICAgICAgIDogT2JzZXJ2YWJsZS5vZihlcnJvcilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5kZWxheSh0aW1lb3V0KVxuICAgICAgICAgICAgLnRha2UocmV0cmllcylcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuTG9vcCgpIHtcbiAgICAgICAgdGhpcy50b2tlblJlZnJlc2hTdWJzY3JpcHRpb24gPSBPYnNlcnZhYmxlLmludGVydmFsKGludGVydmFsUmVmcmVzaFRva2VuKVxuICAgICAgICAuZmxhdE1hcChfID0+IHRoaXMucmVmcmVzaFRva2VuKCkpXG4gICAgICAgIC5zdWJzY3JpYmUodG9rZW4gPT4ge1xuICAgICAgICAgICAga29uc29sZS5sb2coXCJyZWZyZXNoaW5nIHRva2VuXCIsIHRva2VuLCBcImF0XCIsIG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb25uZWN0aW9uKHRydWUpXG4gICAgICAgIC5mbGF0TWFwKF8gPT5cbiAgICAgICAgICAgIE9ic2VydmFibGUuYWpheCh7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuZG9tYWlufS90b2tlbnMvcmVmcmVzaGAsXG4gICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoYWpheFJlc3BvbnNlID0+IGFqYXhSZXNwb25zZS5yZXNwb25zZS50b2tlbiBhcyBzdHJpbmcpXG4gICAgICAgICAgICAucmV0cnlXaGVuKGVycm9yJCA9PiBlcnJvciRcbiAgICAgICAgICAgICAgICAubWVyZ2VNYXAoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0b2tlbiBpcyBleHBpcmVkIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIGtlZXAgdHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGlyZWRUb2tlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYm90IGlzIGdvbmUsIHdlIHNob3VsZCBzdG9wIHJldHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZGVsYXkodGltZW91dClcbiAgICAgICAgICAgICAgICAudGFrZShyZXRyaWVzKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgfVxuXG4gICAgcHVibGljIHJlY29ubmVjdChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvbikge1xuICAgICAgICB0aGlzLnRva2VuID0gY29udmVyc2F0aW9uLnRva2VuO1xuICAgICAgICB0aGlzLnN0cmVhbVVybCA9IGNvbnZlcnNhdGlvbi5zdHJlYW1Vcmw7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuKVxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuT25saW5lKTtcbiAgICB9XG5cbiAgICBlbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLnRva2VuUmVmcmVzaFN1YnNjcmlwdGlvbilcbiAgICAgICAgICAgIHRoaXMudG9rZW5SZWZyZXNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlID09PSBlcnJvckNvbnZlcnNhdGlvbkVuZGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRocm93KGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0U2Vzc2lvbklkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGJvdCwgZ2V0IGNvbm5lY3RlZFxuICAgICAgICAvLyBXaWxsIHRocm93IGFuIGVycm9yIGlmIHdlIGFyZSBub3QgY29ubmVjdGVkXG4gICAgICAgIGtvbnNvbGUubG9nKFwiZ2V0U2Vzc2lvbklkXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0Nvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgIC5mbGF0TWFwKF8gPT5cbiAgICAgICAgICAgICAgICBPYnNlcnZhYmxlLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5kb21haW59L3Nlc3Npb24vZ2V0c2Vzc2lvbmlkYCxcbiAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5tYXAoYWpheFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFqYXhSZXNwb25zZSAmJiBhamF4UmVzcG9uc2UucmVzcG9uc2UgJiYgYWpheFJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJnZXRTZXNzaW9uSWQgcmVzcG9uc2U6IFwiICsgYWpheFJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWpheFJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25JZCBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJnZXRTZXNzaW9uSWQgZXJyb3I6IFwiICsgZXJyb3Iuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUub2YoJycpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5jYXRjaEV4cGlyZWRUb2tlbihlcnJvcikpO1xuICAgIH1cblxuICAgIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICAgICAgLy8gVXNlIHBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIGZvciBtZXNzYWdlcyB3aXRoIGF0dGFjaG1lbnRzIHRoYXQgYXJlIGxvY2FsIGZpbGVzIChlLmcuIGFuIGltYWdlIHRvIHVwbG9hZClcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2UgY291bGQgdXNlIGl0IGZvciAqYWxsKiBhY3Rpdml0aWVzLCBidXQgcG9zdEFjdGl2aXR5IGlzIG11Y2ggbGlnaHRlciB3ZWlnaHRcbiAgICAgICAgLy8gU28sIHNpbmNlIFdlYkNoYXQgaXMgcGFydGlhbGx5IGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERpcmVjdCBMaW5lLCB3ZSBpbXBsZW1lbnQgYm90aC5cbiAgICAgICAgaWYgKGFjdGl2aXR5LnR5cGUgPT09IFwibWVzc2FnZVwiICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhhY3Rpdml0eSk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGNvbm5lY3RlZCB0byB0aGUgYm90LCBnZXQgY29ubmVjdGVkXG4gICAgICAgIC8vIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgd2UgYXJlIG5vdCBjb25uZWN0ZWRcbiAgICAgICAga29uc29sZS5sb2coXCJwb3N0QWN0aXZpdHlcIiwgYWN0aXZpdHkpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0Nvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgLmZsYXRNYXAoXyA9PlxuICAgICAgICAgICAgT2JzZXJ2YWJsZS5hamF4KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5kb21haW59L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS9hY3Rpdml0aWVzYCxcbiAgICAgICAgICAgICAgICBib2R5OiBhY3Rpdml0eSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAubWFwKGFqYXhSZXNwb25zZSA9PiBhamF4UmVzcG9uc2UucmVzcG9uc2UuaWQgYXMgc3RyaW5nKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuY2F0Y2hQb3N0RXJyb3IoZXJyb3IpKVxuICAgICAgICApXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB0aGlzLmNhdGNoRXhwaXJlZFRva2VuKGVycm9yKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyh7IGF0dGFjaG1lbnRzLCAuLi4gbWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9OiBNZXNzYWdlKSB7XG4gICAgICAgIGxldCBmb3JtRGF0YTogRm9ybURhdGE7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGNvbm5lY3RlZCB0byB0aGUgYm90LCBnZXQgY29ubmVjdGVkXG4gICAgICAgIC8vIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgd2UgYXJlIG5vdCBjb25uZWN0ZWRcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb25uZWN0aW9uKHRydWUpXG4gICAgICAgIC5mbGF0TWFwKF8gPT4ge1xuICAgICAgICAgICAgLy8gVG8gc2VuZCB0aGlzIG1lc3NhZ2UgdG8gRGlyZWN0TGluZSB3ZSBuZWVkIHRvIGRlY29uc3RydWN0IGl0IGludG8gYSBcInRlbXBsYXRlXCIgYWN0aXZpdHlcbiAgICAgICAgICAgIC8vIGFuZCBvbmUgYmxvYiBmb3IgZWFjaCBhdHRhY2htZW50LlxuICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYWN0aXZpdHknLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmFjdGl2aXR5JyB9KSk7XG5cbiAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmZyb20oYXR0YWNobWVudHMgfHwgW10pXG4gICAgICAgICAgICAuZmxhdE1hcCgobWVkaWE6IE1lZGlhKSA9PlxuICAgICAgICAgICAgICAgIE9ic2VydmFibGUuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBtZWRpYS5jb250ZW50VXJsLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5kbyhhamF4UmVzcG9uc2UgPT5cbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgbmV3IEJsb2IoW2FqYXhSZXNwb25zZS5yZXNwb25zZV0sIHsgdHlwZTogbWVkaWEuY29udGVudFR5cGUgfSksIG1lZGlhLm5hbWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmNvdW50KClcbiAgICAgICAgfSlcbiAgICAgICAgLmZsYXRNYXAoXyA9PlxuICAgICAgICAgICAgT2JzZXJ2YWJsZS5hamF4KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5kb21haW59L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS91cGxvYWQ/dXNlcklkPSR7bWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cy5mcm9tLmlkfWAsXG4gICAgICAgICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoYWpheFJlc3BvbnNlID0+IGFqYXhSZXNwb25zZS5yZXNwb25zZS5pZCBhcyBzdHJpbmcpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5jYXRjaFBvc3RFcnJvcihlcnJvcikpXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuY2F0Y2hQb3N0RXJyb3IoZXJyb3IpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhdGNoUG9zdEVycm9yKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAzKVxuICAgICAgICAgICAgLy8gdG9rZW4gaGFzIGV4cGlyZWQgKHdpbGwgZmFsbCB0aHJvdWdoIHRvIHJldHVybiBcInJldHJ5XCIpXG4gICAgICAgICAgICB0aGlzLmV4cGlyZWRUb2tlbigpO1xuICAgICAgICBlbHNlIGlmIChlcnJvci5zdGF0dXMgPj0gNDAwICYmIGVycm9yLnN0YXR1cyA8IDUwMClcbiAgICAgICAgICAgIC8vIG1vcmUgdW5yZWNvdmVyYWJsZSBlcnJvcnNcbiAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KGVycm9yKTtcbiAgICAgICAgcmV0dXJuIE9ic2VydmFibGUub2YoXCJyZXRyeVwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhdGNoRXhwaXJlZFRva2VuKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yID09PSBlcnJvckV4cGlyZWRUb2tlblxuICAgICAgICA/IE9ic2VydmFibGUub2YoXCJyZXRyeVwiKVxuICAgICAgICA6IE9ic2VydmFibGUudGhyb3coZXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9sbGluZ0dldEFjdGl2aXR5JCgpIHtcbiAgICAgICAgY29uc3QgcG9sbGVyJDogT2JzZXJ2YWJsZTxBamF4UmVzcG9uc2U+ID0gT2JzZXJ2YWJsZS5jcmVhdGUoKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8YW55PikgPT4ge1xuICAgICAgICAgICAgLy8gQSBCZWhhdmlvclN1YmplY3QgdG8gdHJpZ2dlciBwb2xsaW5nLiBTaW5jZSBpdCBpcyBhIEJlaGF2aW9yU3ViamVjdFxuICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGV2ZW50IGlzIHByb2R1Y2VkIGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xuXG4gICAgICAgICAgICB0cmlnZ2VyJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuT25saW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgICAgICBPYnNlcnZhYmxlLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogYCR7IHRoaXMuZG9tYWluIH0vY29udmVyc2F0aW9ucy8keyB0aGlzLmNvbnZlcnNhdGlvbklkIH0vYWN0aXZpdGllcz93YXRlcm1hcms9JHsgdGhpcy53YXRlcm1hcmsgfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0XG4gICAgICAgICAgICAgICAgICAgIH0pLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQ6IEFqYXhSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdHJpZ2dlciQubmV4dChudWxsKSwgTWF0aC5tYXgoMCwgdGhpcy5wb2xsaW5nSW50ZXJ2YWwgLSBEYXRlLm5vdygpICsgc3RhcnRUaW1lc3RhbXApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3Iuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdHJpZ2dlciQubmV4dChudWxsKSwgdGhpcy5wb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrQ29ubmVjdGlvbigpXG4gICAgICAgIC5mbGF0TWFwKF8gPT4gcG9sbGVyJFxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IE9ic2VydmFibGUuZW1wdHk8QWpheFJlc3BvbnNlPigpKVxuICAgICAgICAgICAgLm1hcChhamF4UmVzcG9uc2UgPT4gYWpheFJlc3BvbnNlLnJlc3BvbnNlIGFzIEFjdGl2aXR5R3JvdXApXG4gICAgICAgICAgICAuZmxhdE1hcChhY3Rpdml0eUdyb3VwID0+IHRoaXMub2JzZXJ2YWJsZUZyb21BY3Rpdml0eUdyb3VwKGFjdGl2aXR5R3JvdXApKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZhYmxlRnJvbUFjdGl2aXR5R3JvdXAoYWN0aXZpdHlHcm91cDogQWN0aXZpdHlHcm91cCkge1xuICAgICAgICBpZiAoYWN0aXZpdHlHcm91cC53YXRlcm1hcmspXG4gICAgICAgICAgICB0aGlzLndhdGVybWFyayA9IGFjdGl2aXR5R3JvdXAud2F0ZXJtYXJrO1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5mcm9tKGFjdGl2aXR5R3JvdXAuYWN0aXZpdGllcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3ZWJTb2NrZXRBY3Rpdml0eSQoKTogT2JzZXJ2YWJsZTxBY3Rpdml0eT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0Nvbm5lY3Rpb24oKVxuICAgICAgICAuZmxhdE1hcChfID0+XG4gICAgICAgICAgICB0aGlzLm9ic2VydmFibGVXZWJTb2NrZXQ8QWN0aXZpdHlHcm91cD4oKVxuICAgICAgICAgICAgLy8gV2ViU29ja2V0cyBjYW4gYmUgY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIgb3IgdGhlIGJyb3dzZXIuIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXRyaWV2ZSBhIG5ldyBzdHJlYW1VcmwuIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb3VsZCBmaXJzdCByZXRyeSB3aXRoIHRoZSBjdXJyZW50IHN0cmVhbVVybCxcbiAgICAgICAgICAgIC8vIGJ1dCBpdCdzIHNpbXBsZXIganVzdCB0byBhbHdheXMgZmV0Y2ggYSBuZXcgb25lLlxuICAgICAgICAgICAgLnJldHJ5V2hlbihlcnJvciQgPT4gZXJyb3IkLmRlbGF5KHRoaXMuZ2V0UmV0cnlEZWxheSgpKS5tZXJnZU1hcChlcnJvciA9PiB0aGlzLnJlY29ubmVjdFRvQ29udmVyc2F0aW9uKCkpKVxuICAgICAgICApXG4gICAgICAgIC5mbGF0TWFwKGFjdGl2aXR5R3JvdXAgPT4gdGhpcy5vYnNlcnZhYmxlRnJvbUFjdGl2aXR5R3JvdXAoYWN0aXZpdHlHcm91cCkpXG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0aGUgZGVsYXkgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gICAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigzMDAwICsgTWF0aC5yYW5kb20oKSAqIDEyMDAwKTtcbiAgICB9XG5cbiAgICAvLyBPcmlnaW5hbGx5IHdlIHVzZWQgT2JzZXJ2YWJsZS53ZWJTb2NrZXQsIGJ1dCBpdCdzIGZhaXJseSBvcGlvbmF0ZWQgIGFuZCBJIGVuZGVkIHVwIHdyaXRpbmdcbiAgICAvLyBhIGxvdCBvZiBjb2RlIHRvIHdvcmsgYXJvdW5kIHRoZWlyIGltcGxlbWVudGlvbiBkZXRhaWxzLiBTaW5jZSBXZWJDaGF0IGlzIG1lYW50IHRvIGJlIGEgcmVmZXJlbmNlXG4gICAgLy8gaW1wbGVtZW50YXRpb24sIEkgZGVjaWRlZCByb2xsIHRoZSBiZWxvdywgd2hlcmUgdGhlIGxvZ2ljIGlzIG1vcmUgcHVycG9zZWZ1bC4gLSBAYmlsbGJhXG4gICAgcHJpdmF0ZSBvYnNlcnZhYmxlV2ViU29ja2V0PFQ+KCkge1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8VD4pID0+IHtcbiAgICAgICAgICAgIGtvbnNvbGUubG9nKFwiY3JlYXRpbmcgV2ViU29ja2V0XCIsIHRoaXMuc3RyZWFtVXJsKTtcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh0aGlzLnN0cmVhbVVybCk7XG4gICAgICAgICAgICBsZXQgc3ViOiBTdWJzY3JpcHRpb247XG5cbiAgICAgICAgICAgIHdzLm9ub3BlbiA9IG9wZW4gPT4ge1xuICAgICAgICAgICAgICAgIGtvbnNvbGUubG9nKFwiV2ViU29ja2V0IG9wZW5cIiwgb3Blbik7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIGlzIHByZXR0eSBiYWQgYXQgbm90aWNpbmcgd2hlbiBhIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGJyb2tlbi5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBwZXJpb2RpY2FsbHkgcGluZyB0aGUgc2VydmVyIHdpdGggZW1wdHkgbWVzc2FnZXMsIGl0IGhlbHBzIENocm9tZVxuICAgICAgICAgICAgICAgIC8vIHJlYWxpemUgd2hlbiBjb25uZWN0aW9uIGJyZWFrcywgYW5kIGNsb3NlIHRoZSBzb2NrZXQuIFdlIHRoZW4gdGhyb3cgYW5cbiAgICAgICAgICAgICAgICAvLyBlcnJvciwgYW5kIHRoYXQgZ2l2ZSB1cyB0aGUgb3Bwb3J0dW5pdHkgdG8gYXR0ZW1wdCB0byByZWNvbm5lY3QuXG4gICAgICAgICAgICAgICAgc3ViID0gT2JzZXJ2YWJsZS5pbnRlcnZhbCh0aW1lb3V0KS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cy5zZW5kKFwiXCIpXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJQaW5nIGVycm9yXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdzLm9uY2xvc2UgPSBjbG9zZSA9PiB7XG4gICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJXZWJTb2NrZXQgY2xvc2VcIiwgY2xvc2UpO1xuICAgICAgICAgICAgICAgIGlmIChzdWIpIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoY2xvc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3cy5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IG1lc3NhZ2UuZGF0YSAmJiBzdWJzY3JpYmVyLm5leHQoSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpKTtcblxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgJ3Vuc3Vic2NyaWJlJyBtZXRob2QsIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoaXMgb2JzZXJ2YWJsZSBpcyBkaXNwb3NlZC5cbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIFdlYlNvY2tldCBjbG9zZXMgaXRzZWxmLCB3ZSB0aHJvdyBhbiBlcnJvciwgYW5kIHRoaXMgZnVuY3Rpb24gaXMgZXZlbnR1YWxseSBjYWxsZWQuXG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBvYnNlcnZhYmxlIGlzIGNsb3NlZCBmaXJzdCAoZS5nLiB3aGVuIHRlYXJpbmcgZG93biBhIFdlYkNoYXQgaW5zdGFuY2UpIHRoZW5cbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFudWFsbHkgY2xvc2UgdGhlIFdlYlNvY2tldC5cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHdzLnJlYWR5U3RhdGUgPT09IDAgfHwgd3MucmVhZHlTdGF0ZSA9PT0gMSkgd3MuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgYXMgT2JzZXJ2YWJsZTxUPlxuICAgIH1cblxuICAgIHByaXZhdGUgcmVjb25uZWN0VG9Db252ZXJzYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrQ29ubmVjdGlvbih0cnVlKVxuICAgICAgICAuZmxhdE1hcChfID0+XG4gICAgICAgICAgICBPYnNlcnZhYmxlLmFqYXgoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuZG9tYWlufS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25JZH0/d2F0ZXJtYXJrPSR7dGhpcy53YXRlcm1hcmt9YCxcbiAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5kbyhyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWNyZXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW4gPSByZXN1bHQucmVzcG9uc2UudG9rZW47XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1VcmwgPSByZXN1bHQucmVzcG9uc2Uuc3RyZWFtVXJsO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoXyA9PiBudWxsKVxuICAgICAgICAgICAgLnJldHJ5V2hlbihlcnJvciQgPT4gZXJyb3IkXG4gICAgICAgICAgICAgICAgLm1lcmdlTWFwKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBoYXMgZXhwaXJlZC4gV2UgY2FuJ3QgcmVjb3ZlciBmcm9tIHRoaXMgaGVyZSwgYnV0IHRoZSBlbWJlZGRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlYnNpdGUgbWlnaHQgZXZlbnR1YWxseSBjYWxsIHJlY29ubmVjdCgpIHdpdGggYSBuZXcgdG9rZW4gYW5kIHN0cmVhbVVybC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFRva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KGVycm9yQ29udmVyc2F0aW9uRW5kZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUub2YoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmRlbGF5KHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgLnRha2UocmV0cmllcylcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByaXZhdGUgY29tbW9uSGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiQXV0aG9yaXphdGlvblwiOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgICAgICAgXCJ4LW1zLWJvdC1hZ2VudFwiOiB0aGlzLl9ib3RBZ2VudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Qm90QWdlbnQoY3VzdG9tQWdlbnQ6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGNsaWVudEFnZW50ID0gJ2RpcmVjdGxpbmVqcydcblxuICAgICAgICBpZiAoY3VzdG9tQWdlbnQpIHtcbiAgICAgICAgICAgIGNsaWVudEFnZW50ICs9IGA7ICR7Y3VzdG9tQWdlbnR9YFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/lib/directLine.test.js b/lib/directLine.test.js new file mode 100644 index 000000000..6ff3dec93 --- /dev/null +++ b/lib/directLine.test.js @@ -0,0 +1,68 @@ +"use strict"; + +var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); + +var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); + +var DirectLineExport = _interopRequireWildcard(require("./directLine")); + +test("#setConnectionStatusFallback", function () { + var DirectLine = DirectLineExport.DirectLine; + expect((0, _typeof2["default"])(DirectLine.prototype.setConnectionStatusFallback)).toBe("function"); + var setConnectionStatusFallback = DirectLine.prototype.setConnectionStatusFallback; + var testFallback = setConnectionStatusFallback(0, 1); + var idx = 4; + + while (idx--) { + expect(testFallback(0)).toBe(0); + } // fallback will be triggered + + + expect(testFallback(0)).toBe(1); + idx = 4; + + while (idx--) { + expect(testFallback(0)).toBe(0); + } + + expect(testFallback(0)).toBe(1); +}); +describe("#commonHeaders", function () { + var botAgent = "DirectLine/3.0 (directlinejs; custom-bot-agent)"; + var botConnection; + beforeEach(function () { + undefined = "test-version"; + var DirectLine = DirectLineExport.DirectLine; + botConnection = new DirectLine({ + token: "secret-token", + botAgent: "custom-bot-agent" + }); + }); + test('appends browser user agent when in a browser', function () { + // @ts-ignore + expect(botConnection.commonHeaders()).toEqual({ + "Authorization": "Bearer secret-token", + "x-ms-bot-agent": botAgent + }); + }); + test.skip('appends node environment agent when in node', function () { + // @ts-ignore + delete window.navigator; // @ts-ignore + + var os = require('os'); + + var _process = process, + arch = _process.arch, + platform = _process.platform, + version = _process.version; // @ts-ignore + + expect(botConnection.commonHeaders()).toEqual({ + "Authorization": "Bearer secret-token", + "User-Agent": "".concat(botAgent, " (Node.js,Version=").concat(version, "; ").concat(platform, " ").concat(os.release(), "; ").concat(arch, ")"), + "x-ms-bot-agent": botAgent + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lLnRlc3QudHMiXSwibmFtZXMiOlsidGVzdCIsIkRpcmVjdExpbmUiLCJEaXJlY3RMaW5lRXhwb3J0IiwiZXhwZWN0IiwicHJvdG90eXBlIiwic2V0Q29ubmVjdGlvblN0YXR1c0ZhbGxiYWNrIiwidG9CZSIsInRlc3RGYWxsYmFjayIsImlkeCIsImRlc2NyaWJlIiwiYm90QWdlbnQiLCJib3RDb25uZWN0aW9uIiwiYmVmb3JlRWFjaCIsInRva2VuIiwiY29tbW9uSGVhZGVycyIsInRvRXF1YWwiLCJza2lwIiwid2luZG93IiwibmF2aWdhdG9yIiwib3MiLCJyZXF1aXJlIiwicHJvY2VzcyIsImFyY2giLCJwbGF0Zm9ybSIsInZlcnNpb24iLCJyZWxlYXNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQVlBQSxJQUFJLENBQUMsOEJBQUQsRUFBaUMsWUFBTTtBQUFBLE1BQy9CQyxVQUQrQixHQUNoQkMsZ0JBRGdCLENBQy9CRCxVQUQrQjtBQUV2Q0UsRUFBQUEsTUFBTSwwQkFBUUYsVUFBVSxDQUFDRyxTQUFYLENBQXFCQywyQkFBN0IsRUFBTixDQUFnRUMsSUFBaEUsQ0FBcUUsVUFBckU7QUFGdUMsTUFHL0JELDJCQUgrQixHQUdDSixVQUFVLENBQUNHLFNBSFosQ0FHL0JDLDJCQUgrQjtBQUl2QyxNQUFNRSxZQUFZLEdBQUdGLDJCQUEyQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQWhEO0FBQ0EsTUFBSUcsR0FBRyxHQUFHLENBQVY7O0FBQ0EsU0FBT0EsR0FBRyxFQUFWLEVBQWM7QUFDWkwsSUFBQUEsTUFBTSxDQUFDSSxZQUFZLENBQUMsQ0FBRCxDQUFiLENBQU4sQ0FBd0JELElBQXhCLENBQTZCLENBQTdCO0FBQ0QsR0FSc0MsQ0FTdkM7OztBQUNBSCxFQUFBQSxNQUFNLENBQUNJLFlBQVksQ0FBQyxDQUFELENBQWIsQ0FBTixDQUF3QkQsSUFBeEIsQ0FBNkIsQ0FBN0I7QUFDQUUsRUFBQUEsR0FBRyxHQUFHLENBQU47O0FBQ0EsU0FBT0EsR0FBRyxFQUFWLEVBQWM7QUFDVkwsSUFBQUEsTUFBTSxDQUFDSSxZQUFZLENBQUMsQ0FBRCxDQUFiLENBQU4sQ0FBd0JELElBQXhCLENBQTZCLENBQTdCO0FBQ0g7O0FBQ0RILEVBQUFBLE1BQU0sQ0FBQ0ksWUFBWSxDQUFDLENBQUQsQ0FBYixDQUFOLENBQXdCRCxJQUF4QixDQUE2QixDQUE3QjtBQUNILENBaEJHLENBQUo7QUFrQkFHLFFBQVEsQ0FBQyxnQkFBRCxFQUFtQixZQUFNO0FBQzdCLE1BQU1DLFFBQVEsR0FBRyxpREFBakI7QUFDQSxNQUFJQyxhQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2IsZ0JBQXNCLGNBQXRCO0FBRGEsUUFFTFgsVUFGSyxHQUVVQyxnQkFGVixDQUVMRCxVQUZLO0FBR2JVLElBQUFBLGFBQWEsR0FBRyxJQUFJVixVQUFKLENBQWU7QUFBRVksTUFBQUEsS0FBSyxFQUFFLGNBQVQ7QUFBeUJILE1BQUFBLFFBQVEsRUFBRTtBQUFuQyxLQUFmLENBQWhCO0FBQ0gsR0FKUyxDQUFWO0FBTUFWLEVBQUFBLElBQUksQ0FBQyw4Q0FBRCxFQUFpRCxZQUFNO0FBQ3ZEO0FBQ0FHLElBQUFBLE1BQU0sQ0FBQ1EsYUFBYSxDQUFDRyxhQUFkLEVBQUQsQ0FBTixDQUFzQ0MsT0FBdEMsQ0FBOEM7QUFDMUMsdUJBQWlCLHFCQUR5QjtBQUUxQyx3QkFBa0JMO0FBRndCLEtBQTlDO0FBSUgsR0FORyxDQUFKO0FBUUFWLEVBQUFBLElBQUksQ0FBQ2dCLElBQUwsQ0FBVSw2Q0FBVixFQUF5RCxZQUFNO0FBQzNEO0FBQ0EsV0FBT0MsTUFBTSxDQUFDQyxTQUFkLENBRjJELENBRzNEOztBQUNBLFFBQU1DLEVBQUUsR0FBR0MsT0FBTyxDQUFDLElBQUQsQ0FBbEI7O0FBSjJELG1CQUt2QkMsT0FMdUI7QUFBQSxRQUtuREMsSUFMbUQsWUFLbkRBLElBTG1EO0FBQUEsUUFLN0NDLFFBTDZDLFlBSzdDQSxRQUw2QztBQUFBLFFBS25DQyxPQUxtQyxZQUtuQ0EsT0FMbUMsRUFPM0Q7O0FBQ0FyQixJQUFBQSxNQUFNLENBQUNRLGFBQWEsQ0FBQ0csYUFBZCxFQUFELENBQU4sQ0FBc0NDLE9BQXRDLENBQThDO0FBQzFDLHVCQUFpQixxQkFEeUI7QUFFMUMsOEJBQWlCTCxRQUFqQiwrQkFBOENjLE9BQTlDLGVBQTBERCxRQUExRCxjQUFzRUosRUFBRSxDQUFDTSxPQUFILEVBQXRFLGVBQXVGSCxJQUF2RixNQUYwQztBQUcxQyx3QkFBa0JaO0FBSHdCLEtBQTlDO0FBS0gsR0FiRDtBQWNILENBaENPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBEaXJlY3RMaW5lRXhwb3J0IGZyb20gXCIuL2RpcmVjdExpbmVcIjtcblxuZGVjbGFyZSB2YXIgcHJvY2Vzczoge1xuICAgIGFyY2g6IHN0cmluZztcbiAgICBlbnY6IHtcbiAgICAgICAgVkVSU0lPTjogc3RyaW5nO1xuICAgIH07XG4gICAgcGxhdGZvcm06IHN0cmluZztcbiAgICByZWxlYXNlOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxudGVzdChcIiNzZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2tcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgRGlyZWN0TGluZSB9ID0gRGlyZWN0TGluZUV4cG9ydDtcbiAgICBleHBlY3QodHlwZW9mIERpcmVjdExpbmUucHJvdG90eXBlLnNldENvbm5lY3Rpb25TdGF0dXNGYWxsYmFjaykudG9CZShcImZ1bmN0aW9uXCIpXG4gICAgY29uc3QgeyBzZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2sgfSA9IERpcmVjdExpbmUucHJvdG90eXBlO1xuICAgIGNvbnN0IHRlc3RGYWxsYmFjayA9IHNldENvbm5lY3Rpb25TdGF0dXNGYWxsYmFjaygwLCAxKTtcbiAgICBsZXQgaWR4ID0gNDtcbiAgICB3aGlsZSAoaWR4LS0pIHtcbiAgICAgIGV4cGVjdCh0ZXN0RmFsbGJhY2soMCkpLnRvQmUoMCk7XG4gICAgfVxuICAgIC8vIGZhbGxiYWNrIHdpbGwgYmUgdHJpZ2dlcmVkXG4gICAgZXhwZWN0KHRlc3RGYWxsYmFjaygwKSkudG9CZSgxKTtcbiAgICBpZHggPSA0O1xuICAgIHdoaWxlIChpZHgtLSkge1xuICAgICAgICBleHBlY3QodGVzdEZhbGxiYWNrKDApKS50b0JlKDApO1xuICAgIH1cbiAgICBleHBlY3QodGVzdEZhbGxiYWNrKDApKS50b0JlKDEpO1xufSk7XG5cbmRlc2NyaWJlKFwiI2NvbW1vbkhlYWRlcnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGJvdEFnZW50ID0gXCJEaXJlY3RMaW5lLzMuMCAoZGlyZWN0bGluZWpzOyBjdXN0b20tYm90LWFnZW50KVwiO1xuICAgIGxldCBib3RDb25uZWN0aW9uO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHByb2Nlc3MuZW52LlZFUlNJT04gPSBcInRlc3QtdmVyc2lvblwiO1xuICAgICAgICBjb25zdCB7IERpcmVjdExpbmUgfSA9IERpcmVjdExpbmVFeHBvcnQ7XG4gICAgICAgIGJvdENvbm5lY3Rpb24gPSBuZXcgRGlyZWN0TGluZSh7IHRva2VuOiBcInNlY3JldC10b2tlblwiLCBib3RBZ2VudDogXCJjdXN0b20tYm90LWFnZW50XCIgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdhcHBlbmRzIGJyb3dzZXIgdXNlciBhZ2VudCB3aGVuIGluIGEgYnJvd3NlcicsICgpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBleHBlY3QoYm90Q29ubmVjdGlvbi5jb21tb25IZWFkZXJzKCkpLnRvRXF1YWwoe1xuICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IFwiQmVhcmVyIHNlY3JldC10b2tlblwiLFxuICAgICAgICAgICAgXCJ4LW1zLWJvdC1hZ2VudFwiOiBib3RBZ2VudFxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgdGVzdC5za2lwKCdhcHBlbmRzIG5vZGUgZW52aXJvbm1lbnQgYWdlbnQgd2hlbiBpbiBub2RlJywgKCkgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSB3aW5kb3cubmF2aWdhdG9yXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuICAgICAgICBjb25zdCB7IGFyY2gsIHBsYXRmb3JtLCB2ZXJzaW9uIH0gPSBwcm9jZXNzO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXhwZWN0KGJvdENvbm5lY3Rpb24uY29tbW9uSGVhZGVycygpKS50b0VxdWFsKHtcbiAgICAgICAgICAgIFwiQXV0aG9yaXphdGlvblwiOiBcIkJlYXJlciBzZWNyZXQtdG9rZW5cIixcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBgJHtib3RBZ2VudH0gKE5vZGUuanMsVmVyc2lvbj0ke3ZlcnNpb259OyAke3BsYXRmb3JtfSAke29zLnJlbGVhc2UoKX07ICR7YXJjaH0pYCxcbiAgICAgICAgICAgIFwieC1tcy1ib3QtYWdlbnRcIjogYm90QWdlbnRcbiAgICAgICAgfSk7XG4gICAgfSlcbn0pO1xuIl19 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b8c17b761..62e17486c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,28 +5,63 @@ "requires": true, "dependencies": { "@babel/cli": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.2.3.tgz", - "integrity": "sha512-bfna97nmJV6nDJhXNPeEfxyMjWnt6+IjUAaDPiYRTBlm8L41n8nvw6UAqUCbvpFfU246gHPxW7sfWwqtF4FcYA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.6.0.tgz", + "integrity": "sha512-1CTDyGUjQqW3Mz4gfKZ04KGOckyyaNmKneAMlABPS+ZyuxWv3FrVEVz7Ag08kNIztVx8VaJ8YgvYLSNlMKAT5Q==", "dev": true, "requires": { - "chokidar": "^2.0.3", + "chokidar": "^2.1.8", "commander": "^2.8.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.13", "mkdirp": "^0.5.1", "output-file-sync": "^2.0.0", "slash": "^2.0.0", "source-map": "^0.5.0" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true } } }, @@ -40,27 +75,103 @@ } }, "@babel/core": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", - "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.2.2", - "@babel/template": "^7.2.2", - "@babel/traverse": "^7.2.2", - "@babel/types": "^7.2.2", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.0.tgz", + "integrity": "sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helpers": "^7.6.0", + "@babel/parser": "^7.6.0", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.10", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -79,26 +190,26 @@ "minimist": "^1.2.0" } }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, @@ -143,38 +254,255 @@ } }, "@babel/helper-call-delegate": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", - "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.0.tgz", - "integrity": "sha512-DUsQNS2CGLZZ7I3W3fvh0YpPDd6BuWJlDl+qmZZpABZHza2ErE3LxtEzLJFHFC1ZwtlAXvHhbFYbtM5o5B0WBw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz", + "integrity": "sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.2.3" + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helper-define-map": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", - "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.0.0", - "lodash": "^4.17.10" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-explode-assignable-expression": { @@ -208,21 +536,59 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", - "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-module-imports": { @@ -235,17 +601,62 @@ } }, "@babel/helper-module-transforms": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz", - "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/template": "^7.2.2", - "@babel/types": "^7.2.2", - "lodash": "^4.17.10" + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-optimise-call-expression": { @@ -264,12 +675,20 @@ "dev": true }, "@babel/helper-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", - "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-remap-async-to-generator": { @@ -286,15 +705,103 @@ } }, "@babel/helper-replace-supers": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz", - "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.2.3", - "@babel/types": "^7.0.0" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helper-simple-access": { @@ -329,14 +836,115 @@ } }, "@babel/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.0.tgz", + "integrity": "sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ==", "dev": true, "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.5", - "@babel/types": "^7.3.0" + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/highlight": { @@ -368,15 +976,25 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz", - "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.3.0", + "@babel/helper-create-class-features-plugin": "^7.5.5", "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", @@ -388,9 +1006,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.1.tgz", - "integrity": "sha512-Nmmv1+3LqxJu/V5jU9vJmxR/KIRWFk2qLHmbB56yRRRFhlaSuOVXscX3gUmhaKgUhzA3otOHVubbIEVYsZ0eZg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -408,14 +1026,14 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", - "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.2.0" + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" } }, "@babel/plugin-syntax-async-generators": { @@ -427,6 +1045,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", @@ -455,9 +1082,9 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz", - "integrity": "sha512-WhKr6yu6yGpGcNMVgIBuI9MkredpVc7Y3YR4UzEZmDztHoL6wV56YBHLhWnjO1EvId1B32HrD3DRFc+zSoKI1g==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", + "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -473,9 +1100,9 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", - "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -493,29 +1120,65 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", - "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz", + "integrity": "sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.10" + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/plugin-transform-classes": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", - "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.1.0", + "@babel/helper-define-map": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/plugin-transform-computed-properties": { @@ -528,29 +1191,29 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", - "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", - "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", - "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -567,18 +1230,18 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", - "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", - "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", @@ -594,35 +1257,47 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-transform-modules-amd": { + "@babel/plugin-transform-member-expression-literals": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", - "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", - "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", - "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { @@ -636,57 +1311,75 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz", - "integrity": "sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz", + "integrity": "sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew==", "dev": true, "requires": { - "regexp-tree": "^0.1.0" + "regexp-tree": "^0.1.13" } }, "@babel/plugin-transform-new-target": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", - "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "@babel/helper-replace-supers": "^7.5.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", - "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-call-delegate": "^7.4.4", "@babel/helper-get-function-arity": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-regenerator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", - "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", "dev": true, "requires": { - "regenerator-transform": "^0.13.3" + "regenerator-transform": "^0.14.0" } }, - "@babel/plugin-transform-runtime": { + "@babel/plugin-transform-reserved-words": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", - "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.0.tgz", + "integrity": "sha512-Da8tMf7uClzwUm/pnJ1S93m/aRXmoYNDD7TkHua8xBDdaAs54uZpTWvEt6NGwmoVMb9mZbntfTqmG2oSzN/7Vg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -696,18 +1389,18 @@ }, "dependencies": { "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -741,9 +1434,9 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", - "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", @@ -760,93 +1453,120 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.2.0.tgz", - "integrity": "sha512-EnI7i2/gJ7ZNr2MuyvN2Hu+BHJENlxWte5XygPvfj/MbvtOkWor9zcnHpMMQL2YYaaCcqtIvJUyJ7QVfoGs7ew==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.0.tgz", + "integrity": "sha512-yzw7EopOOr6saONZ3KA3lpizKnWRTe+rfBqg4AmQbSow7ik7fqmzrfIqt053osLwLE2AaTqGinLM2tl6+M/uog==", "dev": true, "requires": { + "@babel/helper-create-class-features-plugin": "^7.6.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-typescript": "^7.2.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", - "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" } }, "@babel/preset-env": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.1.tgz", - "integrity": "sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.0.tgz", + "integrity": "sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.3.1", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-json-strings": "^7.2.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.2.0", - "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.0", + "@babel/plugin-transform-classes": "^7.5.5", "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.2.0", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.2.0", - "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.2.0", "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.2.0", - "browserslist": "^4.3.4", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.6.0", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/preset-typescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz", - "integrity": "sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.6.0.tgz", + "integrity": "sha512-4xKw3tTcCm0qApyT6PqM9qniseCE79xGHiUnNdKGdxNsGUc2X7WwZybqIpnTmoukg3nhPceI5KPNzNqLNeIJww==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.1.0" + "@babel/plugin-transform-typescript": "^7.6.0" } }, "@babel/runtime": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", - "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.0.tgz", + "integrity": "sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==", "requires": { - "regenerator-runtime": "^0.12.0" + "regenerator-runtime": "^0.13.2" } }, "@babel/template": { @@ -894,205 +1614,760 @@ } } }, - "@babel/types": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.0.tgz", - "integrity": "sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw==", + "@babel/types": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.0.tgz", + "integrity": "sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "dependencies": { + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + } + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "exec-sh": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@netflix/nerror": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.2.tgz", + "integrity": "sha512-c01MmkM3Oi0BkTV4odMpr+58uXlxRKUPcu1ONR+sU3YAFAW4pP1j2b0opS9jX+an3ldpBJtiompzAEFZdlc8YQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "extsprintf": "^1.4.0", + "lodash": "^4.17.15" + }, + "dependencies": { + "extsprintf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", + "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "23.3.10", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.10.tgz", - "integrity": "sha512-DC8xTuW/6TYgvEg3HEXS7cu9OijFqprVDXXiOcdOKZCU/5PJNLZU37VVvmZHdtMiGOa8wAA/We+JzbdxFzQTRQ==", + "version": "24.0.18", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", + "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", + "dev": true, + "requires": { + "@types/jest-diff": "*" + } + }, + "@types/jest-diff": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", + "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", "dev": true }, "@types/node": { - "version": "10.12.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz", - "integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==", + "version": "12.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.4.tgz", + "integrity": "sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ==", "dev": true }, "@types/p-defer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/p-defer/-/p-defer-1.0.3.tgz", - "integrity": "sha512-0CK39nXek0mSZL/lnGYjhcR1QLAxg9N0/5S1BvU+MQwjlP4Jd2ebbEkJ/bEUqYMAvKLMZcGd4sJE13dnUKlDnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/p-defer/-/p-defer-2.0.0.tgz", + "integrity": "sha512-4SLT+hu3Qoa96lNlaFCVdDF1J9wydrwpx5ZcZJC/WGSIQOCbDIdHCfDxZ+LxMTv1hg0MUxbNwKd5zIvNp7VR/Q==", + "dev": true, + "requires": { + "p-defer": "*" + } + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.11" + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" } }, "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "dev": true, "requires": { - "@xtuc/long": "4.2.1" + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@xtuc/ieee754": { @@ -1102,15 +2377,15 @@ "dev": true }, "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "acorn": { @@ -1119,16 +2394,10 @@ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -1136,17 +2405,17 @@ }, "dependencies": { "acorn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", - "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true } } }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { @@ -1168,9 +2437,9 @@ "dev": true }, "ajv-keywords": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", - "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, "amdefine": { @@ -1210,30 +2479,12 @@ "normalize-path": "^2.1.1" } }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -1264,12 +2515,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -1297,11 +2542,12 @@ } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -1353,9 +2599,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -1383,40 +2629,206 @@ "dev": true }, "babel-jest": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.0.0.tgz", - "integrity": "sha512-YGKRbZUjoRmNIAyG7x4wYxUyHvHPFpYXj6Mx1A5cslhaQOUgP/+LF3wtFgMuOQkIpjbVNBufmOnVY0QVwB5v9Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.0.0" + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" } }, "babel-plugin-istanbul": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz", - "integrity": "sha512-CLoXPRSUWiR8yao8bShqZUIC6qLfZVVY3X1wj+QPNXu0wfmrRRfarh1LYy+dYMVI+bDj0ghy3tuqFFRFZmL1Nw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.0.0", - "test-exclude": "^5.0.0" + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "babel-plugin-jest-hoist": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.0.0.tgz", - "integrity": "sha512-ipefE7YWNyRNVaV/MonUb/I5nef53ZRFR74P9meMGmJxqt8s1BJmfhw11YeIMbcjXN4fxtWUaskZZe8yreXE1Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-transform-inline-environment-variables": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.4.3.tgz", + "integrity": "sha1-o7CYgzU76LXiM24/8e+KXZP5xIk=", "dev": true }, "babel-preset-jest": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.0.0.tgz", - "integrity": "sha512-ECMMOLvNDCmsn3geBa3JkwzylcfpThMpAdfreONQm8EmXcs4tXUpXZDQPxiIMg7nMobTuAC2zDGIKrbrBXW2Vg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.0.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "balanced-match": { @@ -1487,9 +2899,9 @@ "dev": true }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, "bcrypt-pbkdf": { @@ -1514,9 +2926,9 @@ "dev": true }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, "bn.js": { @@ -1623,9 +3035,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true } } @@ -1665,14 +3077,14 @@ } }, "browserslist": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", - "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000929", - "electron-to-chromium": "^1.3.103", - "node-releases": "^1.1.3" + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" } }, "bser": { @@ -1732,32 +3144,56 @@ } }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", "dev": true, "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" }, "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -1791,18 +3227,18 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30000933", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000933.tgz", - "integrity": "sha512-d3QXv7eFTU40DSedSP81dV/ajcGSKpT+GW+uhtWmLvQm9bPk0KK++7i1e2NSW/CXGZhWFt2mFbFtCJ5I5bMuVA==", + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", "dev": true }, "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "rsvp": "^3.3.3" + "rsvp": "^4.8.4" } }, "caseless": { @@ -1823,36 +3259,43 @@ } }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", "dev": true }, "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -1897,26 +3340,6 @@ } } }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true, - "optional": true - } - } - }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -1966,9 +3389,9 @@ "dev": true }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -2018,12 +3441,6 @@ } } }, - "compare-versions": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", - "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", - "dev": true - }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2049,20 +3466,20 @@ } }, "concurrently": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.0.tgz", - "integrity": "sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "date-fns": "^1.23.0", - "lodash": "^4.17.10", + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", "read-pkg": "^4.0.1", - "rxjs": "^6.3.3", + "rxjs": "^6.5.2", "spawn-command": "^0.0.2-1", "supports-color": "^4.5.0", - "tree-kill": "^1.1.0", - "yargs": "^12.0.1" + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" }, "dependencies": { "has-flag": { @@ -2071,6 +3488,12 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, "read-pkg": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", @@ -2083,9 +3506,9 @@ } }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -2138,6 +3561,17 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "copy-descriptor": { @@ -2146,6 +3580,30 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "core-js-compat": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", + "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "dev": true, + "requires": { + "browserslist": "^4.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2222,57 +3680,54 @@ } }, "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { "cssom": "0.3.x" } }, "csv": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/csv/-/csv-1.2.1.tgz", - "integrity": "sha1-UjHt/BxxUlEuxFeBB2p6l/9SXAw=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/csv/-/csv-5.1.2.tgz", + "integrity": "sha512-2NA/Fp9FuRAJY6bu5mZsSyBFeqbDZjGg8z1WYETpBpuO30gyWOkxf9KjzBNEZiCsXuNxdQrU3rKrpejyucznMg==", "dev": true, "requires": { - "csv-generate": "^1.1.2", - "csv-parse": "^1.3.3", - "csv-stringify": "^1.1.2", - "stream-transform": "^0.2.2" + "csv-generate": "^3.2.3", + "csv-parse": "^4.4.5", + "csv-stringify": "^5.3.3", + "stream-transform": "^2.0.1" } }, "csv-generate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-1.1.2.tgz", - "integrity": "sha1-7GsA7a7W5ZrZwgWC9MNk4osUYkA=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.2.3.tgz", + "integrity": "sha512-IcR3K0Nx+nJAkcU2eAglVR7DuHnxcuhUM2w2cR+aHOW7bZp2S5LyN2HF3zTkp6BV/DjR6ykoKznUm+AjnWcOKg==", "dev": true }, "csv-parse": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-1.3.3.tgz", - "integrity": "sha1-0c/YdDwvhJoKuy/VRNtWaV0ZpJA=", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.4.5.tgz", + "integrity": "sha512-koPV9m9AjNJCK3ig4ErgRJalZsLxWI7NP0Fd3+CO9hgDZt3FSljTeESnfWTbyRc8qk/3/LgX1s5naDqLxiuK9w==", "dev": true }, "csv-stringify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-1.1.2.tgz", - "integrity": "sha1-d6QVJlgbzjOA8SsA18W7rHDIK1g=", - "dev": true, - "requires": { - "lodash.get": "~4.4.2" - } + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.3.3.tgz", + "integrity": "sha512-q8Qj+/lN74LRmG7Mg0LauE5WcnJOD5MEGe1gI57IYJCB61KWuEbAFHm1uIPDkI26aqElyBB57SlE2GGwq2EY5A==", + "dev": true }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "d3": { @@ -2353,15 +3808,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2424,6 +3870,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -2434,6 +3886,12 @@ "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -2463,9 +3921,9 @@ } }, "diff-sequences": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.0.0.tgz", - "integrity": "sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "diffie-hellman": { @@ -2494,20 +3952,35 @@ "webidl-conversions": "^4.0.2" } }, + "dotenv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", + "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==", + "dev": true + }, "dtrace-provider": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", - "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=", + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", "dev": true, "optional": true, "requires": { - "nan": "^2.10.0" + "nan": "^2.14.0" + }, + "dependencies": { + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + } } }, "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -2526,16 +3999,22 @@ "safer-buffer": "^2.1.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, "electron-to-chromium": { - "version": "1.3.111", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.111.tgz", - "integrity": "sha512-I2QjmmxWULp89fEHlFwRpKXSw4Y/Igo3u41py4MkzJTrgDOf/S4oq/IMuTUHze/5TTPpwem74oQiPMEgFtuDRA==", + "version": "1.3.253", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.253.tgz", + "integrity": "sha512-LAwFRWViiiCSxQ2Lj3mnyEP8atkpAoHSPUnkFoy4mNabbnPHxtfseWvPCGGhewjHQI+ky/V4LdlTyyI0d3YPXA==", "dev": true }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -2547,12 +4026,24 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -2626,6 +4117,12 @@ "is-symbol": "^1.0.2" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, "escape-regexp-component": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz", @@ -2639,9 +4136,9 @@ "dev": true }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -2651,12 +4148,6 @@ "source-map": "~0.6.1" }, "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2667,9 +4158,9 @@ } }, "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -2677,9 +4168,9 @@ } }, "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true }, "esrecurse": { @@ -2703,6 +4194,12 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", @@ -2729,13 +4226,10 @@ } }, "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true }, "execa": { "version": "1.0.0", @@ -2803,16 +4297,17 @@ } }, "expect": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.0.0.tgz", - "integrity": "sha512-qDHRU4lGsme0xjg8dXp/RQhvO9XIo9FWqVo7dTHDPBwzy25JGEHAWFsnpmRYErB50tgi/6euo3ir5e/kF9LUTA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-regex-util": "^24.0.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "extend": { @@ -2914,9 +4409,9 @@ "dev": true }, "fast-decode-uri-component": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.0.tgz", - "integrity": "sha512-WQSYVKn6tDW/3htASeUkrx5LcnuTENQIZQPCVlwdnvIJ7bYtSpoJYq38MgUJnx1CQIR1gjZ8HJxAEcN4gqugBg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", "dev": true }, "fast-deep-equal": { @@ -2957,14 +4452,6 @@ "promise": "^7.0.3", "ua-parser-js": "^0.7.9", "whatwg-fetch": "^0.9.0" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } } }, "figgy-pudding": { @@ -2973,16 +4460,6 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -3007,24 +4484,24 @@ } }, "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^1.0.0", + "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" } }, "find-my-way": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-1.18.0.tgz", - "integrity": "sha512-crxfbRd8Rssex2ZvCvPI1VmeB8t3SyFjwTLAGgr0t+Q1X/SHFYL5cIF7PpcoaUeDJeBkRBKLELopjjk/Ai6V/w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-2.1.1.tgz", + "integrity": "sha512-yznKDx1xELFkTrV2Ke9x3IOr9zn5isdFA2Af/NKjU8kmQQhtn3TmqrVZ6OiLO5pj1dAScxe4dAo92ieG4nGcoA==", "dev": true, "requires": { "fast-decode-uri-component": "^1.0.0", - "safe-regex": "^1.1.0", + "safe-regex2": "^2.0.0", "semver-store": "^0.3.0" } }, @@ -3038,36 +4515,25 @@ } }, "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { "detect-file": "^1.0.0", - "is-glob": "^3.1.0", + "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } } }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "for-in": { @@ -3108,6 +4574,12 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -3703,10 +5175,13 @@ "dev": true }, "get-port": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.1.0.tgz", - "integrity": "sha512-4/fqAYrzrzOiqDrdeZRKXGdTGgbkfTEumGlNQPeP6Jy8w0PzN9mzeNQ3XgHaTNie8pQ3hOUkrwlZt2Fzk5H9mA==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.0.0.tgz", + "integrity": "sha512-imzMU0FjsZqNa6BqOjbbW6w5BivHIuQKopjpPqcnx0AVHJQKCxK1O+Ab3OrVXhrekqfVMjwA9ZYu062R+KcIsQ==", + "dev": true, + "requires": { + "type-fest": "^0.3.0" + } }, "get-stream": { "version": "4.1.0", @@ -3768,22 +5243,27 @@ } }, "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } } }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, "global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", @@ -3816,32 +5296,23 @@ "dev": true }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz", + "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==", "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3957,9 +5428,9 @@ } }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" @@ -3998,6 +5469,18 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -4025,9 +5508,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "iferr": { @@ -4052,10 +5535,10 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { @@ -4101,6 +5584,12 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -4230,9 +5719,9 @@ "dev": true }, "is-generator-fn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.0.0.tgz", - "integrity": "sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "is-glob": { @@ -4315,6 +5804,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -4339,79 +5834,181 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.0.tgz", - "integrity": "sha512-+Ygg4t1StoiNlBGc6x0f8q/Bv26FbZqP/+jegzfNpU7Q8o+4ZRoJxJPhBkgE/UonpAjtxnE4zCZIyJX+MwLRMQ==", + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "async": "^2.6.1", - "compare-versions": "^3.2.1", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.0", - "js-yaml": "^3.12.0", - "make-dir": "^1.3.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + }, + "dependencies": { + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "lodash": "^4.17.10" + "ms": "^2.1.1" } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz", - "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", - "dev": true, - "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" - } - }, "istanbul-lib-report": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", - "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -4424,15 +6021,15 @@ } }, "istanbul-lib-source-maps": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", - "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", "source-map": "^0.6.1" }, "dependencies": { @@ -4445,10 +6042,41 @@ "ms": "^2.1.1" } }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "source-map": { @@ -4460,258 +6088,463 @@ } }, "istanbul-reports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.0.tgz", - "integrity": "sha512-azQdSX+dtTtkQEfqq20ICxWi6eOHXyHIgMFw1VOOVi8iIPWeCWRgCyFh/CsBKIhcgskMI8ExXmU7rjXTRCIJ+A==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "dev": true, "requires": { - "handlebars": "^4.0.11" + "handlebars": "^4.1.2" } }, "jest": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.0.0.tgz", - "integrity": "sha512-1Z2EblP4BnERbWZGtipGb9zjHDq7nCHgCY7V57F5SYaFRJV4DE1HKoOz+CRC5OrAThN9OVhRlUhTzsTFArg2iQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.0.0" + "jest-cli": "^24.9.0" }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "jest-cli": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.0.0.tgz", - "integrity": "sha512-mElnFipLaGxo1SiQ1CLvuaz3eX07MJc4HcyKrApSJf8xSdY1/EwaHurKwu1g2cDiwIgY8uHj7UcF5OYbtiBOWg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.15", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "istanbul-api": "^2.0.8", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-source-maps": "^3.0.1", - "jest-changed-files": "^24.0.0", - "jest-config": "^24.0.0", - "jest-environment-jsdom": "^24.0.0", - "jest-get-type": "^24.0.0", - "jest-haste-map": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-regex-util": "^24.0.0", - "jest-resolve-dependencies": "^24.0.0", - "jest-runner": "^24.0.0", - "jest-runtime": "^24.0.0", - "jest-snapshot": "^24.0.0", - "jest-util": "^24.0.0", - "jest-validate": "^24.0.0", - "jest-watcher": "^24.0.0", - "jest-worker": "^24.0.0", - "micromatch": "^3.1.10", - "node-notifier": "^5.2.1", - "p-each-series": "^1.0.0", - "pirates": "^4.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^5.0.0", - "which": "^1.2.12", - "yargs": "^12.0.2" + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { - "ansi-regex": "^4.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "jest-changed-files": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.0.0.tgz", - "integrity": "sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.0.0.tgz", - "integrity": "sha512-9/soqWL5YSq1ZJtgVJ5YYPCL1f9Mi2lVCp5+OXuYBOaN8DHSFRCSWip0rQ6N+mPTOEIAlCvcUH8zaPOwK4hePg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "babel-jest": "^24.0.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.0.0", - "jest-environment-node": "^24.0.0", - "jest-get-type": "^24.0.0", - "jest-jasmine2": "^24.0.0", - "jest-regex-util": "^24.0.0", - "jest-resolve": "^24.0.0", - "jest-util": "^24.0.0", - "jest-validate": "^24.0.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.0.0", - "realpath-native": "^1.0.2", - "uuid": "^3.3.2" + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.0.0.tgz", - "integrity": "sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.0.0", - "jest-get-type": "^24.0.0", - "pretty-format": "^24.0.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.0.0.tgz", - "integrity": "sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.0.0.tgz", - "integrity": "sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.0.0", - "jest-util": "^24.0.0", - "pretty-format": "^24.0.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz", - "integrity": "sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" + }, + "dependencies": { + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "jest-environment-jsdom-fourteen": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-0.1.0.tgz", + "integrity": "sha512-4vtoRMg7jAstitRzL4nbw83VmGH8Rs13wrND3Ud2o1fczDhMUF32iIrNKwYGgeOPUdfvZU4oy8Bbv+ni1fgVCA==", + "dev": true, + "requires": { + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0", + "jsdom": "^14.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + }, + "jsdom": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", + "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^6.0.4", + "acorn-globals": "^4.3.0", + "array-equal": "^1.0.0", + "cssom": "^0.3.4", + "cssstyle": "^1.1.1", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.0", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.1.3", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.5.0", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^6.1.2", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } } }, "jest-environment-node": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.0.0.tgz", - "integrity": "sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.0.0.tgz", - "integrity": "sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.0.0.tgz", - "integrity": "sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.0.0", - "jest-util": "^24.0.0", - "jest-worker": "^24.0.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", - "sane": "^3.0.0" + "sane": "^4.0.3", + "walker": "^1.0.7" }, "dependencies": { "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true } } }, "jest-jasmine2": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.0.0.tgz", - "integrity": "sha512-q1xEV9KHM0bgfBj3yrkrjRF5kxpNDkWPCwVfSPN1DC+pD6J5wrM9/u2BgzhKhALXiaZUUhJ+f/OcEC0Gwpw90A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.0.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-snapshot": "^24.0.0", - "jest-util": "^24.0.0", - "pretty-format": "^24.0.0" + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz", - "integrity": "sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "^24.0.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz", - "integrity": "sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.0.0", - "jest-get-type": "^24.0.0", - "pretty-format": "^24.0.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.0.0.tgz", - "integrity": "sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", "slash": "^2.0.0", @@ -4719,149 +6552,271 @@ } }, "jest-mock": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.0.0.tgz", - "integrity": "sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", "dev": true }, "jest-regex-util": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.0.0.tgz", - "integrity": "sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.0.0.tgz", - "integrity": "sha512-uKDGyJqNaBQKox1DJzm27CJobADsIMNgZGusXhtYzl98LKu/fKuokkRsd7EBVgoDA80HKHc3LOPKuYLryMu1vw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", - "realpath-native": "^1.0.0" + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" } }, "jest-resolve-dependencies": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.0.0.tgz", - "integrity": "sha512-CJGS5ME2g5wL16o3Y22ga9p5ntNT5CUYX40/0lYj9ic9jB5YHm/qMKTgbFt9kowEBiMOFpXy15dWtBTEU54+zg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "jest-regex-util": "^24.0.0", - "jest-snapshot": "^24.0.0" + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.0.0.tgz", - "integrity": "sha512-XefXm2XimKtwdfi2am4364GfCmLD1tOjiRtDexY65diCXt4Rw23rxj2wiW7p9s8Nh9dzJQNmrheqZ5rzvn762g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.0.0", - "jest-docblock": "^24.0.0", - "jest-haste-map": "^24.0.0", - "jest-jasmine2": "^24.0.0", - "jest-leak-detector": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-runtime": "^24.0.0", - "jest-util": "^24.0.0", - "jest-worker": "^24.0.0", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" }, "dependencies": { "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true } } }, "jest-runtime": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.0.0.tgz", - "integrity": "sha512-UeVoTGiij8upcqfyBlJvImws7IGY+ZWtgVpt1h4VmVbyei39tVGia/20VoP3yvodS6FdjTwBj+JzVNuoh/9UTw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.0.0", - "jest-haste-map": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-regex-util": "^24.0.0", - "jest-resolve": "^24.0.0", - "jest-snapshot": "^24.0.0", - "jest-util": "^24.0.0", - "jest-validate": "^24.0.0", - "micromatch": "^3.1.10", - "realpath-native": "^1.0.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", "slash": "^2.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.4.2", - "yargs": "^12.0.2" + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, "jest-serializer": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.0.0.tgz", - "integrity": "sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.0.0.tgz", - "integrity": "sha512-7OcrckVnfzVYxSGPYl2Sn+HyT30VpDv+FMBFbQxSQ6DV2K9Js6vYT6d4SBPKp6DfDiEL2txNssJBxtlvF+Dymw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "jest-message-util": "^24.0.0", - "jest-resolve": "^24.0.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.0.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "jest-util": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.0.0.tgz", - "integrity": "sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", "is-ci": "^2.0.0", - "jest-message-util": "^24.0.0", "mkdirp": "^0.5.1", "slash": "^2.0.0", "source-map": "^0.6.0" }, "dependencies": { "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "source-map": { @@ -4873,37 +6828,49 @@ } }, "jest-validate": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.0.0.tgz", - "integrity": "sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.0.0", - "leven": "^2.1.0", - "pretty-format": "^24.0.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } } }, "jest-watcher": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.0.0.tgz", - "integrity": "sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.0.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.0.0.tgz", - "integrity": "sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dev": true, "requires": { - "merge-stream": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -4930,16 +6897,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -4947,37 +6904,56 @@ "dev": true }, "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", + "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", "dev": true, "requires": { "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", + "acorn": "^6.1.1", + "acorn-globals": "^4.3.2", "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", + "cssom": "^0.3.6", + "cssstyle": "^1.2.2", + "data-urls": "^1.1.0", "domexception": "^1.0.1", - "escodegen": "^1.9.1", + "escodegen": "^1.11.1", "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", + "nwsapi": "^2.1.4", + "parse5": "5.1.0", "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", + "tough-cookie": "^3.0.1", "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "jsesc": { @@ -5074,9 +7050,9 @@ "dev": true }, "kleur": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.1.tgz", - "integrity": "sha512-P3kRv+B+Ra070ng2VKQqW4qW7gd/v3iD8sy/zOdcYRsfiD+QBokQNOps/AfP6Hr48cBhIIBFWckB9aO+IZhrWg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "lcid": { @@ -5095,9 +7071,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { @@ -5110,12 +7086,6 @@ "type-check": "~0.3.2" } }, - "lightercollective": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lightercollective/-/lightercollective-0.1.0.tgz", - "integrity": "sha512-J9tg5uraYoQKaWbmrzDDexbG6hHnMcWS1qLYgJSWE+mpA3U5OCSeMUhb+K55otgZJ34oFdR0ECvdIb3xuO5JOQ==", - "dev": true - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -5156,21 +7126,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.sortby": { @@ -5198,12 +7156,27 @@ } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "makeerror": { @@ -5215,6 +7188,12 @@ "tmpl": "1.0.x" } }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -5251,9 +7230,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true } } @@ -5279,20 +7258,11 @@ "readable-stream": "^2.0.1" } }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "micromatch": { "version": "3.1.10", @@ -5326,24 +7296,24 @@ } }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -5398,9 +7368,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -5418,6 +7388,12 @@ } } }, + "mixme": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.3.2.tgz", + "integrity": "sha512-tilCZOvIhRETXJuTmxxpz8mgplF7gmFhcH05JuR/YL+JLO98gLRQ1Mk4XpYQxxbPMKupSOv+Bidw7EKv8wds1w==", + "dev": true + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -5454,6 +7430,17 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "ms": { @@ -5540,9 +7527,9 @@ "optional": true }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "neo-async": { @@ -5558,9 +7545,9 @@ "dev": true }, "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, "node-int64": { @@ -5570,9 +7557,9 @@ "dev": true }, "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { "assert": "^1.1.1", @@ -5585,7 +7572,7 @@ "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -5597,7 +7584,7 @@ "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", - "vm-browserify": "0.0.4" + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -5615,21 +7602,22 @@ "dev": true }, "node-notifier": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", - "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", + "is-wsl": "^1.1.0", "semver": "^5.5.0", "shellwords": "^0.1.1", "which": "^1.3.0" } }, "node-releases": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.6.tgz", - "integrity": "sha512-lODUVHEIZutZx+TDdOk47qLik8FJMXzJ+WnyUGci1MTvTOyzZrz5eVPIIpc5Hb3NfHZGeGHeuwrRYVI1PEITWg==", + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.29.tgz", + "integrity": "sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==", "dev": true, "requires": { "semver": "^5.3.0" @@ -5672,9 +7660,9 @@ "dev": true }, "nwsapi": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", - "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", "dev": true }, "oauth-sign": { @@ -5735,6 +7723,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -5760,6 +7760,21 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, + "on-error-resume-next": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-error-resume-next/-/on-error-resume-next-1.1.0.tgz", + "integrity": "sha512-XhWMbmKV0+W95yLJjT1Z9zdkKiPUjDn63YYsji1pdvKqaa7pq4coeHaHEXPsa36SFlffOyOlPK/0rn6Njfb+LA==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5895,26 +7910,26 @@ "dev": true }, "pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "dev": true }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "parse-asn1": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", - "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -5942,9 +7957,9 @@ "dev": true }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, "pascalcase": { @@ -5954,9 +7969,9 @@ "dev": true }, "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, "path-dirname": { @@ -6018,10 +8033,21 @@ "dev": true }, "pidusage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-1.2.0.tgz", - "integrity": "sha512-OGo+iSOk44HRJ8q15AyG570UYxcm5u+R99DI8Khu8P3tKGkVu5EZX4ywHglWSTMNNXQ274oeGpYrvFEhDIFGPg==", - "dev": true + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.17.tgz", + "integrity": "sha512-N8X5v18rBmlBoArfS83vrnD0gIFyZkXEo7a5pAS2aT0i2OLVymFb2AzVg+v8l/QcXnE1JwZcaXR8daJcoJqtjw==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } }, "pify": { "version": "3.0.0", @@ -6029,15 +8055,6 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "pirates": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", - "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -6066,19 +8083,21 @@ "dev": true }, "pretty-format": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.0.0.tgz", - "integrity": "sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0" + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true } } @@ -6116,14 +8135,23 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promise-race-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promise-race-map/-/promise-race-map-1.0.0.tgz", + "integrity": "sha512-RYwgnSyjerbzP4sGuPHAuGq0/85zjkvpA2gwfl8gqoiyxWceIfxRY+Nk98NHSqjjsFCDtzo7iY3UhckE7LGJdQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.5" + } + }, "prompts": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.1.tgz", - "integrity": "sha512-8lnEOSIGQbgbnO47+13S+H204L8ISogGulyi0/NNEFAQ9D1VMNTrJ9SBX2Ra03V4iPn/zt36HQMndRYkaPoWiQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "dev": true, "requires": { - "kleur": "^3.0.0", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "prr": { @@ -6132,16 +8160,10 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.1.tgz", + "integrity": "sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA==", "dev": true }, "public-encrypt": { @@ -6159,9 +8181,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true } } @@ -6230,9 +8252,9 @@ "dev": true }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -6248,6 +8270,12 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, "react": { "version": "0.14.9", "resolved": "https://registry.npmjs.org/react/-/react-0.14.9.tgz", @@ -6264,6 +8292,12 @@ "integrity": "sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM=", "dev": true }, + "react-is": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", + "dev": true + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -6312,9 +8346,9 @@ } }, "realpath-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", - "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { "util.promisify": "^1.0.0" @@ -6330,14 +8364,6 @@ "esprima": "~3.1.0", "private": "~0.1.5", "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } } }, "regenerate": { @@ -6347,23 +8373,23 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", "dev": true, "requires": { "regenerate": "^1.4.0" } }, "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" }, "regenerator-transform": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", - "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", "dev": true, "requires": { "private": "^0.1.6" @@ -6380,36 +8406,23 @@ } }, "regexp-tree": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.1.tgz", - "integrity": "sha512-HwRjOquc9QOwKTgbxvZTcddS5mlNlwePMQ3NFL8broajMLD5CXDAqas8Y5yxJH5QtZp5iRor3YCILd5pz71Cgw==", - "dev": true, - "requires": { - "cli-table3": "^0.5.0", - "colors": "^1.1.2", - "yargs": "^12.0.5" - }, - "dependencies": { - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - } - } + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.13.tgz", + "integrity": "sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==", + "dev": true }, "regexpu-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", - "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", + "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^7.0.0", + "regenerate-unicode-properties": "^8.1.0", "regjsgen": "^0.5.0", "regjsparser": "^0.6.0", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.0.2" + "unicode-match-property-value-ecmascript": "^1.1.0" } }, "regjsgen": { @@ -6488,9 +8501,9 @@ "dev": true }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true }, "tough-cookie": { @@ -6506,23 +8519,23 @@ } }, "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, "requires": { - "lodash": "^4.13.1" + "lodash": "^4.17.11" } }, "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "dev": true, "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" } }, "require-directory": { @@ -6560,6 +8573,19 @@ "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } } }, "resolve-from": { @@ -6575,63 +8601,67 @@ "dev": true }, "restify": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/restify/-/restify-7.7.0.tgz", - "integrity": "sha512-BGirRv70pIy5W7tqX7s7+NNjBcjzU2YYgV4KABVbR5g8JjMeucgUzaf2VvTUSmz83qMZAuQ/gXEmPFyPHIcfJQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/restify/-/restify-8.4.0.tgz", + "integrity": "sha512-yqS/wJI0ZU78whO2VfCCnFY7/JSqJt7wTDIdaQUo/a4TzAaC5KXUzxbs+xW4afJCk3NefGYYuiSrFSBWwVw/NA==", "dev": true, "requires": { "assert-plus": "^1.0.0", "bunyan": "^1.8.12", - "csv": "^1.1.1", + "csv": "^5.1.1", "dtrace-provider": "^0.8.1", "escape-regexp-component": "^1.0.2", "ewma": "^2.0.1", - "find-my-way": "^1.13.0", + "find-my-way": "^2.0.1", "formidable": "^1.2.1", "http-signature": "^1.2.0", - "lodash": "^4.17.10", - "lru-cache": "^4.1.3", - "mime": "^1.5.0", - "negotiator": "^0.6.1", + "lodash": "^4.17.11", + "lru-cache": "^5.1.1", + "mime": "^2.4.3", + "negotiator": "^0.6.2", "once": "^1.4.0", - "pidusage": "^1.2.0", - "qs": "^6.5.2", - "restify-errors": "^5.0.0", - "semver": "^5.4.1", - "spdy": "^3.4.7", - "uuid": "^3.1.0", - "vasync": "^1.6.4", - "verror": "^1.10.0" + "pidusage": "^2.0.17", + "qs": "^6.7.0", + "restify-errors": "^8.0.0", + "semver": "^6.1.1", + "send": "^0.16.2", + "spdy": "^4.0.0", + "uuid": "^3.3.2", + "vasync": "^2.2.0" }, "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } + "qs": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.8.0.tgz", + "integrity": "sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==", + "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "restify-errors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/restify-errors/-/restify-errors-5.0.0.tgz", - "integrity": "sha512-+vby9Kxf7qlzvbZSTIEGkIixkeHG+pVCl34dk6eKnL+ua4pCezpdLT/1/eabzPZb65ADrgoc04jeWrrF1E1pvQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/restify-errors/-/restify-errors-8.0.1.tgz", + "integrity": "sha512-EFQpxS828J0SBTNuJjh+rHD0OE8BoqnaxMAzuKHRNnGt5BV/212HHQIelZG4zjZYpTDEiuVAhQYHwSGSzAz0Ag==", "dev": true, "requires": { + "@netflix/nerror": "^1.0.0", "assert-plus": "^1.0.0", - "lodash": "^4.2.1", - "safe-json-stringify": "^1.0.3", - "verror": "^1.8.1" + "lodash": "^4.17.15", + "safe-json-stringify": "^1.0.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "ret": { @@ -6641,9 +8671,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", "dev": true, "requires": { "glob": "^7.1.3" @@ -6660,9 +8690,9 @@ } }, "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, "run-queue": { @@ -6704,6 +8734,23 @@ "ret": "~0.1.10" } }, + "safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dev": true, + "requires": { + "ret": "~0.2.0" + }, + "dependencies": { + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true + } + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -6711,21 +8758,20 @@ "dev": true }, "sane": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-3.1.0.tgz", - "integrity": "sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { + "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", "execa": "^1.0.0", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" + "walker": "~1.0.5" } }, "sax": { @@ -6734,13 +8780,23 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, @@ -6762,10 +8818,39 @@ "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==", "dev": true }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", "dev": true }, "set-blocking": { @@ -6775,9 +8860,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -6803,6 +8888,12 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -6840,10 +8931,16 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-update-in": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/simple-update-in/-/simple-update-in-2.1.1.tgz", + "integrity": "sha512-Iw4tMvOoibV6XqOqKgKgpMnFdgEtafhZv2KxNhHPAgXBtKrCTY6QFxMpvmSSuRHMK5uJ9hb6X+zniiTHVD7Sig==", + "dev": true + }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", "dev": true }, "slash": { @@ -7053,32 +9150,75 @@ "dev": true }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "dev": true, "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", + "debug": "^4.1.0", + "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "spdy-transport": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", - "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", + "debug": "^4.1.0", + "detect-node": "^2.0.4", "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "split-string": { @@ -7090,12 +9230,6 @@ "extend-shallow": "^3.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -7149,6 +9283,12 @@ } } }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -7195,10 +9335,13 @@ "dev": true }, "stream-transform": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-0.2.2.tgz", - "integrity": "sha1-dYZ0h/SVKPi/HYJJllh1PQLfeDg=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.0.1.tgz", + "integrity": "sha512-GiTcO/rRvZP2R8WPwxmxCFP+Of1yIATuFAmYkvSLDfcD93X2WHiPwdgIqeFT2CvL1gyAsjQvu1nB6RDNQ5b2jw==", + "dev": true, + "requires": { + "mixme": "^0.3.1" + } }, "string-length": { "version": "2.0.0", @@ -7265,9 +9408,9 @@ "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "tapable": { @@ -7277,20 +9420,20 @@ "dev": true }, "terser": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", - "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.0.tgz", + "integrity": "sha512-w5CzrvQOwYAH54aG22IrUJI4yX1w62XQmMdEOM6H4w0ii6rc3HJ89fmcOGN5mRwBWfUgaqO7RJTp4aoY/uE+qQ==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.6" + "source-map-support": "~0.5.12" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true }, "source-map": { @@ -7298,36 +9441,36 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, "terser-webpack-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", - "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "dev": true, "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^3.8.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7337,15 +9480,23 @@ } }, "test-exclude": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz", - "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, "requires": { - "arrify": "^1.0.1", + "glob": "^7.1.3", "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + } } }, "throat": { @@ -7371,9 +9522,9 @@ } }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -7506,6 +9657,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -7513,32 +9670,32 @@ "dev": true }, "typescript": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.1.tgz", - "integrity": "sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", + "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==", "dev": true }, "ua-parser-js": { - "version": "0.7.19", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", - "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==", + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==", "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, "optional": true }, @@ -7568,50 +9725,27 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", "dev": true }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-filename": { @@ -7624,9 +9758,9 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -7673,9 +9807,9 @@ } }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "uri-js": { @@ -7749,9 +9883,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, "validate-npm-package-license": { @@ -7765,29 +9899,12 @@ } }, "vasync": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", - "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.0.tgz", + "integrity": "sha1-z951GGChWCLbOxMrxZsRakra8Bs=", "dev": true, "requires": { - "verror": "1.6.0" - }, - "dependencies": { - "extsprintf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", - "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=", - "dev": true - }, - "verror": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", - "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", - "dev": true, - "requires": { - "extsprintf": "1.2.0" - } - } + "verror": "1.10.0" } }, "verror": { @@ -7802,13 +9919,10 @@ } }, "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true }, "w3c-hr-time": { "version": "1.0.1", @@ -7819,6 +9933,17 @@ "browser-process-hrtime": "^0.1.2" } }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -7828,16 +9953,6 @@ "makeerror": "1.0.x" } }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - } - }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", @@ -7865,113 +9980,191 @@ "dev": true }, "webpack": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.0.tgz", - "integrity": "sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "version": "4.39.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.3.tgz", + "integrity": "sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" }, "dependencies": { "acorn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", - "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "enhanced-resolve": { + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.8.tgz", + "integrity": "sha512-RANYSXwikSWINjHMd/mtesblNSpjpDLoYTBtP99n1RhXqVI/wxN40Auqy42I7y4xrbmRBoA5Zy5E0JSBD5XRhw==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "minimist": "^1.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" } }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "has-flag": "^3.0.0" } }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, - "webpack-cli": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.1.tgz", - "integrity": "sha512-jeJveHwz/vwpJ3B8bxEL5a/rVKIpRNJDsKggfKnxuYeohNDW4Y/wB9N/XHJA093qZyS0r6mYL+/crLsIol4WKA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "global-modules-path": "^2.3.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "lightercollective": "^0.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.4" - } - }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -8020,9 +10213,9 @@ "dev": true }, "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -8052,9 +10245,9 @@ "dev": true }, "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { "errno": "~0.1.7" @@ -8113,24 +10306,13 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", + "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "^1.0.0" } }, "xml-name-validator": { @@ -8139,10 +10321,16 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { diff --git a/package.json b/package.json index b7c0f9605..a6f2120a1 100644 --- a/package.json +++ b/package.json @@ -3,23 +3,21 @@ "version": "0.11.5-0", "description": "Client library for the Microsoft Bot Framework Direct Line 3.0 protocol", "files": [ - "built/**/*", - "directLine.js" + "directLine.js", + "lib/**/*" ], - "main": "built/directLine.js", - "types": "built/directLine.d.ts", + "main": "lib/directLine.js", + "types": "lib/directLine.d.ts", "scripts": { - "build": "npm run build:typecheck && npm run build:babel", - "build:babel": "babel --extensions .js,.ts,.tsx --ignore **/*.spec.js,**/*.spec.ts,**/*.spec.tsx,**/*.test.js,**/*.test.ts,**/*.test.tsx,__test__/**/*.js,__test__/**/*.ts,__test__/**/*.tsx --out-dir built --source-maps inline --verbose src", - "build:babel-instrumented": "npm run build:babel -- --env-name test && npm run build:webpack-instrumented", + "build": "npm run build:typecheck && npm run build:babel -- --env-name test && npm run build:webpack -- --config webpack-development.config.js", + "build:babel": "babel --extensions .js,.ts --out-dir lib src", "build:typecheck": "tsc", "build:webpack": "webpack", - "build:webpack-instrumented": "webpack --config webpack-instrumented.config.js", - "build:webpack-watch": "webpack --config webpack-watch.config.js --watch", - "clean": "rimraf built directLine.js directLine-instrument.js stats.html", - "prepublishOnly": "npm run build && npm run build:webpack", + "clean": "rimraf lib directLine.js stats.html", + "prepublishOnly": "npm run build:typecheck && npm run build:babel && npm run build:webpack", + "start": "npm run build && concurrently --names \"babel,typecheck,webpack\" \"npm run build:babel -- --watch\" \"npm run build:typecheck -- --preserveWatchOutput --watch\" \"npm run build:webpack -- --config webpack-watch.config.js --watch\"", "test": "jest", - "watch": "concurrently --names \"babel,typecheck,webpack\" \"npm run build:babel-instrumented -- --watch\" \"npm run build:typecheck -- --preserveWatchOutput --watch\" \"npm run build:webpack-watch\"" + "watch": "npm run start" }, "repository": { "type": "git", @@ -28,32 +26,39 @@ "author": "Microsoft Corporation", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.3.1", + "@babel/runtime": "^7.6.0", "rxjs": "^5.0.3" }, "devDependencies": { - "@babel/cli": "^7.2.3", - "@babel/core": "^7.2.2", - "@babel/plugin-proposal-class-properties": "^7.3.0", - "@babel/plugin-proposal-object-rest-spread": "^7.3.1", - "@babel/plugin-transform-runtime": "^7.2.0", - "@babel/preset-env": "^7.3.1", - "@babel/preset-typescript": "^7.1.0", - "@types/jest": "^23.3.10", - "@types/node": "^10.12.21", - "@types/p-defer": "^1.0.3", - "babel-jest": "^24.0.0", - "babel-plugin-istanbul": "^5.1.0", - "concurrently": "^4.1.0", - "get-port": "^4.1.0", + "@babel/cli": "^7.6.0", + "@babel/core": "^7.6.0", + "@babel/plugin-proposal-class-properties": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-runtime": "^7.6.0", + "@babel/preset-env": "^7.6.0", + "@babel/preset-typescript": "^7.6.0", + "@types/jest": "^24.0.18", + "@types/node": "^12.7.4", + "@types/p-defer": "^2.0.0", + "babel-jest": "^24.9.0", + "babel-plugin-istanbul": "^5.2.0", + "babel-plugin-transform-inline-environment-variables": "^0.4.3", + "concurrently": "^4.1.2", + "dotenv": "^8.1.0", + "get-port": "^5.0.0", "has-resolved": "^1.1.0", - "jest": "^24.0.0", - "node-fetch": "^2.3.0", - "restify": "^7.7.0", - "rimraf": "^2.6.3", - "typescript": "^3.3.1", - "webpack": "^4.29.0", - "webpack-cli": "^3.2.1", + "jest": "^24.9.0", + "jest-environment-jsdom-fourteen": "^0.1.0", + "jsdom": "^15.1.1", + "node-fetch": "^2.6.0", + "on-error-resume-next": "^1.1.0", + "promise-race-map": "^1.0.0", + "restify": "^8.4.0", + "rimraf": "^3.0.0", + "simple-update-in": "^2.1.1", + "typescript": "^3.6.2", + "webpack": "^4.39.3", + "webpack-cli": "^3.3.8", "webpack-visualizer-plugin": "^0.1.11" } } diff --git a/webpack-development.config.js b/webpack-development.config.js new file mode 100644 index 000000000..2f8eab5fa --- /dev/null +++ b/webpack-development.config.js @@ -0,0 +1,6 @@ +const webpackConfig = require('./webpack.config'); + +module.exports = { + ...webpackConfig, + mode: 'development' +}; diff --git a/webpack-instrumented.config.js b/webpack-instrumented.config.js deleted file mode 100644 index 3a921f74c..000000000 --- a/webpack-instrumented.config.js +++ /dev/null @@ -1,12 +0,0 @@ -const webpackConfig = require('./webpack.config'); - -// In order to pack instrumented build, make sure you are using Babel with NODE_ENV=TEST. -// This configuration file only change the entrypoints and will not add any instrumentation code. - -module.exports = { - ...webpackConfig, - entry: { - 'directLine-instrumented': './built/directLine.js' - }, - mode: 'development' -}; diff --git a/webpack-watch.config.js b/webpack-watch.config.js index 544fd43bf..148c63eae 100644 --- a/webpack-watch.config.js +++ b/webpack-watch.config.js @@ -1,8 +1,7 @@ -const webpackConfig = require('./webpack.config'); +const webpackConfig = require('./webpack-development.config'); module.exports = { ...webpackConfig, - mode: 'development', stats: { assets: false, builtAt: false, diff --git a/webpack.config.js b/webpack.config.js index d79916779..bde50e1f3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,4 +1,3 @@ -const { resolve } = require('path'); const { DefinePlugin } = require('webpack'); const Visualizer = require('webpack-visualizer-plugin'); From 8712825696cec2b855963b8aa8bdab0195c14e0c Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 9 Sep 2019 20:10:12 -0700 Subject: [PATCH 02/39] Add proxy to Web Socket --- __tests__/constants.json | 4 +- __tests__/happy.postActivity.js | 18 +- __tests__/setup/jsdomEnvironmentWithProxy.js | 62 +++++++ jest.config.js | 2 + package-lock.json | 168 ++++++++----------- package.json | 3 +- 6 files changed, 140 insertions(+), 117 deletions(-) create mode 100644 __tests__/setup/jsdomEnvironmentWithProxy.js diff --git a/__tests__/constants.json b/__tests__/constants.json index 93469db04..02cdb8bd5 100644 --- a/__tests__/constants.json +++ b/__tests__/constants.json @@ -1,6 +1,8 @@ { "timeouts": { "default": 5000, - "rest": 10000 + "rest": 10000, + "streamingExtensions": 10000, + "webSocket": 10000 } } diff --git a/__tests__/happy.postActivity.js b/__tests__/happy.postActivity.js index 86e79da42..13fed9e80 100644 --- a/__tests__/happy.postActivity.js +++ b/__tests__/happy.postActivity.js @@ -11,19 +11,6 @@ import waitForConnected from './setup/waitForConnected'; beforeAll(() => { jest.setTimeout(timeouts.default); - - const { ResourceLoader } = require('jsdom'); - const { HTTP_PROXY } = process.env; - - const resources = new ResourceLoader({ - proxy: HTTP_PROXY, - strictSSL: !HTTP_PROXY - }); - - // HACK: We cannot set ResourceLoader thru testEnvironmentOptions.resources. - // This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic). - // Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeeded when running without watch. - window._resourceLoader = resources; }); function sleep(ms = 1000) { @@ -43,7 +30,7 @@ describe('Happy path', () => { if (directLine) { unsubscribes.push(await waitForConnected(directLine)); - await sleep(100); + // await sleep(100); await Promise.all([ postActivity(directLine, { text: 'Hello, World!', type: 'message' }), @@ -65,10 +52,13 @@ describe('Happy path', () => { }); // test('using Streaming Extensions', async () => { + // jest.setTimeout(timeouts.webSocket); // directLine = new DirectLine(await createDirectLineOptions.forStreamingExtensions()); // }); describe('using Web Socket', () => { + beforeEach(() => jest.setTimeout(timeouts.webSocket)); + test('with secret', async () => { directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); }); diff --git a/__tests__/setup/jsdomEnvironmentWithProxy.js b/__tests__/setup/jsdomEnvironmentWithProxy.js new file mode 100644 index 000000000..f4e048d23 --- /dev/null +++ b/__tests__/setup/jsdomEnvironmentWithProxy.js @@ -0,0 +1,62 @@ +const { parse } = require('url'); +const HttpsProxyAgent = require('https-proxy-agent'); +const JSDOMEnvironment = require('jest-environment-jsdom-fourteen'); +const WebSocket = require('ws'); + +const { HTTP_PROXY } = process.env; + +function addProxyToWebSocket(window) { + if (HTTP_PROXY) { + const agent = new HttpsProxyAgent({ + ...parse(HTTP_PROXY), + rejectUnauthorized: false + }); + + window.WebSocket = new Proxy(WebSocket, { + construct(target, [url, protocols = undefined, options = undefined]) { + return new target( + url, + protocols, + { + ...options, + agent + } + ); + } + }); + + // The above line is a HACK until we figure out how to call the following line without errors + // The following line use jsdom version of WebSocket, which will include cookies + + // this.global.WebSocket = require('jsdom/lib/jsdom/living/generated/WebSocket').createInterface({ window: global }).interface; + } +} + +function addProxyToResourceLoader(window) { + const { ResourceLoader } = require('jsdom'); + + const resources = new ResourceLoader({ + proxy: HTTP_PROXY, + strictSSL: !HTTP_PROXY + }); + + // HACK: We cannot set ResourceLoader thru testEnvironmentOptions.resources. + // This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic). + // Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeeded when running without watch. + window._resourceLoader = resources; +} + +class JSDOMEnvironmentWithProxy extends JSDOMEnvironment { + setup() { + if (HTTP_PROXY) { + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + } + + addProxyToWebSocket(this.global); + addProxyToResourceLoader(this.global); + + return super.setup(); + } +} + +module.exports = JSDOMEnvironmentWithProxy; diff --git a/jest.config.js b/jest.config.js index 2c2f3561d..fe4703d94 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,6 @@ module.exports = { + testEnvironment: './__tests__/setup/jsdomEnvironmentWithProxy', + // testEnvironment: 'jest-environment-jsdom-fourteen', testMatch: [ '**/__tests__/**/*.[jt]s?(x)', '**/?(*.)(spec|test).[jt]s?(x)' diff --git a/package-lock.json b/package-lock.json index 62e17486c..cba26566b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2418,6 +2418,15 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, "ajv": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", @@ -4117,6 +4126,21 @@ "is-symbol": "^1.0.2" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -5498,6 +5522,33 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5584,12 +5635,6 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -6372,74 +6417,6 @@ "jest-mock": "^24.5.0", "jest-util": "^24.5.0", "jsdom": "^14.0.0" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } } }, "jest-environment-node": { @@ -6904,36 +6881,36 @@ "dev": true }, "jsdom": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", - "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", + "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", "dev": true, "requires": { "abab": "^2.0.0", - "acorn": "^6.1.1", - "acorn-globals": "^4.3.2", + "acorn": "^6.0.4", + "acorn-globals": "^4.3.0", "array-equal": "^1.0.0", - "cssom": "^0.3.6", - "cssstyle": "^1.2.2", + "cssom": "^0.3.4", + "cssstyle": "^1.1.1", "data-urls": "^1.1.0", "domexception": "^1.0.1", - "escodegen": "^1.11.1", + "escodegen": "^1.11.0", "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.4", + "nwsapi": "^2.1.3", "parse5": "5.1.0", "pn": "^1.1.0", "request": "^2.88.0", - "request-promise-native": "^1.0.7", + "request-promise-native": "^1.0.5", "saxes": "^3.1.9", "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", + "tough-cookie": "^2.5.0", "w3c-hr-time": "^1.0.1", "w3c-xmlserializer": "^1.1.2", "webidl-conversions": "^4.0.2", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^7.0.0", - "ws": "^7.0.0", + "ws": "^6.1.2", "xml-name-validator": "^3.0.0" }, "dependencies": { @@ -6942,17 +6919,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } } } }, @@ -10307,12 +10273,12 @@ "dev": true }, "ws": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", - "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "async-limiter": "^1.0.0" + "async-limiter": "~1.0.0" } }, "xml-name-validator": { diff --git a/package.json b/package.json index a6f2120a1..0748be2e8 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,10 @@ "dotenv": "^8.1.0", "get-port": "^5.0.0", "has-resolved": "^1.1.0", + "https-proxy-agent": "^2.2.2", "jest": "^24.9.0", "jest-environment-jsdom-fourteen": "^0.1.0", - "jsdom": "^15.1.1", + "jsdom": "^14.1.0", "node-fetch": "^2.6.0", "on-error-resume-next": "^1.1.0", "promise-race-map": "^1.0.0", From 45b30ee9b2bfa85ba8ad3d181396dcc35b4bd7b2 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 9 Sep 2019 22:43:58 -0700 Subject: [PATCH 03/39] Use global agent --- __tests__/setup/jsdomEnvironmentWithProxy.js | 63 ++------ jest.config.js | 1 - package-lock.json | 151 +++++++++++++------ package.json | 2 +- 4 files changed, 115 insertions(+), 102 deletions(-) diff --git a/__tests__/setup/jsdomEnvironmentWithProxy.js b/__tests__/setup/jsdomEnvironmentWithProxy.js index f4e048d23..089583861 100644 --- a/__tests__/setup/jsdomEnvironmentWithProxy.js +++ b/__tests__/setup/jsdomEnvironmentWithProxy.js @@ -1,61 +1,22 @@ -const { parse } = require('url'); -const HttpsProxyAgent = require('https-proxy-agent'); -const JSDOMEnvironment = require('jest-environment-jsdom-fourteen'); -const WebSocket = require('ws'); - -const { HTTP_PROXY } = process.env; - -function addProxyToWebSocket(window) { - if (HTTP_PROXY) { - const agent = new HttpsProxyAgent({ - ...parse(HTTP_PROXY), - rejectUnauthorized: false - }); - - window.WebSocket = new Proxy(WebSocket, { - construct(target, [url, protocols = undefined, options = undefined]) { - return new target( - url, - protocols, - { - ...options, - agent - } - ); - } - }); +require('global-agent/bootstrap'); - // The above line is a HACK until we figure out how to call the following line without errors - // The following line use jsdom version of WebSocket, which will include cookies - - // this.global.WebSocket = require('jsdom/lib/jsdom/living/generated/WebSocket').createInterface({ window: global }).interface; - } -} +// To use proxy, SET GLOBAL_AGENT_HTTP_PROXY=http://localhost:8888 -function addProxyToResourceLoader(window) { - const { ResourceLoader } = require('jsdom'); - - const resources = new ResourceLoader({ - proxy: HTTP_PROXY, - strictSSL: !HTTP_PROXY - }); - - // HACK: We cannot set ResourceLoader thru testEnvironmentOptions.resources. - // This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic). - // Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeeded when running without watch. - window._resourceLoader = resources; -} +const JSDOMEnvironment = require('jest-environment-jsdom-fourteen'); class JSDOMEnvironmentWithProxy extends JSDOMEnvironment { setup() { - if (HTTP_PROXY) { - process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; - } + if (process.env.GLOBAL_AGENT_HTTP_PROXY) { + const { ResourceLoader } = require('jsdom'); + const resources = new ResourceLoader({ strictSSL: false }); - addProxyToWebSocket(this.global); - addProxyToResourceLoader(this.global); + // HACK: We cannot set ResourceLoader thru testEnvironmentOptions.resources. + // This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic). + // Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeeded when running without watch. + this.global._resourceLoader = resources; - return super.setup(); + return super.setup(); + } } } diff --git a/jest.config.js b/jest.config.js index fe4703d94..ff6665193 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,5 @@ module.exports = { testEnvironment: './__tests__/setup/jsdomEnvironmentWithProxy', - // testEnvironment: 'jest-environment-jsdom-fourteen', testMatch: [ '**/__tests__/**/*.[jt]s?(x)', '**/?(*.)(spec|test).[jt]s?(x)' diff --git a/package-lock.json b/package-lock.json index cba26566b..6b8f76ab0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2418,15 +2418,6 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, "ajv": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", @@ -2946,6 +2937,12 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, + "boolean": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-1.0.0.tgz", + "integrity": "sha512-IB1lgIywn37N9Aff8CciCblVpMUflgL42vyxPUH0IvaDdIi/QwBHKv1lq/HOkATHCfa7c4MbMYJ7Bo7hGuoI+w==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4126,21 +4123,12 @@ "is-symbol": "^1.0.2" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -5266,6 +5254,35 @@ } } }, + "global-agent": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.0.2.tgz", + "integrity": "sha512-mQLICTW+QGJPuEI8WvEjdyPCcEnx5OqmJH2ADGtv9NknBfUsTnUsV9NeKfrjkwauT2zrSGQqDrS49f86kvnXoA==", + "dev": true, + "requires": { + "boolean": "^1.0.0", + "core-js": "^3.2.1", + "es6-error": "^4.1.1", + "matcher": "^2.0.0", + "roarr": "^2.14.1", + "semver": "^6.3.0", + "serialize-error": "^4.1.0" + }, + "dependencies": { + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -5307,6 +5324,17 @@ "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, + "globalthis": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.0.tgz", + "integrity": "sha512-vcCAZTJ3r5Qcu5l8/2oyVdoFwxKgfYnMTR2vwWeux/NAVZK3PwcMaWkdUIn4GJbmKuRK7xcvDsLuK+CKcXyodg==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "object-keys": "^1.0.12" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -5522,33 +5550,6 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7184,6 +7185,23 @@ "object-visit": "^1.0.0" } }, + "matcher": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.0.0.tgz", + "integrity": "sha512-nlmfSlgHBFx36j/Pl/KQPbIaqE8Zf0TqmSMjsuddHDg6PMSVgmyW9HpkLs0o0M1n2GIZ/S2BZBLIww/xjhiGng==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -8655,6 +8673,20 @@ "inherits": "^2.0.1" } }, + "roarr": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.14.1.tgz", + "integrity": "sha512-Fhm9shQ8JhpjFnOT7bgxKR7Xcg1Tq+0/Tdy+bloB4sUxxAib4MZDMJ6AjUBRE+798l2MnhhF2JTqbqx1+/kRyQ==", + "dev": true, + "requires": { + "boolean": "^1.0.0", + "detect-node": "^2.0.4", + "globalthis": "^1.0.0", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -8778,6 +8810,12 @@ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "semver-store": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", @@ -8813,6 +8851,15 @@ } } }, + "serialize-error": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-4.1.0.tgz", + "integrity": "sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw==", + "dev": true, + "requires": { + "type-fest": "^0.3.0" + } + }, "serialize-javascript": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", @@ -9196,6 +9243,12 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", diff --git a/package.json b/package.json index 0748be2e8..4256e6ea8 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "concurrently": "^4.1.2", "dotenv": "^8.1.0", "get-port": "^5.0.0", + "global-agent": "^2.0.2", "has-resolved": "^1.1.0", - "https-proxy-agent": "^2.2.2", "jest": "^24.9.0", "jest-environment-jsdom-fourteen": "^0.1.0", "jsdom": "^14.1.0", From 4b28aa66528ecdac54bf8fa37222f06d647cb2d5 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 11:29:26 -0700 Subject: [PATCH 04/39] Fix reliability --- __tests__/happy.postActivity.js | 33 +++++++++++++++------------------ __tests__/setup/postActivity.js | 20 +++++++++++++------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/__tests__/happy.postActivity.js b/__tests__/happy.postActivity.js index 13fed9e80..63bb5bb6e 100644 --- a/__tests__/happy.postActivity.js +++ b/__tests__/happy.postActivity.js @@ -9,10 +9,6 @@ import postActivity from './setup/postActivity'; import waitForBotEcho from './setup/waitForBotEcho'; import waitForConnected from './setup/waitForConnected'; -beforeAll(() => { - jest.setTimeout(timeouts.default); -}); - function sleep(ms = 1000) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -23,22 +19,9 @@ describe('Happy path', () => { beforeEach(() => unsubscribes = []); afterEach(() => unsubscribes.forEach(fn => onErrorResumeNext(fn))); - describe('should connect, send messaage, and receive echo from bot', () => { + describe('should connect, send message, and receive echo from bot', () => { let directLine; - afterEach(async () => { - if (directLine) { - unsubscribes.push(await waitForConnected(directLine)); - - // await sleep(100); - - await Promise.all([ - postActivity(directLine, { text: 'Hello, World!', type: 'message' }), - waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') - ]); - } - }); - describe('using REST', () => { beforeEach(() => jest.setTimeout(timeouts.rest)); @@ -67,5 +50,19 @@ describe('Happy path', () => { directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); }); }); + + afterEach(async () => { + // If directLine object is undefined, that means the test is failing. + if (!directLine) { return; } + + unsubscribes.push(await waitForConnected(directLine)); + + // await sleep(100); + + await Promise.all([ + postActivity(directLine, { text: 'Hello, World!', type: 'message' }), + waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') + ]); + }); }); }); diff --git a/__tests__/setup/postActivity.js b/__tests__/setup/postActivity.js index df084b17b..8587da222 100644 --- a/__tests__/setup/postActivity.js +++ b/__tests__/setup/postActivity.js @@ -6,12 +6,18 @@ import waitForObservable from './waitForObservable'; const DEFAULT_USER_ID = 'u-12345'; export default async function postActivity(directLine, activity) { - const activityId = await waitForObservable( - directLine.postActivity( - updateIn(activity, ['from', 'id'], userId => userId || DEFAULT_USER_ID) - ), - () => true - ); + // We need to use channelData.clientActivityId because postActivity could come later than the activity$ observable. + // Thus, when we receive the activity ID for the "just posted" activity, it might be already too late. - await waitForActivity(directLine, ({ id }) => id === activityId); + const targetClientActivityId = Math.random().toString(36).substr(2); + + activity = updateIn(activity, ['from', 'id'], userId => userId || DEFAULT_USER_ID); + activity = updateIn(activity, ['channelData', 'clientActivityId'], () => targetClientActivityId); + + const [activityId] = await Promise.all([ + waitForObservable(directLine.postActivity(activity), () => true), + waitForActivity(directLine, ({ channelData: { clientActivityId } = {} }) => clientActivityId === targetClientActivityId) + ]); + + return activityId; } From 7c76df7384bbcf6ac7de6dc7b9ce4e393a096c1a Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 14:27:05 -0700 Subject: [PATCH 05/39] Add upload attachment test --- __tests__/happy.postActivity.js | 6 -- __tests__/happy.uploadAttachments.js | 108 +++++++++++++++++++++++++++ __tests__/setup/fetchAsBase64.js | 13 ++++ __tests__/setup/waitForBotEcho.js | 4 +- __tests__/setup/waitForObservable.js | 2 +- 5 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 __tests__/happy.uploadAttachments.js create mode 100644 __tests__/setup/fetchAsBase64.js diff --git a/__tests__/happy.postActivity.js b/__tests__/happy.postActivity.js index 63bb5bb6e..27f345f74 100644 --- a/__tests__/happy.postActivity.js +++ b/__tests__/happy.postActivity.js @@ -9,10 +9,6 @@ import postActivity from './setup/postActivity'; import waitForBotEcho from './setup/waitForBotEcho'; import waitForConnected from './setup/waitForConnected'; -function sleep(ms = 1000) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - describe('Happy path', () => { let unsubscribes; @@ -57,8 +53,6 @@ describe('Happy path', () => { unsubscribes.push(await waitForConnected(directLine)); - // await sleep(100); - await Promise.all([ postActivity(directLine, { text: 'Hello, World!', type: 'message' }), waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') diff --git a/__tests__/happy.uploadAttachments.js b/__tests__/happy.uploadAttachments.js new file mode 100644 index 000000000..67d2327e0 --- /dev/null +++ b/__tests__/happy.uploadAttachments.js @@ -0,0 +1,108 @@ +import 'dotenv/config'; + +import onErrorResumeNext from 'on-error-resume-next'; + +import { DirectLine } from '../src/directLine'; +import { timeouts } from './constants.json'; +import * as createDirectLineOptions from './setup/createDirectLineOptions'; +import fetchAsBase64 from './setup/fetchAsBase64'; +import postActivity from './setup/postActivity'; +import waitForBotEcho from './setup/waitForBotEcho'; +import waitForConnected from './setup/waitForConnected'; + +describe('Happy path', () => { + let unsubscribes; + + beforeEach(() => unsubscribes = []); + afterEach(() => unsubscribes.forEach(fn => onErrorResumeNext(fn))); + + describe('upload 2 attachments with text messages', () => { + let directLine; + + describe('using REST', () => { + beforeEach(() => jest.setTimeout(timeouts.rest)); + + test.only('with secret', async () => { + directLine = new DirectLine(await createDirectLineOptions.forREST({ token: false })); + }); + + test('with token', async () => { + directLine = new DirectLine(await createDirectLineOptions.forREST({ token: true })); + }); + }); + + // test('using Streaming Extensions', async () => { + // jest.setTimeout(timeouts.webSocket); + // directLine = new DirectLine(await createDirectLineOptions.forStreamingExtensions()); + // }); + + describe('using Web Socket', () => { + beforeEach(() => jest.setTimeout(timeouts.webSocket)); + + test('with secret', async () => { + directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + }); + + test('with token', async () => { + directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + }); + }); + + afterEach(async () => { + // If directLine object is undefined, that means the test is failing. + if (!directLine) { return; } + + unsubscribes.push(await waitForConnected(directLine)); + + const sendingActivity = { + // DirectLine.postActivityWithAttachments support "contentUrl" only but not "content" + attachments: [{ + contentType: 'image/png', + // contentUrl: 'http://localhost:3978/public/surfacelogo.png' + contentUrl: 'https://webchat-waterbottle.azurewebsites.net/public/surfacelogo.png' + }, { + contentType: 'image/png', + // contentUrl: 'http://localhost:3978/public/xboxlogo.png' + contentUrl: 'https://webchat-waterbottle.azurewebsites.net/public/xboxlogo.png' + }], + text: 'Hello, World!', + type: 'message' + }; + + await Promise.all([ + postActivity(directLine, sendingActivity), + waitForBotEcho(directLine, async ({ attachments, text }) => { + if (text === 'Hello, World!') { + // Bug #194 is causing trouble on the order of attachments sent. + // https://github.com/microsoft/BotFramework-DirectLineJS/issues/194 + + // Until the bug is fixed, we will not check the order. + + const [expecteds, actuals] = await Promise.all([ + Promise.all([ + fetchAsBase64(sendingActivity.attachments[0].contentUrl), + fetchAsBase64(sendingActivity.attachments[1].contentUrl) + ]), + Promise.all([ + fetchAsBase64(attachments[0].contentUrl), + fetchAsBase64(attachments[1].contentUrl) + ]) + ]); + + expect(attachments[0]).not.toBe(attachments[1]); + expect(~actuals.indexOf(expecteds[0])).toBeTruthy(); + expect(~actuals.indexOf(expecteds[1])).toBeTruthy(); + + // Use the commented code below after bug #194 is fixed. + // https://github.com/microsoft/BotFramework-DirectLineJS/issues/194 + + // await expect(fetchAsBase64(attachments[0].contentUrl)).resolves.toBe(await fetchAsBase64(sendingActivity.attachments[0].contentUrl)); + // await expect(fetchAsBase64(attachments[1].contentUrl)).resolves.toBe(await fetchAsBase64(sendingActivity.attachments[1].contentUrl)); + + return true; + } + }) + ]); + }); + }); +}); diff --git a/__tests__/setup/fetchAsBase64.js b/__tests__/setup/fetchAsBase64.js new file mode 100644 index 000000000..88cbc37e9 --- /dev/null +++ b/__tests__/setup/fetchAsBase64.js @@ -0,0 +1,13 @@ +import fetch from 'node-fetch'; + +export default async function fetchAsBase64(url) { + const res = await fetch(url); + + if (res.ok) { + const buffer = await res.buffer(); + + return buffer.toString('base64'); + } else { + throw new Error(`Server returned ${ res.status } while fetching as buffer`); + } +} diff --git a/__tests__/setup/waitForBotEcho.js b/__tests__/setup/waitForBotEcho.js index 87e44fe7b..7edb06250 100644 --- a/__tests__/setup/waitForBotEcho.js +++ b/__tests__/setup/waitForBotEcho.js @@ -2,9 +2,9 @@ import getEchoActivity from './getEchoActivity'; import waitForObservable from './waitForObservable'; export default function waitForBotEcho(directLine, equalityFn) { - return waitForObservable(directLine.activity$, activity => { + return waitForObservable(directLine.activity$, async activity => { const echoActivity = getEchoActivity(activity); - return echoActivity && equalityFn(echoActivity); + return echoActivity && await equalityFn(echoActivity); }); } diff --git a/__tests__/setup/waitForObservable.js b/__tests__/setup/waitForObservable.js index 8e28e2ad9..31ab55604 100644 --- a/__tests__/setup/waitForObservable.js +++ b/__tests__/setup/waitForObservable.js @@ -14,7 +14,7 @@ export default async function waitForObservable(observable, target) { if (error) { throw error; - } else if (typeof target === 'function' ? target(next) : Object.is(next, target)) { + } else if (typeof target === 'function' ? await target(next) : Object.is(next, target)) { return next; } } From f8f562204091c72c222526b474349d20bf585c46 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 18:32:57 -0700 Subject: [PATCH 06/39] Add airplane mode test --- .../unhappy.airplaneMode.afterConnect.js | 93 +++++++++++++++++++ package-lock.json | 49 ++++++++++ package.json | 1 + 3 files changed, 143 insertions(+) create mode 100644 __tests__/unhappy.airplaneMode.afterConnect.js diff --git a/__tests__/unhappy.airplaneMode.afterConnect.js b/__tests__/unhappy.airplaneMode.afterConnect.js new file mode 100644 index 000000000..0172e2f70 --- /dev/null +++ b/__tests__/unhappy.airplaneMode.afterConnect.js @@ -0,0 +1,93 @@ +import 'dotenv/config'; + +import { createProxyServer } from 'http-proxy'; +import { createServer } from 'http'; +import getPort from 'get-port'; +import onErrorResumeNext from 'on-error-resume-next'; + +import { DirectLine } from '../src/directLine'; +import { timeouts } from './constants.json'; +import * as createDirectLineOptions from './setup/createDirectLineOptions'; +import postActivity from './setup/postActivity'; +import waitForBotEcho from './setup/waitForBotEcho'; +import waitForConnected from './setup/waitForConnected'; + +describe('Unhappy path', () => { + let unsubscribes; + + beforeEach(() => unsubscribes = []); + afterEach(() => unsubscribes.forEach(fn => onErrorResumeNext(fn))); + + describe('turn on airplane mode after connected', () => { + let directLine; + let proxy; + let proxyPort; + let proxyServer; + + beforeEach(async () => { + // We need a reverse proxy (a.k.a. forwarder) to control the network traffic. + // This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost"). + + proxyPort = await getPort(); + proxyPort = 8889; + + proxy = createProxyServer({ + changeOrigin: true, + rejectUnauthorized: false, + target: 'https://directline.botframework.com/' + }); + + proxyServer = createServer((req, res) => proxy.web(req, res)); + + await (new Promise(resolve => proxyServer.listen(proxyPort, resolve))); + }); + + afterEach(() => new Promise(resolve => proxyServer.close(resolve))); + + describe('using REST', () => { + beforeEach(() => jest.setTimeout(timeouts.rest)); + + test('with secret', async () => { + directLine = new DirectLine(await createDirectLineOptions.forREST({ token: false })); + }); + + test('with token', async () => { + directLine = new DirectLine({ + ...await createDirectLineOptions.forREST({ token: true }), + domain: 'http://localhost:8889/v3/directline' + }); + }); + }); + + // test('using Streaming Extensions', async () => { + // jest.setTimeout(timeouts.webSocket); + // directLine = new DirectLine(await createDirectLineOptions.forStreamingExtensions()); + // }); + + describe('using Web Socket', () => { + beforeEach(() => jest.setTimeout(timeouts.webSocket)); + + test('with secret', async () => { + directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + }); + + test('with token', async () => { + directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + }); + }); + + afterEach(async () => { + // If directLine object is undefined, that means the test is failing. + if (!directLine) { return; } + + unsubscribes.push(await waitForConnected(directLine)); + + await Promise.all([ + postActivity(directLine, { text: 'Hello, World!', type: 'message' }), + waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') + ]); + + // TODO: Kill the connection and test + }); + }); +}); diff --git a/package-lock.json b/package-lock.json index 6b8f76ab0..1db643028 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4212,6 +4212,12 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", @@ -4548,6 +4554,32 @@ "readable-stream": "^2.3.6" } }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -5533,6 +5565,17 @@ "statuses": ">= 1.4.0 < 2" } }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -8534,6 +8577,12 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve": { "version": "1.1.7", "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", diff --git a/package.json b/package.json index 4256e6ea8..db3f85a40 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "get-port": "^5.0.0", "global-agent": "^2.0.2", "has-resolved": "^1.1.0", + "http-proxy": "^1.17.0", "jest": "^24.9.0", "jest-environment-jsdom-fourteen": "^0.1.0", "jsdom": "^14.1.0", From 7e69ceb7f59c880ad1cf6b7cff2ea17e94459012 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 20:43:24 -0700 Subject: [PATCH 07/39] Clean up --- __tests__/happy.postActivity.js | 1 + __tests__/happy.uploadAttachments.js | 3 +- .../unhappy.airplaneMode.afterConnect.js | 81 ++++++++++++------- 3 files changed, 57 insertions(+), 28 deletions(-) diff --git a/__tests__/happy.postActivity.js b/__tests__/happy.postActivity.js index 27f345f74..e0188a47f 100644 --- a/__tests__/happy.postActivity.js +++ b/__tests__/happy.postActivity.js @@ -51,6 +51,7 @@ describe('Happy path', () => { // If directLine object is undefined, that means the test is failing. if (!directLine) { return; } + unsubscribes.push(directLine.end.bind(directLine)); unsubscribes.push(await waitForConnected(directLine)); await Promise.all([ diff --git a/__tests__/happy.uploadAttachments.js b/__tests__/happy.uploadAttachments.js index 67d2327e0..e50c9f356 100644 --- a/__tests__/happy.uploadAttachments.js +++ b/__tests__/happy.uploadAttachments.js @@ -22,7 +22,7 @@ describe('Happy path', () => { describe('using REST', () => { beforeEach(() => jest.setTimeout(timeouts.rest)); - test.only('with secret', async () => { + test('with secret', async () => { directLine = new DirectLine(await createDirectLineOptions.forREST({ token: false })); }); @@ -52,6 +52,7 @@ describe('Happy path', () => { // If directLine object is undefined, that means the test is failing. if (!directLine) { return; } + unsubscribes.push(directLine.end.bind(directLine)); unsubscribes.push(await waitForConnected(directLine)); const sendingActivity = { diff --git a/__tests__/unhappy.airplaneMode.afterConnect.js b/__tests__/unhappy.airplaneMode.afterConnect.js index 0172e2f70..d8bb4b79c 100644 --- a/__tests__/unhappy.airplaneMode.afterConnect.js +++ b/__tests__/unhappy.airplaneMode.afterConnect.js @@ -2,6 +2,7 @@ import 'dotenv/config'; import { createProxyServer } from 'http-proxy'; import { createServer } from 'http'; +import { promisify } from 'util'; import getPort from 'get-port'; import onErrorResumeNext from 'on-error-resume-next'; @@ -12,6 +13,27 @@ import postActivity from './setup/postActivity'; import waitForBotEcho from './setup/waitForBotEcho'; import waitForConnected from './setup/waitForConnected'; +async function setupDirectLineForwarder(target = 'https://directline.botframework.com/') { + // We need a reverse proxy (a.k.a. forwarder) to control the network traffic. + // This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost"). + + const proxyPort = await getPort(); + const proxy = createProxyServer({ + changeOrigin: true, + rejectUnauthorized: false, + target + }); + + const proxyServer = createServer((req, res) => proxy.web(req, res)); + + await promisify(proxyServer.listen.bind(proxyServer))(proxyPort); + + return { + domain: `http://localhost:${ proxyPort }/v3/directline`, + unsubscribe: promisify(proxyServer.close.bind(proxyServer)) + }; +} + describe('Unhappy path', () => { let unsubscribes; @@ -20,41 +42,30 @@ describe('Unhappy path', () => { describe('turn on airplane mode after connected', () => { let directLine; - let proxy; - let proxyPort; - let proxyServer; - beforeEach(async () => { - // We need a reverse proxy (a.k.a. forwarder) to control the network traffic. - // This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost"). - - proxyPort = await getPort(); - proxyPort = 8889; - - proxy = createProxyServer({ - changeOrigin: true, - rejectUnauthorized: false, - target: 'https://directline.botframework.com/' - }); - - proxyServer = createServer((req, res) => proxy.web(req, res)); + describe('using REST', () => { + let domain; - await (new Promise(resolve => proxyServer.listen(proxyPort, resolve))); - }); + beforeEach(async () => { + jest.setTimeout(timeouts.rest); - afterEach(() => new Promise(resolve => proxyServer.close(resolve))); + const { domain: forwarderDomain, unsubscribe } = await setupDirectLineForwarder(); - describe('using REST', () => { - beforeEach(() => jest.setTimeout(timeouts.rest)); + unsubscribes.push(unsubscribe); + domain = forwarderDomain; + }); test('with secret', async () => { - directLine = new DirectLine(await createDirectLineOptions.forREST({ token: false })); + directLine = new DirectLine({ + ...await createDirectLineOptions.forREST({ token: false }), + domain + }); }); test('with token', async () => { directLine = new DirectLine({ ...await createDirectLineOptions.forREST({ token: true }), - domain: 'http://localhost:8889/v3/directline' + domain }); }); }); @@ -65,14 +76,29 @@ describe('Unhappy path', () => { // }); describe('using Web Socket', () => { - beforeEach(() => jest.setTimeout(timeouts.webSocket)); + let domain; + + beforeEach(async () => { + jest.setTimeout(timeouts.webSocket); + + const { domain: forwarderDomain, unsubscribe } = await setupDirectLineForwarder(); + + unsubscribes.push(unsubscribe); + domain = forwarderDomain; + }); test('with secret', async () => { - directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + directLine = new DirectLine({ + ...await createDirectLineOptions.forWebSocket({ token: false }), + domain + }); }); test('with token', async () => { - directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + directLine = new DirectLine({ + ...await createDirectLineOptions.forWebSocket({ token: false }), + domain + }); }); }); @@ -80,6 +106,7 @@ describe('Unhappy path', () => { // If directLine object is undefined, that means the test is failing. if (!directLine) { return; } + unsubscribes.push(directLine.end.bind(directLine)); unsubscribes.push(await waitForConnected(directLine)); await Promise.all([ From 3a874fa72fdf4cbed088c1317fcd881c0007e50d Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 22:34:29 -0700 Subject: [PATCH 08/39] Add fatal test --- __tests__/setup/sleep.js | 3 + __tests__/setup/waitForObservable.js | 7 +- ... unhappy.postActivityFatalAfterConnect.js} | 82 ++++++++++++------- 3 files changed, 59 insertions(+), 33 deletions(-) create mode 100644 __tests__/setup/sleep.js rename __tests__/{unhappy.airplaneMode.afterConnect.js => unhappy.postActivityFatalAfterConnect.js} (60%) diff --git a/__tests__/setup/sleep.js b/__tests__/setup/sleep.js new file mode 100644 index 000000000..ef8ff07cb --- /dev/null +++ b/__tests__/setup/sleep.js @@ -0,0 +1,3 @@ +export default function sleep(ms = 1000) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/__tests__/setup/waitForObservable.js b/__tests__/setup/waitForObservable.js index 31ab55604..cb7adfaf4 100644 --- a/__tests__/setup/waitForObservable.js +++ b/__tests__/setup/waitForObservable.js @@ -7,12 +7,15 @@ export default async function waitForObservable(observable, target) { try { for (;;) { - const { error, next } = await promiseRaceMap({ + const { complete, error, next } = await promiseRaceMap({ + complete: observer.complete(), error: observer.error(), next: observer.next() }); - if (error) { + if (complete) { + return; + } else if (error) { throw error; } else if (typeof target === 'function' ? await target(next) : Object.is(next, target)) { return next; diff --git a/__tests__/unhappy.airplaneMode.afterConnect.js b/__tests__/unhappy.postActivityFatalAfterConnect.js similarity index 60% rename from __tests__/unhappy.airplaneMode.afterConnect.js rename to __tests__/unhappy.postActivityFatalAfterConnect.js index d8bb4b79c..6d10a6f65 100644 --- a/__tests__/unhappy.airplaneMode.afterConnect.js +++ b/__tests__/unhappy.postActivityFatalAfterConnect.js @@ -13,23 +13,24 @@ import postActivity from './setup/postActivity'; import waitForBotEcho from './setup/waitForBotEcho'; import waitForConnected from './setup/waitForConnected'; -async function setupDirectLineForwarder(target = 'https://directline.botframework.com/') { +async function setupDirectLineForwarder(port, handler, target = 'https://directline.botframework.com/') { // We need a reverse proxy (a.k.a. forwarder) to control the network traffic. // This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost"). - const proxyPort = await getPort(); const proxy = createProxyServer({ changeOrigin: true, rejectUnauthorized: false, target }); - const proxyServer = createServer((req, res) => proxy.web(req, res)); + const proxyServer = createServer((req, res) => { + handler(req, res, () => proxy.web(req, res)); + }); - await promisify(proxyServer.listen.bind(proxyServer))(proxyPort); + await promisify(proxyServer.listen.bind(proxyServer))(port); return { - domain: `http://localhost:${ proxyPort }/v3/directline`, + domain: `http://localhost:${ port }/v3/directline`, unsubscribe: promisify(proxyServer.close.bind(proxyServer)) }; } @@ -40,32 +41,30 @@ describe('Unhappy path', () => { beforeEach(() => unsubscribes = []); afterEach(() => unsubscribes.forEach(fn => onErrorResumeNext(fn))); - describe('turn on airplane mode after connected', () => { + describe('channel returned 404 on post activity after connected', () => { let directLine; + let proxyDomain; + let proxyPort; - describe('using REST', () => { - let domain; - - beforeEach(async () => { - jest.setTimeout(timeouts.rest); - - const { domain: forwarderDomain, unsubscribe } = await setupDirectLineForwarder(); + beforeEach(async () => { + proxyPort = await getPort(); + proxyDomain = `http://localhost:${ proxyPort }/v3/directline`; + }); - unsubscribes.push(unsubscribe); - domain = forwarderDomain; - }); + describe('using REST', () => { + beforeEach(() => jest.setTimeout(timeouts.rest)); test('with secret', async () => { directLine = new DirectLine({ ...await createDirectLineOptions.forREST({ token: false }), - domain + domain: proxyDomain }); }); test('with token', async () => { directLine = new DirectLine({ ...await createDirectLineOptions.forREST({ token: true }), - domain + domain: proxyDomain }); }); }); @@ -76,28 +75,19 @@ describe('Unhappy path', () => { // }); describe('using Web Socket', () => { - let domain; - - beforeEach(async () => { - jest.setTimeout(timeouts.webSocket); - - const { domain: forwarderDomain, unsubscribe } = await setupDirectLineForwarder(); - - unsubscribes.push(unsubscribe); - domain = forwarderDomain; - }); + beforeEach(() => jest.setTimeout(timeouts.webSocket)); test('with secret', async () => { directLine = new DirectLine({ ...await createDirectLineOptions.forWebSocket({ token: false }), - domain + domain: proxyDomain }); }); test('with token', async () => { directLine = new DirectLine({ ...await createDirectLineOptions.forWebSocket({ token: false }), - domain + domain: proxyDomain }); }); }); @@ -106,6 +96,29 @@ describe('Unhappy path', () => { // If directLine object is undefined, that means the test is failing. if (!directLine) { return; } + let lastConnectionStatus; + + const connectionStatusSubscription = directLine.connectionStatus$.subscribe({ + next(value) { lastConnectionStatus = value; } + }); + + unsubscribes.push(connectionStatusSubscription.unsubscribe.bind(connectionStatusSubscription)); + + let alwaysReturn404; + + const { unsubscribe } = await setupDirectLineForwarder(proxyPort, (req, res, next) => { + if ( + req.method !== 'OPTIONS' + && alwaysReturn404 + ) { + res.statusCode = 404; + res.end(); + } else { + next(); + } + }); + + unsubscribes.push(unsubscribe); unsubscribes.push(directLine.end.bind(directLine)); unsubscribes.push(await waitForConnected(directLine)); @@ -114,7 +127,14 @@ describe('Unhappy path', () => { waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') ]); - // TODO: Kill the connection and test + alwaysReturn404 = true; + + await expect(postActivity(directLine, { text: 'Hello, World!', type: 'message' })).rejects.toThrow(); + + // After post failed, it should stop polling and end all connections + + // TODO: Currently not working on REST/WS + // expect(lastConnectionStatus).not.toBe(2); }); }); }); From 6f61a482c1761561286998bc564c7cbbef4d6fe6 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 22:37:31 -0700 Subject: [PATCH 09/39] Refactor --- __tests__/setup/createDirectLineForwarder.js | 25 ++++++++++++++++ .../unhappy.postActivityFatalAfterConnect.js | 30 ++----------------- 2 files changed, 28 insertions(+), 27 deletions(-) create mode 100644 __tests__/setup/createDirectLineForwarder.js diff --git a/__tests__/setup/createDirectLineForwarder.js b/__tests__/setup/createDirectLineForwarder.js new file mode 100644 index 000000000..b91479a6e --- /dev/null +++ b/__tests__/setup/createDirectLineForwarder.js @@ -0,0 +1,25 @@ +import { createProxyServer } from 'http-proxy'; +import { createServer } from 'http'; +import { promisify } from 'util'; + +export default async function createDirectLineForwarder(port, handler, target = 'https://directline.botframework.com/') { + // We need a reverse proxy (a.k.a. forwarder) to control the network traffic. + // This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost"). + + const proxy = createProxyServer({ + changeOrigin: true, + rejectUnauthorized: false, + target + }); + + const proxyServer = createServer((req, res) => { + handler(req, res, () => proxy.web(req, res)); + }); + + await promisify(proxyServer.listen.bind(proxyServer))(port); + + return { + domain: `http://localhost:${ port }/v3/directline`, + unsubscribe: promisify(proxyServer.close.bind(proxyServer)) + }; +} diff --git a/__tests__/unhappy.postActivityFatalAfterConnect.js b/__tests__/unhappy.postActivityFatalAfterConnect.js index 6d10a6f65..3e92b4545 100644 --- a/__tests__/unhappy.postActivityFatalAfterConnect.js +++ b/__tests__/unhappy.postActivityFatalAfterConnect.js @@ -1,40 +1,16 @@ import 'dotenv/config'; -import { createProxyServer } from 'http-proxy'; -import { createServer } from 'http'; -import { promisify } from 'util'; import getPort from 'get-port'; import onErrorResumeNext from 'on-error-resume-next'; import { DirectLine } from '../src/directLine'; import { timeouts } from './constants.json'; import * as createDirectLineOptions from './setup/createDirectLineOptions'; +import createDirectLineForwarder from './setup/createDirectLineForwarder'; import postActivity from './setup/postActivity'; import waitForBotEcho from './setup/waitForBotEcho'; import waitForConnected from './setup/waitForConnected'; -async function setupDirectLineForwarder(port, handler, target = 'https://directline.botframework.com/') { - // We need a reverse proxy (a.k.a. forwarder) to control the network traffic. - // This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost"). - - const proxy = createProxyServer({ - changeOrigin: true, - rejectUnauthorized: false, - target - }); - - const proxyServer = createServer((req, res) => { - handler(req, res, () => proxy.web(req, res)); - }); - - await promisify(proxyServer.listen.bind(proxyServer))(port); - - return { - domain: `http://localhost:${ port }/v3/directline`, - unsubscribe: promisify(proxyServer.close.bind(proxyServer)) - }; -} - describe('Unhappy path', () => { let unsubscribes; @@ -106,7 +82,7 @@ describe('Unhappy path', () => { let alwaysReturn404; - const { unsubscribe } = await setupDirectLineForwarder(proxyPort, (req, res, next) => { + const { unsubscribe } = await createDirectLineForwarder(proxyPort, (req, res, next) => { if ( req.method !== 'OPTIONS' && alwaysReturn404 @@ -129,7 +105,7 @@ describe('Unhappy path', () => { alwaysReturn404 = true; - await expect(postActivity(directLine, { text: 'Hello, World!', type: 'message' })).rejects.toThrow(); + await expect(postActivity(directLine, { text: 'Should not be sent', type: 'message' })).rejects.toThrow(); // After post failed, it should stop polling and end all connections From c6b2ecf29df5bfa036c11c79701389cbf2033252 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 22:40:38 -0700 Subject: [PATCH 10/39] Fix build script --- .gitignore | 2 +- README.md | 2 +- webpack.config.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 224ea6055..c3cef5f4d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /.env -/built +/lib /node_modules /directLine.js diff --git a/README.md b/README.md index 7b0c927f2..048e3bdfb 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ That said, the public API is still subject to change. There are several ways: -1. Build from scratch and include either `/directLine.js` (webpacked with rxjs) or `built/directline.js` in your app +1. Build from scratch and include either `/directLine.js` (webpacked with rxjs) or `lib/directline.js` in your app 2. `npm install botframework-directlinejs` ## Using from within a Node environment diff --git a/webpack.config.js b/webpack.config.js index bde50e1f3..034a6b05f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,7 +3,7 @@ const Visualizer = require('webpack-visualizer-plugin'); module.exports = { entry: { - 'directLine': './built/directLine.js' + 'directLine': './lib/directLine.js' }, mode: 'production', output: { From f427673261caf1e061799cd1cbd5eeabc06542d3 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 22:55:33 -0700 Subject: [PATCH 11/39] Update build script --- lib/directLine.js | 635 ----------------------------------------- lib/directLine.test.js | 68 ----- tsconfig.json | 2 +- 3 files changed, 1 insertion(+), 704 deletions(-) delete mode 100644 lib/directLine.js delete mode 100644 lib/directLine.test.js diff --git a/lib/directLine.js b/lib/directLine.js deleted file mode 100644 index d64e99b67..000000000 --- a/lib/directLine.js +++ /dev/null @@ -1,635 +0,0 @@ -"use strict"; - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.DirectLine = exports.ConnectionStatus = void 0; - -var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); - -var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); - -var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); - -var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); - -var _BehaviorSubject = require("rxjs/BehaviorSubject"); - -var _Observable = require("rxjs/Observable"); - -require("rxjs/add/operator/catch"); - -require("rxjs/add/operator/combineLatest"); - -require("rxjs/add/operator/count"); - -require("rxjs/add/operator/delay"); - -require("rxjs/add/operator/do"); - -require("rxjs/add/operator/filter"); - -require("rxjs/add/operator/map"); - -require("rxjs/add/operator/mergeMap"); - -require("rxjs/add/operator/retryWhen"); - -require("rxjs/add/operator/share"); - -require("rxjs/add/operator/take"); - -require("rxjs/add/observable/dom/ajax"); - -require("rxjs/add/observable/empty"); - -require("rxjs/add/observable/from"); - -require("rxjs/add/observable/interval"); - -require("rxjs/add/observable/of"); - -require("rxjs/add/observable/throw"); - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -var DIRECT_LINE_VERSION = 'DirectLine/3.0'; -// These types are specific to this client library, not to Direct Line 3.0 -var ConnectionStatus; -exports.ConnectionStatus = ConnectionStatus; - -(function (ConnectionStatus) { - ConnectionStatus[ConnectionStatus["Uninitialized"] = 0] = "Uninitialized"; - ConnectionStatus[ConnectionStatus["Connecting"] = 1] = "Connecting"; - ConnectionStatus[ConnectionStatus["Online"] = 2] = "Online"; - ConnectionStatus[ConnectionStatus["ExpiredToken"] = 3] = "ExpiredToken"; - ConnectionStatus[ConnectionStatus["FailedToConnect"] = 4] = "FailedToConnect"; - ConnectionStatus[ConnectionStatus["Ended"] = 5] = "Ended"; -})(ConnectionStatus || (exports.ConnectionStatus = ConnectionStatus = {})); - -var lifetimeRefreshToken = 30 * 60 * 1000; -var intervalRefreshToken = lifetimeRefreshToken / 2; -var timeout = 20 * 1000; -var retries = (lifetimeRefreshToken - intervalRefreshToken) / timeout; -var POLLING_INTERVAL_LOWER_BOUND = 200; //ms - -var errorExpiredToken = new Error("expired token"); -var errorConversationEnded = new Error("conversation ended"); -var errorFailedToConnect = new Error("failed to connect"); -var konsole = { - log: function log(message) { - var _console; - - for (var _len = arguments.length, optionalParams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - optionalParams[_key - 1] = arguments[_key]; - } - - if (typeof window !== 'undefined' && window["botchatDebug"] && message) (_console = console).log.apply(_console, [message].concat(optionalParams)); - } -}; - -var DirectLine = -/*#__PURE__*/ -function () { - //ms - function DirectLine(options) { - (0, _classCallCheck2["default"])(this, DirectLine); - (0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(ConnectionStatus.Uninitialized)); - (0, _defineProperty2["default"])(this, "activity$", void 0); - (0, _defineProperty2["default"])(this, "domain", "https://directline.botframework.com/v3/directline"); - (0, _defineProperty2["default"])(this, "webSocket", void 0); - (0, _defineProperty2["default"])(this, "conversationId", void 0); - (0, _defineProperty2["default"])(this, "expiredTokenExhaustion", void 0); - (0, _defineProperty2["default"])(this, "secret", void 0); - (0, _defineProperty2["default"])(this, "token", void 0); - (0, _defineProperty2["default"])(this, "watermark", ''); - (0, _defineProperty2["default"])(this, "streamUrl", void 0); - (0, _defineProperty2["default"])(this, "_botAgent", ''); - (0, _defineProperty2["default"])(this, "_userAgent", void 0); - (0, _defineProperty2["default"])(this, "referenceGrammarId", void 0); - (0, _defineProperty2["default"])(this, "pollingInterval", 1000); - (0, _defineProperty2["default"])(this, "tokenRefreshSubscription", void 0); - this.secret = options.secret; - this.token = options.secret || options.token; - this.webSocket = (options.webSocket === undefined ? true : options.webSocket) && typeof WebSocket !== 'undefined' && WebSocket !== undefined; - - if (options.domain) { - this.domain = options.domain; - } - - if (options.conversationId) { - this.conversationId = options.conversationId; - } - - if (options.watermark) { - this.watermark = options.watermark; - } - - if (options.streamUrl) { - if (options.token && options.conversationId) { - this.streamUrl = options.streamUrl; - } else { - console.warn('DirectLineJS: streamUrl was ignored: you need to provide a token and a conversationid'); - } - } - - this._botAgent = this.getBotAgent(options.botAgent); - var parsedPollingInterval = ~~options.pollingInterval; - - if (parsedPollingInterval < POLLING_INTERVAL_LOWER_BOUND) { - if (typeof options.pollingInterval !== 'undefined') { - console.warn("DirectLineJS: provided pollingInterval (".concat(options.pollingInterval, ") is under lower bound (200ms), using default of 1000ms")); - } - } else { - this.pollingInterval = parsedPollingInterval; - } - - this.expiredTokenExhaustion = this.setConnectionStatusFallback(ConnectionStatus.ExpiredToken, ConnectionStatus.FailedToConnect, 5); - this.activity$ = (this.webSocket ? this.webSocketActivity$() : this.pollingGetActivity$()).share(); - } // Every time we're about to make a Direct Line REST call, we call this first to see check the current connection status. - // Either throws an error (indicating an error state) or emits a null, indicating a (presumably) healthy connection - - - (0, _createClass2["default"])(DirectLine, [{ - key: "checkConnection", - value: function checkConnection() { - var _this = this; - - var once = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var obs = this.connectionStatus$.flatMap(function (connectionStatus) { - if (connectionStatus === ConnectionStatus.Uninitialized) { - _this.connectionStatus$.next(ConnectionStatus.Connecting); //if token and streamUrl are defined it means reconnect has already been done. Skipping it. - - - if (_this.token && _this.streamUrl) { - _this.connectionStatus$.next(ConnectionStatus.Online); - - return _Observable.Observable.of(connectionStatus); - } else { - return _this.startConversation()["do"](function (conversation) { - _this.conversationId = conversation.conversationId; - _this.token = _this.secret || conversation.token; - _this.streamUrl = conversation.streamUrl; - _this.referenceGrammarId = conversation.referenceGrammarId; - if (!_this.secret) _this.refreshTokenLoop(); - - _this.connectionStatus$.next(ConnectionStatus.Online); - }, function (error) { - _this.connectionStatus$.next(ConnectionStatus.FailedToConnect); - }).map(function (_) { - return connectionStatus; - }); - } - } else { - return _Observable.Observable.of(connectionStatus); - } - }).filter(function (connectionStatus) { - return connectionStatus != ConnectionStatus.Uninitialized && connectionStatus != ConnectionStatus.Connecting; - }).flatMap(function (connectionStatus) { - switch (connectionStatus) { - case ConnectionStatus.Ended: - return _Observable.Observable["throw"](errorConversationEnded); - - case ConnectionStatus.FailedToConnect: - return _Observable.Observable["throw"](errorFailedToConnect); - - case ConnectionStatus.ExpiredToken: - return _Observable.Observable.of(connectionStatus); - - default: - return _Observable.Observable.of(connectionStatus); - } - }); - return once ? obs.take(1) : obs; - } - }, { - key: "setConnectionStatusFallback", - value: function setConnectionStatusFallback(connectionStatusFrom, connectionStatusTo) { - var maxAttempts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5; - maxAttempts--; - var attempts = 0; - var currStatus = null; - return function (status) { - if (status === connectionStatusFrom && currStatus === status && attempts >= maxAttempts) { - attempts = 0; - return connectionStatusTo; - } - - attempts++; - currStatus = status; - return status; - }; - } - }, { - key: "expiredToken", - value: function expiredToken() { - var connectionStatus = this.connectionStatus$.getValue(); - if (connectionStatus != ConnectionStatus.Ended && connectionStatus != ConnectionStatus.FailedToConnect) this.connectionStatus$.next(ConnectionStatus.ExpiredToken); - var protectedConnectionStatus = this.expiredTokenExhaustion(this.connectionStatus$.getValue()); - this.connectionStatus$.next(protectedConnectionStatus); - } - }, { - key: "startConversation", - value: function startConversation() { - //if conversationid is set here, it means we need to call the reconnect api, else it is a new conversation - var url = this.conversationId ? "".concat(this.domain, "/conversations/").concat(this.conversationId, "?watermark=").concat(this.watermark) : "".concat(this.domain, "/conversations"); - var method = this.conversationId ? "GET" : "POST"; - return _Observable.Observable.ajax({ - method: method, - url: url, - timeout: timeout, - headers: _objectSpread({ - "Accept": "application/json" - }, this.commonHeaders()) - }) // .do(ajaxResponse => konsole.log("conversation ajaxResponse", ajaxResponse.response)) - .map(function (ajaxResponse) { - return ajaxResponse.response; - }).retryWhen(function (error$) { - return (// for now we deem 4xx and 5xx errors as unrecoverable - // for everything else (timeouts), retry for a while - error$.mergeMap(function (error) { - return error.status >= 400 && error.status < 600 ? _Observable.Observable["throw"](error) : _Observable.Observable.of(error); - }).delay(timeout).take(retries) - ); - }); - } - }, { - key: "refreshTokenLoop", - value: function refreshTokenLoop() { - var _this2 = this; - - this.tokenRefreshSubscription = _Observable.Observable.interval(intervalRefreshToken).flatMap(function (_) { - return _this2.refreshToken(); - }).subscribe(function (token) { - konsole.log("refreshing token", token, "at", new Date()); - _this2.token = token; - }); - } - }, { - key: "refreshToken", - value: function refreshToken() { - var _this3 = this; - - return this.checkConnection(true).flatMap(function (_) { - return _Observable.Observable.ajax({ - method: "POST", - url: "".concat(_this3.domain, "/tokens/refresh"), - timeout: timeout, - headers: _objectSpread({}, _this3.commonHeaders()) - }).map(function (ajaxResponse) { - return ajaxResponse.response.token; - }).retryWhen(function (error$) { - return error$.mergeMap(function (error) { - if (error.status === 403) { - // if the token is expired there's no reason to keep trying - _this3.expiredToken(); - - return _Observable.Observable["throw"](error); - } else if (error.status === 404) { - // If the bot is gone, we should stop retrying - return _Observable.Observable["throw"](error); - } - - return _Observable.Observable.of(error); - }).delay(timeout).take(retries); - }); - }); - } - }, { - key: "reconnect", - value: function reconnect(conversation) { - this.token = conversation.token; - this.streamUrl = conversation.streamUrl; - if (this.connectionStatus$.getValue() === ConnectionStatus.ExpiredToken) this.connectionStatus$.next(ConnectionStatus.Online); - } - }, { - key: "end", - value: function end() { - if (this.tokenRefreshSubscription) this.tokenRefreshSubscription.unsubscribe(); - - try { - this.connectionStatus$.next(ConnectionStatus.Ended); - } catch (e) { - if (e === errorConversationEnded) return; - throw e; - } - } - }, { - key: "getSessionId", - value: function getSessionId() { - var _this4 = this; - - // If we're not connected to the bot, get connected - // Will throw an error if we are not connected - konsole.log("getSessionId"); - return this.checkConnection(true).flatMap(function (_) { - return _Observable.Observable.ajax({ - method: "GET", - url: "".concat(_this4.domain, "/session/getsessionid"), - withCredentials: true, - timeout: timeout, - headers: _objectSpread({ - "Content-Type": "application/json" - }, _this4.commonHeaders()) - }).map(function (ajaxResponse) { - if (ajaxResponse && ajaxResponse.response && ajaxResponse.response.sessionId) { - konsole.log("getSessionId response: " + ajaxResponse.response.sessionId); - return ajaxResponse.response.sessionId; - } - - return ''; - })["catch"](function (error) { - konsole.log("getSessionId error: " + error.status); - return _Observable.Observable.of(''); - }); - })["catch"](function (error) { - return _this4.catchExpiredToken(error); - }); - } - }, { - key: "postActivity", - value: function postActivity(activity) { - var _this5 = this; - - // Use postMessageWithAttachments for messages with attachments that are local files (e.g. an image to upload) - // Technically we could use it for *all* activities, but postActivity is much lighter weight - // So, since WebChat is partially a reference implementation of Direct Line, we implement both. - if (activity.type === "message" && activity.attachments && activity.attachments.length > 0) return this.postMessageWithAttachments(activity); // If we're not connected to the bot, get connected - // Will throw an error if we are not connected - - konsole.log("postActivity", activity); - return this.checkConnection(true).flatMap(function (_) { - return _Observable.Observable.ajax({ - method: "POST", - url: "".concat(_this5.domain, "/conversations/").concat(_this5.conversationId, "/activities"), - body: activity, - timeout: timeout, - headers: _objectSpread({ - "Content-Type": "application/json" - }, _this5.commonHeaders()) - }).map(function (ajaxResponse) { - return ajaxResponse.response.id; - })["catch"](function (error) { - return _this5.catchPostError(error); - }); - })["catch"](function (error) { - return _this5.catchExpiredToken(error); - }); - } - }, { - key: "postMessageWithAttachments", - value: function postMessageWithAttachments(_ref) { - var _this6 = this; - - var attachments = _ref.attachments, - messageWithoutAttachments = (0, _objectWithoutProperties2["default"])(_ref, ["attachments"]); - var formData; // If we're not connected to the bot, get connected - // Will throw an error if we are not connected - - return this.checkConnection(true).flatMap(function (_) { - // To send this message to DirectLine we need to deconstruct it into a "template" activity - // and one blob for each attachment. - formData = new FormData(); - formData.append('activity', new Blob([JSON.stringify(messageWithoutAttachments)], { - type: 'application/vnd.microsoft.activity' - })); - return _Observable.Observable.from(attachments || []).flatMap(function (media) { - return _Observable.Observable.ajax({ - method: "GET", - url: media.contentUrl, - responseType: 'arraybuffer' - })["do"](function (ajaxResponse) { - return formData.append('file', new Blob([ajaxResponse.response], { - type: media.contentType - }), media.name); - }); - }).count(); - }).flatMap(function (_) { - return _Observable.Observable.ajax({ - method: "POST", - url: "".concat(_this6.domain, "/conversations/").concat(_this6.conversationId, "/upload?userId=").concat(messageWithoutAttachments.from.id), - body: formData, - timeout: timeout, - headers: _objectSpread({}, _this6.commonHeaders()) - }).map(function (ajaxResponse) { - return ajaxResponse.response.id; - })["catch"](function (error) { - return _this6.catchPostError(error); - }); - })["catch"](function (error) { - return _this6.catchPostError(error); - }); - } - }, { - key: "catchPostError", - value: function catchPostError(error) { - if (error.status === 403) // token has expired (will fall through to return "retry") - this.expiredToken();else if (error.status >= 400 && error.status < 500) // more unrecoverable errors - return _Observable.Observable["throw"](error); - return _Observable.Observable.of("retry"); - } - }, { - key: "catchExpiredToken", - value: function catchExpiredToken(error) { - return error === errorExpiredToken ? _Observable.Observable.of("retry") : _Observable.Observable["throw"](error); - } - }, { - key: "pollingGetActivity$", - value: function pollingGetActivity$() { - var _this7 = this; - - var poller$ = _Observable.Observable.create(function (subscriber) { - // A BehaviorSubject to trigger polling. Since it is a BehaviorSubject - // the first event is produced immediately. - var trigger$ = new _BehaviorSubject.BehaviorSubject({}); - trigger$.subscribe(function () { - if (_this7.connectionStatus$.getValue() === ConnectionStatus.Online) { - var startTimestamp = Date.now(); - - _Observable.Observable.ajax({ - headers: _objectSpread({ - Accept: 'application/json' - }, _this7.commonHeaders()), - method: 'GET', - url: "".concat(_this7.domain, "/conversations/").concat(_this7.conversationId, "/activities?watermark=").concat(_this7.watermark), - timeout: timeout - }).subscribe(function (result) { - subscriber.next(result); - setTimeout(function () { - return trigger$.next(null); - }, Math.max(0, _this7.pollingInterval - Date.now() + startTimestamp)); - }, function (error) { - switch (error.status) { - case 403: - _this7.connectionStatus$.next(ConnectionStatus.ExpiredToken); - - setTimeout(function () { - return trigger$.next(null); - }, _this7.pollingInterval); - break; - - case 404: - _this7.connectionStatus$.next(ConnectionStatus.Ended); - - break; - - default: - // propagate the error - subscriber.error(error); - break; - } - }); - } - }); - }); - - return this.checkConnection().flatMap(function (_) { - return poller$["catch"](function () { - return _Observable.Observable.empty(); - }).map(function (ajaxResponse) { - return ajaxResponse.response; - }).flatMap(function (activityGroup) { - return _this7.observableFromActivityGroup(activityGroup); - }); - }); - } - }, { - key: "observableFromActivityGroup", - value: function observableFromActivityGroup(activityGroup) { - if (activityGroup.watermark) this.watermark = activityGroup.watermark; - return _Observable.Observable.from(activityGroup.activities); - } - }, { - key: "webSocketActivity$", - value: function webSocketActivity$() { - var _this8 = this; - - return this.checkConnection().flatMap(function (_) { - return _this8.observableWebSocket() // WebSockets can be closed by the server or the browser. In the former case we need to - // retrieve a new streamUrl. In the latter case we could first retry with the current streamUrl, - // but it's simpler just to always fetch a new one. - .retryWhen(function (error$) { - return error$.delay(_this8.getRetryDelay()).mergeMap(function (error) { - return _this8.reconnectToConversation(); - }); - }); - }).flatMap(function (activityGroup) { - return _this8.observableFromActivityGroup(activityGroup); - }); - } // Returns the delay duration in milliseconds - - }, { - key: "getRetryDelay", - value: function getRetryDelay() { - return Math.floor(3000 + Math.random() * 12000); - } // Originally we used Observable.webSocket, but it's fairly opionated and I ended up writing - // a lot of code to work around their implemention details. Since WebChat is meant to be a reference - // implementation, I decided roll the below, where the logic is more purposeful. - @billba - - }, { - key: "observableWebSocket", - value: function observableWebSocket() { - var _this9 = this; - - return _Observable.Observable.create(function (subscriber) { - konsole.log("creating WebSocket", _this9.streamUrl); - var ws = new WebSocket(_this9.streamUrl); - var sub; - - ws.onopen = function (open) { - konsole.log("WebSocket open", open); // Chrome is pretty bad at noticing when a WebSocket connection is broken. - // If we periodically ping the server with empty messages, it helps Chrome - // realize when connection breaks, and close the socket. We then throw an - // error, and that give us the opportunity to attempt to reconnect. - - sub = _Observable.Observable.interval(timeout).subscribe(function (_) { - try { - ws.send(""); - } catch (e) { - konsole.log("Ping error", e); - } - }); - }; - - ws.onclose = function (close) { - konsole.log("WebSocket close", close); - if (sub) sub.unsubscribe(); - subscriber.error(close); - }; - - ws.onmessage = function (message) { - return message.data && subscriber.next(JSON.parse(message.data)); - }; // This is the 'unsubscribe' method, which is called when this observable is disposed. - // When the WebSocket closes itself, we throw an error, and this function is eventually called. - // When the observable is closed first (e.g. when tearing down a WebChat instance) then - // we need to manually close the WebSocket. - - - return function () { - if (ws.readyState === 0 || ws.readyState === 1) ws.close(); - }; - }); - } - }, { - key: "reconnectToConversation", - value: function reconnectToConversation() { - var _this10 = this; - - return this.checkConnection(true).flatMap(function (_) { - return _Observable.Observable.ajax({ - method: "GET", - url: "".concat(_this10.domain, "/conversations/").concat(_this10.conversationId, "?watermark=").concat(_this10.watermark), - timeout: timeout, - headers: _objectSpread({ - "Accept": "application/json" - }, _this10.commonHeaders()) - })["do"](function (result) { - if (!_this10.secret) _this10.token = result.response.token; - _this10.streamUrl = result.response.streamUrl; - }).map(function (_) { - return null; - }).retryWhen(function (error$) { - return error$.mergeMap(function (error) { - if (error.status === 403) { - // token has expired. We can't recover from this here, but the embedding - // website might eventually call reconnect() with a new token and streamUrl. - _this10.expiredToken(); - } else if (error.status === 404) { - return _Observable.Observable["throw"](errorConversationEnded); - } - - return _Observable.Observable.of(error); - }).delay(timeout).take(retries); - }); - }); - } - }, { - key: "commonHeaders", - value: function commonHeaders() { - return { - "Authorization": "Bearer ".concat(this.token), - "x-ms-bot-agent": this._botAgent - }; - } - }, { - key: "getBotAgent", - value: function getBotAgent() { - var customAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - var clientAgent = 'directlinejs'; - - if (customAgent) { - clientAgent += "; ".concat(customAgent); - } - - return "".concat(DIRECT_LINE_VERSION, " (").concat(clientAgent, ")"); - } - }]); - return DirectLine; -}(); - -exports.DirectLine = DirectLine; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJDb25uZWN0aW9uU3RhdHVzIiwibGlmZXRpbWVSZWZyZXNoVG9rZW4iLCJpbnRlcnZhbFJlZnJlc2hUb2tlbiIsInRpbWVvdXQiLCJyZXRyaWVzIiwiUE9MTElOR19JTlRFUlZBTF9MT1dFUl9CT1VORCIsImVycm9yRXhwaXJlZFRva2VuIiwiRXJyb3IiLCJlcnJvckNvbnZlcnNhdGlvbkVuZGVkIiwiZXJyb3JGYWlsZWRUb0Nvbm5lY3QiLCJrb25zb2xlIiwibG9nIiwibWVzc2FnZSIsIm9wdGlvbmFsUGFyYW1zIiwid2luZG93IiwiY29uc29sZSIsIkRpcmVjdExpbmUiLCJvcHRpb25zIiwiQmVoYXZpb3JTdWJqZWN0IiwiVW5pbml0aWFsaXplZCIsInNlY3JldCIsInRva2VuIiwid2ViU29ja2V0IiwidW5kZWZpbmVkIiwiV2ViU29ja2V0IiwiZG9tYWluIiwiY29udmVyc2F0aW9uSWQiLCJ3YXRlcm1hcmsiLCJzdHJlYW1VcmwiLCJ3YXJuIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInBhcnNlZFBvbGxpbmdJbnRlcnZhbCIsInBvbGxpbmdJbnRlcnZhbCIsImV4cGlyZWRUb2tlbkV4aGF1c3Rpb24iLCJzZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2siLCJFeHBpcmVkVG9rZW4iLCJGYWlsZWRUb0Nvbm5lY3QiLCJhY3Rpdml0eSQiLCJ3ZWJTb2NrZXRBY3Rpdml0eSQiLCJwb2xsaW5nR2V0QWN0aXZpdHkkIiwic2hhcmUiLCJvbmNlIiwib2JzIiwiY29ubmVjdGlvblN0YXR1cyQiLCJmbGF0TWFwIiwiY29ubmVjdGlvblN0YXR1cyIsIm5leHQiLCJDb25uZWN0aW5nIiwiT25saW5lIiwiT2JzZXJ2YWJsZSIsIm9mIiwic3RhcnRDb252ZXJzYXRpb24iLCJjb252ZXJzYXRpb24iLCJyZWZlcmVuY2VHcmFtbWFySWQiLCJyZWZyZXNoVG9rZW5Mb29wIiwiZXJyb3IiLCJtYXAiLCJfIiwiZmlsdGVyIiwiRW5kZWQiLCJ0YWtlIiwiY29ubmVjdGlvblN0YXR1c0Zyb20iLCJjb25uZWN0aW9uU3RhdHVzVG8iLCJtYXhBdHRlbXB0cyIsImF0dGVtcHRzIiwiY3VyclN0YXR1cyIsInN0YXR1cyIsImdldFZhbHVlIiwicHJvdGVjdGVkQ29ubmVjdGlvblN0YXR1cyIsInVybCIsIm1ldGhvZCIsImFqYXgiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsImFqYXhSZXNwb25zZSIsInJlc3BvbnNlIiwicmV0cnlXaGVuIiwiZXJyb3IkIiwibWVyZ2VNYXAiLCJkZWxheSIsInRva2VuUmVmcmVzaFN1YnNjcmlwdGlvbiIsImludGVydmFsIiwicmVmcmVzaFRva2VuIiwic3Vic2NyaWJlIiwiRGF0ZSIsImNoZWNrQ29ubmVjdGlvbiIsImV4cGlyZWRUb2tlbiIsInVuc3Vic2NyaWJlIiwiZSIsIndpdGhDcmVkZW50aWFscyIsInNlc3Npb25JZCIsImNhdGNoRXhwaXJlZFRva2VuIiwiYWN0aXZpdHkiLCJ0eXBlIiwiYXR0YWNobWVudHMiLCJsZW5ndGgiLCJwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyIsImJvZHkiLCJpZCIsImNhdGNoUG9zdEVycm9yIiwibWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJCbG9iIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb20iLCJtZWRpYSIsImNvbnRlbnRVcmwiLCJyZXNwb25zZVR5cGUiLCJjb250ZW50VHlwZSIsIm5hbWUiLCJjb3VudCIsInBvbGxlciQiLCJjcmVhdGUiLCJzdWJzY3JpYmVyIiwidHJpZ2dlciQiLCJzdGFydFRpbWVzdGFtcCIsIm5vdyIsIkFjY2VwdCIsInJlc3VsdCIsInNldFRpbWVvdXQiLCJNYXRoIiwibWF4IiwiZW1wdHkiLCJhY3Rpdml0eUdyb3VwIiwib2JzZXJ2YWJsZUZyb21BY3Rpdml0eUdyb3VwIiwiYWN0aXZpdGllcyIsIm9ic2VydmFibGVXZWJTb2NrZXQiLCJnZXRSZXRyeURlbGF5IiwicmVjb25uZWN0VG9Db252ZXJzYXRpb24iLCJmbG9vciIsInJhbmRvbSIsIndzIiwic3ViIiwib25vcGVuIiwib3BlbiIsInNlbmQiLCJvbmNsb3NlIiwiY2xvc2UiLCJvbm1lc3NhZ2UiLCJkYXRhIiwicGFyc2UiLCJyZWFkeVN0YXRlIiwiY3VzdG9tQWdlbnQiLCJjbGllbnRBZ2VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsbUJBQW1CLEdBQUcsZ0JBQTVCO0FBdVRBO0lBRVlDLGdCOzs7V0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0IsQ0FBQUEsZ0I7R0FBQUEsZ0IsZ0NBQUFBLGdCOztBQXNCWixJQUFNQyxvQkFBb0IsR0FBRyxLQUFLLEVBQUwsR0FBVSxJQUF2QztBQUNBLElBQU1DLG9CQUFvQixHQUFHRCxvQkFBb0IsR0FBRyxDQUFwRDtBQUNBLElBQU1FLE9BQU8sR0FBRyxLQUFLLElBQXJCO0FBQ0EsSUFBTUMsT0FBTyxHQUFHLENBQUNILG9CQUFvQixHQUFHQyxvQkFBeEIsSUFBZ0RDLE9BQWhFO0FBRUEsSUFBTUUsNEJBQW9DLEdBQUcsR0FBN0MsQyxDQUFrRDs7QUFFbEQsSUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsS0FBSixDQUFVLGVBQVYsQ0FBMUI7QUFDQSxJQUFNQyxzQkFBc0IsR0FBRyxJQUFJRCxLQUFKLENBQVUsb0JBQVYsQ0FBL0I7QUFDQSxJ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QVcsZ0JBQVNELFdBQVQsQ0FBWDtBQUNIOztBQUVELHVCQUFVcEosbUJBQVYsZUFBa0NxSixXQUFsQztBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW4gb3JkZXIgdG8ga2VlcCBmaWxlIHNpemUgZG93biwgb25seSBpbXBvcnQgdGhlIHBhcnRzIG9mIHJ4anMgdGhhdCB3ZSB1c2VcblxuaW1wb3J0IHsgQWpheFJlc3BvbnNlLCBBamF4UmVxdWVzdCB9IGZyb20gJ3J4anMvb2JzZXJ2YWJsZS9kb20vQWpheE9ic2VydmFibGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMvU3Vic2NyaXB0aW9uJztcblxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9jYXRjaCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL2NvbWJpbmVMYXRlc3QnO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9jb3VudCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL2RlbGF5JztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvZG8nO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9maWx0ZXInO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tZXJnZU1hcCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL3JldHJ5V2hlbic7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL3NoYXJlJztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvdGFrZSc7XG5cbmltcG9ydCAncnhqcy9hZGQvb2JzZXJ2YWJsZS9kb20vYWpheCc7XG5pbXBvcnQgJ3J4anMvYWRkL29ic2VydmFibGUvZW1wdHknO1xuaW1wb3J0ICdyeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb20nO1xuaW1wb3J0ICdyeGpzL2FkZC9vYnNlcnZhYmxlL2ludGVydmFsJztcbmltcG9ydCAncnhqcy9hZGQvb2JzZXJ2YWJsZS9vZic7XG5pbXBvcnQgJ3J4anMvYWRkL29ic2VydmFibGUvdGhyb3cnO1xuXG5jb25zdCBESVJFQ1RfTElORV9WRVJTSU9OID0gJ0RpcmVjdExpbmUvMy4wJztcblxuZGVjbGFyZSB2YXIgcHJvY2Vzczoge1xuICAgIGFyY2g6IHN0cmluZztcbiAgICBlbnY6IHtcbiAgICAgICAgVkVSU0lPTjogc3RyaW5nO1xuICAgIH07XG4gICAgcGxhdGZvcm06IHN0cmluZztcbiAgICByZWxlYXNlOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxuLy8gRGlyZWN0IExpbmUgMy4wIHR5cGVzXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uIHtcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgZVRhZz86IHN0cmluZyxcbiAgICBzdHJlYW1Vcmw/OiBzdHJpbmcsXG4gICAgcmVmZXJlbmNlR3JhbW1hcklkPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIE1lZGlhVHlwZSA9IFwiaW1hZ2UvcG5nXCIgfCBcImltYWdlL2pwZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL2dpZlwiIHwgXCJpbWFnZS9zdmcreG1sXCIgfCBcImF1ZGlvL21wZWdcIiB8IFwiYXVkaW8vbXA0XCIgfCBcInZpZGVvL21wNFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhIHtcbiAgICBjb250ZW50VHlwZTogTWVkaWFUeXBlLFxuICAgIGNvbnRlbnRVcmw6IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHRodW1ibmFpbFVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVua25vd25NZWRpYXtcbiAgICBjb250ZW50VHlwZTogc3RyaW5nLFxuICAgIGNvbnRlbnRVcmw6IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHRodW1ibmFpbFVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDYXJkQWN0aW9uVHlwZXMgPSBcImNhbGxcIiB8IFwiZG93bmxvYWRGaWxlXCJ8IFwiaW1CYWNrXCIgfCBcIm1lc3NhZ2VCYWNrXCIgfCBcIm9wZW5VcmxcIiB8IFwicGxheUF1ZGlvXCIgfCBcInBsYXlWaWRlb1wiIHwgXCJwb3N0QmFja1wiIHwgXCJzaWduaW5cIiB8IFwic2hvd0ltYWdlXCI7XG5cbmV4cG9ydCB0eXBlIENhcmRBY3Rpb24gPSBDYWxsQ2FyZEFjdGlvbiB8IERvd25sb2FkRmlsZUNhcmRBY3Rpb24gfCBJTUJhY2tDYXJkQWN0aW9uIHwgTWVzc2FnZUJhY2tDYXJkQWN0aW9uIHwgT3BlblVSTENhcmRBY3Rpb24gfCBQbGF5QXVkaW9DYXJkQWN0aW9uIHwgUGxheVZpZGVvQ2FyZEFjdGlvbiB8IFBvc3RCYWNrQ2FyZEFjdGlvbiB8IFNpZ25JbkNhcmRBY3Rpb24gfCBTaG93SW1hZ2VDYXJkQWN0aW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwiY2FsbFwiLFxuICAgIHZhbHVlOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb3dubG9hZEZpbGVDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwiZG93bmxvYWRGaWxlXCIsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNQmFja0NhcmRBY3Rpb24ge1xuICAgIGltYWdlPzogc3RyaW5nLFxuICAgIHRpdGxlPzogc3RyaW5nLFxuICAgIHR5cGU6IFwiaW1CYWNrXCIsXG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlQmFja0NhcmRBY3Rpb24gPSBNZXNzYWdlQmFja1dpdGhJbWFnZSB8IE1lc3NhZ2VCYWNrV2l0aFRpdGxlXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUJhY2tXaXRoSW1hZ2Uge1xuICAgIGRpc3BsYXlUZXh0Pzogc3RyaW5nLFxuICAgIGltYWdlOiBzdHJpbmcsXG4gICAgdGV4dD86IHN0cmluZyxcbiAgICB0aXRsZT86IHN0cmluZyxcbiAgICB0eXBlOiBcIm1lc3NhZ2VCYWNrXCIsXG4gICAgdmFsdWU/OiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQmFja1dpdGhUaXRsZSB7XG4gICAgZGlzcGxheVRleHQ/OiBzdHJpbmcsXG4gICAgaW1hZ2U/OiBzdHJpbmcsXG4gICAgdGV4dD86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwibWVzc2FnZUJhY2tcIixcbiAgICB2YWx1ZT86IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5VUkxDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwib3BlblVybFwiLFxuICAgIHZhbHVlOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5QXVkaW9DYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHR5cGU6IFwicGxheUF1ZGlvXCIsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlWaWRlb0NhcmRBY3Rpb24ge1xuICAgIGltYWdlPzogc3RyaW5nLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgdHlwZTogXCJwbGF5VmlkZW9cIixcbiAgICB2YWx1ZTogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdEJhY2tDYXJkQWN0aW9uIHtcbiAgICBpbWFnZT86IHN0cmluZyxcbiAgICB0aXRsZT86IHN0cmluZyxcbiAgICB0eXBlOiBcInBvc3RCYWNrXCIsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNob3dJbWFnZUNhcmRBY3Rpb24ge1xuICAgIGltYWdlPzogc3RyaW5nLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgdHlwZTogXCJzaG93SW1hZ2VcIixcbiAgICB2YWx1ZTogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluQ2FyZEFjdGlvbiB7XG4gICAgaW1hZ2U/OiBzdHJpbmcsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICB0eXBlOiBcInNpZ25pblwiLFxuICAgIHZhbHVlOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJkSW1hZ2Uge1xuICAgIGFsdD86IHN0cmluZyxcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YXA/OiBDYXJkQWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVyb0NhcmQge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5oZXJvXCIsXG4gICAgY29udGVudDoge1xuICAgICAgICB0aXRsZT86IHN0cmluZyxcbiAgICAgICAgc3VidGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHRleHQ/OiBzdHJpbmcsXG4gICAgICAgIGltYWdlcz86IENhcmRJbWFnZVtdLFxuICAgICAgICBidXR0b25zPzogQ2FyZEFjdGlvbltdLFxuICAgICAgICB0YXA/OiBDYXJkQWN0aW9uXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRodW1ibmFpbCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLnRodW1ibmFpbFwiLFxuICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHN1YnRpdGxlPzogc3RyaW5nLFxuICAgICAgICB0ZXh0Pzogc3RyaW5nLFxuICAgICAgICBpbWFnZXM/OiBDYXJkSW1hZ2VbXSxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXSxcbiAgICAgICAgdGFwPzogQ2FyZEFjdGlvblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduaW4ge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5zaWduaW5cIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRleHQ/OiBzdHJpbmcsXG4gICAgICAgIGJ1dHRvbnM/OiBDYXJkQWN0aW9uW11cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGgge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5vYXV0aFwiLFxuICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgY29ubmVjdGlvbm5hbWU6IHN0cmluZyxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXVxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNlaXB0SXRlbSB7XG4gICAgdGl0bGU/OiBzdHJpbmcsXG4gICAgc3VidGl0bGU/OiBzdHJpbmcsXG4gICAgdGV4dD86IHN0cmluZyxcbiAgICBpbWFnZT86IENhcmRJbWFnZSxcbiAgICBwcmljZT86IHN0cmluZyxcbiAgICBxdWFudGl0eT86IHN0cmluZyxcbiAgICB0YXA/OiBDYXJkQWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjZWlwdCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLnJlY2VpcHRcIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBmYWN0cz86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfVtdLFxuICAgICAgICBpdGVtcz86IFJlY2VpcHRJdGVtW10sXG4gICAgICAgIHRhcD86IENhcmRBY3Rpb24sXG4gICAgICAgIHRheD86IHN0cmluZyxcbiAgICAgICAgdmF0Pzogc3RyaW5nLFxuICAgICAgICB0b3RhbD86IHN0cmluZyxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXVxuICAgIH1cbn1cblxuLy8gRGVwcmVjYXRlZCBmb3JtYXQgZm9yIFNreXBlIGNoYW5uZWxzLiBGb3IgdGVzdGluZyBsZWdhY3kgYm90cyBpbiBFbXVsYXRvciBvbmx5LlxuZXhwb3J0IGludGVyZmFjZSBGbGV4Q2FyZCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLmZsZXhcIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBzdWJ0aXRsZT86IHN0cmluZyxcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgaW1hZ2VzPzogQ2FyZEltYWdlW10sXG4gICAgICAgIGJ1dHRvbnM/OiBDYXJkQWN0aW9uW10sXG4gICAgICAgIGFzcGVjdD86IHN0cmluZ1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0NhcmQge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hdWRpb1wiLFxuICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHN1YnRpdGxlPzogc3RyaW5nLFxuICAgICAgICB0ZXh0Pzogc3RyaW5nLFxuICAgICAgICBtZWRpYT86IHsgdXJsOiBzdHJpbmcsIHByb2ZpbGU/OiBzdHJpbmcgfVtdLFxuICAgICAgICBidXR0b25zPzogQ2FyZEFjdGlvbltdLFxuICAgICAgICBhdXRvbG9vcD86IGJvb2xlYW4sXG4gICAgICAgIGF1dG9zdGFydD86IGJvb2xlYW5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9DYXJkIHtcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmNhcmQudmlkZW9cIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBzdWJ0aXRsZT86IHN0cmluZyxcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgbWVkaWE/OiB7IHVybDogc3RyaW5nLCBwcm9maWxlPzogc3RyaW5nIH1bXSxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXSxcbiAgICAgICAgaW1hZ2U/OiB7IHVybDogc3RyaW5nLCBhbHQ/OiBzdHJpbmcgfSxcbiAgICAgICAgYXV0b2xvb3A/OiBib29sZWFuLFxuICAgICAgICBhdXRvc3RhcnQ/OiBib29sZWFuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0aXZlQ2FyZCB7XG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5jYXJkLmFkYXB0aXZlXCIsXG4gICAgY29udGVudDogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFuaW1hdGlvbkNhcmQge1xuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hbmltYXRpb25cIixcbiAgICBjb250ZW50OiB7XG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBzdWJ0aXRsZT86IHN0cmluZyxcbiAgICAgICAgdGV4dD86IHN0cmluZyxcbiAgICAgICAgbWVkaWE/OiB7IHVybDogc3RyaW5nLCBwcm9maWxlPzogc3RyaW5nIH1bXSxcbiAgICAgICAgYnV0dG9ucz86IENhcmRBY3Rpb25bXSxcbiAgICAgICAgaW1hZ2U/OiB7IHVybDogc3RyaW5nLCBhbHQ/OiBzdHJpbmcgfSxcbiAgICAgICAgYXV0b2xvb3A/OiBib29sZWFuLFxuICAgICAgICBhdXRvc3RhcnQ/OiBib29sZWFuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBLbm93bk1lZGlhID0gTWVkaWEgfCBIZXJvQ2FyZCB8IFRodW1ibmFpbCB8IFNpZ25pbiB8IE9BdXRoIHwgUmVjZWlwdCB8IEF1ZGlvQ2FyZCB8IFZpZGVvQ2FyZCB8IEFuaW1hdGlvbkNhcmQgfCBGbGV4Q2FyZCB8IEFkYXB0aXZlQ2FyZDtcbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnQgPSBLbm93bk1lZGlhIHwgVW5rbm93bk1lZGlhO1xuXG5leHBvcnQgdHlwZSBVc2VyUm9sZSA9IFwiYm90XCIgfCBcImNoYW5uZWxcIiB8IFwidXNlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBpY29uVXJsPzogc3RyaW5nLFxuICAgIHJvbGU/OiBVc2VyUm9sZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBY3Rpdml0eSB7XG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGNoYW5uZWxEYXRhPzogYW55LFxuICAgIGNoYW5uZWxJZD86IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb24/OiB7IGlkOiBzdHJpbmcgfSxcbiAgICBlVGFnPzogc3RyaW5nLFxuICAgIGZyb206IFVzZXIsXG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgdGltZXN0YW1wPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRMYXlvdXQgPSBcImxpc3RcIiB8IFwiY2Fyb3VzZWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIGV4dGVuZHMgSUFjdGl2aXR5IHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICB0ZXh0Pzogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZyxcbiAgICB0ZXh0Rm9ybWF0PzogXCJwbGFpblwiIHwgXCJtYXJrZG93blwiIHwgXCJ4bWxcIixcbiAgICBhdHRhY2htZW50TGF5b3V0PzogQXR0YWNobWVudExheW91dCxcbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRbXSxcbiAgICBlbnRpdGllcz86IGFueVtdLFxuICAgIHN1Z2dlc3RlZEFjdGlvbnM/OiB7IGFjdGlvbnM6IENhcmRBY3Rpb25bXSwgdG8/OiBzdHJpbmdbXSB9LFxuICAgIHNwZWFrPzogc3RyaW5nLFxuICAgIGlucHV0SGludD86IHN0cmluZyxcbiAgICB2YWx1ZT86IG9iamVjdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGluZyBleHRlbmRzIElBY3Rpdml0eSB7XG4gICAgdHlwZTogXCJ0eXBpbmdcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50QWN0aXZpdHkgZXh0ZW5kcyBJQWN0aXZpdHkge1xuICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxufVxuXG5leHBvcnQgdHlwZSBBY3Rpdml0eSA9IE1lc3NhZ2UgfCBUeXBpbmcgfCBFdmVudEFjdGl2aXR5O1xuXG5pbnRlcmZhY2UgQWN0aXZpdHlHcm91cCB7XG4gICAgYWN0aXZpdGllczogQWN0aXZpdHlbXSxcbiAgICB3YXRlcm1hcms6IHN0cmluZ1xufVxuXG4vLyBUaGVzZSB0eXBlcyBhcmUgc3BlY2lmaWMgdG8gdGhpcyBjbGllbnQgbGlicmFyeSwgbm90IHRvIERpcmVjdCBMaW5lIDMuMFxuXG5leHBvcnQgZW51bSBDb25uZWN0aW9uU3RhdHVzIHtcbiAgICBVbmluaXRpYWxpemVkLCAgICAgICAgICAgICAgLy8gdGhlIHN0YXR1cyB3aGVuIHRoZSBEaXJlY3RMaW5lIG9iamVjdCBpcyBmaXJzdCBjcmVhdGVkL2NvbnN0cnVjdGVkXG4gICAgQ29ubmVjdGluZywgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgY29udmVyc2F0aW9uXG4gICAgT25saW5lLCAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gdGhlIGNvbnZlcnN0YWlvbi4gQ29ubmVjdGlvbiBpcyBoZWFsdGh5IHNvIGZhciBhcyB3ZSBrbm93LlxuICAgIEV4cGlyZWRUb2tlbiwgICAgICAgICAgICAgICAvLyBsYXN0IG9wZXJhdGlvbiBlcnJvcmVkIG91dCB3aXRoIGFuIGV4cGlyZWQgdG9rZW4uIFBvc3NpYmx5IHdhaXRpbmcgZm9yIHNvbWVvbmUgdG8gc3VwcGx5IGEgbmV3IG9uZS5cbiAgICBGYWlsZWRUb0Nvbm5lY3QsICAgICAgICAgICAgLy8gdGhlIGluaXRpYWwgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoZSBjb252ZXJzYXRpb24gZmFpbGVkLiBObyByZWNvdmVyeSBwb3NzaWJsZS5cbiAgICBFbmRlZCAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdCBlbmRlZCB0aGUgY29udmVyc2F0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0TGluZU9wdGlvbnMge1xuICAgIHNlY3JldD86IHN0cmluZyxcbiAgICB0b2tlbj86IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgICB3YXRlcm1hcms/OiBzdHJpbmcsXG4gICAgZG9tYWluPzogc3RyaW5nLFxuICAgIHdlYlNvY2tldD86IGJvb2xlYW4sXG4gICAgcG9sbGluZ0ludGVydmFsPzogbnVtYmVyLFxuICAgIHN0cmVhbVVybD86IHN0cmluZyxcbiAgICAvLyBBdHRhY2hlZCB0byBhbGwgcmVxdWVzdHMgdG8gaWRlbnRpZnkgcmVxdWVzdGluZyBhZ2VudC5cbiAgICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jb25zdCBsaWZldGltZVJlZnJlc2hUb2tlbiA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgaW50ZXJ2YWxSZWZyZXNoVG9rZW4gPSBsaWZldGltZVJlZnJlc2hUb2tlbiAvIDI7XG5jb25zdCB0aW1lb3V0ID0gMjAgKiAxMDAwO1xuY29uc3QgcmV0cmllcyA9IChsaWZldGltZVJlZnJlc2hUb2tlbiAtIGludGVydmFsUmVmcmVzaFRva2VuKSAvIHRpbWVvdXQ7XG5cbmNvbnN0IFBPTExJTkdfSU5URVJWQUxfTE9XRVJfQk9VTkQ6IG51bWJlciA9IDIwMDsgLy9tc1xuXG5jb25zdCBlcnJvckV4cGlyZWRUb2tlbiA9IG5ldyBFcnJvcihcImV4cGlyZWQgdG9rZW5cIik7XG5jb25zdCBlcnJvckNvbnZlcnNhdGlvbkVuZGVkID0gbmV3IEVycm9yKFwiY29udmVyc2F0aW9uIGVuZGVkXCIpO1xuY29uc3QgZXJyb3JGYWlsZWRUb0Nvbm5lY3QgPSBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gY29ubmVjdFwiKTtcblxuY29uc3Qga29uc29sZSA9IHtcbiAgICBsb2c6IChtZXNzYWdlPzogYW55LCAuLi4gb3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAod2luZG93IGFzIGFueSlbXCJib3RjaGF0RGVidWdcIl0gJiYgbWVzc2FnZSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UsIC4uLiBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCb3RDb25uZWN0aW9uIHtcbiAgICBjb25uZWN0aW9uU3RhdHVzJDogQmVoYXZpb3JTdWJqZWN0PENvbm5lY3Rpb25TdGF0dXM+LFxuICAgIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT4sXG4gICAgZW5kKCk6IHZvaWQsXG4gICAgcmVmZXJlbmNlR3JhbW1hcklkPzogc3RyaW5nLFxuICAgIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpOiBPYnNlcnZhYmxlPHN0cmluZz4sXG4gICAgZ2V0U2Vzc2lvbklkPyA6ICgpID0+IE9ic2VydmFibGU8c3RyaW5nPlxufVxuXG5leHBvcnQgY2xhc3MgRGlyZWN0TGluZSBpbXBsZW1lbnRzIElCb3RDb25uZWN0aW9uIHtcbiAgICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gICAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgICBwcml2YXRlIGRvbWFpbiA9IFwiaHR0cHM6Ly9kaXJlY3RsaW5lLmJvdGZyYW1ld29yay5jb20vdjMvZGlyZWN0bGluZVwiO1xuICAgIHByaXZhdGUgd2ViU29ja2V0OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICAgIHByaXZhdGUgZXhwaXJlZFRva2VuRXhoYXVzdGlvbjogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBzZWNyZXQ6IHN0cmluZztcbiAgICBwcml2YXRlIHRva2VuOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB3YXRlcm1hcmsgPSAnJztcbiAgICBwcml2YXRlIHN0cmVhbVVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2JvdEFnZW50ID0gJyc7XG4gICAgcHJpdmF0ZSBfdXNlckFnZW50OiBzdHJpbmc7XG4gICAgcHVibGljIHJlZmVyZW5jZUdyYW1tYXJJZDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBwb2xsaW5nSW50ZXJ2YWw6IG51bWJlciA9IDEwMDA7IC8vbXNcblxuICAgIHByaXZhdGUgdG9rZW5SZWZyZXNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNlY3JldCA9IG9wdGlvbnMuc2VjcmV0O1xuICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucy5zZWNyZXQgfHwgb3B0aW9ucy50b2tlbjtcbiAgICAgICAgdGhpcy53ZWJTb2NrZXQgPSAob3B0aW9ucy53ZWJTb2NrZXQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLndlYlNvY2tldCkgJiYgdHlwZW9mIFdlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcgJiYgV2ViU29ja2V0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZG9tYWluKSB7XG4gICAgICAgICAgICB0aGlzLmRvbWFpbiA9IG9wdGlvbnMuZG9tYWluO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBvcHRpb25zLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMud2F0ZXJtYXJrKSB7XG4gICAgICAgICAgICB0aGlzLndhdGVybWFyayA9ICBvcHRpb25zLndhdGVybWFyaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmVhbVVybCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudG9rZW4gJiYgb3B0aW9ucy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtVXJsID0gb3B0aW9ucy5zdHJlYW1Vcmw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRGlyZWN0TGluZUpTOiBzdHJlYW1Vcmwgd2FzIGlnbm9yZWQ6IHlvdSBuZWVkIHRvIHByb3ZpZGUgYSB0b2tlbiBhbmQgYSBjb252ZXJzYXRpb25pZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYm90QWdlbnQgPSB0aGlzLmdldEJvdEFnZW50KG9wdGlvbnMuYm90QWdlbnQpO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFBvbGxpbmdJbnRlcnZhbCA9IH5+b3B0aW9ucy5wb2xsaW5nSW50ZXJ2YWw7XG5cbiAgICAgICAgaWYgKHBhcnNlZFBvbGxpbmdJbnRlcnZhbCA8IFBPTExJTkdfSU5URVJWQUxfTE9XRVJfQk9VTkQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wb2xsaW5nSW50ZXJ2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBEaXJlY3RMaW5lSlM6IHByb3ZpZGVkIHBvbGxpbmdJbnRlcnZhbCAoJHsgb3B0aW9ucy5wb2xsaW5nSW50ZXJ2YWwgfSkgaXMgdW5kZXIgbG93ZXIgYm91bmQgKDIwMG1zKSwgdXNpbmcgZGVmYXVsdCBvZiAxMDAwbXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9sbGluZ0ludGVydmFsID0gcGFyc2VkUG9sbGluZ0ludGVydmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBpcmVkVG9rZW5FeGhhdXN0aW9uID0gdGhpcy5zZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2soXG4gICAgICAgICAgICBDb25uZWN0aW9uU3RhdHVzLkV4cGlyZWRUb2tlbixcbiAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0LFxuICAgICAgICAgICAgNVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuYWN0aXZpdHkkID0gKHRoaXMud2ViU29ja2V0XG4gICAgICAgICAgICA/IHRoaXMud2ViU29ja2V0QWN0aXZpdHkkKClcbiAgICAgICAgICAgIDogdGhpcy5wb2xsaW5nR2V0QWN0aXZpdHkkKClcbiAgICAgICAgKS5zaGFyZSgpO1xuICAgIH1cblxuICAgIC8vIEV2ZXJ5IHRpbWUgd2UncmUgYWJvdXQgdG8gbWFrZSBhIERpcmVjdCBMaW5lIFJFU1QgY2FsbCwgd2UgY2FsbCB0aGlzIGZpcnN0IHRvIHNlZSBjaGVjayB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXR1cy5cbiAgICAvLyBFaXRoZXIgdGhyb3dzIGFuIGVycm9yIChpbmRpY2F0aW5nIGFuIGVycm9yIHN0YXRlKSBvciBlbWl0cyBhIG51bGwsIGluZGljYXRpbmcgYSAocHJlc3VtYWJseSkgaGVhbHRoeSBjb25uZWN0aW9uXG4gICAgcHJpdmF0ZSBjaGVja0Nvbm5lY3Rpb24ob25jZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBvYnMgPSAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJFxuICAgICAgICAuZmxhdE1hcChjb25uZWN0aW9uU3RhdHVzID0+IHtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uU3RhdHVzID09PSBDb25uZWN0aW9uU3RhdHVzLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcblxuICAgICAgICAgICAgICAgIC8vaWYgdG9rZW4gYW5kIHN0cmVhbVVybCBhcmUgZGVmaW5lZCBpdCBtZWFucyByZWNvbm5lY3QgaGFzIGFscmVhZHkgYmVlbiBkb25lLiBTa2lwcGluZyBpdC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b2tlbiAmJiB0aGlzLnN0cmVhbVVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihjb25uZWN0aW9uU3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydENvbnZlcnNhdGlvbigpLmRvKGNvbnZlcnNhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRoaXMuc2VjcmV0IHx8IGNvbnZlcnNhdGlvbi50b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtVXJsID0gY29udmVyc2F0aW9uLnN0cmVhbVVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlR3JhbW1hcklkID0gY29udmVyc2F0aW9uLnJlZmVyZW5jZUdyYW1tYXJJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWNyZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5Mb29wKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoXyA9PiBjb25uZWN0aW9uU3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihjb25uZWN0aW9uU3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcihjb25uZWN0aW9uU3RhdHVzID0+IGNvbm5lY3Rpb25TdGF0dXMgIT0gQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkICYmIGNvbm5lY3Rpb25TdGF0dXMgIT0gQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKVxuICAgICAgICAuZmxhdE1hcChjb25uZWN0aW9uU3RhdHVzID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoY29ubmVjdGlvblN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXR1cy5FbmRlZDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coZXJyb3JDb252ZXJzYXRpb25FbmRlZCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvckZhaWxlZFRvQ29ubmVjdCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihjb25uZWN0aW9uU3RhdHVzKTtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLm9mKGNvbm5lY3Rpb25TdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBvbmNlID8gb2JzLnRha2UoMSkgOiBvYnM7XG4gICAgfVxuXG4gICAgc2V0Q29ubmVjdGlvblN0YXR1c0ZhbGxiYWNrKFxuICAgICAgICBjb25uZWN0aW9uU3RhdHVzRnJvbTogQ29ubmVjdGlvblN0YXR1cyxcbiAgICAgICAgY29ubmVjdGlvblN0YXR1c1RvOiBDb25uZWN0aW9uU3RhdHVzLFxuICAgICAgICBtYXhBdHRlbXB0cyA9IDVcbiAgICApIHtcbiAgICAgICAgbWF4QXR0ZW1wdHMtLTtcbiAgICAgICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICAgICAgbGV0IGN1cnJTdGF0dXMgPSBudWxsO1xuICAgICAgICByZXR1cm4gKHN0YXR1czogQ29ubmVjdGlvblN0YXR1cyk6IENvbm5lY3Rpb25TdGF0dXMgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gY29ubmVjdGlvblN0YXR1c0Zyb20gJiYgY3VyclN0YXR1cyA9PT0gc3RhdHVzICYmIGF0dGVtcHRzID49IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdHMgPSAwXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25TdGF0dXNUbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgICAgICBjdXJyU3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGlyZWRUb2tlbigpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvblN0YXR1cyA9IHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb25TdGF0dXMgIT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCAmJiBjb25uZWN0aW9uU3RhdHVzICE9IENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KVxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuKTtcblxuICAgICAgICBjb25zdCBwcm90ZWN0ZWRDb25uZWN0aW9uU3RhdHVzID0gdGhpcy5leHBpcmVkVG9rZW5FeGhhdXN0aW9uKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChwcm90ZWN0ZWRDb25uZWN0aW9uU3RhdHVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0Q29udmVyc2F0aW9uKCkge1xuICAgICAgICAvL2lmIGNvbnZlcnNhdGlvbmlkIGlzIHNldCBoZXJlLCBpdCBtZWFucyB3ZSBuZWVkIHRvIGNhbGwgdGhlIHJlY29ubmVjdCBhcGksIGVsc2UgaXQgaXMgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY29udmVyc2F0aW9uSWRcbiAgICAgICAgICAgID8gYCR7dGhpcy5kb21haW59L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfT93YXRlcm1hcms9JHt0aGlzLndhdGVybWFya31gXG4gICAgICAgICAgICA6IGAke3RoaXMuZG9tYWlufS9jb252ZXJzYXRpb25zYDtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gdGhpcy5jb252ZXJzYXRpb25JZCA/IFwiR0VUXCIgOiBcIlBPU1RcIjtcblxuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5hamF4KHtcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb21tb25IZWFkZXJzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbi8vICAgICAgLmRvKGFqYXhSZXNwb25zZSA9PiBrb25zb2xlLmxvZyhcImNvbnZlcnNhdGlvbiBhamF4UmVzcG9uc2VcIiwgYWpheFJlc3BvbnNlLnJlc3BvbnNlKSlcbiAgICAgICAgLm1hcChhamF4UmVzcG9uc2UgPT4gYWpheFJlc3BvbnNlLnJlc3BvbnNlIGFzIENvbnZlcnNhdGlvbilcbiAgICAgICAgLnJldHJ5V2hlbihlcnJvciQgPT5cbiAgICAgICAgICAgIC8vIGZvciBub3cgd2UgZGVlbSA0eHggYW5kIDV4eCBlcnJvcnMgYXMgdW5yZWNvdmVyYWJsZVxuICAgICAgICAgICAgLy8gZm9yIGV2ZXJ5dGhpbmcgZWxzZSAodGltZW91dHMpLCByZXRyeSBmb3IgYSB3aGlsZVxuICAgICAgICAgICAgZXJyb3IkLm1lcmdlTWFwKGVycm9yID0+IGVycm9yLnN0YXR1cyA+PSA0MDAgJiYgZXJyb3Iuc3RhdHVzIDwgNjAwXG4gICAgICAgICAgICAgICAgPyBPYnNlcnZhYmxlLnRocm93KGVycm9yKVxuICAgICAgICAgICAgICAgIDogT2JzZXJ2YWJsZS5vZihlcnJvcilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5kZWxheSh0aW1lb3V0KVxuICAgICAgICAgICAgLnRha2UocmV0cmllcylcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuTG9vcCgpIHtcbiAgICAgICAgdGhpcy50b2tlblJlZnJlc2hTdWJzY3JpcHRpb24gPSBPYnNlcnZhYmxlLmludGVydmFsKGludGVydmFsUmVmcmVzaFRva2VuKVxuICAgICAgICAuZmxhdE1hcChfID0+IHRoaXMucmVmcmVzaFRva2VuKCkpXG4gICAgICAgIC5zdWJzY3JpYmUodG9rZW4gPT4ge1xuICAgICAgICAgICAga29uc29sZS5sb2coXCJyZWZyZXNoaW5nIHRva2VuXCIsIHRva2VuLCBcImF0XCIsIG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb25uZWN0aW9uKHRydWUpXG4gICAgICAgIC5mbGF0TWFwKF8gPT5cbiAgICAgICAgICAgIE9ic2VydmFibGUuYWpheCh7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuZG9tYWlufS90b2tlbnMvcmVmcmVzaGAsXG4gICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoYWpheFJlc3BvbnNlID0+IGFqYXhSZXNwb25zZS5yZXNwb25zZS50b2tlbiBhcyBzdHJpbmcpXG4gICAgICAgICAgICAucmV0cnlXaGVuKGVycm9yJCA9PiBlcnJvciRcbiAgICAgICAgICAgICAgICAubWVyZ2VNYXAoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0b2tlbiBpcyBleHBpcmVkIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIGtlZXAgdHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGlyZWRUb2tlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYm90IGlzIGdvbmUsIHdlIHNob3VsZCBzdG9wIHJldHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZGVsYXkodGltZW91dClcbiAgICAgICAgICAgICAgICAudGFrZShyZXRyaWVzKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgfVxuXG4gICAgcHVibGljIHJlY29ubmVjdChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvbikge1xuICAgICAgICB0aGlzLnRva2VuID0gY29udmVyc2F0aW9uLnRva2VuO1xuICAgICAgICB0aGlzLnN0cmVhbVVybCA9IGNvbnZlcnNhdGlvbi5zdHJlYW1Vcmw7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuKVxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuT25saW5lKTtcbiAgICB9XG5cbiAgICBlbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLnRva2VuUmVmcmVzaFN1YnNjcmlwdGlvbilcbiAgICAgICAgICAgIHRoaXMudG9rZW5SZWZyZXNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlID09PSBlcnJvckNvbnZlcnNhdGlvbkVuZGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRocm93KGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0U2Vzc2lvbklkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGJvdCwgZ2V0IGNvbm5lY3RlZFxuICAgICAgICAvLyBXaWxsIHRocm93IGFuIGVycm9yIGlmIHdlIGFyZSBub3QgY29ubmVjdGVkXG4gICAgICAgIGtvbnNvbGUubG9nKFwiZ2V0U2Vzc2lvbklkXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0Nvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgIC5mbGF0TWFwKF8gPT5cbiAgICAgICAgICAgICAgICBPYnNlcnZhYmxlLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5kb21haW59L3Nlc3Npb24vZ2V0c2Vzc2lvbmlkYCxcbiAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5tYXAoYWpheFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFqYXhSZXNwb25zZSAmJiBhamF4UmVzcG9uc2UucmVzcG9uc2UgJiYgYWpheFJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJnZXRTZXNzaW9uSWQgcmVzcG9uc2U6IFwiICsgYWpheFJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWpheFJlc3BvbnNlLnJlc3BvbnNlLnNlc3Npb25JZCBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJnZXRTZXNzaW9uSWQgZXJyb3I6IFwiICsgZXJyb3Iuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUub2YoJycpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5jYXRjaEV4cGlyZWRUb2tlbihlcnJvcikpO1xuICAgIH1cblxuICAgIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICAgICAgLy8gVXNlIHBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIGZvciBtZXNzYWdlcyB3aXRoIGF0dGFjaG1lbnRzIHRoYXQgYXJlIGxvY2FsIGZpbGVzIChlLmcuIGFuIGltYWdlIHRvIHVwbG9hZClcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2UgY291bGQgdXNlIGl0IGZvciAqYWxsKiBhY3Rpdml0aWVzLCBidXQgcG9zdEFjdGl2aXR5IGlzIG11Y2ggbGlnaHRlciB3ZWlnaHRcbiAgICAgICAgLy8gU28sIHNpbmNlIFdlYkNoYXQgaXMgcGFydGlhbGx5IGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERpcmVjdCBMaW5lLCB3ZSBpbXBsZW1lbnQgYm90aC5cbiAgICAgICAgaWYgKGFjdGl2aXR5LnR5cGUgPT09IFwibWVzc2FnZVwiICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhhY3Rpdml0eSk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGNvbm5lY3RlZCB0byB0aGUgYm90LCBnZXQgY29ubmVjdGVkXG4gICAgICAgIC8vIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgd2UgYXJlIG5vdCBjb25uZWN0ZWRcbiAgICAgICAga29uc29sZS5sb2coXCJwb3N0QWN0aXZpdHlcIiwgYWN0aXZpdHkpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0Nvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgLmZsYXRNYXAoXyA9PlxuICAgICAgICAgICAgT2JzZXJ2YWJsZS5hamF4KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5kb21haW59L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS9hY3Rpdml0aWVzYCxcbiAgICAgICAgICAgICAgICBib2R5OiBhY3Rpdml0eSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAubWFwKGFqYXhSZXNwb25zZSA9PiBhamF4UmVzcG9uc2UucmVzcG9uc2UuaWQgYXMgc3RyaW5nKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuY2F0Y2hQb3N0RXJyb3IoZXJyb3IpKVxuICAgICAgICApXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB0aGlzLmNhdGNoRXhwaXJlZFRva2VuKGVycm9yKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyh7IGF0dGFjaG1lbnRzLCAuLi4gbWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9OiBNZXNzYWdlKSB7XG4gICAgICAgIGxldCBmb3JtRGF0YTogRm9ybURhdGE7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGNvbm5lY3RlZCB0byB0aGUgYm90LCBnZXQgY29ubmVjdGVkXG4gICAgICAgIC8vIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgd2UgYXJlIG5vdCBjb25uZWN0ZWRcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb25uZWN0aW9uKHRydWUpXG4gICAgICAgIC5mbGF0TWFwKF8gPT4ge1xuICAgICAgICAgICAgLy8gVG8gc2VuZCB0aGlzIG1lc3NhZ2UgdG8gRGlyZWN0TGluZSB3ZSBuZWVkIHRvIGRlY29uc3RydWN0IGl0IGludG8gYSBcInRlbXBsYXRlXCIgYWN0aXZpdHlcbiAgICAgICAgICAgIC8vIGFuZCBvbmUgYmxvYiBmb3IgZWFjaCBhdHRhY2htZW50LlxuICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYWN0aXZpdHknLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkobWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmFjdGl2aXR5JyB9KSk7XG5cbiAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmZyb20oYXR0YWNobWVudHMgfHwgW10pXG4gICAgICAgICAgICAuZmxhdE1hcCgobWVkaWE6IE1lZGlhKSA9PlxuICAgICAgICAgICAgICAgIE9ic2VydmFibGUuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBtZWRpYS5jb250ZW50VXJsLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5kbyhhamF4UmVzcG9uc2UgPT5cbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgbmV3IEJsb2IoW2FqYXhSZXNwb25zZS5yZXNwb25zZV0sIHsgdHlwZTogbWVkaWEuY29udGVudFR5cGUgfSksIG1lZGlhLm5hbWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmNvdW50KClcbiAgICAgICAgfSlcbiAgICAgICAgLmZsYXRNYXAoXyA9PlxuICAgICAgICAgICAgT2JzZXJ2YWJsZS5hamF4KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIHVybDogYCR7dGhpcy5kb21haW59L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS91cGxvYWQ/dXNlcklkPSR7bWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cy5mcm9tLmlkfWAsXG4gICAgICAgICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoYWpheFJlc3BvbnNlID0+IGFqYXhSZXNwb25zZS5yZXNwb25zZS5pZCBhcyBzdHJpbmcpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5jYXRjaFBvc3RFcnJvcihlcnJvcikpXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuY2F0Y2hQb3N0RXJyb3IoZXJyb3IpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhdGNoUG9zdEVycm9yKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAzKVxuICAgICAgICAgICAgLy8gdG9rZW4gaGFzIGV4cGlyZWQgKHdpbGwgZmFsbCB0aHJvdWdoIHRvIHJldHVybiBcInJldHJ5XCIpXG4gICAgICAgICAgICB0aGlzLmV4cGlyZWRUb2tlbigpO1xuICAgICAgICBlbHNlIGlmIChlcnJvci5zdGF0dXMgPj0gNDAwICYmIGVycm9yLnN0YXR1cyA8IDUwMClcbiAgICAgICAgICAgIC8vIG1vcmUgdW5yZWNvdmVyYWJsZSBlcnJvcnNcbiAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KGVycm9yKTtcbiAgICAgICAgcmV0dXJuIE9ic2VydmFibGUub2YoXCJyZXRyeVwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhdGNoRXhwaXJlZFRva2VuKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yID09PSBlcnJvckV4cGlyZWRUb2tlblxuICAgICAgICA/IE9ic2VydmFibGUub2YoXCJyZXRyeVwiKVxuICAgICAgICA6IE9ic2VydmFibGUudGhyb3coZXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9sbGluZ0dldEFjdGl2aXR5JCgpIHtcbiAgICAgICAgY29uc3QgcG9sbGVyJDogT2JzZXJ2YWJsZTxBamF4UmVzcG9uc2U+ID0gT2JzZXJ2YWJsZS5jcmVhdGUoKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8YW55PikgPT4ge1xuICAgICAgICAgICAgLy8gQSBCZWhhdmlvclN1YmplY3QgdG8gdHJpZ2dlciBwb2xsaW5nLiBTaW5jZSBpdCBpcyBhIEJlaGF2aW9yU3ViamVjdFxuICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGV2ZW50IGlzIHByb2R1Y2VkIGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xuXG4gICAgICAgICAgICB0cmlnZ2VyJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuT25saW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgICAgICBPYnNlcnZhYmxlLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogYCR7IHRoaXMuZG9tYWluIH0vY29udmVyc2F0aW9ucy8keyB0aGlzLmNvbnZlcnNhdGlvbklkIH0vYWN0aXZpdGllcz93YXRlcm1hcms9JHsgdGhpcy53YXRlcm1hcmsgfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0XG4gICAgICAgICAgICAgICAgICAgIH0pLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQ6IEFqYXhSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdHJpZ2dlciQubmV4dChudWxsKSwgTWF0aC5tYXgoMCwgdGhpcy5wb2xsaW5nSW50ZXJ2YWwgLSBEYXRlLm5vdygpICsgc3RhcnRUaW1lc3RhbXApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3Iuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdHJpZ2dlciQubmV4dChudWxsKSwgdGhpcy5wb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrQ29ubmVjdGlvbigpXG4gICAgICAgIC5mbGF0TWFwKF8gPT4gcG9sbGVyJFxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IE9ic2VydmFibGUuZW1wdHk8QWpheFJlc3BvbnNlPigpKVxuICAgICAgICAgICAgLm1hcChhamF4UmVzcG9uc2UgPT4gYWpheFJlc3BvbnNlLnJlc3BvbnNlIGFzIEFjdGl2aXR5R3JvdXApXG4gICAgICAgICAgICAuZmxhdE1hcChhY3Rpdml0eUdyb3VwID0+IHRoaXMub2JzZXJ2YWJsZUZyb21BY3Rpdml0eUdyb3VwKGFjdGl2aXR5R3JvdXApKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZhYmxlRnJvbUFjdGl2aXR5R3JvdXAoYWN0aXZpdHlHcm91cDogQWN0aXZpdHlHcm91cCkge1xuICAgICAgICBpZiAoYWN0aXZpdHlHcm91cC53YXRlcm1hcmspXG4gICAgICAgICAgICB0aGlzLndhdGVybWFyayA9IGFjdGl2aXR5R3JvdXAud2F0ZXJtYXJrO1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5mcm9tKGFjdGl2aXR5R3JvdXAuYWN0aXZpdGllcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3ZWJTb2NrZXRBY3Rpdml0eSQoKTogT2JzZXJ2YWJsZTxBY3Rpdml0eT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0Nvbm5lY3Rpb24oKVxuICAgICAgICAuZmxhdE1hcChfID0+XG4gICAgICAgICAgICB0aGlzLm9ic2VydmFibGVXZWJTb2NrZXQ8QWN0aXZpdHlHcm91cD4oKVxuICAgICAgICAgICAgLy8gV2ViU29ja2V0cyBjYW4gYmUgY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIgb3IgdGhlIGJyb3dzZXIuIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXRyaWV2ZSBhIG5ldyBzdHJlYW1VcmwuIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb3VsZCBmaXJzdCByZXRyeSB3aXRoIHRoZSBjdXJyZW50IHN0cmVhbVVybCxcbiAgICAgICAgICAgIC8vIGJ1dCBpdCdzIHNpbXBsZXIganVzdCB0byBhbHdheXMgZmV0Y2ggYSBuZXcgb25lLlxuICAgICAgICAgICAgLnJldHJ5V2hlbihlcnJvciQgPT4gZXJyb3IkLmRlbGF5KHRoaXMuZ2V0UmV0cnlEZWxheSgpKS5tZXJnZU1hcChlcnJvciA9PiB0aGlzLnJlY29ubmVjdFRvQ29udmVyc2F0aW9uKCkpKVxuICAgICAgICApXG4gICAgICAgIC5mbGF0TWFwKGFjdGl2aXR5R3JvdXAgPT4gdGhpcy5vYnNlcnZhYmxlRnJvbUFjdGl2aXR5R3JvdXAoYWN0aXZpdHlHcm91cCkpXG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0aGUgZGVsYXkgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gICAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigzMDAwICsgTWF0aC5yYW5kb20oKSAqIDEyMDAwKTtcbiAgICB9XG5cbiAgICAvLyBPcmlnaW5hbGx5IHdlIHVzZWQgT2JzZXJ2YWJsZS53ZWJTb2NrZXQsIGJ1dCBpdCdzIGZhaXJseSBvcGlvbmF0ZWQgIGFuZCBJIGVuZGVkIHVwIHdyaXRpbmdcbiAgICAvLyBhIGxvdCBvZiBjb2RlIHRvIHdvcmsgYXJvdW5kIHRoZWlyIGltcGxlbWVudGlvbiBkZXRhaWxzLiBTaW5jZSBXZWJDaGF0IGlzIG1lYW50IHRvIGJlIGEgcmVmZXJlbmNlXG4gICAgLy8gaW1wbGVtZW50YXRpb24sIEkgZGVjaWRlZCByb2xsIHRoZSBiZWxvdywgd2hlcmUgdGhlIGxvZ2ljIGlzIG1vcmUgcHVycG9zZWZ1bC4gLSBAYmlsbGJhXG4gICAgcHJpdmF0ZSBvYnNlcnZhYmxlV2ViU29ja2V0PFQ+KCkge1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8VD4pID0+IHtcbiAgICAgICAgICAgIGtvbnNvbGUubG9nKFwiY3JlYXRpbmcgV2ViU29ja2V0XCIsIHRoaXMuc3RyZWFtVXJsKTtcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh0aGlzLnN0cmVhbVVybCk7XG4gICAgICAgICAgICBsZXQgc3ViOiBTdWJzY3JpcHRpb247XG5cbiAgICAgICAgICAgIHdzLm9ub3BlbiA9IG9wZW4gPT4ge1xuICAgICAgICAgICAgICAgIGtvbnNvbGUubG9nKFwiV2ViU29ja2V0IG9wZW5cIiwgb3Blbik7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIGlzIHByZXR0eSBiYWQgYXQgbm90aWNpbmcgd2hlbiBhIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGJyb2tlbi5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBwZXJpb2RpY2FsbHkgcGluZyB0aGUgc2VydmVyIHdpdGggZW1wdHkgbWVzc2FnZXMsIGl0IGhlbHBzIENocm9tZVxuICAgICAgICAgICAgICAgIC8vIHJlYWxpemUgd2hlbiBjb25uZWN0aW9uIGJyZWFrcywgYW5kIGNsb3NlIHRoZSBzb2NrZXQuIFdlIHRoZW4gdGhyb3cgYW5cbiAgICAgICAgICAgICAgICAvLyBlcnJvciwgYW5kIHRoYXQgZ2l2ZSB1cyB0aGUgb3Bwb3J0dW5pdHkgdG8gYXR0ZW1wdCB0byByZWNvbm5lY3QuXG4gICAgICAgICAgICAgICAgc3ViID0gT2JzZXJ2YWJsZS5pbnRlcnZhbCh0aW1lb3V0KS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cy5zZW5kKFwiXCIpXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJQaW5nIGVycm9yXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdzLm9uY2xvc2UgPSBjbG9zZSA9PiB7XG4gICAgICAgICAgICAgICAga29uc29sZS5sb2coXCJXZWJTb2NrZXQgY2xvc2VcIiwgY2xvc2UpO1xuICAgICAgICAgICAgICAgIGlmIChzdWIpIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoY2xvc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3cy5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IG1lc3NhZ2UuZGF0YSAmJiBzdWJzY3JpYmVyLm5leHQoSlNPTi5wYXJzZShtZXNzYWdlLmRhdGEpKTtcblxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgJ3Vuc3Vic2NyaWJlJyBtZXRob2QsIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoaXMgb2JzZXJ2YWJsZSBpcyBkaXNwb3NlZC5cbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIFdlYlNvY2tldCBjbG9zZXMgaXRzZWxmLCB3ZSB0aHJvdyBhbiBlcnJvciwgYW5kIHRoaXMgZnVuY3Rpb24gaXMgZXZlbnR1YWxseSBjYWxsZWQuXG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBvYnNlcnZhYmxlIGlzIGNsb3NlZCBmaXJzdCAoZS5nLiB3aGVuIHRlYXJpbmcgZG93biBhIFdlYkNoYXQgaW5zdGFuY2UpIHRoZW5cbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFudWFsbHkgY2xvc2UgdGhlIFdlYlNvY2tldC5cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHdzLnJlYWR5U3RhdGUgPT09IDAgfHwgd3MucmVhZHlTdGF0ZSA9PT0gMSkgd3MuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgYXMgT2JzZXJ2YWJsZTxUPlxuICAgIH1cblxuICAgIHByaXZhdGUgcmVjb25uZWN0VG9Db252ZXJzYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrQ29ubmVjdGlvbih0cnVlKVxuICAgICAgICAuZmxhdE1hcChfID0+XG4gICAgICAgICAgICBPYnNlcnZhYmxlLmFqYXgoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuZG9tYWlufS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25JZH0/d2F0ZXJtYXJrPSR7dGhpcy53YXRlcm1hcmt9YCxcbiAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29tbW9uSGVhZGVycygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5kbyhyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWNyZXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW4gPSByZXN1bHQucmVzcG9uc2UudG9rZW47XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1VcmwgPSByZXN1bHQucmVzcG9uc2Uuc3RyZWFtVXJsO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoXyA9PiBudWxsKVxuICAgICAgICAgICAgLnJldHJ5V2hlbihlcnJvciQgPT4gZXJyb3IkXG4gICAgICAgICAgICAgICAgLm1lcmdlTWFwKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBoYXMgZXhwaXJlZC4gV2UgY2FuJ3QgcmVjb3ZlciBmcm9tIHRoaXMgaGVyZSwgYnV0IHRoZSBlbWJlZGRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlYnNpdGUgbWlnaHQgZXZlbnR1YWxseSBjYWxsIHJlY29ubmVjdCgpIHdpdGggYSBuZXcgdG9rZW4gYW5kIHN0cmVhbVVybC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFRva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KGVycm9yQ29udmVyc2F0aW9uRW5kZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGUub2YoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmRlbGF5KHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgLnRha2UocmV0cmllcylcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByaXZhdGUgY29tbW9uSGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiQXV0aG9yaXphdGlvblwiOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgICAgICAgXCJ4LW1zLWJvdC1hZ2VudFwiOiB0aGlzLl9ib3RBZ2VudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Qm90QWdlbnQoY3VzdG9tQWdlbnQ6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGNsaWVudEFnZW50ID0gJ2RpcmVjdGxpbmVqcydcblxuICAgICAgICBpZiAoY3VzdG9tQWdlbnQpIHtcbiAgICAgICAgICAgIGNsaWVudEFnZW50ICs9IGA7ICR7Y3VzdG9tQWdlbnR9YFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/lib/directLine.test.js b/lib/directLine.test.js deleted file mode 100644 index 6ff3dec93..000000000 --- a/lib/directLine.test.js +++ /dev/null @@ -1,68 +0,0 @@ -"use strict"; - -var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); - -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - -var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); - -var DirectLineExport = _interopRequireWildcard(require("./directLine")); - -test("#setConnectionStatusFallback", function () { - var DirectLine = DirectLineExport.DirectLine; - expect((0, _typeof2["default"])(DirectLine.prototype.setConnectionStatusFallback)).toBe("function"); - var setConnectionStatusFallback = DirectLine.prototype.setConnectionStatusFallback; - var testFallback = setConnectionStatusFallback(0, 1); - var idx = 4; - - while (idx--) { - expect(testFallback(0)).toBe(0); - } // fallback will be triggered - - - expect(testFallback(0)).toBe(1); - idx = 4; - - while (idx--) { - expect(testFallback(0)).toBe(0); - } - - expect(testFallback(0)).toBe(1); -}); -describe("#commonHeaders", function () { - var botAgent = "DirectLine/3.0 (directlinejs; custom-bot-agent)"; - var botConnection; - beforeEach(function () { - undefined = "test-version"; - var DirectLine = DirectLineExport.DirectLine; - botConnection = new DirectLine({ - token: "secret-token", - botAgent: "custom-bot-agent" - }); - }); - test('appends browser user agent when in a browser', function () { - // @ts-ignore - expect(botConnection.commonHeaders()).toEqual({ - "Authorization": "Bearer secret-token", - "x-ms-bot-agent": botAgent - }); - }); - test.skip('appends node environment agent when in node', function () { - // @ts-ignore - delete window.navigator; // @ts-ignore - - var os = require('os'); - - var _process = process, - arch = _process.arch, - platform = _process.platform, - version = _process.version; // @ts-ignore - - expect(botConnection.commonHeaders()).toEqual({ - "Authorization": "Bearer secret-token", - "User-Agent": "".concat(botAgent, " (Node.js,Version=").concat(version, "; ").concat(platform, " ").concat(os.release(), "; ").concat(arch, ")"), - "x-ms-bot-agent": botAgent - }); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lLnRlc3QudHMiXSwibmFtZXMiOlsidGVzdCIsIkRpcmVjdExpbmUiLCJEaXJlY3RMaW5lRXhwb3J0IiwiZXhwZWN0IiwicHJvdG90eXBlIiwic2V0Q29ubmVjdGlvblN0YXR1c0ZhbGxiYWNrIiwidG9CZSIsInRlc3RGYWxsYmFjayIsImlkeCIsImRlc2NyaWJlIiwiYm90QWdlbnQiLCJib3RDb25uZWN0aW9uIiwiYmVmb3JlRWFjaCIsInRva2VuIiwiY29tbW9uSGVhZGVycyIsInRvRXF1YWwiLCJza2lwIiwid2luZG93IiwibmF2aWdhdG9yIiwib3MiLCJyZXF1aXJlIiwicHJvY2VzcyIsImFyY2giLCJwbGF0Zm9ybSIsInZlcnNpb24iLCJyZWxlYXNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQVlBQSxJQUFJLENBQUMsOEJBQUQsRUFBaUMsWUFBTTtBQUFBLE1BQy9CQyxVQUQrQixHQUNoQkMsZ0JBRGdCLENBQy9CRCxVQUQrQjtBQUV2Q0UsRUFBQUEsTUFBTSwwQkFBUUYsVUFBVSxDQUFDRyxTQUFYLENBQXFCQywyQkFBN0IsRUFBTixDQUFnRUMsSUFBaEUsQ0FBcUUsVUFBckU7QUFGdUMsTUFHL0JELDJCQUgrQixHQUdDSixVQUFVLENBQUNHLFNBSFosQ0FHL0JDLDJCQUgrQjtBQUl2QyxNQUFNRSxZQUFZLEdBQUdGLDJCQUEyQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQWhEO0FBQ0EsTUFBSUcsR0FBRyxHQUFHLENBQVY7O0FBQ0EsU0FBT0EsR0FBRyxFQUFWLEVBQWM7QUFDWkwsSUFBQUEsTUFBTSxDQUFDSSxZQUFZLENBQUMsQ0FBRCxDQUFiLENBQU4sQ0FBd0JELElBQXhCLENBQTZCLENBQTdCO0FBQ0QsR0FSc0MsQ0FTdkM7OztBQUNBSCxFQUFBQSxNQUFNLENBQUNJLFlBQVksQ0FBQyxDQUFELENBQWIsQ0FBTixDQUF3QkQsSUFBeEIsQ0FBNkIsQ0FBN0I7QUFDQUUsRUFBQUEsR0FBRyxHQUFHLENBQU47O0FBQ0EsU0FBT0EsR0FBRyxFQUFWLEVBQWM7QUFDVkwsSUFBQUEsTUFBTSxDQUFDSSxZQUFZLENBQUMsQ0FBRCxDQUFiLENBQU4sQ0FBd0JELElBQXhCLENBQTZCLENBQTdCO0FBQ0g7O0FBQ0RILEVBQUFBLE1BQU0sQ0FBQ0ksWUFBWSxDQUFDLENBQUQsQ0FBYixDQUFOLENBQXdCRCxJQUF4QixDQUE2QixDQUE3QjtBQUNILENBaEJHLENBQUo7QUFrQkFHLFFBQVEsQ0FBQyxnQkFBRCxFQUFtQixZQUFNO0FBQzdCLE1BQU1DLFFBQVEsR0FBRyxpREFBakI7QUFDQSxNQUFJQyxhQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2IsZ0JBQXNCLGNBQXRCO0FBRGEsUUFFTFgsVUFGSyxHQUVVQyxnQkFGVixDQUVMRCxVQUZLO0FBR2JVLElBQUFBLGFBQWEsR0FBRyxJQUFJVixVQUFKLENBQWU7QUFBRVksTUFBQUEsS0FBSyxFQUFFLGNBQVQ7QUFBeUJILE1BQUFBLFFBQVEsRUFBRTtBQUFuQyxLQUFmLENBQWhCO0FBQ0gsR0FKUyxDQUFWO0FBTUFWLEVBQUFBLElBQUksQ0FBQyw4Q0FBRCxFQUFpRCxZQUFNO0FBQ3ZEO0FBQ0FHLElBQUFBLE1BQU0sQ0FBQ1EsYUFBYSxDQUFDRyxhQUFkLEVBQUQsQ0FBTixDQUFzQ0MsT0FBdEMsQ0FBOEM7QUFDMUMsdUJBQWlCLHFCQUR5QjtBQUUxQyx3QkFBa0JMO0FBRndCLEtBQTlDO0FBSUgsR0FORyxDQUFKO0FBUUFWLEVBQUFBLElBQUksQ0FBQ2dCLElBQUwsQ0FBVSw2Q0FBVixFQUF5RCxZQUFNO0FBQzNEO0FBQ0EsV0FBT0MsTUFBTSxDQUFDQyxTQUFkLENBRjJELENBRzNEOztBQUNBLFFBQU1DLEVBQUUsR0FBR0MsT0FBTyxDQUFDLElBQUQsQ0FBbEI7O0FBSjJELG1CQUt2QkMsT0FMdUI7QUFBQSxRQUtuREMsSUFMbUQsWUFLbkRBLElBTG1EO0FBQUEsUUFLN0NDLFFBTDZDLFlBSzdDQSxRQUw2QztBQUFBLFFBS25DQyxPQUxtQyxZQUtuQ0EsT0FMbUMsRUFPM0Q7O0FBQ0FyQixJQUFBQSxNQUFNLENBQUNRLGFBQWEsQ0FBQ0csYUFBZCxFQUFELENBQU4sQ0FBc0NDLE9BQXRDLENBQThDO0FBQzFDLHVCQUFpQixxQkFEeUI7QUFFMUMsOEJBQWlCTCxRQUFqQiwrQkFBOENjLE9BQTlDLGVBQTBERCxRQUExRCxjQUFzRUosRUFBRSxDQUFDTSxPQUFILEVBQXRFLGVBQXVGSCxJQUF2RixNQUYwQztBQUcxQyx3QkFBa0JaO0FBSHdCLEtBQTlDO0FBS0gsR0FiRDtBQWNILENBaENPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBEaXJlY3RMaW5lRXhwb3J0IGZyb20gXCIuL2RpcmVjdExpbmVcIjtcblxuZGVjbGFyZSB2YXIgcHJvY2Vzczoge1xuICAgIGFyY2g6IHN0cmluZztcbiAgICBlbnY6IHtcbiAgICAgICAgVkVSU0lPTjogc3RyaW5nO1xuICAgIH07XG4gICAgcGxhdGZvcm06IHN0cmluZztcbiAgICByZWxlYXNlOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxudGVzdChcIiNzZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2tcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgRGlyZWN0TGluZSB9ID0gRGlyZWN0TGluZUV4cG9ydDtcbiAgICBleHBlY3QodHlwZW9mIERpcmVjdExpbmUucHJvdG90eXBlLnNldENvbm5lY3Rpb25TdGF0dXNGYWxsYmFjaykudG9CZShcImZ1bmN0aW9uXCIpXG4gICAgY29uc3QgeyBzZXRDb25uZWN0aW9uU3RhdHVzRmFsbGJhY2sgfSA9IERpcmVjdExpbmUucHJvdG90eXBlO1xuICAgIGNvbnN0IHRlc3RGYWxsYmFjayA9IHNldENvbm5lY3Rpb25TdGF0dXNGYWxsYmFjaygwLCAxKTtcbiAgICBsZXQgaWR4ID0gNDtcbiAgICB3aGlsZSAoaWR4LS0pIHtcbiAgICAgIGV4cGVjdCh0ZXN0RmFsbGJhY2soMCkpLnRvQmUoMCk7XG4gICAgfVxuICAgIC8vIGZhbGxiYWNrIHdpbGwgYmUgdHJpZ2dlcmVkXG4gICAgZXhwZWN0KHRlc3RGYWxsYmFjaygwKSkudG9CZSgxKTtcbiAgICBpZHggPSA0O1xuICAgIHdoaWxlIChpZHgtLSkge1xuICAgICAgICBleHBlY3QodGVzdEZhbGxiYWNrKDApKS50b0JlKDApO1xuICAgIH1cbiAgICBleHBlY3QodGVzdEZhbGxiYWNrKDApKS50b0JlKDEpO1xufSk7XG5cbmRlc2NyaWJlKFwiI2NvbW1vbkhlYWRlcnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGJvdEFnZW50ID0gXCJEaXJlY3RMaW5lLzMuMCAoZGlyZWN0bGluZWpzOyBjdXN0b20tYm90LWFnZW50KVwiO1xuICAgIGxldCBib3RDb25uZWN0aW9uO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHByb2Nlc3MuZW52LlZFUlNJT04gPSBcInRlc3QtdmVyc2lvblwiO1xuICAgICAgICBjb25zdCB7IERpcmVjdExpbmUgfSA9IERpcmVjdExpbmVFeHBvcnQ7XG4gICAgICAgIGJvdENvbm5lY3Rpb24gPSBuZXcgRGlyZWN0TGluZSh7IHRva2VuOiBcInNlY3JldC10b2tlblwiLCBib3RBZ2VudDogXCJjdXN0b20tYm90LWFnZW50XCIgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdhcHBlbmRzIGJyb3dzZXIgdXNlciBhZ2VudCB3aGVuIGluIGEgYnJvd3NlcicsICgpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBleHBlY3QoYm90Q29ubmVjdGlvbi5jb21tb25IZWFkZXJzKCkpLnRvRXF1YWwoe1xuICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IFwiQmVhcmVyIHNlY3JldC10b2tlblwiLFxuICAgICAgICAgICAgXCJ4LW1zLWJvdC1hZ2VudFwiOiBib3RBZ2VudFxuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgdGVzdC5za2lwKCdhcHBlbmRzIG5vZGUgZW52aXJvbm1lbnQgYWdlbnQgd2hlbiBpbiBub2RlJywgKCkgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSB3aW5kb3cubmF2aWdhdG9yXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuICAgICAgICBjb25zdCB7IGFyY2gsIHBsYXRmb3JtLCB2ZXJzaW9uIH0gPSBwcm9jZXNzO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXhwZWN0KGJvdENvbm5lY3Rpb24uY29tbW9uSGVhZGVycygpKS50b0VxdWFsKHtcbiAgICAgICAgICAgIFwiQXV0aG9yaXphdGlvblwiOiBcIkJlYXJlciBzZWNyZXQtdG9rZW5cIixcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBgJHtib3RBZ2VudH0gKE5vZGUuanMsVmVyc2lvbj0ke3ZlcnNpb259OyAke3BsYXRmb3JtfSAke29zLnJlbGVhc2UoKX07ICR7YXJjaH0pYCxcbiAgICAgICAgICAgIFwieC1tcy1ib3QtYWdlbnRcIjogYm90QWdlbnRcbiAgICAgICAgfSk7XG4gICAgfSlcbn0pO1xuIl19 \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 0dfd8d717..3aa4bb3ec 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,7 @@ "esModuleInterop": true, "declaration": true, - "declarationDir": "built", + "declarationDir": "lib", "emitDeclarationOnly": true, "sourceMap": true }, From 5d9bbb943ad00f283f45a8979fb7075b95d0a805 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 23:00:34 -0700 Subject: [PATCH 12/39] Fix tests --- .babelrc.js | 6 ------ src/directLine.test.ts | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.babelrc.js b/.babelrc.js index cfb22ef13..9683cfc98 100644 --- a/.babelrc.js +++ b/.babelrc.js @@ -6,12 +6,6 @@ module.exports = { ] } }, - ignore: [ - './src/*.spec.js', - './src/*.spec.ts', - './src/*.test.js', - './src/*.test.ts' - ], plugins: [ '@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-object-rest-spread', diff --git a/src/directLine.test.ts b/src/directLine.test.ts index d47db2d1a..98486c7a4 100644 --- a/src/directLine.test.ts +++ b/src/directLine.test.ts @@ -33,7 +33,7 @@ describe("#commonHeaders", () => { let botConnection; beforeEach(() => { - process.env.VERSION = "test-version"; + global.process.env.VERSION = "test-version"; const { DirectLine } = DirectLineExport; botConnection = new DirectLine({ token: "secret-token", botAgent: "custom-bot-agent" }); }); From 0c25b294c2a6ee48d4a1056b5d3cdbb2699996be Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 23:22:12 -0700 Subject: [PATCH 13/39] Update bundle folder --- .gitignore | 5 +---- package.json | 4 ++-- webpack.config.js | 3 ++- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index c3cef5f4d..eeaa11d13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,4 @@ /.env +/dist /lib /node_modules - -/directLine.js -/directLine-instrumented.js -/stats.html diff --git a/package.json b/package.json index db3f85a40..004f4c805 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,14 @@ "version": "0.11.5-0", "description": "Client library for the Microsoft Bot Framework Direct Line 3.0 protocol", "files": [ - "directLine.js", + "dist/**/*", "lib/**/*" ], "main": "lib/directLine.js", "types": "lib/directLine.d.ts", "scripts": { "build": "npm run build:typecheck && npm run build:babel -- --env-name test && npm run build:webpack -- --config webpack-development.config.js", - "build:babel": "babel --extensions .js,.ts --out-dir lib src", + "build:babel": "babel --extensions .js,.ts --ignore src/**/*.spec.js,src/**/*.spec.ts,src/**/*.test.js,src/**/*.test.ts --out-dir lib src", "build:typecheck": "tsc", "build:webpack": "webpack", "clean": "rimraf lib directLine.js stats.html", diff --git a/webpack.config.js b/webpack.config.js index 034a6b05f..7a3473e88 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,4 +1,5 @@ const { DefinePlugin } = require('webpack'); +const { join } = require('path'); const Visualizer = require('webpack-visualizer-plugin'); module.exports = { @@ -10,7 +11,7 @@ module.exports = { filename: '[name].js', library: 'DirectLine', libraryTarget: 'umd', - path: __dirname + path: join(__dirname, 'dist') }, plugins: [ new DefinePlugin({ From 44ec9a45d27bf800c9ca85bb5f83f552c27dbae2 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 23:23:50 -0700 Subject: [PATCH 14/39] Update clean scripts --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 004f4c805..4ef4629cb 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "build:babel": "babel --extensions .js,.ts --ignore src/**/*.spec.js,src/**/*.spec.ts,src/**/*.test.js,src/**/*.test.ts --out-dir lib src", "build:typecheck": "tsc", "build:webpack": "webpack", - "clean": "rimraf lib directLine.js stats.html", + "clean": "rimraf dist lib", "prepublishOnly": "npm run build:typecheck && npm run build:babel && npm run build:webpack", "start": "npm run build && concurrently --names \"babel,typecheck,webpack\" \"npm run build:babel -- --watch\" \"npm run build:typecheck -- --preserveWatchOutput --watch\" \"npm run build:webpack -- --config webpack-watch.config.js --watch\"", "test": "jest", From fc2b46d7c0e4c39eae5fd2a81138b2faaba34964 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 23:26:26 -0700 Subject: [PATCH 15/39] Update bundle name --- webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 7a3473e88..f918a99fb 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,7 +4,7 @@ const Visualizer = require('webpack-visualizer-plugin'); module.exports = { entry: { - 'directLine': './lib/directLine.js' + directline: './lib/directLine.js' }, mode: 'production', output: { From f9a8fcc69441bf71dd44635aed5ad7f73741c5ca Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 10 Sep 2019 23:39:20 -0700 Subject: [PATCH 16/39] Add entry --- CHANGELOG.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9efa5e5cf..7d6b1ca25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,53 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Breaking Changes + +- Build folders updated + - `/dist/` contains JavaScript bundle + - `/dist/directline.js` is now in lowercase + - `/lib/` contains ES modules and type definitions +- Build scripts updated + - `npm run build`: Development build, with instrumentation code, one-off + - `npm run start`: Development build, with instrumentation code, with watch + - `npm run prepublishOnly`: Production build, minified, one-off + +### Changed +- Bumped dependencies, by [@compulim](https://github.com/compulim), in PR [#195](https://github.com/Microsoft/BotFramework-DirectLineJS/pull/195) + - [`@babel/runtime@7.6.0`](https://npmjs.com/package/@babel/runtime) + - [`rxjs@5.0.3`](https://npmjs.com/package/rxjs) +- Bumped dev dependencies, by [@compulim](https://github.com/compulim), in PR [#195](https://github.com/Microsoft/BotFramework-DirectLineJS/pull/195) + - [`@babel/cli@7.6.0`](https://npmjs.com/package/@babel/cli) + - [`@babel/core@7.6.0`](https://npmjs.com/package/@babel/core) + - [`@babel/plugin-proposal-class-properties@7.5.5`](https://npmjs.com/package/@babel/plugin-proposal-class-properties) + - [`@babel/plugin-proposal-object-rest-spread@7.5.5`](https://npmjs.com/package/@babel/plugin-proposal-object-rest-spread) + - [`@babel/plugin-transform-runtime@7.6.0`](https://npmjs.com/package/@babel/plugin-transform-runtime) + - [`@babel/preset-env@7.6.0`](https://npmjs.com/package/@babel/preset-env) + - [`@babel/preset-typescript@7.6.0`](https://npmjs.com/package/@babel/preset-typescript) + - [`@types/jest@24.0.18`](https://npmjs.com/package/@types/jest) + - [`@types/node@12.7.4`](https://npmjs.com/package/@types/node) + - [`@types/p-defer@2.0.0`](https://npmjs.com/package/@types/p-defer) + - [`babel-jest@24.9.0`](https://npmjs.com/package/babel-jest) + - [`babel-plugin-istanbul@5.2.0`](https://npmjs.com/package/babel-plugin-istanbul) + - [`babel-plugin-transform-inline-environment-variables@0.4.3`](https://npmjs.com/package/babel-plugin-transform-inline-environment-variables) + - [`concurrently@4.1.2`](https://npmjs.com/package/concurrently) + - [`dotenv@8.1.0`](https://npmjs.com/package/dotenv) + - [`get-port@5.0.0`](https://npmjs.com/package/get-port) + - [`global-agent@2.0.2`](https://npmjs.com/package/global-agent) + - [`http-proxy@1.17.0`](https://npmjs.com/package/http-proxy) + - [`jest@24.9.0`](https://npmjs.com/package/jest) + - [`jest-environment-jsdom-fourteen@0.1.0`](https://npmjs.com/package/jest-environment-jsdom-fourteen) + - [`jsdom@14.1.0`](https://npmjs.com/package/jsdom) + - [`node-fetch@2.6.0`](https://npmjs.com/package/node-fetch) + - [`on-error-resume-next@1.1.0`](https://npmjs.com/package/on-error-resume-next) + - [`promise-race-map@1.0.0`](https://npmjs.com/package/promise-race-map) + - [`restify@8.4.0`](https://npmjs.com/package/restify) + - [`rimraf@3.0.0`](https://npmjs.com/package/rimraf) + - [`simple-update-in@2.1.1`](https://npmjs.com/package/simple-update-in) + - [`typescript@3.6.2`](https://npmjs.com/package/typescript) + - [`webpack@4.39.3`](https://npmjs.com/package/webpack) + - [`webpack-cli@3.3.8`](https://npmjs.com/package/webpack-cli) + ## [0.11.4] - 2019-03-04 ### Changed - Change reconnect delay to be a random amount between 3s and 15s, by [@mingweiw](https://github.com/mingweiw) in PR [#164](https://github.com/Microsoft/BotFramework-DirectLineJS/pull/164) From f7e00bf6674168322c804697dbe05b3d47adca54 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 13:55:30 -0700 Subject: [PATCH 17/39] Skip all transforms for tests --- .babelrc.js => babel.config.js | 11 +++++++++++ 1 file changed, 11 insertions(+) rename .babelrc.js => babel.config.js (71%) diff --git a/.babelrc.js b/babel.config.js similarity index 71% rename from .babelrc.js rename to babel.config.js index 9683cfc98..402fb2b7d 100644 --- a/.babelrc.js +++ b/babel.config.js @@ -6,6 +6,17 @@ module.exports = { ] } }, + overrides: [{ + include: ['./__tests__'], + presets: [ + ['@babel/preset-env', { + targets: { + node: 12 + } + }], + '@babel/preset-typescript' + ] + }], plugins: [ '@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-object-rest-spread', From 1625407c4e61d54bf3327f99912ce3ff14e5a176 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 13:59:03 -0700 Subject: [PATCH 18/39] Removing unnecessary lines --- __tests__/happy.uploadAttachments.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/__tests__/happy.uploadAttachments.js b/__tests__/happy.uploadAttachments.js index e50c9f356..b8660afb9 100644 --- a/__tests__/happy.uploadAttachments.js +++ b/__tests__/happy.uploadAttachments.js @@ -59,11 +59,9 @@ describe('Happy path', () => { // DirectLine.postActivityWithAttachments support "contentUrl" only but not "content" attachments: [{ contentType: 'image/png', - // contentUrl: 'http://localhost:3978/public/surfacelogo.png' contentUrl: 'https://webchat-waterbottle.azurewebsites.net/public/surfacelogo.png' }, { contentType: 'image/png', - // contentUrl: 'http://localhost:3978/public/xboxlogo.png' contentUrl: 'https://webchat-waterbottle.azurewebsites.net/public/xboxlogo.png' }], text: 'Hello, World!', From 4fedcf81180cc35fcfcabb476f36369f5cbada71 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 14:00:07 -0700 Subject: [PATCH 19/39] Rename cres to res --- __tests__/setup/createDirectLineOptions.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js index 5851f2729..c488962e7 100644 --- a/__tests__/setup/createDirectLineOptions.js +++ b/__tests__/setup/createDirectLineOptions.js @@ -10,9 +10,9 @@ const { const DEFAULT_DOMAIN = 'https://directline.botframework.com/v3/directline'; async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { - let cres; + let res; - cres = await fetch(`${ domain }/tokens/generate`, { + res = await fetch(`${ domain }/tokens/generate`, { body: JSON.stringify({ User: { Id: DEFAULT_USER_ID } }), headers: { authorization: `Bearer ${ DIRECT_LINE_SECRET }`, @@ -21,8 +21,8 @@ async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { method: 'POST' }); - if (cres.status === 200) { - const json = await cres.json(); + if (res.status === 200) { + const json = await res.json(); if ('error' in json) { throw new Error(`Direct Line service responded ${ JSON.stringify(json.error) } while generating new token`); @@ -30,7 +30,7 @@ async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { return json; } } else { - throw new Error(`Direct Line service returned ${ cres.status } while generating new token`); + throw new Error(`Direct Line service returned ${ res.status } while generating new token`); } } From d14b3be5359c5f458937d1343eabf0531eb912ad Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 14:01:03 -0700 Subject: [PATCH 20/39] Rename equalityFn to predicate --- __tests__/setup/waitForActivity.js | 4 ++-- __tests__/setup/waitForBotEcho.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/__tests__/setup/waitForActivity.js b/__tests__/setup/waitForActivity.js index cc6876ea7..5c5f3b85f 100644 --- a/__tests__/setup/waitForActivity.js +++ b/__tests__/setup/waitForActivity.js @@ -1,5 +1,5 @@ import waitForObservable from './waitForObservable'; -export default function waitForBotRespond(directLine, equalityFn) { - return waitForObservable(directLine.activity$, activity => equalityFn(activity)); +export default function waitForBotRespond(directLine, predicate) { + return waitForObservable(directLine.activity$, activity => predicate(activity)); } diff --git a/__tests__/setup/waitForBotEcho.js b/__tests__/setup/waitForBotEcho.js index 7edb06250..34aa57fe8 100644 --- a/__tests__/setup/waitForBotEcho.js +++ b/__tests__/setup/waitForBotEcho.js @@ -1,10 +1,10 @@ import getEchoActivity from './getEchoActivity'; import waitForObservable from './waitForObservable'; -export default function waitForBotEcho(directLine, equalityFn) { +export default function waitForBotEcho(directLine, predicate) { return waitForObservable(directLine.activity$, async activity => { const echoActivity = getEchoActivity(activity); - return echoActivity && await equalityFn(echoActivity); + return echoActivity && await predicate(echoActivity); }); } From c616b33b3033b7c51de422fdf9b4ab29d18ae91e Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 14:04:44 -0700 Subject: [PATCH 21/39] Apply suggestions from code review Co-Authored-By: Corina <14900841+corinagum@users.noreply.github.com> --- __tests__/setup/createDirectLineOptions.js | 2 +- __tests__/setup/jsdomEnvironmentWithProxy.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js index c488962e7..5ad2d17cb 100644 --- a/__tests__/setup/createDirectLineOptions.js +++ b/__tests__/setup/createDirectLineOptions.js @@ -25,7 +25,7 @@ async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { const json = await res.json(); if ('error' in json) { - throw new Error(`Direct Line service responded ${ JSON.stringify(json.error) } while generating new token`); + throw new Error(`Direct Line service responded with ${ JSON.stringify(json.error) } while generating a new token`); } else { return json; } diff --git a/__tests__/setup/jsdomEnvironmentWithProxy.js b/__tests__/setup/jsdomEnvironmentWithProxy.js index 089583861..b03893920 100644 --- a/__tests__/setup/jsdomEnvironmentWithProxy.js +++ b/__tests__/setup/jsdomEnvironmentWithProxy.js @@ -12,7 +12,7 @@ class JSDOMEnvironmentWithProxy extends JSDOMEnvironment { // HACK: We cannot set ResourceLoader thru testEnvironmentOptions.resources. // This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic). - // Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeeded when running without watch. + // Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeed when running without watch. this.global._resourceLoader = resources; return super.setup(); From 9f9488e56dd0dfceb8513837183afa1a5f9b1ca7 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 14:47:57 -0700 Subject: [PATCH 22/39] Rename to createPromiseStack --- .../{createPromiseQueue.js => createPromiseStack.js} | 2 +- __tests__/setup/observableToPromise.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename __tests__/setup/{createPromiseQueue.js => createPromiseStack.js} (90%) diff --git a/__tests__/setup/createPromiseQueue.js b/__tests__/setup/createPromiseStack.js similarity index 90% rename from __tests__/setup/createPromiseQueue.js rename to __tests__/setup/createPromiseStack.js index 7531f1def..abfacd3ed 100644 --- a/__tests__/setup/createPromiseQueue.js +++ b/__tests__/setup/createPromiseStack.js @@ -1,6 +1,6 @@ import createDeferred from 'p-defer'; -export default function createPromiseQueue() { +export default function createPromiseStack() { const deferreds = []; const queue = []; const processOne = () => { diff --git a/__tests__/setup/observableToPromise.js b/__tests__/setup/observableToPromise.js index 6f838c582..6d5a8cffd 100644 --- a/__tests__/setup/observableToPromise.js +++ b/__tests__/setup/observableToPromise.js @@ -1,9 +1,9 @@ -import createPromiseQueue from './createPromiseQueue'; +import createPromiseStack from './createPromiseStack'; export default function observableToPromise(observable) { - let errors = createPromiseQueue(); - let completes = createPromiseQueue(); - let nexts = createPromiseQueue(); + let errors = createPromiseStack(); + let completes = createPromiseStack(); + let nexts = createPromiseStack(); const subscription = observable.subscribe({ complete: completes.push, error: errors.push, From 04cd248bc4b8f600a0dc989e68728d15beecd934 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 14:54:21 -0700 Subject: [PATCH 23/39] Use ConnectionStatus.Online --- __tests__/setup/waitForConnected.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/__tests__/setup/waitForConnected.js b/__tests__/setup/waitForConnected.js index db440e412..5cad6e480 100644 --- a/__tests__/setup/waitForConnected.js +++ b/__tests__/setup/waitForConnected.js @@ -1,9 +1,11 @@ +import { ConnectionStatus } from '../../src/directLine'; + import waitForObservable from './waitForObservable'; export default async function waitForConnected(directLine) { const subscription = directLine.activity$.subscribe(); - await waitForObservable(directLine.connectionStatus$, 2); + await waitForObservable(directLine.connectionStatus$, ConnectionStatus.Online); return subscription.unsubscribe.bind(subscription); } From 4c37f710227c1bf45381ac533a8ed487aa3647bf Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 14:55:38 -0700 Subject: [PATCH 24/39] Typo --- __tests__/setup/createDirectLineOptions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js index 5ad2d17cb..f90212bdc 100644 --- a/__tests__/setup/createDirectLineOptions.js +++ b/__tests__/setup/createDirectLineOptions.js @@ -30,7 +30,7 @@ async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { return json; } } else { - throw new Error(`Direct Line service returned ${ res.status } while generating new token`); + throw new Error(`Direct Line service returned ${ res.status } while generating a new token`); } } From 37c46a218b29368a66ce1237bd32a78bfdc7bb03 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 14:57:41 -0700 Subject: [PATCH 25/39] Rename `sendingActivity` to `activityFromUser` --- __tests__/happy.uploadAttachments.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/__tests__/happy.uploadAttachments.js b/__tests__/happy.uploadAttachments.js index b8660afb9..fb843b3e3 100644 --- a/__tests__/happy.uploadAttachments.js +++ b/__tests__/happy.uploadAttachments.js @@ -55,7 +55,7 @@ describe('Happy path', () => { unsubscribes.push(directLine.end.bind(directLine)); unsubscribes.push(await waitForConnected(directLine)); - const sendingActivity = { + const activityFromUser = { // DirectLine.postActivityWithAttachments support "contentUrl" only but not "content" attachments: [{ contentType: 'image/png', @@ -69,7 +69,7 @@ describe('Happy path', () => { }; await Promise.all([ - postActivity(directLine, sendingActivity), + postActivity(directLine, activityFromUser), waitForBotEcho(directLine, async ({ attachments, text }) => { if (text === 'Hello, World!') { // Bug #194 is causing trouble on the order of attachments sent. @@ -79,8 +79,8 @@ describe('Happy path', () => { const [expecteds, actuals] = await Promise.all([ Promise.all([ - fetchAsBase64(sendingActivity.attachments[0].contentUrl), - fetchAsBase64(sendingActivity.attachments[1].contentUrl) + fetchAsBase64(activityFromUser.attachments[0].contentUrl), + fetchAsBase64(activityFromUser.attachments[1].contentUrl) ]), Promise.all([ fetchAsBase64(attachments[0].contentUrl), @@ -95,8 +95,8 @@ describe('Happy path', () => { // Use the commented code below after bug #194 is fixed. // https://github.com/microsoft/BotFramework-DirectLineJS/issues/194 - // await expect(fetchAsBase64(attachments[0].contentUrl)).resolves.toBe(await fetchAsBase64(sendingActivity.attachments[0].contentUrl)); - // await expect(fetchAsBase64(attachments[1].contentUrl)).resolves.toBe(await fetchAsBase64(sendingActivity.attachments[1].contentUrl)); + // await expect(fetchAsBase64(attachments[0].contentUrl)).resolves.toBe(await fetchAsBase64(activityFromUser.attachments[0].contentUrl)); + // await expect(fetchAsBase64(attachments[1].contentUrl)).resolves.toBe(await fetchAsBase64(activityFromUser.attachments[1].contentUrl)); return true; } From 6e80f46360427b4e8f7b0034487aa46f64b104ac Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 15:05:07 -0700 Subject: [PATCH 26/39] Clean up --- __tests__/setup/createDirectLineOptions.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js index f90212bdc..1a71d5cb1 100644 --- a/__tests__/setup/createDirectLineOptions.js +++ b/__tests__/setup/createDirectLineOptions.js @@ -35,17 +35,17 @@ async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { } export async function forREST({ token } = {}) { - token = token && (await generateDirectLineToken()).token; - return { - ...token ? {} : { secret: DIRECT_LINE_SECRET }, - ...token ? { token } : {}, + ...token ? + { token: (await generateDirectLineToken()).token } + : + { secret: DIRECT_LINE_SECRET }, webSocket: false }; } export async function forStreamingExtensions() { - const { conversationId, token } = (await generateDirectLineToken(STREAMING_EXTENSIONS_DOMAIN)); + const { conversationId, token } = await generateDirectLineToken(STREAMING_EXTENSIONS_DOMAIN); return { conversationId, @@ -57,11 +57,11 @@ export async function forStreamingExtensions() { } export async function forWebSocket({ token } = {}) { - token = token && (await generateDirectLineToken()).token; - return { - ...token ? {} : { secret: DIRECT_LINE_SECRET }, - ...token ? { token } : {}, + ...token ? + { token: (await generateDirectLineToken()).token } + : + { secret: DIRECT_LINE_SECRET }, webSocket: true }; } From 2b88728e1241898b6f96bb61458449f05f1f26d9 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 15:42:31 -0700 Subject: [PATCH 27/39] Use dl_* user ID --- __tests__/setup/createDirectLineOptions.js | 2 +- __tests__/setup/postActivity.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js index 1a71d5cb1..651a97f35 100644 --- a/__tests__/setup/createDirectLineOptions.js +++ b/__tests__/setup/createDirectLineOptions.js @@ -1,7 +1,7 @@ import fetch from 'node-fetch'; const { - DEFAULT_USER_ID = 'u-12345', + DEFAULT_USER_ID = 'dl_12345', DIRECT_LINE_SECRET, // STREAMING_EXTENSIONS_DOMAIN = 'http://localhost:5002/.bot/v3/directline' STREAMING_EXTENSIONS_DOMAIN = 'https://webchat-waterbottle.azurewebsites.net/.bot/v3/directline' diff --git a/__tests__/setup/postActivity.js b/__tests__/setup/postActivity.js index 8587da222..2b20222b6 100644 --- a/__tests__/setup/postActivity.js +++ b/__tests__/setup/postActivity.js @@ -3,7 +3,7 @@ import updateIn from 'simple-update-in'; import waitForActivity from './waitForActivity'; import waitForObservable from './waitForObservable'; -const DEFAULT_USER_ID = 'u-12345'; +const DEFAULT_USER_ID = 'dl_12345'; export default async function postActivity(directLine, activity) { // We need to use channelData.clientActivityId because postActivity could come later than the activity$ observable. From 1e349f2331737124a5b73d6bca99bcf04446b71c Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 15:59:12 -0700 Subject: [PATCH 28/39] Rename back to .babelrc.js because babel-jest --- babel.config.js => .babelrc.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename babel.config.js => .babelrc.js (100%) diff --git a/babel.config.js b/.babelrc.js similarity index 100% rename from babel.config.js rename to .babelrc.js From f94c5c0bfe4fd3420daecbca04f33206619f880f Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 17:32:57 -0700 Subject: [PATCH 29/39] Use dl_* --- __tests__/setup/createUserId.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/setup/createUserId.js b/__tests__/setup/createUserId.js index c601e51bb..5499f1613 100644 --- a/__tests__/setup/createUserId.js +++ b/__tests__/setup/createUserId.js @@ -1,3 +1,3 @@ export default function createUserId() { - return `u-${ Math.random().toString(36).substr(2, 5) }`; + return `dl_${ Math.random().toString(36).substr(2, 5) }`; } From 12ee071af12ad73bc30ee9ccc739db8944ad553b Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 17:33:00 -0700 Subject: [PATCH 30/39] Clean up --- __tests__/setup/createDirectLineOptions.js | 1 - 1 file changed, 1 deletion(-) diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js index 651a97f35..e653dae12 100644 --- a/__tests__/setup/createDirectLineOptions.js +++ b/__tests__/setup/createDirectLineOptions.js @@ -3,7 +3,6 @@ import fetch from 'node-fetch'; const { DEFAULT_USER_ID = 'dl_12345', DIRECT_LINE_SECRET, - // STREAMING_EXTENSIONS_DOMAIN = 'http://localhost:5002/.bot/v3/directline' STREAMING_EXTENSIONS_DOMAIN = 'https://webchat-waterbottle.azurewebsites.net/.bot/v3/directline' } = process.env; From 974c63af800dd468b84bc656e4f17fbb0f5c9df5 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 17:40:12 -0700 Subject: [PATCH 31/39] Reuse waitForActivity --- __tests__/setup/waitForActivity.js | 4 ++-- __tests__/setup/waitForBotEcho.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/__tests__/setup/waitForActivity.js b/__tests__/setup/waitForActivity.js index 5c5f3b85f..fdf2e6796 100644 --- a/__tests__/setup/waitForActivity.js +++ b/__tests__/setup/waitForActivity.js @@ -1,5 +1,5 @@ import waitForObservable from './waitForObservable'; -export default function waitForBotRespond(directLine, predicate) { - return waitForObservable(directLine.activity$, activity => predicate(activity)); +export default async function waitForBotRespond(directLine, predicate) { + return await waitForObservable(directLine.activity$, activity => await predicate(activity)); } diff --git a/__tests__/setup/waitForBotEcho.js b/__tests__/setup/waitForBotEcho.js index 34aa57fe8..f805f1437 100644 --- a/__tests__/setup/waitForBotEcho.js +++ b/__tests__/setup/waitForBotEcho.js @@ -1,8 +1,8 @@ import getEchoActivity from './getEchoActivity'; -import waitForObservable from './waitForObservable'; +import waitForActivity from './waitForActivity'; export default function waitForBotEcho(directLine, predicate) { - return waitForObservable(directLine.activity$, async activity => { + return waitForActivity(directLine, async activity => { const echoActivity = getEchoActivity(activity); return echoActivity && await predicate(echoActivity); From dbe74c8bee9aefceaa3a7a59974fb830033add2e Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 17:45:10 -0700 Subject: [PATCH 32/39] Rename --- __tests__/happy.postActivity.js | 4 ++-- __tests__/happy.uploadAttachments.js | 4 ++-- __tests__/setup/postActivity.js | 4 ++-- __tests__/setup/waitForBotEcho.js | 10 ---------- __tests__/setup/waitForBotToEcho.js | 10 ++++++++++ .../{waitForActivity.js => waitForBotToResponse.js} | 4 ++-- __tests__/unhappy.postActivityFatalAfterConnect.js | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 __tests__/setup/waitForBotEcho.js create mode 100644 __tests__/setup/waitForBotToEcho.js rename __tests__/setup/{waitForActivity.js => waitForBotToResponse.js} (53%) diff --git a/__tests__/happy.postActivity.js b/__tests__/happy.postActivity.js index e0188a47f..656c01138 100644 --- a/__tests__/happy.postActivity.js +++ b/__tests__/happy.postActivity.js @@ -6,7 +6,7 @@ import { DirectLine } from '../src/directLine'; import { timeouts } from './constants.json'; import * as createDirectLineOptions from './setup/createDirectLineOptions'; import postActivity from './setup/postActivity'; -import waitForBotEcho from './setup/waitForBotEcho'; +import waitForBotToEcho from './setup/waitForBotToEcho'; import waitForConnected from './setup/waitForConnected'; describe('Happy path', () => { @@ -56,7 +56,7 @@ describe('Happy path', () => { await Promise.all([ postActivity(directLine, { text: 'Hello, World!', type: 'message' }), - waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') + waitForBotToEcho(directLine, ({ text }) => text === 'Hello, World!') ]); }); }); diff --git a/__tests__/happy.uploadAttachments.js b/__tests__/happy.uploadAttachments.js index fb843b3e3..e28808661 100644 --- a/__tests__/happy.uploadAttachments.js +++ b/__tests__/happy.uploadAttachments.js @@ -7,7 +7,7 @@ import { timeouts } from './constants.json'; import * as createDirectLineOptions from './setup/createDirectLineOptions'; import fetchAsBase64 from './setup/fetchAsBase64'; import postActivity from './setup/postActivity'; -import waitForBotEcho from './setup/waitForBotEcho'; +import waitForBotToEcho from './setup/waitForBotToEcho'; import waitForConnected from './setup/waitForConnected'; describe('Happy path', () => { @@ -70,7 +70,7 @@ describe('Happy path', () => { await Promise.all([ postActivity(directLine, activityFromUser), - waitForBotEcho(directLine, async ({ attachments, text }) => { + waitForBotToEcho(directLine, async ({ attachments, text }) => { if (text === 'Hello, World!') { // Bug #194 is causing trouble on the order of attachments sent. // https://github.com/microsoft/BotFramework-DirectLineJS/issues/194 diff --git a/__tests__/setup/postActivity.js b/__tests__/setup/postActivity.js index 2b20222b6..bd8edb381 100644 --- a/__tests__/setup/postActivity.js +++ b/__tests__/setup/postActivity.js @@ -1,6 +1,6 @@ import updateIn from 'simple-update-in'; -import waitForActivity from './waitForActivity'; +import waitForBotToResponse from './waitForBotToResponse'; import waitForObservable from './waitForObservable'; const DEFAULT_USER_ID = 'dl_12345'; @@ -16,7 +16,7 @@ export default async function postActivity(directLine, activity) { const [activityId] = await Promise.all([ waitForObservable(directLine.postActivity(activity), () => true), - waitForActivity(directLine, ({ channelData: { clientActivityId } = {} }) => clientActivityId === targetClientActivityId) + waitForBotToResponse(directLine, ({ channelData: { clientActivityId } = {} }) => clientActivityId === targetClientActivityId) ]); return activityId; diff --git a/__tests__/setup/waitForBotEcho.js b/__tests__/setup/waitForBotEcho.js deleted file mode 100644 index f805f1437..000000000 --- a/__tests__/setup/waitForBotEcho.js +++ /dev/null @@ -1,10 +0,0 @@ -import getEchoActivity from './getEchoActivity'; -import waitForActivity from './waitForActivity'; - -export default function waitForBotEcho(directLine, predicate) { - return waitForActivity(directLine, async activity => { - const echoActivity = getEchoActivity(activity); - - return echoActivity && await predicate(echoActivity); - }); -} diff --git a/__tests__/setup/waitForBotToEcho.js b/__tests__/setup/waitForBotToEcho.js new file mode 100644 index 000000000..5aa2d46e4 --- /dev/null +++ b/__tests__/setup/waitForBotToEcho.js @@ -0,0 +1,10 @@ +import getEchoActivity from './getEchoActivity'; +import waitForBotToResponse from './waitForBotToResponse'; + +export default function waitForBotToEcho(directLine, predicate) { + return waitForBotToResponse(directLine, async activity => { + const echoActivity = getEchoActivity(activity); + + return echoActivity && await predicate(echoActivity); + }); +} diff --git a/__tests__/setup/waitForActivity.js b/__tests__/setup/waitForBotToResponse.js similarity index 53% rename from __tests__/setup/waitForActivity.js rename to __tests__/setup/waitForBotToResponse.js index fdf2e6796..e0e564012 100644 --- a/__tests__/setup/waitForActivity.js +++ b/__tests__/setup/waitForBotToResponse.js @@ -1,5 +1,5 @@ import waitForObservable from './waitForObservable'; -export default async function waitForBotRespond(directLine, predicate) { - return await waitForObservable(directLine.activity$, activity => await predicate(activity)); +export default async function waitForBotToResponse(directLine, predicate) { + return await waitForObservable(directLine.activity$, activity => predicate(activity)); } diff --git a/__tests__/unhappy.postActivityFatalAfterConnect.js b/__tests__/unhappy.postActivityFatalAfterConnect.js index 3e92b4545..94fc095aa 100644 --- a/__tests__/unhappy.postActivityFatalAfterConnect.js +++ b/__tests__/unhappy.postActivityFatalAfterConnect.js @@ -8,7 +8,7 @@ import { timeouts } from './constants.json'; import * as createDirectLineOptions from './setup/createDirectLineOptions'; import createDirectLineForwarder from './setup/createDirectLineForwarder'; import postActivity from './setup/postActivity'; -import waitForBotEcho from './setup/waitForBotEcho'; +import waitForBotToEcho from './setup/waitForBotToEcho'; import waitForConnected from './setup/waitForConnected'; describe('Unhappy path', () => { @@ -100,7 +100,7 @@ describe('Unhappy path', () => { await Promise.all([ postActivity(directLine, { text: 'Hello, World!', type: 'message' }), - waitForBotEcho(directLine, ({ text }) => text === 'Hello, World!') + waitForBotToEcho(directLine, ({ text }) => text === 'Hello, World!') ]); alwaysReturn404 = true; From 15a01cda8f1fec1696e46294cf474807fb2539b2 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 11 Sep 2019 18:37:32 -0700 Subject: [PATCH 33/39] Skip test using secret if DIRECT_LINE_SECRET is not set --- __tests__/happy.postActivity.js | 13 +-- __tests__/happy.uploadAttachments.js | 13 +-- __tests__/setup/createDirectLine.js | 108 ++++++++++++++++++ __tests__/setup/createDirectLineOptions.js | 66 ----------- .../unhappy.postActivityFatalAfterConnect.js | 25 +--- 5 files changed, 126 insertions(+), 99 deletions(-) create mode 100644 __tests__/setup/createDirectLine.js delete mode 100644 __tests__/setup/createDirectLineOptions.js diff --git a/__tests__/happy.postActivity.js b/__tests__/happy.postActivity.js index 656c01138..953fdcadb 100644 --- a/__tests__/happy.postActivity.js +++ b/__tests__/happy.postActivity.js @@ -2,9 +2,8 @@ import 'dotenv/config'; import onErrorResumeNext from 'on-error-resume-next'; -import { DirectLine } from '../src/directLine'; import { timeouts } from './constants.json'; -import * as createDirectLineOptions from './setup/createDirectLineOptions'; +import * as createDirectLine from './setup/createDirectLine'; import postActivity from './setup/postActivity'; import waitForBotToEcho from './setup/waitForBotToEcho'; import waitForConnected from './setup/waitForConnected'; @@ -22,28 +21,28 @@ describe('Happy path', () => { beforeEach(() => jest.setTimeout(timeouts.rest)); test('with secret', async () => { - directLine = new DirectLine(await createDirectLineOptions.forREST({ token: false })); + directLine = await createDirectLine.forREST({ token: false }); }); test('with token', async () => { - directLine = new DirectLine(await createDirectLineOptions.forREST({ token: true })); + directLine = await createDirectLine.forREST({ token: true }); }); }); // test('using Streaming Extensions', async () => { // jest.setTimeout(timeouts.webSocket); - // directLine = new DirectLine(await createDirectLineOptions.forStreamingExtensions()); + // directLine = await createDirectLine.forStreamingExtensions(); // }); describe('using Web Socket', () => { beforeEach(() => jest.setTimeout(timeouts.webSocket)); test('with secret', async () => { - directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + directLine = await createDirectLine.forWebSocket({ token: false }); }); test('with token', async () => { - directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + directLine = await createDirectLine.forWebSocket({ token: false }); }); }); diff --git a/__tests__/happy.uploadAttachments.js b/__tests__/happy.uploadAttachments.js index e28808661..78ea47c2f 100644 --- a/__tests__/happy.uploadAttachments.js +++ b/__tests__/happy.uploadAttachments.js @@ -2,9 +2,8 @@ import 'dotenv/config'; import onErrorResumeNext from 'on-error-resume-next'; -import { DirectLine } from '../src/directLine'; import { timeouts } from './constants.json'; -import * as createDirectLineOptions from './setup/createDirectLineOptions'; +import * as createDirectLine from './setup/createDirectLine'; import fetchAsBase64 from './setup/fetchAsBase64'; import postActivity from './setup/postActivity'; import waitForBotToEcho from './setup/waitForBotToEcho'; @@ -23,28 +22,28 @@ describe('Happy path', () => { beforeEach(() => jest.setTimeout(timeouts.rest)); test('with secret', async () => { - directLine = new DirectLine(await createDirectLineOptions.forREST({ token: false })); + directLine = await createDirectLine.forREST({ token: false }); }); test('with token', async () => { - directLine = new DirectLine(await createDirectLineOptions.forREST({ token: true })); + directLine = await createDirectLine.forREST({ token: true }); }); }); // test('using Streaming Extensions', async () => { // jest.setTimeout(timeouts.webSocket); - // directLine = new DirectLine(await createDirectLineOptions.forStreamingExtensions()); + // directLine = await createDirectLine.forStreamingExtensions(); // }); describe('using Web Socket', () => { beforeEach(() => jest.setTimeout(timeouts.webSocket)); test('with secret', async () => { - directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + directLine = await createDirectLine.forWebSocket({ token: false }); }); test('with token', async () => { - directLine = new DirectLine(await createDirectLineOptions.forWebSocket({ token: false })); + directLine = await createDirectLine.forWebSocket({ token: false }); }); }); diff --git a/__tests__/setup/createDirectLine.js b/__tests__/setup/createDirectLine.js new file mode 100644 index 000000000..cb5ba5729 --- /dev/null +++ b/__tests__/setup/createDirectLine.js @@ -0,0 +1,108 @@ +import fetch from 'node-fetch'; + +import { DirectLine } from '../../src/directLine'; + +const { + DEFAULT_USER_ID = 'dl_12345', + DIRECT_LINE_SECRET, + STREAMING_EXTENSIONS_DOMAIN = 'https://webchat-waterbottle.azurewebsites.net/.bot/v3/directline' +} = process.env; + +const DEFAULT_DOMAIN = 'https://directline.botframework.com/v3/directline'; + +async function fetchDirectLineToken() { + const res = await fetch('https://webchat-waterbottle.azurewebsites.net/token/directline'); + + if (res.ok) { + return await res.json(); + } else { + throw new Error(`Server returned ${ res.status } while fetching Direct Line token`); + } +} + +async function fetchDirectLineStreamingExtensionsToken() { + const res = await fetch(`${ STREAMING_EXTENSIONS_DOMAIN }/token/directline`); + + if (res.ok) { + return await res.json(); + } else { + throw new Error(`Server returned ${ res.status } while fetching Direct Line token`); + } +} + +async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { + let res; + + res = await fetch(`${ domain }/tokens/generate`, { + body: JSON.stringify({ User: { Id: DEFAULT_USER_ID } }), + headers: { + authorization: `Bearer ${ DIRECT_LINE_SECRET }`, + 'Content-Type': 'application/json' + }, + method: 'POST' + }); + + if (res.status === 200) { + const json = await res.json(); + + if ('error' in json) { + throw new Error(`Direct Line service responded with ${ JSON.stringify(json.error) } while generating a new token`); + } else { + return json; + } + } else { + throw new Error(`Direct Line service returned ${ res.status } while generating a new token`); + } +} + +export async function forREST({ token } = {}, directLineOptions = {}) { + if (token || DIRECT_LINE_SECRET) { + return new DirectLine({ + ...token ? + DIRECT_LINE_SECRET ? + { token: (await generateDirectLineToken()).token } + : + { token: (await fetchDirectLineToken()).token } + : + { secret: DIRECT_LINE_SECRET }, + webSocket: false, + ...directLineOptions + }); + } else { + console.warn('Tests using secret are skipped because DIRECT_LINE_SECRET environment variable is not defined.'); + } +} + +export async function forStreamingExtensions(directLineOptions = {}) { + const { conversationId, token } = DIRECT_LINE_SECRET ? + await generateDirectLineToken(STREAMING_EXTENSIONS_DOMAIN) + : + await fetchDirectLineStreamingExtensionsToken(); + + return new DirectLine({ + conversationId, + domain: STREAMING_EXTENSIONS_DOMAIN, + streamingWebSocket: true, + token, + webSocket: true, + ...directLineOptions + }); +} + +export async function forWebSocket({ token } = {}, directLineOptions = {}) { + if (token || DIRECT_LINE_SECRET) { + return new DirectLine({ + ...token ? + DIRECT_LINE_SECRET ? + { token: (await generateDirectLineToken()).token } + : + { token: (await fetchDirectLineToken()).token } + : + { secret: DIRECT_LINE_SECRET }, + webSocket: true, + ...directLineOptions + }); + } else { + console.warn('Tests using secret are skipped because DIRECT_LINE_SECRET environment variable is not defined.'); + } +} diff --git a/__tests__/setup/createDirectLineOptions.js b/__tests__/setup/createDirectLineOptions.js deleted file mode 100644 index e653dae12..000000000 --- a/__tests__/setup/createDirectLineOptions.js +++ /dev/null @@ -1,66 +0,0 @@ -import fetch from 'node-fetch'; - -const { - DEFAULT_USER_ID = 'dl_12345', - DIRECT_LINE_SECRET, - STREAMING_EXTENSIONS_DOMAIN = 'https://webchat-waterbottle.azurewebsites.net/.bot/v3/directline' -} = process.env; - -const DEFAULT_DOMAIN = 'https://directline.botframework.com/v3/directline'; - -async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { - let res; - - res = await fetch(`${ domain }/tokens/generate`, { - body: JSON.stringify({ User: { Id: DEFAULT_USER_ID } }), - headers: { - authorization: `Bearer ${ DIRECT_LINE_SECRET }`, - 'Content-Type': 'application/json' - }, - method: 'POST' - }); - - if (res.status === 200) { - const json = await res.json(); - - if ('error' in json) { - throw new Error(`Direct Line service responded with ${ JSON.stringify(json.error) } while generating a new token`); - } else { - return json; - } - } else { - throw new Error(`Direct Line service returned ${ res.status } while generating a new token`); - } -} - -export async function forREST({ token } = {}) { - return { - ...token ? - { token: (await generateDirectLineToken()).token } - : - { secret: DIRECT_LINE_SECRET }, - webSocket: false - }; -} - -export async function forStreamingExtensions() { - const { conversationId, token } = await generateDirectLineToken(STREAMING_EXTENSIONS_DOMAIN); - - return { - conversationId, - domain: STREAMING_EXTENSIONS_DOMAIN, - streamingWebSocket: true, - token, - webSocket: true - }; -} - -export async function forWebSocket({ token } = {}) { - return { - ...token ? - { token: (await generateDirectLineToken()).token } - : - { secret: DIRECT_LINE_SECRET }, - webSocket: true - }; -} diff --git a/__tests__/unhappy.postActivityFatalAfterConnect.js b/__tests__/unhappy.postActivityFatalAfterConnect.js index 94fc095aa..6898dac11 100644 --- a/__tests__/unhappy.postActivityFatalAfterConnect.js +++ b/__tests__/unhappy.postActivityFatalAfterConnect.js @@ -3,9 +3,8 @@ import 'dotenv/config'; import getPort from 'get-port'; import onErrorResumeNext from 'on-error-resume-next'; -import { DirectLine } from '../src/directLine'; import { timeouts } from './constants.json'; -import * as createDirectLineOptions from './setup/createDirectLineOptions'; +import * as createDirectLine from './setup/createDirectLine'; import createDirectLineForwarder from './setup/createDirectLineForwarder'; import postActivity from './setup/postActivity'; import waitForBotToEcho from './setup/waitForBotToEcho'; @@ -31,40 +30,28 @@ describe('Unhappy path', () => { beforeEach(() => jest.setTimeout(timeouts.rest)); test('with secret', async () => { - directLine = new DirectLine({ - ...await createDirectLineOptions.forREST({ token: false }), - domain: proxyDomain - }); + directLine = await createDirectLine.forREST({ token: false }, { domain: proxyDomain }); }); test('with token', async () => { - directLine = new DirectLine({ - ...await createDirectLineOptions.forREST({ token: true }), - domain: proxyDomain - }); + directLine = await createDirectLine.forREST({ token: true }, { domain: proxyDomain }); }); }); // test('using Streaming Extensions', async () => { // jest.setTimeout(timeouts.webSocket); - // directLine = new DirectLine(await createDirectLineOptions.forStreamingExtensions()); + // directLine = await createDirectLine.forStreamingExtensions(); // }); describe('using Web Socket', () => { beforeEach(() => jest.setTimeout(timeouts.webSocket)); test('with secret', async () => { - directLine = new DirectLine({ - ...await createDirectLineOptions.forWebSocket({ token: false }), - domain: proxyDomain - }); + directLine = await createDirectLine.forWebSocket({ token: false }, { domain: proxyDomain }); }); test('with token', async () => { - directLine = new DirectLine({ - ...await createDirectLineOptions.forWebSocket({ token: false }), - domain: proxyDomain - }); + directLine = await createDirectLine.forWebSocket({ token: false }, { domain: proxyDomain }); }); }); From 4abe413a524cd8481cfb856911cef7d7d9b0d955 Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 12 Sep 2019 10:42:34 -0700 Subject: [PATCH 34/39] Apply PR review changes --- __tests__/constants.json | 1 + __tests__/setup/createDirectLine.js | 56 ++++++++----------- __tests__/setup/postActivity.js | 6 +- __tests__/setup/waitForBotToEcho.js | 4 +- ...otToResponse.js => waitForBotToRespond.js} | 2 +- 5 files changed, 31 insertions(+), 38 deletions(-) rename __tests__/setup/{waitForBotToResponse.js => waitForBotToRespond.js} (65%) diff --git a/__tests__/constants.json b/__tests__/constants.json index 02cdb8bd5..677c984eb 100644 --- a/__tests__/constants.json +++ b/__tests__/constants.json @@ -1,4 +1,5 @@ { + "userId": "dl_12345", "timeouts": { "default": 5000, "rest": 10000, diff --git a/__tests__/setup/createDirectLine.js b/__tests__/setup/createDirectLine.js index cb5ba5729..392bad203 100644 --- a/__tests__/setup/createDirectLine.js +++ b/__tests__/setup/createDirectLine.js @@ -1,9 +1,9 @@ import fetch from 'node-fetch'; import { DirectLine } from '../../src/directLine'; +import { userId as DEFAULT_USER_ID } from '../constants.json'; const { - DEFAULT_USER_ID = 'dl_12345', DIRECT_LINE_SECRET, STREAMING_EXTENSIONS_DOMAIN = 'https://webchat-waterbottle.azurewebsites.net/.bot/v3/directline' } = process.env; @@ -55,25 +55,25 @@ async function generateDirectLineToken(domain = DEFAULT_DOMAIN) { } } -export async function forREST({ token } = {}, directLineOptions = {}) { - if (token || DIRECT_LINE_SECRET) { - return new DirectLine({ - ...token ? - DIRECT_LINE_SECRET ? - { token: (await generateDirectLineToken()).token } - : - { token: (await fetchDirectLineToken()).token } - : - { secret: DIRECT_LINE_SECRET }, - webSocket: false, - ...directLineOptions - }); +export async function forREST({ token } = {}, mergeOptions = {}) { + let options = { webSocket: false }; + + if (token && DIRECT_LINE_SECRET) { + options = { ...options, token: (await generateDirectLineToken()).token }; + } else if (token) { + // Probably via PR validation on Travis, or run by a contributing developer. + // We still want to let the developer to test majority of stuff without deploying their own bot server. + options = { token: (await fetchDirectLineToken()).token }; + } else if (DIRECT_LINE_SECRET) { + options = { secret: DIRECT_LINE_SECRET }; } else { console.warn('Tests using secret are skipped because DIRECT_LINE_SECRET environment variable is not defined.'); } + + return new DirectLine({ ...options, ...mergeOptions }); } -export async function forStreamingExtensions(directLineOptions = {}) { +export async function forStreamingExtensions(mergeOptions = {}) { const { conversationId, token } = DIRECT_LINE_SECRET ? await generateDirectLineToken(STREAMING_EXTENSIONS_DOMAIN) : @@ -85,24 +85,16 @@ export async function forStreamingExtensions(directLineOptions = {}) { streamingWebSocket: true, token, webSocket: true, - ...directLineOptions + ...mergeOptions }); } -export async function forWebSocket({ token } = {}, directLineOptions = {}) { - if (token || DIRECT_LINE_SECRET) { - return new DirectLine({ - ...token ? - DIRECT_LINE_SECRET ? - { token: (await generateDirectLineToken()).token } - : - { token: (await fetchDirectLineToken()).token } - : - { secret: DIRECT_LINE_SECRET }, - webSocket: true, - ...directLineOptions - }); - } else { - console.warn('Tests using secret are skipped because DIRECT_LINE_SECRET environment variable is not defined.'); - } +export async function forWebSocket({ token } = {}, mergeOptions = {}) { + return await forREST( + { token }, + { + webSocket: false, + ...mergeOptions + } + ); } diff --git a/__tests__/setup/postActivity.js b/__tests__/setup/postActivity.js index bd8edb381..5bcdcc53e 100644 --- a/__tests__/setup/postActivity.js +++ b/__tests__/setup/postActivity.js @@ -1,9 +1,9 @@ import updateIn from 'simple-update-in'; -import waitForBotToResponse from './waitForBotToResponse'; +import waitForBotToRespond from './waitForBotToRespond'; import waitForObservable from './waitForObservable'; -const DEFAULT_USER_ID = 'dl_12345'; +import { userId as DEFAULT_USER_ID } from '../constants.json'; export default async function postActivity(directLine, activity) { // We need to use channelData.clientActivityId because postActivity could come later than the activity$ observable. @@ -16,7 +16,7 @@ export default async function postActivity(directLine, activity) { const [activityId] = await Promise.all([ waitForObservable(directLine.postActivity(activity), () => true), - waitForBotToResponse(directLine, ({ channelData: { clientActivityId } = {} }) => clientActivityId === targetClientActivityId) + waitForBotToRespond(directLine, ({ channelData: { clientActivityId } = {} }) => clientActivityId === targetClientActivityId) ]); return activityId; diff --git a/__tests__/setup/waitForBotToEcho.js b/__tests__/setup/waitForBotToEcho.js index 5aa2d46e4..fbdcb3d41 100644 --- a/__tests__/setup/waitForBotToEcho.js +++ b/__tests__/setup/waitForBotToEcho.js @@ -1,8 +1,8 @@ import getEchoActivity from './getEchoActivity'; -import waitForBotToResponse from './waitForBotToResponse'; +import waitForBotToRespond from './waitForBotToRespond'; export default function waitForBotToEcho(directLine, predicate) { - return waitForBotToResponse(directLine, async activity => { + return waitForBotToRespond(directLine, async activity => { const echoActivity = getEchoActivity(activity); return echoActivity && await predicate(echoActivity); diff --git a/__tests__/setup/waitForBotToResponse.js b/__tests__/setup/waitForBotToRespond.js similarity index 65% rename from __tests__/setup/waitForBotToResponse.js rename to __tests__/setup/waitForBotToRespond.js index e0e564012..632c60db8 100644 --- a/__tests__/setup/waitForBotToResponse.js +++ b/__tests__/setup/waitForBotToRespond.js @@ -1,5 +1,5 @@ import waitForObservable from './waitForObservable'; -export default async function waitForBotToResponse(directLine, predicate) { +export default async function waitForBotToRespond(directLine, predicate) { return await waitForObservable(directLine.activity$, activity => predicate(activity)); } From a37dafa5e40483e63a604fa970f13de59290dd78 Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 12 Sep 2019 10:53:09 -0700 Subject: [PATCH 35/39] Fix tests --- __tests__/setup/createDirectLine.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/__tests__/setup/createDirectLine.js b/__tests__/setup/createDirectLine.js index 392bad203..320015012 100644 --- a/__tests__/setup/createDirectLine.js +++ b/__tests__/setup/createDirectLine.js @@ -63,9 +63,9 @@ export async function forREST({ token } = {}, mergeOptions = {}) { } else if (token) { // Probably via PR validation on Travis, or run by a contributing developer. // We still want to let the developer to test majority of stuff without deploying their own bot server. - options = { token: (await fetchDirectLineToken()).token }; + options = { ...options, token: (await fetchDirectLineToken()).token }; } else if (DIRECT_LINE_SECRET) { - options = { secret: DIRECT_LINE_SECRET }; + options = { ...options, secret: DIRECT_LINE_SECRET }; } else { console.warn('Tests using secret are skipped because DIRECT_LINE_SECRET environment variable is not defined.'); } @@ -93,7 +93,7 @@ export async function forWebSocket({ token } = {}, mergeOptions = {}) { return await forREST( { token }, { - webSocket: false, + webSocket: true, ...mergeOptions } ); From 7d9f5d05cce7ab42ae1ac169f8808f63627d88a8 Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 12 Sep 2019 10:57:39 -0700 Subject: [PATCH 36/39] Fix tests --- __tests__/setup/createDirectLine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/setup/createDirectLine.js b/__tests__/setup/createDirectLine.js index 320015012..8202eeef9 100644 --- a/__tests__/setup/createDirectLine.js +++ b/__tests__/setup/createDirectLine.js @@ -67,7 +67,7 @@ export async function forREST({ token } = {}, mergeOptions = {}) { } else if (DIRECT_LINE_SECRET) { options = { ...options, secret: DIRECT_LINE_SECRET }; } else { - console.warn('Tests using secret are skipped because DIRECT_LINE_SECRET environment variable is not defined.'); + return console.warn('Tests using secret are skipped because DIRECT_LINE_SECRET environment variable is not defined.'); } return new DirectLine({ ...options, ...mergeOptions }); From 6507ae603c08610ca7af6531e652710368a3f55a Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 12 Sep 2019 11:35:53 -0700 Subject: [PATCH 37/39] Apply PR changes --- __tests__/setup/createPromiseStack.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/__tests__/setup/createPromiseStack.js b/__tests__/setup/createPromiseStack.js index abfacd3ed..5542b2119 100644 --- a/__tests__/setup/createPromiseStack.js +++ b/__tests__/setup/createPromiseStack.js @@ -1,24 +1,21 @@ -import createDeferred from 'p-defer'; - export default function createPromiseStack() { - const deferreds = []; - const queue = []; - const processOne = () => { - deferreds.length && queue.length && deferreds.shift().resolve(queue.shift()); + const resolves = []; + const stack = []; + const trigger = () => { + resolves.length && stack.length && resolves.shift()(stack.shift()); }; return { pop() { - const deferred = createDeferred(); + const promise = new Promise(resolve => resolves.push(resolve)); - deferreds.push(deferred); - processOne(); + trigger(); - return deferred.promise; + return promise; }, push(value) { - queue.push(value); - processOne(); + stack.push(value); + trigger(); } }; } From 948587550c83b0e6d46fff216a2f030c7b61b2a8 Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 12 Sep 2019 13:09:16 -0700 Subject: [PATCH 38/39] Stack -> queue and using a single queue --- ...ePromiseStack.js => createPromiseQueue.js} | 16 ++++++------ __tests__/setup/observableToPromise.js | 25 +++++++++++-------- __tests__/setup/waitForObservable.js | 12 +++------ 3 files changed, 25 insertions(+), 28 deletions(-) rename __tests__/setup/{createPromiseStack.js => createPromiseQueue.js} (60%) diff --git a/__tests__/setup/createPromiseStack.js b/__tests__/setup/createPromiseQueue.js similarity index 60% rename from __tests__/setup/createPromiseStack.js rename to __tests__/setup/createPromiseQueue.js index 5542b2119..f129d6da3 100644 --- a/__tests__/setup/createPromiseStack.js +++ b/__tests__/setup/createPromiseQueue.js @@ -1,21 +1,19 @@ -export default function createPromiseStack() { +export default function createPromiseQueue() { const resolves = []; const stack = []; - const trigger = () => { - resolves.length && stack.length && resolves.shift()(stack.shift()); - }; + const trigger = () => resolves.length && stack.length && resolves.shift()(stack.shift()); return { - pop() { + push(value) { + stack.push(value); + trigger(); + }, + shift() { const promise = new Promise(resolve => resolves.push(resolve)); trigger(); return promise; - }, - push(value) { - stack.push(value); - trigger(); } }; } diff --git a/__tests__/setup/observableToPromise.js b/__tests__/setup/observableToPromise.js index 6d5a8cffd..503d011f6 100644 --- a/__tests__/setup/observableToPromise.js +++ b/__tests__/setup/observableToPromise.js @@ -1,19 +1,24 @@ -import createPromiseStack from './createPromiseStack'; +import createPromiseQueue from './createPromiseQueue'; export default function observableToPromise(observable) { - let errors = createPromiseStack(); - let completes = createPromiseStack(); - let nexts = createPromiseStack(); + let queue = createPromiseQueue(); + const subscription = observable.subscribe({ - complete: completes.push, - error: errors.push, - next: nexts.push + complete() { + queue.push({ complete: {} }); + subscription.unsubscribe(); + }, + error(error) { + queue.push({ error }); + subscription.unsubscribe(); + }, + next(next) { + queue.push({ next }); + } }); return { - complete: () => completes.pop(), - error: () => errors.pop(), - next: () => nexts.pop(), + shift: queue.shift.bind(queue), unsubscribe: subscription.unsubscribe.bind(subscription) }; } diff --git a/__tests__/setup/waitForObservable.js b/__tests__/setup/waitForObservable.js index cb7adfaf4..863bc6c0a 100644 --- a/__tests__/setup/waitForObservable.js +++ b/__tests__/setup/waitForObservable.js @@ -1,17 +1,11 @@ -import promiseRaceMap from 'promise-race-map'; - import observableToPromise from './observableToPromise'; export default async function waitForObservable(observable, target) { - const observer = observableToPromise(observable); + const { shift, unsubscribe } = observableToPromise(observable); try { for (;;) { - const { complete, error, next } = await promiseRaceMap({ - complete: observer.complete(), - error: observer.error(), - next: observer.next() - }); + const { complete, error, next } = await shift(); if (complete) { return; @@ -22,6 +16,6 @@ export default async function waitForObservable(observable, target) { } } } finally { - observer.unsubscribe(); + unsubscribe(); } } From e10ba2db88289e89598b5c55f4a0b858ab02ccef Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 12 Sep 2019 13:11:53 -0700 Subject: [PATCH 39/39] Remove promise-race-map --- CHANGELOG.md | 1 - package-lock.json | 9 --------- package.json | 1 - 3 files changed, 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d6b1ca25..0451b4136 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,7 +54,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [`jsdom@14.1.0`](https://npmjs.com/package/jsdom) - [`node-fetch@2.6.0`](https://npmjs.com/package/node-fetch) - [`on-error-resume-next@1.1.0`](https://npmjs.com/package/on-error-resume-next) - - [`promise-race-map@1.0.0`](https://npmjs.com/package/promise-race-map) - [`restify@8.4.0`](https://npmjs.com/package/restify) - [`rimraf@3.0.0`](https://npmjs.com/package/rimraf) - [`simple-update-in@2.1.1`](https://npmjs.com/package/simple-update-in) diff --git a/package-lock.json b/package-lock.json index 1db643028..7cbadefd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8162,15 +8162,6 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "promise-race-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-race-map/-/promise-race-map-1.0.0.tgz", - "integrity": "sha512-RYwgnSyjerbzP4sGuPHAuGq0/85zjkvpA2gwfl8gqoiyxWceIfxRY+Nk98NHSqjjsFCDtzo7iY3UhckE7LGJdQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.5" - } - }, "prompts": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", diff --git a/package.json b/package.json index 4ef4629cb..69ed10ffc 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "jsdom": "^14.1.0", "node-fetch": "^2.6.0", "on-error-resume-next": "^1.1.0", - "promise-race-map": "^1.0.0", "restify": "^8.4.0", "rimraf": "^3.0.0", "simple-update-in": "^2.1.1",