UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

427 lines (336 loc) 52 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.hasContent = hasContent; exports.hasValue = hasValue; exports.escapeSpace = escapeSpace; exports.escapeSpecialChars = escapeSpecialChars; exports.localIp = localIp; exports.cancellableDelay = cancellableDelay; exports.multiResolve = multiResolve; exports.safeJsonParse = safeJsonParse; exports.wrapElement = wrapElement; exports.unwrapElement = unwrapElement; exports.filterObject = filterObject; exports.toReadableSizeString = toReadableSizeString; exports.isSubPath = isSubPath; exports.isSameDestination = isSameDestination; exports.compareVersions = compareVersions; exports.coerceVersion = coerceVersion; exports.quote = quote; exports.unleakString = unleakString; exports.jsonStringify = jsonStringify; exports.pluralize = pluralize; exports.toInMemoryBase64 = toInMemoryBase64; exports.getLockFileGuard = getLockFileGuard; Object.defineProperty(exports, "shellParse", { enumerable: true, get: function () { return _shellQuote.parse; } }); Object.defineProperty(exports, "uuidV1", { enumerable: true, get: function () { return _uuid.v1; } }); Object.defineProperty(exports, "uuidV3", { enumerable: true, get: function () { return _uuid.v3; } }); Object.defineProperty(exports, "uuidV4", { enumerable: true, get: function () { return _uuid.v4; } }); Object.defineProperty(exports, "uuidV5", { enumerable: true, get: function () { return _uuid.v5; } }); exports.KiB = exports.MiB = exports.GiB = exports.W3C_WEB_ELEMENT_IDENTIFIER = void 0; require("source-map-support/register"); var _bluebird = _interopRequireDefault(require("bluebird")); var _lodash = _interopRequireDefault(require("lodash")); var _os = _interopRequireDefault(require("os")); var _path = _interopRequireDefault(require("path")); var _fs = _interopRequireDefault(require("./fs")); var _semver = _interopRequireDefault(require("semver")); var _shellQuote = require("shell-quote"); var _pluralize = _interopRequireDefault(require("pluralize")); var _stream = _interopRequireDefault(require("stream")); var _base64Stream = require("base64-stream"); var _uuid = require("uuid"); var _lockfile2 = _interopRequireDefault(require("lockfile")); const W3C_WEB_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf'; exports.W3C_WEB_ELEMENT_IDENTIFIER = W3C_WEB_ELEMENT_IDENTIFIER; const KiB = 1024; exports.KiB = KiB; const MiB = KiB * 1024; exports.MiB = MiB; const GiB = MiB * 1024; exports.GiB = GiB; function hasContent(val) { return _lodash.default.isString(val) && val !== ''; } function hasValue(val) { let hasVal = false; if (_lodash.default.isNumber(val)) { hasVal = !_lodash.default.isNaN(val); } else { hasVal = !_lodash.default.isUndefined(val) && !_lodash.default.isNull(val); } return hasVal; } function escapeSpace(str) { return str.split(/ /).join('\\ '); } function escapeSpecialChars(str, quoteEscape) { if (typeof str !== 'string') { return str; } if (typeof quoteEscape === 'undefined') { quoteEscape = false; } str = str.replace(/[\\]/g, '\\\\').replace(/[\/]/g, '\\/').replace(/[\b]/g, '\\b').replace(/[\f]/g, '\\f').replace(/[\n]/g, '\\n').replace(/[\r]/g, '\\r').replace(/[\t]/g, '\\t').replace(/[\"]/g, '\\"').replace(/\\'/g, "\\'"); if (quoteEscape) { let re = new RegExp(quoteEscape, 'g'); str = str.replace(re, `\\${quoteEscape}`); } return str; } function localIp() { let ip = _lodash.default.chain(_os.default.networkInterfaces()).values().flatten().filter(function (val) { return val.family === 'IPv4' && val.internal === false; }).map('address').first().value(); return ip; } function cancellableDelay(ms) { let timer; let resolve; let reject; const delay = new _bluebird.default.Promise((_resolve, _reject) => { resolve = _resolve; reject = _reject; timer = setTimeout(function () { resolve(); }, ms); }); delay.cancel = function () { clearTimeout(timer); reject(new _bluebird.default.CancellationError()); }; return delay; } function multiResolve(roots, ...args) { return roots.map(root => _path.default.resolve(root, ...args)); } function safeJsonParse(obj) { try { return JSON.parse(obj); } catch (ign) { return obj; } } function jsonStringify(obj, replacer, space = 2) { if (!_lodash.default.isFunction(replacer)) { replacer = (k, v) => v; } const bufferToJSON = Buffer.prototype.toJSON; delete Buffer.prototype.toJSON; try { return JSON.stringify(obj, (key, value) => { const updatedValue = Buffer.isBuffer(value) ? value.toString('utf8') : value; return replacer(key, updatedValue); }, space); } finally { Buffer.prototype.toJSON = bufferToJSON; } } function unwrapElement(el) { for (const propName of [W3C_WEB_ELEMENT_IDENTIFIER, 'ELEMENT']) { if (_lodash.default.has(el, propName)) { return el[propName]; } } return el; } function wrapElement(elementId) { return { ELEMENT: elementId, [W3C_WEB_ELEMENT_IDENTIFIER]: elementId }; } function filterObject(obj, predicate) { let newObj = _lodash.default.clone(obj); if (_lodash.default.isUndefined(predicate)) { predicate = v => !_lodash.default.isUndefined(v); } else if (!_lodash.default.isFunction(predicate)) { const valuePredicate = predicate; predicate = v => v === valuePredicate; } for (const key of Object.keys(obj)) { if (!predicate(obj[key], obj)) { delete newObj[key]; } } return newObj; } function toReadableSizeString(bytes) { const intBytes = parseInt(bytes, 10); if (isNaN(intBytes) || intBytes < 0) { throw new Error(`Cannot convert '${bytes}' to a readable size format`); } if (intBytes >= GiB) { return `${parseFloat(intBytes / (GiB * 1.0)).toFixed(2)} GB`; } else if (intBytes >= MiB) { return `${parseFloat(intBytes / (MiB * 1.0)).toFixed(2)} MB`; } else if (intBytes >= KiB) { return `${parseFloat(intBytes / (KiB * 1.0)).toFixed(2)} KB`; } return `${intBytes} B`; } function isSubPath(originalPath, root, forcePosix = null) { const pathObj = forcePosix ? _path.default.posix : _path.default; for (const p of [originalPath, root]) { if (!pathObj.isAbsolute(p)) { throw new Error(`'${p}' is expected to be an absolute path`); } } const normalizedRoot = pathObj.normalize(root); const normalizedPath = pathObj.normalize(originalPath); return normalizedPath.startsWith(normalizedRoot); } async function isSameDestination(path1, path2, ...pathN) { const allPaths = [path1, path2, ...pathN]; if (!(await _bluebird.default.reduce(allPaths, async (a, b) => a && (await _fs.default.exists(b)), true))) { return false; } const areAllItemsEqual = arr => !!arr.reduce((a, b) => a === b ? a : NaN); if (areAllItemsEqual(allPaths)) { return true; } let mapCb = async x => await _fs.default.stat(x, { bigint: true }).ino; if (_semver.default.lt(process.version, '10.5.0')) { mapCb = async x => await _fs.default.stat(x).ino; } return areAllItemsEqual(await _bluebird.default.map(allPaths, mapCb)); } function coerceVersion(ver, strict = true) { const result = _semver.default.valid(_semver.default.coerce(`${ver}`)); if (strict && !result) { throw new Error(`'${ver}' cannot be coerced to a valid version number`); } return result; } const SUPPORTED_OPERATORS = ['==', '!=', '>', '<', '>=', '<=', '=']; function compareVersions(ver1, operator, ver2) { if (!SUPPORTED_OPERATORS.includes(operator)) { throw new Error(`The '${operator}' comparison operator is not supported. ` + `Only '${JSON.stringify(SUPPORTED_OPERATORS)}' operators are supported`); } const semverOperator = ['==', '!='].includes(operator) ? '=' : operator; const result = _semver.default.satisfies(coerceVersion(ver1), `${semverOperator}${coerceVersion(ver2)}`); return operator === '!=' ? !result : result; } function quote(args) { return (0, _shellQuote.quote)(args); } function unleakString(s) { return ` ${s}`.substr(1); } function pluralize(word, count, options = {}) { let inclusive = false; if (_lodash.default.isBoolean(options)) { inclusive = options; } else if (_lodash.default.isBoolean(options === null || options === void 0 ? void 0 : options.inclusive)) { inclusive = options.inclusive; } return (0, _pluralize.default)(word, count, inclusive); } async function toInMemoryBase64(srcPath, opts = {}) { if (!(await _fs.default.exists(srcPath)) || (await _fs.default.stat(srcPath)).isDirectory()) { throw new Error(`No such file: ${srcPath}`); } const { maxSize = 1 * GiB } = opts; const resultBuffers = []; let resultBuffersSize = 0; const resultWriteStream = new _stream.default.Writable({ write: (buffer, encoding, next) => { resultBuffers.push(buffer); resultBuffersSize += buffer.length; if (maxSize > 0 && resultBuffersSize > maxSize) { resultWriteStream.emit('error', new Error(`The size of the resulting ` + `buffer must not be greater than ${toReadableSizeString(maxSize)}`)); } next(); } }); const readerStream = _fs.default.createReadStream(srcPath); const base64EncoderStream = new _base64Stream.Base64Encode(); const resultWriteStreamPromise = new _bluebird.default((resolve, reject) => { resultWriteStream.once('error', e => { readerStream.unpipe(base64EncoderStream); base64EncoderStream.unpipe(resultWriteStream); readerStream.destroy(); reject(e); }); resultWriteStream.once('finish', resolve); }); const readStreamPromise = new _bluebird.default((resolve, reject) => { readerStream.once('close', resolve); readerStream.once('error', e => reject(new Error(`Failed to read '${srcPath}': ${e.message}`))); }); readerStream.pipe(base64EncoderStream); base64EncoderStream.pipe(resultWriteStream); await _bluebird.default.all([readStreamPromise, resultWriteStreamPromise]); return Buffer.concat(resultBuffers); } function getLockFileGuard(lockFile, opts = {}) { const { timeout = 120, tryRecovery = false } = opts; const lock = _bluebird.default.promisify(_lockfile2.default.lock); const check = _bluebird.default.promisify(_lockfile2.default.check); const unlock = _bluebird.default.promisify(_lockfile2.default.unlock); const guard = async behavior => { let triedRecovery = false; do { try { if (_lockfile2.default.checkSync(lockFile)) { await lock(lockFile, { wait: timeout * 1000 }); } else { _lockfile2.default.lockSync(lockFile); } break; } catch (e) { if (_lodash.default.includes(e.message, 'EEXIST') && tryRecovery && !triedRecovery) { _lockfile2.default.unlockSync(lockFile); triedRecovery = true; continue; } throw new Error(`Could not acquire lock on '${lockFile}' after ${timeout}s. ` + `Original error: ${e.message}`); } } while (true); try { return await behavior(); } finally { await unlock(lockFile); } }; guard.check = async () => await check(lockFile); return guard; }require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlsLmpzIl0sIm5hbWVzIjpbIlczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIiwiS2lCIiwiTWlCIiwiR2lCIiwiaGFzQ29udGVudCIsInZhbCIsIl8iLCJpc1N0cmluZyIsImhhc1ZhbHVlIiwiaGFzVmFsIiwiaXNOdW1iZXIiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZXNjYXBlU3BhY2UiLCJzdHIiLCJzcGxpdCIsImpvaW4iLCJlc2NhcGVTcGVjaWFsQ2hhcnMiLCJxdW90ZUVzY2FwZSIsInJlcGxhY2UiLCJyZSIsIlJlZ0V4cCIsImxvY2FsSXAiLCJpcCIsImNoYWluIiwib3MiLCJuZXR3b3JrSW50ZXJmYWNlcyIsInZhbHVlcyIsImZsYXR0ZW4iLCJmaWx0ZXIiLCJmYW1pbHkiLCJpbnRlcm5hbCIsIm1hcCIsImZpcnN0IiwidmFsdWUiLCJjYW5jZWxsYWJsZURlbGF5IiwibXMiLCJ0aW1lciIsInJlc29sdmUiLCJyZWplY3QiLCJkZWxheSIsIkIiLCJQcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0Iiwic2V0VGltZW91dCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIkNhbmNlbGxhdGlvbkVycm9yIiwibXVsdGlSZXNvbHZlIiwicm9vdHMiLCJhcmdzIiwicm9vdCIsInBhdGgiLCJzYWZlSnNvblBhcnNlIiwib2JqIiwiSlNPTiIsInBhcnNlIiwiaWduIiwianNvblN0cmluZ2lmeSIsInJlcGxhY2VyIiwic3BhY2UiLCJpc0Z1bmN0aW9uIiwiayIsInYiLCJidWZmZXJUb0pTT04iLCJCdWZmZXIiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJzdHJpbmdpZnkiLCJrZXkiLCJ1cGRhdGVkVmFsdWUiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwidW53cmFwRWxlbWVudCIsImVsIiwicHJvcE5hbWUiLCJoYXMiLCJ3cmFwRWxlbWVudCIsImVsZW1lbnRJZCIsIkVMRU1FTlQiLCJmaWx0ZXJPYmplY3QiLCJwcmVkaWNhdGUiLCJuZXdPYmoiLCJjbG9uZSIsInZhbHVlUHJlZGljYXRlIiwiT2JqZWN0Iiwia2V5cyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiYnl0ZXMiLCJpbnRCeXRlcyIsInBhcnNlSW50IiwiRXJyb3IiLCJwYXJzZUZsb2F0IiwidG9GaXhlZCIsImlzU3ViUGF0aCIsIm9yaWdpbmFsUGF0aCIsImZvcmNlUG9zaXgiLCJwYXRoT2JqIiwicG9zaXgiLCJwIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZWRSb290Iiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJzdGFydHNXaXRoIiwiaXNTYW1lRGVzdGluYXRpb24iLCJwYXRoMSIsInBhdGgyIiwicGF0aE4iLCJhbGxQYXRocyIsInJlZHVjZSIsImEiLCJiIiwiZnMiLCJleGlzdHMiLCJhcmVBbGxJdGVtc0VxdWFsIiwiYXJyIiwiTmFOIiwibWFwQ2IiLCJ4Iiwic3RhdCIsImJpZ2ludCIsImlubyIsInNlbXZlciIsImx0IiwicHJvY2VzcyIsInZlcnNpb24iLCJjb2VyY2VWZXJzaW9uIiwidmVyIiwic3RyaWN0IiwicmVzdWx0IiwidmFsaWQiLCJjb2VyY2UiLCJTVVBQT1JURURfT1BFUkFUT1JTIiwiY29tcGFyZVZlcnNpb25zIiwidmVyMSIsIm9wZXJhdG9yIiwidmVyMiIsImluY2x1ZGVzIiwic2VtdmVyT3BlcmF0b3IiLCJzYXRpc2ZpZXMiLCJxdW90ZSIsInVubGVha1N0cmluZyIsInMiLCJzdWJzdHIiLCJwbHVyYWxpemUiLCJ3b3JkIiwiY291bnQiLCJvcHRpb25zIiwiaW5jbHVzaXZlIiwiaXNCb29sZWFuIiwidG9Jbk1lbW9yeUJhc2U2NCIsInNyY1BhdGgiLCJvcHRzIiwiaXNEaXJlY3RvcnkiLCJtYXhTaXplIiwicmVzdWx0QnVmZmVycyIsInJlc3VsdEJ1ZmZlcnNTaXplIiwicmVzdWx0V3JpdGVTdHJlYW0iLCJzdHJlYW0iLCJXcml0YWJsZSIsIndyaXRlIiwiYnVmZmVyIiwiZW5jb2RpbmciLCJuZXh0IiwicHVzaCIsImxlbmd0aCIsImVtaXQiLCJyZWFkZXJTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiYmFzZTY0RW5jb2RlclN0cmVhbSIsIkJhc2U2NEVuY29kZSIsInJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSIsIm9uY2UiLCJlIiwidW5waXBlIiwiZGVzdHJveSIsInJlYWRTdHJlYW1Qcm9taXNlIiwibWVzc2FnZSIsInBpcGUiLCJhbGwiLCJjb25jYXQiLCJnZXRMb2NrRmlsZUd1YXJkIiwibG9ja0ZpbGUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJsb2NrIiwicHJvbWlzaWZ5IiwiX2xvY2tmaWxlIiwiY2hlY2siLCJ1bmxvY2siLCJndWFyZCIsImJlaGF2aW9yIiwidHJpZWRSZWNvdmVyeSIsImNoZWNrU3luYyIsIndhaXQiLCJsb2NrU3luYyIsInVubG9ja1N5bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUdBLE1BQU1BLDBCQUEwQixHQUFHLHFDQUFuQzs7QUFDQSxNQUFNQyxHQUFHLEdBQUcsSUFBWjs7QUFDQSxNQUFNQyxHQUFHLEdBQUdELEdBQUcsR0FBRyxJQUFsQjs7QUFDQSxNQUFNRSxHQUFHLEdBQUdELEdBQUcsR0FBRyxJQUFsQjs7O0FBRU8sU0FBU0UsVUFBVCxDQUFxQkMsR0FBckIsRUFBMEI7QUFDL0IsU0FBT0MsZ0JBQUVDLFFBQUYsQ0FBV0YsR0FBWCxLQUFtQkEsR0FBRyxLQUFLLEVBQWxDO0FBQ0Q7O0FBR0QsU0FBU0csUUFBVCxDQUFtQkgsR0FBbkIsRUFBd0I7QUFDdEIsTUFBSUksTUFBTSxHQUFHLEtBQWI7O0FBRUEsTUFBSUgsZ0JBQUVJLFFBQUYsQ0FBV0wsR0FBWCxDQUFKLEVBQXFCO0FBQ25CSSxJQUFBQSxNQUFNLEdBQUcsQ0FBQ0gsZ0JBQUVLLEtBQUYsQ0FB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QiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJy4vZnMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc2hlbGwtcXVvdGVcbiAgcXVvdGUgYXMgc2hlbGxRdW90ZSxcbiAgcGFyc2UgYXMgc2hlbGxQYXJzZSxcbn0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IHBsdXJhbGl6ZUxpYiBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQmFzZTY0RW5jb2RlIH0gZnJvbSAnYmFzZTY0LXN0cmVhbSc7XG5pbXBvcnQge1xuICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS91dWlkXG4gIHYxIGFzIHV1aWRWMSwgdjMgYXMgdXVpZFYzLFxuICB2NCBhcyB1dWlkVjQsIHY1IGFzIHV1aWRWNVxufSBmcm9tICd1dWlkJztcbmltcG9ydCBfbG9ja2ZpbGUgZnJvbSAnbG9ja2ZpbGUnO1xuXG5cbmNvbnN0IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSID0gJ2VsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmJztcbmNvbnN0IEtpQiA9IDEwMjQ7XG5jb25zdCBNaUIgPSBLaUIgKiAxMDI0O1xuY29uc3QgR2lCID0gTWlCICogMTAyNDtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbnRlbnQgKHZhbCkge1xuICByZXR1cm4gXy5pc1N0cmluZyh2YWwpICYmIHZhbCAhPT0gJyc7XG59XG5cbi8vIHJldHVybiB0cnVlIGlmIHRoZSB0aGUgdmFsdWUgaXMgbm90IHVuZGVmaW5lZCwgbnVsbCwgb3IgTmFOLlxuZnVuY3Rpb24gaGFzVmFsdWUgKHZhbCkge1xuICBsZXQgaGFzVmFsID0gZmFsc2U7XG4gIC8vIGF2b2lkIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYDBgIGFzIGZhbHNlXG4gIGlmIChfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICBoYXNWYWwgPSAhXy5pc05hTih2YWwpO1xuICB9IGVsc2Uge1xuICAgIGhhc1ZhbCA9ICFfLmlzVW5kZWZpbmVkKHZhbCkgJiYgIV8uaXNOdWxsKHZhbCk7XG4gIH1cblxuICByZXR1cm4gaGFzVmFsO1xufVxuXG4vLyBlc2NhcGUgc3BhY2VzIGluIHN0cmluZywgZm9yIGNvbW1hbmRsaW5lIGNhbGxzXG5mdW5jdGlvbiBlc2NhcGVTcGFjZSAoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAvKS5qb2luKCdcXFxcICcpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTcGVjaWFsQ2hhcnMgKHN0ciwgcXVvdGVFc2NhcGUpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBpZiAodHlwZW9mIHF1b3RlRXNjYXBlID09PSAndW5kZWZpbmVkJykge1xuICAgIHF1b3RlRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgc3RyID0gc3RyXG4gICAgLnJlcGxhY2UoL1tcXFxcXS9nLCAnXFxcXFxcXFwnKVxuICAgIC5yZXBsYWNlKC9bXFwvXS9nLCAnXFxcXC8nKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1tcXGJdL2csICdcXFxcYicpXG4gICAgLnJlcGxhY2UoL1tcXGZdL2csICdcXFxcZicpXG4gICAgLnJlcGxhY2UoL1tcXG5dL2csICdcXFxcbicpXG4gICAgLnJlcGxhY2UoL1tcXHJdL2csICdcXFxccicpXG4gICAgLnJlcGxhY2UoL1tcXHRdL2csICdcXFxcdCcpXG4gICAgLnJlcGxhY2UoL1tcXFwiXS9nLCAnXFxcXFwiJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICAgIC5yZXBsYWNlKC9cXFxcJy9nLCBcIlxcXFwnXCIpO1xuICBpZiAocXVvdGVFc2NhcGUpIHtcbiAgICBsZXQgcmUgPSBuZXcgUmVnRXhwKHF1b3RlRXNjYXBlLCAnZycpO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKHJlLCBgXFxcXCR7cXVvdGVFc2NhcGV9YCk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gbG9jYWxJcCAoKSB7XG4gIGxldCBpcCA9IF8uY2hhaW4ob3MubmV0d29ya0ludGVyZmFjZXMoKSlcbiAgICAudmFsdWVzKClcbiAgICAuZmxhdHRlbigpXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gKHZhbC5mYW1pbHkgPT09ICdJUHY0JyAmJiB2YWwuaW50ZXJuYWwgPT09IGZhbHNlKTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheSAobXMpIHtcbiAgbGV0IHRpbWVyO1xuICBsZXQgcmVzb2x2ZTtcbiAgbGV0IHJlamVjdDtcblxuICBjb25zdCBkZWxheSA9IG5ldyBCLlByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9LCBtcyk7XG4gIH0pO1xuXG4gIC8vIG92ZXJyaWRlIEJsdWViaXJkJ3MgYGNhbmNlbGAsIHdoaWNoIGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyBgYXdhaXRgIG9uXG4gIC8vIGEgcHJvbWlzZSwgc2luY2UgYHJlc29sdmVgL2ByZWplY3RgIGFyZSBuZXZlciBjYWxsZWRcbiAgZGVsYXkuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgcmVqZWN0KG5ldyBCLkNhbmNlbGxhdGlvbkVycm9yKCkpO1xuICB9O1xuICByZXR1cm4gZGVsYXk7XG59XG5cbmZ1bmN0aW9uIG11bHRpUmVzb2x2ZSAocm9vdHMsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIHJvb3RzLm1hcCgocm9vdCkgPT4gcGF0aC5yZXNvbHZlKHJvb3QsIC4uLmFyZ3MpKTtcbn1cblxuLypcbiAqIFBhcnNlcyBhbiBvYmplY3QgaWYgcG9zc2libGUuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlIChvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkgKG9iaiwgcmVwbGFjZXIsIHNwYWNlID0gMikge1xuICAvLyBpZiBubyByZXBsYWNlciBpcyBwYXNzZWQsIG9yIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLCBqdXN0IHVzZSBhIHBhc3MtdGhyb3VnaFxuICBpZiAoIV8uaXNGdW5jdGlvbihyZXBsYWNlcikpIHtcbiAgICByZXBsYWNlciA9IChrLCB2KSA9PiB2O1xuICB9XG5cbiAgLy8gQnVmZmVycyBjYW5ub3QgYmUgc2VyaWFsaXplZCBpbiBhIHJlYWRhYmxlIHdheVxuICBjb25zdCBidWZmZXJUb0pTT04gPSBCdWZmZXIucHJvdG90eXBlLnRvSlNPTjtcbiAgZGVsZXRlIEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICB9LCBzcGFjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudCAoZWwpIHtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIsICdFTEVNRU5UJ10pIHtcbiAgICBpZiAoXy5oYXMoZWwsIHByb3BOYW1lKSkge1xuICAgICAgcmV0dXJuIGVsW3Byb3BOYW1lXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiB3cmFwRWxlbWVudCAoZWxlbWVudElkKSB7XG4gIHJldHVybiB7XG4gICAgRUxFTUVOVDogZWxlbWVudElkLFxuICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IGVsZW1lbnRJZCxcbiAgfTtcbn1cblxuLypcbiAqIFJldHVybnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9yaWdpbmFsIGVsZW1lbnRcbiAqIHdoaWNoIHdlcmUgdHJ1dGh5IGdpdmVuIHRoZSBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzXG4gKiAgICogbWlzc2luZyAtIGl0IHdpbGwgcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGBcbiAqICAgKiBhIHNjYWxhciAtIGl0IHdpbGwgdGVzdCBhbGwgcHJvcGVydGllcycgdmFsdWVzIGFnYWluc3QgdGhhdCB2YWx1ZVxuICogICAqIGEgZnVuY3Rpb24gLSBpdCB3aWxsIHBhc3MgZWFjaCB2YWx1ZSBhbmQgdGhlIG9yaWdpbmFsIG9iamVjdCBpbnRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBmaWx0ZXJPYmplY3QgKG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nIChieXRlcykge1xuICBjb25zdCBpbnRCeXRlcyA9IHBhcnNlSW50KGJ5dGVzLCAxMCk7XG4gIGlmIChpc05hTihpbnRCeXRlcykgfHwgaW50Qnl0ZXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCAnJHtieXRlc30nIHRvIGEgcmVhZGFibGUgc2l6ZSBmb3JtYXRgKTtcbiAgfVxuICBpZiAoaW50Qnl0ZXMgPj0gR2lCKSB7XG4gICAgcmV0dXJuIGAke3BhcnNlRmxvYXQoaW50Qnl0ZXMgLyAoR2lCICogMS4wKSkudG9GaXhlZCgyKX0gR0JgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IE1pQikge1xuICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KGludEJ5dGVzIC8gKE1pQiAqIDEuMCkpLnRvRml4ZWQoMil9IE1CYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBLaUIpIHtcbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdChpbnRCeXRlcyAvIChLaUIgKiAxLjApKS50b0ZpeGVkKDIpfSBLQmA7XG4gIH1cbiAgcmV0dXJuIGAke2ludEJ5dGVzfSBCYDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHN1YnBhdGggb2YgdGhlXG4gKiBwYXJ0aWN1bGFyIHJvb3QgZm9sZGVyLiBCb3RoIHBhdGhzIGNhbiBpbmNsdWRlIC4uIGFuZCAuIHNwZWNpZmllcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JpZ2luYWxQYXRoIFRoZSBhYnNvbHV0ZSBmaWxlL2ZvbGRlciBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdCBUaGUgYWJzb2x1dGUgcm9vdCBmb2xkZXIgcGF0aFxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZm9yY2VQb3NpeCBTZXQgaXQgdG8gdHJ1ZSBpZiBwYXRocyBtdXN0IGJlIGludGVycHJldGVkIGluIFBPU0lYIGZvcm1hdFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGdpdmVuIG9yaWdpbmFsIHBhdGggaXMgdGhlIHN1YnBhdGggb2YgdGhlIHJvb3QgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW55IG9mIHRoZSBnaXZlbiBwYXRocyBpcyBub3QgYWJzb2x1dGVcbiAqL1xuZnVuY3Rpb24gaXNTdWJQYXRoIChvcmlnaW5hbFBhdGgsIHJvb3QsIGZvcmNlUG9zaXggPSBudWxsKSB7XG4gIGNvbnN0IHBhdGhPYmogPSBmb3JjZVBvc2l4ID8gcGF0aC5wb3NpeCA6IHBhdGg7XG4gIGZvciAoY29uc3QgcCBvZiBbb3JpZ2luYWxQYXRoLCByb290XSkge1xuICAgIGlmICghcGF0aE9iai5pc0Fic29sdXRlKHApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3B9JyBpcyBleHBlY3RlZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aE9iai5ub3JtYWxpemUocm9vdCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aE9iai5ub3JtYWxpemUob3JpZ2luYWxQYXRoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRocyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZSBzeXN0ZW1cbiAqIGRlc3RpbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlL2ZvbGRlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcGF0aE4gLSBaZXJvIG9yIG1vcmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMvZm9sZGVyc1xuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYWxsIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbSBpdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzU2FtZURlc3RpbmF0aW9uIChwYXRoMSwgcGF0aDIsIC4uLnBhdGhOKSB7XG4gIGNvbnN0IGFsbFBhdGhzID0gW3BhdGgxLCBwYXRoMiwgLi4ucGF0aE5dO1xuICBpZiAoIWF3YWl0IEIucmVkdWNlKGFsbFBhdGhzLCBhc3luYyAoYSwgYikgPT4gYSAmJiBhd2FpdCBmcy5leGlzdHMoYiksIHRydWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXJlQWxsSXRlbXNFcXVhbCA9IChhcnIpID0+ICEhYXJyLnJlZHVjZSgoYSwgYikgPT4gYSA9PT0gYiA/IGEgOiBOYU4pO1xuICBpZiAoYXJlQWxsSXRlbXNFcXVhbChhbGxQYXRocykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE5vZGUgMTAuNS4wIGludHJvZHVjZWQgYmlnaW50IHN1cHBvcnQgaW4gc3RhdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHByZWNpc2lvblxuICAvLyBob3dldmVyIGJlbG93IHRoYXQgdGhlIG9wdGlvbnMgZ2V0IGludGVycHJldGVkIGFzIHRoZSBjYWxsYmFja1xuICAvLyBUT0RPOiByZW1vdmUgd2hlbiBOb2RlIDEwIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+IGF3YWl0IGZzLnN0YXQoeCwge1xuICAgIGJpZ2ludDogdHJ1ZSxcbiAgfSkuaW5vO1xuICBpZiAoc2VtdmVyLmx0KHByb2Nlc3MudmVyc2lvbiwgJzEwLjUuMCcpKSB7XG4gICAgbWFwQ2IgPSBhc3luYyAoeCkgPT4gYXdhaXQgZnMuc3RhdCh4KS5pbm87XG4gIH1cbiAgcmV0dXJuIGFyZUFsbEl0ZW1zRXF1YWwoYXdhaXQgQi5tYXAoYWxsUGF0aHMsIG1hcENiKSk7XG59XG5cbi8qKlxuICogQ29lcmNlcyB0aGUgZ2l2ZW4gbnVtYmVyL3N0cmluZyB0byBhIHZhbGlkIHZlcnNpb24gc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2ZXIgLSBWZXJzaW9uIHN0cmluZyB0byBjb2VyY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RyaWN0IFt0cnVlXSAtIElmIHRydWUgdGhlbiBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd25cbiAqIGlmIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb2VyY2VkIHZlcnNpb24gbnVtYmVyIG9yIG51bGwgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmVcbiAqIGNvZXJjZWQgYW5kIHN0cmljdCBtb2RlIGlzIGRpc2FibGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgc3RyaWN0IG1vZGUgaXMgZW5hYmxlZCBhbmQgYHZlcmAgY2Fubm90IGJlIGNvZXJjZWRcbiAqL1xuZnVuY3Rpb24gY29lcmNlVmVyc2lvbiAodmVyLCBzdHJpY3QgPSB0cnVlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IFNVUFBPUlRFRF9PUEVSQVRPUlMgPSBbJz09JywgJyE9JywgJz4nLCAnPCcsICc+PScsICc8PScsICc9J107XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmVyMSAtIFRoZSBmaXJzdCB2ZXJzaW9uIG51bWJlciB0byBjb21wYXJlLiBTaG91bGQgYmUgYSB2YWxpZFxuICogdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGJ5IHNlbXZlciBwYXJzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZlcjIgLSBUaGUgc2Vjb25kIHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIE9uZSBvZiBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb3BlcmF0b3JzOlxuICogPT0sICE9LCA+LCA8LCA8PSwgPj0sID1cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGNvbXBhcmlzb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0b3IgaXMgc3VwcGxpZWQgb3IgYW55IG9mIHRoZSBzdXBwbGllZFxuICogdmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyAodmVyMSwgb3BlcmF0b3IsIHZlcjIpIHtcbiAgaWYgKCFTVVBQT1JURURfT1BFUkFUT1JTLmluY2x1ZGVzKG9wZXJhdG9yKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke29wZXJhdG9yfScgY29tcGFyaXNvbiBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiBgICtcbiAgICAgIGBPbmx5ICcke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9PUEVSQVRPUlMpfScgb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbXZlck9wZXJhdG9yID0gWyc9PScsICchPSddLmluY2x1ZGVzKG9wZXJhdG9yKSA/ICc9JyA6IG9wZXJhdG9yO1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuc2F0aXNmaWVzKGNvZXJjZVZlcnNpb24odmVyMSksIGAke3NlbXZlck9wZXJhdG9yfSR7Y29lcmNlVmVyc2lvbih2ZXIyKX1gKTtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSAnIT0nID8gIXJlc3VsdCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGQgYXBwcm9wcmlhdGUgcXVvdGVzIHRvIGNvbW1hbmQgYXJndW1lbnRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtc2hlbGwtcXVvdGVcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSAtIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhcnNlZFxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYXJndW1lbnRzLCBxdW90ZWRcbiAqL1xuZnVuY3Rpb24gcXVvdGUgKGFyZ3MpIHtcbiAgcmV0dXJuIHNoZWxsUXVvdGUoYXJncyk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGAgJHtzfWAuc3Vic3RyKDEpO1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gaW5jbHVzaXZlIFtmYWxzZV0gLSBXaGV0aGVyIHRvIHByZWZpeCB3aXRoIHRoZSBudW1iZXIgKGUuZy4sIDMgZHVja3MpXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGZvcm0gb2YgYSB3b3JkIGFwcHJvcHJpYXRlIHRvIHRoZSBjb3VudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkIC0gVGhlIHdvcmQgdG8gcGx1cmFsaXplXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBIb3cgbWFueSBvZiB0aGUgd29yZCBleGlzdFxuICogQHBhcmFtIHs/UGx1cmFsaXplT3B0aW9uc3xib29sZWFufSBvcHRpb25zfGluY2x1c2l2ZSAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSAod29yZCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgaW5jbHVzaXZlID0gZmFsc2U7XG4gIGlmIChfLmlzQm9vbGVhbihvcHRpb25zKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhIGJvb2xlYW5cbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zO1xuICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnM/LmluY2x1c2l2ZSkpIHtcbiAgICAvLyBpZiBwYXNzZWQgaW4gYXMgYW4gb3B0aW9ucyBoYXNoXG4gICAgaW5jbHVzaXZlID0gb3B0aW9ucy5pbmNsdXNpdmU7XG4gIH1cbiAgcmV0dXJuIHBsdXJhbGl6ZUxpYih3b3JkLCBjb3VudCwgaW5jbHVzaXZlKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFbmNvZGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhTaXplIFsxMDczNzQxODI0XSBUaGUgbWF4aW11bSBzaXplIG9mXG4gKiB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBpbiBieXRlcy4gVGhpcyBpcyBzZXQgdG8gMUdCIGJ5IGRlZmF1bHQsIGJlY2F1c2VcbiAqIEFwcGl1bSBsaW1pdHMgdGhlIG1heGltdW0gSFRUUCBib2R5IHNpemUgdG8gMUdCLiBBbHNvLCB0aGUgTm9kZUpTIGhlYXBcbiAqIHNpemUgbXVzdCBiZSBlbm91Z2ggdG8ga2VlcCB0aGUgcmVzdWx0aW5nIG9iamVjdCAodXN1YWxseSB0aGlzIHNpemUgaXNcbiAqIGxpbWl0ZWQgdG8gMS40IEdCKVxuICovXG5cbi8qKlxuICogQ29udmVydHMgY29udGVudHMgb2YgYSBsb2NhbCBmaWxlIHRvIGFuIGluLW1lbW9yeSBiYXNlLTY0IGVuY29kZWQgYnVmZmVyLlxuICogVGhlIG9wZXJhdGlvbiBpcyBtZW1vcnktdXNhZ2UgZnJpZW5kbHkgYW5kIHNob3VsZCBiZSB1c2VkIHdoaWxlIGVuY29kaW5nXG4gKiBsYXJnZSBmaWxlcyB0byBiYXNlNjRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGVuY29kZWRcbiAqIEBwYXJhbSB7RW5jb2RpbmdPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBiYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSBhcyBtZW1vcnkgYnVmZmVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIHNvdXJjZSBmaWxlXG4gKiBvciB0aGUgc291cmNlIGZpbGUgaXMgdG9vXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSW5NZW1vcnlCYXNlNjQgKHNyY1BhdGgsIG9wdHMgPSB7fSkge1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoc3JjUGF0aCkpIHx8IChhd2FpdCBmcy5zdGF0KHNyY1BhdGgpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGZpbGU6ICR7c3JjUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtYXhTaXplID0gMSAqIEdpQixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdEJ1ZmZlcnMgPSBbXTtcbiAgbGV0IHJlc3VsdEJ1ZmZlcnNTaXplID0gMDtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW0gPSBuZXcgc3RyZWFtLldyaXRhYmxlKHtcbiAgICB3cml0ZTogKGJ1ZmZlciwgZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHJlc3VsdEJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgcmVzdWx0QnVmZmVyc1NpemUgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGlmIChtYXhTaXplID4gMCAmJiByZXN1bHRCdWZmZXJzU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgcmVzdWx0V3JpdGVTdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgYGJ1ZmZlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gJHt0b1JlYWRhYmxlU2l6ZVN0cmluZyhtYXhTaXplKX1gKSk7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgcmVhZGVyU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShzcmNQYXRoKTtcbiAgY29uc3QgYmFzZTY0RW5jb2RlclN0cmVhbSA9IG5ldyBCYXNlNjRFbmNvZGUoKTtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgIHJlYWRlclN0cmVhbS51bnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gICAgICBiYXNlNjRFbmNvZGVyU3RyZWFtLnVucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG4gICAgICByZWFkZXJTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0pO1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICB9KTtcbiAgY29uc3QgcmVhZFN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHJlamVjdChcbiAgICAgIG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlYWQgJyR7c3JjUGF0aH0nOiAke2UubWVzc2FnZX1gKSkpO1xuICB9KTtcbiAgcmVhZGVyU3RyZWFtLnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gIGJhc2U2NEVuY29kZXJTdHJlYW0ucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG5cbiAgYXdhaXQgQi5hbGwoW3JlYWRTdHJlYW1Qcm9taXNlLCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2VdKTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmVzdWx0QnVmZmVycyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9ja0ZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMTIwXSBUaGUgbWF4IHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgbG9ja1xuICogQHByb3BlcnR5IHtib29sZWFufSB0cnlSZWNvdmVyeSBbZmFsc2VdIFdoZXRoZXIgdG8gdHJ5IGxvY2sgcmVjb3ZlcnkgaWZcbiAqIHRoZSBmaXJzdCBhdHRlbXB0IHRvIGFjcXVpcmUgaXQgdGltZWQgb3V0LlxuICovXG5cbi8qKlxuICogQ3JlYXRlIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCBub3QgcHJvY2VlZCB1bnRpbCBhIGNlcnRhaW4gZmlsZSBpcyBub1xuICogbG9uZ2VyIHByZXNlbnQgb24gdGhlIHN5c3RlbS4gVGhpcyBhbGxvd3MgZm9yIHByZXZlbnRpbmcgY29uY3VycmVudCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzXG4gKiB1c2luZyBhIGtub3duIGxvY2tmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2tGaWxlIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgdXNlZCBmb3IgdGhlIGxvY2tcbiAqIEBwYXJhbSB7TG9ja0ZpbGVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7QXN5bmNGdW5jdGlvbn0gYXN5bmMgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbm90aGVyIGFzeW5jIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBsb2NrZWRcbiAqIGJlaGF2aW9yXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tGaWxlR3VhcmQgKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSAxMjAsXG4gICAgdHJ5UmVjb3ZlcnkgPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgbG9jayA9IEIucHJvbWlzaWZ5KF9sb2NrZmlsZS5sb2NrKTtcbiAgY29uc3QgY2hlY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUuY2hlY2spO1xuICBjb25zdCB1bmxvY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUudW5sb2NrKTtcblxuICBjb25zdCBndWFyZCA9IGFzeW5jIChiZWhhdmlvcikgPT4ge1xuICAgIGxldCB0cmllZFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWYgdGhlIGxvY2tmaWxlIGRvZXNuJ3QgZXhpc3QsIGxvY2sgaXQgc3luY2hyb25vdXNseSB0byBtYWtlIHN1cmUgbm8gb3RoZXIgY2FsbFxuICAgICAgICAvLyBvbiB0aGUgc2FtZSBzcGluIG9mIHRoZSBldmVudCBsb29wIGNhbiBhbHNvIGluaXRpYXRlIGEgbG9jay4gSWYgdGhlIGxvY2tmaWxlIGRvZXMgZXhpc3RcbiAgICAgICAgLy8gdGhlbiBqdXN0IHVzZSB0aGUgcmVndWxhciBhc3luYyAnbG9jaycgbWV0aG9kIHdoaWNoIHdpbGwgd2FpdCBvbiB0aGUgbG9jay5cbi