var PathLoader = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./index.js": /*!******************!*\ !*** ./index.js ***! \******************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * The MIT License (MIT) * * Copyright (c) 2015 Jeremy Whitlock * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var supportedLoaders = { file: __webpack_require__(/*! ./lib/loaders/file */ "./lib/loaders/file-browser.js"), http: __webpack_require__(/*! ./lib/loaders/http */ "./lib/loaders/http.js"), https: __webpack_require__(/*! ./lib/loaders/http */ "./lib/loaders/http.js") }; var defaultLoader = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' || typeof importScripts === 'function' ? supportedLoaders.http : supportedLoaders.file; // Load promises polyfill if necessary /* istanbul ignore if */ if (typeof Promise === 'undefined') { __webpack_require__(/*! native-promise-only */ "./node_modules/native-promise-only/lib/npo.src.js"); } function getScheme(location) { if (typeof location !== 'undefined') { location = location.indexOf('://') === -1 ? '' : location.split('://')[0]; } return location; } /** * Utility that provides a single API for loading the content of a path/URL. * * @module path-loader */ function getLoader(location) { var scheme = getScheme(location); var loader = supportedLoaders[scheme]; if (typeof loader === 'undefined') { if (scheme === '') { loader = defaultLoader; } else { throw new Error('Unsupported scheme: ' + scheme); } } return loader; } /** * Loads a document at the provided location and returns a JavaScript object representation. * * @param {string} location - The location to the document * @param {module:path-loader.LoadOptions} [options] - The loader options * * @returns {Promise<*>} Always returns a promise even if there is a callback provided * * @example * // Example using Promises * * PathLoader * .load('./package.json') * .then(JSON.parse) * .then(function (document) { * console.log(document.name + ' (' + document.version + '): ' + document.description); * }, function (err) { * console.error(err.stack); * }); * * @example * // Example using options.prepareRequest to provide authentication details for a remotely secure URL * * PathLoader * .load('https://api.github.com/repos/whitlockjc/path-loader', { * prepareRequest: function (req, callback) { * req.auth('my-username', 'my-password'); * callback(undefined, req); * } * }) * .then(JSON.parse) * .then(function (document) { * console.log(document.full_name + ': ' + document.description); * }, function (err) { * console.error(err.stack); * }); * * @example * // Example loading a YAML file * * PathLoader * .load('/Users/not-you/projects/path-loader/.travis.yml') * .then(YAML.safeLoad) * .then(function (document) { * console.log('path-loader uses the', document.language, 'language.'); * }, function (err) { * console.error(err.stack); * }); * * @example * // Example loading a YAML file with options.processContent (Useful if you need information in the raw response) * * PathLoader * .load('/Users/not-you/projects/path-loader/.travis.yml', { * processContent: function (res, callback) { * callback(YAML.safeLoad(res.text)); * } * }) * .then(function (document) { * console.log('path-loader uses the', document.language, 'language.'); * }, function (err) { * console.error(err.stack); * }); */ module.exports.load = function (location, options) { var allTasks = Promise.resolve(); // Default options to empty object if (typeof options === 'undefined') { options = {}; } // Validate arguments allTasks = allTasks.then(function () { if (typeof location === 'undefined') { throw new TypeError('location is required'); } else if (typeof location !== 'string') { throw new TypeError('location must be a string'); } if (typeof options !== 'undefined') { if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') { throw new TypeError('options must be an object'); } else if (typeof options.processContent !== 'undefined' && typeof options.processContent !== 'function') { throw new TypeError('options.processContent must be a function'); } } }); // Load the document from the provided location and process it allTasks = allTasks.then(function () { return new Promise(function (resolve, reject) { var loader = getLoader(location); loader.load(location, options || {}, function (err, document) { if (err) { reject(err); } else { resolve(document); } }); }); }).then(function (res) { if (options.processContent) { return new Promise(function (resolve, reject) { // For consistency between file and http, always send an object with a 'text' property containing the raw // string value being processed. if ((typeof res === 'undefined' ? 'undefined' : _typeof(res)) !== 'object') { res = { text: res }; } // Pass the path being loaded res.location = location; options.processContent(res, function (err, processed) { if (err) { reject(err); } else { resolve(processed); } }); }); } else { // If there was no content processor, we will assume that for all objects that it is a Superagent response // and will return its `text` property value. Otherwise, we will return the raw response. return (typeof res === 'undefined' ? 'undefined' : _typeof(res)) === 'object' ? res.text : res; } }); return allTasks; }; /***/ }), /***/ "./lib/loaders/file-browser.js": /*!*************************************!*\ !*** ./lib/loaders/file-browser.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * The MIT License (MIT) * * Copyright (c) 2015 Jeremy Whitlock * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var unsupportedError = new TypeError('The \'file\' scheme is not supported in the browser'); /** * The file loader is not supported in the browser. * * @throws {error} the file loader is not supported in the browser */ module.exports.getBase = function () { throw unsupportedError; }; /** * The file loader is not supported in the browser. */ module.exports.load = function () { var fn = arguments[arguments.length - 1]; if (typeof fn === 'function') { fn(unsupportedError); } else { throw unsupportedError; } }; /***/ }), /***/ "./lib/loaders/http.js": /*!*****************************!*\ !*** ./lib/loaders/http.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(process) {/* eslint-env node, browser */ /* * The MIT License (MIT) * * Copyright (c) 2015 Jeremy Whitlock * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ var request = __webpack_require__(/*! superagent */ "./node_modules/superagent/lib/client.js"); var supportedHttpMethods = ['delete', 'get', 'head', 'patch', 'post', 'put']; /** * Loads a file from an http or https URL. * * @param {string} location - The document URL (If relative, location is relative to window.location.origin). * @param {object} options - The loader options * @param {string} [options.method=get] - The HTTP method to use for the request * @param {module:PathLoader~PrepareRequestCallback} [options.prepareRequest] - The callback used to prepare a request * @param {module:PathLoader~ProcessResponseCallback} [options.processContent] - The callback used to process the * response * @param {function} callback - The error-first callback */ module.exports.load = function (location, options, callback) { var realMethod = options.method ? options.method.toLowerCase() : 'get'; var err; var realRequest; function makeRequest(err, req) { if (err) { callback(err); } else { // buffer() is only available in Node.js if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]' && typeof req.buffer === 'function') { req.buffer(true); } req.end(function (err2, res) { if (err2) { callback(err2); } else { callback(undefined, res); } }); } } if (typeof options.method !== 'undefined') { if (typeof options.method !== 'string') { err = new TypeError('options.method must be a string'); } else if (supportedHttpMethods.indexOf(options.method) === -1) { err = new TypeError('options.method must be one of the following: ' + supportedHttpMethods.slice(0, supportedHttpMethods.length - 1).join(', ') + ' or ' + supportedHttpMethods[supportedHttpMethods.length - 1]); } } else if (typeof options.prepareRequest !== 'undefined' && typeof options.prepareRequest !== 'function') { err = new TypeError('options.prepareRequest must be a function'); } if (!err) { realRequest = request[realMethod === 'delete' ? 'del' : realMethod](location); if (options.prepareRequest) { try { options.prepareRequest(realRequest, makeRequest); } catch (err2) { callback(err2); } } else { makeRequest(undefined, realRequest); } } else { callback(err); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/process/browser.js */ "./node_modules/process/browser.js"))) /***/ }), /***/ "./node_modules/call-bind/callBound.js": /*!*********************************************!*\ !*** ./node_modules/call-bind/callBound.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); var callBind = __webpack_require__(/*! ./ */ "./node_modules/call-bind/index.js"); var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); module.exports = function callBoundIntrinsic(name, allowMissing) { var intrinsic = GetIntrinsic(name, !!allowMissing); if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { return callBind(intrinsic); } return intrinsic; }; /***/ }), /***/ "./node_modules/call-bind/index.js": /*!*****************************************!*\ !*** ./node_modules/call-bind/index.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var bind = __webpack_require__(/*! function-bind */ "./node_modules/function-bind/index.js"); var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); var $apply = GetIntrinsic('%Function.prototype.apply%'); var $call = GetIntrinsic('%Function.prototype.call%'); var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true); var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); var $max = GetIntrinsic('%Math.max%'); if ($defineProperty) { try { $defineProperty({}, 'a', { value: 1 }); } catch (e) { // IE 8 has a broken defineProperty $defineProperty = null; } } module.exports = function callBind(originalFunction) { var func = $reflectApply(bind, $call, arguments); if ($gOPD && $defineProperty) { var desc = $gOPD(func, 'length'); if (desc.configurable) { // original length, plus the receiver, minus any additional arguments (after the receiver) $defineProperty(func, 'length', { value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }); } } return func; }; var applyBind = function applyBind() { return $reflectApply(bind, $apply, arguments); }; if ($defineProperty) { $defineProperty(module.exports, 'apply', { value: applyBind }); } else { module.exports.apply = applyBind; } /***/ }), /***/ "./node_modules/component-emitter/index.js": /*!*************************************************!*\ !*** ./node_modules/component-emitter/index.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * Expose `Emitter`. */ if (true) { module.exports = Emitter; } /** * Initialize a new `Emitter`. * * @api public */ function Emitter(obj) { if (obj) return mixin(obj); }; /** * Mixin the emitter properties. * * @param {Object} obj * @return {Object} * @api private */ function mixin(obj) { for (var key in Emitter.prototype) { obj[key] = Emitter.prototype[key]; } return obj; } /** * Listen on the given `event` with `fn`. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.on = Emitter.prototype.addEventListener = function (event, fn) { this._callbacks = this._callbacks || {}; (this._callbacks['$' + event] = this._callbacks['$' + event] || []).push(fn); return this; }; /** * Adds an `event` listener that will be invoked a single * time then automatically removed. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.once = function (event, fn) { function on() { this.off(event, on); fn.apply(this, arguments); } on.fn = fn; this.on(event, on); return this; }; /** * Remove the given callback for `event` or all * registered callbacks. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function (event, fn) { this._callbacks = this._callbacks || {}; // all if (0 == arguments.length) { this._callbacks = {}; return this; } // specific event var callbacks = this._callbacks['$' + event]; if (!callbacks) return this; // remove all handlers if (1 == arguments.length) { delete this._callbacks['$' + event]; return this; } // remove specific handler var cb; for (var i = 0; i < callbacks.length; i++) { cb = callbacks[i]; if (cb === fn || cb.fn === fn) { callbacks.splice(i, 1); break; } } // Remove event specific arrays for event types that no // one is subscribed for to avoid memory leak. if (callbacks.length === 0) { delete this._callbacks['$' + event]; } return this; }; /** * Emit `event` with the given args. * * @param {String} event * @param {Mixed} ... * @return {Emitter} */ Emitter.prototype.emit = function (event) { this._callbacks = this._callbacks || {}; var args = new Array(arguments.length - 1), callbacks = this._callbacks['$' + event]; for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } if (callbacks) { callbacks = callbacks.slice(0); for (var i = 0, len = callbacks.length; i < len; ++i) { callbacks[i].apply(this, args); } } return this; }; /** * Return array of callbacks for `event`. * * @param {String} event * @return {Array} * @api public */ Emitter.prototype.listeners = function (event) { this._callbacks = this._callbacks || {}; return this._callbacks['$' + event] || []; }; /** * Check if this emitter has `event` handlers. * * @param {String} event * @return {Boolean} * @api public */ Emitter.prototype.hasListeners = function (event) { return !!this.listeners(event).length; }; /***/ }), /***/ "./node_modules/fast-safe-stringify/index.js": /*!***************************************************!*\ !*** ./node_modules/fast-safe-stringify/index.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; module.exports = stringify; stringify.default = stringify; stringify.stable = deterministicStringify; stringify.stableStringify = deterministicStringify; var LIMIT_REPLACE_NODE = '[...]'; var CIRCULAR_REPLACE_NODE = '[Circular]'; var arr = []; var replacerStack = []; function defaultOptions() { return { depthLimit: Number.MAX_SAFE_INTEGER, edgesLimit: Number.MAX_SAFE_INTEGER }; } // Regular stringify function stringify(obj, replacer, spacer, options) { if (typeof options === 'undefined') { options = defaultOptions(); } decirc(obj, '', 0, [], undefined, 0, options); var res; try { if (replacerStack.length === 0) { res = JSON.stringify(obj, replacer, spacer); } else { res = JSON.stringify(obj, replaceGetterValues(replacer), spacer); } } catch (_) { return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]'); } finally { while (arr.length !== 0) { var part = arr.pop(); if (part.length === 4) { Object.defineProperty(part[0], part[1], part[3]); } else { part[0][part[1]] = part[2]; } } } return res; } function setReplace(replace, val, k, parent) { var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k); if (propertyDescriptor.get !== undefined) { if (propertyDescriptor.configurable) { Object.defineProperty(parent, k, { value: replace }); arr.push([parent, k, val, propertyDescriptor]); } else { replacerStack.push([val, k, replace]); } } else { parent[k] = replace; arr.push([parent, k, val]); } } function decirc(val, k, edgeIndex, stack, parent, depth, options) { depth += 1; var i; if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' && val !== null) { for (i = 0; i < stack.length; i++) { if (stack[i] === val) { setReplace(CIRCULAR_REPLACE_NODE, val, k, parent); return; } } if (typeof options.depthLimit !== 'undefined' && depth > options.depthLimit) { setReplace(LIMIT_REPLACE_NODE, val, k, parent); return; } if (typeof options.edgesLimit !== 'undefined' && edgeIndex + 1 > options.edgesLimit) { setReplace(LIMIT_REPLACE_NODE, val, k, parent); return; } stack.push(val); // Optimize for Arrays. Big arrays could kill the performance otherwise! if (Array.isArray(val)) { for (i = 0; i < val.length; i++) { decirc(val[i], i, i, stack, val, depth, options); } } else { var keys = Object.keys(val); for (i = 0; i < keys.length; i++) { var key = keys[i]; decirc(val[key], key, i, stack, val, depth, options); } } stack.pop(); } } // Stable-stringify function compareFunction(a, b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; } function deterministicStringify(obj, replacer, spacer, options) { if (typeof options === 'undefined') { options = defaultOptions(); } var tmp = deterministicDecirc(obj, '', 0, [], undefined, 0, options) || obj; var res; try { if (replacerStack.length === 0) { res = JSON.stringify(tmp, replacer, spacer); } else { res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer); } } catch (_) { return JSON.stringify('[unable to serialize, circular reference is too complex to analyze]'); } finally { // Ensure that we restore the object as it was. while (arr.length !== 0) { var part = arr.pop(); if (part.length === 4) { Object.defineProperty(part[0], part[1], part[3]); } else { part[0][part[1]] = part[2]; } } } return res; } function deterministicDecirc(val, k, edgeIndex, stack, parent, depth, options) { depth += 1; var i; if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' && val !== null) { for (i = 0; i < stack.length; i++) { if (stack[i] === val) { setReplace(CIRCULAR_REPLACE_NODE, val, k, parent); return; } } try { if (typeof val.toJSON === 'function') { return; } } catch (_) { return; } if (typeof options.depthLimit !== 'undefined' && depth > options.depthLimit) { setReplace(LIMIT_REPLACE_NODE, val, k, parent); return; } if (typeof options.edgesLimit !== 'undefined' && edgeIndex + 1 > options.edgesLimit) { setReplace(LIMIT_REPLACE_NODE, val, k, parent); return; } stack.push(val); // Optimize for Arrays. Big arrays could kill the performance otherwise! if (Array.isArray(val)) { for (i = 0; i < val.length; i++) { deterministicDecirc(val[i], i, i, stack, val, depth, options); } } else { // Create a temporary object in the required way var tmp = {}; var keys = Object.keys(val).sort(compareFunction); for (i = 0; i < keys.length; i++) { var key = keys[i]; deterministicDecirc(val[key], key, i, stack, val, depth, options); tmp[key] = val[key]; } if (typeof parent !== 'undefined') { arr.push([parent, k, val]); parent[k] = tmp; } else { return tmp; } } stack.pop(); } } // wraps replacer function to handle values we couldn't replace // and mark them as replaced value function replaceGetterValues(replacer) { replacer = typeof replacer !== 'undefined' ? replacer : function (k, v) { return v; }; return function (key, val) { if (replacerStack.length > 0) { for (var i = 0; i < replacerStack.length; i++) { var part = replacerStack[i]; if (part[1] === key && part[0] === val) { val = part[2]; replacerStack.splice(i, 1); break; } } } return replacer.call(this, key, val); }; } /***/ }), /***/ "./node_modules/function-bind/implementation.js": /*!******************************************************!*\ !*** ./node_modules/function-bind/implementation.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint no-invalid-this: 1 */ var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; var slice = Array.prototype.slice; var toStr = Object.prototype.toString; var funcType = '[object Function]'; module.exports = function bind(that) { var target = this; if (typeof target !== 'function' || toStr.call(target) !== funcType) { throw new TypeError(ERROR_MESSAGE + target); } var args = slice.call(arguments, 1); var bound; var binder = function binder() { if (this instanceof bound) { var result = target.apply(this, args.concat(slice.call(arguments))); if (Object(result) === result) { return result; } return this; } else { return target.apply(that, args.concat(slice.call(arguments))); } }; var boundLength = Math.max(0, target.length - args.length); var boundArgs = []; for (var i = 0; i < boundLength; i++) { boundArgs.push('$' + i); } bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); if (target.prototype) { var Empty = function Empty() {}; Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; /***/ }), /***/ "./node_modules/function-bind/index.js": /*!*********************************************!*\ !*** ./node_modules/function-bind/index.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var implementation = __webpack_require__(/*! ./implementation */ "./node_modules/function-bind/implementation.js"); module.exports = Function.prototype.bind || implementation; /***/ }), /***/ "./node_modules/get-intrinsic/index.js": /*!*********************************************!*\ !*** ./node_modules/get-intrinsic/index.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var undefined; var $SyntaxError = SyntaxError; var $Function = Function; var $TypeError = TypeError; // eslint-disable-next-line consistent-return var getEvalledConstructor = function getEvalledConstructor(expressionSyntax) { try { return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); } catch (e) {} }; var $gOPD = Object.getOwnPropertyDescriptor; if ($gOPD) { try { $gOPD({}, ''); } catch (e) { $gOPD = null; // this is IE 8, which has a broken gOPD } } var throwTypeError = function throwTypeError() { throw new $TypeError(); }; var ThrowTypeError = $gOPD ? function () { try { // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties arguments.callee; // IE 8 does not throw here return throwTypeError; } catch (calleeThrows) { try { // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') return $gOPD(arguments, 'callee').get; } catch (gOPDthrows) { return throwTypeError; } } }() : throwTypeError; var hasSymbols = __webpack_require__(/*! has-symbols */ "./node_modules/has-symbols/index.js")(); var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto var needsEval = {}; var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array); var INTRINSICS = { '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, '%Array%': Array, '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, '%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined, '%AsyncFromSyncIteratorPrototype%': undefined, '%AsyncFunction%': needsEval, '%AsyncGenerator%': needsEval, '%AsyncGeneratorFunction%': needsEval, '%AsyncIteratorPrototype%': needsEval, '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, '%Boolean%': Boolean, '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, '%Date%': Date, '%decodeURI%': decodeURI, '%decodeURIComponent%': decodeURIComponent, '%encodeURI%': encodeURI, '%encodeURIComponent%': encodeURIComponent, '%Error%': Error, '%eval%': eval, // eslint-disable-line no-eval '%EvalError%': EvalError, '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, '%Function%': $Function, '%GeneratorFunction%': needsEval, '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, '%isFinite%': isFinite, '%isNaN%': isNaN, '%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined, '%JSON%': (typeof JSON === 'undefined' ? 'undefined' : _typeof(JSON)) === 'object' ? JSON : undefined, '%Map%': typeof Map === 'undefined' ? undefined : Map, '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()), '%Math%': Math, '%Number%': Number, '%Object%': Object, '%parseFloat%': parseFloat, '%parseInt%': parseInt, '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, '%RangeError%': RangeError, '%ReferenceError%': ReferenceError, '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, '%RegExp%': RegExp, '%Set%': typeof Set === 'undefined' ? undefined : Set, '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()), '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, '%String%': String, '%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined, '%Symbol%': hasSymbols ? Symbol : undefined, '%SyntaxError%': $SyntaxError, '%ThrowTypeError%': ThrowTypeError, '%TypedArray%': TypedArray, '%TypeError%': $TypeError, '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, '%URIError%': URIError, '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet }; var doEval = function doEval(name) { var value; if (name === '%AsyncFunction%') { value = getEvalledConstructor('async function () {}'); } else if (name === '%GeneratorFunction%') { value = getEvalledConstructor('function* () {}'); } else if (name === '%AsyncGeneratorFunction%') { value = getEvalledConstructor('async function* () {}'); } else if (name === '%AsyncGenerator%') { var fn = doEval('%AsyncGeneratorFunction%'); if (fn) { value = fn.prototype; } } else if (name === '%AsyncIteratorPrototype%') { var gen = doEval('%AsyncGenerator%'); if (gen) { value = getProto(gen.prototype); } } INTRINSICS[name] = value; return value; }; var LEGACY_ALIASES = { '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], '%ArrayPrototype%': ['Array', 'prototype'], '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], '%ArrayProto_values%': ['Array', 'prototype', 'values'], '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], '%BooleanPrototype%': ['Boolean', 'prototype'], '%DataViewPrototype%': ['DataView', 'prototype'], '%DatePrototype%': ['Date', 'prototype'], '%ErrorPrototype%': ['Error', 'prototype'], '%EvalErrorPrototype%': ['EvalError', 'prototype'], '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], '%FunctionPrototype%': ['Function', 'prototype'], '%Generator%': ['GeneratorFunction', 'prototype'], '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], '%JSONParse%': ['JSON', 'parse'], '%JSONStringify%': ['JSON', 'stringify'], '%MapPrototype%': ['Map', 'prototype'], '%NumberPrototype%': ['Number', 'prototype'], '%ObjectPrototype%': ['Object', 'prototype'], '%ObjProto_toString%': ['Object', 'prototype', 'toString'], '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], '%PromisePrototype%': ['Promise', 'prototype'], '%PromiseProto_then%': ['Promise', 'prototype', 'then'], '%Promise_all%': ['Promise', 'all'], '%Promise_reject%': ['Promise', 'reject'], '%Promise_resolve%': ['Promise', 'resolve'], '%RangeErrorPrototype%': ['RangeError', 'prototype'], '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], '%RegExpPrototype%': ['RegExp', 'prototype'], '%SetPrototype%': ['Set', 'prototype'], '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], '%StringPrototype%': ['String', 'prototype'], '%SymbolPrototype%': ['Symbol', 'prototype'], '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], '%TypedArrayPrototype%': ['TypedArray', 'prototype'], '%TypeErrorPrototype%': ['TypeError', 'prototype'], '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], '%URIErrorPrototype%': ['URIError', 'prototype'], '%WeakMapPrototype%': ['WeakMap', 'prototype'], '%WeakSetPrototype%': ['WeakSet', 'prototype'] }; var bind = __webpack_require__(/*! function-bind */ "./node_modules/function-bind/index.js"); var hasOwn = __webpack_require__(/*! has */ "./node_modules/has/src/index.js"); var $concat = bind.call(Function.call, Array.prototype.concat); var $spliceApply = bind.call(Function.apply, Array.prototype.splice); var $replace = bind.call(Function.call, String.prototype.replace); var $strSlice = bind.call(Function.call, String.prototype.slice); var $exec = bind.call(Function.call, RegExp.prototype.exec); /* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ var stringToPath = function stringToPath(string) { var first = $strSlice(string, 0, 1); var last = $strSlice(string, -1); if (first === '%' && last !== '%') { throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); } else if (last === '%' && first !== '%') { throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); } var result = []; $replace(string, rePropName, function (match, number, quote, subString) { result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; }); return result; }; /* end adaptation */ var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { var intrinsicName = name; var alias; if (hasOwn(LEGACY_ALIASES, intrinsicName)) { alias = LEGACY_ALIASES[intrinsicName]; intrinsicName = '%' + alias[0] + '%'; } if (hasOwn(INTRINSICS, intrinsicName)) { var value = INTRINSICS[intrinsicName]; if (value === needsEval) { value = doEval(intrinsicName); } if (typeof value === 'undefined' && !allowMissing) { throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); } return { alias: alias, name: intrinsicName, value: value }; } throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); }; module.exports = function GetIntrinsic(name, allowMissing) { if (typeof name !== 'string' || name.length === 0) { throw new $TypeError('intrinsic name must be a non-empty string'); } if (arguments.length > 1 && typeof allowMissing !== 'boolean') { throw new $TypeError('"allowMissing" argument must be a boolean'); } if ($exec(/^%?[^%]*%?$/g, name) === null) { throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name'); } var parts = stringToPath(name); var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); var intrinsicRealName = intrinsic.name; var value = intrinsic.value; var skipFurtherCaching = false; var alias = intrinsic.alias; if (alias) { intrinsicBaseName = alias[0]; $spliceApply(parts, $concat([0, 1], alias)); } for (var i = 1, isOwn = true; i < parts.length; i += 1) { var part = parts[i]; var first = $strSlice(part, 0, 1); var last = $strSlice(part, -1); if ((first === '"' || first === "'" || first === '`' || last === '"' || last === "'" || last === '`') && first !== last) { throw new $SyntaxError('property names with quotes must have matching quotes'); } if (part === 'constructor' || !isOwn) { skipFurtherCaching = true; } intrinsicBaseName += '.' + part; intrinsicRealName = '%' + intrinsicBaseName + '%'; if (hasOwn(INTRINSICS, intrinsicRealName)) { value = INTRINSICS[intrinsicRealName]; } else if (value != null) { if (!(part in value)) { if (!allowMissing) { throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); } return void undefined; } if ($gOPD && i + 1 >= parts.length) { var desc = $gOPD(value, part); isOwn = !!desc; // By convention, when a data property is converted to an accessor // property to emulate a data property that does not suffer from // the override mistake, that accessor's getter is marked with // an `originalValue` property. Here, when we detect this, we // uphold the illusion by pretending to see that original data // property, i.e., returning the value rather than the getter // itself. if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { value = desc.get; } else { value = value[part]; } } else { isOwn = hasOwn(value, part); value = value[part]; } if (isOwn && !skipFurtherCaching) { INTRINSICS[intrinsicRealName] = value; } } } return value; }; /***/ }), /***/ "./node_modules/has-symbols/index.js": /*!*******************************************!*\ !*** ./node_modules/has-symbols/index.js ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var origSymbol = typeof Symbol !== 'undefined' && Symbol; var hasSymbolSham = __webpack_require__(/*! ./shams */ "./node_modules/has-symbols/shams.js"); module.exports = function hasNativeSymbols() { if (typeof origSymbol !== 'function') { return false; } if (typeof Symbol !== 'function') { return false; } if (_typeof(origSymbol('foo')) !== 'symbol') { return false; } if (_typeof(Symbol('bar')) !== 'symbol') { return false; } return hasSymbolSham(); }; /***/ }), /***/ "./node_modules/has-symbols/shams.js": /*!*******************************************!*\ !*** ./node_modules/has-symbols/shams.js ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint complexity: [2, 18], max-statements: [2, 33] */ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; module.exports = function hasSymbols() { if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } if (_typeof(Symbol.iterator) === 'symbol') { return true; } var obj = {}; var sym = Symbol('test'); var symObj = Object(sym); if (typeof sym === 'string') { return false; } if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } // temp disabled per https://github.com/ljharb/object.assign/issues/17 // if (sym instanceof Symbol) { return false; } // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 // if (!(symObj instanceof Symbol)) { return false; } // if (typeof Symbol.prototype.toString !== 'function') { return false; } // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } var symVal = 42; obj[sym] = symVal; for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } var syms = Object.getOwnPropertySymbols(obj); if (syms.length !== 1 || syms[0] !== sym) { return false; } if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } if (typeof Object.getOwnPropertyDescriptor === 'function') { var descriptor = Object.getOwnPropertyDescriptor(obj, sym); if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } } return true; }; /***/ }), /***/ "./node_modules/has/src/index.js": /*!***************************************!*\ !*** ./node_modules/has/src/index.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var bind = __webpack_require__(/*! function-bind */ "./node_modules/function-bind/index.js"); module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); /***/ }), /***/ "./node_modules/native-promise-only/lib/npo.src.js": /*!*********************************************************!*\ !*** ./node_modules/native-promise-only/lib/npo.src.js ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global, setImmediate) {var __WEBPACK_AMD_DEFINE_RESULT__; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /*! Native Promise Only v0.8.1 (c) Kyle Simpson MIT License: http://getify.mit-license.org */ (function UMD(name, context, definition) { // special form of UMD for polyfilling across evironments context[name] = context[name] || definition(); if ( true && module.exports) { module.exports = context[name]; } else if (true) { !(__WEBPACK_AMD_DEFINE_RESULT__ = (function $AMD$() { return context[name]; }).call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } })("Promise", typeof global != "undefined" ? global : undefined, function DEF() { /*jshint validthis:true */ "use strict"; var builtInProp, cycle, scheduling_queue, ToString = Object.prototype.toString, timer = typeof setImmediate != "undefined" ? function timer(fn) { return setImmediate(fn); } : setTimeout; // dammit, IE8. try { Object.defineProperty({}, "x", {}); builtInProp = function builtInProp(obj, name, val, config) { return Object.defineProperty(obj, name, { value: val, writable: true, configurable: config !== false }); }; } catch (err) { builtInProp = function builtInProp(obj, name, val) { obj[name] = val; return obj; }; } // Note: using a queue instead of array for efficiency scheduling_queue = function Queue() { var first, last, item; function Item(fn, self) { this.fn = fn; this.self = self; this.next = void 0; } return { add: function add(fn, self) { item = new Item(fn, self); if (last) { last.next = item; } else { first = item; } last = item; item = void 0; }, drain: function drain() { var f = first; first = last = cycle = void 0; while (f) { f.fn.call(f.self); f = f.next; } } }; }(); function schedule(fn, self) { scheduling_queue.add(fn, self); if (!cycle) { cycle = timer(scheduling_queue.drain); } } // promise duck typing function isThenable(o) { var _then, o_type = typeof o === "undefined" ? "undefined" : _typeof(o); if (o != null && (o_type == "object" || o_type == "function")) { _then = o.then; } return typeof _then == "function" ? _then : false; } function notify() { for (var i = 0; i < this.chain.length; i++) { notifyIsolated(this, this.state === 1 ? this.chain[i].success : this.chain[i].failure, this.chain[i]); } this.chain.length = 0; } // NOTE: This is a separate function to isolate // the `try..catch` so that other code can be // optimized better function notifyIsolated(self, cb, chain) { var ret, _then; try { if (cb === false) { chain.reject(self.msg); } else { if (cb === true) { ret = self.msg; } else { ret = cb.call(void 0, self.msg); } if (ret === chain.promise) { chain.reject(TypeError("Promise-chain cycle")); } else if (_then = isThenable(ret)) { _then.call(ret, chain.resolve, chain.reject); } else { chain.resolve(ret); } } } catch (err) { chain.reject(err); } } function resolve(msg) { var _then, self = this; // already triggered? if (self.triggered) { return; } self.triggered = true; // unwrap if (self.def) { self = self.def; } try { if (_then = isThenable(msg)) { schedule(function () { var def_wrapper = new MakeDefWrapper(self); try { _then.call(msg, function $resolve$() { resolve.apply(def_wrapper, arguments); }, function $reject$() { reject.apply(def_wrapper, arguments); }); } catch (err) { reject.call(def_wrapper, err); } }); } else { self.msg = msg; self.state = 1; if (self.chain.length > 0) { schedule(notify, self); } } } catch (err) { reject.call(new MakeDefWrapper(self), err); } } function reject(msg) { var self = this; // already triggered? if (self.triggered) { return; } self.triggered = true; // unwrap if (self.def) { self = self.def; } self.msg = msg; self.state = 2; if (self.chain.length > 0) { schedule(notify, self); } } function iteratePromises(Constructor, arr, resolver, rejecter) { for (var idx = 0; idx < arr.length; idx++) { (function IIFE(idx) { Constructor.resolve(arr[idx]).then(function $resolver$(msg) { resolver(idx, msg); }, rejecter); })(idx); } } function MakeDefWrapper(self) { this.def = self; this.triggered = false; } function MakeDef(self) { this.promise = self; this.state = 0; this.triggered = false; this.chain = []; this.msg = void 0; } function Promise(executor) { if (typeof executor != "function") { throw TypeError("Not a function"); } if (this.__NPO__ !== 0) { throw TypeError("Not a promise"); } // instance shadowing the inherited "brand" // to signal an already "initialized" promise this.__NPO__ = 1; var def = new MakeDef(this); this["then"] = function then(success, failure) { var o = { success: typeof success == "function" ? success : true, failure: typeof failure == "function" ? failure : false }; // Note: `then(..)` itself can be borrowed to be used against // a different promise constructor for making the chained promise, // by substituting a different `this` binding. o.promise = new this.constructor(function extractChain(resolve, reject) { if (typeof resolve != "function" || typeof reject != "function") { throw TypeError("Not a function"); } o.resolve = resolve; o.reject = reject; }); def.chain.push(o); if (def.state !== 0) { schedule(notify, def); } return o.promise; }; this["catch"] = function $catch$(failure) { return this.then(void 0, failure); }; try { executor.call(void 0, function publicResolve(msg) { resolve.call(def, msg); }, function publicReject(msg) { reject.call(def, msg); }); } catch (err) { reject.call(def, err); } } var PromisePrototype = builtInProp({}, "constructor", Promise, /*configurable=*/false); // Note: Android 4 cannot use `Object.defineProperty(..)` here Promise.prototype = PromisePrototype; // built-in "brand" to signal an "uninitialized" promise builtInProp(PromisePrototype, "__NPO__", 0, /*configurable=*/false); builtInProp(Promise, "resolve", function Promise$resolve(msg) { var Constructor = this; // spec mandated checks // note: best "isPromise" check that's practical for now if (msg && (typeof msg === "undefined" ? "undefined" : _typeof(msg)) == "object" && msg.__NPO__ === 1) { return msg; } return new Constructor(function executor(resolve, reject) { if (typeof resolve != "function" || typeof reject != "function") { throw TypeError("Not a function"); } resolve(msg); }); }); builtInProp(Promise, "reject", function Promise$reject(msg) { return new this(function executor(resolve, reject) { if (typeof resolve != "function" || typeof reject != "function") { throw TypeError("Not a function"); } reject(msg); }); }); builtInProp(Promise, "all", function Promise$all(arr) { var Constructor = this; // spec mandated checks if (ToString.call(arr) != "[object Array]") { return Constructor.reject(TypeError("Not an array")); } if (arr.length === 0) { return Constructor.resolve([]); } return new Constructor(function executor(resolve, reject) { if (typeof resolve != "function" || typeof reject != "function") { throw TypeError("Not a function"); } var len = arr.length, msgs = Array(len), count = 0; iteratePromises(Constructor, arr, function resolver(idx, msg) { msgs[idx] = msg; if (++count === len) { resolve(msgs); } }, reject); }); }); builtInProp(Promise, "race", function Promise$race(arr) { var Constructor = this; // spec mandated checks if (ToString.call(arr) != "[object Array]") { return Constructor.reject(TypeError("Not an array")); } return new Constructor(function executor(resolve, reject) { if (typeof resolve != "function" || typeof reject != "function") { throw TypeError("Not a function"); } iteratePromises(Constructor, arr, function resolver(idx, msg) { resolve(msg); }, reject); }); }); return Promise; }); /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate)) /***/ }), /***/ "./node_modules/object-inspect/index.js": /*!**********************************************!*\ !*** ./node_modules/object-inspect/index.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var hasMap = typeof Map === 'function' && Map.prototype; var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; var mapForEach = hasMap && Map.prototype.forEach; var hasSet = typeof Set === 'function' && Set.prototype; var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; var setForEach = hasSet && Set.prototype.forEach; var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; var booleanValueOf = Boolean.prototype.valueOf; var objectToString = Object.prototype.toString; var functionToString = Function.prototype.toString; var $match = String.prototype.match; var $slice = String.prototype.slice; var $replace = String.prototype.replace; var $toUpperCase = String.prototype.toUpperCase; var $toLowerCase = String.prototype.toLowerCase; var $test = RegExp.prototype.test; var $concat = Array.prototype.concat; var $join = Array.prototype.join; var $arrSlice = Array.prototype.slice; var $floor = Math.floor; var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; var gOPS = Object.getOwnPropertySymbols; var symToString = typeof Symbol === 'function' && _typeof(Symbol.iterator) === 'symbol' ? Symbol.prototype.toString : null; var hasShammedSymbols = typeof Symbol === 'function' && _typeof(Symbol.iterator) === 'object'; // ie, `has-tostringtag/shams var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (_typeof(Symbol.toStringTag) === hasShammedSymbols ? 'object' : 'symbol') ? Symbol.toStringTag : null; var isEnumerable = Object.prototype.propertyIsEnumerable; var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ([].__proto__ === Array.prototype // eslint-disable-line no-proto ? function (O) { return O.__proto__; // eslint-disable-line no-proto } : null); function addNumericSeparator(num, str) { if (num === Infinity || num === -Infinity || num !== num || num && num > -1000 && num < 1000 || $test.call(/e/, str)) { return str; } var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; if (typeof num === 'number') { var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) if (int !== num) { var intStr = String(int); var dec = $slice.call(str, intStr.length + 1); return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); } } return $replace.call(str, sepRegex, '$&_'); } var utilInspect = __webpack_require__(/*! ./util.inspect */ 0); var inspectCustom = utilInspect.custom; var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; module.exports = function inspect_(obj, options, depth, seen) { var opts = options || {}; if (has(opts, 'quoteStyle') && opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double') { throw new TypeError('option "quoteStyle" must be "single" or "double"'); } if (has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity : opts.maxStringLength !== null)) { throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); } var customInspect = has(opts, 'customInspect') ? opts.customInspect : true; if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); } if (has(opts, 'indent') && opts.indent !== null && opts.indent !== '\t' && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)) { throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); } if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); } var numericSeparator = opts.numericSeparator; if (typeof obj === 'undefined') { return 'undefined'; } if (obj === null) { return 'null'; } if (typeof obj === 'boolean') { return obj ? 'true' : 'false'; } if (typeof obj === 'string') { return inspectString(obj, opts); } if (typeof obj === 'number') { if (obj === 0) { return Infinity / obj > 0 ? '0' : '-0'; } var str = String(obj); return numericSeparator ? addNumericSeparator(obj, str) : str; } if (typeof obj === 'bigint') { var bigIntStr = String(obj) + 'n'; return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; } var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; if (typeof depth === 'undefined') { depth = 0; } if (depth >= maxDepth && maxDepth > 0 && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') { return isArray(obj) ? '[Array]' : '[Object]'; } var indent = getIndent(opts, depth); if (typeof seen === 'undefined') { seen = []; } else if (indexOf(seen, obj) >= 0) { return '[Circular]'; } function inspect(value, from, noIndent) { if (from) { seen = $arrSlice.call(seen); seen.push(from); } if (noIndent) { var newOpts = { depth: opts.depth }; if (has(opts, 'quoteStyle')) { newOpts.quoteStyle = opts.quoteStyle; } return inspect_(value, newOpts, depth + 1, seen); } return inspect_(value, opts, depth + 1, seen); } if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable var name = nameOf(obj); var keys = arrObjKeys(obj, inspect); return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); } if (isSymbol(obj)) { var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); return (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; } if (isElement(obj)) { var s = '<' + $toLowerCase.call(String(obj.nodeName)); var attrs = obj.attributes || []; for (var i = 0; i < attrs.length; i++) { s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); } s += '>'; if (obj.childNodes && obj.childNodes.length) { s += '...'; } s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>'; return s; } if (isArray(obj)) { if (obj.length === 0) { return '[]'; } var xs = arrObjKeys(obj, inspect); if (indent && !singleLineValues(xs)) { return '[' + indentedJoin(xs, indent) + ']'; } return '[ ' + $join.call(xs, ', ') + ' ]'; } if (isError(obj)) { var parts = arrObjKeys(obj, inspect); if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) { return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; } if (parts.length === 0) { return '[' + String(obj) + ']'; } return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; } if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && customInspect) { if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) { return utilInspect(obj, { depth: maxDepth - depth }); } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { return obj.inspect(); } } if (isMap(obj)) { var mapParts = []; mapForEach.call(obj, function (value, key) { mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); }); return collectionOf('Map', mapSize.call(obj), mapParts, indent); } if (isSet(obj)) { var setParts = []; setForEach.call(obj, function (value) { setParts.push(inspect(value, obj)); }); return collectionOf('Set', setSize.call(obj), setParts, indent); } if (isWeakMap(obj)) { return weakCollectionOf('WeakMap'); } if (isWeakSet(obj)) { return weakCollectionOf('WeakSet'); } if (isWeakRef(obj)) { return weakCollectionOf('WeakRef'); } if (isNumber(obj)) { return markBoxed(inspect(Number(obj))); } if (isBigInt(obj)) { return markBoxed(inspect(bigIntValueOf.call(obj))); } if (isBoolean(obj)) { return markBoxed(booleanValueOf.call(obj)); } if (isString(obj)) { return markBoxed(inspect(String(obj))); } if (!isDate(obj) && !isRegExp(obj)) { var ys = arrObjKeys(obj, inspect); var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; var protoTag = obj instanceof Object ? '' : 'null prototype'; var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); if (ys.length === 0) { return tag + '{}'; } if (indent) { return tag + '{' + indentedJoin(ys, indent) + '}'; } return tag + '{ ' + $join.call(ys, ', ') + ' }'; } return String(obj); }; function wrapQuotes(s, defaultStyle, opts) { var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; return quoteChar + s + quoteChar; } function quote(s) { return $replace.call(String(s), /"/g, '"'); } function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && toStringTag in obj)); } function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && toStringTag in obj)); } function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && toStringTag in obj)); } function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && toStringTag in obj)); } function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && toStringTag in obj)); } function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && toStringTag in obj)); } function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && toStringTag in obj)); } // Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives function isSymbol(obj) { if (hasShammedSymbols) { return obj && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj instanceof Symbol; } if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'symbol') { return true; } if (!obj || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || !symToString) { return false; } try { symToString.call(obj); return true; } catch (e) {} return false; } function isBigInt(obj) { if (!obj || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || !bigIntValueOf) { return false; } try { bigIntValueOf.call(obj); return true; } catch (e) {} return false; } var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; function has(obj, key) { return hasOwn.call(obj, key); } function toStr(obj) { return objectToString.call(obj); } function nameOf(f) { if (f.name) { return f.name; } var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); if (m) { return m[1]; } return null; } function indexOf(xs, x) { if (xs.indexOf) { return xs.indexOf(x); } for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) { return i; } } return -1; } function isMap(x) { if (!mapSize || !x || (typeof x === 'undefined' ? 'undefined' : _typeof(x)) !== 'object') { return false; } try { mapSize.call(x); try { setSize.call(x); } catch (s) { return true; } return x instanceof Map; // core-js workaround, pre-v2.5.0 } catch (e) {} return false; } function isWeakMap(x) { if (!weakMapHas || !x || (typeof x === 'undefined' ? 'undefined' : _typeof(x)) !== 'object') { return false; } try { weakMapHas.call(x, weakMapHas); try { weakSetHas.call(x, weakSetHas); } catch (s) { return true; } return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 } catch (e) {} return false; } function isWeakRef(x) { if (!weakRefDeref || !x || (typeof x === 'undefined' ? 'undefined' : _typeof(x)) !== 'object') { return false; } try { weakRefDeref.call(x); return true; } catch (e) {} return false; } function isSet(x) { if (!setSize || !x || (typeof x === 'undefined' ? 'undefined' : _typeof(x)) !== 'object') { return false; } try { setSize.call(x); try { mapSize.call(x); } catch (m) { return true; } return x instanceof Set; // core-js workaround, pre-v2.5.0 } catch (e) {} return false; } function isWeakSet(x) { if (!weakSetHas || !x || (typeof x === 'undefined' ? 'undefined' : _typeof(x)) !== 'object') { return false; } try { weakSetHas.call(x, weakSetHas); try { weakMapHas.call(x, weakMapHas); } catch (s) { return true; } return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 } catch (e) {} return false; } function isElement(x) { if (!x || (typeof x === 'undefined' ? 'undefined' : _typeof(x)) !== 'object') { return false; } if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { return true; } return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; } function inspectString(str, opts) { if (str.length > opts.maxStringLength) { var remaining = str.length - opts.maxStringLength; var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; } // eslint-disable-next-line no-control-regex var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); return wrapQuotes(s, 'single', opts); } function lowbyte(c) { var n = c.charCodeAt(0); var x = { 8: 'b', 9: 't', 10: 'n', 12: 'f', 13: 'r' }[n]; if (x) { return '\\' + x; } return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); } function markBoxed(str) { return 'Object(' + str + ')'; } function weakCollectionOf(type) { return type + ' { ? }'; } function collectionOf(type, size, entries, indent) { var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); return type + ' (' + size + ') {' + joinedEntries + '}'; } function singleLineValues(xs) { for (var i = 0; i < xs.length; i++) { if (indexOf(xs[i], '\n') >= 0) { return false; } } return true; } function getIndent(opts, depth) { var baseIndent; if (opts.indent === '\t') { baseIndent = '\t'; } else if (typeof opts.indent === 'number' && opts.indent > 0) { baseIndent = $join.call(Array(opts.indent + 1), ' '); } else { return null; } return { base: baseIndent, prev: $join.call(Array(depth + 1), baseIndent) }; } function indentedJoin(xs, indent) { if (xs.length === 0) { return ''; } var lineJoiner = '\n' + indent.prev + indent.base; return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; } function arrObjKeys(obj, inspect) { var isArr = isArray(obj); var xs = []; if (isArr) { xs.length = obj.length; for (var i = 0; i < obj.length; i++) { xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; } } var syms = typeof gOPS === 'function' ? gOPS(obj) : []; var symMap; if (hasShammedSymbols) { symMap = {}; for (var k = 0; k < syms.length; k++) { symMap['$' + syms[k]] = syms[k]; } } for (var key in obj) { // eslint-disable-line no-restricted-syntax if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section continue; // eslint-disable-line no-restricted-syntax, no-continue } else if ($test.call(/[^\w$]/, key)) { xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); } else { xs.push(key + ': ' + inspect(obj[key], obj)); } } if (typeof gOPS === 'function') { for (var j = 0; j < syms.length; j++) { if (isEnumerable.call(obj, syms[j])) { xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); } } } return xs; } /***/ }), /***/ "./node_modules/process/browser.js": /*!*****************************************!*\ !*** ./node_modules/process/browser.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout() { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } })(); function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch (e) { try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch (e) { // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e) { try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e) { // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while (len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return []; }; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/'; }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function () { return 0; }; /***/ }), /***/ "./node_modules/qs/lib/formats.js": /*!****************************************!*\ !*** ./node_modules/qs/lib/formats.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var replace = String.prototype.replace; var percentTwenties = /%20/g; var Format = { RFC1738: 'RFC1738', RFC3986: 'RFC3986' }; module.exports = { 'default': Format.RFC3986, formatters: { RFC1738: function RFC1738(value) { return replace.call(value, percentTwenties, '+'); }, RFC3986: function RFC3986(value) { return String(value); } }, RFC1738: Format.RFC1738, RFC3986: Format.RFC3986 }; /***/ }), /***/ "./node_modules/qs/lib/index.js": /*!**************************************!*\ !*** ./node_modules/qs/lib/index.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var stringify = __webpack_require__(/*! ./stringify */ "./node_modules/qs/lib/stringify.js"); var parse = __webpack_require__(/*! ./parse */ "./node_modules/qs/lib/parse.js"); var formats = __webpack_require__(/*! ./formats */ "./node_modules/qs/lib/formats.js"); module.exports = { formats: formats, parse: parse, stringify: stringify }; /***/ }), /***/ "./node_modules/qs/lib/parse.js": /*!**************************************!*\ !*** ./node_modules/qs/lib/parse.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = __webpack_require__(/*! ./utils */ "./node_modules/qs/lib/utils.js"); var has = Object.prototype.hasOwnProperty; var isArray = Array.isArray; var defaults = { allowDots: false, allowPrototypes: false, allowSparse: false, arrayLimit: 20, charset: 'utf-8', charsetSentinel: false, comma: false, decoder: utils.decode, delimiter: '&', depth: 5, ignoreQueryPrefix: false, interpretNumericEntities: false, parameterLimit: 1000, parseArrays: true, plainObjects: false, strictNullHandling: false }; var interpretNumericEntities = function interpretNumericEntities(str) { return str.replace(/&#(\d+);/g, function ($0, numberStr) { return String.fromCharCode(parseInt(numberStr, 10)); }); }; var parseArrayValue = function parseArrayValue(val, options) { if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { return val.split(','); } return val; }; // This is what browsers will submit when the ✓ character occurs in an // application/x-www-form-urlencoded body and the encoding of the page containing // the form is iso-8859-1, or when the submitted form has an accept-charset // attribute of iso-8859-1. Presumably also with other charsets that do not contain // the ✓ character, such as us-ascii. var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') // These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') var parseValues = function parseQueryStringValues(str, options) { var obj = {}; var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; var parts = cleanStr.split(options.delimiter, limit); var skipIndex = -1; // Keep track of where the utf8 sentinel was found var i; var charset = options.charset; if (options.charsetSentinel) { for (i = 0; i < parts.length; ++i) { if (parts[i].indexOf('utf8=') === 0) { if (parts[i] === charsetSentinel) { charset = 'utf-8'; } else if (parts[i] === isoSentinel) { charset = 'iso-8859-1'; } skipIndex = i; i = parts.length; // The eslint settings do not allow break; } } } for (i = 0; i < parts.length; ++i) { if (i === skipIndex) { continue; } var part = parts[i]; var bracketEqualsPos = part.indexOf(']='); var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; var key, val; if (pos === -1) { key = options.decoder(part, defaults.decoder, charset, 'key'); val = options.strictNullHandling ? null : ''; } else { key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); val = utils.maybeMap(parseArrayValue(part.slice(pos + 1), options), function (encodedVal) { return options.decoder(encodedVal, defaults.decoder, charset, 'value'); }); } if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { val = interpretNumericEntities(val); } if (part.indexOf('[]=') > -1) { val = isArray(val) ? [val] : val; } if (has.call(obj, key)) { obj[key] = utils.combine(obj[key], val); } else { obj[key] = val; } } return obj; }; var parseObject = function parseObject(chain, val, options, valuesParsed) { var leaf = valuesParsed ? val : parseArrayValue(val, options); for (var i = chain.length - 1; i >= 0; --i) { var obj; var root = chain[i]; if (root === '[]' && options.parseArrays) { obj = [].concat(leaf); } else { obj = options.plainObjects ? Object.create(null) : {}; var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; var index = parseInt(cleanRoot, 10); if (!options.parseArrays && cleanRoot === '') { obj = { 0: leaf }; } else if (!isNaN(index) && root !== cleanRoot && String(index) === cleanRoot && index >= 0 && options.parseArrays && index <= options.arrayLimit) { obj = []; obj[index] = leaf; } else if (cleanRoot !== '__proto__') { obj[cleanRoot] = leaf; } } leaf = obj; } return leaf; }; var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { if (!givenKey) { return; } // Transform dot notation to bracket notation var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; // The regex chunks var brackets = /(\[[^[\]]*])/; var child = /(\[[^[\]]*])/g; // Get the parent var segment = options.depth > 0 && brackets.exec(key); var parent = segment ? key.slice(0, segment.index) : key; // Stash the parent if it exists var keys = []; if (parent) { // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties if (!options.plainObjects && has.call(Object.prototype, parent)) { if (!options.allowPrototypes) { return; } } keys.push(parent); } // Loop through children appending to the array until we hit depth var i = 0; while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) { i += 1; if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { if (!options.allowPrototypes) { return; } } keys.push(segment[1]); } // If there's a remainder, just add whatever is left if (segment) { keys.push('[' + key.slice(segment.index) + ']'); } return parseObject(keys, val, options, valuesParsed); }; var normalizeParseOptions = function normalizeParseOptions(opts) { if (!opts) { return defaults; } if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { throw new TypeError('Decoder has to be a function.'); } if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); } var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; return { allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, charset: charset, charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, // eslint-disable-next-line no-implicit-coercion, no-extra-parens depth: typeof opts.depth === 'number' || opts.depth === false ? +opts.depth : defaults.depth, ignoreQueryPrefix: opts.ignoreQueryPrefix === true, interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, parseArrays: opts.parseArrays !== false, plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling }; }; module.exports = function (str, opts) { var options = normalizeParseOptions(opts); if (str === '' || str === null || typeof str === 'undefined') { return options.plainObjects ? Object.create(null) : {}; } var tempObj = typeof str === 'string' ? parseValues(str, options) : str; var obj = options.plainObjects ? Object.create(null) : {}; // Iterate over the keys and setup the new object var keys = Object.keys(tempObj); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string'); obj = utils.merge(obj, newObj, options); } if (options.allowSparse === true) { return obj; } return utils.compact(obj); }; /***/ }), /***/ "./node_modules/qs/lib/stringify.js": /*!******************************************!*\ !*** ./node_modules/qs/lib/stringify.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var getSideChannel = __webpack_require__(/*! side-channel */ "./node_modules/side-channel/index.js"); var utils = __webpack_require__(/*! ./utils */ "./node_modules/qs/lib/utils.js"); var formats = __webpack_require__(/*! ./formats */ "./node_modules/qs/lib/formats.js"); var has = Object.prototype.hasOwnProperty; var arrayPrefixGenerators = { brackets: function brackets(prefix) { return prefix + '[]'; }, comma: 'comma', indices: function indices(prefix, key) { return prefix + '[' + key + ']'; }, repeat: function repeat(prefix) { return prefix; } }; var isArray = Array.isArray; var split = String.prototype.split; var push = Array.prototype.push; var pushToArray = function pushToArray(arr, valueOrArray) { push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); }; var toISO = Date.prototype.toISOString; var defaultFormat = formats['default']; var defaults = { addQueryPrefix: false, allowDots: false, charset: 'utf-8', charsetSentinel: false, delimiter: '&', encode: true, encoder: utils.encode, encodeValuesOnly: false, format: defaultFormat, formatter: formats.formatters[defaultFormat], // deprecated indices: false, serializeDate: function serializeDate(date) { return toISO.call(date); }, skipNulls: false, strictNullHandling: false }; var isNonNullishPrimitive = function isNonNullishPrimitive(v) { return typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean' || (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'symbol' || typeof v === 'bigint'; }; var sentinel = {}; var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, sideChannel) { var obj = object; var tmpSc = sideChannel; var step = 0; var findFlag = false; while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { // Where object last appeared in the ref tree var pos = tmpSc.get(object); step += 1; if (typeof pos !== 'undefined') { if (pos === step) { throw new RangeError('Cyclic object value'); } else { findFlag = true; // Break while } } if (typeof tmpSc.get(sentinel) === 'undefined') { step = 0; } } if (typeof filter === 'function') { obj = filter(prefix, obj); } else if (obj instanceof Date) { obj = serializeDate(obj); } else if (generateArrayPrefix === 'comma' && isArray(obj)) { obj = utils.maybeMap(obj, function (value) { if (value instanceof Date) { return serializeDate(value); } return value; }); } if (obj === null) { if (strictNullHandling) { return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; } obj = ''; } if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { if (encoder) { var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); if (generateArrayPrefix === 'comma' && encodeValuesOnly) { var valuesArray = split.call(String(obj), ','); var valuesJoined = ''; for (var i = 0; i < valuesArray.length; ++i) { valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); } return [formatter(keyValue) + (isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined]; } return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; } return [formatter(prefix) + '=' + formatter(String(obj))]; } var values = []; if (typeof obj === 'undefined') { return values; } var objKeys; if (generateArrayPrefix === 'comma' && isArray(obj)) { // we need to join elements in objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; } else if (isArray(filter)) { objKeys = filter; } else { var keys = Object.keys(obj); objKeys = sort ? keys.sort(sort) : keys; } var adjustedPrefix = generateArrayPrefix === 'comma' && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix; for (var j = 0; j < objKeys.length; ++j) { var key = objKeys[j]; var value = (typeof key === 'undefined' ? 'undefined' : _typeof(key)) === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; if (skipNulls && value === null) { continue; } var keyPrefix = isArray(obj) ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']'); sideChannel.set(object, step); var valueSideChannel = getSideChannel(); valueSideChannel.set(sentinel, sideChannel); pushToArray(values, stringify(value, keyPrefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, valueSideChannel)); } return values; }; var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { if (!opts) { return defaults; } if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { throw new TypeError('Encoder has to be a function.'); } var charset = opts.charset || defaults.charset; if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); } var format = formats['default']; if (typeof opts.format !== 'undefined') { if (!has.call(formats.formatters, opts.format)) { throw new TypeError('Unknown format option provided.'); } format = opts.format; } var formatter = formats.formatters[format]; var filter = defaults.filter; if (typeof opts.filter === 'function' || isArray(opts.filter)) { filter = opts.filter; } return { addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, charset: charset, charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, filter: filter, format: format, formatter: formatter, serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, sort: typeof opts.sort === 'function' ? opts.sort : null, strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling }; }; module.exports = function (object, opts) { var obj = object; var options = normalizeStringifyOptions(opts); var objKeys; var filter; if (typeof options.filter === 'function') { filter = options.filter; obj = filter('', obj); } else if (isArray(options.filter)) { filter = options.filter; objKeys = filter; } var keys = []; if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) { return ''; } var arrayFormat; if (opts && opts.arrayFormat in arrayPrefixGenerators) { arrayFormat = opts.arrayFormat; } else if (opts && 'indices' in opts) { arrayFormat = opts.indices ? 'indices' : 'repeat'; } else { arrayFormat = 'indices'; } var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; if (!objKeys) { objKeys = Object.keys(obj); } if (options.sort) { objKeys.sort(options.sort); } var sideChannel = getSideChannel(); for (var i = 0; i < objKeys.length; ++i) { var key = objKeys[i]; if (options.skipNulls && obj[key] === null) { continue; } pushToArray(keys, stringify(obj[key], key, generateArrayPrefix, options.strictNullHandling, options.skipNulls, options.encode ? options.encoder : null, options.filter, options.sort, options.allowDots, options.serializeDate, options.format, options.formatter, options.encodeValuesOnly, options.charset, sideChannel)); } var joined = keys.join(options.delimiter); var prefix = options.addQueryPrefix === true ? '?' : ''; if (options.charsetSentinel) { if (options.charset === 'iso-8859-1') { // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark prefix += 'utf8=%26%2310003%3B&'; } else { // encodeURIComponent('✓') prefix += 'utf8=%E2%9C%93&'; } } return joined.length > 0 ? prefix + joined : ''; }; /***/ }), /***/ "./node_modules/qs/lib/utils.js": /*!**************************************!*\ !*** ./node_modules/qs/lib/utils.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var formats = __webpack_require__(/*! ./formats */ "./node_modules/qs/lib/formats.js"); var has = Object.prototype.hasOwnProperty; var isArray = Array.isArray; var hexTable = function () { var array = []; for (var i = 0; i < 256; ++i) { array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); } return array; }(); var compactQueue = function compactQueue(queue) { while (queue.length > 1) { var item = queue.pop(); var obj = item.obj[item.prop]; if (isArray(obj)) { var compacted = []; for (var j = 0; j < obj.length; ++j) { if (typeof obj[j] !== 'undefined') { compacted.push(obj[j]); } } item.obj[item.prop] = compacted; } } }; var arrayToObject = function arrayToObject(source, options) { var obj = options && options.plainObjects ? Object.create(null) : {}; for (var i = 0; i < source.length; ++i) { if (typeof source[i] !== 'undefined') { obj[i] = source[i]; } } return obj; }; var merge = function merge(target, source, options) { /* eslint no-param-reassign: 0 */ if (!source) { return target; } if ((typeof source === 'undefined' ? 'undefined' : _typeof(source)) !== 'object') { if (isArray(target)) { target.push(source); } else if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object') { if (options && (options.plainObjects || options.allowPrototypes) || !has.call(Object.prototype, source)) { target[source] = true; } } else { return [target, source]; } return target; } if (!target || (typeof target === 'undefined' ? 'undefined' : _typeof(target)) !== 'object') { return [target].concat(source); } var mergeTarget = target; if (isArray(target) && !isArray(source)) { mergeTarget = arrayToObject(target, options); } if (isArray(target) && isArray(source)) { source.forEach(function (item, i) { if (has.call(target, i)) { var targetItem = target[i]; if (targetItem && (typeof targetItem === 'undefined' ? 'undefined' : _typeof(targetItem)) === 'object' && item && (typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object') { target[i] = merge(targetItem, item, options); } else { target.push(item); } } else { target[i] = item; } }); return target; } return Object.keys(source).reduce(function (acc, key) { var value = source[key]; if (has.call(acc, key)) { acc[key] = merge(acc[key], value, options); } else { acc[key] = value; } return acc; }, mergeTarget); }; var assign = function assignSingleSource(target, source) { return Object.keys(source).reduce(function (acc, key) { acc[key] = source[key]; return acc; }, target); }; var decode = function decode(str, decoder, charset) { var strWithoutPlus = str.replace(/\+/g, ' '); if (charset === 'iso-8859-1') { // unescape never throws, no try...catch needed: return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); } // utf-8 try { return decodeURIComponent(strWithoutPlus); } catch (e) { return strWithoutPlus; } }; var encode = function encode(str, defaultEncoder, charset, kind, format) { // This code was originally written by Brian White (mscdex) for the io.js core querystring library. // It has been adapted here for stricter adherence to RFC 3986 if (str.length === 0) { return str; } var string = str; if ((typeof str === 'undefined' ? 'undefined' : _typeof(str)) === 'symbol') { string = Symbol.prototype.toString.call(str); } else if (typeof str !== 'string') { string = String(str); } if (charset === 'iso-8859-1') { return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; }); } var out = ''; for (var i = 0; i < string.length; ++i) { var c = string.charCodeAt(i); if (c === 0x2D // - || c === 0x2E // . || c === 0x5F // _ || c === 0x7E // ~ || c >= 0x30 && c <= 0x39 // 0-9 || c >= 0x41 && c <= 0x5A // a-z || c >= 0x61 && c <= 0x7A // A-Z || format === formats.RFC1738 && (c === 0x28 || c === 0x29) // ( ) ) { out += string.charAt(i); continue; } if (c < 0x80) { out = out + hexTable[c]; continue; } if (c < 0x800) { out = out + (hexTable[0xC0 | c >> 6] + hexTable[0x80 | c & 0x3F]); continue; } if (c < 0xD800 || c >= 0xE000) { out = out + (hexTable[0xE0 | c >> 12] + hexTable[0x80 | c >> 6 & 0x3F] + hexTable[0x80 | c & 0x3F]); continue; } i += 1; c = 0x10000 + ((c & 0x3FF) << 10 | string.charCodeAt(i) & 0x3FF); /* eslint operator-linebreak: [2, "before"] */ out += hexTable[0xF0 | c >> 18] + hexTable[0x80 | c >> 12 & 0x3F] + hexTable[0x80 | c >> 6 & 0x3F] + hexTable[0x80 | c & 0x3F]; } return out; }; var compact = function compact(value) { var queue = [{ obj: { o: value }, prop: 'o' }]; var refs = []; for (var i = 0; i < queue.length; ++i) { var item = queue[i]; var obj = item.obj[item.prop]; var keys = Object.keys(obj); for (var j = 0; j < keys.length; ++j) { var key = keys[j]; var val = obj[key]; if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' && val !== null && refs.indexOf(val) === -1) { queue.push({ obj: obj, prop: key }); refs.push(val); } } } compactQueue(queue); return value; }; var isRegExp = function isRegExp(obj) { return Object.prototype.toString.call(obj) === '[object RegExp]'; }; var isBuffer = function isBuffer(obj) { if (!obj || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object') { return false; } return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); }; var combine = function combine(a, b) { return [].concat(a, b); }; var maybeMap = function maybeMap(val, fn) { if (isArray(val)) { var mapped = []; for (var i = 0; i < val.length; i += 1) { mapped.push(fn(val[i])); } return mapped; } return fn(val); }; module.exports = { arrayToObject: arrayToObject, assign: assign, combine: combine, compact: compact, decode: decode, encode: encode, isBuffer: isBuffer, isRegExp: isRegExp, maybeMap: maybeMap, merge: merge }; /***/ }), /***/ "./node_modules/setimmediate/setImmediate.js": /*!***************************************************!*\ !*** ./node_modules/setimmediate/setImmediate.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global, process) { (function (global, undefined) { "use strict"; if (global.setImmediate) { return; } var nextHandle = 1; // Spec says greater than zero var tasksByHandle = {}; var currentlyRunningATask = false; var doc = global.document; var registerImmediate; function setImmediate(callback) { // Callback can either be a function or a string if (typeof callback !== "function") { callback = new Function("" + callback); } // Copy function arguments var args = new Array(arguments.length - 1); for (var i = 0; i < args.length; i++) { args[i] = arguments[i + 1]; } // Store and register the task var task = { callback: callback, args: args }; tasksByHandle[nextHandle] = task; registerImmediate(nextHandle); return nextHandle++; } function clearImmediate(handle) { delete tasksByHandle[handle]; } function run(task) { var callback = task.callback; var args = task.args; switch (args.length) { case 0: callback(); break; case 1: callback(args[0]); break; case 2: callback(args[0], args[1]); break; case 3: callback(args[0], args[1], args[2]); break; default: callback.apply(undefined, args); break; } } function runIfPresent(handle) { // From the spec: "Wait until any invocations of this algorithm started before this one have completed." // So if we're currently running a task, we'll need to delay this invocation. if (currentlyRunningATask) { // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a // "too much recursion" error. setTimeout(runIfPresent, 0, handle); } else { var task = tasksByHandle[handle]; if (task) { currentlyRunningATask = true; try { run(task); } finally { clearImmediate(handle); currentlyRunningATask = false; } } } } function installNextTickImplementation() { registerImmediate = function registerImmediate(handle) { process.nextTick(function () { runIfPresent(handle); }); }; } function canUsePostMessage() { // The test against `importScripts` prevents this implementation from being installed inside a web worker, // where `global.postMessage` means something completely different and can't be used for this purpose. if (global.postMessage && !global.importScripts) { var postMessageIsAsynchronous = true; var oldOnMessage = global.onmessage; global.onmessage = function () { postMessageIsAsynchronous = false; }; global.postMessage("", "*"); global.onmessage = oldOnMessage; return postMessageIsAsynchronous; } } function installPostMessageImplementation() { // Installs an event handler on `global` for the `message` event: see // * https://developer.mozilla.org/en/DOM/window.postMessage // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages var messagePrefix = "setImmediate$" + Math.random() + "$"; var onGlobalMessage = function onGlobalMessage(event) { if (event.source === global && typeof event.data === "string" && event.data.indexOf(messagePrefix) === 0) { runIfPresent(+event.data.slice(messagePrefix.length)); } }; if (global.addEventListener) { global.addEventListener("message", onGlobalMessage, false); } else { global.attachEvent("onmessage", onGlobalMessage); } registerImmediate = function registerImmediate(handle) { global.postMessage(messagePrefix + handle, "*"); }; } function installMessageChannelImplementation() { var channel = new MessageChannel(); channel.port1.onmessage = function (event) { var handle = event.data; runIfPresent(handle); }; registerImmediate = function registerImmediate(handle) { channel.port2.postMessage(handle); }; } function installReadyStateChangeImplementation() { var html = doc.documentElement; registerImmediate = function registerImmediate(handle) { // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. var script = doc.createElement("script"); script.onreadystatechange = function () { runIfPresent(handle); script.onreadystatechange = null; html.removeChild(script); script = null; }; html.appendChild(script); }; } function installSetTimeoutImplementation() { registerImmediate = function registerImmediate(handle) { setTimeout(runIfPresent, 0, handle); }; } // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live. var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global); attachTo = attachTo && attachTo.setTimeout ? attachTo : global; // Don't get fooled by e.g. browserify environments. if ({}.toString.call(global.process) === "[object process]") { // For Node.js before 0.9 installNextTickImplementation(); } else if (canUsePostMessage()) { // For non-IE10 modern browsers installPostMessageImplementation(); } else if (global.MessageChannel) { // For web workers, where supported installMessageChannelImplementation(); } else if (doc && "onreadystatechange" in doc.createElement("script")) { // For IE 6–8 installReadyStateChangeImplementation(); } else { // For older browsers installSetTimeoutImplementation(); } attachTo.setImmediate = setImmediate; attachTo.clearImmediate = clearImmediate; })(typeof self === "undefined" ? typeof global === "undefined" ? undefined : global : self); /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js"))) /***/ }), /***/ "./node_modules/side-channel/index.js": /*!********************************************!*\ !*** ./node_modules/side-channel/index.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); var callBound = __webpack_require__(/*! call-bind/callBound */ "./node_modules/call-bind/callBound.js"); var inspect = __webpack_require__(/*! object-inspect */ "./node_modules/object-inspect/index.js"); var $TypeError = GetIntrinsic('%TypeError%'); var $WeakMap = GetIntrinsic('%WeakMap%', true); var $Map = GetIntrinsic('%Map%', true); var $weakMapGet = callBound('WeakMap.prototype.get', true); var $weakMapSet = callBound('WeakMap.prototype.set', true); var $weakMapHas = callBound('WeakMap.prototype.has', true); var $mapGet = callBound('Map.prototype.get', true); var $mapSet = callBound('Map.prototype.set', true); var $mapHas = callBound('Map.prototype.has', true); /* * This function traverses the list returning the node corresponding to the * given key. * * That node is also moved to the head of the list, so that if it's accessed * again we don't need to traverse the whole list. By doing so, all the recently * used nodes can be accessed relatively quickly. */ var listGetNode = function listGetNode(list, key) { // eslint-disable-line consistent-return for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { if (curr.key === key) { prev.next = curr.next; curr.next = list.next; list.next = curr; // eslint-disable-line no-param-reassign return curr; } } }; var listGet = function listGet(objects, key) { var node = listGetNode(objects, key); return node && node.value; }; var listSet = function listSet(objects, key, value) { var node = listGetNode(objects, key); if (node) { node.value = value; } else { // Prepend the new node to the beginning of the list objects.next = { // eslint-disable-line no-param-reassign key: key, next: objects.next, value: value }; } }; var listHas = function listHas(objects, key) { return !!listGetNode(objects, key); }; module.exports = function getSideChannel() { var $wm; var $m; var $o; var channel = { assert: function assert(key) { if (!channel.has(key)) { throw new $TypeError('Side channel does not contain ' + inspect(key)); } }, get: function get(key) { // eslint-disable-line consistent-return if ($WeakMap && key && ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) === 'object' || typeof key === 'function')) { if ($wm) { return $weakMapGet($wm, key); } } else if ($Map) { if ($m) { return $mapGet($m, key); } } else { if ($o) { // eslint-disable-line no-lonely-if return listGet($o, key); } } }, has: function has(key) { if ($WeakMap && key && ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) === 'object' || typeof key === 'function')) { if ($wm) { return $weakMapHas($wm, key); } } else if ($Map) { if ($m) { return $mapHas($m, key); } } else { if ($o) { // eslint-disable-line no-lonely-if return listHas($o, key); } } return false; }, set: function set(key, value) { if ($WeakMap && key && ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) === 'object' || typeof key === 'function')) { if (!$wm) { $wm = new $WeakMap(); } $weakMapSet($wm, key, value); } else if ($Map) { if (!$m) { $m = new $Map(); } $mapSet($m, key, value); } else { if (!$o) { /* * Initialize the linked list as an empty node, so that we don't have * to special-case handling of the first node: we can always refer to * it as (previous node).next, instead of something like (list).head */ $o = { key: {}, next: null }; } listSet($o, key, value); } } }; return channel; }; /***/ }), /***/ "./node_modules/superagent/lib/agent-base.js": /*!***************************************************!*\ !*** ./node_modules/superagent/lib/agent-base.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it;var i = 0;var F = function F() {};return { s: F, n: function n() { if (i >= o.length) return { done: true };return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; }throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }var normalCompletion = true, didErr = false, err;return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next();normalCompletion = step.done;return step; }, e: function e(_e2) { didErr = true;err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return;if (typeof o === "string") return _arrayLikeToArray(o, minLen);var n = Object.prototype.toString.call(o).slice(8, -1);if (n === "Object" && o.constructor) n = o.constructor.name;if (n === "Map" || n === "Set") return Array.from(o);if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length;for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; }return arr2; } function Agent() { this._defaults = []; } var _loop = function _loop() { var fn = _arr[_i]; // Default setting for all requests from this agent Agent.prototype[fn] = function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } this._defaults.push({ fn: fn, args: args }); return this; }; }; for (var _i = 0, _arr = ['use', 'on', 'once', 'set', 'query', 'type', 'accept', 'auth', 'withCredentials', 'sortQuery', 'retry', 'ok', 'redirects', 'timeout', 'buffer', 'serialize', 'parse', 'ca', 'key', 'pfx', 'cert', 'disableTLSCerts']; _i < _arr.length; _i++) { _loop(); } Agent.prototype._setDefaults = function (request) { var _iterator = _createForOfIteratorHelper(this._defaults), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var def = _step.value; request[def.fn].apply(request, _toConsumableArray(def.args)); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }; module.exports = Agent; /***/ }), /***/ "./node_modules/superagent/lib/client.js": /*!***********************************************!*\ !*** ./node_modules/superagent/lib/client.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == _typeof2(Symbol.iterator) ? function (obj) { return typeof obj === "undefined" ? "undefined" : _typeof2(obj); } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); }, _typeof(obj); } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it;var i = 0;var F = function F() {};return { s: F, n: function n() { if (i >= o.length) return { done: true };return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; }throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }var normalCompletion = true, didErr = false, err;return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next();normalCompletion = step.done;return step; }, e: function e(_e2) { didErr = true;err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return;if (typeof o === "string") return _arrayLikeToArray(o, minLen);var n = Object.prototype.toString.call(o).slice(8, -1);if (n === "Object" && o.constructor) n = o.constructor.name;if (n === "Map" || n === "Set") return Array.from(o);if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length;for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; }return arr2; } /** * Root reference for iframes. */ var root; if (typeof window !== 'undefined') { // Browser window root = window; } else if (typeof self === 'undefined') { // Other environments console.warn('Using browser-only version of superagent in non-browser environment'); root = void 0; } else { // Web Worker root = self; } var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); var safeStringify = __webpack_require__(/*! fast-safe-stringify */ "./node_modules/fast-safe-stringify/index.js"); var qs = __webpack_require__(/*! qs */ "./node_modules/qs/lib/index.js"); var RequestBase = __webpack_require__(/*! ./request-base */ "./node_modules/superagent/lib/request-base.js"); var _require = __webpack_require__(/*! ./utils */ "./node_modules/superagent/lib/utils.js"), isObject = _require.isObject, mixin = _require.mixin, hasOwn = _require.hasOwn; var ResponseBase = __webpack_require__(/*! ./response-base */ "./node_modules/superagent/lib/response-base.js"); var Agent = __webpack_require__(/*! ./agent-base */ "./node_modules/superagent/lib/agent-base.js"); /** * Noop. */ function noop() {} /** * Expose `request`. */ module.exports = function (method, url) { // callback if (typeof url === 'function') { return new exports.Request('GET', method).end(url); } // url first if (arguments.length === 1) { return new exports.Request('GET', method); } return new exports.Request(method, url); }; exports = module.exports; var request = exports; exports.Request = Request; /** * Determine XHR. */ request.getXHR = function () { if (root.XMLHttpRequest && (!root.location || root.location.protocol !== 'file:')) { return new XMLHttpRequest(); } throw new Error('Browser-only version of superagent could not find XHR'); }; /** * Removes leading and trailing whitespace, added to support IE. * * @param {String} s * @return {String} * @api private */ var trim = ''.trim ? function (s) { return s.trim(); } : function (s) { return s.replace(/(^\s*|\s*$)/g, ''); }; /** * Serialize the given `obj`. * * @param {Object} obj * @return {String} * @api private */ function serialize(object) { if (!isObject(object)) return object; var pairs = []; for (var key in object) { if (hasOwn(object, key)) pushEncodedKeyValuePair(pairs, key, object[key]); } return pairs.join('&'); } /** * Helps 'serialize' with serializing arrays. * Mutates the pairs array. * * @param {Array} pairs * @param {String} key * @param {Mixed} val */ function pushEncodedKeyValuePair(pairs, key, value) { if (value === undefined) return; if (value === null) { pairs.push(encodeURI(key)); return; } if (Array.isArray(value)) { var _iterator = _createForOfIteratorHelper(value), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var v = _step.value; pushEncodedKeyValuePair(pairs, key, v); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } else if (isObject(value)) { for (var subkey in value) { if (hasOwn(value, subkey)) pushEncodedKeyValuePair(pairs, "".concat(key, "[").concat(subkey, "]"), value[subkey]); } } else { pairs.push(encodeURI(key) + '=' + encodeURIComponent(value)); } } /** * Expose serialization method. */ request.serializeObject = serialize; /** * Parse the given x-www-form-urlencoded `str`. * * @param {String} str * @return {Object} * @api private */ function parseString(string_) { var object = {}; var pairs = string_.split('&'); var pair; var pos; for (var i = 0, length_ = pairs.length; i < length_; ++i) { pair = pairs[i]; pos = pair.indexOf('='); if (pos === -1) { object[decodeURIComponent(pair)] = ''; } else { object[decodeURIComponent(pair.slice(0, pos))] = decodeURIComponent(pair.slice(pos + 1)); } } return object; } /** * Expose parser. */ request.parseString = parseString; /** * Default MIME type map. * * superagent.types.xml = 'application/xml'; * */ request.types = { html: 'text/html', json: 'application/json', xml: 'text/xml', urlencoded: 'application/x-www-form-urlencoded', form: 'application/x-www-form-urlencoded', 'form-data': 'application/x-www-form-urlencoded' }; /** * Default serialization map. * * superagent.serialize['application/xml'] = function(obj){ * return 'generated xml here'; * }; * */ request.serialize = { 'application/x-www-form-urlencoded': qs.stringify, 'application/json': safeStringify }; /** * Default parsers. * * superagent.parse['application/xml'] = function(str){ * return { object parsed from str }; * }; * */ request.parse = { 'application/x-www-form-urlencoded': parseString, 'application/json': JSON.parse }; /** * Parse the given header `str` into * an object containing the mapped fields. * * @param {String} str * @return {Object} * @api private */ function parseHeader(string_) { var lines = string_.split(/\r?\n/); var fields = {}; var index; var line; var field; var value; for (var i = 0, length_ = lines.length; i < length_; ++i) { line = lines[i]; index = line.indexOf(':'); if (index === -1) { // could be empty line, just skip it continue; } field = line.slice(0, index).toLowerCase(); value = trim(line.slice(index + 1)); fields[field] = value; } return fields; } /** * Check if `mime` is json or has +json structured syntax suffix. * * @param {String} mime * @return {Boolean} * @api private */ function isJSON(mime) { // should match /json or +json // but not /json-seq return (/[/+]json($|[^-\w])/i.test(mime) ); } /** * Initialize a new `Response` with the given `xhr`. * * - set flags (.ok, .error, etc) * - parse header * * Examples: * * Aliasing `superagent` as `request` is nice: * * request = superagent; * * We can use the promise-like API, or pass callbacks: * * request.get('/').end(function(res){}); * request.get('/', function(res){}); * * Sending data can be chained: * * request * .post('/user') * .send({ name: 'tj' }) * .end(function(res){}); * * Or passed to `.send()`: * * request * .post('/user') * .send({ name: 'tj' }, function(res){}); * * Or passed to `.post()`: * * request * .post('/user', { name: 'tj' }) * .end(function(res){}); * * Or further reduced to a single call for simple cases: * * request * .post('/user', { name: 'tj' }, function(res){}); * * @param {XMLHTTPRequest} xhr * @param {Object} options * @api private */ function Response(request_) { this.req = request_; this.xhr = this.req.xhr; // responseText is accessible only if responseType is '' or 'text' and on older browsers this.text = this.req.method !== 'HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text') || typeof this.xhr.responseType === 'undefined' ? this.xhr.responseText : null; this.statusText = this.req.xhr.statusText; var status = this.xhr.status; // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request if (status === 1223) { status = 204; } this._setStatusProperties(status); this.headers = parseHeader(this.xhr.getAllResponseHeaders()); this.header = this.headers; // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but // getResponseHeader still works. so we get content-type even if getting // other headers fails. this.header['content-type'] = this.xhr.getResponseHeader('content-type'); this._setHeaderProperties(this.header); if (this.text === null && request_._responseType) { this.body = this.xhr.response; } else { this.body = this.req.method === 'HEAD' ? null : this._parseBody(this.text ? this.text : this.xhr.response); } } mixin(Response.prototype, ResponseBase.prototype); /** * Parse the given body `str`. * * Used for auto-parsing of bodies. Parsers * are defined on the `superagent.parse` object. * * @param {String} str * @return {Mixed} * @api private */ Response.prototype._parseBody = function (string_) { var parse = request.parse[this.type]; if (this.req._parser) { return this.req._parser(this, string_); } if (!parse && isJSON(this.type)) { parse = request.parse['application/json']; } return parse && string_ && (string_.length > 0 || string_ instanceof Object) ? parse(string_) : null; }; /** * Return an `Error` representative of this response. * * @return {Error} * @api public */ Response.prototype.toError = function () { var req = this.req; var method = req.method; var url = req.url; var message = "cannot ".concat(method, " ").concat(url, " (").concat(this.status, ")"); var error = new Error(message); error.status = this.status; error.method = method; error.url = url; return error; }; /** * Expose `Response`. */ request.Response = Response; /** * Initialize a new `Request` with the given `method` and `url`. * * @param {String} method * @param {String} url * @api public */ function Request(method, url) { var self = this; this._query = this._query || []; this.method = method; this.url = url; this.header = {}; // preserves header name case this._header = {}; // coerces header names to lowercase this.on('end', function () { var error = null; var res = null; try { res = new Response(self); } catch (err) { error = new Error('Parser is unable to parse the response'); error.parse = true; error.original = err; // issue #675: return the raw response if the response parsing fails if (self.xhr) { // ie9 doesn't have 'response' property error.rawResponse = typeof self.xhr.responseType === 'undefined' ? self.xhr.responseText : self.xhr.response; // issue #876: return the http status code if the response parsing fails error.status = self.xhr.status ? self.xhr.status : null; error.statusCode = error.status; // backwards-compat only } else { error.rawResponse = null; error.status = null; } return self.callback(error); } self.emit('response', res); var new_error; try { if (!self._isResponseOK(res)) { new_error = new Error(res.statusText || res.text || 'Unsuccessful HTTP response'); } } catch (err) { new_error = err; // ok() callback can throw } // #1000 don't catch errors from the callback to avoid double calling it if (new_error) { new_error.original = error; new_error.response = res; new_error.status = new_error.status || res.status; self.callback(new_error, res); } else { self.callback(null, res); } }); } /** * Mixin `Emitter` and `RequestBase`. */ // eslint-disable-next-line new-cap Emitter(Request.prototype); mixin(Request.prototype, RequestBase.prototype); /** * Set Content-Type to `type`, mapping values from `request.types`. * * Examples: * * superagent.types.xml = 'application/xml'; * * request.post('/') * .type('xml') * .send(xmlstring) * .end(callback); * * request.post('/') * .type('application/xml') * .send(xmlstring) * .end(callback); * * @param {String} type * @return {Request} for chaining * @api public */ Request.prototype.type = function (type) { this.set('Content-Type', request.types[type] || type); return this; }; /** * Set Accept to `type`, mapping values from `request.types`. * * Examples: * * superagent.types.json = 'application/json'; * * request.get('/agent') * .accept('json') * .end(callback); * * request.get('/agent') * .accept('application/json') * .end(callback); * * @param {String} accept * @return {Request} for chaining * @api public */ Request.prototype.accept = function (type) { this.set('Accept', request.types[type] || type); return this; }; /** * Set Authorization field value with `user` and `pass`. * * @param {String} user * @param {String} [pass] optional in case of using 'bearer' as type * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic') * @return {Request} for chaining * @api public */ Request.prototype.auth = function (user, pass, options) { if (arguments.length === 1) pass = ''; if (_typeof(pass) === 'object' && pass !== null) { // pass is optional and can be replaced with options options = pass; pass = ''; } if (!options) { options = { type: typeof btoa === 'function' ? 'basic' : 'auto' }; } var encoder = options.encoder ? options.encoder : function (string) { if (typeof btoa === 'function') { return btoa(string); } throw new Error('Cannot use basic auth, btoa is not a function'); }; return this._auth(user, pass, options, encoder); }; /** * Add query-string `val`. * * Examples: * * request.get('/shoes') * .query('size=10') * .query({ color: 'blue' }) * * @param {Object|String} val * @return {Request} for chaining * @api public */ Request.prototype.query = function (value) { if (typeof value !== 'string') value = serialize(value); if (value) this._query.push(value); return this; }; /** * Queue the given `file` as an attachment to the specified `field`, * with optional `options` (or filename). * * ``` js * request.post('/upload') * .attach('content', new Blob(['<a id="a"><b id="b">hey!</b></a>'], { type: "text/html"})) * .end(callback); * ``` * * @param {String} field * @param {Blob|File} file * @param {String|Object} options * @return {Request} for chaining * @api public */ Request.prototype.attach = function (field, file, options) { if (file) { if (this._data) { throw new Error("superagent can't mix .send() and .attach()"); } this._getFormData().append(field, file, options || file.name); } return this; }; Request.prototype._getFormData = function () { if (!this._formData) { this._formData = new root.FormData(); } return this._formData; }; /** * Invoke the callback with `err` and `res` * and handle arity check. * * @param {Error} err * @param {Response} res * @api private */ Request.prototype.callback = function (error, res) { if (this._shouldRetry(error, res)) { return this._retry(); } var fn = this._callback; this.clearTimeout(); if (error) { if (this._maxRetries) error.retries = this._retries - 1; this.emit('error', error); } fn(error, res); }; /** * Invoke callback with x-domain error. * * @api private */ Request.prototype.crossDomainError = function () { var error = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.'); error.crossDomain = true; error.status = this.status; error.method = this.method; error.url = this.url; this.callback(error); }; // This only warns, because the request is still likely to work Request.prototype.agent = function () { console.warn('This is not supported in browser version of superagent'); return this; }; Request.prototype.ca = Request.prototype.agent; Request.prototype.buffer = Request.prototype.ca; // This throws, because it can't send/receive data as expected Request.prototype.write = function () { throw new Error('Streaming is not supported in browser version of superagent'); }; Request.prototype.pipe = Request.prototype.write; /** * Check if `obj` is a host object, * we don't want to serialize these :) * * @param {Object} obj host object * @return {Boolean} is a host object * @api private */ Request.prototype._isHost = function (object) { // Native objects stringify to [object File], [object Blob], [object FormData], etc. return object && _typeof(object) === 'object' && !Array.isArray(object) && Object.prototype.toString.call(object) !== '[object Object]'; }; /** * Initiate request, invoking callback `fn(res)` * with an instanceof `Response`. * * @param {Function} fn * @return {Request} for chaining * @api public */ Request.prototype.end = function (fn) { if (this._endCalled) { console.warn('Warning: .end() was called twice. This is not supported in superagent'); } this._endCalled = true; // store callback this._callback = fn || noop; // querystring this._finalizeQueryString(); this._end(); }; Request.prototype._setUploadTimeout = function () { var self = this; // upload timeout it's wokrs only if deadline timeout is off if (this._uploadTimeout && !this._uploadTimeoutTimer) { this._uploadTimeoutTimer = setTimeout(function () { self._timeoutError('Upload timeout of ', self._uploadTimeout, 'ETIMEDOUT'); }, this._uploadTimeout); } }; // eslint-disable-next-line complexity Request.prototype._end = function () { if (this._aborted) return this.callback(new Error('The request has been aborted even before .end() was called')); var self = this; this.xhr = request.getXHR(); var xhr = this.xhr; var data = this._formData || this._data; this._setTimeouts(); // state change xhr.addEventListener('readystatechange', function () { var readyState = xhr.readyState; if (readyState >= 2 && self._responseTimeoutTimer) { clearTimeout(self._responseTimeoutTimer); } if (readyState !== 4) { return; } // In IE9, reads to any property (e.g. status) off of an aborted XHR will // result in the error "Could not complete the operation due to error c00c023f" var status; try { status = xhr.status; } catch (_unused) { status = 0; } if (!status) { if (self.timedout || self._aborted) return; return self.crossDomainError(); } self.emit('end'); }); // progress var handleProgress = function handleProgress(direction, e) { if (e.total > 0) { e.percent = e.loaded / e.total * 100; if (e.percent === 100) { clearTimeout(self._uploadTimeoutTimer); } } e.direction = direction; self.emit('progress', e); }; if (this.hasListeners('progress')) { try { xhr.addEventListener('progress', handleProgress.bind(null, 'download')); if (xhr.upload) { xhr.upload.addEventListener('progress', handleProgress.bind(null, 'upload')); } } catch (_unused2) {// Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist. // Reported here: // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context } } if (xhr.upload) { this._setUploadTimeout(); } // initiate request try { if (this.username && this.password) { xhr.open(this.method, this.url, true, this.username, this.password); } else { xhr.open(this.method, this.url, true); } } catch (err) { // see #1149 return this.callback(err); } // CORS if (this._withCredentials) xhr.withCredentials = true; // body if (!this._formData && this.method !== 'GET' && this.method !== 'HEAD' && typeof data !== 'string' && !this._isHost(data)) { // serialize stuff var contentType = this._header['content-type']; var _serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : '']; if (!_serialize && isJSON(contentType)) { _serialize = request.serialize['application/json']; } if (_serialize) data = _serialize(data); } // set header fields for (var field in this.header) { if (this.header[field] === null) continue; if (hasOwn(this.header, field)) xhr.setRequestHeader(field, this.header[field]); } if (this._responseType) { xhr.responseType = this._responseType; } // send stuff this.emit('request', this); // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing) // We need null here if data is undefined xhr.send(typeof data === 'undefined' ? null : data); }; request.agent = function () { return new Agent(); }; var _loop = function _loop() { var method = _arr[_i]; Agent.prototype[method.toLowerCase()] = function (url, fn) { var request_ = new request.Request(method, url); this._setDefaults(request_); if (fn) { request_.end(fn); } return request_; }; }; for (var _i = 0, _arr = ['GET', 'POST', 'OPTIONS', 'PATCH', 'PUT', 'DELETE']; _i < _arr.length; _i++) { _loop(); } Agent.prototype.del = Agent.prototype.delete; /** * GET `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.get = function (url, data, fn) { var request_ = request('GET', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.query(data); if (fn) request_.end(fn); return request_; }; /** * HEAD `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.head = function (url, data, fn) { var request_ = request('HEAD', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.query(data); if (fn) request_.end(fn); return request_; }; /** * OPTIONS query to `url` with optional callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.options = function (url, data, fn) { var request_ = request('OPTIONS', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; /** * DELETE `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} [data] * @param {Function} [fn] * @return {Request} * @api public */ function del(url, data, fn) { var request_ = request('DELETE', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; } request.del = del; request.delete = del; /** * PATCH `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} [data] * @param {Function} [fn] * @return {Request} * @api public */ request.patch = function (url, data, fn) { var request_ = request('PATCH', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; /** * POST `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed} [data] * @param {Function} [fn] * @return {Request} * @api public */ request.post = function (url, data, fn) { var request_ = request('POST', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; /** * PUT `url` with optional `data` and callback `fn(res)`. * * @param {String} url * @param {Mixed|Function} [data] or fn * @param {Function} [fn] * @return {Request} * @api public */ request.put = function (url, data, fn) { var request_ = request('PUT', url); if (typeof data === 'function') { fn = data; data = null; } if (data) request_.send(data); if (fn) request_.end(fn); return request_; }; /***/ }), /***/ "./node_modules/superagent/lib/request-base.js": /*!*****************************************************!*\ !*** ./node_modules/superagent/lib/request-base.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(process) { var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == _typeof2(Symbol.iterator) ? function (obj) { return typeof obj === "undefined" ? "undefined" : _typeof2(obj); } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); }, _typeof(obj); } var semver = __webpack_require__(/*! semver */ 1); /** * Module of mixed-in functions shared between node and client code */ var _require = __webpack_require__(/*! ./utils */ "./node_modules/superagent/lib/utils.js"), isObject = _require.isObject, hasOwn = _require.hasOwn; /** * Expose `RequestBase`. */ module.exports = RequestBase; /** * Initialize a new `RequestBase`. * * @api public */ function RequestBase() {} /** * Clear previous timeout. * * @return {Request} for chaining * @api public */ RequestBase.prototype.clearTimeout = function () { clearTimeout(this._timer); clearTimeout(this._responseTimeoutTimer); clearTimeout(this._uploadTimeoutTimer); delete this._timer; delete this._responseTimeoutTimer; delete this._uploadTimeoutTimer; return this; }; /** * Override default response body parser * * This function will be called to convert incoming data into request.body * * @param {Function} * @api public */ RequestBase.prototype.parse = function (fn) { this._parser = fn; return this; }; /** * Set format of binary response body. * In browser valid formats are 'blob' and 'arraybuffer', * which return Blob and ArrayBuffer, respectively. * * In Node all values result in Buffer. * * Examples: * * req.get('/') * .responseType('blob') * .end(callback); * * @param {String} val * @return {Request} for chaining * @api public */ RequestBase.prototype.responseType = function (value) { this._responseType = value; return this; }; /** * Override default request body serializer * * This function will be called to convert data set via .send or .attach into payload to send * * @param {Function} * @api public */ RequestBase.prototype.serialize = function (fn) { this._serializer = fn; return this; }; /** * Set timeouts. * * - response timeout is time between sending request and receiving the first byte of the response. Includes DNS and connection time. * - deadline is the time from start of the request to receiving response body in full. If the deadline is too short large files may not load at all on slow connections. * - upload is the time since last bit of data was sent or received. This timeout works only if deadline timeout is off * * Value of 0 or false means no timeout. * * @param {Number|Object} ms or {response, deadline} * @return {Request} for chaining * @api public */ RequestBase.prototype.timeout = function (options) { if (!options || _typeof(options) !== 'object') { this._timeout = options; this._responseTimeout = 0; this._uploadTimeout = 0; return this; } for (var option in options) { if (hasOwn(options, option)) { switch (option) { case 'deadline': this._timeout = options.deadline; break; case 'response': this._responseTimeout = options.response; break; case 'upload': this._uploadTimeout = options.upload; break; default: console.warn('Unknown timeout option', option); } } } return this; }; /** * Set number of retry attempts on error. * * Failed requests will be retried 'count' times if timeout or err.code >= 500. * * @param {Number} count * @param {Function} [fn] * @return {Request} for chaining * @api public */ RequestBase.prototype.retry = function (count, fn) { // Default to 1 if no count passed or true if (arguments.length === 0 || count === true) count = 1; if (count <= 0) count = 0; this._maxRetries = count; this._retries = 0; this._retryCallback = fn; return this; }; // // NOTE: we do not include ESOCKETTIMEDOUT because that is from `request` package // <https://github.com/sindresorhus/got/pull/537> // // NOTE: we do not include EADDRINFO because it was removed from libuv in 2014 // <https://github.com/libuv/libuv/commit/02e1ebd40b807be5af46343ea873331b2ee4e9c1> // <https://github.com/request/request/search?q=ESOCKETTIMEDOUT&unscoped_q=ESOCKETTIMEDOUT> // // // TODO: expose these as configurable defaults // var ERROR_CODES = new Set(['ETIMEDOUT', 'ECONNRESET', 'EADDRINUSE', 'ECONNREFUSED', 'EPIPE', 'ENOTFOUND', 'ENETUNREACH', 'EAI_AGAIN']); var STATUS_CODES = new Set([408, 413, 429, 500, 502, 503, 504, 521, 522, 524]); // TODO: we would need to make this easily configurable before adding it in (e.g. some might want to add POST) // const METHODS = new Set(['GET', 'PUT', 'HEAD', 'DELETE', 'OPTIONS', 'TRACE']); /** * Determine if a request should be retried. * (Inspired by https://github.com/sindresorhus/got#retry) * * @param {Error} err an error * @param {Response} [res] response * @returns {Boolean} if segment should be retried */ RequestBase.prototype._shouldRetry = function (error, res) { if (!this._maxRetries || this._retries++ >= this._maxRetries) { return false; } if (this._retryCallback) { try { var override = this._retryCallback(error, res); if (override === true) return true; if (override === false) return false; // undefined falls back to defaults } catch (err) { console.error(err); } } // TODO: we would need to make this easily configurable before adding it in (e.g. some might want to add POST) /* if ( this.req && this.req.method && !METHODS.has(this.req.method.toUpperCase()) ) return false; */ if (res && res.status && STATUS_CODES.has(res.status)) return true; if (error) { if (error.code && ERROR_CODES.has(error.code)) return true; // Superagent timeout if (error.timeout && error.code === 'ECONNABORTED') return true; if (error.crossDomain) return true; } return false; }; /** * Retry request * * @return {Request} for chaining * @api private */ RequestBase.prototype._retry = function () { this.clearTimeout(); // node if (this.req) { this.req = null; this.req = this.request(); } this._aborted = false; this.timedout = false; this.timedoutError = null; return this._end(); }; /** * Promise support * * @param {Function} resolve * @param {Function} [reject] * @return {Request} */ RequestBase.prototype.then = function (resolve, reject) { var _this = this; if (!this._fullfilledPromise) { var self = this; if (this._endCalled) { console.warn('Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises'); } this._fullfilledPromise = new Promise(function (resolve, reject) { self.on('abort', function () { if (_this._maxRetries && _this._maxRetries > _this._retries) { return; } if (_this.timedout && _this.timedoutError) { reject(_this.timedoutError); return; } var error = new Error('Aborted'); error.code = 'ABORTED'; error.status = _this.status; error.method = _this.method; error.url = _this.url; reject(error); }); self.end(function (error, res) { if (error) reject(error);else resolve(res); }); }); } return this._fullfilledPromise.then(resolve, reject); }; RequestBase.prototype.catch = function (callback) { return this.then(undefined, callback); }; /** * Allow for extension */ RequestBase.prototype.use = function (fn) { fn(this); return this; }; RequestBase.prototype.ok = function (callback) { if (typeof callback !== 'function') throw new Error('Callback required'); this._okCallback = callback; return this; }; RequestBase.prototype._isResponseOK = function (res) { if (!res) { return false; } if (this._okCallback) { return this._okCallback(res); } return res.status >= 200 && res.status < 300; }; /** * Get request header `field`. * Case-insensitive. * * @param {String} field * @return {String} * @api public */ RequestBase.prototype.get = function (field) { return this._header[field.toLowerCase()]; }; /** * Get case-insensitive header `field` value. * This is a deprecated internal API. Use `.get(field)` instead. * * (getHeader is no longer used internally by the superagent code base) * * @param {String} field * @return {String} * @api private * @deprecated */ RequestBase.prototype.getHeader = RequestBase.prototype.get; /** * Set header `field` to `val`, or multiple fields with one object. * Case-insensitive. * * Examples: * * req.get('/') * .set('Accept', 'application/json') * .set('X-API-Key', 'foobar') * .end(callback); * * req.get('/') * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' }) * .end(callback); * * @param {String|Object} field * @param {String} val * @return {Request} for chaining * @api public */ RequestBase.prototype.set = function (field, value) { if (isObject(field)) { for (var key in field) { if (hasOwn(field, key)) this.set(key, field[key]); } return this; } this._header[field.toLowerCase()] = value; this.header[field] = value; return this; }; /** * Remove header `field`. * Case-insensitive. * * Example: * * req.get('/') * .unset('User-Agent') * .end(callback); * * @param {String} field field name */ RequestBase.prototype.unset = function (field) { delete this._header[field.toLowerCase()]; delete this.header[field]; return this; }; /** * Write the field `name` and `val`, or multiple fields with one object * for "multipart/form-data" request bodies. * * ``` js * request.post('/upload') * .field('foo', 'bar') * .end(callback); * * request.post('/upload') * .field({ foo: 'bar', baz: 'qux' }) * .end(callback); * ``` * * @param {String|Object} name name of field * @param {String|Blob|File|Buffer|fs.ReadStream} val value of field * @param {String} options extra options, e.g. 'blob' * @return {Request} for chaining * @api public */ RequestBase.prototype.field = function (name, value, options) { // name should be either a string or an object. if (name === null || undefined === name) { throw new Error('.field(name, val) name can not be empty'); } if (this._data) { throw new Error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()"); } if (isObject(name)) { for (var key in name) { if (hasOwn(name, key)) this.field(key, name[key]); } return this; } if (Array.isArray(value)) { for (var i in value) { if (hasOwn(value, i)) this.field(name, value[i]); } return this; } // val should be defined now if (value === null || undefined === value) { throw new Error('.field(name, val) val can not be empty'); } if (typeof value === 'boolean') { value = String(value); } // fix https://github.com/visionmedia/superagent/issues/1680 if (options) this._getFormData().append(name, value, options);else this._getFormData().append(name, value); return this; }; /** * Abort the request, and clear potential timeout. * * @return {Request} request * @api public */ RequestBase.prototype.abort = function () { if (this._aborted) { return this; } this._aborted = true; if (this.xhr) this.xhr.abort(); // browser if (this.req) { // Node v13 has major differences in `abort()` // https://github.com/nodejs/node/blob/v12.x/lib/internal/streams/end-of-stream.js // https://github.com/nodejs/node/blob/v13.x/lib/internal/streams/end-of-stream.js // https://github.com/nodejs/node/blob/v14.x/lib/internal/streams/end-of-stream.js // (if you run a diff across these you will see the differences) // // References: // <https://github.com/nodejs/node/issues/31630> // <https://github.com/visionmedia/superagent/pull/1084/commits/dc18679a7c5ccfc6046d882015e5126888973bc8> // // Thanks to @shadowgate15 and @niftylettuce if (semver.gte(process.version, 'v13.0.0') && semver.lt(process.version, 'v14.0.0')) { // Note that the reason this doesn't work is because in v13 as compared to v14 // there is no `callback = nop` set in end-of-stream.js above throw new Error('Superagent does not work in v13 properly with abort() due to Node.js core changes'); } else if (semver.gte(process.version, 'v14.0.0')) { // We have to manually set `destroyed` to `true` in order for this to work // (see core internals of end-of-stream.js above in v14 branch as compared to v12) this.req.destroyed = true; } this.req.abort(); // node } this.clearTimeout(); this.emit('abort'); return this; }; RequestBase.prototype._auth = function (user, pass, options, base64Encoder) { switch (options.type) { case 'basic': this.set('Authorization', "Basic ".concat(base64Encoder("".concat(user, ":").concat(pass)))); break; case 'auto': this.username = user; this.password = pass; break; case 'bearer': // usage would be .auth(accessToken, { type: 'bearer' }) this.set('Authorization', "Bearer ".concat(user)); break; default: break; } return this; }; /** * Enable transmission of cookies with x-domain requests. * * Note that for this to work the origin must not be * using "Access-Control-Allow-Origin" with a wildcard, * and also must set "Access-Control-Allow-Credentials" * to "true". * * @api public */ RequestBase.prototype.withCredentials = function (on) { // This is browser-only functionality. Node side is no-op. if (on === undefined) on = true; this._withCredentials = on; return this; }; /** * Set the max redirects to `n`. Does nothing in browser XHR implementation. * * @param {Number} n * @return {Request} for chaining * @api public */ RequestBase.prototype.redirects = function (n) { this._maxRedirects = n; return this; }; /** * Maximum size of buffered response body, in bytes. Counts uncompressed size. * Default 200MB. * * @param {Number} n number of bytes * @return {Request} for chaining */ RequestBase.prototype.maxResponseSize = function (n) { if (typeof n !== 'number') { throw new TypeError('Invalid argument'); } this._maxResponseSize = n; return this; }; /** * Convert to a plain javascript object (not JSON string) of scalar properties. * Note as this method is designed to return a useful non-this value, * it cannot be chained. * * @return {Object} describing method, url, and data of this request * @api public */ RequestBase.prototype.toJSON = function () { return { method: this.method, url: this.url, data: this._data, headers: this._header }; }; /** * Send `data` as the request body, defaulting the `.type()` to "json" when * an object is given. * * Examples: * * // manual json * request.post('/user') * .type('json') * .send('{"name":"tj"}') * .end(callback) * * // auto json * request.post('/user') * .send({ name: 'tj' }) * .end(callback) * * // manual x-www-form-urlencoded * request.post('/user') * .type('form') * .send('name=tj') * .end(callback) * * // auto x-www-form-urlencoded * request.post('/user') * .type('form') * .send({ name: 'tj' }) * .end(callback) * * // defaults to x-www-form-urlencoded * request.post('/user') * .send('name=tobi') * .send('species=ferret') * .end(callback) * * @param {String|Object} data * @return {Request} for chaining * @api public */ // eslint-disable-next-line complexity RequestBase.prototype.send = function (data) { var isObject_ = isObject(data); var type = this._header['content-type']; if (this._formData) { throw new Error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()"); } if (isObject_ && !this._data) { if (Array.isArray(data)) { this._data = []; } else if (!this._isHost(data)) { this._data = {}; } } else if (data && this._data && this._isHost(this._data)) { throw new Error("Can't merge these send calls"); } // merge if (isObject_ && isObject(this._data)) { for (var key in data) { if (hasOwn(data, key)) this._data[key] = data[key]; } } else if (typeof data === 'string') { // default to x-www-form-urlencoded if (!type) this.type('form'); type = this._header['content-type']; if (type) type = type.toLowerCase().trim(); if (type === 'application/x-www-form-urlencoded') { this._data = this._data ? "".concat(this._data, "&").concat(data) : data; } else { this._data = (this._data || '') + data; } } else { this._data = data; } if (!isObject_ || this._isHost(data)) { return this; } // default to json if (!type) this.type('json'); return this; }; /** * Sort `querystring` by the sort function * * * Examples: * * // default order * request.get('/user') * .query('name=Nick') * .query('search=Manny') * .sortQuery() * .end(callback) * * // customized sort function * request.get('/user') * .query('name=Nick') * .query('search=Manny') * .sortQuery(function(a, b){ * return a.length - b.length; * }) * .end(callback) * * * @param {Function} sort * @return {Request} for chaining * @api public */ RequestBase.prototype.sortQuery = function (sort) { // _sort default to true but otherwise can be a function or boolean this._sort = typeof sort === 'undefined' ? true : sort; return this; }; /** * Compose querystring to append to req.url * * @api private */ RequestBase.prototype._finalizeQueryString = function () { var query = this._query.join('&'); if (query) { this.url += (this.url.includes('?') ? '&' : '?') + query; } this._query.length = 0; // Makes the call idempotent if (this._sort) { var index = this.url.indexOf('?'); if (index >= 0) { var queryArray = this.url.slice(index + 1).split('&'); if (typeof this._sort === 'function') { queryArray.sort(this._sort); } else { queryArray.sort(); } this.url = this.url.slice(0, index) + '?' + queryArray.join('&'); } } }; // For backwards compat only RequestBase.prototype._appendQueryString = function () { console.warn('Unsupported'); }; /** * Invoke callback with timeout error. * * @api private */ RequestBase.prototype._timeoutError = function (reason, timeout, errno) { if (this._aborted) { return; } var error = new Error("".concat(reason + timeout, "ms exceeded")); error.timeout = timeout; error.code = 'ECONNABORTED'; error.errno = errno; this.timedout = true; this.timedoutError = error; this.abort(); this.callback(error); }; RequestBase.prototype._setTimeouts = function () { var self = this; // deadline if (this._timeout && !this._timer) { this._timer = setTimeout(function () { self._timeoutError('Timeout of ', self._timeout, 'ETIME'); }, this._timeout); } // response timeout if (this._responseTimeout && !this._responseTimeoutTimer) { this._responseTimeoutTimer = setTimeout(function () { self._timeoutError('Response timeout of ', self._responseTimeout, 'ETIMEDOUT'); }, this._responseTimeout); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js"))) /***/ }), /***/ "./node_modules/superagent/lib/response-base.js": /*!******************************************************!*\ !*** ./node_modules/superagent/lib/response-base.js ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * Module dependencies. */ var utils = __webpack_require__(/*! ./utils */ "./node_modules/superagent/lib/utils.js"); /** * Expose `ResponseBase`. */ module.exports = ResponseBase; /** * Initialize a new `ResponseBase`. * * @api public */ function ResponseBase() {} /** * Get case-insensitive `field` value. * * @param {String} field * @return {String} * @api public */ ResponseBase.prototype.get = function (field) { return this.header[field.toLowerCase()]; }; /** * Set header related properties: * * - `.type` the content type without params * * A response of "Content-Type: text/plain; charset=utf-8" * will provide you with a `.type` of "text/plain". * * @param {Object} header * @api private */ ResponseBase.prototype._setHeaderProperties = function (header) { // TODO: moar! // TODO: make this a util // content-type var ct = header['content-type'] || ''; this.type = utils.type(ct); // params var parameters = utils.params(ct); for (var key in parameters) { if (Object.prototype.hasOwnProperty.call(parameters, key)) this[key] = parameters[key]; } this.links = {}; // links try { if (header.link) { this.links = utils.parseLinks(header.link); } } catch (_unused) {// ignore } }; /** * Set flags such as `.ok` based on `status`. * * For example a 2xx response will give you a `.ok` of __true__ * whereas 5xx will be __false__ and `.error` will be __true__. The * `.clientError` and `.serverError` are also available to be more * specific, and `.statusType` is the class of error ranging from 1..5 * sometimes useful for mapping respond colors etc. * * "sugar" properties are also defined for common cases. Currently providing: * * - .noContent * - .badRequest * - .unauthorized * - .notAcceptable * - .notFound * * @param {Number} status * @api private */ ResponseBase.prototype._setStatusProperties = function (status) { var type = Math.trunc(status / 100); // status / class this.statusCode = status; this.status = this.statusCode; this.statusType = type; // basics this.info = type === 1; this.ok = type === 2; this.redirect = type === 3; this.clientError = type === 4; this.serverError = type === 5; this.error = type === 4 || type === 5 ? this.toError() : false; // sugar this.created = status === 201; this.accepted = status === 202; this.noContent = status === 204; this.badRequest = status === 400; this.unauthorized = status === 401; this.notAcceptable = status === 406; this.forbidden = status === 403; this.notFound = status === 404; this.unprocessableEntity = status === 422; }; /***/ }), /***/ "./node_modules/superagent/lib/utils.js": /*!**********************************************!*\ !*** ./node_modules/superagent/lib/utils.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == _typeof2(Symbol.iterator) ? function (obj) { return typeof obj === "undefined" ? "undefined" : _typeof2(obj); } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); }, _typeof(obj); } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it;var i = 0;var F = function F() {};return { s: F, n: function n() { if (i >= o.length) return { done: true };return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; }throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }var normalCompletion = true, didErr = false, err;return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next();normalCompletion = step.done;return step; }, e: function e(_e2) { didErr = true;err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return;if (typeof o === "string") return _arrayLikeToArray(o, minLen);var n = Object.prototype.toString.call(o).slice(8, -1);if (n === "Object" && o.constructor) n = o.constructor.name;if (n === "Map" || n === "Set") return Array.from(o);if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length;for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; }return arr2; } /** * Return the mime type for the given `str`. * * @param {String} str * @return {String} * @api private */ exports.type = function (string_) { return string_.split(/ *; */).shift(); }; /** * Return header field parameters. * * @param {String} str * @return {Object} * @api private */ exports.params = function (value) { var object = {}; var _iterator = _createForOfIteratorHelper(value.split(/ *; */)), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var string_ = _step.value; var parts = string_.split(/ *= */); var key = parts.shift(); var _value = parts.shift(); if (key && _value) object[key] = _value; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return object; }; /** * Parse Link header fields. * * @param {String} str * @return {Object} * @api private */ exports.parseLinks = function (value) { var object = {}; var _iterator2 = _createForOfIteratorHelper(value.split(/ *, */)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var string_ = _step2.value; var parts = string_.split(/ *; */); var url = parts[0].slice(1, -1); var rel = parts[1].split(/ *= */)[1].slice(1, -1); object[rel] = url; } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return object; }; /** * Strip content related fields from `header`. * * @param {Object} header * @return {Object} header * @api private */ exports.cleanHeader = function (header, changesOrigin) { delete header['content-type']; delete header['content-length']; delete header['transfer-encoding']; delete header.host; // secuirty if (changesOrigin) { delete header.authorization; delete header.cookie; } return header; }; /** * Check if `obj` is an object. * * @param {Object} object * @return {Boolean} * @api private */ exports.isObject = function (object) { return object !== null && _typeof(object) === 'object'; }; /** * Object.hasOwn fallback/polyfill. * * @type {(object: object, property: string) => boolean} object * @api private */ exports.hasOwn = Object.hasOwn || function (object, property) { if (object == null) { throw new TypeError('Cannot convert undefined or null to object'); } return Object.prototype.hasOwnProperty.call(new Object(object), property); }; exports.mixin = function (target, source) { for (var key in source) { if (exports.hasOwn(source, key)) { target[key] = source[key]; } } }; /***/ }), /***/ "./node_modules/timers-browserify/main.js": /*!************************************************!*\ !*** ./node_modules/timers-browserify/main.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) { var scope = typeof global !== "undefined" && global || typeof self !== "undefined" && self || window; var apply = Function.prototype.apply; // DOM APIs, for completeness exports.setTimeout = function () { return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout); }; exports.setInterval = function () { return new Timeout(apply.call(setInterval, scope, arguments), clearInterval); }; exports.clearTimeout = exports.clearInterval = function (timeout) { if (timeout) { timeout.close(); } }; function Timeout(id, clearFn) { this._id = id; this._clearFn = clearFn; } Timeout.prototype.unref = Timeout.prototype.ref = function () {}; Timeout.prototype.close = function () { this._clearFn.call(scope, this._id); }; // Does not start the time, just sets up the members needed. exports.enroll = function (item, msecs) { clearTimeout(item._idleTimeoutId); item._idleTimeout = msecs; }; exports.unenroll = function (item) { clearTimeout(item._idleTimeoutId); item._idleTimeout = -1; }; exports._unrefActive = exports.active = function (item) { clearTimeout(item._idleTimeoutId); var msecs = item._idleTimeout; if (msecs >= 0) { item._idleTimeoutId = setTimeout(function onTimeout() { if (item._onTimeout) item._onTimeout(); }, msecs); } }; // setimmediate attaches itself to the global object __webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js"); // On some exotic environments, it's not clear which object `setimmediate` was // able to install onto. Search each possibility in the same order as the // `setimmediate` library. exports.setImmediate = typeof self !== "undefined" && self.setImmediate || typeof global !== "undefined" && global.setImmediate || undefined && undefined.setImmediate; exports.clearImmediate = typeof self !== "undefined" && self.clearImmediate || typeof global !== "undefined" && global.clearImmediate || undefined && undefined.clearImmediate; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./node_modules/webpack/buildin/global.js": /*!***********************************!*\ !*** (webpack)/buildin/global.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var g; // This works in non-strict mode g = function () { return this; }(); try { // This works if eval is allowed (see CSP) g = g || new Function("return this")(); } catch (e) { // This works if the window reference is available if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window; } // g can still be undefined, but nothing to do about it... // We return undefined, instead of nothing here, so it's // easier to handle this case. if(!global) { ...} module.exports = g; /***/ }), /***/ 0: /*!********************************!*\ !*** ./util.inspect (ignored) ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), /***/ 1: /*!************************!*\ !*** semver (ignored) ***! \************************/ /*! no static exports found */ /***/ (function(module, exports) { /* (ignored) */ /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9QYXRoTG9hZGVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbGliL2xvYWRlcnMvZmlsZS1icm93c2VyLmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9saWIvbG9hZGVycy9odHRwLmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbm9kZV9tb2R1bGVzL2NvbXBvbmVudC1lbWl0dGVyL2luZGV4LmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvZmFzdC1zYWZlLXN0cmluZ2lmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL2luZGV4LmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8uL25vZGVfbW9kdWxlcy9oYXMvc3JjL2luZGV4LmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvbmF0aXZlLXByb21pc2Utb25seS9saWIvbnBvLnNyYy5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L2luZGV4LmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8uL25vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8uL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8uL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4uL3NyYy9hZ2VudC1iYXNlLmpzIiwid2VicGFjazovL1BhdGhMb2FkZXIvLi4vc3JjL2NsaWVudC5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4uL3NyYy9yZXF1ZXN0LWJhc2UuanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8uLi9zcmMvcmVzcG9uc2UtYmFzZS5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4uL3NyYy91dGlscy5qcyIsIndlYnBhY2s6Ly9QYXRoTG9hZGVyLy4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci8uL3V0aWwuaW5zcGVjdCAoaWdub3JlZCkiLCJ3ZWJwYWNrOi8vUGF0aExvYWRlci9zZW12ZXIgKGlnbm9yZWQpIl0sIm5hbWVzIjpbInN1cHBvcnRlZExvYWRlcnMiLCJmaWxlIiwicmVxdWlyZSIsImh0dHAiLCJodHRwcyIsImRlZmF1bHRMb2FkZXIiLCJ3aW5kb3ciLCJpbXBvcnRTY3JpcHRzIiwiUHJvbWlzZSIsImdldFNjaGVtZSIsImxvY2F0aW9uIiwiaW5kZXhPZiIsInNwbGl0IiwiZ2V0TG9hZGVyIiwic2NoZW1lIiwibG9hZGVyIiwiRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIiwibG9hZCIsIm9wdGlvbnMiLCJhbGxUYXNrcyIsInJlc29sdmUiLCJ0aGVuIiwiVHlwZUVycm9yIiwicHJvY2Vzc0NvbnRlbnQiLCJyZWplY3QiLCJlcnIiLCJkb2N1bWVudCIsInJlcyIsInRleHQiLCJwcm9jZXNzZWQiLCJ1bnN1cHBvcnRlZEVycm9yIiwiZ2V0QmFzZSIsImZuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwicmVxdWVzdCIsInN1cHBvcnRlZEh0dHBNZXRob2RzIiwiY2FsbGJhY2siLCJyZWFsTWV0aG9kIiwibWV0aG9kIiwidG9Mb3dlckNhc2UiLCJyZWFsUmVxdWVzdCIsIm1ha2VSZXF1ZXN0IiwicmVxIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwicHJvY2VzcyIsImJ1ZmZlciIsImVuZCIsImVycjIiLCJ1bmRlZmluZWQiLCJzbGljZSIsImpvaW4iLCJwcmVwYXJlUmVxdWVzdCIsIkdldEludHJpbnNpYyIsImNhbGxCaW5kIiwiJGluZGV4T2YiLCJjYWxsQm91bmRJbnRyaW5zaWMiLCJuYW1lIiwiYWxsb3dNaXNzaW5nIiwiaW50cmluc2ljIiwiYmluZCIsIiRhcHBseSIsIiRjYWxsIiwiJHJlZmxlY3RBcHBseSIsIiRnT1BEIiwiJGRlZmluZVByb3BlcnR5IiwiJG1heCIsInZhbHVlIiwiZSIsIm9yaWdpbmFsRnVuY3Rpb24iLCJmdW5jIiwiZGVzYyIsImNvbmZpZ3VyYWJsZSIsImFwcGx5QmluZCIsImFwcGx5IiwiRW1pdHRlciIsIm9iaiIsIm1peGluIiwia2V5Iiwib24iLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJfY2FsbGJhY2tzIiwicHVzaCIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjYWxsYmFja3MiLCJjYiIsImkiLCJzcGxpY2UiLCJlbWl0IiwiYXJncyIsIkFycmF5IiwibGVuIiwibGlzdGVuZXJzIiwiaGFzTGlzdGVuZXJzIiwic3RyaW5naWZ5IiwiZGVmYXVsdCIsInN0YWJsZSIsImRldGVybWluaXN0aWNTdHJpbmdpZnkiLCJzdGFibGVTdHJpbmdpZnkiLCJMSU1JVF9SRVBMQUNFX05PREUiLCJDSVJDVUxBUl9SRVBMQUNFX05PREUiLCJhcnIiLCJyZXBsYWNlclN0YWNrIiwiZGVmYXVsdE9wdGlvbnMiLCJkZXB0aExpbWl0IiwiTnVtYmVyIiwiTUFYX1NBRkVfSU5URUdFUiIsImVkZ2VzTGltaXQiLCJyZXBsYWNlciIsInNwYWNlciIsImRlY2lyYyIsIkpTT04iLCJyZXBsYWNlR2V0dGVyVmFsdWVzIiwiXyIsInBhcnQiLCJwb3AiLCJkZWZpbmVQcm9wZXJ0eSIsInNldFJlcGxhY2UiLCJyZXBsYWNlIiwidmFsIiwiayIsInBhcmVudCIsInByb3BlcnR5RGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldCIsImVkZ2VJbmRleCIsInN0YWNrIiwiZGVwdGgiLCJpc0FycmF5Iiwia2V5cyIsImNvbXBhcmVGdW5jdGlvbiIsImEiLCJiIiwidG1wIiwiZGV0ZXJtaW5pc3RpY0RlY2lyYyIsInRvSlNPTiIsInNvcnQiLCJ2IiwiRVJST1JfTUVTU0FHRSIsInRvU3RyIiwiZnVuY1R5cGUiLCJ0aGF0IiwidGFyZ2V0IiwiYm91bmQiLCJiaW5kZXIiLCJyZXN1bHQiLCJjb25jYXQiLCJib3VuZExlbmd0aCIsIk1hdGgiLCJtYXgiLCJib3VuZEFyZ3MiLCJGdW5jdGlvbiIsIkVtcHR5IiwiaW1wbGVtZW50YXRpb24iLCIkU3ludGF4RXJyb3IiLCJTeW50YXhFcnJvciIsIiRGdW5jdGlvbiIsIiRUeXBlRXJyb3IiLCJnZXRFdmFsbGVkQ29uc3RydWN0b3IiLCJleHByZXNzaW9uU3ludGF4IiwidGhyb3dUeXBlRXJyb3IiLCJUaHJvd1R5cGVFcnJvciIsImNhbGxlZSIsImNhbGxlZVRocm93cyIsImdPUER0aHJvd3MiLCJoYXNTeW1ib2xzIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIngiLCJfX3Byb3RvX18iLCJuZWVkc0V2YWwiLCJUeXBlZEFycmF5IiwiVWludDhBcnJheSIsIklOVFJJTlNJQ1MiLCJBZ2dyZWdhdGVFcnJvciIsIkFycmF5QnVmZmVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBdG9taWNzIiwiQmlnSW50IiwiQm9vbGVhbiIsIkRhdGFWaWV3IiwiRGF0ZSIsImRlY29kZVVSSSIsImRlY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVVSSSIsImVuY29kZVVSSUNvbXBvbmVudCIsImV2YWwiLCJFdmFsRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGaW5hbGl6YXRpb25SZWdpc3RyeSIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiaXNGaW5pdGUiLCJpc05hTiIsIk1hcCIsInBhcnNlRmxvYXQiLCJwYXJzZUludCIsIlByb3h5IiwiUmFuZ2VFcnJvciIsIlJlZmVyZW5jZUVycm9yIiwiUmVmbGVjdCIsIlJlZ0V4cCIsIlNldCIsIlNoYXJlZEFycmF5QnVmZmVyIiwiU3RyaW5nIiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiVVJJRXJyb3IiLCJXZWFrTWFwIiwiV2Vha1JlZiIsIldlYWtTZXQiLCJkb0V2YWwiLCJnZW4iLCJMRUdBQ1lfQUxJQVNFUyIsImhhc093biIsIiRjb25jYXQiLCIkc3BsaWNlQXBwbHkiLCIkcmVwbGFjZSIsIiRzdHJTbGljZSIsIiRleGVjIiwiZXhlYyIsInJlUHJvcE5hbWUiLCJyZUVzY2FwZUNoYXIiLCJzdHJpbmdUb1BhdGgiLCJzdHJpbmciLCJmaXJzdCIsImxhc3QiLCJtYXRjaCIsIm51bWJlciIsInF1b3RlIiwic3ViU3RyaW5nIiwiZ2V0QmFzZUludHJpbnNpYyIsImludHJpbnNpY05hbWUiLCJhbGlhcyIsInBhcnRzIiwiaW50cmluc2ljQmFzZU5hbWUiLCJpbnRyaW5zaWNSZWFsTmFtZSIsInNraXBGdXJ0aGVyQ2FjaGluZyIsImlzT3duIiwib3JpZ1N5bWJvbCIsImhhc1N5bWJvbFNoYW0iLCJoYXNOYXRpdmVTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltIiwic3ltT2JqIiwic3ltVmFsIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInN5bXMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiaGFzT3duUHJvcGVydHkiLCJVTUQiLCJjb250ZXh0IiwiZGVmaW5pdGlvbiIsImRlZmluZSIsIiRBTUQkIiwiZ2xvYmFsIiwiREVGIiwiYnVpbHRJblByb3AiLCJjeWNsZSIsInNjaGVkdWxpbmdfcXVldWUiLCJUb1N0cmluZyIsInRpbWVyIiwic2V0SW1tZWRpYXRlIiwic2V0VGltZW91dCIsImNvbmZpZyIsIndyaXRhYmxlIiwiUXVldWUiLCJpdGVtIiwiSXRlbSIsInNlbGYiLCJuZXh0IiwiYWRkIiwiZHJhaW4iLCJmIiwic2NoZWR1bGUiLCJpc1RoZW5hYmxlIiwibyIsIl90aGVuIiwib190eXBlIiwibm90aWZ5IiwiY2hhaW4iLCJub3RpZnlJc29sYXRlZCIsInN0YXRlIiwic3VjY2VzcyIsImZhaWx1cmUiLCJyZXQiLCJtc2ciLCJwcm9taXNlIiwidHJpZ2dlcmVkIiwiZGVmIiwiZGVmX3dyYXBwZXIiLCJNYWtlRGVmV3JhcHBlciIsIiRyZXNvbHZlJCIsIiRyZWplY3QkIiwiaXRlcmF0ZVByb21pc2VzIiwiQ29uc3RydWN0b3IiLCJyZXNvbHZlciIsInJlamVjdGVyIiwiaWR4IiwiSUlGRSIsIiRyZXNvbHZlciQiLCJNYWtlRGVmIiwiZXhlY3V0b3IiLCJfX05QT19fIiwiY29uc3RydWN0b3IiLCJleHRyYWN0Q2hhaW4iLCIkY2F0Y2gkIiwicHVibGljUmVzb2x2ZSIsInB1YmxpY1JlamVjdCIsIlByb21pc2VQcm90b3R5cGUiLCJQcm9taXNlJHJlc29sdmUiLCJQcm9taXNlJHJlamVjdCIsIlByb21pc2UkYWxsIiwibXNncyIsImNvdW50IiwiUHJvbWlzZSRyYWNlIiwiaGFzTWFwIiwibWFwU2l6ZURlc2NyaXB0b3IiLCJtYXBTaXplIiwibWFwRm9yRWFjaCIsImZvckVhY2giLCJoYXNTZXQiLCJzZXRTaXplRGVzY3JpcHRvciIsInNldFNpemUiLCJzZXRGb3JFYWNoIiwiaGFzV2Vha01hcCIsIndlYWtNYXBIYXMiLCJoYXMiLCJoYXNXZWFrU2V0Iiwid2Vha1NldEhhcyIsImhhc1dlYWtSZWYiLCJ3ZWFrUmVmRGVyZWYiLCJkZXJlZiIsImJvb2xlYW5WYWx1ZU9mIiwidmFsdWVPZiIsIm9iamVjdFRvU3RyaW5nIiwiZnVuY3Rpb25Ub1N0cmluZyIsIiRtYXRjaCIsIiRzbGljZSIsIiR0b1VwcGVyQ2FzZSIsInRvVXBwZXJDYXNlIiwiJHRvTG93ZXJDYXNlIiwiJHRlc3QiLCJ0ZXN0IiwiJGpvaW4iLCIkYXJyU2xpY2UiLCIkZmxvb3IiLCJmbG9vciIsImJpZ0ludFZhbHVlT2YiLCJnT1BTIiwic3ltVG9TdHJpbmciLCJoYXNTaGFtbWVkU3ltYm9scyIsInRvU3RyaW5nVGFnIiwiaXNFbnVtZXJhYmxlIiwiZ1BPIiwiTyIsImFkZE51bWVyaWNTZXBhcmF0b3IiLCJudW0iLCJzdHIiLCJJbmZpbml0eSIsInNlcFJlZ2V4IiwiaW50IiwiaW50U3RyIiwiZGVjIiwidXRpbEluc3BlY3QiLCJpbnNwZWN0Q3VzdG9tIiwiY3VzdG9tIiwiaW5zcGVjdFN5bWJvbCIsImlzU3ltYm9sIiwiaW5zcGVjdF8iLCJzZWVuIiwib3B0cyIsInF1b3RlU3R5bGUiLCJtYXhTdHJpbmdMZW5ndGgiLCJjdXN0b21JbnNwZWN0IiwiaW5kZW50IiwibnVtZXJpY1NlcGFyYXRvciIsImluc3BlY3RTdHJpbmciLCJiaWdJbnRTdHIiLCJtYXhEZXB0aCIsImdldEluZGVudCIsImluc3BlY3QiLCJmcm9tIiwibm9JbmRlbnQiLCJuZXdPcHRzIiwiaXNSZWdFeHAiLCJuYW1lT2YiLCJhcnJPYmpLZXlzIiwic3ltU3RyaW5nIiwibWFya0JveGVkIiwiaXNFbGVtZW50IiwicyIsIm5vZGVOYW1lIiwiYXR0cnMiLCJhdHRyaWJ1dGVzIiwid3JhcFF1b3RlcyIsImNoaWxkTm9kZXMiLCJ4cyIsInNpbmdsZUxpbmVWYWx1ZXMiLCJpbmRlbnRlZEpvaW4iLCJpc0Vycm9yIiwiY2F1c2UiLCJpc01hcCIsIm1hcFBhcnRzIiwiY29sbGVjdGlvbk9mIiwiaXNTZXQiLCJzZXRQYXJ0cyIsImlzV2Vha01hcCIsIndlYWtDb2xsZWN0aW9uT2YiLCJpc1dlYWtTZXQiLCJpc1dlYWtSZWYiLCJpc051bWJlciIsImlzQmlnSW50IiwiaXNCb29sZWFuIiwiaXNTdHJpbmciLCJpc0RhdGUiLCJ5cyIsImlzUGxhaW5PYmplY3QiLCJwcm90b1RhZyIsInN0cmluZ1RhZyIsImNvbnN0cnVjdG9yVGFnIiwidGFnIiwiZGVmYXVsdFN0eWxlIiwicXVvdGVDaGFyIiwibSIsImwiLCJIVE1MRWxlbWVudCIsImdldEF0dHJpYnV0ZSIsInJlbWFpbmluZyIsInRyYWlsZXIiLCJsb3dieXRlIiwiYyIsIm4iLCJjaGFyQ29kZUF0IiwidHlwZSIsInNpemUiLCJlbnRyaWVzIiwiam9pbmVkRW50cmllcyIsImJhc2VJbmRlbnQiLCJiYXNlIiwicHJldiIsImxpbmVKb2luZXIiLCJpc0FyciIsInN5bU1hcCIsImoiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwiZGVmYXVsdFNldFRpbW91dCIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJydW5UaW1lb3V0IiwiZnVuIiwicnVuQ2xlYXJUaW1lb3V0IiwibWFya2VyIiwicXVldWUiLCJkcmFpbmluZyIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlSW5kZXgiLCJjbGVhblVwTmV4dFRpY2siLCJkcmFpblF1ZXVlIiwidGltZW91dCIsInJ1biIsIm5leHRUaWNrIiwiYXJyYXkiLCJ0aXRsZSIsImJyb3dzZXIiLCJlbnYiLCJhcmd2IiwidmVyc2lvbiIsInZlcnNpb25zIiwibm9vcCIsImFkZExpc3RlbmVyIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImJpbmRpbmciLCJjd2QiLCJjaGRpciIsImRpciIsInVtYXNrIiwicGVyY2VudFR3ZW50aWVzIiwiRm9ybWF0IiwiUkZDMTczOCIsIlJGQzM5ODYiLCJmb3JtYXR0ZXJzIiwicGFyc2UiLCJmb3JtYXRzIiwidXRpbHMiLCJkZWZhdWx0cyIsImFsbG93RG90cyIsImFsbG93UHJvdG90eXBlcyIsImFsbG93U3BhcnNlIiwiYXJyYXlMaW1pdCIsImNoYXJzZXQiLCJjaGFyc2V0U2VudGluZWwiLCJjb21tYSIsImRlY29kZXIiLCJkZWNvZGUiLCJkZWxpbWl0ZXIiLCJpZ25vcmVRdWVyeVByZWZpeCIsImludGVycHJldE51bWVyaWNFbnRpdGllcyIsInBhcmFtZXRlckxpbWl0IiwicGFyc2VBcnJheXMiLCJwbGFpbk9iamVjdHMiLCJzdHJpY3ROdWxsSGFuZGxpbmciLCIkMCIsIm51bWJlclN0ciIsImZyb21DaGFyQ29kZSIsInBhcnNlQXJyYXlWYWx1ZSIsImlzb1NlbnRpbmVsIiwicGFyc2VWYWx1ZXMiLCJwYXJzZVF1ZXJ5U3RyaW5nVmFsdWVzIiwiY2xlYW5TdHIiLCJsaW1pdCIsInNraXBJbmRleCIsImJyYWNrZXRFcXVhbHNQb3MiLCJwb3MiLCJtYXliZU1hcCIsImVuY29kZWRWYWwiLCJjb21iaW5lIiwicGFyc2VPYmplY3QiLCJ2YWx1ZXNQYXJzZWQiLCJsZWFmIiwicm9vdCIsImNyZWF0ZSIsImNsZWFuUm9vdCIsImNoYXJBdCIsImluZGV4IiwicGFyc2VLZXlzIiwicGFyc2VRdWVyeVN0cmluZ0tleXMiLCJnaXZlbktleSIsImJyYWNrZXRzIiwiY2hpbGQiLCJzZWdtZW50Iiwibm9ybWFsaXplUGFyc2VPcHRpb25zIiwidGVtcE9iaiIsIm5ld09iaiIsIm1lcmdlIiwiY29tcGFjdCIsImdldFNpZGVDaGFubmVsIiwiYXJyYXlQcmVmaXhHZW5lcmF0b3JzIiwicHJlZml4IiwiaW5kaWNlcyIsInJlcGVhdCIsInB1c2hUb0FycmF5IiwidmFsdWVPckFycmF5IiwidG9JU08iLCJ0b0lTT1N0cmluZyIsImRlZmF1bHRGb3JtYXQiLCJhZGRRdWVyeVByZWZpeCIsImVuY29kZSIsImVuY29kZXIiLCJlbmNvZGVWYWx1ZXNPbmx5IiwiZm9ybWF0IiwiZm9ybWF0dGVyIiwic2VyaWFsaXplRGF0ZSIsImRhdGUiLCJza2lwTnVsbHMiLCJpc05vbk51bGxpc2hQcmltaXRpdmUiLCJzZW50aW5lbCIsIm9iamVjdCIsImdlbmVyYXRlQXJyYXlQcmVmaXgiLCJmaWx0ZXIiLCJzaWRlQ2hhbm5lbCIsInRtcFNjIiwic3RlcCIsImZpbmRGbGFnIiwiaXNCdWZmZXIiLCJrZXlWYWx1ZSIsInZhbHVlc0FycmF5IiwidmFsdWVzSm9pbmVkIiwidmFsdWVzIiwib2JqS2V5cyIsImFkanVzdGVkUHJlZml4Iiwia2V5UHJlZml4Iiwic2V0IiwidmFsdWVTaWRlQ2hhbm5lbCIsIm5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMiLCJhcnJheUZvcm1hdCIsImpvaW5lZCIsImhleFRhYmxlIiwiY29tcGFjdFF1ZXVlIiwicHJvcCIsImNvbXBhY3RlZCIsImFycmF5VG9PYmplY3QiLCJzb3VyY2UiLCJtZXJnZVRhcmdldCIsInRhcmdldEl0ZW0iLCJyZWR1Y2UiLCJhY2MiLCJhc3NpZ24iLCJhc3NpZ25TaW5nbGVTb3VyY2UiLCJzdHJXaXRob3V0UGx1cyIsInVuZXNjYXBlIiwiZGVmYXVsdEVuY29kZXIiLCJraW5kIiwiZXNjYXBlIiwib3V0IiwicmVmcyIsIm1hcHBlZCIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwicmVnaXN0ZXJJbW1lZGlhdGUiLCJ0YXNrIiwiY2xlYXJJbW1lZGlhdGUiLCJoYW5kbGUiLCJydW5JZlByZXNlbnQiLCJpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbiIsImNhblVzZVBvc3RNZXNzYWdlIiwicG9zdE1lc3NhZ2UiLCJwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzIiwib2xkT25NZXNzYWdlIiwib25tZXNzYWdlIiwiaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24iLCJtZXNzYWdlUHJlZml4IiwicmFuZG9tIiwib25HbG9iYWxNZXNzYWdlIiwiZGF0YSIsImF0dGFjaEV2ZW50IiwiaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24iLCJjaGFubmVsIiwiTWVzc2FnZUNoYW5uZWwiLCJwb3J0MSIsInBvcnQyIiwiaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbiIsImh0bWwiLCJkb2N1bWVudEVsZW1lbnQiLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24iLCJhdHRhY2hUbyIsImNhbGxCb3VuZCIsIiRXZWFrTWFwIiwiJE1hcCIsIiR3ZWFrTWFwR2V0IiwiJHdlYWtNYXBTZXQiLCIkd2Vha01hcEhhcyIsIiRtYXBHZXQiLCIkbWFwU2V0IiwiJG1hcEhhcyIsImxpc3RHZXROb2RlIiwibGlzdCIsImN1cnIiLCJsaXN0R2V0Iiwib2JqZWN0cyIsIm5vZGUiLCJsaXN0U2V0IiwibGlzdEhhcyIsIiR3bSIsIiRtIiwiJG8iLCJhc3NlcnQiLCJBZ2VudCIsImNvbnNvbGUiLCJzYWZlU3RyaW5naWZ5IiwicXMiLCJSZXF1ZXN0QmFzZSIsIlJlc3BvbnNlQmFzZSIsInRyaW0iLCJpc09iamVjdCIsInBhaXJzIiwicHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIiLCJzdHJpbmdfIiwibGVuZ3RoXyIsInBhaXIiLCJqc29uIiwieG1sIiwidXJsZW5jb2RlZCIsImZvcm0iLCJsaW5lcyIsImZpZWxkcyIsImxpbmUiLCJmaWVsZCIsInN0YXR1cyIsInBhcnNlSGVhZGVyIiwicmVxdWVzdF8iLCJSZXNwb25zZSIsImlzSlNPTiIsIm1lc3NhZ2UiLCJlcnJvciIsIm5ld19lcnJvciIsIlJlcXVlc3QiLCJwYXNzIiwiYnRvYSIsInNlcmlhbGl6ZSIsInhociIsInJlYWR5U3RhdGUiLCJoYW5kbGVQcm9ncmVzcyIsImNvbnRlbnRUeXBlIiwic2VtdmVyIiwiRVJST1JfQ09ERVMiLCJTVEFUVVNfQ09ERVMiLCJvdmVycmlkZSIsImJhc2U2NEVuY29kZXIiLCJ1cmwiLCJoZWFkZXJzIiwiX2hlYWRlciIsImlzT2JqZWN0XyIsInF1ZXJ5IiwicXVlcnlBcnJheSIsInJlYXNvbiIsImN0IiwiaGVhZGVyIiwicGFyYW1ldGVycyIsInJlbCIsInNjb3BlIiwiVGltZW91dCIsInNldEludGVydmFsIiwiY2xlYXJJbnRlcnZhbCIsImNsb3NlIiwiaWQiLCJjbGVhckZuIiwiX2lkIiwiX2NsZWFyRm4iLCJ1bnJlZiIsInJlZiIsImVucm9sbCIsIm1zZWNzIiwiX2lkbGVUaW1lb3V0SWQiLCJfaWRsZVRpbWVvdXQiLCJ1bmVucm9sbCIsIl91bnJlZkFjdGl2ZSIsImFjdGl2ZSIsIm9uVGltZW91dCIsIl9vblRpbWVvdXQiLCJnIl0sIm1hcHBpbmdzIjoiOztRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FB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b250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vaW5kZXguanNcIik7XG4iLCIvKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IEplcmVteSBXaGl0bG9ja1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3VwcG9ydGVkTG9hZGVycyA9IHtcbiAgZmlsZTogcmVxdWlyZSgnLi9saWIvbG9hZGVycy9maWxlJyksXG4gIGh0dHA6IHJlcXVpcmUoJy4vbGliL2xvYWRlcnMvaHR0cCcpLFxuICBodHRwczogcmVxdWlyZSgnLi9saWIvbG9hZGVycy9odHRwJylcbn07XG52YXIgZGVmYXVsdExvYWRlciA9IHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAnZnVuY3Rpb24nID9cbiAgICAgIHN1cHBvcnRlZExvYWRlcnMuaHR0cCA6XG4gICAgICBzdXBwb3J0ZWRMb2FkZXJzLmZpbGU7XG5cbi8vIExvYWQgcHJvbWlzZXMgcG9seWZpbGwgaWYgbmVjZXNzYXJ5XG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmICh0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgcmVxdWlyZSgnbmF0aXZlLXByb21pc2Utb25seScpO1xufVxuXG5mdW5jdGlvbiBnZXRTY2hlbWUgKGxvY2F0aW9uKSB7XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbG9jYXRpb24gPSBsb2NhdGlvbi5pbmRleE9mKCc6Ly8nKSA9PT0gLTEgPyAnJyA6IGxvY2F0aW9uLnNwbGl0KCc6Ly8nKVswXTtcbiAgfVxuXG4gIHJldHVybiBsb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHRoYXQgcHJvdmlkZXMgYSBzaW5nbGUgQVBJIGZvciBsb2FkaW5nIHRoZSBjb250ZW50IG9mIGEgcGF0aC9VUkwuXG4gKlxuICogQG1vZHVsZSBwYXRoLWxvYWRlclxuICovXG5cbmZ1bmN0aW9uIGdldExvYWRlciAobG9jYXRpb24pIHtcbiAgdmFyIHNjaGVtZSA9IGdldFNjaGVtZShsb2NhdGlvbik7XG4gIHZhciBsb2FkZXIgPSBzdXBwb3J0ZWRMb2FkZXJzW3NjaGVtZV07XG5cbiAgaWYgKHR5cGVvZiBsb2FkZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHNjaGVtZSA9PT0gJycpIHtcbiAgICAgIGxvYWRlciA9IGRlZmF1bHRMb2FkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgc2NoZW1lOiAnICsgc2NoZW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbG9hZGVyO1xufVxuXG4vKipcbiAqIExvYWRzIGEgZG9jdW1lbnQgYXQgdGhlIHByb3ZpZGVkIGxvY2F0aW9uIGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIC0gVGhlIGxvY2F0aW9uIHRvIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIHttb2R1bGU6cGF0aC1sb2FkZXIuTG9hZE9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBsb2FkZXIgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fSBBbHdheXMgcmV0dXJucyBhIHByb21pc2UgZXZlbiBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrIHByb3ZpZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdXNpbmcgUHJvbWlzZXNcbiAqXG4gKiBQYXRoTG9hZGVyXG4gKiAgIC5sb2FkKCcuL3BhY2thZ2UuanNvbicpXG4gKiAgIC50aGVuKEpTT04ucGFyc2UpXG4gKiAgIC50aGVuKGZ1bmN0aW9uIChkb2N1bWVudCkge1xuICogICAgIGNvbnNvbGUubG9nKGRvY3VtZW50Lm5hbWUgKyAnICgnICsgZG9jdW1lbnQudmVyc2lvbiArICcpOiAnICsgZG9jdW1lbnQuZGVzY3JpcHRpb24pO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2luZyBvcHRpb25zLnByZXBhcmVSZXF1ZXN0IHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gZGV0YWlscyBmb3IgYSByZW1vdGVseSBzZWN1cmUgVVJMXG4gKlxuICogUGF0aExvYWRlclxuICogICAubG9hZCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy93aGl0bG9ja2pjL3BhdGgtbG9hZGVyJywge1xuICogICAgIHByZXBhcmVSZXF1ZXN0OiBmdW5jdGlvbiAocmVxLCBjYWxsYmFjaykge1xuICogICAgICAgcmVxLmF1dGgoJ215LXVzZXJuYW1lJywgJ215LXBhc3N3b3JkJyk7XG4gKiAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIHJlcSk7XG4gKiAgICAgfVxuICogICB9KVxuICogICAudGhlbihKU09OLnBhcnNlKVxuICogICAudGhlbihmdW5jdGlvbiAoZG9jdW1lbnQpIHtcbiAqICAgICBjb25zb2xlLmxvZyhkb2N1bWVudC5mdWxsX25hbWUgKyAnOiAnICsgZG9jdW1lbnQuZGVzY3JpcHRpb24pO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBsb2FkaW5nIGEgWUFNTCBmaWxlXG4gKlxuICogUGF0aExvYWRlclxuICogICAubG9hZCgnL1VzZXJzL25vdC15b3UvcHJvamVjdHMvcGF0aC1sb2FkZXIvLnRyYXZpcy55bWwnKVxuICogICAudGhlbihZQU1MLnNhZmVMb2FkKVxuICogICAudGhlbihmdW5jdGlvbiAoZG9jdW1lbnQpIHtcbiAqICAgICBjb25zb2xlLmxvZygncGF0aC1sb2FkZXIgdXNlcyB0aGUnLCBkb2N1bWVudC5sYW5ndWFnZSwgJ2xhbmd1YWdlLicpO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBsb2FkaW5nIGEgWUFNTCBmaWxlIHdpdGggb3B0aW9ucy5wcm9jZXNzQ29udGVudCAoVXNlZnVsIGlmIHlvdSBuZWVkIGluZm9ybWF0aW9uIGluIHRoZSByYXcgcmVzcG9uc2UpXG4gKlxuICogUGF0aExvYWRlclxuICogICAubG9hZCgnL1VzZXJzL25vdC15b3UvcHJvamVjdHMvcGF0aC1sb2FkZXIvLnRyYXZpcy55bWwnLCB7XG4gKiAgICAgcHJvY2Vzc0NvbnRlbnQ6IGZ1bmN0aW9uIChyZXMsIGNhbGxiYWNrKSB7XG4gKiAgICAgICBjYWxsYmFjayhZQU1MLnNhZmVMb2FkKHJlcy50ZXh0KSk7XG4gKiAgICAgfVxuICogICB9KVxuICogICAudGhlbihmdW5jdGlvbiAoZG9jdW1lbnQpIHtcbiAqICAgICBjb25zb2xlLmxvZygncGF0aC1sb2FkZXIgdXNlcyB0aGUnLCBkb2N1bWVudC5sYW5ndWFnZSwgJ2xhbmd1YWdlLicpO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqL1xubW9kdWxlLmV4cG9ydHMubG9hZCA9IGZ1bmN0aW9uIChsb2NhdGlvbiwgb3B0aW9ucykge1xuICB2YXIgYWxsVGFza3MgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvLyBEZWZhdWx0IG9wdGlvbnMgdG8gZW1wdHkgb2JqZWN0XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBhcmd1bWVudHNcbiAgYWxsVGFza3MgPSBhbGxUYXNrcy50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbG9jYXRpb24gaXMgcmVxdWlyZWQnKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xvY2F0aW9uIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucHJvY2Vzc0NvbnRlbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLnByb2Nlc3NDb250ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMucHJvY2Vzc0NvbnRlbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBMb2FkIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBwcm92aWRlZCBsb2NhdGlvbiBhbmQgcHJvY2VzcyBpdFxuICBhbGxUYXNrcyA9IGFsbFRhc2tzXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGxvYWRlciA9IGdldExvYWRlcihsb2NhdGlvbik7XG5cbiAgICAgICAgbG9hZGVyLmxvYWQobG9jYXRpb24sIG9wdGlvbnMgfHwge30sIGZ1bmN0aW9uIChlcnIsIGRvY3VtZW50KSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoZG9jdW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NDb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgLy8gRm9yIGNvbnNpc3RlbmN5IGJldHdlZW4gZmlsZSBhbmQgaHR0cCwgYWx3YXlzIHNlbmQgYW4gb2JqZWN0IHdpdGggYSAndGV4dCcgcHJvcGVydHkgY29udGFpbmluZyB0aGUgcmF3XG4gICAgICAgICAgLy8gc3RyaW5nIHZhbHVlIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgICAgICBpZiAodHlwZW9mIHJlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJlcyA9IHt0ZXh0OiByZXN9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFBhc3MgdGhlIHBhdGggYmVpbmcgbG9hZGVkXG4gICAgICAgICAgcmVzLmxvY2F0aW9uID0gbG9jYXRpb247XG5cbiAgICAgICAgICBvcHRpb25zLnByb2Nlc3NDb250ZW50KHJlcywgZnVuY3Rpb24gKGVyciwgcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBubyBjb250ZW50IHByb2Nlc3Nvciwgd2Ugd2lsbCBhc3N1bWUgdGhhdCBmb3IgYWxsIG9iamVjdHMgdGhhdCBpdCBpcyBhIFN1cGVyYWdlbnQgcmVzcG9uc2VcbiAgICAgICAgLy8gYW5kIHdpbGwgcmV0dXJuIGl0cyBgdGV4dGAgcHJvcGVydHkgdmFsdWUuICBPdGhlcndpc2UsIHdlIHdpbGwgcmV0dXJuIHRoZSByYXcgcmVzcG9uc2UuXG4gICAgICAgIHJldHVybiB0eXBlb2YgcmVzID09PSAnb2JqZWN0JyA/IHJlcy50ZXh0IDogcmVzO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiBhbGxUYXNrcztcbn07XG4iLCIvKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IEplcmVteSBXaGl0bG9ja1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdW5zdXBwb3J0ZWRFcnJvciA9IG5ldyBUeXBlRXJyb3IoJ1RoZSBcXCdmaWxlXFwnIHNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyJyk7XG5cbi8qKlxuICogVGhlIGZpbGUgbG9hZGVyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IHRoZSBmaWxlIGxvYWRlciBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyXG4gKi9cbm1vZHVsZS5leHBvcnRzLmdldEJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IHVuc3VwcG9ydGVkRXJyb3I7XG59O1xuXG4vKipcbiAqIFRoZSBmaWxlIGxvYWRlciBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyLlxuICovXG5tb2R1bGUuZXhwb3J0cy5sb2FkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZm4gPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbih1bnN1cHBvcnRlZEVycm9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyB1bnN1cHBvcnRlZEVycm9yO1xuICB9XG59O1xuIiwiLyogZXNsaW50LWVudiBub2RlLCBicm93c2VyICovXG5cbi8qXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgSmVyZW15IFdoaXRsb2NrXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciByZXF1ZXN0ID0gcmVxdWlyZSgnc3VwZXJhZ2VudCcpO1xuXG52YXIgc3VwcG9ydGVkSHR0cE1ldGhvZHMgPSBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwYXRjaCcsICdwb3N0JywgJ3B1dCddO1xuXG4vKipcbiAqIExvYWRzIGEgZmlsZSBmcm9tIGFuIGh0dHAgb3IgaHR0cHMgVVJMLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiAtIFRoZSBkb2N1bWVudCBVUkwgKElmIHJlbGF0aXZlLCBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB3aW5kb3cubG9jYXRpb24ub3JpZ2luKS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gVGhlIGxvYWRlciBvcHRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWV0aG9kPWdldF0gLSBUaGUgSFRUUCBtZXRob2QgdG8gdXNlIGZvciB0aGUgcmVxdWVzdFxuICogQHBhcmFtIHttb2R1bGU6UGF0aExvYWRlcn5QcmVwYXJlUmVxdWVzdENhbGxiYWNrfSBbb3B0aW9ucy5wcmVwYXJlUmVxdWVzdF0gLSBUaGUgY2FsbGJhY2sgdXNlZCB0byBwcmVwYXJlIGEgcmVxdWVzdFxuICogQHBhcmFtIHttb2R1bGU6UGF0aExvYWRlcn5Qcm9jZXNzUmVzcG9uc2VDYWxsYmFja30gW29wdGlvbnMucHJvY2Vzc0NvbnRlbnRdIC0gVGhlIGNhbGxiYWNrIHVzZWQgdG8gcHJvY2VzcyB0aGVcbiAqIHJlc3BvbnNlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBlcnJvci1maXJzdCBjYWxsYmFja1xuICovXG5tb2R1bGUuZXhwb3J0cy5sb2FkID0gZnVuY3Rpb24gKGxvY2F0aW9uLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgcmVhbE1ldGhvZCA9IG9wdGlvbnMubWV0aG9kID8gb3B0aW9ucy5tZXRob2QudG9Mb3dlckNhc2UoKSA6ICdnZXQnO1xuICB2YXIgZXJyO1xuICB2YXIgcmVhbFJlcXVlc3Q7XG5cbiAgZnVuY3Rpb24gbWFrZVJlcXVlc3QgKGVyciwgcmVxKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYnVmZmVyKCkgaXMgb25seSBhdmFpbGFibGUgaW4gTm9kZS5qc1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzIDogMCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJyAmJlxuICAgICAgICAgIHR5cGVvZiByZXEuYnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlcS5idWZmZXIodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJlcVxuICAgICAgICAuZW5kKGZ1bmN0aW9uIChlcnIyLCByZXMpIHtcbiAgICAgICAgICBpZiAoZXJyMikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyMik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgcmVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5tZXRob2QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm1ldGhvZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVyciA9IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMubWV0aG9kIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRlZEh0dHBNZXRob2RzLmluZGV4T2Yob3B0aW9ucy5tZXRob2QpID09PSAtMSkge1xuICAgICAgZXJyID0gbmV3IFR5cGVFcnJvcignb3B0aW9ucy5tZXRob2QgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogJyArXG4gICAgICAgIHN1cHBvcnRlZEh0dHBNZXRob2RzLnNsaWNlKDAsIHN1cHBvcnRlZEh0dHBNZXRob2RzLmxlbmd0aCAtIDEpLmpvaW4oJywgJykgKyAnIG9yICcgK1xuICAgICAgICBzdXBwb3J0ZWRIdHRwTWV0aG9kc1tzdXBwb3J0ZWRIdHRwTWV0aG9kcy5sZW5ndGggLSAxXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnByZXBhcmVSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5wcmVwYXJlUmVxdWVzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVyciA9IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMucHJlcGFyZVJlcXVlc3QgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAoIWVycikge1xuICAgIHJlYWxSZXF1ZXN0ID0gcmVxdWVzdFtyZWFsTWV0aG9kID09PSAnZGVsZXRlJyA/ICdkZWwnIDogcmVhbE1ldGhvZF0obG9jYXRpb24pO1xuXG4gICAgaWYgKG9wdGlvbnMucHJlcGFyZVJlcXVlc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMucHJlcGFyZVJlcXVlc3QocmVhbFJlcXVlc3QsIG1ha2VSZXF1ZXN0KTtcbiAgICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ha2VSZXF1ZXN0KHVuZGVmaW5lZCwgcmVhbFJlcXVlc3QpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRhcHBseSA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUnKTtcbnZhciAkY2FsbCA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJScpO1xudmFyICRyZWZsZWN0QXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVSZWZsZWN0LmFwcGx5JScsIHRydWUpIHx8IGJpbmQuY2FsbCgkY2FsbCwgJGFwcGx5KTtcblxudmFyICRnT1BEID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnLCB0cnVlKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZGVmaW5lUHJvcGVydHklJywgdHJ1ZSk7XG52YXIgJG1heCA9IEdldEludHJpbnNpYygnJU1hdGgubWF4JScpO1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IG51bGw7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZChvcmlnaW5hbEZ1bmN0aW9uKSB7XG5cdHZhciBmdW5jID0gJHJlZmxlY3RBcHBseShiaW5kLCAkY2FsbCwgYXJndW1lbnRzKTtcblx0aWYgKCRnT1BEICYmICRkZWZpbmVQcm9wZXJ0eSkge1xuXHRcdHZhciBkZXNjID0gJGdPUEQoZnVuYywgJ2xlbmd0aCcpO1xuXHRcdGlmIChkZXNjLmNvbmZpZ3VyYWJsZSkge1xuXHRcdFx0Ly8gb3JpZ2luYWwgbGVuZ3RoLCBwbHVzIHRoZSByZWNlaXZlciwgbWludXMgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIChhZnRlciB0aGUgcmVjZWl2ZXIpXG5cdFx0XHQkZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdGZ1bmMsXG5cdFx0XHRcdCdsZW5ndGgnLFxuXHRcdFx0XHR7IHZhbHVlOiAxICsgJG1heCgwLCBvcmlnaW5hbEZ1bmN0aW9uLmxlbmd0aCAtIChhcmd1bWVudHMubGVuZ3RoIC0gMSkpIH1cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmdW5jO1xufTtcblxudmFyIGFwcGx5QmluZCA9IGZ1bmN0aW9uIGFwcGx5QmluZCgpIHtcblx0cmV0dXJuICRyZWZsZWN0QXBwbHkoYmluZCwgJGFwcGx5LCBhcmd1bWVudHMpO1xufTtcblxuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHQkZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdhcHBseScsIHsgdmFsdWU6IGFwcGx5QmluZCB9KTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzLmFwcGx5ID0gYXBwbHlCaW5kO1xufVxuIiwiXHJcbi8qKlxyXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxyXG4gKi9cclxuXHJcbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xyXG4gIG1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxyXG4gKlxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XHJcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XHJcbn07XHJcblxyXG4vKipcclxuICogTWl4aW4gdGhlIGVtaXR0ZXIgcHJvcGVydGllcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IG9ialxyXG4gKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAqIEBhcGkgcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1peGluKG9iaikge1xyXG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xyXG4gICAgb2JqW2tleV0gPSBFbWl0dGVyLnByb3RvdHlwZVtrZXldO1xyXG4gIH1cclxuICByZXR1cm4gb2JqO1xyXG59XHJcblxyXG4vKipcclxuICogTGlzdGVuIG9uIHRoZSBnaXZlbiBgZXZlbnRgIHdpdGggYGZuYC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub24gPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxyXG4gICAgLnB1c2goZm4pO1xyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxyXG4gKiB0aW1lIHRoZW4gYXV0b21hdGljYWxseSByZW1vdmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICBmdW5jdGlvbiBvbigpIHtcclxuICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XHJcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gIH1cclxuXHJcbiAgb24uZm4gPSBmbjtcclxuICB0aGlzLm9uKGV2ZW50LCBvbik7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcclxuICogcmVnaXN0ZXJlZCBjYWxsYmFja3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG5cclxuICAvLyBhbGxcclxuICBpZiAoMCA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gc3BlY2lmaWMgZXZlbnRcclxuICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XHJcblxyXG4gIC8vIHJlbW92ZSBhbGwgaGFuZGxlcnNcclxuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXJcclxuICB2YXIgY2I7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIGNiID0gY2FsbGJhY2tzW2ldO1xyXG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcclxuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZW1vdmUgZXZlbnQgc3BlY2lmaWMgYXJyYXlzIGZvciBldmVudCB0eXBlcyB0aGF0IG5vXHJcbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxyXG4gIGlmIChjYWxsYmFja3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICB9XHJcblxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtNaXhlZH0gLi4uXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcblxyXG4gIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKVxyXG4gICAgLCBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG5cclxuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XHJcbiAgfVxyXG5cclxuICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgIGNhbGxiYWNrc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcmV0dXJuIHtBcnJheX1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoaXMgZW1pdHRlciBoYXMgYGV2ZW50YCBoYW5kbGVycy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xyXG59O1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHN0cmluZ2lmeVxuc3RyaW5naWZ5LmRlZmF1bHQgPSBzdHJpbmdpZnlcbnN0cmluZ2lmeS5zdGFibGUgPSBkZXRlcm1pbmlzdGljU3RyaW5naWZ5XG5zdHJpbmdpZnkuc3RhYmxlU3RyaW5naWZ5ID0gZGV0ZXJtaW5pc3RpY1N0cmluZ2lmeVxuXG52YXIgTElNSVRfUkVQTEFDRV9OT0RFID0gJ1suLi5dJ1xudmFyIENJUkNVTEFSX1JFUExBQ0VfTk9ERSA9ICdbQ2lyY3VsYXJdJ1xuXG52YXIgYXJyID0gW11cbnZhciByZXBsYWNlclN0YWNrID0gW11cblxuZnVuY3Rpb24gZGVmYXVsdE9wdGlvbnMgKCkge1xuICByZXR1cm4ge1xuICAgIGRlcHRoTGltaXQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgIGVkZ2VzTGltaXQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gIH1cbn1cblxuLy8gUmVndWxhciBzdHJpbmdpZnlcbmZ1bmN0aW9uIHN0cmluZ2lmeSAob2JqLCByZXBsYWNlciwgc3BhY2VyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnMoKVxuICB9XG5cbiAgZGVjaXJjKG9iaiwgJycsIDAsIFtdLCB1bmRlZmluZWQsIDAsIG9wdGlvbnMpXG4gIHZhciByZXNcbiAgdHJ5IHtcbiAgICBpZiAocmVwbGFjZXJTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlcyA9IEpTT04uc3RyaW5naWZ5KG9iaiwgcmVwbGFjZXIsIHNwYWNlcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlR2V0dGVyVmFsdWVzKHJlcGxhY2VyKSwgc3BhY2VyKVxuICAgIH1cbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSgnW3VuYWJsZSB0byBzZXJpYWxpemUsIGNpcmN1bGFyIHJlZmVyZW5jZSBpcyB0b28gY29tcGxleCB0byBhbmFseXplXScpXG4gIH0gZmluYWxseSB7XG4gICAgd2hpbGUgKGFyci5sZW5ndGggIT09IDApIHtcbiAgICAgIHZhciBwYXJ0ID0gYXJyLnBvcCgpXG4gICAgICBpZiAocGFydC5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcnRbMF0sIHBhcnRbMV0sIHBhcnRbM10pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0WzBdW3BhcnRbMV1dID0gcGFydFsyXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIHNldFJlcGxhY2UgKHJlcGxhY2UsIHZhbCwgaywgcGFyZW50KSB7XG4gIHZhciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHBhcmVudCwgaylcbiAgaWYgKHByb3BlcnR5RGVzY3JpcHRvci5nZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyZW50LCBrLCB7IHZhbHVlOiByZXBsYWNlIH0pXG4gICAgICBhcnIucHVzaChbcGFyZW50LCBrLCB2YWwsIHByb3BlcnR5RGVzY3JpcHRvcl0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcGxhY2VyU3RhY2sucHVzaChbdmFsLCBrLCByZXBsYWNlXSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50W2tdID0gcmVwbGFjZVxuICAgIGFyci5wdXNoKFtwYXJlbnQsIGssIHZhbF0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjaXJjICh2YWwsIGssIGVkZ2VJbmRleCwgc3RhY2ssIHBhcmVudCwgZGVwdGgsIG9wdGlvbnMpIHtcbiAgZGVwdGggKz0gMVxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoc3RhY2tbaV0gPT09IHZhbCkge1xuICAgICAgICBzZXRSZXBsYWNlKENJUkNVTEFSX1JFUExBQ0VfTk9ERSwgdmFsLCBrLCBwYXJlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBvcHRpb25zLmRlcHRoTGltaXQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBkZXB0aCA+IG9wdGlvbnMuZGVwdGhMaW1pdFxuICAgICkge1xuICAgICAgc2V0UmVwbGFjZShMSU1JVF9SRVBMQUNFX05PREUsIHZhbCwgaywgcGFyZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdGlvbnMuZWRnZXNMaW1pdCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIGVkZ2VJbmRleCArIDEgPiBvcHRpb25zLmVkZ2VzTGltaXRcbiAgICApIHtcbiAgICAgIHNldFJlcGxhY2UoTElNSVRfUkVQTEFDRV9OT0RFLCB2YWwsIGssIHBhcmVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsKVxuICAgIC8vIE9wdGltaXplIGZvciBBcnJheXMuIEJpZyBhcnJheXMgY291bGQga2lsbCB0aGUgcGVyZm9ybWFuY2Ugb3RoZXJ3aXNlIVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGVjaXJjKHZhbFtpXSwgaSwgaSwgc3RhY2ssIHZhbCwgZGVwdGgsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsKVxuICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICAgICAgZGVjaXJjKHZhbFtrZXldLCBrZXksIGksIHN0YWNrLCB2YWwsIGRlcHRoLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgICBzdGFjay5wb3AoKVxuICB9XG59XG5cbi8vIFN0YWJsZS1zdHJpbmdpZnlcbmZ1bmN0aW9uIGNvbXBhcmVGdW5jdGlvbiAoYSwgYikge1xuICBpZiAoYSA8IGIpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiAwXG59XG5cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNTdHJpbmdpZnkgKG9iaiwgcmVwbGFjZXIsIHNwYWNlciwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zKClcbiAgfVxuXG4gIHZhciB0bXAgPSBkZXRlcm1pbmlzdGljRGVjaXJjKG9iaiwgJycsIDAsIFtdLCB1bmRlZmluZWQsIDAsIG9wdGlvbnMpIHx8IG9ialxuICB2YXIgcmVzXG4gIHRyeSB7XG4gICAgaWYgKHJlcGxhY2VyU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICByZXMgPSBKU09OLnN0cmluZ2lmeSh0bXAsIHJlcGxhY2VyLCBzcGFjZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IEpTT04uc3RyaW5naWZ5KHRtcCwgcmVwbGFjZUdldHRlclZhbHVlcyhyZXBsYWNlciksIHNwYWNlcilcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoJ1t1bmFibGUgdG8gc2VyaWFsaXplLCBjaXJjdWxhciByZWZlcmVuY2UgaXMgdG9vIGNvbXBsZXggdG8gYW5hbHl6ZV0nKVxuICB9IGZpbmFsbHkge1xuICAgIC8vIEVuc3VyZSB0aGF0IHdlIHJlc3RvcmUgdGhlIG9iamVjdCBhcyBpdCB3YXMuXG4gICAgd2hpbGUgKGFyci5sZW5ndGggIT09IDApIHtcbiAgICAgIHZhciBwYXJ0ID0gYXJyLnBvcCgpXG4gICAgICBpZiAocGFydC5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcnRbMF0sIHBhcnRbMV0sIHBhcnRbM10pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0WzBdW3BhcnRbMV1dID0gcGFydFsyXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNEZWNpcmMgKHZhbCwgaywgZWRnZUluZGV4LCBzdGFjaywgcGFyZW50LCBkZXB0aCwgb3B0aW9ucykge1xuICBkZXB0aCArPSAxXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzdGFja1tpXSA9PT0gdmFsKSB7XG4gICAgICAgIHNldFJlcGxhY2UoQ0lSQ1VMQVJfUkVQTEFDRV9OT0RFLCB2YWwsIGssIHBhcmVudClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHZhbC50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdGlvbnMuZGVwdGhMaW1pdCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIGRlcHRoID4gb3B0aW9ucy5kZXB0aExpbWl0XG4gICAgKSB7XG4gICAgICBzZXRSZXBsYWNlKExJTUlUX1JFUExBQ0VfTk9ERSwgdmFsLCBrLCBwYXJlbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5lZGdlc0xpbWl0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgZWRnZUluZGV4ICsgMSA+IG9wdGlvbnMuZWRnZXNMaW1pdFxuICAgICkge1xuICAgICAgc2V0UmVwbGFjZShMSU1JVF9SRVBMQUNFX05PREUsIHZhbCwgaywgcGFyZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWwpXG4gICAgLy8gT3B0aW1pemUgZm9yIEFycmF5cy4gQmlnIGFycmF5cyBjb3VsZCBraWxsIHRoZSBwZXJmb3JtYW5jZSBvdGhlcndpc2UhXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBkZXRlcm1pbmlzdGljRGVjaXJjKHZhbFtpXSwgaSwgaSwgc3RhY2ssIHZhbCwgZGVwdGgsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBvYmplY3QgaW4gdGhlIHJlcXVpcmVkIHdheVxuICAgICAgdmFyIHRtcCA9IHt9XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbCkuc29ydChjb21wYXJlRnVuY3Rpb24pXG4gICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXVxuICAgICAgICBkZXRlcm1pbmlzdGljRGVjaXJjKHZhbFtrZXldLCBrZXksIGksIHN0YWNrLCB2YWwsIGRlcHRoLCBvcHRpb25zKVxuICAgICAgICB0bXBba2V5XSA9IHZhbFtrZXldXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHBhcmVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgYXJyLnB1c2goW3BhcmVudCwgaywgdmFsXSlcbiAgICAgICAgcGFyZW50W2tdID0gdG1wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG1wXG4gICAgICB9XG4gICAgfVxuICAgIHN0YWNrLnBvcCgpXG4gIH1cbn1cblxuLy8gd3JhcHMgcmVwbGFjZXIgZnVuY3Rpb24gdG8gaGFuZGxlIHZhbHVlcyB3ZSBjb3VsZG4ndCByZXBsYWNlXG4vLyBhbmQgbWFyayB0aGVtIGFzIHJlcGxhY2VkIHZhbHVlXG5mdW5jdGlvbiByZXBsYWNlR2V0dGVyVmFsdWVzIChyZXBsYWNlcikge1xuICByZXBsYWNlciA9XG4gICAgdHlwZW9mIHJlcGxhY2VyICE9PSAndW5kZWZpbmVkJ1xuICAgICAgPyByZXBsYWNlclxuICAgICAgOiBmdW5jdGlvbiAoaywgdikge1xuICAgICAgICByZXR1cm4gdlxuICAgICAgfVxuICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gICAgaWYgKHJlcGxhY2VyU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBsYWNlclN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gcmVwbGFjZXJTdGFja1tpXVxuICAgICAgICBpZiAocGFydFsxXSA9PT0ga2V5ICYmIHBhcnRbMF0gPT09IHZhbCkge1xuICAgICAgICAgIHZhbCA9IHBhcnRbMl1cbiAgICAgICAgICByZXBsYWNlclN0YWNrLnNwbGljZShpLCAxKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWwpXG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdW5kZWZpbmVkO1xuXG52YXIgJFN5bnRheEVycm9yID0gU3ludGF4RXJyb3I7XG52YXIgJEZ1bmN0aW9uID0gRnVuY3Rpb247XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgZ2V0RXZhbGxlZENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKGV4cHJlc3Npb25TeW50YXgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gJEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjsgcmV0dXJuICgnICsgZXhwcmVzc2lvblN5bnRheCArICcpLmNvbnN0cnVjdG9yOycpKCk7XG5cdH0gY2F0Y2ggKGUpIHt9XG59O1xuXG52YXIgJGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuaWYgKCRnT1BEKSB7XG5cdHRyeSB7XG5cdFx0JGdPUEQoe30sICcnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdCRnT1BEID0gbnVsbDsgLy8gdGhpcyBpcyBJRSA4LCB3aGljaCBoYXMgYSBicm9rZW4gZ09QRFxuXHR9XG59XG5cbnZhciB0aHJvd1R5cGVFcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoKTtcbn07XG52YXIgVGhyb3dUeXBlRXJyb3IgPSAkZ09QRFxuXHQ/IChmdW5jdGlvbiAoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMsIG5vLWNhbGxlciwgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG5cdFx0XHRhcmd1bWVudHMuY2FsbGVlOyAvLyBJRSA4IGRvZXMgbm90IHRocm93IGhlcmVcblx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHR9IGNhdGNoIChjYWxsZWVUaHJvd3MpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIElFIDggdGhyb3dzIG9uIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXJndW1lbnRzLCAnJylcblx0XHRcdFx0cmV0dXJuICRnT1BEKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDtcblx0XHRcdH0gY2F0Y2ggKGdPUER0aHJvd3MpIHtcblx0XHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fSgpKVxuXHQ6IHRocm93VHlwZUVycm9yO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Ll9fcHJvdG9fXzsgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG5cbnZhciBJTlRSSU5TSUNTID0ge1xuXHQnJUFnZ3JlZ2F0ZUVycm9yJSc6IHR5cGVvZiBBZ2dyZWdhdGVFcnJvciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBZ2dyZWdhdGVFcnJvcixcblx0JyVBcnJheSUnOiBBcnJheSxcblx0JyVBcnJheUJ1ZmZlciUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXJyYXlCdWZmZXIsXG5cdCclQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IG5lZWRzRXZhbCxcblx0JyVBdG9taWNzJSc6IHR5cGVvZiBBdG9taWNzID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEF0b21pY3MsXG5cdCclQmlnSW50JSc6IHR5cGVvZiBCaWdJbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnSW50LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVNYXRoJSc6IE1hdGgsXG5cdCclTnVtYmVyJSc6IE51bWJlcixcblx0JyVPYmplY3QlJzogT2JqZWN0LFxuXHQnJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcblx0JyVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UsXG5cdCclUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb3h5LFxuXHQnJVJhbmdlRXJyb3IlJzogUmFuZ2VFcnJvcixcblx0JyVSZWZlcmVuY2VFcnJvciUnOiBSZWZlcmVuY2VFcnJvcixcblx0JyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCclUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIsXG5cdCclU3RyaW5nJSc6IFN0cmluZyxcblx0JyVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVTeW1ib2wlJzogaGFzU3ltYm9scyA/IFN5bWJvbCA6IHVuZGVmaW5lZCxcblx0JyVTeW50YXhFcnJvciUnOiAkU3ludGF4RXJyb3IsXG5cdCclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG5cdCclVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuXHQnJVR5cGVFcnJvciUnOiAkVHlwZUVycm9yLFxuXHQnJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCclVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyVVUklFcnJvciUnOiBVUklFcnJvcixcblx0JyVXZWFrTWFwJSc6IHR5cGVvZiBXZWFrTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtNYXAsXG5cdCclV2Vha1JlZiUnOiB0eXBlb2YgV2Vha1JlZiA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrUmVmLFxuXHQnJVdlYWtTZXQlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1NldFxufTtcblxudmFyIGRvRXZhbCA9IGZ1bmN0aW9uIGRvRXZhbChuYW1lKSB7XG5cdHZhciB2YWx1ZTtcblx0aWYgKG5hbWUgPT09ICclQXN5bmNGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2FzeW5jIGZ1bmN0aW9uICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVHZW5lcmF0b3JGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2Z1bmN0aW9uKiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKSB7XG5cdFx0dmFsdWUgPSBnZXRFdmFsbGVkQ29uc3RydWN0b3IoJ2FzeW5jIGZ1bmN0aW9uKiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNHZW5lcmF0b3IlJykge1xuXHRcdHZhciBmbiA9IGRvRXZhbCgnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJyk7XG5cdFx0aWYgKGZuKSB7XG5cdFx0XHR2YWx1ZSA9IGZuLnByb3RvdHlwZTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJScpIHtcblx0XHR2YXIgZ2VuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3IlJyk7XG5cdFx0aWYgKGdlbikge1xuXHRcdFx0dmFsdWUgPSBnZXRQcm90byhnZW4ucHJvdG90eXBlKTtcblx0XHR9XG5cdH1cblxuXHRJTlRSSU5TSUNTW25hbWVdID0gdmFsdWU7XG5cblx0cmV0dXJuIHZhbHVlO1xufTtcblxudmFyIExFR0FDWV9BTElBU0VTID0ge1xuXHQnJUFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b3R5cGUlJzogWydBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvX2VudHJpZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZW50cmllcyddLFxuXHQnJUFycmF5UHJvdG9fZm9yRWFjaCUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdmb3JFYWNoJ10sXG5cdCclQXJyYXlQcm90b19rZXlzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2tleXMnXSxcblx0JyVBcnJheVByb3RvX3ZhbHVlcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICd2YWx1ZXMnXSxcblx0JyVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6IFsnQXN5bmNGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVCb29sZWFuUHJvdG90eXBlJSc6IFsnQm9vbGVhbicsICdwcm90b3R5cGUnXSxcblx0JyVEYXRhVmlld1Byb3RvdHlwZSUnOiBbJ0RhdGFWaWV3JywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGVQcm90b3R5cGUlJzogWydEYXRlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUVycm9yUHJvdG90eXBlJSc6IFsnRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRXZhbEVycm9yUHJvdG90eXBlJSc6IFsnRXZhbEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDY0QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRnVuY3Rpb25Qcm90b3R5cGUlJzogWydGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3IlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3JQcm90b3R5cGUlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclSW50OEFycmF5UHJvdG90eXBlJSc6IFsnSW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDE2QXJyYXlQcm90b3R5cGUlJzogWydJbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDMyQXJyYXlQcm90b3R5cGUlJzogWydJbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUpTT05QYXJzZSUnOiBbJ0pTT04nLCAncGFyc2UnXSxcblx0JyVKU09OU3RyaW5naWZ5JSc6IFsnSlNPTicsICdzdHJpbmdpZnknXSxcblx0JyVNYXBQcm90b3R5cGUlJzogWydNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclTnVtYmVyUHJvdG90eXBlJSc6IFsnTnVtYmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJU9iamVjdFByb3RvdHlwZSUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnXSxcblx0JyVPYmpQcm90b190b1N0cmluZyUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndG9TdHJpbmcnXSxcblx0JyVPYmpQcm90b192YWx1ZU9mJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd2YWx1ZU9mJ10sXG5cdCclUHJvbWlzZVByb3RvdHlwZSUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJ10sXG5cdCclUHJvbWlzZVByb3RvX3RoZW4lJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZScsICd0aGVuJ10sXG5cdCclUHJvbWlzZV9hbGwlJzogWydQcm9taXNlJywgJ2FsbCddLFxuXHQnJVByb21pc2VfcmVqZWN0JSc6IFsnUHJvbWlzZScsICdyZWplY3QnXSxcblx0JyVQcm9taXNlX3Jlc29sdmUlJzogWydQcm9taXNlJywgJ3Jlc29sdmUnXSxcblx0JyVSYW5nZUVycm9yUHJvdG90eXBlJSc6IFsnUmFuZ2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBbJ1JlZmVyZW5jZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZ0V4cFByb3RvdHlwZSUnOiBbJ1JlZ0V4cCcsICdwcm90b3R5cGUnXSxcblx0JyVTZXRQcm90b3R5cGUlJzogWydTZXQnLCAncHJvdG90eXBlJ10sXG5cdCclU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydTaGFyZWRBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVTdHJpbmdQcm90b3R5cGUlJzogWydTdHJpbmcnLCAncHJvdG90eXBlJ10sXG5cdCclU3ltYm9sUHJvdG90eXBlJSc6IFsnU3ltYm9sJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bnRheEVycm9yUHJvdG90eXBlJSc6IFsnU3ludGF4RXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZWRBcnJheVByb3RvdHlwZSUnOiBbJ1R5cGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZUVycm9yUHJvdG90eXBlJSc6IFsnVHlwZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogWydVaW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhDbGFtcGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDE2QXJyYXlQcm90b3R5cGUlJzogWydVaW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVSSUVycm9yUHJvdG90eXBlJSc6IFsnVVJJRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha01hcFByb3RvdHlwZSUnOiBbJ1dlYWtNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha1NldFByb3RvdHlwZSUnOiBbJ1dlYWtTZXQnLCAncHJvdG90eXBlJ11cbn07XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJ2hhcycpO1xudmFyICRjb25jYXQgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgQXJyYXkucHJvdG90eXBlLmNvbmNhdCk7XG52YXIgJHNwbGljZUFwcGx5ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmFwcGx5LCBBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcbnZhciAkcmVwbGFjZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xudmFyICRzdHJTbGljZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnNsaWNlKTtcbnZhciAkZXhlYyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBSZWdFeHAucHJvdG90eXBlLmV4ZWMpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdGlmICgkZXhlYygvXiU/W14lXSolPyQvZywgbmFtZSkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lJyk7XG5cdH1cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXHR2YXIgaW50cmluc2ljQmFzZU5hbWUgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJztcblxuXHR2YXIgaW50cmluc2ljID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0dmFyIGludHJpbnNpY1JlYWxOYW1lID0gaW50cmluc2ljLm5hbWU7XG5cdHZhciB2YWx1ZSA9IGludHJpbnNpYy52YWx1ZTtcblx0dmFyIHNraXBGdXJ0aGVyQ2FjaGluZyA9IGZhbHNlO1xuXG5cdHZhciBhbGlhcyA9IGludHJpbnNpYy5hbGlhcztcblx0aWYgKGFsaWFzKSB7XG5cdFx0aW50cmluc2ljQmFzZU5hbWUgPSBhbGlhc1swXTtcblx0XHQkc3BsaWNlQXBwbHkocGFydHMsICRjb25jYXQoWzAsIDFdLCBhbGlhcykpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDEsIGlzT3duID0gdHJ1ZTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIHBhcnQgPSBwYXJ0c1tpXTtcblx0XHR2YXIgZmlyc3QgPSAkc3RyU2xpY2UocGFydCwgMCwgMSk7XG5cdFx0dmFyIGxhc3QgPSAkc3RyU2xpY2UocGFydCwgLTEpO1xuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0KGZpcnN0ID09PSAnXCInIHx8IGZpcnN0ID09PSBcIidcIiB8fCBmaXJzdCA9PT0gJ2AnKVxuXHRcdFx0XHR8fCAobGFzdCA9PT0gJ1wiJyB8fCBsYXN0ID09PSBcIidcIiB8fCBsYXN0ID09PSAnYCcpXG5cdFx0XHQpXG5cdFx0XHQmJiBmaXJzdCAhPT0gbGFzdFxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcigncHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcycpO1xuXHRcdH1cblx0XHRpZiAocGFydCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhaXNPd24pIHtcblx0XHRcdHNraXBGdXJ0aGVyQ2FjaGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aW50cmluc2ljQmFzZU5hbWUgKz0gJy4nICsgcGFydDtcblx0XHRpbnRyaW5zaWNSZWFsTmFtZSA9ICclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnO1xuXG5cdFx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNSZWFsTmFtZSkpIHtcblx0XHRcdHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoIShwYXJ0IGluIHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoIWFsbG93TWlzc2luZykge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICgkZ09QRCAmJiAoaSArIDEpID49IHBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0aXNPd24gPSAhIWRlc2M7XG5cblx0XHRcdFx0Ly8gQnkgY29udmVudGlvbiwgd2hlbiBhIGRhdGEgcHJvcGVydHkgaXMgY29udmVydGVkIHRvIGFuIGFjY2Vzc29yXG5cdFx0XHRcdC8vIHByb3BlcnR5IHRvIGVtdWxhdGUgYSBkYXRhIHByb3BlcnR5IHRoYXQgZG9lcyBub3Qgc3VmZmVyIGZyb21cblx0XHRcdFx0Ly8gdGhlIG92ZXJyaWRlIG1pc3Rha2UsIHRoYXQgYWNjZXNzb3IncyBnZXR0ZXIgaXMgbWFya2VkIHdpdGhcblx0XHRcdFx0Ly8gYW4gYG9yaWdpbmFsVmFsdWVgIHByb3BlcnR5LiBIZXJlLCB3aGVuIHdlIGRldGVjdCB0aGlzLCB3ZVxuXHRcdFx0XHQvLyB1cGhvbGQgdGhlIGlsbHVzaW9uIGJ5IHByZXRlbmRpbmcgdG8gc2VlIHRoYXQgb3JpZ2luYWwgZGF0YVxuXHRcdFx0XHQvLyBwcm9wZXJ0eSwgaS5lLiwgcmV0dXJuaW5nIHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZ2V0dGVyXG5cdFx0XHRcdC8vIGl0c2VsZi5cblx0XHRcdFx0aWYgKGlzT3duICYmICdnZXQnIGluIGRlc2MgJiYgISgnb3JpZ2luYWxWYWx1ZScgaW4gZGVzYy5nZXQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZXNjLmdldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpc093biA9IGhhc093bih2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc093biAmJiAhc2tpcEZ1cnRoZXJDYWNoaW5nKSB7XG5cdFx0XHRcdElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIiwiLyohIE5hdGl2ZSBQcm9taXNlIE9ubHlcbiAgICB2MC44LjEgKGMpIEt5bGUgU2ltcHNvblxuICAgIE1JVCBMaWNlbnNlOiBodHRwOi8vZ2V0aWZ5Lm1pdC1saWNlbnNlLm9yZ1xuKi9cblxuKGZ1bmN0aW9uIFVNRChuYW1lLGNvbnRleHQsZGVmaW5pdGlvbil7XG5cdC8vIHNwZWNpYWwgZm9ybSBvZiBVTUQgZm9yIHBvbHlmaWxsaW5nIGFjcm9zcyBldmlyb25tZW50c1xuXHRjb250ZXh0W25hbWVdID0gY29udGV4dFtuYW1lXSB8fCBkZWZpbml0aW9uKCk7XG5cdGlmICh0eXBlb2YgbW9kdWxlICE9IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHsgbW9kdWxlLmV4cG9ydHMgPSBjb250ZXh0W25hbWVdOyB9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHsgZGVmaW5lKGZ1bmN0aW9uICRBTUQkKCl7IHJldHVybiBjb250ZXh0W25hbWVdOyB9KTsgfVxufSkoXCJQcm9taXNlXCIsdHlwZW9mIGdsb2JhbCAhPSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyxmdW5jdGlvbiBERUYoKXtcblx0Lypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0dmFyIGJ1aWx0SW5Qcm9wLCBjeWNsZSwgc2NoZWR1bGluZ19xdWV1ZSxcblx0XHRUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG5cdFx0dGltZXIgPSAodHlwZW9mIHNldEltbWVkaWF0ZSAhPSBcInVuZGVmaW5lZFwiKSA/XG5cdFx0XHRmdW5jdGlvbiB0aW1lcihmbikgeyByZXR1cm4gc2V0SW1tZWRpYXRlKGZuKTsgfSA6XG5cdFx0XHRzZXRUaW1lb3V0XG5cdDtcblxuXHQvLyBkYW1taXQsIElFOC5cblx0dHJ5IHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sXCJ4XCIse30pO1xuXHRcdGJ1aWx0SW5Qcm9wID0gZnVuY3Rpb24gYnVpbHRJblByb3Aob2JqLG5hbWUsdmFsLGNvbmZpZykge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosbmFtZSx7XG5cdFx0XHRcdHZhbHVlOiB2YWwsXG5cdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IGNvbmZpZyAhPT0gZmFsc2Vcblx0XHRcdH0pO1xuXHRcdH07XG5cdH1cblx0Y2F0Y2ggKGVycikge1xuXHRcdGJ1aWx0SW5Qcm9wID0gZnVuY3Rpb24gYnVpbHRJblByb3Aob2JqLG5hbWUsdmFsKSB7XG5cdFx0XHRvYmpbbmFtZV0gPSB2YWw7XG5cdFx0XHRyZXR1cm4gb2JqO1xuXHRcdH07XG5cdH1cblxuXHQvLyBOb3RlOiB1c2luZyBhIHF1ZXVlIGluc3RlYWQgb2YgYXJyYXkgZm9yIGVmZmljaWVuY3lcblx0c2NoZWR1bGluZ19xdWV1ZSA9IChmdW5jdGlvbiBRdWV1ZSgpIHtcblx0XHR2YXIgZmlyc3QsIGxhc3QsIGl0ZW07XG5cblx0XHRmdW5jdGlvbiBJdGVtKGZuLHNlbGYpIHtcblx0XHRcdHRoaXMuZm4gPSBmbjtcblx0XHRcdHRoaXMuc2VsZiA9IHNlbGY7XG5cdFx0XHR0aGlzLm5leHQgPSB2b2lkIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFkZDogZnVuY3Rpb24gYWRkKGZuLHNlbGYpIHtcblx0XHRcdFx0aXRlbSA9IG5ldyBJdGVtKGZuLHNlbGYpO1xuXHRcdFx0XHRpZiAobGFzdCkge1xuXHRcdFx0XHRcdGxhc3QubmV4dCA9IGl0ZW07XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Zmlyc3QgPSBpdGVtO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxhc3QgPSBpdGVtO1xuXHRcdFx0XHRpdGVtID0gdm9pZCAwO1xuXHRcdFx0fSxcblx0XHRcdGRyYWluOiBmdW5jdGlvbiBkcmFpbigpIHtcblx0XHRcdFx0dmFyIGYgPSBmaXJzdDtcblx0XHRcdFx0Zmlyc3QgPSBsYXN0ID0gY3ljbGUgPSB2b2lkIDA7XG5cblx0XHRcdFx0d2hpbGUgKGYpIHtcblx0XHRcdFx0XHRmLmZuLmNhbGwoZi5zZWxmKTtcblx0XHRcdFx0XHRmID0gZi5uZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSkoKTtcblxuXHRmdW5jdGlvbiBzY2hlZHVsZShmbixzZWxmKSB7XG5cdFx0c2NoZWR1bGluZ19xdWV1ZS5hZGQoZm4sc2VsZik7XG5cdFx0aWYgKCFjeWNsZSkge1xuXHRcdFx0Y3ljbGUgPSB0aW1lcihzY2hlZHVsaW5nX3F1ZXVlLmRyYWluKTtcblx0XHR9XG5cdH1cblxuXHQvLyBwcm9taXNlIGR1Y2sgdHlwaW5nXG5cdGZ1bmN0aW9uIGlzVGhlbmFibGUobykge1xuXHRcdHZhciBfdGhlbiwgb190eXBlID0gdHlwZW9mIG87XG5cblx0XHRpZiAobyAhPSBudWxsICYmXG5cdFx0XHQoXG5cdFx0XHRcdG9fdHlwZSA9PSBcIm9iamVjdFwiIHx8IG9fdHlwZSA9PSBcImZ1bmN0aW9uXCJcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdF90aGVuID0gby50aGVuO1xuXHRcdH1cblx0XHRyZXR1cm4gdHlwZW9mIF90aGVuID09IFwiZnVuY3Rpb25cIiA/IF90aGVuIDogZmFsc2U7XG5cdH1cblxuXHRmdW5jdGlvbiBub3RpZnkoKSB7XG5cdFx0Zm9yICh2YXIgaT0wOyBpPHRoaXMuY2hhaW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdG5vdGlmeUlzb2xhdGVkKFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHQodGhpcy5zdGF0ZSA9PT0gMSkgPyB0aGlzLmNoYWluW2ldLnN1Y2Nlc3MgOiB0aGlzLmNoYWluW2ldLmZhaWx1cmUsXG5cdFx0XHRcdHRoaXMuY2hhaW5baV1cblx0XHRcdCk7XG5cdFx0fVxuXHRcdHRoaXMuY2hhaW4ubGVuZ3RoID0gMDtcblx0fVxuXG5cdC8vIE5PVEU6IFRoaXMgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0byBpc29sYXRlXG5cdC8vIHRoZSBgdHJ5Li5jYXRjaGAgc28gdGhhdCBvdGhlciBjb2RlIGNhbiBiZVxuXHQvLyBvcHRpbWl6ZWQgYmV0dGVyXG5cdGZ1bmN0aW9uIG5vdGlmeUlzb2xhdGVkKHNlbGYsY2IsY2hhaW4pIHtcblx0XHR2YXIgcmV0LCBfdGhlbjtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGNiID09PSBmYWxzZSkge1xuXHRcdFx0XHRjaGFpbi5yZWplY3Qoc2VsZi5tc2cpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGlmIChjYiA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHJldCA9IHNlbGYubXNnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHJldCA9IGNiLmNhbGwodm9pZCAwLHNlbGYubXNnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXQgPT09IGNoYWluLnByb21pc2UpIHtcblx0XHRcdFx0XHRjaGFpbi5yZWplY3QoVHlwZUVycm9yKFwiUHJvbWlzZS1jaGFpbiBjeWNsZVwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAoX3RoZW4gPSBpc1RoZW5hYmxlKHJldCkpIHtcblx0XHRcdFx0XHRfdGhlbi5jYWxsKHJldCxjaGFpbi5yZXNvbHZlLGNoYWluLnJlamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Y2hhaW4ucmVzb2x2ZShyZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNhdGNoIChlcnIpIHtcblx0XHRcdGNoYWluLnJlamVjdChlcnIpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc29sdmUobXNnKSB7XG5cdFx0dmFyIF90aGVuLCBzZWxmID0gdGhpcztcblxuXHRcdC8vIGFscmVhZHkgdHJpZ2dlcmVkP1xuXHRcdGlmIChzZWxmLnRyaWdnZXJlZCkgeyByZXR1cm47IH1cblxuXHRcdHNlbGYudHJpZ2dlcmVkID0gdHJ1ZTtcblxuXHRcdC8vIHVud3JhcFxuXHRcdGlmIChzZWxmLmRlZikge1xuXHRcdFx0c2VsZiA9IHNlbGYuZGVmO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoX3RoZW4gPSBpc1RoZW5hYmxlKG1zZykpIHtcblx0XHRcdFx0c2NoZWR1bGUoZnVuY3Rpb24oKXtcblx0XHRcdFx0XHR2YXIgZGVmX3dyYXBwZXIgPSBuZXcgTWFrZURlZldyYXBwZXIoc2VsZik7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdF90aGVuLmNhbGwobXNnLFxuXHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAkcmVzb2x2ZSQoKXsgcmVzb2x2ZS5hcHBseShkZWZfd3JhcHBlcixhcmd1bWVudHMpOyB9LFxuXHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAkcmVqZWN0JCgpeyByZWplY3QuYXBwbHkoZGVmX3dyYXBwZXIsYXJndW1lbnRzKTsgfVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdFx0cmVqZWN0LmNhbGwoZGVmX3dyYXBwZXIsZXJyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0c2VsZi5tc2cgPSBtc2c7XG5cdFx0XHRcdHNlbGYuc3RhdGUgPSAxO1xuXHRcdFx0XHRpZiAoc2VsZi5jaGFpbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0c2NoZWR1bGUobm90aWZ5LHNlbGYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNhdGNoIChlcnIpIHtcblx0XHRcdHJlamVjdC5jYWxsKG5ldyBNYWtlRGVmV3JhcHBlcihzZWxmKSxlcnIpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHJlamVjdChtc2cpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHQvLyBhbHJlYWR5IHRyaWdnZXJlZD9cblx0XHRpZiAoc2VsZi50cmlnZ2VyZWQpIHsgcmV0dXJuOyB9XG5cblx0XHRzZWxmLnRyaWdnZXJlZCA9IHRydWU7XG5cblx0XHQvLyB1bndyYXBcblx0XHRpZiAoc2VsZi5kZWYpIHtcblx0XHRcdHNlbGYgPSBzZWxmLmRlZjtcblx0XHR9XG5cblx0XHRzZWxmLm1zZyA9IG1zZztcblx0XHRzZWxmLnN0YXRlID0gMjtcblx0XHRpZiAoc2VsZi5jaGFpbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRzY2hlZHVsZShub3RpZnksc2VsZik7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gaXRlcmF0ZVByb21pc2VzKENvbnN0cnVjdG9yLGFycixyZXNvbHZlcixyZWplY3Rlcikge1xuXHRcdGZvciAodmFyIGlkeD0wOyBpZHg8YXJyLmxlbmd0aDsgaWR4KyspIHtcblx0XHRcdChmdW5jdGlvbiBJSUZFKGlkeCl7XG5cdFx0XHRcdENvbnN0cnVjdG9yLnJlc29sdmUoYXJyW2lkeF0pXG5cdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdGZ1bmN0aW9uICRyZXNvbHZlciQobXNnKXtcblx0XHRcdFx0XHRcdHJlc29sdmVyKGlkeCxtc2cpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVqZWN0ZXJcblx0XHRcdFx0KTtcblx0XHRcdH0pKGlkeCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gTWFrZURlZldyYXBwZXIoc2VsZikge1xuXHRcdHRoaXMuZGVmID0gc2VsZjtcblx0XHR0aGlzLnRyaWdnZXJlZCA9IGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gTWFrZURlZihzZWxmKSB7XG5cdFx0dGhpcy5wcm9taXNlID0gc2VsZjtcblx0XHR0aGlzLnN0YXRlID0gMDtcblx0XHR0aGlzLnRyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdHRoaXMuY2hhaW4gPSBbXTtcblx0XHR0aGlzLm1zZyA9IHZvaWQgMDtcblx0fVxuXG5cdGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcblx0XHRpZiAodHlwZW9mIGV4ZWN1dG9yICE9IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX19OUE9fXyAhPT0gMCkge1xuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFwiTm90IGEgcHJvbWlzZVwiKTtcblx0XHR9XG5cblx0XHQvLyBpbnN0YW5jZSBzaGFkb3dpbmcgdGhlIGluaGVyaXRlZCBcImJyYW5kXCJcblx0XHQvLyB0byBzaWduYWwgYW4gYWxyZWFkeSBcImluaXRpYWxpemVkXCIgcHJvbWlzZVxuXHRcdHRoaXMuX19OUE9fXyA9IDE7XG5cblx0XHR2YXIgZGVmID0gbmV3IE1ha2VEZWYodGhpcyk7XG5cblx0XHR0aGlzW1widGhlblwiXSA9IGZ1bmN0aW9uIHRoZW4oc3VjY2VzcyxmYWlsdXJlKSB7XG5cdFx0XHR2YXIgbyA9IHtcblx0XHRcdFx0c3VjY2VzczogdHlwZW9mIHN1Y2Nlc3MgPT0gXCJmdW5jdGlvblwiID8gc3VjY2VzcyA6IHRydWUsXG5cdFx0XHRcdGZhaWx1cmU6IHR5cGVvZiBmYWlsdXJlID09IFwiZnVuY3Rpb25cIiA/IGZhaWx1cmUgOiBmYWxzZVxuXHRcdFx0fTtcblx0XHRcdC8vIE5vdGU6IGB0aGVuKC4uKWAgaXRzZWxmIGNhbiBiZSBib3Jyb3dlZCB0byBiZSB1c2VkIGFnYWluc3Rcblx0XHRcdC8vIGEgZGlmZmVyZW50IHByb21pc2UgY29uc3RydWN0b3IgZm9yIG1ha2luZyB0aGUgY2hhaW5lZCBwcm9taXNlLFxuXHRcdFx0Ly8gYnkgc3Vic3RpdHV0aW5nIGEgZGlmZmVyZW50IGB0aGlzYCBiaW5kaW5nLlxuXHRcdFx0by5wcm9taXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZnVuY3Rpb24gZXh0cmFjdENoYWluKHJlc29sdmUscmVqZWN0KSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgcmVzb2x2ZSAhPSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHJlamVjdCAhPSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG8ucmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHRcdG8ucmVqZWN0ID0gcmVqZWN0O1xuXHRcdFx0fSk7XG5cdFx0XHRkZWYuY2hhaW4ucHVzaChvKTtcblxuXHRcdFx0aWYgKGRlZi5zdGF0ZSAhPT0gMCkge1xuXHRcdFx0XHRzY2hlZHVsZShub3RpZnksZGVmKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG8ucHJvbWlzZTtcblx0XHR9O1xuXHRcdHRoaXNbXCJjYXRjaFwiXSA9IGZ1bmN0aW9uICRjYXRjaCQoZmFpbHVyZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsZmFpbHVyZSk7XG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRleGVjdXRvci5jYWxsKFxuXHRcdFx0XHR2b2lkIDAsXG5cdFx0XHRcdGZ1bmN0aW9uIHB1YmxpY1Jlc29sdmUobXNnKXtcblx0XHRcdFx0XHRyZXNvbHZlLmNhbGwoZGVmLG1zZyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZ1bmN0aW9uIHB1YmxpY1JlamVjdChtc2cpIHtcblx0XHRcdFx0XHRyZWplY3QuY2FsbChkZWYsbXNnKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGVycikge1xuXHRcdFx0cmVqZWN0LmNhbGwoZGVmLGVycik7XG5cdFx0fVxuXHR9XG5cblx0dmFyIFByb21pc2VQcm90b3R5cGUgPSBidWlsdEluUHJvcCh7fSxcImNvbnN0cnVjdG9yXCIsUHJvbWlzZSxcblx0XHQvKmNvbmZpZ3VyYWJsZT0qL2ZhbHNlXG5cdCk7XG5cblx0Ly8gTm90ZTogQW5kcm9pZCA0IGNhbm5vdCB1c2UgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSguLilgIGhlcmVcblx0UHJvbWlzZS5wcm90b3R5cGUgPSBQcm9taXNlUHJvdG90eXBlO1xuXG5cdC8vIGJ1aWx0LWluIFwiYnJhbmRcIiB0byBzaWduYWwgYW4gXCJ1bmluaXRpYWxpemVkXCIgcHJvbWlzZVxuXHRidWlsdEluUHJvcChQcm9taXNlUHJvdG90eXBlLFwiX19OUE9fX1wiLDAsXG5cdFx0Lypjb25maWd1cmFibGU9Ki9mYWxzZVxuXHQpO1xuXG5cdGJ1aWx0SW5Qcm9wKFByb21pc2UsXCJyZXNvbHZlXCIsZnVuY3Rpb24gUHJvbWlzZSRyZXNvbHZlKG1zZykge1xuXHRcdHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cblx0XHQvLyBzcGVjIG1hbmRhdGVkIGNoZWNrc1xuXHRcdC8vIG5vdGU6IGJlc3QgXCJpc1Byb21pc2VcIiBjaGVjayB0aGF0J3MgcHJhY3RpY2FsIGZvciBub3dcblx0XHRpZiAobXNnICYmIHR5cGVvZiBtc2cgPT0gXCJvYmplY3RcIiAmJiBtc2cuX19OUE9fXyA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIG1zZztcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUscmVqZWN0KXtcblx0XHRcdGlmICh0eXBlb2YgcmVzb2x2ZSAhPSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHJlamVjdCAhPSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG5cdFx0XHR9XG5cblx0XHRcdHJlc29sdmUobXNnKTtcblx0XHR9KTtcblx0fSk7XG5cblx0YnVpbHRJblByb3AoUHJvbWlzZSxcInJlamVjdFwiLGZ1bmN0aW9uIFByb21pc2UkcmVqZWN0KG1zZykge1xuXHRcdHJldHVybiBuZXcgdGhpcyhmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLHJlamVjdCl7XG5cdFx0XHRpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihcIk5vdCBhIGZ1bmN0aW9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZWplY3QobXNnKTtcblx0XHR9KTtcblx0fSk7XG5cblx0YnVpbHRJblByb3AoUHJvbWlzZSxcImFsbFwiLGZ1bmN0aW9uIFByb21pc2UkYWxsKGFycikge1xuXHRcdHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cblx0XHQvLyBzcGVjIG1hbmRhdGVkIGNoZWNrc1xuXHRcdGlmIChUb1N0cmluZy5jYWxsKGFycikgIT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG5cdFx0XHRyZXR1cm4gQ29uc3RydWN0b3IucmVqZWN0KFR5cGVFcnJvcihcIk5vdCBhbiBhcnJheVwiKSk7XG5cdFx0fVxuXHRcdGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gQ29uc3RydWN0b3IucmVzb2x2ZShbXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLHJlamVjdCl7XG5cdFx0XHRpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihcIk5vdCBhIGZ1bmN0aW9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbGVuID0gYXJyLmxlbmd0aCwgbXNncyA9IEFycmF5KGxlbiksIGNvdW50ID0gMDtcblxuXHRcdFx0aXRlcmF0ZVByb21pc2VzKENvbnN0cnVjdG9yLGFycixmdW5jdGlvbiByZXNvbHZlcihpZHgsbXNnKSB7XG5cdFx0XHRcdG1zZ3NbaWR4XSA9IG1zZztcblx0XHRcdFx0aWYgKCsrY291bnQgPT09IGxlbikge1xuXHRcdFx0XHRcdHJlc29sdmUobXNncyk7XG5cdFx0XHRcdH1cblx0XHRcdH0scmVqZWN0KTtcblx0XHR9KTtcblx0fSk7XG5cblx0YnVpbHRJblByb3AoUHJvbWlzZSxcInJhY2VcIixmdW5jdGlvbiBQcm9taXNlJHJhY2UoYXJyKSB7XG5cdFx0dmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuXHRcdC8vIHNwZWMgbWFuZGF0ZWQgY2hlY2tzXG5cdFx0aWYgKFRvU3RyaW5nLmNhbGwoYXJyKSAhPSBcIltvYmplY3QgQXJyYXldXCIpIHtcblx0XHRcdHJldHVybiBDb25zdHJ1Y3Rvci5yZWplY3QoVHlwZUVycm9yKFwiTm90IGFuIGFycmF5XCIpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUscmVqZWN0KXtcblx0XHRcdGlmICh0eXBlb2YgcmVzb2x2ZSAhPSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHJlamVjdCAhPSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGl0ZXJhdGVQcm9taXNlcyhDb25zdHJ1Y3RvcixhcnIsZnVuY3Rpb24gcmVzb2x2ZXIoaWR4LG1zZyl7XG5cdFx0XHRcdHJlc29sdmUobXNnKTtcblx0XHRcdH0scmVqZWN0KTtcblx0XHR9KTtcblx0fSk7XG5cblx0cmV0dXJuIFByb21pc2U7XG59KTtcbiIsInZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGU7XG52YXIgbWFwU2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc01hcCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgbWFwU2l6ZSA9IGhhc01hcCAmJiBtYXBTaXplRGVzY3JpcHRvciAmJiB0eXBlb2YgbWFwU2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gbWFwU2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBtYXBGb3JFYWNoID0gaGFzTWFwICYmIE1hcC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGU7XG52YXIgc2V0U2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc1NldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU2V0LnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgc2V0U2l6ZSA9IGhhc1NldCAmJiBzZXRTaXplRGVzY3JpcHRvciAmJiB0eXBlb2Ygc2V0U2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gc2V0U2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBzZXRGb3JFYWNoID0gaGFzU2V0ICYmIFNldC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgV2Vha01hcC5wcm90b3R5cGU7XG52YXIgd2Vha01hcEhhcyA9IGhhc1dlYWtNYXAgPyBXZWFrTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZTtcbnZhciB3ZWFrU2V0SGFzID0gaGFzV2Vha1NldCA/IFdlYWtTZXQucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1JlZiA9IHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIFdlYWtSZWYucHJvdG90eXBlO1xudmFyIHdlYWtSZWZEZXJlZiA9IGhhc1dlYWtSZWYgPyBXZWFrUmVmLnByb3RvdHlwZS5kZXJlZiA6IG51bGw7XG52YXIgYm9vbGVhblZhbHVlT2YgPSBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyICRtYXRjaCA9IFN0cmluZy5wcm90b3R5cGUubWF0Y2g7XG52YXIgJHNsaWNlID0gU3RyaW5nLnByb3RvdHlwZS5zbGljZTtcbnZhciAkcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciAkdG9VcHBlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlO1xudmFyICR0b0xvd2VyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2U7XG52YXIgJHRlc3QgPSBSZWdFeHAucHJvdG90eXBlLnRlc3Q7XG52YXIgJGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgJGpvaW4gPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbnZhciAkYXJyU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgJGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBiaWdJbnRWYWx1ZU9mID0gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyA/IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiA6IG51bGw7XG52YXIgZ09QUyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgc3ltVG9TdHJpbmcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyA6IG51bGw7XG52YXIgaGFzU2hhbW1lZFN5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdvYmplY3QnO1xuLy8gaWUsIGBoYXMtdG9zdHJpbmd0YWcvc2hhbXNcbnZhciB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmICh0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBoYXNTaGFtbWVkU3ltYm9scyA/ICdvYmplY3QnIDogJ3N5bWJvbCcpXG4gICAgPyBTeW1ib2wudG9TdHJpbmdUYWdcbiAgICA6IG51bGw7XG52YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxudmFyIGdQTyA9ICh0eXBlb2YgUmVmbGVjdCA9PT0gJ2Z1bmN0aW9uJyA/IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YgOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHx8IChcbiAgICBbXS5fX3Byb3RvX18gPT09IEFycmF5LnByb3RvdHlwZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgID8gZnVuY3Rpb24gKE8pIHtcbiAgICAgICAgICAgIHJldHVybiBPLl9fcHJvdG9fXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuKTtcblxuZnVuY3Rpb24gYWRkTnVtZXJpY1NlcGFyYXRvcihudW0sIHN0cikge1xuICAgIGlmIChcbiAgICAgICAgbnVtID09PSBJbmZpbml0eVxuICAgICAgICB8fCBudW0gPT09IC1JbmZpbml0eVxuICAgICAgICB8fCBudW0gIT09IG51bVxuICAgICAgICB8fCAobnVtICYmIG51bSA+IC0xMDAwICYmIG51bSA8IDEwMDApXG4gICAgICAgIHx8ICR0ZXN0LmNhbGwoL2UvLCBzdHIpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHZhciBzZXBSZWdleCA9IC9bMC05XSg/PSg/OlswLTldezN9KSsoPyFbMC05XSkpL2c7XG4gICAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBpbnQgPSBudW0gPCAwID8gLSRmbG9vcigtbnVtKSA6ICRmbG9vcihudW0pOyAvLyB0cnVuYyhudW0pXG4gICAgICAgIGlmIChpbnQgIT09IG51bSkge1xuICAgICAgICAgICAgdmFyIGludFN0ciA9IFN0cmluZyhpbnQpO1xuICAgICAgICAgICAgdmFyIGRlYyA9ICRzbGljZS5jYWxsKHN0ciwgaW50U3RyLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoaW50U3RyLCBzZXBSZWdleCwgJyQmXycpICsgJy4nICsgJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKGRlYywgLyhbMC05XXszfSkvZywgJyQmXycpLCAvXyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoc3RyLCBzZXBSZWdleCwgJyQmXycpO1xufVxuXG52YXIgdXRpbEluc3BlY3QgPSByZXF1aXJlKCcuL3V0aWwuaW5zcGVjdCcpO1xudmFyIGluc3BlY3RDdXN0b20gPSB1dGlsSW5zcGVjdC5jdXN0b207XG52YXIgaW5zcGVjdFN5bWJvbCA9IGlzU3ltYm9sKGluc3BlY3RDdXN0b20pID8gaW5zcGVjdEN1c3RvbSA6IG51bGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5zcGVjdF8ob2JqLCBvcHRpb25zLCBkZXB0aCwgc2Vlbikge1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmIChoYXMob3B0cywgJ3F1b3RlU3R5bGUnKSAmJiAob3B0cy5xdW90ZVN0eWxlICE9PSAnc2luZ2xlJyAmJiBvcHRzLnF1b3RlU3R5bGUgIT09ICdkb3VibGUnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJxdW90ZVN0eWxlXCIgbXVzdCBiZSBcInNpbmdsZVwiIG9yIFwiZG91YmxlXCInKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICBoYXMob3B0cywgJ21heFN0cmluZ0xlbmd0aCcpICYmICh0eXBlb2Ygb3B0cy5tYXhTdHJpbmdMZW5ndGggPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IG9wdHMubWF4U3RyaW5nTGVuZ3RoIDwgMCAmJiBvcHRzLm1heFN0cmluZ0xlbmd0aCAhPT0gSW5maW5pdHlcbiAgICAgICAgICAgIDogb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IG51bGxcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJtYXhTdHJpbmdMZW5ndGhcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBJbmZpbml0eSwgb3IgYG51bGxgJyk7XG4gICAgfVxuICAgIHZhciBjdXN0b21JbnNwZWN0ID0gaGFzKG9wdHMsICdjdXN0b21JbnNwZWN0JykgPyBvcHRzLmN1c3RvbUluc3BlY3QgOiB0cnVlO1xuICAgIGlmICh0eXBlb2YgY3VzdG9tSW5zcGVjdCAhPT0gJ2Jvb2xlYW4nICYmIGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcImN1c3RvbUluc3BlY3RcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgLCBgZmFsc2VgLCBvciBgXFwnc3ltYm9sXFwnYCcpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdpbmRlbnQnKVxuICAgICAgICAmJiBvcHRzLmluZGVudCAhPT0gbnVsbFxuICAgICAgICAmJiBvcHRzLmluZGVudCAhPT0gJ1xcdCdcbiAgICAgICAgJiYgIShwYXJzZUludChvcHRzLmluZGVudCwgMTApID09PSBvcHRzLmluZGVudCAmJiBvcHRzLmluZGVudCA+IDApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcImluZGVudFwiIG11c3QgYmUgXCJcXFxcdFwiLCBhbiBpbnRlZ2VyID4gMCwgb3IgYG51bGxgJyk7XG4gICAgfVxuICAgIGlmIChoYXMob3B0cywgJ251bWVyaWNTZXBhcmF0b3InKSAmJiB0eXBlb2Ygb3B0cy5udW1lcmljU2VwYXJhdG9yICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibnVtZXJpY1NlcGFyYXRvclwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCcpO1xuICAgIH1cbiAgICB2YXIgbnVtZXJpY1NlcGFyYXRvciA9IG9wdHMubnVtZXJpY1NlcGFyYXRvcjtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gb2JqID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RTdHJpbmcob2JqLCBvcHRzKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChvYmogPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eSAvIG9iaiA+IDAgPyAnMCcgOiAnLTAnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdHIgPSBTdHJpbmcob2JqKTtcbiAgICAgICAgcmV0dXJuIG51bWVyaWNTZXBhcmF0b3IgPyBhZGROdW1lcmljU2VwYXJhdG9yKG9iaiwgc3RyKSA6IHN0cjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHZhciBiaWdJbnRTdHIgPSBTdHJpbmcob2JqKSArICduJztcbiAgICAgICAgcmV0dXJuIG51bWVyaWNTZXBhcmF0b3IgPyBhZGROdW1lcmljU2VwYXJhdG9yKG9iaiwgYmlnSW50U3RyKSA6IGJpZ0ludFN0cjtcbiAgICB9XG5cbiAgICB2YXIgbWF4RGVwdGggPSB0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyA1IDogb3B0cy5kZXB0aDtcbiAgICBpZiAodHlwZW9mIGRlcHRoID09PSAndW5kZWZpbmVkJykgeyBkZXB0aCA9IDA7IH1cbiAgICBpZiAoZGVwdGggPj0gbWF4RGVwdGggJiYgbWF4RGVwdGggPiAwICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KG9iaikgPyAnW0FycmF5XScgOiAnW09iamVjdF0nO1xuICAgIH1cblxuICAgIHZhciBpbmRlbnQgPSBnZXRJbmRlbnQob3B0cywgZGVwdGgpO1xuXG4gICAgaWYgKHR5cGVvZiBzZWVuID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWVuID0gW107XG4gICAgfSBlbHNlIGlmIChpbmRleE9mKHNlZW4sIG9iaikgPj0gMCkge1xuICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3QodmFsdWUsIGZyb20sIG5vSW5kZW50KSB7XG4gICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgICBzZWVuID0gJGFyclNsaWNlLmNhbGwoc2Vlbik7XG4gICAgICAgICAgICBzZWVuLnB1c2goZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vSW5kZW50KSB7XG4gICAgICAgICAgICB2YXIgbmV3T3B0cyA9IHtcbiAgICAgICAgICAgICAgICBkZXB0aDogb3B0cy5kZXB0aFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoYXMob3B0cywgJ3F1b3RlU3R5bGUnKSkge1xuICAgICAgICAgICAgICAgIG5ld09wdHMucXVvdGVTdHlsZSA9IG9wdHMucXVvdGVTdHlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnNwZWN0Xyh2YWx1ZSwgbmV3T3B0cywgZGVwdGggKyAxLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG9wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicgJiYgIWlzUmVnRXhwKG9iaikpIHsgLy8gaW4gb2xkZXIgZW5naW5lcywgcmVnZXhlcyBhcmUgY2FsbGFibGVcbiAgICAgICAgdmFyIG5hbWUgPSBuYW1lT2Yob2JqKTtcbiAgICAgICAgdmFyIGtleXMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIHJldHVybiAnW0Z1bmN0aW9uJyArIChuYW1lID8gJzogJyArIG5hbWUgOiAnIChhbm9ueW1vdXMpJykgKyAnXScgKyAoa2V5cy5sZW5ndGggPiAwID8gJyB7ICcgKyAkam9pbi5jYWxsKGtleXMsICcsICcpICsgJyB9JyA6ICcnKTtcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKG9iaikpIHtcbiAgICAgICAgdmFyIHN5bVN0cmluZyA9IGhhc1NoYW1tZWRTeW1ib2xzID8gJHJlcGxhY2UuY2FsbChTdHJpbmcob2JqKSwgL14oU3ltYm9sXFwoLipcXCkpX1teKV0qJC8sICckMScpIDogc3ltVG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIWhhc1NoYW1tZWRTeW1ib2xzID8gbWFya0JveGVkKHN5bVN0cmluZykgOiBzeW1TdHJpbmc7XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQob2JqKSkge1xuICAgICAgICB2YXIgcyA9ICc8JyArICR0b0xvd2VyQ2FzZS5jYWxsKFN0cmluZyhvYmoubm9kZU5hbWUpKTtcbiAgICAgICAgdmFyIGF0dHJzID0gb2JqLmF0dHJpYnV0ZXMgfHwgW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHMgKz0gJyAnICsgYXR0cnNbaV0ubmFtZSArICc9JyArIHdyYXBRdW90ZXMocXVvdGUoYXR0cnNbaV0udmFsdWUpLCAnZG91YmxlJywgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcyArPSAnPic7XG4gICAgICAgIGlmIChvYmouY2hpbGROb2RlcyAmJiBvYmouY2hpbGROb2Rlcy5sZW5ndGgpIHsgcyArPSAnLi4uJzsgfVxuICAgICAgICBzICs9ICc8LycgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSkgKyAnPic7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChvYmoubGVuZ3RoID09PSAwKSB7IHJldHVybiAnW10nOyB9XG4gICAgICAgIHZhciB4cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKGluZGVudCAmJiAhc2luZ2xlTGluZVZhbHVlcyh4cykpIHtcbiAgICAgICAgICAgIHJldHVybiAnWycgKyBpbmRlbnRlZEpvaW4oeHMsIGluZGVudCkgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdbICcgKyAkam9pbi5jYWxsKHhzLCAnLCAnKSArICcgXSc7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKG9iaikpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAoISgnY2F1c2UnIGluIEVycm9yLnByb3RvdHlwZSkgJiYgJ2NhdXNlJyBpbiBvYmogJiYgIWlzRW51bWVyYWJsZS5jYWxsKG9iaiwgJ2NhdXNlJykpIHtcbiAgICAgICAgICAgIHJldHVybiAneyBbJyArIFN0cmluZyhvYmopICsgJ10gJyArICRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKCdbY2F1c2VdOiAnICsgaW5zcGVjdChvYmouY2F1c2UpLCBwYXJ0cyksICcsICcpICsgJyB9JztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7IHJldHVybiAnWycgKyBTdHJpbmcob2JqKSArICddJzsgfVxuICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKHBhcnRzLCAnLCAnKSArICcgfSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBjdXN0b21JbnNwZWN0KSB7XG4gICAgICAgIGlmIChpbnNwZWN0U3ltYm9sICYmIHR5cGVvZiBvYmpbaW5zcGVjdFN5bWJvbF0gPT09ICdmdW5jdGlvbicgJiYgdXRpbEluc3BlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlsSW5zcGVjdChvYmosIHsgZGVwdGg6IG1heERlcHRoIC0gZGVwdGggfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VzdG9tSW5zcGVjdCAhPT0gJ3N5bWJvbCcgJiYgdHlwZW9mIG9iai5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLmluc3BlY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNNYXAob2JqKSkge1xuICAgICAgICB2YXIgbWFwUGFydHMgPSBbXTtcbiAgICAgICAgbWFwRm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIHNldEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgc2V0UGFydHMucHVzaChpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ1NldCcsIHNldFNpemUuY2FsbChvYmopLCBzZXRQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha01hcChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrTWFwJyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtTZXQob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1NldCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrUmVmKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtSZWYnKTtcbiAgICB9XG4gICAgaWYgKGlzTnVtYmVyKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KE51bWJlcihvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ0ludChvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCb29sZWFuKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChib29sZWFuVmFsdWVPZi5jYWxsKG9iaikpO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoU3RyaW5nKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKCFpc0RhdGUob2JqKSAmJiAhaXNSZWdFeHAob2JqKSkge1xuICAgICAgICB2YXIgeXMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIHZhciBpc1BsYWluT2JqZWN0ID0gZ1BPID8gZ1BPKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGUgOiBvYmogaW5zdGFuY2VvZiBPYmplY3QgfHwgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG4gICAgICAgIHZhciBwcm90b1RhZyA9IG9iaiBpbnN0YW5jZW9mIE9iamVjdCA/ICcnIDogJ251bGwgcHJvdG90eXBlJztcbiAgICAgICAgdmFyIHN0cmluZ1RhZyA9ICFpc1BsYWluT2JqZWN0ICYmIHRvU3RyaW5nVGFnICYmIE9iamVjdChvYmopID09PSBvYmogJiYgdG9TdHJpbmdUYWcgaW4gb2JqID8gJHNsaWNlLmNhbGwodG9TdHIob2JqKSwgOCwgLTEpIDogcHJvdG9UYWcgPyAnT2JqZWN0JyA6ICcnO1xuICAgICAgICB2YXIgY29uc3RydWN0b3JUYWcgPSBpc1BsYWluT2JqZWN0IHx8IHR5cGVvZiBvYmouY29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicgPyAnJyA6IG9iai5jb25zdHJ1Y3Rvci5uYW1lID8gb2JqLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgOiAnJztcbiAgICAgICAgdmFyIHRhZyA9IGNvbnN0cnVjdG9yVGFnICsgKHN0cmluZ1RhZyB8fCBwcm90b1RhZyA/ICdbJyArICRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKFtdLCBzdHJpbmdUYWcgfHwgW10sIHByb3RvVGFnIHx8IFtdKSwgJzogJykgKyAnXSAnIDogJycpO1xuICAgICAgICBpZiAoeXMubGVuZ3RoID09PSAwKSB7IHJldHVybiB0YWcgKyAne30nOyB9XG4gICAgICAgIGlmIChpbmRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWcgKyAneycgKyBpbmRlbnRlZEpvaW4oeXMsIGluZGVudCkgKyAnfSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhZyArICd7ICcgKyAkam9pbi5jYWxsKHlzLCAnLCAnKSArICcgfSc7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcob2JqKTtcbn07XG5cbmZ1bmN0aW9uIHdyYXBRdW90ZXMocywgZGVmYXVsdFN0eWxlLCBvcHRzKSB7XG4gICAgdmFyIHF1b3RlQ2hhciA9IChvcHRzLnF1b3RlU3R5bGUgfHwgZGVmYXVsdFN0eWxlKSA9PT0gJ2RvdWJsZScgPyAnXCInIDogXCInXCI7XG4gICAgcmV0dXJuIHF1b3RlQ2hhciArIHMgKyBxdW90ZUNoYXI7XG59XG5cbmZ1bmN0aW9uIHF1b3RlKHMpIHtcbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChTdHJpbmcocyksIC9cIi9nLCAnJnF1b3Q7Jyk7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBBcnJheV0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNEYXRlKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBSZWdFeHBdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBFcnJvcl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBTdHJpbmddJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzTnVtYmVyKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBCb29sZWFuXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5cbi8vIFN5bWJvbCBhbmQgQmlnSW50IGRvIGhhdmUgU3ltYm9sLnRvU3RyaW5nVGFnIGJ5IHNwZWMsIHNvIHRoYXQgY2FuJ3QgYmUgdXNlZCB0byBlbGltaW5hdGUgZmFsc2UgcG9zaXRpdmVzXG5mdW5jdGlvbiBpc1N5bWJvbChvYmopIHtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogaW5zdGFuY2VvZiBTeW1ib2w7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIXN5bVRvU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3ltVG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNCaWdJbnQob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIWJpZ0ludFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5IHx8IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiB0aGlzOyB9O1xuZnVuY3Rpb24gaGFzKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIGhhc093bi5jYWxsKG9iaiwga2V5KTtcbn1cblxuZnVuY3Rpb24gdG9TdHIob2JqKSB7XG4gICAgcmV0dXJuIG9iamVjdFRvU3RyaW5nLmNhbGwob2JqKTtcbn1cblxuZnVuY3Rpb24gbmFtZU9mKGYpIHtcbiAgICBpZiAoZi5uYW1lKSB7IHJldHVybiBmLm5hbWU7IH1cbiAgICB2YXIgbSA9ICRtYXRjaC5jYWxsKGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChmKSwgL15mdW5jdGlvblxccyooW1xcdyRdKykvKTtcbiAgICBpZiAobSkgeyByZXR1cm4gbVsxXTsgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gICAgaWYgKHhzLmluZGV4T2YpIHsgcmV0dXJuIHhzLmluZGV4T2YoeCk7IH1cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoeHNbaV0gPT09IHgpIHsgcmV0dXJuIGk7IH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBpc01hcCh4KSB7XG4gICAgaWYgKCFtYXBTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuICAgIGlmICghd2Vha01hcEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha01hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1JlZih4KSB7XG4gICAgaWYgKCF3ZWFrUmVmRGVyZWYgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha1JlZkRlcmVmLmNhbGwoeCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1NldCh4KSB7XG4gICAgaWYgKCFzZXRTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtTZXQoeCkge1xuICAgIGlmICghd2Vha1NldEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha1NldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCh4KSB7XG4gICAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB4IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgeC5ub2RlTmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHguZ2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0ciwgb3B0cykge1xuICAgIGlmIChzdHIubGVuZ3RoID4gb3B0cy5tYXhTdHJpbmdMZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IHN0ci5sZW5ndGggLSBvcHRzLm1heFN0cmluZ0xlbmd0aDtcbiAgICAgICAgdmFyIHRyYWlsZXIgPSAnLi4uICcgKyByZW1haW5pbmcgKyAnIG1vcmUgY2hhcmFjdGVyJyArIChyZW1haW5pbmcgPiAxID8gJ3MnIDogJycpO1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZygkc2xpY2UuY2FsbChzdHIsIDAsIG9wdHMubWF4U3RyaW5nTGVuZ3RoKSwgb3B0cykgKyB0cmFpbGVyO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIHZhciBzID0gJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKHN0ciwgLyhbJ1xcXFxdKS9nLCAnXFxcXCQxJyksIC9bXFx4MDAtXFx4MWZdL2csIGxvd2J5dGUpO1xuICAgIHJldHVybiB3cmFwUXVvdGVzKHMsICdzaW5nbGUnLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gbG93Ynl0ZShjKSB7XG4gICAgdmFyIG4gPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHggPSB7XG4gICAgICAgIDg6ICdiJyxcbiAgICAgICAgOTogJ3QnLFxuICAgICAgICAxMDogJ24nLFxuICAgICAgICAxMjogJ2YnLFxuICAgICAgICAxMzogJ3InXG4gICAgfVtuXTtcbiAgICBpZiAoeCkgeyByZXR1cm4gJ1xcXFwnICsgeDsgfVxuICAgIHJldHVybiAnXFxcXHgnICsgKG4gPCAweDEwID8gJzAnIDogJycpICsgJHRvVXBwZXJDYXNlLmNhbGwobi50b1N0cmluZygxNikpO1xufVxuXG5mdW5jdGlvbiBtYXJrQm94ZWQoc3RyKSB7XG4gICAgcmV0dXJuICdPYmplY3QoJyArIHN0ciArICcpJztcbn1cblxuZnVuY3Rpb24gd2Vha0NvbGxlY3Rpb25PZih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUgKyAnIHsgPyB9Jztcbn1cblxuZnVuY3Rpb24gY29sbGVjdGlvbk9mKHR5cGUsIHNpemUsIGVudHJpZXMsIGluZGVudCkge1xuICAgIHZhciBqb2luZWRFbnRyaWVzID0gaW5kZW50ID8gaW5kZW50ZWRKb2luKGVudHJpZXMsIGluZGVudCkgOiAkam9pbi5jYWxsKGVudHJpZXMsICcsICcpO1xuICAgIHJldHVybiB0eXBlICsgJyAoJyArIHNpemUgKyAnKSB7JyArIGpvaW5lZEVudHJpZXMgKyAnfSc7XG59XG5cbmZ1bmN0aW9uIHNpbmdsZUxpbmVWYWx1ZXMoeHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpbmRleE9mKHhzW2ldLCAnXFxuJykgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRJbmRlbnQob3B0cywgZGVwdGgpIHtcbiAgICB2YXIgYmFzZUluZGVudDtcbiAgICBpZiAob3B0cy5pbmRlbnQgPT09ICdcXHQnKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAnXFx0JztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmluZGVudCA9PT0gJ251bWJlcicgJiYgb3B0cy5pbmRlbnQgPiAwKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAkam9pbi5jYWxsKEFycmF5KG9wdHMuaW5kZW50ICsgMSksICcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IGJhc2VJbmRlbnQsXG4gICAgICAgIHByZXY6ICRqb2luLmNhbGwoQXJyYXkoZGVwdGggKyAxKSwgYmFzZUluZGVudClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBpbmRlbnRlZEpvaW4oeHMsIGluZGVudCkge1xuICAgIGlmICh4cy5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XG4gICAgdmFyIGxpbmVKb2luZXIgPSAnXFxuJyArIGluZGVudC5wcmV2ICsgaW5kZW50LmJhc2U7XG4gICAgcmV0dXJuIGxpbmVKb2luZXIgKyAkam9pbi5jYWxsKHhzLCAnLCcgKyBsaW5lSm9pbmVyKSArICdcXG4nICsgaW5kZW50LnByZXY7XG59XG5cbmZ1bmN0aW9uIGFyck9iaktleXMob2JqLCBpbnNwZWN0KSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmopO1xuICAgIHZhciB4cyA9IFtdO1xuICAgIGlmIChpc0Fycikge1xuICAgICAgICB4cy5sZW5ndGggPSBvYmoubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeHNbaV0gPSBoYXMob2JqLCBpKSA/IGluc3BlY3Qob2JqW2ldLCBvYmopIDogJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN5bXMgPSB0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJyA/IGdPUFMob2JqKSA6IFtdO1xuICAgIHZhciBzeW1NYXA7XG4gICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzKSB7XG4gICAgICAgIHN5bU1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHN5bXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHN5bU1hcFsnJCcgKyBzeW1zW2tdXSA9IHN5bXNba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgaWYgKCFoYXMob2JqLCBrZXkpKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChpc0FyciAmJiBTdHJpbmcoTnVtYmVyKGtleSkpID09PSBrZXkgJiYga2V5IDwgb2JqLmxlbmd0aCkgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMgJiYgc3ltTWFwWyckJyArIGtleV0gaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBzaGFtbWVkIFN5bWJvbHMsIHdoaWNoIGFyZSBzdG9yZWQgYXMgc3RyaW5ncywgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIGtleSBzZWN0aW9uXG4gICAgICAgICAgICBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmICgkdGVzdC5jYWxsKC9bXlxcdyRdLywga2V5KSkge1xuICAgICAgICAgICAgeHMucHVzaChpbnNwZWN0KGtleSwgb2JqKSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhzLnB1c2goa2V5ICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN5bXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VudW1lcmFibGUuY2FsbChvYmosIHN5bXNbal0pKSB7XG4gICAgICAgICAgICAgICAgeHMucHVzaCgnWycgKyBpbnNwZWN0KHN5bXNbal0pICsgJ106ICcgKyBpbnNwZWN0KG9ialtzeW1zW2pdXSwgb2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHhzO1xufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgcGVyY2VudFR3ZW50aWVzID0gLyUyMC9nO1xuXG52YXIgRm9ybWF0ID0ge1xuICAgIFJGQzE3Mzg6ICdSRkMxNzM4JyxcbiAgICBSRkMzOTg2OiAnUkZDMzk4Nidcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdkZWZhdWx0JzogRm9ybWF0LlJGQzM5ODYsXG4gICAgZm9ybWF0dGVyczoge1xuICAgICAgICBSRkMxNzM4OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlLmNhbGwodmFsdWUsIHBlcmNlbnRUd2VudGllcywgJysnKTtcbiAgICAgICAgfSxcbiAgICAgICAgUkZDMzk4NjogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUkZDMTczODogRm9ybWF0LlJGQzE3MzgsXG4gICAgUkZDMzk4NjogRm9ybWF0LlJGQzM5ODZcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYWxsb3dTcGFyc2U6IGZhbHNlLFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBjb21tYTogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IGZhbHNlLFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBhcnNlQXJyYXlzOiB0cnVlLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcbiAgICB2YXIgc2tpcEluZGV4ID0gLTE7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhlIHV0Zjggc2VudGluZWwgd2FzIGZvdW5kXG4gICAgdmFyIGk7XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdGlvbnMuY2hhcnNldDtcbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocGFydHNbaV0uaW5kZXhPZigndXRmOD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAndXRmLTgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09IGlzb1NlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnaXNvLTg4NTktMSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgaSA9IHBhcnRzLmxlbmd0aDsgLy8gVGhlIGVzbGludCBzZXR0aW5ncyBkbyBub3QgYWxsb3cgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IHNraXBJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPyBudWxsIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZSgwLCBwb3MpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSB1dGlscy5tYXliZU1hcChcbiAgICAgICAgICAgICAgICBwYXJzZUFycmF5VmFsdWUocGFydC5zbGljZShwb3MgKyAxKSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVuY29kZWRWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGVjb2RlcihlbmNvZGVkVmFsLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAndmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmludGVycHJldE51bWVyaWNFbnRpdGllcyAmJiBjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIHZhbCA9IGludGVycHJldE51bWVyaWNFbnRpdGllcyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQuaW5kZXhPZignW109JykgPiAtMSkge1xuICAgICAgICAgICAgdmFsID0gaXNBcnJheSh2YWwpID8gW3ZhbF0gOiB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzLmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgdmFyIGxlYWYgPSB2YWx1ZXNQYXJzZWQgPyB2YWwgOiBwYXJzZUFycmF5VmFsdWUodmFsLCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoY2xlYW5Sb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgY2xlYW5Sb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGVhblJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2NsZWFuUm9vdF0gPSBsZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGVhZiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVhZjtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nS2V5cyhnaXZlbktleSwgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpIHtcbiAgICBpZiAoIWdpdmVuS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gZG90IG5vdGF0aW9uIHRvIGJyYWNrZXQgbm90YXRpb25cbiAgICB2YXIga2V5ID0gb3B0aW9ucy5hbGxvd0RvdHMgPyBnaXZlbktleS5yZXBsYWNlKC9cXC4oW14uW10rKS9nLCAnWyQxXScpIDogZ2l2ZW5LZXk7XG5cbiAgICAvLyBUaGUgcmVnZXggY2h1bmtzXG5cbiAgICB2YXIgYnJhY2tldHMgPSAvKFxcW1teW1xcXV0qXSkvO1xuICAgIHZhciBjaGlsZCA9IC8oXFxbW15bXFxdXSpdKS9nO1xuXG4gICAgLy8gR2V0IHRoZSBwYXJlbnRcblxuICAgIHZhciBzZWdtZW50ID0gb3B0aW9ucy5kZXB0aCA+IDAgJiYgYnJhY2tldHMuZXhlYyhrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBzZWdtZW50ID8ga2V5LnNsaWNlKDAsIHNlZ21lbnQuaW5kZXgpIDoga2V5O1xuXG4gICAgLy8gU3Rhc2ggdGhlIHBhcmVudCBpZiBpdCBleGlzdHNcblxuICAgIHZhciBrZXlzID0gW107XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgdXNpbmcgcGxhaW4gb2JqZWN0cywgb3B0aW9uYWxseSBwcmVmaXgga2V5cyB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBvYmplY3QgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBwYXJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAga2V5cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGNoaWxkcmVuIGFwcGVuZGluZyB0byB0aGUgYXJyYXkgdW50aWwgd2UgaGl0IGRlcHRoXG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKG9wdGlvbnMuZGVwdGggPiAwICYmIChzZWdtZW50ID0gY2hpbGQuZXhlYyhrZXkpKSAhPT0gbnVsbCAmJiBpIDwgb3B0aW9ucy5kZXB0aCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc2VnbWVudFsxXS5zbGljZSgxLCAtMSkpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMucHVzaChzZWdtZW50WzFdKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIG9wdHMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHZhciBjaGFyc2V0ID0gdHlwZW9mIG9wdHMuY2hhcnNldCA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5jaGFyc2V0IDogb3B0cy5jaGFyc2V0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dEb3RzOiB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cyxcbiAgICAgICAgYWxsb3dQcm90b3R5cGVzOiB0eXBlb2Ygb3B0cy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzLFxuICAgICAgICBhbGxvd1NwYXJzZTogdHlwZW9mIG9wdHMuYWxsb3dTcGFyc2UgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dTcGFyc2UgOiBkZWZhdWx0cy5hbGxvd1NwYXJzZSxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVyOiB0eXBlb2Ygb3B0cy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcixcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdHMuZGVsaW1pdGVyKSA/IG9wdHMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb24sIG5vLWV4dHJhLXBhcmVuc1xuICAgICAgICBkZXB0aDogKHR5cGVvZiBvcHRzLmRlcHRoID09PSAnbnVtYmVyJyB8fCBvcHRzLmRlcHRoID09PSBmYWxzZSkgPyArb3B0cy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoLFxuICAgICAgICBpZ25vcmVRdWVyeVByZWZpeDogb3B0cy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZSxcbiAgICAgICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiB0eXBlb2Ygb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgPT09ICdib29sZWFuJyA/IG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIDogZGVmYXVsdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzLFxuICAgICAgICBwYXJhbWV0ZXJMaW1pdDogdHlwZW9mIG9wdHMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0cy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0LFxuICAgICAgICBwYXJzZUFycmF5czogb3B0cy5wYXJzZUFycmF5cyAhPT0gZmFsc2UsXG4gICAgICAgIHBsYWluT2JqZWN0czogdHlwZW9mIG9wdHMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRzLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cyxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucywgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dTcGFyc2UgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFNpZGVDaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBzcGxpdCA9IFN0cmluZy5wcm90b3R5cGUuc3BsaXQ7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdEZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ251bWJlcidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ3N5bWJvbCdcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdiaWdpbnQnO1xufTtcblxudmFyIHNlbnRpbmVsID0ge307XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXQsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldCxcbiAgICBzaWRlQ2hhbm5lbFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcblxuICAgIHZhciB0bXBTYyA9IHNpZGVDaGFubmVsO1xuICAgIHZhciBzdGVwID0gMDtcbiAgICB2YXIgZmluZEZsYWcgPSBmYWxzZTtcbiAgICB3aGlsZSAoKHRtcFNjID0gdG1wU2MuZ2V0KHNlbnRpbmVsKSkgIT09IHZvaWQgdW5kZWZpbmVkICYmICFmaW5kRmxhZykge1xuICAgICAgICAvLyBXaGVyZSBvYmplY3QgbGFzdCBhcHBlYXJlZCBpbiB0aGUgcmVmIHRyZWVcbiAgICAgICAgdmFyIHBvcyA9IHRtcFNjLmdldChvYmplY3QpO1xuICAgICAgICBzdGVwICs9IDE7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDeWNsaWMgb2JqZWN0IHZhbHVlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmRGbGFnID0gdHJ1ZTsgLy8gQnJlYWsgd2hpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRtcFNjLmdldChzZW50aW5lbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9uTnVsbGlzaFByaW1pdGl2ZShvYmopIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlc0FycmF5ID0gc3BsaXQuY2FsbChTdHJpbmcob2JqKSwgJywnKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzSm9pbmVkID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXNBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXNKb2luZWQgKz0gKGkgPT09IDAgPyAnJyA6ICcsJykgKyBmb3JtYXR0ZXIoZW5jb2Rlcih2YWx1ZXNBcnJheVtpXSwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ3ZhbHVlJywgZm9ybWF0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArIChpc0FycmF5KG9iaikgJiYgdmFsdWVzQXJyYXkubGVuZ3RoID09PSAxID8gJ1tdJyA6ICcnKSArICc9JyArIHZhbHVlc0pvaW5lZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICd2YWx1ZScsIGZvcm1hdCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gam9pbiBlbGVtZW50cyBpblxuICAgICAgICBvYmpLZXlzID0gW3sgdmFsdWU6IG9iai5sZW5ndGggPiAwID8gb2JqLmpvaW4oJywnKSB8fCBudWxsIDogdm9pZCB1bmRlZmluZWQgfV07XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIG9iaktleXMgPSBzb3J0ID8ga2V5cy5zb3J0KHNvcnQpIDoga2V5cztcbiAgICB9XG5cbiAgICB2YXIgYWRqdXN0ZWRQcmVmaXggPSBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAxID8gcHJlZml4ICsgJ1tdJyA6IHByZWZpeDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqS2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tqXTtcbiAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGtleS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBrZXkudmFsdWUgOiBvYmpba2V5XTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBrZXlQcmVmaXggPSBpc0FycmF5KG9iailcbiAgICAgICAgICAgID8gdHlwZW9mIGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdmdW5jdGlvbicgPyBnZW5lcmF0ZUFycmF5UHJlZml4KGFkanVzdGVkUHJlZml4LCBrZXkpIDogYWRqdXN0ZWRQcmVmaXhcbiAgICAgICAgICAgIDogYWRqdXN0ZWRQcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsga2V5IDogJ1snICsga2V5ICsgJ10nKTtcblxuICAgICAgICBzaWRlQ2hhbm5lbC5zZXQob2JqZWN0LCBzdGVwKTtcbiAgICAgICAgdmFyIHZhbHVlU2lkZUNoYW5uZWwgPSBnZXRTaWRlQ2hhbm5lbCgpO1xuICAgICAgICB2YWx1ZVNpZGVDaGFubmVsLnNldChzZW50aW5lbCwgc2lkZUNoYW5uZWwpO1xuICAgICAgICBwdXNoVG9BcnJheSh2YWx1ZXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5UHJlZml4LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgIGVuY29kZXIsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBjaGFyc2V0LFxuICAgICAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxudmFyIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gb3B0cy5jaGFyc2V0IHx8IGRlZmF1bHRzLmNoYXJzZXQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsIG9wdHMuZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1hdCA9IG9wdHMuZm9ybWF0O1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cbiAgICB2YXIgZmlsdGVyID0gZGVmYXVsdHMuZmlsdGVyO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgaXNBcnJheShvcHRzLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkUXVlcnlQcmVmaXg6IHR5cGVvZiBvcHRzLmFkZFF1ZXJ5UHJlZml4ID09PSAnYm9vbGVhbicgPyBvcHRzLmFkZFF1ZXJ5UHJlZml4IDogZGVmYXVsdHMuYWRkUXVlcnlQcmVmaXgsXG4gICAgICAgIGFsbG93RG90czogdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHMsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0cy5kZWxpbWl0ZXIsXG4gICAgICAgIGVuY29kZTogdHlwZW9mIG9wdHMuZW5jb2RlID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZSA6IGRlZmF1bHRzLmVuY29kZSxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cyAmJiBvcHRzLmFycmF5Rm9ybWF0IGluIGFycmF5UHJlZml4R2VuZXJhdG9ycykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuYXJyYXlGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChvcHRzICYmICdpbmRpY2VzJyBpbiBvcHRzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0cy5pbmRpY2VzID8gJ2luZGljZXMnIDogJ3JlcGVhdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSAnaW5kaWNlcyc7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlQXJyYXlQcmVmaXggPSBhcnJheVByZWZpeEdlbmVyYXRvcnNbYXJyYXlGb3JtYXRdO1xuXG4gICAgaWYgKCFvYmpLZXlzKSB7XG4gICAgICAgIG9iaktleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gICAgfVxuXG4gICAgdmFyIHNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iaktleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbaV07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoVG9BcnJheShrZXlzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcE51bGxzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXQsXG4gICAgICAgICAgICBzaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgLyogZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOiAwICovXG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyAmJiAob3B0aW9ucy5wbGFpbk9iamVjdHMgfHwgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpKSB8fCAhaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVjb2RlciwgY2hhcnNldCkge1xuICAgIHZhciBzdHJXaXRob3V0UGx1cyA9IHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIC8vIHVuZXNjYXBlIG5ldmVyIHRocm93cywgbm8gdHJ5Li4uY2F0Y2ggbmVlZGVkOlxuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXMucmVwbGFjZSgvJVswLTlhLWZdezJ9L2dpLCB1bmVzY2FwZSk7XG4gICAgfVxuICAgIC8vIHV0Zi04XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJXaXRob3V0UGx1cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXM7XG4gICAgfVxufTtcblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGRlZmF1bHRFbmNvZGVyLCBjaGFyc2V0LCBraW5kLCBmb3JtYXQpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHN0cjtcbiAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgc3RyaW5nID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJpbmcgPSBTdHJpbmcoc3RyKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGUoc3RyaW5nKS5yZXBsYWNlKC8ldVswLTlhLWZdezR9L2dpLCBmdW5jdGlvbiAoJDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJTI2JTIzJyArIHBhcnNlSW50KCQwLnNsaWNlKDIpLCAxNikgKyAnJTNCJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYyA9PT0gMHgyRCAvLyAtXG4gICAgICAgICAgICB8fCBjID09PSAweDJFIC8vIC5cbiAgICAgICAgICAgIHx8IGMgPT09IDB4NUYgLy8gX1xuICAgICAgICAgICAgfHwgYyA9PT0gMHg3RSAvLyB+XG4gICAgICAgICAgICB8fCAoYyA+PSAweDMwICYmIGMgPD0gMHgzOSkgLy8gMC05XG4gICAgICAgICAgICB8fCAoYyA+PSAweDQxICYmIGMgPD0gMHg1QSkgLy8gYS16XG4gICAgICAgICAgICB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSkgLy8gQS1aXG4gICAgICAgICAgICB8fCAoZm9ybWF0ID09PSBmb3JtYXRzLlJGQzE3MzggJiYgKGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOSkpIC8vICggKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG91dCArPSBzdHJpbmcuY2hhckF0KGkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIGhleFRhYmxlW2NdO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPj0gMHhFMDAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhFMCB8IChjID4+IDEyKV0gKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAxO1xuICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNGRikgPDwgMTApIHwgKHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHgzRkYpKTtcbiAgICAgICAgLyogZXNsaW50IG9wZXJhdG9yLWxpbmVicmVhazogWzIsIFwiYmVmb3JlXCJdICovXG4gICAgICAgIG91dCArPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxudmFyIGNvbXBhY3QgPSBmdW5jdGlvbiBjb21wYWN0KHZhbHVlKSB7XG4gICAgdmFyIHF1ZXVlID0gW3sgb2JqOiB7IG86IHZhbHVlIH0sIHByb3A6ICdvJyB9XTtcbiAgICB2YXIgcmVmcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlW2ldO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHJlZnMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goeyBvYmo6IG9iaiwgcHJvcDoga2V5IH0pO1xuICAgICAgICAgICAgICAgIHJlZnMucHVzaCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcGFjdFF1ZXVlKHF1ZXVlKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxudmFyIGNvbWJpbmUgPSBmdW5jdGlvbiBjb21iaW5lKGEsIGIpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGEsIGIpO1xufTtcblxudmFyIG1heWJlTWFwID0gZnVuY3Rpb24gbWF5YmVNYXAodmFsLCBmbikge1xuICAgIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgbWFwcGVkLnB1c2goZm4odmFsW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZuKHZhbCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbWJpbmU6IGNvbWJpbmUsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gICAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICAgIG1heWJlTWFwOiBtYXliZU1hcCxcbiAgICBtZXJnZTogbWVyZ2Vcbn07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciAkV2Vha01hcCA9IEdldEludHJpbnNpYygnJVdlYWtNYXAlJywgdHJ1ZSk7XG52YXIgJE1hcCA9IEdldEludHJpbnNpYygnJU1hcCUnLCB0cnVlKTtcblxudmFyICR3ZWFrTWFwR2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkd2Vha01hcFNldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBIYXMgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xudmFyICRtYXBHZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJG1hcFNldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbnZhciAkbWFwSGFzID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xuXG4vKlxuICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGxpc3QgcmV0dXJuaW5nIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gKiBnaXZlbiBrZXkuXG4gKlxuICogVGhhdCBub2RlIGlzIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXQgaWYgaXQncyBhY2Nlc3NlZFxuICogYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSB0aGUgd2hvbGUgbGlzdC4gQnkgZG9pbmcgc28sIGFsbCB0aGUgcmVjZW50bHlcbiAqIHVzZWQgbm9kZXMgY2FuIGJlIGFjY2Vzc2VkIHJlbGF0aXZlbHkgcXVpY2tseS5cbiAqL1xudmFyIGxpc3RHZXROb2RlID0gZnVuY3Rpb24gKGxpc3QsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdGZvciAodmFyIHByZXYgPSBsaXN0LCBjdXJyOyAoY3VyciA9IHByZXYubmV4dCkgIT09IG51bGw7IHByZXYgPSBjdXJyKSB7XG5cdFx0aWYgKGN1cnIua2V5ID09PSBrZXkpIHtcblx0XHRcdHByZXYubmV4dCA9IGN1cnIubmV4dDtcblx0XHRcdGN1cnIubmV4dCA9IGxpc3QubmV4dDtcblx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxudmFyIGxpc3RHZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZTtcbn07XG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHRuZXh0OiBvYmplY3RzLm5leHQsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG59O1xudmFyIGxpc3RIYXMgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsKCkge1xuXHR2YXIgJHdtO1xuXHR2YXIgJG07XG5cdHZhciAkbztcblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0OiBmdW5jdGlvbiAoa2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0R2V0KCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBIYXMoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBIYXMoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoISR3bSkge1xuXHRcdFx0XHRcdCR3bSA9IG5ldyAkV2Vha01hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR3ZWFrTWFwU2V0KCR3bSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCEkbSkge1xuXHRcdFx0XHRcdCRtID0gbmV3ICRNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghJG8pIHtcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdCAqIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0IGFzIGFuIGVtcHR5IG5vZGUsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZVxuXHRcdFx0XHRcdCAqIHRvIHNwZWNpYWwtY2FzZSBoYW5kbGluZyBvZiB0aGUgZmlyc3Qgbm9kZTogd2UgY2FuIGFsd2F5cyByZWZlciB0b1xuXHRcdFx0XHRcdCAqIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0JG8gPSB7IGtleToge30sIG5leHQ6IG51bGwgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0U2V0KCRvLCBrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBjaGFubmVsO1xufTtcbiIsImZ1bmN0aW9uIEFnZW50KCkge1xuICB0aGlzLl9kZWZhdWx0cyA9IFtdO1xufVxuXG5mb3IgKGNvbnN0IGZuIG9mIFtcbiAgJ3VzZScsXG4gICdvbicsXG4gICdvbmNlJyxcbiAgJ3NldCcsXG4gICdxdWVyeScsXG4gICd0eXBlJyxcbiAgJ2FjY2VwdCcsXG4gICdhdXRoJyxcbiAgJ3dpdGhDcmVkZW50aWFscycsXG4gICdzb3J0UXVlcnknLFxuICAncmV0cnknLFxuICAnb2snLFxuICAncmVkaXJlY3RzJyxcbiAgJ3RpbWVvdXQnLFxuICAnYnVmZmVyJyxcbiAgJ3NlcmlhbGl6ZScsXG4gICdwYXJzZScsXG4gICdjYScsXG4gICdrZXknLFxuICAncGZ4JyxcbiAgJ2NlcnQnLFxuICAnZGlzYWJsZVRMU0NlcnRzJ1xuXSkge1xuICAvLyBEZWZhdWx0IHNldHRpbmcgZm9yIGFsbCByZXF1ZXN0cyBmcm9tIHRoaXMgYWdlbnRcbiAgQWdlbnQucHJvdG90eXBlW2ZuXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgdGhpcy5fZGVmYXVsdHMucHVzaCh7IGZuLCBhcmdzIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5BZ2VudC5wcm90b3R5cGUuX3NldERlZmF1bHRzID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgZm9yIChjb25zdCBkZWYgb2YgdGhpcy5fZGVmYXVsdHMpIHtcbiAgICByZXF1ZXN0W2RlZi5mbl0oLi4uZGVmLmFyZ3MpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFnZW50O1xuIiwiLyoqXG4gKiBSb290IHJlZmVyZW5jZSBmb3IgaWZyYW1lcy5cbiAqL1xuXG5sZXQgcm9vdDtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBCcm93c2VyIHdpbmRvd1xuICByb290ID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gT3RoZXIgZW52aXJvbm1lbnRzXG4gIGNvbnNvbGUud2FybihcbiAgICAnVXNpbmcgYnJvd3Nlci1vbmx5IHZlcnNpb24gb2Ygc3VwZXJhZ2VudCBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudCdcbiAgKTtcbiAgcm9vdCA9IHRoaXM7XG59IGVsc2Uge1xuICAvLyBXZWIgV29ya2VyXG4gIHJvb3QgPSBzZWxmO1xufVxuXG5jb25zdCBFbWl0dGVyID0gcmVxdWlyZSgnY29tcG9uZW50LWVtaXR0ZXInKTtcbmNvbnN0IHNhZmVTdHJpbmdpZnkgPSByZXF1aXJlKCdmYXN0LXNhZmUtc3RyaW5naWZ5Jyk7XG5jb25zdCBxcyA9IHJlcXVpcmUoJ3FzJyk7XG5jb25zdCBSZXF1ZXN0QmFzZSA9IHJlcXVpcmUoJy4vcmVxdWVzdC1iYXNlJyk7XG5jb25zdCB7IGlzT2JqZWN0LCBtaXhpbiwgaGFzT3duIH0gPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCBSZXNwb25zZUJhc2UgPSByZXF1aXJlKCcuL3Jlc3BvbnNlLWJhc2UnKTtcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudC1iYXNlJyk7XG5cbi8qKlxuICogTm9vcC5cbiAqL1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLyoqXG4gKiBFeHBvc2UgYHJlcXVlc3RgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGhvZCwgdXJsKSB7XG4gIC8vIGNhbGxiYWNrXG4gIGlmICh0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCkuZW5kKHVybCk7XG4gIH1cblxuICAvLyB1cmwgZmlyc3RcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdCgnR0VUJywgbWV0aG9kKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbn07XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cztcblxuY29uc3QgcmVxdWVzdCA9IGV4cG9ydHM7XG5cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbi8qKlxuICogRGV0ZXJtaW5lIFhIUi5cbiAqL1xuXG5yZXF1ZXN0LmdldFhIUiA9ICgpID0+IHtcbiAgaWYgKFxuICAgIHJvb3QuWE1MSHR0cFJlcXVlc3QgJiZcbiAgICAoIXJvb3QubG9jYXRpb24gfHwgcm9vdC5sb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6JylcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGNvdWxkIG5vdCBmaW5kIFhIUicpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGFkZGVkIHRvIHN1cHBvcnQgSUUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmNvbnN0IHRyaW0gPSAnJy50cmltID8gKHMpID0+IHMudHJpbSgpIDogKHMpID0+IHMucmVwbGFjZSgvKF5cXHMqfFxccyokKS9nLCAnJyk7XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBnaXZlbiBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUob2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkgcmV0dXJuIG9iamVjdDtcbiAgY29uc3QgcGFpcnMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKGhhc093bihvYmplY3QsIGtleSkpIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXksIG9iamVjdFtrZXldKTtcbiAgfVxuXG4gIHJldHVybiBwYWlycy5qb2luKCcmJyk7XG59XG5cbi8qKlxuICogSGVscHMgJ3NlcmlhbGl6ZScgd2l0aCBzZXJpYWxpemluZyBhcnJheXMuXG4gKiBNdXRhdGVzIHRoZSBwYWlycyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYWlyc1xuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKi9cblxuZnVuY3Rpb24gcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcGFpcnMucHVzaChlbmNvZGVVUkkoa2V5KSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCB2IG9mIHZhbHVlKSB7XG4gICAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5LCB2KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBzdWJrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmIChoYXNPd24odmFsdWUsIHN1YmtleSkpXG4gICAgICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBgJHtrZXl9WyR7c3Via2V5fV1gLCB2YWx1ZVtzdWJrZXldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGFpcnMucHVzaChlbmNvZGVVUkkoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuICB9XG59XG5cbi8qKlxuICogRXhwb3NlIHNlcmlhbGl6YXRpb24gbWV0aG9kLlxuICovXG5cbnJlcXVlc3Quc2VyaWFsaXplT2JqZWN0ID0gc2VyaWFsaXplO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiB4LXd3dy1mb3JtLXVybGVuY29kZWQgYHN0cmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VTdHJpbmcoc3RyaW5nXykge1xuICBjb25zdCBvYmplY3QgPSB7fTtcbiAgY29uc3QgcGFpcnMgPSBzdHJpbmdfLnNwbGl0KCcmJyk7XG4gIGxldCBwYWlyO1xuICBsZXQgcG9zO1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW5ndGhfID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuZ3RoXzsgKytpKSB7XG4gICAgcGFpciA9IHBhaXJzW2ldO1xuICAgIHBvcyA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICBvYmplY3RbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIpXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3RbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2xpY2UoMCwgcG9zKSldID0gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICBwYWlyLnNsaWNlKHBvcyArIDEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59XG5cbi8qKlxuICogRXhwb3NlIHBhcnNlci5cbiAqL1xuXG5yZXF1ZXN0LnBhcnNlU3RyaW5nID0gcGFyc2VTdHJpbmc7XG5cbi8qKlxuICogRGVmYXVsdCBNSU1FIHR5cGUgbWFwLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnR5cGVzLnhtbCA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICpcbiAqL1xuXG5yZXF1ZXN0LnR5cGVzID0ge1xuICBodG1sOiAndGV4dC9odG1sJyxcbiAganNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICB4bWw6ICd0ZXh0L3htbCcsXG4gIHVybGVuY29kZWQ6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICBmb3JtOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgJ2Zvcm0tZGF0YSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG4vKipcbiAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQuc2VyaWFsaXplWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKG9iail7XG4gKiAgICAgICByZXR1cm4gJ2dlbmVyYXRlZCB4bWwgaGVyZSc7XG4gKiAgICAgfTtcbiAqXG4gKi9cblxucmVxdWVzdC5zZXJpYWxpemUgPSB7XG4gICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBxcy5zdHJpbmdpZnksXG4gICdhcHBsaWNhdGlvbi9qc29uJzogc2FmZVN0cmluZ2lmeVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IHBhcnNlcnMuXG4gKlxuICogICAgIHN1cGVyYWdlbnQucGFyc2VbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24oc3RyKXtcbiAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAqICAgICB9O1xuICpcbiAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cmluZ18pIHtcbiAgY29uc3QgbGluZXMgPSBzdHJpbmdfLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IGZpZWxkcyA9IHt9O1xuICBsZXQgaW5kZXg7XG4gIGxldCBsaW5lO1xuICBsZXQgZmllbGQ7XG4gIGxldCB2YWx1ZTtcblxuICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoXyA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbmd0aF87ICsraSkge1xuICAgIGxpbmUgPSBsaW5lc1tpXTtcbiAgICBpbmRleCA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIGNvdWxkIGJlIGVtcHR5IGxpbmUsIGp1c3Qgc2tpcCBpdFxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZmllbGQgPSBsaW5lLnNsaWNlKDAsIGluZGV4KS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYG1pbWVgIGlzIGpzb24gb3IgaGFzICtqc29uIHN0cnVjdHVyZWQgc3ludGF4IHN1ZmZpeC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzSlNPTihtaW1lKSB7XG4gIC8vIHNob3VsZCBtYXRjaCAvanNvbiBvciAranNvblxuICAvLyBidXQgbm90IC9qc29uLXNlcVxuICByZXR1cm4gL1svK11qc29uKCR8W14tXFx3XSkvaS50ZXN0KG1pbWUpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlc3BvbnNlYCB3aXRoIHRoZSBnaXZlbiBgeGhyYC5cbiAqXG4gKiAgLSBzZXQgZmxhZ3MgKC5vaywgLmVycm9yLCBldGMpXG4gKiAgLSBwYXJzZSBoZWFkZXJcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgQWxpYXNpbmcgYHN1cGVyYWdlbnRgIGFzIGByZXF1ZXN0YCBpcyBuaWNlOlxuICpcbiAqICAgICAgcmVxdWVzdCA9IHN1cGVyYWdlbnQ7XG4gKlxuICogIFdlIGNhbiB1c2UgdGhlIHByb21pc2UtbGlrZSBBUEksIG9yIHBhc3MgY2FsbGJhY2tzOlxuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy8nKS5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqICAgICAgcmVxdWVzdC5nZXQoJy8nLCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBTZW5kaW5nIGRhdGEgY2FuIGJlIGNoYWluZWQ6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJylcbiAqICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIE9yIHBhc3NlZCB0byBgLnNlbmQoKWA6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJylcbiAqICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSwgZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAucG9zdCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInLCB7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogT3IgZnVydGhlciByZWR1Y2VkIHRvIGEgc2luZ2xlIGNhbGwgZm9yIHNpbXBsZSBjYXNlczpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInLCB7IG5hbWU6ICd0aicgfSwgZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBAcGFyYW0ge1hNTEhUVFBSZXF1ZXN0fSB4aHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBSZXNwb25zZShyZXF1ZXN0Xykge1xuICB0aGlzLnJlcSA9IHJlcXVlc3RfO1xuICB0aGlzLnhociA9IHRoaXMucmVxLnhocjtcbiAgLy8gcmVzcG9uc2VUZXh0IGlzIGFjY2Vzc2libGUgb25seSBpZiByZXNwb25zZVR5cGUgaXMgJycgb3IgJ3RleHQnIGFuZCBvbiBvbGRlciBicm93c2Vyc1xuICB0aGlzLnRleHQgPVxuICAgICh0aGlzLnJlcS5tZXRob2QgIT09ICdIRUFEJyAmJlxuICAgICAgKHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJycgfHwgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcpKSB8fFxuICAgIHR5cGVvZiB0aGlzLnhoci5yZXNwb25zZVR5cGUgPT09ICd1bmRlZmluZWQnXG4gICAgICA/IHRoaXMueGhyLnJlc3BvbnNlVGV4dFxuICAgICAgOiBudWxsO1xuICB0aGlzLnN0YXR1c1RleHQgPSB0aGlzLnJlcS54aHIuc3RhdHVzVGV4dDtcbiAgbGV0IHsgc3RhdHVzIH0gPSB0aGlzLnhocjtcbiAgLy8gaGFuZGxlIElFOSBidWc6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTAwNDY5NzIvbXNpZS1yZXR1cm5zLXN0YXR1cy1jb2RlLW9mLTEyMjMtZm9yLWFqYXgtcmVxdWVzdFxuICBpZiAoc3RhdHVzID09PSAxMjIzKSB7XG4gICAgc3RhdHVzID0gMjA0O1xuICB9XG5cbiAgdGhpcy5fc2V0U3RhdHVzUHJvcGVydGllcyhzdGF0dXMpO1xuICB0aGlzLmhlYWRlcnMgPSBwYXJzZUhlYWRlcih0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gIHRoaXMuaGVhZGVyID0gdGhpcy5oZWFkZXJzO1xuICAvLyBnZXRBbGxSZXNwb25zZUhlYWRlcnMgc29tZXRpbWVzIGZhbHNlbHkgcmV0dXJucyBcIlwiIGZvciBDT1JTIHJlcXVlc3RzLCBidXRcbiAgLy8gZ2V0UmVzcG9uc2VIZWFkZXIgc3RpbGwgd29ya3MuIHNvIHdlIGdldCBjb250ZW50LXR5cGUgZXZlbiBpZiBnZXR0aW5nXG4gIC8vIG90aGVyIGhlYWRlcnMgZmFpbHMuXG4gIHRoaXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSA9IHRoaXMueGhyLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKTtcbiAgdGhpcy5fc2V0SGVhZGVyUHJvcGVydGllcyh0aGlzLmhlYWRlcik7XG5cbiAgaWYgKHRoaXMudGV4dCA9PT0gbnVsbCAmJiByZXF1ZXN0Xy5fcmVzcG9uc2VUeXBlKSB7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy54aHIucmVzcG9uc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5ib2R5ID1cbiAgICAgIHRoaXMucmVxLm1ldGhvZCA9PT0gJ0hFQUQnXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuX3BhcnNlQm9keSh0aGlzLnRleHQgPyB0aGlzLnRleHQgOiB0aGlzLnhoci5yZXNwb25zZSk7XG4gIH1cbn1cblxubWl4aW4oUmVzcG9uc2UucHJvdG90eXBlLCBSZXNwb25zZUJhc2UucHJvdG90eXBlKTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYm9keSBgc3RyYC5cbiAqXG4gKiBVc2VkIGZvciBhdXRvLXBhcnNpbmcgb2YgYm9kaWVzLiBQYXJzZXJzXG4gKiBhcmUgZGVmaW5lZCBvbiB0aGUgYHN1cGVyYWdlbnQucGFyc2VgIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5fcGFyc2VCb2R5ID0gZnVuY3Rpb24gKHN0cmluZ18pIHtcbiAgbGV0IHBhcnNlID0gcmVxdWVzdC5wYXJzZVt0aGlzLnR5cGVdO1xuICBpZiAodGhpcy5yZXEuX3BhcnNlcikge1xuICAgIHJldHVybiB0aGlzLnJlcS5fcGFyc2VyKHRoaXMsIHN0cmluZ18pO1xuICB9XG5cbiAgaWYgKCFwYXJzZSAmJiBpc0pTT04odGhpcy50eXBlKSkge1xuICAgIHBhcnNlID0gcmVxdWVzdC5wYXJzZVsnYXBwbGljYXRpb24vanNvbiddO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlICYmIHN0cmluZ18gJiYgKHN0cmluZ18ubGVuZ3RoID4gMCB8fCBzdHJpbmdfIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgID8gcGFyc2Uoc3RyaW5nXylcbiAgICA6IG51bGw7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBgRXJyb3JgIHJlcHJlc2VudGF0aXZlIG9mIHRoaXMgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybiB7RXJyb3J9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS50b0Vycm9yID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCB7IHJlcSB9ID0gdGhpcztcbiAgY29uc3QgeyBtZXRob2QgfSA9IHJlcTtcbiAgY29uc3QgeyB1cmwgfSA9IHJlcTtcblxuICBjb25zdCBtZXNzYWdlID0gYGNhbm5vdCAke21ldGhvZH0gJHt1cmx9ICgke3RoaXMuc3RhdHVzfSlgO1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyb3Iuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVycm9yLm1ldGhvZCA9IG1ldGhvZDtcbiAgZXJyb3IudXJsID0gdXJsO1xuXG4gIHJldHVybiBlcnJvcjtcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZWAuXG4gKi9cblxucmVxdWVzdC5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RgIHdpdGggdGhlIGdpdmVuIGBtZXRob2RgIGFuZCBgdXJsYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX3F1ZXJ5ID0gdGhpcy5fcXVlcnkgfHwgW107XG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5oZWFkZXIgPSB7fTsgLy8gcHJlc2VydmVzIGhlYWRlciBuYW1lIGNhc2VcbiAgdGhpcy5faGVhZGVyID0ge307IC8vIGNvZXJjZXMgaGVhZGVyIG5hbWVzIHRvIGxvd2VyY2FzZVxuICB0aGlzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICBsZXQgcmVzID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICByZXMgPSBuZXcgUmVzcG9uc2Uoc2VsZik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignUGFyc2VyIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgcmVzcG9uc2UnKTtcbiAgICAgIGVycm9yLnBhcnNlID0gdHJ1ZTtcbiAgICAgIGVycm9yLm9yaWdpbmFsID0gZXJyO1xuICAgICAgLy8gaXNzdWUgIzY3NTogcmV0dXJuIHRoZSByYXcgcmVzcG9uc2UgaWYgdGhlIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAgICAgIGlmIChzZWxmLnhocikge1xuICAgICAgICAvLyBpZTkgZG9lc24ndCBoYXZlICdyZXNwb25zZScgcHJvcGVydHlcbiAgICAgICAgZXJyb3IucmF3UmVzcG9uc2UgPVxuICAgICAgICAgIHR5cGVvZiBzZWxmLnhoci5yZXNwb25zZVR5cGUgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHNlbGYueGhyLnJlc3BvbnNlVGV4dFxuICAgICAgICAgICAgOiBzZWxmLnhoci5yZXNwb25zZTtcbiAgICAgICAgLy8gaXNzdWUgIzg3NjogcmV0dXJuIHRoZSBodHRwIHN0YXR1cyBjb2RlIGlmIHRoZSByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gICAgICAgIGVycm9yLnN0YXR1cyA9IHNlbGYueGhyLnN0YXR1cyA/IHNlbGYueGhyLnN0YXR1cyA6IG51bGw7XG4gICAgICAgIGVycm9yLnN0YXR1c0NvZGUgPSBlcnJvci5zdGF0dXM7IC8vIGJhY2t3YXJkcy1jb21wYXQgb25seVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IucmF3UmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnJvci5zdGF0dXMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5jYWxsYmFjayhlcnJvcik7XG4gICAgfVxuXG4gICAgc2VsZi5lbWl0KCdyZXNwb25zZScsIHJlcyk7XG5cbiAgICBsZXQgbmV3X2Vycm9yO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXNlbGYuX2lzUmVzcG9uc2VPSyhyZXMpKSB7XG4gICAgICAgIG5ld19lcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICByZXMuc3RhdHVzVGV4dCB8fCByZXMudGV4dCB8fCAnVW5zdWNjZXNzZnVsIEhUVFAgcmVzcG9uc2UnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBuZXdfZXJyb3IgPSBlcnI7IC8vIG9rKCkgY2FsbGJhY2sgY2FuIHRocm93XG4gICAgfVxuXG4gICAgLy8gIzEwMDAgZG9uJ3QgY2F0Y2ggZXJyb3JzIGZyb20gdGhlIGNhbGxiYWNrIHRvIGF2b2lkIGRvdWJsZSBjYWxsaW5nIGl0XG4gICAgaWYgKG5ld19lcnJvcikge1xuICAgICAgbmV3X2Vycm9yLm9yaWdpbmFsID0gZXJyb3I7XG4gICAgICBuZXdfZXJyb3IucmVzcG9uc2UgPSByZXM7XG4gICAgICBuZXdfZXJyb3Iuc3RhdHVzID0gbmV3X2Vycm9yLnN0YXR1cyB8fCByZXMuc3RhdHVzO1xuICAgICAgc2VsZi5jYWxsYmFjayhuZXdfZXJyb3IsIHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIE1peGluIGBFbWl0dGVyYCBhbmQgYFJlcXVlc3RCYXNlYC5cbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbm1peGluKFJlcXVlc3QucHJvdG90eXBlLCBSZXF1ZXN0QmFzZS5wcm90b3R5cGUpO1xuXG4vKipcbiAqIFNldCBDb250ZW50LVR5cGUgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCByZXF1ZXN0LnR5cGVzW3R5cGVdIHx8IHR5cGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEFjY2VwdCB0byBgdHlwZWAsIG1hcHBpbmcgdmFsdWVzIGZyb20gYHJlcXVlc3QudHlwZXNgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy5qc29uID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnL2FnZW50JylcbiAqICAgICAgICAuYWNjZXB0KCdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXB0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5zZXQoJ0FjY2VwdCcsIHJlcXVlc3QudHlwZXNbdHlwZV0gfHwgdHlwZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgQXV0aG9yaXphdGlvbiBmaWVsZCB2YWx1ZSB3aXRoIGB1c2VyYCBhbmQgYHBhc3NgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Bhc3NdIG9wdGlvbmFsIGluIGNhc2Ugb2YgdXNpbmcgJ2JlYXJlcicgYXMgdHlwZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgd2l0aCAndHlwZScgcHJvcGVydHkgJ2F1dG8nLCAnYmFzaWMnIG9yICdiZWFyZXInIChkZWZhdWx0ICdiYXNpYycpXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXV0aCA9IGZ1bmN0aW9uICh1c2VyLCBwYXNzLCBvcHRpb25zKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBwYXNzID0gJyc7XG4gIGlmICh0eXBlb2YgcGFzcyA9PT0gJ29iamVjdCcgJiYgcGFzcyAhPT0gbnVsbCkge1xuICAgIC8vIHBhc3MgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9wdGlvbnNcbiAgICBvcHRpb25zID0gcGFzcztcbiAgICBwYXNzID0gJyc7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgdHlwZTogdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicgPyAnYmFzaWMnIDogJ2F1dG8nXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGVuY29kZXIgPSBvcHRpb25zLmVuY29kZXJcbiAgICA/IG9wdGlvbnMuZW5jb2RlclxuICAgIDogKHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gYnRvYShzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIGJhc2ljIGF1dGgsIGJ0b2EgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIH07XG5cbiAgcmV0dXJuIHRoaXMuX2F1dGgodXNlciwgcGFzcywgb3B0aW9ucywgZW5jb2Rlcik7XG59O1xuXG4vKipcbiAqIEFkZCBxdWVyeS1zdHJpbmcgYHZhbGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICByZXF1ZXN0LmdldCgnL3Nob2VzJylcbiAqICAgICAucXVlcnkoJ3NpemU9MTAnKVxuICogICAgIC5xdWVyeSh7IGNvbG9yOiAnYmx1ZScgfSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB2YWx1ZSA9IHNlcmlhbGl6ZSh2YWx1ZSk7XG4gIGlmICh2YWx1ZSkgdGhpcy5fcXVlcnkucHVzaCh2YWx1ZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBRdWV1ZSB0aGUgZ2l2ZW4gYGZpbGVgIGFzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIHNwZWNpZmllZCBgZmllbGRgLFxuICogd2l0aCBvcHRpb25hbCBgb3B0aW9uc2AgKG9yIGZpbGVuYW1lKS5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5hdHRhY2goJ2NvbnRlbnQnLCBuZXcgQmxvYihbJzxhIGlkPVwiYVwiPjxiIGlkPVwiYlwiPmhleSE8L2I+PC9hPiddLCB7IHR5cGU6IFwidGV4dC9odG1sXCJ9KSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7QmxvYnxGaWxlfSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbiAoZmllbGQsIGZpbGUsIG9wdGlvbnMpIHtcbiAgaWYgKGZpbGUpIHtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3VwZXJhZ2VudCBjYW4ndCBtaXggLnNlbmQoKSBhbmQgLmF0dGFjaCgpXCIpO1xuICAgIH1cblxuICAgIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKGZpZWxkLCBmaWxlLCBvcHRpb25zIHx8IGZpbGUubmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9nZXRGb3JtRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IHJvb3QuRm9ybURhdGEoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9mb3JtRGF0YTtcbn07XG5cbi8qKlxuICogSW52b2tlIHRoZSBjYWxsYmFjayB3aXRoIGBlcnJgIGFuZCBgcmVzYFxuICogYW5kIGhhbmRsZSBhcml0eSBjaGVjay5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyb3IsIHJlcykge1xuICBpZiAodGhpcy5fc2hvdWxkUmV0cnkoZXJyb3IsIHJlcykpIHtcbiAgICByZXR1cm4gdGhpcy5fcmV0cnkoKTtcbiAgfVxuXG4gIGNvbnN0IGZuID0gdGhpcy5fY2FsbGJhY2s7XG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG5cbiAgaWYgKGVycm9yKSB7XG4gICAgaWYgKHRoaXMuX21heFJldHJpZXMpIGVycm9yLnJldHJpZXMgPSB0aGlzLl9yZXRyaWVzIC0gMTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgZm4oZXJyb3IsIHJlcyk7XG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHgtZG9tYWluIGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNyb3NzRG9tYWluRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFxuICAgICdSZXF1ZXN0IGhhcyBiZWVuIHRlcm1pbmF0ZWRcXG5Qb3NzaWJsZSBjYXVzZXM6IHRoZSBuZXR3b3JrIGlzIG9mZmxpbmUsIE9yaWdpbiBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4sIHRoZSBwYWdlIGlzIGJlaW5nIHVubG9hZGVkLCBldGMuJ1xuICApO1xuICBlcnJvci5jcm9zc0RvbWFpbiA9IHRydWU7XG5cbiAgZXJyb3Iuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVycm9yLm1ldGhvZCA9IHRoaXMubWV0aG9kO1xuICBlcnJvci51cmwgPSB0aGlzLnVybDtcblxuICB0aGlzLmNhbGxiYWNrKGVycm9yKTtcbn07XG5cbi8vIFRoaXMgb25seSB3YXJucywgYmVjYXVzZSB0aGUgcmVxdWVzdCBpcyBzdGlsbCBsaWtlbHkgdG8gd29ya1xuUmVxdWVzdC5wcm90b3R5cGUuYWdlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnNvbGUud2FybignVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgdmVyc2lvbiBvZiBzdXBlcmFnZW50Jyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuY2EgPSBSZXF1ZXN0LnByb3RvdHlwZS5hZ2VudDtcblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IFJlcXVlc3QucHJvdG90eXBlLmNhO1xuXG4vLyBUaGlzIHRocm93cywgYmVjYXVzZSBpdCBjYW4ndCBzZW5kL3JlY2VpdmUgZGF0YSBhcyBleHBlY3RlZFxuUmVxdWVzdC5wcm90b3R5cGUud3JpdGUgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnU3RyZWFtaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQnXG4gICk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5waXBlID0gUmVxdWVzdC5wcm90b3R5cGUud3JpdGU7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCxcbiAqIHdlIGRvbid0IHdhbnQgdG8gc2VyaWFsaXplIHRoZXNlIDopXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBob3N0IG9iamVjdFxuICogQHJldHVybiB7Qm9vbGVhbn0gaXMgYSBob3N0IG9iamVjdFxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLl9pc0hvc3QgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIC8vIE5hdGl2ZSBvYmplY3RzIHN0cmluZ2lmeSB0byBbb2JqZWN0IEZpbGVdLCBbb2JqZWN0IEJsb2JdLCBbb2JqZWN0IEZvcm1EYXRhXSwgZXRjLlxuICByZXR1cm4gKFxuICAgIG9iamVjdCAmJlxuICAgIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkob2JqZWN0KSAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpICE9PSAnW29iamVjdCBPYmplY3RdJ1xuICApO1xufTtcblxuLyoqXG4gKiBJbml0aWF0ZSByZXF1ZXN0LCBpbnZva2luZyBjYWxsYmFjayBgZm4ocmVzKWBcbiAqIHdpdGggYW4gaW5zdGFuY2VvZiBgUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGZuKSB7XG4gIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnV2FybmluZzogLmVuZCgpIHdhcyBjYWxsZWQgdHdpY2UuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBzdXBlcmFnZW50J1xuICAgICk7XG4gIH1cblxuICB0aGlzLl9lbmRDYWxsZWQgPSB0cnVlO1xuXG4gIC8vIHN0b3JlIGNhbGxiYWNrXG4gIHRoaXMuX2NhbGxiYWNrID0gZm4gfHwgbm9vcDtcblxuICAvLyBxdWVyeXN0cmluZ1xuICB0aGlzLl9maW5hbGl6ZVF1ZXJ5U3RyaW5nKCk7XG5cbiAgdGhpcy5fZW5kKCk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fc2V0VXBsb2FkVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gdXBsb2FkIHRpbWVvdXQgaXQncyB3b2tycyBvbmx5IGlmIGRlYWRsaW5lIHRpbWVvdXQgaXMgb2ZmXG4gIGlmICh0aGlzLl91cGxvYWRUaW1lb3V0ICYmICF0aGlzLl91cGxvYWRUaW1lb3V0VGltZXIpIHtcbiAgICB0aGlzLl91cGxvYWRUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcihcbiAgICAgICAgJ1VwbG9hZCB0aW1lb3V0IG9mICcsXG4gICAgICAgIHNlbGYuX3VwbG9hZFRpbWVvdXQsXG4gICAgICAgICdFVElNRURPVVQnXG4gICAgICApO1xuICAgIH0sIHRoaXMuX3VwbG9hZFRpbWVvdXQpO1xuICB9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuUmVxdWVzdC5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpXG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soXG4gICAgICBuZXcgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQgZXZlbiBiZWZvcmUgLmVuZCgpIHdhcyBjYWxsZWQnKVxuICAgICk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHRoaXMueGhyID0gcmVxdWVzdC5nZXRYSFIoKTtcbiAgY29uc3QgeyB4aHIgfSA9IHRoaXM7XG4gIGxldCBkYXRhID0gdGhpcy5fZm9ybURhdGEgfHwgdGhpcy5fZGF0YTtcblxuICB0aGlzLl9zZXRUaW1lb3V0cygpO1xuXG4gIC8vIHN0YXRlIGNoYW5nZVxuICB4aHIuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsICgpID0+IHtcbiAgICBjb25zdCB7IHJlYWR5U3RhdGUgfSA9IHhocjtcbiAgICBpZiAocmVhZHlTdGF0ZSA+PSAyICYmIHNlbGYuX3Jlc3BvbnNlVGltZW91dFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQoc2VsZi5fcmVzcG9uc2VUaW1lb3V0VGltZXIpO1xuICAgIH1cblxuICAgIGlmIChyZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gSUU5LCByZWFkcyB0byBhbnkgcHJvcGVydHkgKGUuZy4gc3RhdHVzKSBvZmYgb2YgYW4gYWJvcnRlZCBYSFIgd2lsbFxuICAgIC8vIHJlc3VsdCBpbiB0aGUgZXJyb3IgXCJDb3VsZCBub3QgY29tcGxldGUgdGhlIG9wZXJhdGlvbiBkdWUgdG8gZXJyb3IgYzAwYzAyM2ZcIlxuICAgIGxldCBzdGF0dXM7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXR1cyA9IHhoci5zdGF0dXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzdGF0dXMgPSAwO1xuICAgIH1cblxuICAgIGlmICghc3RhdHVzKSB7XG4gICAgICBpZiAoc2VsZi50aW1lZG91dCB8fCBzZWxmLl9hYm9ydGVkKSByZXR1cm47XG4gICAgICByZXR1cm4gc2VsZi5jcm9zc0RvbWFpbkVycm9yKCk7XG4gICAgfVxuXG4gICAgc2VsZi5lbWl0KCdlbmQnKTtcbiAgfSk7XG5cbiAgLy8gcHJvZ3Jlc3NcbiAgY29uc3QgaGFuZGxlUHJvZ3Jlc3MgPSAoZGlyZWN0aW9uLCBlKSA9PiB7XG4gICAgaWYgKGUudG90YWwgPiAwKSB7XG4gICAgICBlLnBlcmNlbnQgPSAoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMDtcblxuICAgICAgaWYgKGUucGVyY2VudCA9PT0gMTAwKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChzZWxmLl91cGxvYWRUaW1lb3V0VGltZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCBlKTtcbiAgfTtcblxuICBpZiAodGhpcy5oYXNMaXN0ZW5lcnMoJ3Byb2dyZXNzJykpIHtcbiAgICB0cnkge1xuICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgaGFuZGxlUHJvZ3Jlc3MuYmluZChudWxsLCAnZG93bmxvYWQnKSk7XG4gICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICB4aHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ3Byb2dyZXNzJyxcbiAgICAgICAgICBoYW5kbGVQcm9ncmVzcy5iaW5kKG51bGwsICd1cGxvYWQnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWNjZXNzaW5nIHhoci51cGxvYWQgZmFpbHMgaW4gSUUgZnJvbSBhIHdlYiB3b3JrZXIsIHNvIGp1c3QgcHJldGVuZCBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgLy8gUmVwb3J0ZWQgaGVyZTpcbiAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvODM3MjQ1L3htbGh0dHByZXF1ZXN0LXVwbG9hZC10aHJvd3MtaW52YWxpZC1hcmd1bWVudC13aGVuLXVzZWQtZnJvbS13ZWItd29ya2VyLWNvbnRleHRcbiAgICB9XG4gIH1cblxuICBpZiAoeGhyLnVwbG9hZCkge1xuICAgIHRoaXMuX3NldFVwbG9hZFRpbWVvdXQoKTtcbiAgfVxuXG4gIC8vIGluaXRpYXRlIHJlcXVlc3RcbiAgdHJ5IHtcbiAgICBpZiAodGhpcy51c2VybmFtZSAmJiB0aGlzLnBhc3N3b3JkKSB7XG4gICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUsIHRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gc2VlICMxMTQ5XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soZXJyKTtcbiAgfVxuXG4gIC8vIENPUlNcbiAgaWYgKHRoaXMuX3dpdGhDcmVkZW50aWFscykgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgLy8gYm9keVxuICBpZiAoXG4gICAgIXRoaXMuX2Zvcm1EYXRhICYmXG4gICAgdGhpcy5tZXRob2QgIT09ICdHRVQnICYmXG4gICAgdGhpcy5tZXRob2QgIT09ICdIRUFEJyAmJlxuICAgIHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyAmJlxuICAgICF0aGlzLl9pc0hvc3QoZGF0YSlcbiAgKSB7XG4gICAgLy8gc2VyaWFsaXplIHN0dWZmXG4gICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICAgIGxldCBzZXJpYWxpemUgPVxuICAgICAgdGhpcy5fc2VyaWFsaXplciB8fFxuICAgICAgcmVxdWVzdC5zZXJpYWxpemVbY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdIDogJyddO1xuICAgIGlmICghc2VyaWFsaXplICYmIGlzSlNPTihjb250ZW50VHlwZSkpIHtcbiAgICAgIHNlcmlhbGl6ZSA9IHJlcXVlc3Quc2VyaWFsaXplWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgfVxuXG4gICAgaWYgKHNlcmlhbGl6ZSkgZGF0YSA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgfVxuXG4gIC8vIHNldCBoZWFkZXIgZmllbGRzXG4gIGZvciAoY29uc3QgZmllbGQgaW4gdGhpcy5oZWFkZXIpIHtcbiAgICBpZiAodGhpcy5oZWFkZXJbZmllbGRdID09PSBudWxsKSBjb250aW51ZTtcblxuICAgIGlmIChoYXNPd24odGhpcy5oZWFkZXIsIGZpZWxkKSlcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGZpZWxkLCB0aGlzLmhlYWRlcltmaWVsZF0pO1xuICB9XG5cbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG4gIH1cblxuICAvLyBzZW5kIHN0dWZmXG4gIHRoaXMuZW1pdCgncmVxdWVzdCcsIHRoaXMpO1xuXG4gIC8vIElFMTEgeGhyLnNlbmQodW5kZWZpbmVkKSBzZW5kcyAndW5kZWZpbmVkJyBzdHJpbmcgYXMgUE9TVCBwYXlsb2FkIChpbnN0ZWFkIG9mIG5vdGhpbmcpXG4gIC8vIFdlIG5lZWQgbnVsbCBoZXJlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gIHhoci5zZW5kKHR5cGVvZiBkYXRhID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBkYXRhKTtcbn07XG5cbnJlcXVlc3QuYWdlbnQgPSAoKSA9PiBuZXcgQWdlbnQoKTtcblxuZm9yIChjb25zdCBtZXRob2Qgb2YgWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJywgJ1BBVENIJywgJ1BVVCcsICdERUxFVEUnXSkge1xuICBBZ2VudC5wcm90b3R5cGVbbWV0aG9kLnRvTG93ZXJDYXNlKCldID0gZnVuY3Rpb24gKHVybCwgZm4pIHtcbiAgICBjb25zdCByZXF1ZXN0XyA9IG5ldyByZXF1ZXN0LlJlcXVlc3QobWV0aG9kLCB1cmwpO1xuICAgIHRoaXMuX3NldERlZmF1bHRzKHJlcXVlc3RfKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJlcXVlc3RfLmVuZChmbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RfO1xuICB9O1xufVxuXG5BZ2VudC5wcm90b3R5cGUuZGVsID0gQWdlbnQucHJvdG90eXBlLmRlbGV0ZTtcblxuLyoqXG4gKiBHRVQgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmdldCA9ICh1cmwsIGRhdGEsIGZuKSA9PiB7XG4gIGNvbnN0IHJlcXVlc3RfID0gcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBkYXRhO1xuICAgIGRhdGEgPSBudWxsO1xuICB9XG5cbiAgaWYgKGRhdGEpIHJlcXVlc3RfLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcXVlc3RfLmVuZChmbik7XG4gIHJldHVybiByZXF1ZXN0Xztcbn07XG5cbi8qKlxuICogSEVBRCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBbZGF0YV0gb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QuaGVhZCA9ICh1cmwsIGRhdGEsIGZuKSA9PiB7XG4gIGNvbnN0IHJlcXVlc3RfID0gcmVxdWVzdCgnSEVBRCcsIHVybCk7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gZGF0YTtcbiAgICBkYXRhID0gbnVsbDtcbiAgfVxuXG4gIGlmIChkYXRhKSByZXF1ZXN0Xy5xdWVyeShkYXRhKTtcbiAgaWYgKGZuKSByZXF1ZXN0Xy5lbmQoZm4pO1xuICByZXR1cm4gcmVxdWVzdF87XG59O1xuXG4vKipcbiAqIE9QVElPTlMgcXVlcnkgdG8gYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0Lm9wdGlvbnMgPSAodXJsLCBkYXRhLCBmbikgPT4ge1xuICBjb25zdCByZXF1ZXN0XyA9IHJlcXVlc3QoJ09QVElPTlMnLCB1cmwpO1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IGRhdGE7XG4gICAgZGF0YSA9IG51bGw7XG4gIH1cblxuICBpZiAoZGF0YSkgcmVxdWVzdF8uc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXF1ZXN0Xy5lbmQoZm4pO1xuICByZXR1cm4gcmVxdWVzdF87XG59O1xuXG4vKipcbiAqIERFTEVURSBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IFtkYXRhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVsKHVybCwgZGF0YSwgZm4pIHtcbiAgY29uc3QgcmVxdWVzdF8gPSByZXF1ZXN0KCdERUxFVEUnLCB1cmwpO1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IGRhdGE7XG4gICAgZGF0YSA9IG51bGw7XG4gIH1cblxuICBpZiAoZGF0YSkgcmVxdWVzdF8uc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXF1ZXN0Xy5lbmQoZm4pO1xuICByZXR1cm4gcmVxdWVzdF87XG59XG5cbnJlcXVlc3QuZGVsID0gZGVsO1xucmVxdWVzdC5kZWxldGUgPSBkZWw7XG5cbi8qKlxuICogUEFUQ0ggYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucGF0Y2ggPSAodXJsLCBkYXRhLCBmbikgPT4ge1xuICBjb25zdCByZXF1ZXN0XyA9IHJlcXVlc3QoJ1BBVENIJywgdXJsKTtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBkYXRhO1xuICAgIGRhdGEgPSBudWxsO1xuICB9XG5cbiAgaWYgKGRhdGEpIHJlcXVlc3RfLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxdWVzdF8uZW5kKGZuKTtcbiAgcmV0dXJuIHJlcXVlc3RfO1xufTtcblxuLyoqXG4gKiBQT1NUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBvc3QgPSAodXJsLCBkYXRhLCBmbikgPT4ge1xuICBjb25zdCByZXF1ZXN0XyA9IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmbiA9IGRhdGE7XG4gICAgZGF0YSA9IG51bGw7XG4gIH1cblxuICBpZiAoZGF0YSkgcmVxdWVzdF8uc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXF1ZXN0Xy5lbmQoZm4pO1xuICByZXR1cm4gcmVxdWVzdF87XG59O1xuXG4vKipcbiAqIFBVVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wdXQgPSAodXJsLCBkYXRhLCBmbikgPT4ge1xuICBjb25zdCByZXF1ZXN0XyA9IHJlcXVlc3QoJ1BVVCcsIHVybCk7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZuID0gZGF0YTtcbiAgICBkYXRhID0gbnVsbDtcbiAgfVxuXG4gIGlmIChkYXRhKSByZXF1ZXN0Xy5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcXVlc3RfLmVuZChmbik7XG4gIHJldHVybiByZXF1ZXN0Xztcbn07XG4iLCJjb25zdCBzZW12ZXIgPSByZXF1aXJlKCdzZW12ZXInKTtcblxuLyoqXG4gKiBNb2R1bGUgb2YgbWl4ZWQtaW4gZnVuY3Rpb25zIHNoYXJlZCBiZXR3ZWVuIG5vZGUgYW5kIGNsaWVudCBjb2RlXG4gKi9cbmNvbnN0IHsgaXNPYmplY3QsIGhhc093biB9ID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgUmVxdWVzdEJhc2VgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdEJhc2U7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVxdWVzdEJhc2VgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdEJhc2UoKSB7fVxuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gIGNsZWFyVGltZW91dCh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gIGNsZWFyVGltZW91dCh0aGlzLl91cGxvYWRUaW1lb3V0VGltZXIpO1xuICBkZWxldGUgdGhpcy5fdGltZXI7XG4gIGRlbGV0ZSB0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcjtcbiAgZGVsZXRlIHRoaXMuX3VwbG9hZFRpbWVvdXRUaW1lcjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRlIGRlZmF1bHQgcmVzcG9uc2UgYm9keSBwYXJzZXJcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIGNvbnZlcnQgaW5jb21pbmcgZGF0YSBpbnRvIHJlcXVlc3QuYm9keVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChmbikge1xuICB0aGlzLl9wYXJzZXIgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBmb3JtYXQgb2YgYmluYXJ5IHJlc3BvbnNlIGJvZHkuXG4gKiBJbiBicm93c2VyIHZhbGlkIGZvcm1hdHMgYXJlICdibG9iJyBhbmQgJ2FycmF5YnVmZmVyJyxcbiAqIHdoaWNoIHJldHVybiBCbG9iIGFuZCBBcnJheUJ1ZmZlciwgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEluIE5vZGUgYWxsIHZhbHVlcyByZXN1bHQgaW4gQnVmZmVyLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnJlc3BvbnNlVHlwZSgnYmxvYicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZXNwb25zZVR5cGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdGhpcy5fcmVzcG9uc2VUeXBlID0gdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBkZWZhdWx0IHJlcXVlc3QgYm9keSBzZXJpYWxpemVyXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBjb252ZXJ0IGRhdGEgc2V0IHZpYSAuc2VuZCBvciAuYXR0YWNoIGludG8gcGF5bG9hZCB0byBzZW5kXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChmbikge1xuICB0aGlzLl9zZXJpYWxpemVyID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGltZW91dHMuXG4gKlxuICogLSByZXNwb25zZSB0aW1lb3V0IGlzIHRpbWUgYmV0d2VlbiBzZW5kaW5nIHJlcXVlc3QgYW5kIHJlY2VpdmluZyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzcG9uc2UuIEluY2x1ZGVzIEROUyBhbmQgY29ubmVjdGlvbiB0aW1lLlxuICogLSBkZWFkbGluZSBpcyB0aGUgdGltZSBmcm9tIHN0YXJ0IG9mIHRoZSByZXF1ZXN0IHRvIHJlY2VpdmluZyByZXNwb25zZSBib2R5IGluIGZ1bGwuIElmIHRoZSBkZWFkbGluZSBpcyB0b28gc2hvcnQgbGFyZ2UgZmlsZXMgbWF5IG5vdCBsb2FkIGF0IGFsbCBvbiBzbG93IGNvbm5lY3Rpb25zLlxuICogLSB1cGxvYWQgaXMgdGhlIHRpbWUgIHNpbmNlIGxhc3QgYml0IG9mIGRhdGEgd2FzIHNlbnQgb3IgcmVjZWl2ZWQuIFRoaXMgdGltZW91dCB3b3JrcyBvbmx5IGlmIGRlYWRsaW5lIHRpbWVvdXQgaXMgb2ZmXG4gKlxuICogVmFsdWUgb2YgMCBvciBmYWxzZSBtZWFucyBubyB0aW1lb3V0LlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gbXMgb3Ige3Jlc3BvbnNlLCBkZWFkbGluZX1cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudGltZW91dCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gb3B0aW9ucztcbiAgICB0aGlzLl9yZXNwb25zZVRpbWVvdXQgPSAwO1xuICAgIHRoaXMuX3VwbG9hZFRpbWVvdXQgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yIChjb25zdCBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIGlmIChoYXNPd24ob3B0aW9ucywgb3B0aW9uKSkge1xuICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgY2FzZSAnZGVhZGxpbmUnOlxuICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBvcHRpb25zLmRlYWRsaW5lO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZXNwb25zZSc6XG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VUaW1lb3V0ID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndXBsb2FkJzpcbiAgICAgICAgICB0aGlzLl91cGxvYWRUaW1lb3V0ID0gb3B0aW9ucy51cGxvYWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIHRpbWVvdXQgb3B0aW9uJywgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyBvbiBlcnJvci5cbiAqXG4gKiBGYWlsZWQgcmVxdWVzdHMgd2lsbCBiZSByZXRyaWVkICdjb3VudCcgdGltZXMgaWYgdGltZW91dCBvciBlcnIuY29kZSA+PSA1MDAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnJldHJ5ID0gZnVuY3Rpb24gKGNvdW50LCBmbikge1xuICAvLyBEZWZhdWx0IHRvIDEgaWYgbm8gY291bnQgcGFzc2VkIG9yIHRydWVcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgY291bnQgPT09IHRydWUpIGNvdW50ID0gMTtcbiAgaWYgKGNvdW50IDw9IDApIGNvdW50ID0gMDtcbiAgdGhpcy5fbWF4UmV0cmllcyA9IGNvdW50O1xuICB0aGlzLl9yZXRyaWVzID0gMDtcbiAgdGhpcy5fcmV0cnlDYWxsYmFjayA9IGZuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBOT1RFOiB3ZSBkbyBub3QgaW5jbHVkZSBFU09DS0VUVElNRURPVVQgYmVjYXVzZSB0aGF0IGlzIGZyb20gYHJlcXVlc3RgIHBhY2thZ2Vcbi8vICAgICAgIDxodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2dvdC9wdWxsLzUzNz5cbi8vXG4vLyBOT1RFOiB3ZSBkbyBub3QgaW5jbHVkZSBFQUREUklORk8gYmVjYXVzZSBpdCB3YXMgcmVtb3ZlZCBmcm9tIGxpYnV2IGluIDIwMTRcbi8vICAgICAgIDxodHRwczovL2dpdGh1Yi5jb20vbGlidXYvbGlidXYvY29tbWl0LzAyZTFlYmQ0MGI4MDdiZTVhZjQ2MzQzZWE4NzMzMzFiMmVlNGU5YzE+XG4vLyAgICAgICA8aHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3QvcmVxdWVzdC9zZWFyY2g/cT1FU09DS0VUVElNRURPVVQmdW5zY29wZWRfcT1FU09DS0VUVElNRURPVVQ+XG4vL1xuLy9cbi8vIFRPRE86IGV4cG9zZSB0aGVzZSBhcyBjb25maWd1cmFibGUgZGVmYXVsdHNcbi8vXG5jb25zdCBFUlJPUl9DT0RFUyA9IG5ldyBTZXQoW1xuICAnRVRJTUVET1VUJyxcbiAgJ0VDT05OUkVTRVQnLFxuICAnRUFERFJJTlVTRScsXG4gICdFQ09OTlJFRlVTRUQnLFxuICAnRVBJUEUnLFxuICAnRU5PVEZPVU5EJyxcbiAgJ0VORVRVTlJFQUNIJyxcbiAgJ0VBSV9BR0FJTidcbl0pO1xuXG5jb25zdCBTVEFUVVNfQ09ERVMgPSBuZXcgU2V0KFtcbiAgNDA4LCA0MTMsIDQyOSwgNTAwLCA1MDIsIDUwMywgNTA0LCA1MjEsIDUyMiwgNTI0XG5dKTtcblxuLy8gVE9ETzogd2Ugd291bGQgbmVlZCB0byBtYWtlIHRoaXMgZWFzaWx5IGNvbmZpZ3VyYWJsZSBiZWZvcmUgYWRkaW5nIGl0IGluIChlLmcuIHNvbWUgbWlnaHQgd2FudCB0byBhZGQgUE9TVClcbi8vIGNvbnN0IE1FVEhPRFMgPSBuZXcgU2V0KFsnR0VUJywgJ1BVVCcsICdIRUFEJywgJ0RFTEVURScsICdPUFRJT05TJywgJ1RSQUNFJ10pO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWQuXG4gKiAoSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9nb3QjcmV0cnkpXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyIGFuIGVycm9yXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSBbcmVzXSByZXNwb25zZVxuICogQHJldHVybnMge0Jvb2xlYW59IGlmIHNlZ21lbnQgc2hvdWxkIGJlIHJldHJpZWRcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9zaG91bGRSZXRyeSA9IGZ1bmN0aW9uIChlcnJvciwgcmVzKSB7XG4gIGlmICghdGhpcy5fbWF4UmV0cmllcyB8fCB0aGlzLl9yZXRyaWVzKysgPj0gdGhpcy5fbWF4UmV0cmllcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl9yZXRyeUNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5fcmV0cnlDYWxsYmFjayhlcnJvciwgcmVzKTtcbiAgICAgIGlmIChvdmVycmlkZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAob3ZlcnJpZGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyB1bmRlZmluZWQgZmFsbHMgYmFjayB0byBkZWZhdWx0c1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IHdlIHdvdWxkIG5lZWQgdG8gbWFrZSB0aGlzIGVhc2lseSBjb25maWd1cmFibGUgYmVmb3JlIGFkZGluZyBpdCBpbiAoZS5nLiBzb21lIG1pZ2h0IHdhbnQgdG8gYWRkIFBPU1QpXG4gIC8qXG4gIGlmIChcbiAgICB0aGlzLnJlcSAmJlxuICAgIHRoaXMucmVxLm1ldGhvZCAmJlxuICAgICFNRVRIT0RTLmhhcyh0aGlzLnJlcS5tZXRob2QudG9VcHBlckNhc2UoKSlcbiAgKVxuICAgIHJldHVybiBmYWxzZTtcbiAgKi9cbiAgaWYgKHJlcyAmJiByZXMuc3RhdHVzICYmIFNUQVRVU19DT0RFUy5oYXMocmVzLnN0YXR1cykpIHJldHVybiB0cnVlO1xuICBpZiAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IuY29kZSAmJiBFUlJPUl9DT0RFUy5oYXMoZXJyb3IuY29kZSkpIHJldHVybiB0cnVlO1xuICAgIC8vIFN1cGVyYWdlbnQgdGltZW91dFxuICAgIGlmIChlcnJvci50aW1lb3V0ICYmIGVycm9yLmNvZGUgPT09ICdFQ09OTkFCT1JURUQnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXJyb3IuY3Jvc3NEb21haW4pIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXRyeSByZXF1ZXN0XG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3JldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuXG4gIC8vIG5vZGVcbiAgaWYgKHRoaXMucmVxKSB7XG4gICAgdGhpcy5yZXEgPSBudWxsO1xuICAgIHRoaXMucmVxID0gdGhpcy5yZXF1ZXN0KCk7XG4gIH1cblxuICB0aGlzLl9hYm9ydGVkID0gZmFsc2U7XG4gIHRoaXMudGltZWRvdXQgPSBmYWxzZTtcbiAgdGhpcy50aW1lZG91dEVycm9yID0gbnVsbDtcblxuICByZXR1cm4gdGhpcy5fZW5kKCk7XG59O1xuXG4vKipcbiAqIFByb21pc2Ugc3VwcG9ydFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZWplY3RdXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICBpZiAoIXRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuX2VuZENhbGxlZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnV2FybmluZzogc3VwZXJhZ2VudCByZXF1ZXN0IHdhcyBzZW50IHR3aWNlLCBiZWNhdXNlIGJvdGggLmVuZCgpIGFuZCAudGhlbigpIHdlcmUgY2FsbGVkLiBOZXZlciBjYWxsIC5lbmQoKSBpZiB5b3UgdXNlIHByb21pc2VzJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNlbGYub24oJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fbWF4UmV0cmllcyAmJiB0aGlzLl9tYXhSZXRyaWVzID4gdGhpcy5fcmV0cmllcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRpbWVkb3V0ICYmIHRoaXMudGltZWRvdXRFcnJvcikge1xuICAgICAgICAgIHJlamVjdCh0aGlzLnRpbWVkb3V0RXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdBYm9ydGVkJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnQUJPUlRFRCc7XG4gICAgICAgIGVycm9yLnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuICAgICAgICBlcnJvci5tZXRob2QgPSB0aGlzLm1ldGhvZDtcbiAgICAgICAgZXJyb3IudXJsID0gdGhpcy51cmw7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHNlbGYuZW5kKChlcnJvciwgcmVzKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG59O1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuY2F0Y2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQWxsb3cgZm9yIGV4dGVuc2lvblxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgZm4odGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLm9rID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgcmVxdWlyZWQnKTtcbiAgdGhpcy5fb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5faXNSZXNwb25zZU9LID0gZnVuY3Rpb24gKHJlcykge1xuICBpZiAoIXJlcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl9va0NhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuX29rQ2FsbGJhY2socmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXMuc3RhdHVzID49IDIwMCAmJiByZXMuc3RhdHVzIDwgMzAwO1xufTtcblxuLyoqXG4gKiBHZXQgcmVxdWVzdCBoZWFkZXIgYGZpZWxkYC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgcmV0dXJuIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgaGVhZGVyIGBmaWVsZGAgdmFsdWUuXG4gKiBUaGlzIGlzIGEgZGVwcmVjYXRlZCBpbnRlcm5hbCBBUEkuIFVzZSBgLmdldChmaWVsZClgIGluc3RlYWQuXG4gKlxuICogKGdldEhlYWRlciBpcyBubyBsb25nZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBzdXBlcmFnZW50IGNvZGUgYmFzZSlcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICogQGRlcHJlY2F0ZWRcbiAqL1xuXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0SGVhZGVyID0gUmVxdWVzdEJhc2UucHJvdG90eXBlLmdldDtcblxuLyoqXG4gKiBTZXQgaGVhZGVyIGBmaWVsZGAgdG8gYHZhbGAsIG9yIG11bHRpcGxlIGZpZWxkcyB3aXRoIG9uZSBvYmplY3QuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5zZXQoJ1gtQVBJLUtleScsICdmb29iYXInKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCh7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1BUEktS2V5JzogJ2Zvb2JhcicgfSlcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGZpZWxkXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChmaWVsZCwgdmFsdWUpIHtcbiAgaWYgKGlzT2JqZWN0KGZpZWxkKSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkKSB7XG4gICAgICBpZiAoaGFzT3duKGZpZWxkLCBrZXkpKSB0aGlzLnNldChrZXksIGZpZWxkW2tleV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gIHRoaXMuaGVhZGVyW2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnVuc2V0KCdVc2VyLUFnZW50JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGQgZmllbGQgbmFtZVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgZGVsZXRlIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbiAgZGVsZXRlIHRoaXMuaGVhZGVyW2ZpZWxkXTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHRoZSBmaWVsZCBgbmFtZWAgYW5kIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0XG4gKiBmb3IgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgcmVxdWVzdCBib2RpZXMuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoJ2ZvbycsICdiYXInKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoeyBmb286ICdiYXInLCBiYXo6ICdxdXgnIH0pXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBuYW1lIG5hbWUgb2YgZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfEJsb2J8RmlsZXxCdWZmZXJ8ZnMuUmVhZFN0cmVhbX0gdmFsIHZhbHVlIG9mIGZpZWxkXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucyBleHRyYSBvcHRpb25zLCBlLmcuICdibG9iJ1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuZmllbGQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgLy8gbmFtZSBzaG91bGQgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIG9iamVjdC5cbiAgaWYgKG5hbWUgPT09IG51bGwgfHwgdW5kZWZpbmVkID09PSBuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCcuZmllbGQobmFtZSwgdmFsKSBuYW1lIGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCIuZmllbGQoKSBjYW4ndCBiZSB1c2VkIGlmIC5zZW5kKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiXG4gICAgKTtcbiAgfVxuXG4gIGlmIChpc09iamVjdChuYW1lKSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5hbWUpIHtcbiAgICAgIGlmIChoYXNPd24obmFtZSwga2V5KSkgdGhpcy5maWVsZChrZXksIG5hbWVba2V5XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGkgaW4gdmFsdWUpIHtcbiAgICAgIGlmIChoYXNPd24odmFsdWUsIGkpKSB0aGlzLmZpZWxkKG5hbWUsIHZhbHVlW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHZhbCBzaG91bGQgYmUgZGVmaW5lZCBub3dcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHVuZGVmaW5lZCA9PT0gdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy5maWVsZChuYW1lLCB2YWwpIHZhbCBjYW4gbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICAvLyBmaXggaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQvaXNzdWVzLzE2ODBcbiAgaWYgKG9wdGlvbnMpIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKG5hbWUsIHZhbHVlLCBvcHRpb25zKTtcbiAgZWxzZSB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFib3J0IHRoZSByZXF1ZXN0LCBhbmQgY2xlYXIgcG90ZW50aWFsIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gcmVxdWVzdFxuICogQGFwaSBwdWJsaWNcbiAqL1xuUmVxdWVzdEJhc2UucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fYWJvcnRlZCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG4gIGlmICh0aGlzLnhocikgdGhpcy54aHIuYWJvcnQoKTsgLy8gYnJvd3NlclxuICBpZiAodGhpcy5yZXEpIHtcbiAgICAvLyBOb2RlIHYxMyBoYXMgbWFqb3IgZGlmZmVyZW5jZXMgaW4gYGFib3J0KClgXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvdjEyLngvbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL3YxMy54L2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanNcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi92MTQueC9saWIvaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtLmpzXG4gICAgLy8gKGlmIHlvdSBydW4gYSBkaWZmIGFjcm9zcyB0aGVzZSB5b3Ugd2lsbCBzZWUgdGhlIGRpZmZlcmVuY2VzKVxuICAgIC8vXG4gICAgLy8gUmVmZXJlbmNlczpcbiAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8zMTYzMD5cbiAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQvcHVsbC8xMDg0L2NvbW1pdHMvZGMxODY3OWE3YzVjY2ZjNjA0NmQ4ODIwMTVlNTEyNjg4ODk3M2JjOD5cbiAgICAvL1xuICAgIC8vIFRoYW5rcyB0byBAc2hhZG93Z2F0ZTE1IGFuZCBAbmlmdHlsZXR0dWNlXG4gICAgaWYgKFxuICAgICAgc2VtdmVyLmd0ZShwcm9jZXNzLnZlcnNpb24sICd2MTMuMC4wJykgJiZcbiAgICAgIHNlbXZlci5sdChwcm9jZXNzLnZlcnNpb24sICd2MTQuMC4wJylcbiAgICApIHtcbiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcmVhc29uIHRoaXMgZG9lc24ndCB3b3JrIGlzIGJlY2F1c2UgaW4gdjEzIGFzIGNvbXBhcmVkIHRvIHYxNFxuICAgICAgLy8gdGhlcmUgaXMgbm8gYGNhbGxiYWNrID0gbm9wYCBzZXQgaW4gZW5kLW9mLXN0cmVhbS5qcyBhYm92ZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnU3VwZXJhZ2VudCBkb2VzIG5vdCB3b3JrIGluIHYxMyBwcm9wZXJseSB3aXRoIGFib3J0KCkgZHVlIHRvIE5vZGUuanMgY29yZSBjaGFuZ2VzJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHNlbXZlci5ndGUocHJvY2Vzcy52ZXJzaW9uLCAndjE0LjAuMCcpKSB7XG4gICAgICAvLyBXZSBoYXZlIHRvIG1hbnVhbGx5IHNldCBgZGVzdHJveWVkYCB0byBgdHJ1ZWAgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29ya1xuICAgICAgLy8gKHNlZSBjb3JlIGludGVybmFscyBvZiBlbmQtb2Ytc3RyZWFtLmpzIGFib3ZlIGluIHYxNCBicmFuY2ggYXMgY29tcGFyZWQgdG8gdjEyKVxuICAgICAgdGhpcy5yZXEuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcS5hYm9ydCgpOyAvLyBub2RlXG4gIH1cblxuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICB0aGlzLmVtaXQoJ2Fib3J0Jyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9hdXRoID0gZnVuY3Rpb24gKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGJhc2U2NEVuY29kZXIpIHtcbiAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICBjYXNlICdiYXNpYyc6XG4gICAgICB0aGlzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCYXNpYyAke2Jhc2U2NEVuY29kZXIoYCR7dXNlcn06JHtwYXNzfWApfWApO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdhdXRvJzpcbiAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VyO1xuICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3M7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlYXJlcic6IC8vIHVzYWdlIHdvdWxkIGJlIC5hdXRoKGFjY2Vzc1Rva2VuLCB7IHR5cGU6ICdiZWFyZXInIH0pXG4gICAgICB0aGlzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt1c2VyfWApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0cmFuc21pc3Npb24gb2YgY29va2llcyB3aXRoIHgtZG9tYWluIHJlcXVlc3RzLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrIHRoZSBvcmlnaW4gbXVzdCBub3QgYmVcbiAqIHVzaW5nIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIgd2l0aCBhIHdpbGRjYXJkLFxuICogYW5kIGFsc28gbXVzdCBzZXQgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiXG4gKiB0byBcInRydWVcIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS53aXRoQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAob24pIHtcbiAgLy8gVGhpcyBpcyBicm93c2VyLW9ubHkgZnVuY3Rpb25hbGl0eS4gTm9kZSBzaWRlIGlzIG5vLW9wLlxuICBpZiAob24gPT09IHVuZGVmaW5lZCkgb24gPSB0cnVlO1xuICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBvbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgbWF4IHJlZGlyZWN0cyB0byBgbmAuIERvZXMgbm90aGluZyBpbiBicm93c2VyIFhIUiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5yZWRpcmVjdHMgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLl9tYXhSZWRpcmVjdHMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogTWF4aW11bSBzaXplIG9mIGJ1ZmZlcmVkIHJlc3BvbnNlIGJvZHksIGluIGJ5dGVzLiBDb3VudHMgdW5jb21wcmVzc2VkIHNpemUuXG4gKiBEZWZhdWx0IDIwME1CLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuIG51bWJlciBvZiBieXRlc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKi9cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5tYXhSZXNwb25zZVNpemUgPSBmdW5jdGlvbiAobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgdGhpcy5fbWF4UmVzcG9uc2VTaXplID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgdG8gYSBwbGFpbiBqYXZhc2NyaXB0IG9iamVjdCAobm90IEpTT04gc3RyaW5nKSBvZiBzY2FsYXIgcHJvcGVydGllcy5cbiAqIE5vdGUgYXMgdGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gcmV0dXJuIGEgdXNlZnVsIG5vbi10aGlzIHZhbHVlLFxuICogaXQgY2Fubm90IGJlIGNoYWluZWQuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBkZXNjcmliaW5nIG1ldGhvZCwgdXJsLCBhbmQgZGF0YSBvZiB0aGlzIHJlcXVlc3RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgIHVybDogdGhpcy51cmwsXG4gICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICBoZWFkZXJzOiB0aGlzLl9oZWFkZXJcbiAgfTtcbn07XG5cbi8qKlxuICogU2VuZCBgZGF0YWAgYXMgdGhlIHJlcXVlc3QgYm9keSwgZGVmYXVsdGluZyB0aGUgYC50eXBlKClgIHRvIFwianNvblwiIHdoZW5cbiAqIGFuIG9iamVjdCBpcyBnaXZlbi5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgICAvLyBtYW51YWwganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdqc29uJylcbiAqICAgICAgICAgLnNlbmQoJ3tcIm5hbWVcIjpcInRqXCJ9JylcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBhdXRvIGpzb25cbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBtYW51YWwgeC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKVxuICogICAgICAgICAuc2VuZCgnbmFtZT10aicpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gYXV0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnZm9ybScpXG4gKiAgICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGRlZmF1bHRzIHRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAuc2VuZCgnbmFtZT10b2JpJylcbiAqICAgICAgICAuc2VuZCgnc3BlY2llcz1mZXJyZXQnKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBkYXRhXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblJlcXVlc3RCYXNlLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgaXNPYmplY3RfID0gaXNPYmplY3QoZGF0YSk7XG4gIGxldCB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcblxuICBpZiAodGhpcy5fZm9ybURhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIi5zZW5kKCkgY2FuJ3QgYmUgdXNlZCBpZiAuYXR0YWNoKCkgb3IgLmZpZWxkKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiXG4gICAgKTtcbiAgfVxuXG4gIGlmIChpc09iamVjdF8gJiYgIXRoaXMuX2RhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgdGhpcy5fZGF0YSA9IFtdO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzSG9zdChkYXRhKSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cbiAgfSBlbHNlIGlmIChkYXRhICYmIHRoaXMuX2RhdGEgJiYgdGhpcy5faXNIb3N0KHRoaXMuX2RhdGEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgbWVyZ2UgdGhlc2Ugc2VuZCBjYWxsc1wiKTtcbiAgfVxuXG4gIC8vIG1lcmdlXG4gIGlmIChpc09iamVjdF8gJiYgaXNPYmplY3QodGhpcy5fZGF0YSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoaGFzT3duKGRhdGEsIGtleSkpIHRoaXMuX2RhdGFba2V5XSA9IGRhdGFba2V5XTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZGVmYXVsdCB0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAgICBpZiAoIXR5cGUpIHRoaXMudHlwZSgnZm9ybScpO1xuICAgIHR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuICAgIGlmICh0eXBlKSB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBpZiAodHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhID8gYCR7dGhpcy5fZGF0YX0mJHtkYXRhfWAgOiBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhID0gKHRoaXMuX2RhdGEgfHwgJycpICsgZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gIH1cblxuICBpZiAoIWlzT2JqZWN0XyB8fCB0aGlzLl9pc0hvc3QoZGF0YSkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdG8ganNvblxuICBpZiAoIXR5cGUpIHRoaXMudHlwZSgnanNvbicpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU29ydCBgcXVlcnlzdHJpbmdgIGJ5IHRoZSBzb3J0IGZ1bmN0aW9uXG4gKlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgIC8vIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIHJlcXVlc3QuZ2V0KCcvdXNlcicpXG4gKiAgICAgICAgIC5xdWVyeSgnbmFtZT1OaWNrJylcbiAqICAgICAgICAgLnF1ZXJ5KCdzZWFyY2g9TWFubnknKVxuICogICAgICAgICAuc29ydFF1ZXJ5KClcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBjdXN0b21pemVkIHNvcnQgZnVuY3Rpb25cbiAqICAgICAgIHJlcXVlc3QuZ2V0KCcvdXNlcicpXG4gKiAgICAgICAgIC5xdWVyeSgnbmFtZT1OaWNrJylcbiAqICAgICAgICAgLnF1ZXJ5KCdzZWFyY2g9TWFubnknKVxuICogICAgICAgICAuc29ydFF1ZXJ5KGZ1bmN0aW9uKGEsIGIpe1xuICogICAgICAgICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICogICAgICAgICB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzb3J0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdEJhc2UucHJvdG90eXBlLnNvcnRRdWVyeSA9IGZ1bmN0aW9uIChzb3J0KSB7XG4gIC8vIF9zb3J0IGRlZmF1bHQgdG8gdHJ1ZSBidXQgb3RoZXJ3aXNlIGNhbiBiZSBhIGZ1bmN0aW9uIG9yIGJvb2xlYW5cbiAgdGhpcy5fc29ydCA9IHR5cGVvZiBzb3J0ID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBzb3J0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29tcG9zZSBxdWVyeXN0cmluZyB0byBhcHBlbmQgdG8gcmVxLnVybFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5SZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2ZpbmFsaXplUXVlcnlTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fcXVlcnkuam9pbignJicpO1xuICBpZiAocXVlcnkpIHtcbiAgICB0aGlzLnVybCArPSAodGhpcy51cmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JykgKyBxdWVyeTtcbiAgfVxuXG4gIHRoaXMuX3F1ZXJ5Lmxlbmd0aCA9IDA7IC8vIE1ha2VzIHRoZSBjYWxsIGlkZW1wb3RlbnRcblxuICBpZiAodGhpcy5fc29ydCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy51cmwuaW5kZXhPZignPycpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBjb25zdCBxdWVyeUFycmF5ID0gdGhpcy51cmwuc2xpY2UoaW5kZXggKyAxKS5zcGxpdCgnJicpO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zb3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHF1ZXJ5QXJyYXkuc29ydCh0aGlzLl9zb3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5QXJyYXkuc29ydCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVybCA9IHRoaXMudXJsLnNsaWNlKDAsIGluZGV4KSArICc/JyArIHF1ZXJ5QXJyYXkuam9pbignJicpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gRm9yIGJhY2t3YXJkcyBjb21wYXQgb25seVxuUmVxdWVzdEJhc2UucHJvdG90eXBlLl9hcHBlbmRRdWVyeVN0cmluZyA9ICgpID0+IHtcbiAgY29uc29sZS53YXJuKCdVbnN1cHBvcnRlZCcpO1xufTtcblxuLyoqXG4gKiBJbnZva2UgY2FsbGJhY2sgd2l0aCB0aW1lb3V0IGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fdGltZW91dEVycm9yID0gZnVuY3Rpb24gKHJlYXNvbiwgdGltZW91dCwgZXJybm8pIHtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgJHtyZWFzb24gKyB0aW1lb3V0fW1zIGV4Y2VlZGVkYCk7XG4gIGVycm9yLnRpbWVvdXQgPSB0aW1lb3V0O1xuICBlcnJvci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gIGVycm9yLmVycm5vID0gZXJybm87XG4gIHRoaXMudGltZWRvdXQgPSB0cnVlO1xuICB0aGlzLnRpbWVkb3V0RXJyb3IgPSBlcnJvcjtcbiAgdGhpcy5hYm9ydCgpO1xuICB0aGlzLmNhbGxiYWNrKGVycm9yKTtcbn07XG5cblJlcXVlc3RCYXNlLnByb3RvdHlwZS5fc2V0VGltZW91dHMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIC8vIGRlYWRsaW5lXG4gIGlmICh0aGlzLl90aW1lb3V0ICYmICF0aGlzLl90aW1lcikge1xuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzZWxmLl90aW1lb3V0RXJyb3IoJ1RpbWVvdXQgb2YgJywgc2VsZi5fdGltZW91dCwgJ0VUSU1FJyk7XG4gICAgfSwgdGhpcy5fdGltZW91dCk7XG4gIH1cblxuICAvLyByZXNwb25zZSB0aW1lb3V0XG4gIGlmICh0aGlzLl9yZXNwb25zZVRpbWVvdXQgJiYgIXRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKSB7XG4gICAgdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNlbGYuX3RpbWVvdXRFcnJvcihcbiAgICAgICAgJ1Jlc3BvbnNlIHRpbWVvdXQgb2YgJyxcbiAgICAgICAgc2VsZi5fcmVzcG9uc2VUaW1lb3V0LFxuICAgICAgICAnRVRJTUVET1VUJ1xuICAgICAgKTtcbiAgICB9LCB0aGlzLl9yZXNwb25zZVRpbWVvdXQpO1xuICB9XG59O1xuIiwiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIEV4cG9zZSBgUmVzcG9uc2VCYXNlYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3BvbnNlQmFzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZUJhc2VgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVzcG9uc2VCYXNlKCkge31cblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBgZmllbGRgIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZUJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICByZXR1cm4gdGhpcy5oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG59O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgcmVsYXRlZCBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBgLnR5cGVgIHRoZSBjb250ZW50IHR5cGUgd2l0aG91dCBwYXJhbXNcbiAqXG4gKiBBIHJlc3BvbnNlIG9mIFwiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCJcbiAqIHdpbGwgcHJvdmlkZSB5b3Ugd2l0aCBhIGAudHlwZWAgb2YgXCJ0ZXh0L3BsYWluXCIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlclxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2VCYXNlLnByb3RvdHlwZS5fc2V0SGVhZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgLy8gVE9ETzogbW9hciFcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGEgdXRpbFxuXG4gIC8vIGNvbnRlbnQtdHlwZVxuICBjb25zdCBjdCA9IGhlYWRlclsnY29udGVudC10eXBlJ10gfHwgJyc7XG4gIHRoaXMudHlwZSA9IHV0aWxzLnR5cGUoY3QpO1xuXG4gIC8vIHBhcmFtc1xuICBjb25zdCBwYXJhbWV0ZXJzID0gdXRpbHMucGFyYW1zKGN0KTtcbiAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1ldGVycykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyYW1ldGVycywga2V5KSlcbiAgICAgIHRoaXNba2V5XSA9IHBhcmFtZXRlcnNba2V5XTtcbiAgfVxuXG4gIHRoaXMubGlua3MgPSB7fTtcblxuICAvLyBsaW5rc1xuICB0cnkge1xuICAgIGlmIChoZWFkZXIubGluaykge1xuICAgICAgdGhpcy5saW5rcyA9IHV0aWxzLnBhcnNlTGlua3MoaGVhZGVyLmxpbmspO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbn07XG5cbi8qKlxuICogU2V0IGZsYWdzIHN1Y2ggYXMgYC5va2AgYmFzZWQgb24gYHN0YXR1c2AuXG4gKlxuICogRm9yIGV4YW1wbGUgYSAyeHggcmVzcG9uc2Ugd2lsbCBnaXZlIHlvdSBhIGAub2tgIG9mIF9fdHJ1ZV9fXG4gKiB3aGVyZWFzIDV4eCB3aWxsIGJlIF9fZmFsc2VfXyBhbmQgYC5lcnJvcmAgd2lsbCBiZSBfX3RydWVfXy4gVGhlXG4gKiBgLmNsaWVudEVycm9yYCBhbmQgYC5zZXJ2ZXJFcnJvcmAgYXJlIGFsc28gYXZhaWxhYmxlIHRvIGJlIG1vcmVcbiAqIHNwZWNpZmljLCBhbmQgYC5zdGF0dXNUeXBlYCBpcyB0aGUgY2xhc3Mgb2YgZXJyb3IgcmFuZ2luZyBmcm9tIDEuLjVcbiAqIHNvbWV0aW1lcyB1c2VmdWwgZm9yIG1hcHBpbmcgcmVzcG9uZCBjb2xvcnMgZXRjLlxuICpcbiAqIFwic3VnYXJcIiBwcm9wZXJ0aWVzIGFyZSBhbHNvIGRlZmluZWQgZm9yIGNvbW1vbiBjYXNlcy4gQ3VycmVudGx5IHByb3ZpZGluZzpcbiAqXG4gKiAgIC0gLm5vQ29udGVudFxuICogICAtIC5iYWRSZXF1ZXN0XG4gKiAgIC0gLnVuYXV0aG9yaXplZFxuICogICAtIC5ub3RBY2NlcHRhYmxlXG4gKiAgIC0gLm5vdEZvdW5kXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2VCYXNlLnByb3RvdHlwZS5fc2V0U3RhdHVzUHJvcGVydGllcyA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgY29uc3QgdHlwZSA9IE1hdGgudHJ1bmMoc3RhdHVzIC8gMTAwKTtcblxuICAvLyBzdGF0dXMgLyBjbGFzc1xuICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHRoaXMuc3RhdHVzID0gdGhpcy5zdGF0dXNDb2RlO1xuICB0aGlzLnN0YXR1c1R5cGUgPSB0eXBlO1xuXG4gIC8vIGJhc2ljc1xuICB0aGlzLmluZm8gPSB0eXBlID09PSAxO1xuICB0aGlzLm9rID0gdHlwZSA9PT0gMjtcbiAgdGhpcy5yZWRpcmVjdCA9IHR5cGUgPT09IDM7XG4gIHRoaXMuY2xpZW50RXJyb3IgPSB0eXBlID09PSA0O1xuICB0aGlzLnNlcnZlckVycm9yID0gdHlwZSA9PT0gNTtcbiAgdGhpcy5lcnJvciA9IHR5cGUgPT09IDQgfHwgdHlwZSA9PT0gNSA/IHRoaXMudG9FcnJvcigpIDogZmFsc2U7XG5cbiAgLy8gc3VnYXJcbiAgdGhpcy5jcmVhdGVkID0gc3RhdHVzID09PSAyMDE7XG4gIHRoaXMuYWNjZXB0ZWQgPSBzdGF0dXMgPT09IDIwMjtcbiAgdGhpcy5ub0NvbnRlbnQgPSBzdGF0dXMgPT09IDIwNDtcbiAgdGhpcy5iYWRSZXF1ZXN0ID0gc3RhdHVzID09PSA0MDA7XG4gIHRoaXMudW5hdXRob3JpemVkID0gc3RhdHVzID09PSA0MDE7XG4gIHRoaXMubm90QWNjZXB0YWJsZSA9IHN0YXR1cyA9PT0gNDA2O1xuICB0aGlzLmZvcmJpZGRlbiA9IHN0YXR1cyA9PT0gNDAzO1xuICB0aGlzLm5vdEZvdW5kID0gc3RhdHVzID09PSA0MDQ7XG4gIHRoaXMudW5wcm9jZXNzYWJsZUVudGl0eSA9IHN0YXR1cyA9PT0gNDIyO1xufTtcbiIsIi8qKlxuICogUmV0dXJuIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnR5cGUgPSAoc3RyaW5nXykgPT4gc3RyaW5nXy5zcGxpdCgvICo7ICovKS5zaGlmdCgpO1xuXG4vKipcbiAqIFJldHVybiBoZWFkZXIgZmllbGQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnBhcmFtcyA9ICh2YWx1ZSkgPT4ge1xuICBjb25zdCBvYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBzdHJpbmdfIG9mIHZhbHVlLnNwbGl0KC8gKjsgKi8pKSB7XG4gICAgY29uc3QgcGFydHMgPSBzdHJpbmdfLnNwbGl0KC8gKj0gKi8pO1xuICAgIGNvbnN0IGtleSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgaWYgKGtleSAmJiB2YWx1ZSkgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG4vKipcbiAqIFBhcnNlIExpbmsgaGVhZGVyIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnBhcnNlTGlua3MgPSAodmFsdWUpID0+IHtcbiAgY29uc3Qgb2JqZWN0ID0ge307XG4gIGZvciAoY29uc3Qgc3RyaW5nXyBvZiB2YWx1ZS5zcGxpdCgvICosICovKSkge1xuICAgIGNvbnN0IHBhcnRzID0gc3RyaW5nXy5zcGxpdCgvICo7ICovKTtcbiAgICBjb25zdCB1cmwgPSBwYXJ0c1swXS5zbGljZSgxLCAtMSk7XG4gICAgY29uc3QgcmVsID0gcGFydHNbMV0uc3BsaXQoLyAqPSAqLylbMV0uc2xpY2UoMSwgLTEpO1xuICAgIG9iamVjdFtyZWxdID0gdXJsO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cbi8qKlxuICogU3RyaXAgY29udGVudCByZWxhdGVkIGZpZWxkcyBmcm9tIGBoZWFkZXJgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJcbiAqIEByZXR1cm4ge09iamVjdH0gaGVhZGVyXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNsZWFuSGVhZGVyID0gKGhlYWRlciwgY2hhbmdlc09yaWdpbikgPT4ge1xuICBkZWxldGUgaGVhZGVyWydjb250ZW50LXR5cGUnXTtcbiAgZGVsZXRlIGhlYWRlclsnY29udGVudC1sZW5ndGgnXTtcbiAgZGVsZXRlIGhlYWRlclsndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgZGVsZXRlIGhlYWRlci5ob3N0O1xuICAvLyBzZWN1aXJ0eVxuICBpZiAoY2hhbmdlc09yaWdpbikge1xuICAgIGRlbGV0ZSBoZWFkZXIuYXV0aG9yaXphdGlvbjtcbiAgICBkZWxldGUgaGVhZGVyLmNvb2tpZTtcbiAgfVxuXG4gIHJldHVybiBoZWFkZXI7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmV4cG9ydHMuaXNPYmplY3QgPSAob2JqZWN0KSA9PiB7XG4gIHJldHVybiBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG59O1xuXG4vKipcbiAqIE9iamVjdC5oYXNPd24gZmFsbGJhY2svcG9seWZpbGwuXG4gKlxuICogQHR5cGUgeyhvYmplY3Q6IG9iamVjdCwgcHJvcGVydHk6IHN0cmluZykgPT4gYm9vbGVhbn0gb2JqZWN0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZXhwb3J0cy5oYXNPd24gPVxuICBPYmplY3QuaGFzT3duIHx8XG4gIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ldyBPYmplY3Qob2JqZWN0KSwgcHJvcGVydHkpO1xuICB9O1xuXG5leHBvcnRzLm1peGluID0gKHRhcmdldCwgc291cmNlKSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgIGlmIChleHBvcnRzLmhhc093bihzb3VyY2UsIGtleSkpIHtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG59O1xuIiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9