UNPKG

gst-atom-xcuitest-driver

Version:

ATOM driver for iOS using XCUITest for backend

292 lines (225 loc) 32.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.commands = void 0; require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _gstAtomBaseDriver = require("gst-atom-base-driver"); var _gstAtomIosDriver = require("gst-atom-ios-driver"); var _appiumSupport = require("appium-support"); var _logger = _interopRequireDefault(require("../logger")); let commands = {}, extensions = {}; exports.commands = commands; Object.assign(extensions, _gstAtomIosDriver.iosCommands.element); commands.getNativeAttribute = async function getNativeAttribute(attribute, el) { if (attribute === 'contentSize') { return await this.getContentSize(el); } el = _appiumSupport.util.unwrapElement(el); let value = await this.proxyCommand(`/element/${el}/attribute/${attribute}`, 'GET'); if ([0, 1].includes(value)) { value = !!value; } return _lodash.default.isNull(value) || _lodash.default.isString(value) ? value : JSON.stringify(value); }; commands.getAttribute = async function getAttribute(attribute, el) { el = _appiumSupport.util.unwrapElement(el); if (!this.isWebContext()) { return await this.getNativeAttribute(attribute, el); } const atomsElement = this.getAtomsElement(el); if (_lodash.default.isNull(atomsElement)) { throw new _gstAtomBaseDriver.errors.UnknownError(`Error converting element ID for using in WD atoms: '${el}`); } return await this.executeAtom('get_attribute_value', [atomsElement, attribute]); }; commands.getText = async function getText(el) { el = _appiumSupport.util.unwrapElement(el); if (!this.isWebContext()) { return await this.proxyCommand(`/element/${el}/text`, 'GET'); } let atomsElement = this.useAtomsElement(el); return await this.executeAtom('get_text', [atomsElement]); }; commands.getElementRect = async function getElementRect(el) { if (this.isWebContext()) { const { x, y } = await this.getLocation(el); const { width, height } = await this.getSize(el); return { x, y, width, height }; } el = _appiumSupport.util.unwrapElement(el); return await this.getNativeRect(el); }; extensions.getNativeRect = async function getNativeRect(el) { return await this.proxyCommand(`/element/${el}/rect`, 'GET'); }; commands.getLocation = async function getLocation(el) { el = _appiumSupport.util.unwrapElement(el); if (this.isWebContext()) { const atomsElement = await this.useAtomsElement(el); let loc = await this.executeAtom('get_top_left_coordinates', [atomsElement]); if (this.opts.absoluteWebLocations) { const script = 'return [document.body.scrollLeft, document.body.scrollTop];'; const [xOffset, yOffset] = await this.execute(script); loc.x += xOffset; loc.y += yOffset; } return loc; } const rect = await this.getElementRect(el); return { x: rect.x, y: rect.y }; }; commands.getLocationInView = async function getLocationInView(el) { return await this.getLocation(el); }; commands.getSize = async function getSize(el) { el = _appiumSupport.util.unwrapElement(el); if (this.isWebContext()) { let atomsElement = this.getAtomsElement(el); if (atomsElement === null) { throw new _gstAtomBaseDriver.errors.UnknownError(`Error converting element ID for using in WD atoms: '${el}'`); } return await this.executeAtom('get_size', [atomsElement]); } const rect = await this.getElementRect(el); return { width: rect.width, height: rect.height }; }; function prepareInputValue(inp) { if (![_lodash.default.isArray, _lodash.default.isString, _lodash.default.isFinite].some(f => f(inp))) { throw new Error(`Only strings, numbers and arrays are supported as input arguments. ` + `Received: ${JSON.stringify(inp)}`); } if (_lodash.default.isArray(inp)) { inp = inp.join(''); } else if (_lodash.default.isFinite(inp)) { inp = `${inp}`; } return [...inp].map(k => { if (['\uE006', '\uE007'].includes(k)) { return '\n'; } if (['\uE003', '\ue017'].includes(k)) { return '\b'; } return k; }); } commands.setValueImmediate = async function setValueImmediate(value, el) { _logger.default.info('There is currently no way to bypass typing using XCUITest. Setting value through keyboard'); await this.setValue(value, el); }; commands.setValue = async function setValue(value, el) { el = _appiumSupport.util.unwrapElement(el); if (!this.isWebContext()) { await this.proxyCommand(`/element/${el}/value`, 'POST', { value: prepareInputValue(value) }); return; } const atomsElement = this.useAtomsElement(el); await this.executeAtom('click', [atomsElement]); await this.executeAtom('type', [atomsElement, value]); }; commands.keys = async function keys(value) { await this.proxyCommand('/wda/keys', 'POST', { value: prepareInputValue(value) }); }; commands.clear = async function clear(el) { el = _appiumSupport.util.unwrapElement(el); if (this.isWebContext()) { const atomsElement = this.useAtomsElement(el); await this.executeAtom('clear', [atomsElement]); return; } await this.proxyCommand(`/element/${el}/clear`, 'POST'); }; commands.getContentSize = async function getContentSize(el) { if (this.isWebContext()) { throw new _gstAtomBaseDriver.errors.NotYetImplementedError('Support for getContentSize for web context is not yet implemented. Please contact an Appium dev'); } const type = await this.getAttribute('type', el); if (type !== 'XCUIElementTypeTable' && type !== 'XCUIElementTypeCollectionView') { throw new Error(`Can't get content size for type '${type}', only for ` + `tables and collection views`); } let locator = '*'; if (type === 'XCUIElementTypeTable') { locator = 'XCUIElementTypeCell'; } let contentHeight = 0; const children = await this.findElOrEls(`class chain`, locator, true, el); if (children.length === 1) { const rect = await this.getElementRect(_lodash.default.head(children)); contentHeight = rect.height; } else if (children.length) { switch (type) { case 'XCUIElementTypeTable': { const firstRect = await this.getElementRect(_lodash.default.head(children)); const lastRect = await this.getElementRect(_lodash.default.last(children)); contentHeight = lastRect.y + lastRect.height - firstRect.y; break; } case 'XCUIElementTypeCollectionView': { let elsInRow = 1; let firstRect = await this.getElementRect(_lodash.default.head(children)); let initialRects = [firstRect]; for (let i = 1; i < children.length; i++) { const rect = await this.getElementRect(children[i]); initialRects.push(rect); if (rect.y !== firstRect.y) { elsInRow = i; break; } } const spaceBetweenEls = initialRects[elsInRow].y - initialRects[elsInRow - 1].y - initialRects[elsInRow - 1].height; const numRows = Math.ceil(children.length / elsInRow); contentHeight = numRows * firstRect.height + spaceBetweenEls * (numRows - 1); break; } default: throw new Error(`Programming error: type '${type}' was not ` + `valid but should have already been rejected`); } } const size = await this.getSize(el); const origin = await this.getLocationInView(el); return JSON.stringify({ width: size.width, height: size.height, top: origin.y, left: origin.x, scrollableOffset: contentHeight }); }; commands.isKeyboardShown = async function isKeyboardShown() { try { await this.findNativeElementOrElements('class name', 'XCUIElementTypeKeyboard', false); return true; } catch (ign) { return false; } }; Object.assign(extensions, commands); var _default = extensions; exports.default = _default;require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZXh0ZW5zaW9ucyIsIk9iamVjdCIsImFzc2lnbiIsImlvc0NvbW1hbmRzIiwiZWxlbWVudCIsImdldE5hdGl2ZUF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsImVsIiwiZ2V0Q29udGVudFNpemUiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsInZhbHVlIiwicHJveHlDb21tYW5kIiwiaW5jbHVkZXMiLCJfIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0QXR0cmlidXRlIiwiaXNXZWJDb250ZXh0IiwiYXRvbXNFbGVtZW50IiwiZ2V0QXRvbXNFbGVtZW50IiwiZXJyb3JzIiwiVW5rbm93bkVycm9yIiwiZXhlY3V0ZUF0b20iLCJnZXRUZXh0IiwidXNlQXRvbXNFbGVtZW50IiwiZ2V0RWxlbWVudFJlY3QiLCJ4IiwieSIsImdldExvY2F0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJnZXRTaXplIiwiZ2V0TmF0aXZlUmVjdCIsImxvYyIsIm9wdHMiLCJhYnNvbHV0ZVdlYkxvY2F0aW9ucyIsInNjcmlwdCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiZXhlY3V0ZSIsInJlY3QiLCJnZXRMb2NhdGlvbkluVmlldyIsInByZXBhcmVJbnB1dFZhbHVlIiwiaW5wIiwiaXNBcnJheSIsImlzRmluaXRlIiwic29tZSIsImYiLCJFcnJvciIsImpvaW4iLCJtYXAiLCJrIiwic2V0VmFsdWVJbW1lZGlhdGUiLCJsb2ciLCJpbmZvIiwic2V0VmFsdWUiLCJrZXlzIiwiY2xlYXIiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwidHlwZSIsImxvY2F0b3IiLCJjb250ZW50SGVpZ2h0IiwiY2hpbGRyZW4iLCJmaW5kRWxPckVscyIsImxlbmd0aCIsImhlYWQiLCJmaXJzdFJlY3QiLCJsYXN0UmVjdCIsImxhc3QiLCJlbHNJblJvdyIsImluaXRpYWxSZWN0cyIsImkiLCJwdXNoIiwic3BhY2VCZXR3ZWVuRWxzIiwibnVtUm93cyIsIk1hdGgiLCJjZWlsIiwic2l6ZSIsIm9yaWdpbiIsInRvcCIsImxlZnQiLCJzY3JvbGxhYmxlT2Zmc2V0IiwiaXNLZXlib2FyZFNob3duIiwiZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzIiwiaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLElBQUlBLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLFVBQVUsR0FBRyxFQUFoQzs7QUFJQUMsTUFBTSxDQUFDQyxNQUFQLENBQWNGLFVBQWQsRUFBMEJHLDhCQUFZQyxPQUF0Qzs7QUFFQUwsUUFBUSxDQUFDTSxrQkFBVCxHQUE4QixlQUFlQSxrQkFBZixDQUFtQ0MsU0FBbkMsRUFBOENDLEVBQTlDLEVBQWtEO0FBQzlFLE1BQUlELFNBQVMsS0FBSyxhQUFsQixFQUFpQztBQUUvQixXQUFPLE1BQU0sS0FBS0UsY0FBTCxDQUFvQkQsRUFBcEIsQ0FBYjtBQUNEOztBQUVEQSxFQUFBQSxFQUFFLEdBQUdFLG9CQUFLQyxhQUFMLENBQW1CSCxFQUFuQixDQUFMO0FBR0EsTUFBSUksS0FBSyxHQUFHLE1BQU0sS0FBS0MsWUFBTCxDQUFtQixZQUFXTCxFQUFHLGNBQWFELFNBQVUsRUFBeEQsRUFBMkQsS0FBM0QsQ0FBbEI7O0FBRUEsTUFBSSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU9PLFFBQVAsQ0FBZ0JGLEtBQWhCLENBQUosRUFBNEI7QUFDMUJBLElBQUFBLEtBQUssR0FBRyxDQUFDLENBQUNBLEtBQVY7QUFDRDs7QUFFRCxTQUFRRyxnQkFBRUMsTUFBRixDQUFTSixLQUFULEtBQW1CRyxnQkFBRUUsUUFBRixDQUFXTCxLQUFYLENBQXBCLEdBQXlDQSxLQUF6QyxHQUFpRE0sSUFBSSxDQUFDQyxTQUFMLENBQWVQLEtBQWYsQ0FBeEQ7QUFDRCxDQWhCRDs7QUFrQkFaLFFBQVEsQ0FBQ29CLFlBQVQsR0FBd0IsZUFBZUEsWUFBZixDQUE2QmIsU0FBN0IsRUFBd0NDLEVBQXhDLEVBQTRDO0FBQ2xFQSxFQUFBQSxFQUFFLEdBQUdFLG9CQUFLQyxhQUFMLENBQW1CSCxFQUFuQixDQUFMOztBQUNBLE1BQUksQ0FBQyxLQUFLYSxZQUFMLEVBQUwsRUFBMEI7QUFDeEIsV0FBTyxNQUFNLEtBQUtmLGtCQUFMLENBQXdCQyxTQUF4QixFQUFtQ0MsRUFBbkMsQ0FBYjtBQUNEOztBQUNELFFBQU1jLFlBQVksR0FBRyxLQUFLQyxlQUFMLENBQXFCZixFQUFyQixDQUFyQjs7QUFDQSxNQUFJTyxnQkFBRUMsTUFBRixDQUFTTSxZQUFULENBQUosRUFBNEI7QUFDMUIsVUFBTSxJQUFJRSwwQkFBT0MsWUFBWCxDQUF5Qix1REFBc0RqQixFQUFHLEVBQWxGLENBQU47QUFDRDs7QUFDRCxTQUFPLE1BQU0sS0FBS2tCLFdBQUwsQ0FBaUIscUJBQWpCLEVBQXdDLENBQUNKLFlBQUQsRUFBZWYsU0FBZixDQUF4QyxDQUFiO0FBQ0QsQ0FWRDs7QUFZQVAsUUFBUSxDQUFDMkIsT0FBVCxHQUFtQixlQUFlQSxPQUFmLENBQXdCbkIsRUFBeEIsRUFBNEI7QUFDN0NBLEVBQUFBLEVBQUUsR0FBR0Usb0JBQUtDLGFBQUwsQ0FBbUJILEVBQW5CLENBQUw7O0FBQ0EsTUFBSSxDQUFDLEtBQUthLFlBQUwsRUFBTCxFQUEwQjtBQUN4QixXQUFPLE1BQU0sS0FBS1IsWUFBTCxDQUFtQixZQUFXTCxFQUFHLE9BQWpDLEVBQXlDLEtBQXpDLENBQWI7QUFDRDs7QUFDRCxNQUFJYyxZQUFZLEdBQUcsS0FBS00sZUFBTCxDQUFxQnBCLEVBQXJCLENBQW5CO0FBQ0EsU0FBTyxNQUFNLEtBQUtrQixXQUFMLENBQWlCLFVBQWpCLEVBQTZCLENBQUNKLFlBQUQsQ0FBN0IsQ0FBYjtBQUNELENBUEQ7O0FBU0F0QixRQUFRLENBQUM2QixjQUFULEdBQTBCLGVBQWVBLGNBQWYsQ0FBK0JyQixFQUEvQixFQUFtQztBQUMzRCxNQUFJLEtBQUthLFlBQUwsRUFBSixFQUF5QjtBQUV2QixVQUFNO0FBQUNTLE1BQUFBLENBQUQ7QUFBSUMsTUFBQUE7QUFBSixRQUFTLE1BQU0sS0FBS0MsV0FBTCxDQUFpQnhCLEVBQWpCLENBQXJCO0FBQ0EsVUFBTTtBQUFDeUIsTUFBQUEsS0FBRDtBQUFRQyxNQUFBQTtBQUFSLFFBQWtCLE1BQU0sS0FBS0MsT0FBTCxDQUFhM0IsRUFBYixDQUE5QjtBQUNBLFdBQU87QUFBQ3NCLE1BQUFBLENBQUQ7QUFBSUMsTUFBQUEsQ0FBSjtBQUFPRSxNQUFBQSxLQUFQO0FBQWNDLE1BQUFBO0FBQWQsS0FBUDtBQUNEOztBQUVEMUIsRUFBQUEsRUFBRSxHQUFHRSxvQkFBS0MsYUFBTCxDQUFtQkgsRUFBbkIsQ0FBTDtBQUNBLFNBQU8sTUFBTSxLQUFLNEIsYUFBTCxDQUFtQjVCLEVBQW5CLENBQWI7QUFDRCxDQVZEOztBQVlBUCxVQUFVLENBQUNtQyxhQUFYLEdBQTJCLGVBQWVBLGFBQWYsQ0FBOEI1QixFQUE5QixFQUFrQztBQUMzRCxTQUFPLE1BQU0sS0FBS0ssWUFBTCxDQUFtQixZQUFXTCxFQUFHLE9BQWpDLEVBQXlDLEtBQXpDLENBQWI7QUFDRCxDQUZEOztBQUlBUixRQUFRLENBQUNnQyxXQUFULEdBQXVCLGVBQWVBLFdBQWYsQ0FBNEJ4QixFQUE1QixFQUFnQztBQUNyREEsRUFBQUEsRUFBRSxHQUFHRSxvQkFBS0MsYUFBTCxDQUFtQkgsRUFBbkIsQ0FBTDs7QUFDQSxNQUFJLEtBQUthLFlBQUwsRUFBSixFQUF5QjtBQUN2QixVQUFNQyxZQUFZLEdBQUcsTUFBTSxLQUFLTSxlQUFMLENBQXFCcEIsRUFBckIsQ0FBM0I7QUFDQSxRQUFJNkIsR0FBRyxHQUFHLE1BQU0sS0FBS1gsV0FBTCxDQUFpQiwwQkFBakIsRUFBNkMsQ0FBQ0osWUFBRCxDQUE3QyxDQUFoQjs7QUFDQSxRQUFJLEtBQUtnQixJQUFMLENBQVVDLG9CQUFkLEVBQW9DO0FBQ2xDLFlBQU1DLE1BQU0sR0FBRyw2REFBZjtBQUNBLFlBQU0sQ0FBQ0MsT0FBRCxFQUFVQyxPQUFWLElBQXFCLE1BQU0sS0FBS0MsT0FBTCxDQUFhSCxNQUFiLENBQWpDO0FBQ0FILE1BQUFBLEdBQUcsQ0FBQ1AsQ0FBSixJQUFTVyxPQUFUO0FBQ0FKLE1BQUFBLEdBQUcsQ0FBQ04sQ0FBSixJQUFTVyxPQUFUO0FBQ0Q7O0FBQ0QsV0FBT0wsR0FBUDtBQUNEOztBQUVELFFBQU1PLElBQUksR0FBRyxNQUFNLEtBQUtmLGNBQUwsQ0FBb0JyQixFQUFwQixDQUFuQjtBQUNBLFNBQU87QUFBQ3NCLElBQUFBLENBQUMsRUFBRWMsSUFBSSxDQUFDZCxDQUFUO0FBQVlDLElBQUFBLENBQUMsRUFBRWEsSUFBSSxDQUFDYjtBQUFwQixHQUFQO0FBQ0QsQ0FoQkQ7O0FBa0JBL0IsUUFBUSxDQUFDNkMsaUJBQVQsR0FBNkIsZUFBZUEsaUJBQWYsQ0FBa0NyQyxFQUFsQyxFQUFzQztBQUNqRSxTQUFPLE1BQU0sS0FBS3dCLFdBQUwsQ0FBaUJ4QixFQUFqQixDQUFiO0FBQ0QsQ0FGRDs7QUFJQVIsUUFBUSxDQUFDbUMsT0FBVCxHQUFtQixlQUFlQSxPQUFmLENBQXdCM0IsRUFBeEIsRUFBNEI7QUFDN0NBLEVBQUFBLEVBQUUsR0FBR0Usb0JBQUtDLGFBQUwsQ0FBbUJILEVBQW5CLENBQUw7O0FBQ0EsTUFBSSxLQUFLYSxZQUFMLEVBQUosRUFBeUI7QUFDdkIsUUFBSUMsWUFBWSxHQUFHLEtBQUtDLGVBQUwsQ0FBcUJmLEVBQXJCLENBQW5COztBQUNBLFFBQUljLFlBQVksS0FBSyxJQUFyQixFQUEyQjtBQUN6QixZQUFNLElBQUlFLDBCQUFPQyxZQUFYLENBQXlCLHVEQUFzRGpCLEVBQUcsR0FBbEYsQ0FBTjtBQUNEOztBQUNELFdBQU8sTUFBTSxLQUFLa0IsV0FBTCxDQUFpQixVQUFqQixFQUE2QixDQUFDSixZQUFELENBQTdCLENBQWI7QUFDRDs7QUFFRCxRQUFNc0IsSUFBSSxHQUFHLE1BQU0sS0FBS2YsY0FBTCxDQUFvQnJCLEVBQXBCLENBQW5CO0FBQ0EsU0FBTztBQUFDeUIsSUFBQUEsS0FBSyxFQUFFVyxJQUFJLENBQUNYLEtBQWI7QUFBb0JDLElBQUFBLE1BQU0sRUFBRVUsSUFBSSxDQUFDVjtBQUFqQyxHQUFQO0FBQ0QsQ0FaRDs7QUEwQkEsU0FBU1ksaUJBQVQsQ0FBNEJDLEdBQTVCLEVBQWlDO0FBQy9CLE1BQUksQ0FBQyxDQUFDaEMsZ0JBQUVpQyxPQUFILEVBQVlqQyxnQkFBRUUsUUFBZCxFQUF3QkYsZ0JBQUVrQyxRQUExQixFQUFvQ0MsSUFBcEMsQ0FBMENDLENBQUQsSUFBT0EsQ0FBQyxDQUFDSixHQUFELENBQWpELENBQUwsRUFBOEQ7QUFDNUQsVUFBTSxJQUFJSyxLQUFKLENBQVcscUVBQUQsR0FDYixhQUFZbEMsSUFBSSxDQUFDQyxTQUFMLENBQWU0QixHQUFmLENBQW9CLEVBRDdCLENBQU47QUFFRDs7QUFJRCxNQUFJaEMsZ0JBQUVpQyxPQUFGLENBQVVELEdBQVYsQ0FBSixFQUFvQjtBQUNsQkEsSUFBQUEsR0FBRyxHQUFHQSxHQUFHLENBQUNNLElBQUosQ0FBUyxFQUFULENBQU47QUFDRCxHQUZELE1BRU8sSUFBSXRDLGdCQUFFa0MsUUFBRixDQUFXRixHQUFYLENBQUosRUFBcUI7QUFDMUJBLElBQUFBLEdBQUcsR0FBSSxHQUFFQSxHQUFJLEVBQWI7QUFDRDs7QUFHRCxTQUFPLENBQUMsR0FBR0EsR0FBSixFQUFTTyxHQUFULENBQWNDLENBQUQsSUFBTztBQUN6QixRQUFJLENBQUMsUUFBRCxFQUFXLFFBQVgsRUFBcUJ6QyxRQUFyQixDQUE4QnlDLENBQTlCLENBQUosRUFBc0M7QUFDcEMsYUFBTyxJQUFQO0FBQ0Q7O0FBQ0QsUUFBSSxDQUFDLFFBQUQsRUFBVyxRQUFYLEVBQXFCekMsUUFBckIsQ0FBOEJ5QyxDQUE5QixDQUFKLEVBQXNDO0FBQ3BDLGFBQU8sSUFBUDtBQUNEOztBQUNELFdBQU9BLENBQVA7QUFDRCxHQVJNLENBQVA7QUFTRDs7QUFFRHZELFFBQVEsQ0FBQ3dELGlCQUFULEdBQTZCLGVBQWVBLGlCQUFmLENBQWtDNUMsS0FBbEMsRUFBeUNKLEVBQXpDLEVBQTZDO0FBRXhFaUQsa0JBQUlDLElBQUosQ0FBUywyRkFBVDs7QUFDQSxRQUFNLEtBQUtDLFFBQUwsQ0FBYy9DLEtBQWQsRUFBcUJKLEVBQXJCLENBQU47QUFDRCxDQUpEOztBQU1BUixRQUFRLENBQUMyRCxRQUFULEdBQW9CLGVBQWVBLFFBQWYsQ0FBeUIvQyxLQUF6QixFQUFnQ0osRUFBaEMsRUFBb0M7QUFDdERBLEVBQUFBLEVBQUUsR0FBR0Usb0JBQUtDLGFBQUwsQ0FBbUJILEVBQW5CLENBQUw7O0FBQ0EsTUFBSSxDQUFDLEtBQUthLFlBQUwsRUFBTCxFQUEwQjtBQUN4QixVQUFNLEtBQUtSLFlBQUwsQ0FBbUIsWUFBV0wsRUFBRyxRQUFqQyxFQUEwQyxNQUExQyxFQUFrRDtBQUN0REksTUFBQUEsS0FBSyxFQUFFa0MsaUJBQWlCLENBQUNsQyxLQUFEO0FBRDhCLEtBQWxELENBQU47QUFHQTtBQUNEOztBQUVELFFBQU1VLFlBQVksR0FBRyxLQUFLTSxlQUFMLENBQXFCcEIsRUFBckIsQ0FBckI7QUFDQSxRQUFNLEtBQUtrQixXQUFMLENBQWlCLE9BQWpCLEVBQTBCLENBQUNKLFlBQUQsQ0FBMUIsQ0FBTjtBQUNBLFFBQU0sS0FBS0ksV0FBTCxDQUFpQixNQUFqQixFQUF5QixDQUFDSixZQUFELEVBQWVWLEtBQWYsQ0FBekIsQ0FBTjtBQUNELENBWkQ7O0FBY0FaLFFBQVEsQ0FBQzRELElBQVQsR0FBZ0IsZUFBZUEsSUFBZixDQUFxQmhELEtBQXJCLEVBQTRCO0FBQzFDLFFBQU0sS0FBS0MsWUFBTCxDQUFrQixXQUFsQixFQUErQixNQUEvQixFQUF1QztBQUMzQ0QsSUFBQUEsS0FBSyxFQUFFa0MsaUJBQWlCLENBQUNsQyxLQUFEO0FBRG1CLEdBQXZDLENBQU47QUFHRCxDQUpEOztBQU1BWixRQUFRLENBQUM2RCxLQUFULEdBQWlCLGVBQWVBLEtBQWYsQ0FBc0JyRCxFQUF0QixFQUEwQjtBQUN6Q0EsRUFBQUEsRUFBRSxHQUFHRSxvQkFBS0MsYUFBTCxDQUFtQkgsRUFBbkIsQ0FBTDs7QUFDQSxNQUFJLEtBQUthLFlBQUwsRUFBSixFQUF5QjtBQUN2QixVQUFNQyxZQUFZLEdBQUcsS0FBS00sZUFBTCxDQUFxQnBCLEVBQXJCLENBQXJCO0FBQ0EsVUFBTSxLQUFLa0IsV0FBTCxDQUFpQixPQUFqQixFQUEwQixDQUFDSixZQUFELENBQTFCLENBQU47QUFDQTtBQUNEOztBQUNELFFBQU0sS0FBS1QsWUFBTCxDQUFtQixZQUFXTCxFQUFHLFFBQWpDLEVBQTBDLE1BQTFDLENBQU47QUFDRCxDQVJEOztBQVVBUixRQUFRLENBQUNTLGNBQVQsR0FBMEIsZUFBZUEsY0FBZixDQUErQkQsRUFBL0IsRUFBbUM7QUFDM0QsTUFBSSxLQUFLYSxZQUFMLEVBQUosRUFBeUI7QUFDdkIsVUFBTSxJQUFJRywwQkFBT3NDLHNCQUFYLENBQWtDLGlHQUFsQyxDQUFOO0FBQ0Q7O0FBRUQsUUFBTUMsSUFBSSxHQUFHLE1BQU0sS0FBSzNDLFlBQUwsQ0FBa0IsTUFBbEIsRUFBMEJaLEVBQTFCLENBQW5COztBQUVBLE1BQUl1RCxJQUFJLEtBQUssc0JBQVQsSUFDQUEsSUFBSSxLQUFLLCtCQURiLEVBQzhDO0FBQzVDLFVBQU0sSUFBSVgsS0FBSixDQUFXLG9DQUFtQ1csSUFBSyxjQUF6QyxHQUNDLDZCQURYLENBQU47QUFFRDs7QUFDRCxNQUFJQyxPQUFPLEdBQUcsR0FBZDs7QUFDQSxNQUFJRCxJQUFJLEtBQUssc0JBQWIsRUFBcUM7QUFFbkNDLElBQUFBLE9BQU8sR0FBRyxxQkFBVjtBQUNEOztBQUVELE1BQUlDLGFBQWEsR0FBRyxDQUFwQjtBQUNBLFFBQU1DLFFBQVEsR0FBRyxNQUFNLEtBQUtDLFdBQUwsQ0FBa0IsYUFBbEIsRUFBZ0NILE9BQWhDLEVBQXlDLElBQXpDLEVBQStDeEQsRUFBL0MsQ0FBdkI7O0FBQ0EsTUFBSTBELFFBQVEsQ0FBQ0UsTUFBVCxLQUFvQixDQUF4QixFQUEyQjtBQUd6QixVQUFNeEIsSUFBSSxHQUFHLE1BQU0sS0FBS2YsY0FBTCxDQUFvQmQsZ0JBQUVzRCxJQUFGLENBQU9ILFFBQVAsQ0FBcEIsQ0FBbkI7QUFDQUQsSUFBQUEsYUFBYSxHQUFHckIsSUFBSSxDQUFDVixNQUFyQjtBQUNELEdBTEQsTUFLTyxJQUFJZ0MsUUFBUSxDQUFDRSxNQUFiLEVBQXFCO0FBRzFCLFlBQVFMLElBQVI7QUFDRSxXQUFLLHNCQUFMO0FBQTZCO0FBQzNCLGdCQUFNTyxTQUFTLEdBQUcsTUFBTSxLQUFLekMsY0FBTCxDQUFvQmQsZ0JBQUVzRCxJQUFGLENBQU9ILFFBQVAsQ0FBcEIsQ0FBeEI7QUFDQSxnQkFBTUssUUFBUSxHQUFHLE1BQU0sS0FBSzFDLGNBQUwsQ0FBb0JkLGdCQUFFeUQsSUFBRixDQUFPTixRQUFQLENBQXBCLENBQXZCO0FBQ0FELFVBQUFBLGFBQWEsR0FBR00sUUFBUSxDQUFDeEMsQ0FBVCxHQUFhd0MsUUFBUSxDQUFDckMsTUFBdEIsR0FBK0JvQyxTQUFTLENBQUN2QyxDQUF6RDtBQUNBO0FBQ0Q7O0FBQ0QsV0FBSywrQkFBTDtBQUFzQztBQUNwQyxjQUFJMEMsUUFBUSxHQUFHLENBQWY7QUFDQSxjQUFJSCxTQUFTLEdBQUcsTUFBTSxLQUFLekMsY0FBTCxDQUFvQmQsZ0JBQUVzRCxJQUFGLENBQU9ILFFBQVAsQ0FBcEIsQ0FBdEI7QUFDQSxjQUFJUSxZQUFZLEdBQUcsQ0FBQ0osU0FBRCxDQUFuQjs7QUFDQSxlQUFLLElBQUlLLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdULFFBQVEsQ0FBQ0UsTUFBN0IsRUFBcUNPLENBQUMsRUFBdEMsRUFBMEM7QUFDeEMsa0JBQU0vQixJQUFJLEdBQUcsTUFBTSxLQUFLZixjQUFMLENBQW9CcUMsUUFBUSxDQUFDUyxDQUFELENBQTVCLENBQW5CO0FBQ0FELFlBQUFBLFlBQVksQ0FBQ0UsSUFBYixDQUFrQmhDLElBQWxCOztBQUNBLGdCQUFJQSxJQUFJLENBQUNiLENBQUwsS0FBV3VDLFNBQVMsQ0FBQ3ZDLENBQXpCLEVBQTRCO0FBQzFCMEMsY0FBQUEsUUFBUSxHQUFHRSxDQUFYO0FBQ0E7QUFDRDtBQUNGOztBQUNELGdCQUFNRSxlQUFlLEdBQUdILFlBQVksQ0FBQ0QsUUFBRCxDQUFaLENBQXVCMUMsQ0FBdkIsR0FBMkIyQyxZQUFZLENBQUNELFFBQVEsR0FBRyxDQUFaLENBQVosQ0FBMkIxQyxDQUF0RCxHQUEwRDJDLFlBQVksQ0FBQ0QsUUFBUSxHQUFHLENBQVosQ0FBWixDQUEyQnZDLE1BQTdHO0FBQ0EsZ0JBQU00QyxPQUFPLEdBQUdDLElBQUksQ0FBQ0MsSUFBTCxDQUFVZCxRQUFRLENBQUNFLE1BQVQsR0FBa0JLLFFBQTVCLENBQWhCO0FBR0FSLFVBQUFBLGFBQWEsR0FBSWEsT0FBTyxHQUFHUixTQUFTLENBQUNwQyxNQUFyQixHQUFnQzJDLGVBQWUsSUFBSUMsT0FBTyxHQUFHLENBQWQsQ0FBL0Q7QUFDQTtBQUNEOztBQUNEO0FBQVMsY0FBTSxJQUFJMUIsS0FBSixDQUFXLDRCQUEyQlcsSUFBSyxZQUFqQyxHQUNDLDZDQURYLENBQU47QUExQlg7QUE2QkQ7O0FBQ0QsUUFBTWtCLElBQUksR0FBRyxNQUFNLEtBQUs5QyxPQUFMLENBQWEzQixFQUFiLENBQW5CO0FBQ0EsUUFBTTBFLE1BQU0sR0FBRyxNQUFNLEtBQUtyQyxpQkFBTCxDQUF1QnJDLEVBQXZCLENBQXJCO0FBRUEsU0FBT1UsSUFBSSxDQUFDQyxTQUFMLENBQWU7QUFDcEJjLElBQUFBLEtBQUssRUFBRWdELElBQUksQ0FBQ2hELEtBRFE7QUFFcEJDLElBQUFBLE1BQU0sRUFBRStDLElBQUksQ0FBQy9DLE1BRk87QUFHcEJpRCxJQUFBQSxHQUFHLEVBQUVELE1BQU0sQ0FBQ25ELENBSFE7QUFJcEJxRCxJQUFBQSxJQUFJLEVBQUVGLE1BQU0sQ0FBQ3BELENBSk87QUFLcEJ1RCxJQUFBQSxnQkFBZ0IsRUFBRXBCO0FBTEUsR0FBZixDQUFQO0FBT0QsQ0FwRUQ7O0FBc0VBakUsUUFBUSxDQUFDc0YsZUFBVCxHQUEyQixlQUFlQSxlQUFmLEdBQWtDO0FBQzNELE1BQUk7QUFDRixVQUFNLEtBQUtDLDJCQUFMLENBQWlDLFlBQWpDLEVBQStDLHlCQUEvQyxFQUEwRSxLQUExRSxDQUFOO0FBQ0EsV0FBTyxJQUFQO0FBQ0QsR0FIRCxDQUdFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLFdBQU8sS0FBUDtBQUNEO0FBQ0YsQ0FQRDs7QUFTQXRGLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjRixVQUFkLEVBQTBCRCxRQUExQjtlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2dzdC1hdG9tLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGlvc0NvbW1hbmRzIH0gZnJvbSAnZ3N0LWF0b20taW9zLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbi8vIHB1bGwgaW4gYWxsIHRoZSBlbGVtZW50IGNvbW1hbmRzIGFuZCBoZWxwZXJzIGZyb20gaW9zLWRyaXZlcixcbi8vIHRoZW4gb3ZlcnJpZGUgYW55dGhpbmcgd2Ugd2FudCBiZWxvd1xuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBpb3NDb21tYW5kcy5lbGVtZW50KTtcblxuY29tbWFuZHMuZ2V0TmF0aXZlQXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmF0aXZlQXR0cmlidXRlIChhdHRyaWJ1dGUsIGVsKSB7XG4gIGlmIChhdHRyaWJ1dGUgPT09ICdjb250ZW50U2l6ZScpIHtcbiAgICAvLyBkb24ndCBwcm94eSByZXF1ZXN0cyBmb3IgdGhlIGNvbnRlbnQgc2l6ZSBvZiBhIHNjcm9sbGFibGUgZWxlbWVudFxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENvbnRlbnRTaXplKGVsKTtcbiAgfVxuXG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcblxuICAvLyBvdGhlcndpc2UgbGV0IFdEQSBoYW5kbGUgYXR0cmlidXRlIHJlcXVlc3RzXG4gIGxldCB2YWx1ZSA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS9hdHRyaWJ1dGUvJHthdHRyaWJ1dGV9YCwgJ0dFVCcpO1xuICAvLyBUcmFuc2Zvcm0gdGhlIHJlc3VsdCBmb3IgdGhlIGNhc2Ugd2hlbiBXREEgcmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGZvciBhIGJvb2xlYW4gdmFsdWVcbiAgaWYgKFswLCAxXS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gIH1cbiAgLy8gVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2dldC1lbGVtZW50LWF0dHJpYnV0ZVxuICByZXR1cm4gKF8uaXNOdWxsKHZhbHVlKSB8fCBfLmlzU3RyaW5nKHZhbHVlKSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn07XG5cbmNvbW1hbmRzLmdldEF0dHJpYnV0ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZSAoYXR0cmlidXRlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE5hdGl2ZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIGVsKTtcbiAgfVxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIGlmIChfLmlzTnVsbChhdG9tc0VsZW1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfYXR0cmlidXRlX3ZhbHVlJywgW2F0b21zRWxlbWVudCwgYXR0cmlidXRlXSk7XG59O1xuXG5jb21tYW5kcy5nZXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGV4dCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3RleHRgLCAnR0VUJyk7XG4gIH1cbiAgbGV0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90ZXh0JywgW2F0b21zRWxlbWVudF0pO1xufTtcblxuY29tbWFuZHMuZ2V0RWxlbWVudFJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRFbGVtZW50UmVjdCAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAvLyBNb2JpbGUgc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCByZWN0XG4gICAgY29uc3Qge3gsIHl9ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRTaXplKGVsKTtcbiAgICByZXR1cm4ge3gsIHksIHdpZHRoLCBoZWlnaHR9O1xuICB9XG5cbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXROYXRpdmVSZWN0KGVsKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0TmF0aXZlUmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVJlY3QgKGVsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vcmVjdGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSBhd2FpdCB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgbGV0IGxvYyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90b3BfbGVmdF9jb29yZGluYXRlcycsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBpZiAodGhpcy5vcHRzLmFic29sdXRlV2ViTG9jYXRpb25zKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSAncmV0dXJuIFtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXTsnO1xuICAgICAgY29uc3QgW3hPZmZzZXQsIHlPZmZzZXRdID0gYXdhaXQgdGhpcy5leGVjdXRlKHNjcmlwdCk7XG4gICAgICBsb2MueCArPSB4T2Zmc2V0O1xuICAgICAgbG9jLnkgKz0geU9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIGxvYztcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsKTtcbiAgcmV0dXJuIHt4OiByZWN0LngsIHk6IHJlY3QueX07XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbkluVmlldyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uSW5WaWV3IChlbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG59O1xuXG5jb21tYW5kcy5nZXRTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2l6ZSAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gICAgaWYgKGF0b21zRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF9zaXplJywgW2F0b21zRWxlbWVudF0pO1xuICB9XG5cbiAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoZWwpO1xuICByZXR1cm4ge3dpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0fTtcbn07XG5cbi8qKlxuICogUHJlcGFyZXMgdGhlIGlucHV0IHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBXREEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8c3RyaW5nPnxudW1iZXJ9IGlucCBUaGUgYWN0dWFsIHRleHQgdG8gdHlwZS5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIG9mIGBpbnBgOlxuICogICBbJ3NvbWUgdGV4dCddXG4gKiAgIFsncycsICdvJywgJ20nLCAnZScsICcgJywgJ3QnLCAnZScsICd4JywgJ3QnXVxuICogICAnc29tZSB0ZXh0J1xuICogICAxMjM0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHZhbHVlIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBpbnB1dFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBwcmVwcm9jZXNzZWQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUlucHV0VmFsdWUgKGlucCkge1xuICBpZiAoIVtfLmlzQXJyYXksIF8uaXNTdHJpbmcsIF8uaXNGaW5pdGVdLnNvbWUoKGYpID0+IGYoaW5wKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgc3RyaW5ncywgbnVtYmVycyBhbmQgYXJyYXlzIGFyZSBzdXBwb3J0ZWQgYXMgaW5wdXQgYXJndW1lbnRzLiBgICtcbiAgICAgIGBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShpbnApfWApO1xuICB9XG5cbiAgLy8gbWFrZSBpdCBpbnRvIGEgc3RyaW5nLCBzbyB0aGVuIHdlIGFzc3VyZVxuICAvLyB0aGUgYXJyYXkgaXRlbXMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzXG4gIGlmIChfLmlzQXJyYXkoaW5wKSkge1xuICAgIGlucCA9IGlucC5qb2luKCcnKTtcbiAgfSBlbHNlIGlmIChfLmlzRmluaXRlKGlucCkpIHtcbiAgICBpbnAgPSBgJHtpbnB9YDtcbiAgfVxuICAvLyBUaGUgYHNwbGl0YCBtZXRob2QgbXVzdCBub3QgYmUgdXNlZCBvbiB0aGUgc3RyaW5nXG4gIC8vIHRvIHByb3Blcmx5IGhhbmRsZSBhbGwgVW5pY29kZSBjb2RlIHBvaW50c1xuICByZXR1cm4gWy4uLmlucF0ubWFwKChrKSA9PiB7XG4gICAgaWYgKFsnXFx1RTAwNicsICdcXHVFMDA3J10uaW5jbHVkZXMoaykpIHsgLy8gUkVUVVJOIG9yIEVOVEVSXG4gICAgICByZXR1cm4gJ1xcbic7XG4gICAgfVxuICAgIGlmIChbJ1xcdUUwMDMnLCAnXFx1ZTAxNyddLmluY2x1ZGVzKGspKSB7IC8vIEJBQ0tTUEFDRSBvciBERUxFVEVcbiAgICAgIHJldHVybiAnXFxiJztcbiAgICB9XG4gICAgcmV0dXJuIGs7XG4gIH0pO1xufVxuXG5jb21tYW5kcy5zZXRWYWx1ZUltbWVkaWF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFZhbHVlSW1tZWRpYXRlICh2YWx1ZSwgZWwpIHtcbiAgLy8gV0RBIGRvZXMgbm90IHByb3ZpZGUgbm8gd2F5IHRvIHNldCB0aGUgdmFsdWUgZGlyZWN0bHlcbiAgbG9nLmluZm8oJ1RoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gYnlwYXNzIHR5cGluZyB1c2luZyBYQ1VJVGVzdC4gU2V0dGluZyB2YWx1ZSB0aHJvdWdoIGtleWJvYXJkJyk7XG4gIGF3YWl0IHRoaXMuc2V0VmFsdWUodmFsdWUsIGVsKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlID0gYXN5bmMgZnVuY3Rpb24gc2V0VmFsdWUgKHZhbHVlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS92YWx1ZWAsICdQT1NUJywge1xuICAgICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsaWNrJywgW2F0b21zRWxlbWVudF0pO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCd0eXBlJywgW2F0b21zRWxlbWVudCwgdmFsdWVdKTtcbn07XG5cbmNvbW1hbmRzLmtleXMgPSBhc3luYyBmdW5jdGlvbiBrZXlzICh2YWx1ZSkge1xuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9rZXlzJywgJ1BPU1QnLCB7XG4gICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsZWFyJywgW2F0b21zRWxlbWVudF0pO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vY2xlYXJgLCAnUE9TVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGVudFNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZW50U2l6ZSAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoJ1N1cHBvcnQgZm9yIGdldENvbnRlbnRTaXplIGZvciB3ZWIgY29udGV4dCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBQbGVhc2UgY29udGFjdCBhbiBBcHBpdW0gZGV2Jyk7XG4gIH1cblxuICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnLCBlbCk7XG5cbiAgaWYgKHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVUYWJsZScgJiZcbiAgICAgIHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVDb2xsZWN0aW9uVmlldycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGdldCBjb250ZW50IHNpemUgZm9yIHR5cGUgJyR7dHlwZX0nLCBvbmx5IGZvciBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRhYmxlcyBhbmQgY29sbGVjdGlvbiB2aWV3c2ApO1xuICB9XG4gIGxldCBsb2NhdG9yID0gJyonO1xuICBpZiAodHlwZSA9PT0gJ1hDVUlFbGVtZW50VHlwZVRhYmxlJykge1xuICAgIC8vIG9ubHkgZmluZCB0YWJsZSBjZWxscywgbm90IGp1c3QgYW55IGNoaWxkcmVuXG4gICAgbG9jYXRvciA9ICdYQ1VJRWxlbWVudFR5cGVDZWxsJztcbiAgfVxuXG4gIGxldCBjb250ZW50SGVpZ2h0ID0gMDtcbiAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKGBjbGFzcyBjaGFpbmAsIGxvY2F0b3IsIHRydWUsIGVsKTtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIGlmIHdlIGtub3cgdGhlcmUncyBvbmx5IG9uZSBlbGVtZW50LCB3ZSBjYW4gb3B0aW1pemUgdG8gbWFrZSBqdXN0IG9uZVxuICAgIC8vIGNhbGwgdG8gV0RBXG4gICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgY29udGVudEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIC8vIG90aGVyd2lzZSBpZiB3ZSBoYXZlIG11bHRpcGxlIGVsZW1lbnRzLCBsb2dpYyBkaWZmZXJzIGJhc2VkIG9uIGVsZW1lbnRcbiAgICAvLyB0eXBlXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdYQ1VJRWxlbWVudFR5cGVUYWJsZSc6IHtcbiAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KF8ubGFzdChjaGlsZHJlbikpO1xuICAgICAgICBjb250ZW50SGVpZ2h0ID0gbGFzdFJlY3QueSArIGxhc3RSZWN0LmhlaWdodCAtIGZpcnN0UmVjdC55O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1hDVUlFbGVtZW50VHlwZUNvbGxlY3Rpb25WaWV3Jzoge1xuICAgICAgICBsZXQgZWxzSW5Sb3cgPSAxOyAvLyB3ZSBrbm93IHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIHJvd1xuICAgICAgICBsZXQgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgbGV0IGluaXRpYWxSZWN0cyA9IFtmaXJzdFJlY3RdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoY2hpbGRyZW5baV0pO1xuICAgICAgICAgIGluaXRpYWxSZWN0cy5wdXNoKHJlY3QpO1xuICAgICAgICAgIGlmIChyZWN0LnkgIT09IGZpcnN0UmVjdC55KSB7XG4gICAgICAgICAgICBlbHNJblJvdyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BhY2VCZXR3ZWVuRWxzID0gaW5pdGlhbFJlY3RzW2Vsc0luUm93XS55IC0gaW5pdGlhbFJlY3RzW2Vsc0luUm93IC0gMV0ueSAtIGluaXRpYWxSZWN0c1tlbHNJblJvdyAtIDFdLmhlaWdodDtcbiAgICAgICAgY29uc3QgbnVtUm93cyA9IE1hdGguY2VpbChjaGlsZHJlbi5sZW5ndGggLyBlbHNJblJvdyk7XG5cbiAgICAgICAgLy8gYXNzdW1lIGFsbCBjZWxscyBhcmUgdGhlIHNhbWUgaGVpZ2h0XG4gICAgICAgIGNvbnRlbnRIZWlnaHQgPSAobnVtUm93cyAqIGZpcnN0UmVjdC5oZWlnaHQpICsgKHNwYWNlQmV0d2VlbkVscyAqIChudW1Sb3dzIC0gMSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgUHJvZ3JhbW1pbmcgZXJyb3I6IHR5cGUgJyR7dHlwZX0nIHdhcyBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHZhbGlkIGJ1dCBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVqZWN0ZWRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbCk7XG4gIGNvbnN0IG9yaWdpbiA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWwpO1xuICAvLyBhdHRyaWJ1dGVzIGhhdmUgdG8gYmUgc3RyaW5ncywgc28gc3RyaW5naWZ5IHRoaXMgdXBcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICB3aWR0aDogc2l6ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuICAgIHRvcDogb3JpZ2luLnksXG4gICAgbGVmdDogb3JpZ2luLngsXG4gICAgc2Nyb2xsYWJsZU9mZnNldDogY29udGVudEhlaWdodFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlS2V5Ym9hcmQnLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGlnbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcyk7XG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2VsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==