UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

228 lines (178 loc) 26.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getImgElFromArgs = getImgElFromArgs; exports.makeImageElementCache = makeImageElementCache; exports.DEFAULT_TEMPLATE_IMAGE_SCALE = exports.IMAGE_EL_TAP_STRATEGY_W3C = exports.IMAGE_EL_TAP_STRATEGY_MJSONWP = exports.ImageElement = void 0; require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _2 = require("../.."); var _lruCache = _interopRequireDefault(require("lru-cache")); var _protocol = require("../protocol/protocol"); var _logger = _interopRequireDefault(require("./logger")); var _uuidJs = _interopRequireDefault(require("uuid-js")); const MAX_CACHE_SIZE = 1024 * 1024 * 40; const TAP_DURATION_MS = 125; const IMAGE_EL_TAP_STRATEGY_W3C = 'w3cActions'; exports.IMAGE_EL_TAP_STRATEGY_W3C = IMAGE_EL_TAP_STRATEGY_W3C; const IMAGE_EL_TAP_STRATEGY_MJSONWP = 'touchActions'; exports.IMAGE_EL_TAP_STRATEGY_MJSONWP = IMAGE_EL_TAP_STRATEGY_MJSONWP; const IMAGE_TAP_STRATEGIES = [IMAGE_EL_TAP_STRATEGY_MJSONWP, IMAGE_EL_TAP_STRATEGY_W3C]; const DEFAULT_TEMPLATE_IMAGE_SCALE = 1.0; exports.DEFAULT_TEMPLATE_IMAGE_SCALE = DEFAULT_TEMPLATE_IMAGE_SCALE; class ImageElement { constructor(b64Template, rect, b64Result = null) { this.template = b64Template; this.rect = rect; this.id = `${_protocol.IMAGE_ELEMENT_PREFIX}${_uuidJs.default.create().hex}`; this.b64MatchedImage = b64Result; } get size() { return { width: this.rect.width, height: this.rect.height }; } get location() { return { x: this.rect.x, y: this.rect.y }; } get center() { return { x: this.rect.x + this.rect.width / 2, y: this.rect.y + this.rect.height / 2 }; } get matchedImage() { return this.b64MatchedImage; } asElement(protocolKey) { return { [protocolKey]: this.id }; } equals(other) { return this.rect.x === other.rect.x && this.rect.y === other.rect.y && this.rect.width === other.rect.width && this.rect.height === other.rect.height; } async click(driver) { let newImgEl; const { autoUpdateImageElementPosition: updatePos, checkForImageElementStaleness, imageElementTapStrategy } = driver.settings.getSettings(); if (!IMAGE_TAP_STRATEGIES.includes(imageElementTapStrategy)) { throw new Error(`Incorrect imageElementTapStrategy setting ` + `'${imageElementTapStrategy}'. Must be one of ` + JSON.stringify(IMAGE_TAP_STRATEGIES)); } if (checkForImageElementStaleness || updatePos) { _logger.default.info('Checking image element for staleness before clicking'); try { newImgEl = await driver.findByImage(this.template, { shouldCheckStaleness: true, ignoreDefaultImageTemplateScale: true }); } catch (err) { throw new _2.errors.StaleElementReferenceError(); } if (!this.equals(newImgEl)) { _logger.default.warn(`When trying to click on an image element, the image changed ` + `position from where it was originally found. It is now at ` + `${JSON.stringify(newImgEl.rect)} and was originally at ` + `${JSON.stringify(this.rect)}.`); if (updatePos) { _logger.default.warn('Click will proceed at new coordinates'); this.rect = _lodash.default.clone(newImgEl.rect); } else { _logger.default.warn('Click will take place at original coordinates. If you ' + 'would like Appium to automatically click the new ' + "coordinates, set the 'autoUpdateImageElementPosition' " + 'setting to true'); } } } const { x, y } = this.center; _logger.default.info(`Will tap on image element at coordinate [${x}, ${y}]`); if (imageElementTapStrategy === IMAGE_EL_TAP_STRATEGY_W3C) { _logger.default.info('Will tap using W3C actions'); const action = { type: 'pointer', id: 'mouse', parameters: { pointerType: 'touch' }, actions: [{ type: 'pointerMove', x, y, duration: 0 }, { type: 'pointerDown' }, { type: 'pause', duration: TAP_DURATION_MS }, { type: 'pointerUp' }] }; if (driver.performActions) { return await driver.performActions([action]); } _logger.default.warn('Driver does not seem to implement W3C actions, falling back ' + 'to TouchActions'); } _logger.default.info('Will tap using MJSONWP TouchActions'); const action = { action: 'tap', options: { x, y } }; if (driver.performTouch) { return await driver.performTouch([action]); } throw new Error("Driver did not implement the 'performTouch' command. " + 'For drivers to support finding image elements, they ' + "should support 'performTouch' and 'performActions'"); } static async execute(driver, cmd, imgElId, ...args) { if (!driver._imgElCache.has(imgElId)) { throw new _2.errors.NoSuchElementError(); } const imgEl = driver._imgElCache.get(imgElId); switch (cmd) { case 'click': return await imgEl.click(driver); case 'elementDisplayed': return true; case 'getSize': return imgEl.size; case 'getLocation': case 'getLocationInView': return imgEl.location; case 'getElementRect': return imgEl.rect; case 'getAttribute': if (args[0] === 'visual') { return imgEl.matchedImage; } else { throw new _2.errors.NotYetImplementedError(); } default: throw new _2.errors.NotYetImplementedError(); } } } exports.ImageElement = ImageElement; function makeImageElementCache(max = MAX_CACHE_SIZE) { return new _lruCache.default({ max, length: el => el.template.length }); } function getImgElFromArgs(args) { for (let arg of args) { if (_lodash.default.isString(arg) && arg.startsWith(_protocol.IMAGE_ELEMENT_PREFIX)) { return arg; } } }require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2ltYWdlLWVsZW1lbnQuanMiXSwibmFtZXMiOlsiTUFYX0NBQ0hFX1NJWkUiLCJUQVBfRFVSQVRJT05fTVMiLCJJTUFHRV9FTF9UQVBfU1RSQVRFR1lfVzNDIiwiSU1BR0VfRUxfVEFQX1NUUkFURUdZX01KU09OV1AiLCJJTUFHRV9UQVBfU1RSQVRFR0lFUyIsIkRFRkFVTFRfVEVNUExBVEVfSU1BR0VfU0NBTEUiLCJJbWFnZUVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsImI2NFRlbXBsYXRlIiwicmVjdCIsImI2NFJlc3VsdCIsInRlbXBsYXRlIiwiaWQiLCJJTUFHRV9FTEVNRU5UX1BSRUZJWCIsIlVVSUQiLCJjcmVhdGUiLCJoZXgiLCJiNjRNYXRjaGVkSW1hZ2UiLCJzaXplIiwid2lkdGgiLCJoZWlnaHQiLCJsb2NhdGlvbiIsIngiLCJ5IiwiY2VudGVyIiwibWF0Y2hlZEltYWdlIiwiYXNFbGVtZW50IiwicHJvdG9jb2xLZXkiLCJlcXVhbHMiLCJvdGhlciIsImNsaWNrIiwiZHJpdmVyIiwibmV3SW1nRWwiLCJhdXRvVXBkYXRlSW1hZ2VFbGVtZW50UG9zaXRpb24iLCJ1cGRhdGVQb3MiLCJjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzcyIsImltYWdlRWxlbWVudFRhcFN0cmF0ZWd5Iiwic2V0dGluZ3MiLCJnZXRTZXR0aW5ncyIsImluY2x1ZGVzIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwibG9nIiwiaW5mbyIsImZpbmRCeUltYWdlIiwic2hvdWxkQ2hlY2tTdGFsZW5lc3MiLCJpZ25vcmVEZWZhdWx0SW1hZ2VUZW1wbGF0ZVNjYWxlIiwiZXJyIiwiZXJyb3JzIiwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IiLCJ3YXJuIiwiXyIsImNsb25lIiwiYWN0aW9uIiwidHlwZSIsInBhcmFtZXRlcnMiLCJwb2ludGVyVHlwZSIsImFjdGlvbnMiLCJkdXJhdGlvbiIsInBlcmZvcm1BY3Rpb25zIiwib3B0aW9ucyIsInBlcmZvcm1Ub3VjaCIsImV4ZWN1dGUiLCJjbWQiLCJpbWdFbElkIiwiYXJncyIsIl9pbWdFbENhY2hlIiwiaGFzIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiaW1nRWwiLCJnZXQiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwibWFrZUltYWdlRWxlbWVudENhY2hlIiwibWF4IiwiTFJVIiwibGVuZ3RoIiwiZWwiLCJnZXRJbWdFbEZyb21BcmdzIiwiYXJnIiwiaXNTdHJpbmciLCJzdGFydHNXaXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsY0FBYyxHQUFHLE9BQU8sSUFBUCxHQUFjLEVBQXJDO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEdBQXhCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsWUFBbEM7O0FBQ0EsTUFBTUMsNkJBQTZCLEdBQUcsY0FBdEM7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsQ0FDM0JELDZCQUQyQixFQUUzQkQseUJBRjJCLENBQTdCO0FBSUEsTUFBTUcsNEJBQTRCLEdBQUcsR0FBckM7OztBQTBCQSxNQUFNQyxZQUFOLENBQW1CO0FBV2pCQyxFQUFBQSxXQUFXLENBQUVDLFdBQUYsRUFBZUMsSUFBZixFQUFxQkMsU0FBUyxHQUFHLElBQWpDLEVBQXVDO0FBQ2hELFNBQUtDLFFBQUwsR0FBZ0JILFdBQWhCO0FBQ0EsU0FBS0MsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0csRUFBTCxHQUFXLEdBQUVDLDhCQUFxQixHQUFFQyxnQkFBS0MsTUFBTCxHQUFjQyxHQUFJLEVBQXREO0FBQ0EsU0FBS0MsZUFBTCxHQUF1QlAsU0FBdkI7QUFDRDs7QUFLRCxNQUFJUSxJQUFKLEdBQVk7QUFDVixXQUFPO0FBQUNDLE1BQUFBLEtBQUssRUFBRSxLQUFLVixJQUFMLENBQVVVLEtBQWxCO0FBQXlCQyxNQUFBQSxNQUFNLEVBQUUsS0FBS1gsSUFBTCxDQUFVVztBQUEzQyxLQUFQO0FBQ0Q7O0FBS0QsTUFBSUMsUUFBSixHQUFnQjtBQUNkLFdBQU87QUFBQ0MsTUFBQUEsQ0FBQyxFQUFFLEtBQUtiLElBQUwsQ0FBVWEsQ0FBZDtBQUFpQkMsTUFBQUEsQ0FBQyxFQUFFLEtBQUtkLElBQUwsQ0FBVWM7QUFBOUIsS0FBUDtBQUNEOztBQUtELE1BQUlDLE1BQUosR0FBYztBQUNaLFdBQU87QUFDTEYsTUFBQUEsQ0FBQyxFQUFFLEtBQUtiLElBQUwsQ0FBVWEsQ0FBVixHQUFjLEtBQUtiLElBQUwsQ0FBVVUsS0FBVixHQUFrQixDQUQ5QjtBQUVMSSxNQUFBQSxDQUFDLEVBQUUsS0FBS2QsSUFBTCxDQUFVYyxDQUFWLEdBQWMsS0FBS2QsSUFBTCxDQUFVVyxNQUFWLEdBQW1CO0FBRi9CLEtBQVA7QUFJRDs7QUFLRCxNQUFJSyxZQUFKLEdBQW9CO0FBQ2xCLFdBQU8sS0FBS1IsZUFBWjtBQUNEOztBQVFEUyxFQUFBQSxTQUFTLENBQUVDLFdBQUYsRUFBZTtBQUN0QixXQUFPO0FBQUMsT0FBQ0EsV0FBRCxHQUFlLEtBQUtmO0FBQXJCLEtBQVA7QUFDRDs7QUFRRGdCLEVBQUFBLE1BQU0sQ0FBRUMsS0FBRixFQUFTO0FBQ2IsV0FBTyxLQUFLcEIsSUFBTCxDQUFVYSxDQUFWLEtBQWdCTyxLQUFLLENBQUNwQixJQUFOLENBQVdhLENBQTNCLElBQ0EsS0FBS2IsSUFBTCxDQUFVYyxDQUFWLEtBQWdCTSxLQUFLLENBQUNwQixJQUFOLENBQVdjLENBRDNCLElBRUEsS0FBS2QsSUFBTCxDQUFVVSxLQUFWLEtBQW9CVSxLQUFLLENBQUNwQixJQUFOLENBQVdVLEtBRi9CLElBR0EsS0FBS1YsSUFBTCxDQUFVVyxNQUFWLEtBQXFCUyxLQUFLLENBQUNwQixJQUFOLENBQVdXLE1BSHZDO0FBSUQ7O0FBUUQsUUFBTVUsS0FBTixDQUFhQyxNQUFiLEVBQXFCO0FBR25CLFFBQUlDLFFBQUo7QUFDQSxVQUFNO0FBQ0pDLE1BQUFBLDhCQUE4QixFQUFFQyxTQUQ1QjtBQUVKQyxNQUFBQSw2QkFGSTtBQUdKQyxNQUFBQTtBQUhJLFFBSUZMLE1BQU0sQ0FBQ00sUUFBUCxDQUFnQkMsV0FBaEIsRUFKSjs7QUFPQSxRQUFJLENBQUNsQyxvQkFBb0IsQ0FBQ21DLFFBQXJCLENBQThCSCx1QkFBOUIsQ0FBTCxFQUE2RDtBQUMzRCxZQUFNLElBQUlJLEtBQUosQ0FBVyw0Q0FBRCxHQUNDLElBQUdKLHVCQUF3QixvQkFENUIsR0FFQUssSUFBSSxDQUFDQyxTQUFMLENBQWV0QyxvQkFBZixDQUZWLENBQU47QUFHRDs7QUFFRCxRQUFJK0IsNkJBQTZCLElBQUlELFNBQXJDLEVBQWdEO0FBQzlDUyxzQkFBSUMsSUFBSixDQUFTLHNEQUFUOztBQUNBLFVBQUk7QUFDRlosUUFBQUEsUUFBUSxHQUFHLE1BQU1ELE1BQU0sQ0FBQ2MsV0FBUCxDQUFtQixLQUFLbEMsUUFBeEIsRUFBa0M7QUFDakRtQyxVQUFBQSxvQkFBb0IsRUFBRSxJQUQyQjtBQUlqREMsVUFBQUEsK0JBQStCLEVBQUU7QUFKZ0IsU0FBbEMsQ0FBakI7QUFNRCxPQVBELENBT0UsT0FBT0MsR0FBUCxFQUFZO0FBQ1osY0FBTSxJQUFJQyxVQUFPQywwQkFBWCxFQUFOO0FBQ0Q7O0FBRUQsVUFBSSxDQUFDLEtBQUt0QixNQUFMLENBQVlJLFFBQVosQ0FBTCxFQUE0QjtBQUMxQlcsd0JBQUlRLElBQUosQ0FBVSw4REFBRCxHQUNDLDREQURELEdBRUMsR0FBRVYsSUFBSSxDQUFDQyxTQUFMLENBQWVWLFFBQVEsQ0FBQ3ZCLElBQXhCLENBQThCLHlCQUZqQyxHQUdDLEdBQUVnQyxJQUFJLENBQUNDLFNBQUwsQ0FBZSxLQUFLakMsSUFBcEIsQ0FBMEIsR0FIdEM7O0FBSUEsWUFBSXlCLFNBQUosRUFBZTtBQUNiUywwQkFBSVEsSUFBSixDQUFTLHVDQUFUOztBQUNBLGVBQUsxQyxJQUFMLEdBQVkyQyxnQkFBRUMsS0FBRixDQUFRckIsUUFBUSxDQUFDdkIsSUFBakIsQ0FBWjtBQUNELFNBSEQsTUFHTztBQUNMa0MsMEJBQUlRLElBQUosQ0FBUywyREFDQSxtREFEQSxHQUVBLHdEQUZBLEdBR0EsaUJBSFQ7QUFJRDtBQUNGO0FBQ0Y7O0FBRUQsVUFBTTtBQUFDN0IsTUFBQUEsQ0FBRDtBQUFJQyxNQUFBQTtBQUFKLFFBQVMsS0FBS0MsTUFBcEI7O0FBQ0FtQixvQkFBSUMsSUFBSixDQUFVLDRDQUEyQ3RCLENBQUUsS0FBSUMsQ0FBRSxHQUE3RDs7QUFFQSxRQUFJYSx1QkFBdUIsS0FBS2xDLHlCQUFoQyxFQUEyRDtBQUV6RHlDLHNCQUFJQyxJQUFKLENBQVMsNEJBQVQ7O0FBQ0EsWUFBTVUsTUFBTSxHQUFHO0FBQ2JDLFFBQUFBLElBQUksRUFBRSxTQURPO0FBRWIzQyxRQUFBQSxFQUFFLEVBQUUsT0FGUztBQUdiNEMsUUFBQUEsVUFBVSxFQUFFO0FBQUNDLFVBQUFBLFdBQVcsRUFBRTtBQUFkLFNBSEM7QUFJYkMsUUFBQUEsT0FBTyxFQUFFLENBQ1A7QUFBQ0gsVUFBQUEsSUFBSSxFQUFFLGFBQVA7QUFBc0JqQyxVQUFBQSxDQUF0QjtBQUF5QkMsVUFBQUEsQ0FBekI7QUFBNEJvQyxVQUFBQSxRQUFRLEVBQUU7QUFBdEMsU0FETyxFQUVQO0FBQUNKLFVBQUFBLElBQUksRUFBRTtBQUFQLFNBRk8sRUFHUDtBQUFDQSxVQUFBQSxJQUFJLEVBQUUsT0FBUDtBQUFnQkksVUFBQUEsUUFBUSxFQUFFMUQ7QUFBMUIsU0FITyxFQUlQO0FBQUNzRCxVQUFBQSxJQUFJLEVBQUU7QUFBUCxTQUpPO0FBSkksT0FBZjs7QUFhQSxVQUFJeEIsTUFBTSxDQUFDNkIsY0FBWCxFQUEyQjtBQUN6QixlQUFPLE1BQU03QixNQUFNLENBQUM2QixjQUFQLENBQXNCLENBQUNOLE1BQUQsQ0FBdEIsQ0FBYjtBQUNEOztBQUdEWCxzQkFBSVEsSUFBSixDQUFTLGlFQUNBLGlCQURUO0FBRUQ7O0FBSURSLG9CQUFJQyxJQUFKLENBQVMscUNBQVQ7O0FBQ0EsVUFBTVUsTUFBTSxHQUFHO0FBQ2JBLE1BQUFBLE1BQU0sRUFBRSxLQURLO0FBRWJPLE1BQUFBLE9BQU8sRUFBRTtBQUFDdkMsUUFBQUEsQ0FBRDtBQUFJQyxRQUFBQTtBQUFKO0FBRkksS0FBZjs7QUFLQSxRQUFJUSxNQUFNLENBQUMrQixZQUFYLEVBQXlCO0FBQ3ZCLGFBQU8sTUFBTS9CLE1BQU0sQ0FBQytCLFlBQVAsQ0FBb0IsQ0FBQ1IsTUFBRCxDQUFwQixDQUFiO0FBQ0Q7O0FBRUQsVUFBTSxJQUFJZCxLQUFKLENBQVUsMERBQ0Esc0RBREEsR0FFQSxvREFGVixDQUFOO0FBR0Q7O0FBWUQsZUFBYXVCLE9BQWIsQ0FBc0JoQyxNQUF0QixFQUE4QmlDLEdBQTlCLEVBQW1DQyxPQUFuQyxFQUE0QyxHQUFHQyxJQUEvQyxFQUFxRDtBQUNuRCxRQUFJLENBQUNuQyxNQUFNLENBQUNvQyxXQUFQLENBQW1CQyxHQUFuQixDQUF1QkgsT0FBdkIsQ0FBTCxFQUFzQztBQUNwQyxZQUFNLElBQUloQixVQUFPb0Isa0JBQVgsRUFBTjtBQUNEOztBQUVELFVBQU1DLEtBQUssR0FBR3ZDLE1BQU0sQ0FBQ29DLFdBQVAsQ0FBbUJJLEdBQW5CLENBQXVCTixPQUF2QixDQUFkOztBQUVBLFlBQVFELEdBQVI7QUFDRSxXQUFLLE9BQUw7QUFDRSxlQUFPLE1BQU1NLEtBQUssQ0FBQ3hDLEtBQU4sQ0FBWUMsTUFBWixDQUFiOztBQUNGLFdBQUssa0JBQUw7QUFDRSxlQUFPLElBQVA7O0FBQ0YsV0FBSyxTQUFMO0FBQ0UsZUFBT3VDLEtBQUssQ0FBQ3BELElBQWI7O0FBQ0YsV0FBSyxhQUFMO0FBQ0EsV0FBSyxtQkFBTDtBQUNFLGVBQU9vRCxLQUFLLENBQUNqRCxRQUFiOztBQUNGLFdBQUssZ0JBQUw7QUFDRSxlQUFPaUQsS0FBSyxDQUFDN0QsSUFBYjs7QUFDRixXQUFLLGNBQUw7QUFJRSxZQUFJeUQsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLFFBQWhCLEVBQTBCO0FBQ3hCLGlCQUFPSSxLQUFLLENBQUM3QyxZQUFiO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsZ0JBQU0sSUFBSXdCLFVBQU91QixzQkFBWCxFQUFOO0FBQ0Q7O0FBQ0g7QUFBUyxjQUFNLElBQUl2QixVQUFPdUIsc0JBQVgsRUFBTjtBQXJCWDtBQXVCRDs7QUFsTmdCOzs7O0FBcU5uQixTQUFTQyxxQkFBVCxDQUFnQ0MsR0FBRyxHQUFHMUUsY0FBdEMsRUFBc0Q7QUFDcEQsU0FBTyxJQUFJMkUsaUJBQUosQ0FBUTtBQUNiRCxJQUFBQSxHQURhO0FBRWJFLElBQUFBLE1BQU0sRUFBR0MsRUFBRCxJQUFRQSxFQUFFLENBQUNsRSxRQUFILENBQVlpRTtBQUZmLEdBQVIsQ0FBUDtBQUlEOztBQUVELFNBQVNFLGdCQUFULENBQTJCWixJQUEzQixFQUFpQztBQUMvQixPQUFLLElBQUlhLEdBQVQsSUFBZ0JiLElBQWhCLEVBQXNCO0FBQ3BCLFFBQUlkLGdCQUFFNEIsUUFBRixDQUFXRCxHQUFYLEtBQW1CQSxHQUFHLENBQUNFLFVBQUosQ0FBZXBFLDhCQUFmLENBQXZCLEVBQTZEO0FBQzNELGFBQU9rRSxHQUFQO0FBQ0Q7QUFDRjtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJy4uLy4uJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7IElNQUdFX0VMRU1FTlRfUFJFRklYIH0gZnJvbSAnLi4vcHJvdG9jb2wvcHJvdG9jb2wnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgVVVJRCBmcm9tICd1dWlkLWpzJztcblxuY29uc3QgTUFYX0NBQ0hFX1NJWkUgPSAxMDI0ICogMTAyNCAqIDQwOyAvLyA0MG1iXG5jb25zdCBUQVBfRFVSQVRJT05fTVMgPSAxMjU7XG5jb25zdCBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfVzNDID0gJ3czY0FjdGlvbnMnO1xuY29uc3QgSU1BR0VfRUxfVEFQX1NUUkFURUdZX01KU09OV1AgPSAndG91Y2hBY3Rpb25zJztcbmNvbnN0IElNQUdFX1RBUF9TVFJBVEVHSUVTID0gW1xuICBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfTUpTT05XUCxcbiAgSU1BR0VfRUxfVEFQX1NUUkFURUdZX1czQ1xuXTtcbmNvbnN0IERFRkFVTFRfVEVNUExBVEVfSU1BR0VfU0NBTEUgPSAxLjA7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUmVjdFxuICogQHByb3BlcnR5IHtpbnR9IHggLSB4LWNvb3JkaW5hdGUgb2YgdG9wLWxlZnQgY29ybmVyXG4gKiBAcHJvcGVydHkge2ludH0geSAtIHktY29vcmRpbmF0ZSBvZiB0b3AtbGVmdCBjb3JuZXJcbiAqIEBwcm9wZXJ0eSB7aW50fSB3aWR0aCAtIHdpZHRoIG9mIHJlY3RcbiAqIEBwcm9wZXJ0eSB7aW50fSBoZWlnaHQgLSBoZWlnaHQgb2YgcmVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGltZW5zaW9uXG4gKiBAcHJvcGVydHkge2ludH0gd2lkdGggLSB3aWR0aCBvZiByZWN0XG4gKiBAcHJvcGVydHkge2ludH0gaGVpZ2h0IC0gaGVpZ2h0IG9mIHJlY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2ludH0geCAtIHggY29vcmRpbmF0ZVxuICogQHByb3BlcnR5IHtpbnR9IHkgLSB5IGNvb3JkaW5hdGVcbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIFwiaW1hZ2UgZWxlbWVudFwiLCB3aGljaCBpcyBzaW1wbHkgYSBzZXQgb2YgY29vcmRpbmF0ZXNcbiAqIGFuZCBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgb24gdGhhdCBzZXQgb2YgY29vcmRpbmF0ZXMgdmlhIHRoZSBkcml2ZXJcbiAqL1xuY2xhc3MgSW1hZ2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGI2NFRlbXBsYXRlIC0gdGhlIGJhc2U2NC1lbmNvZGVkIGltYWdlIHdoaWNoIHdhcyB1c2VkIHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmQgdGhpcyBJbWFnZUVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWN0fSByZWN0IC0gYm91bmRzIG9mIG1hdGNoZWQgaW1hZ2UgZWxlbWVudFxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGI2NFJlc3VsdCAtIHRoZSBiYXNlNjQtZW5jb2RlZCBpbWFnZSB3aGljaCBoYXMgbWF0Y2hlZCBtYXJrcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBudWxsLlxuICAgKlxuICAgKiBAcmV0dXJucyB7SW1hZ2VFbGVtZW50fVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGI2NFRlbXBsYXRlLCByZWN0LCBiNjRSZXN1bHQgPSBudWxsKSB7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IGI2NFRlbXBsYXRlO1xuICAgIHRoaXMucmVjdCA9IHJlY3Q7XG4gICAgdGhpcy5pZCA9IGAke0lNQUdFX0VMRU1FTlRfUFJFRklYfSR7VVVJRC5jcmVhdGUoKS5oZXh9YDtcbiAgICB0aGlzLmI2NE1hdGNoZWRJbWFnZSA9IGI2NFJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RGltZW5zaW9ufSAtIGRpbWVuc2lvbiBvZiBlbGVtZW50XG4gICAqL1xuICBnZXQgc2l6ZSAoKSB7XG4gICAgcmV0dXJuIHt3aWR0aDogdGhpcy5yZWN0LndpZHRoLCBoZWlnaHQ6IHRoaXMucmVjdC5oZWlnaHR9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQb3NpdGlvbn0gLSBjb29yZGluYXRlcyBvZiB0b3AtbGVmdCBjb3JuZXIgb2YgZWxlbWVudFxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uICgpIHtcbiAgICByZXR1cm4ge3g6IHRoaXMucmVjdC54LCB5OiB0aGlzLnJlY3QueX07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Bvc2l0aW9ufSAtIGNvb3JkaW5hdGVzIG9mIGNlbnRlciBvZiBlbGVtZW50XG4gICAqL1xuICBnZXQgY2VudGVyICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyLFxuICAgICAgeTogdGhpcy5yZWN0LnkgKyB0aGlzLnJlY3QuaGVpZ2h0IC8gMixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHs/c3RyaW5nfSAtIHRoZSBiYXNlNjQtZW5jb2RlZCBpbWFnZSB3aGljaCBoYXMgbWF0Y2hlZCBtYXJrc1xuICAgKi9cbiAgZ2V0IG1hdGNoZWRJbWFnZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYjY0TWF0Y2hlZEltYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbEtleSAtIHRoZSBwcm90b2NvbC1zcGVjaWZpYyBKU09OIGtleSBmb3JcbiAgICogYSBXZWJFbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm5zIHtXZWJFbGVtZW50fSAtIHRoaXMgaW1hZ2UgZWxlbWVudCBhcyBhIFdlYkVsZW1lbnRcbiAgICovXG4gIGFzRWxlbWVudCAocHJvdG9jb2xLZXkpIHtcbiAgICByZXR1cm4ge1twcm90b2NvbEtleV06IHRoaXMuaWR9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SW1hZ2VFbGVtZW50fSBvdGhlciAtIGFuIEltYWdlRWxlbWVudCB0byBjb21wYXJlIHdpdGggdGhpcyBvbmVcbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gd2hldGhlciB0aGUgb3RoZXIgZWxlbWVudCBhbmQgdGhpcyBvbmUgaGF2ZSB0aGUgc2FtZVxuICAgKiBwcm9wZXJ0aWVzXG4gICAqL1xuICBlcXVhbHMgKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjdC54ID09PSBvdGhlci5yZWN0LnggJiZcbiAgICAgICAgICAgdGhpcy5yZWN0LnkgPT09IG90aGVyLnJlY3QueSAmJlxuICAgICAgICAgICB0aGlzLnJlY3Qud2lkdGggPT09IG90aGVyLnJlY3Qud2lkdGggJiZcbiAgICAgICAgICAgdGhpcy5yZWN0LmhlaWdodCA9PT0gb3RoZXIucmVjdC5oZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGEgZHJpdmVyIHRvIHRhcCB0aGUgc2NyZWVuIGF0IHRoZSBjZW50ZXIgb2YgdGhpcyBJbWFnZUVsZW1lbnQnc1xuICAgKiBwb3NpdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VEcml2ZXJ9IGRyaXZlciAtIGRyaXZlciBmb3IgY2FsbGluZyBhY3Rpb25zIHdpdGhcbiAgICovXG4gIGFzeW5jIGNsaWNrIChkcml2ZXIpIHtcbiAgICAvLyBiZWZvcmUgd2UgY2xpY2sgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgc3RpbGwgdGhlcmVcbiAgICAvLyB3aGVyZSB3ZSBleHBlY3QgaXQgdG8gYmVcbiAgICBsZXQgbmV3SW1nRWw7XG4gICAgY29uc3Qge1xuICAgICAgYXV0b1VwZGF0ZUltYWdlRWxlbWVudFBvc2l0aW9uOiB1cGRhdGVQb3MsXG4gICAgICBjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzcyxcbiAgICAgIGltYWdlRWxlbWVudFRhcFN0cmF0ZWd5LFxuICAgIH0gPSBkcml2ZXIuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcblxuICAgIC8vIHZhbGlkYXRlIHRhcCBzdHJhdGVneVxuICAgIGlmICghSU1BR0VfVEFQX1NUUkFURUdJRVMuaW5jbHVkZXMoaW1hZ2VFbGVtZW50VGFwU3RyYXRlZ3kpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluY29ycmVjdCBpbWFnZUVsZW1lbnRUYXBTdHJhdGVneSBzZXR0aW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAnJHtpbWFnZUVsZW1lbnRUYXBTdHJhdGVneX0nLiBNdXN0IGJlIG9uZSBvZiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShJTUFHRV9UQVBfU1RSQVRFR0lFUykpO1xuICAgIH1cblxuICAgIGlmIChjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzcyB8fCB1cGRhdGVQb3MpIHtcbiAgICAgIGxvZy5pbmZvKCdDaGVja2luZyBpbWFnZSBlbGVtZW50IGZvciBzdGFsZW5lc3MgYmVmb3JlIGNsaWNraW5nJyk7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdJbWdFbCA9IGF3YWl0IGRyaXZlci5maW5kQnlJbWFnZSh0aGlzLnRlbXBsYXRlLCB7XG4gICAgICAgICAgc2hvdWxkQ2hlY2tTdGFsZW5lc3M6IHRydWUsXG4gICAgICAgICAgLy8gU2V0IGlnbm9yZURlZmF1bHRJbWFnZVRlbXBsYXRlU2NhbGUgYmVjYXVzZSB0aGlzLnRlbXBsYXRlIGlzIGRldmljZSBzY3JlZW5zaG90IGJhc2VkIGltYWdlXG4gICAgICAgICAgLy8gbWFuYWdlZCBpbnNpZGUgQXBwaXVtIGFmdGVyIGZpbmlkbmcgaW1hZ2UgYnkgdGVtcGxhdGUgd2hpY2ggbWFuYWdlZCBieSBhIHVzZXJcbiAgICAgICAgICBpZ25vcmVEZWZhdWx0SW1hZ2VUZW1wbGF0ZVNjYWxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmVxdWFscyhuZXdJbWdFbCkpIHtcbiAgICAgICAgbG9nLndhcm4oYFdoZW4gdHJ5aW5nIHRvIGNsaWNrIG9uIGFuIGltYWdlIGVsZW1lbnQsIHRoZSBpbWFnZSBjaGFuZ2VkIGAgK1xuICAgICAgICAgICAgICAgICBgcG9zaXRpb24gZnJvbSB3aGVyZSBpdCB3YXMgb3JpZ2luYWxseSBmb3VuZC4gSXQgaXMgbm93IGF0IGAgK1xuICAgICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShuZXdJbWdFbC5yZWN0KX0gYW5kIHdhcyBvcmlnaW5hbGx5IGF0IGAgK1xuICAgICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlY3QpfS5gKTtcbiAgICAgICAgaWYgKHVwZGF0ZVBvcykge1xuICAgICAgICAgIGxvZy53YXJuKCdDbGljayB3aWxsIHByb2NlZWQgYXQgbmV3IGNvb3JkaW5hdGVzJyk7XG4gICAgICAgICAgdGhpcy5yZWN0ID0gXy5jbG9uZShuZXdJbWdFbC5yZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cud2FybignQ2xpY2sgd2lsbCB0YWtlIHBsYWNlIGF0IG9yaWdpbmFsIGNvb3JkaW5hdGVzLiBJZiB5b3UgJyArXG4gICAgICAgICAgICAgICAgICAgJ3dvdWxkIGxpa2UgQXBwaXVtIHRvIGF1dG9tYXRpY2FsbHkgY2xpY2sgdGhlIG5ldyAnICtcbiAgICAgICAgICAgICAgICAgICBcImNvb3JkaW5hdGVzLCBzZXQgdGhlICdhdXRvVXBkYXRlSW1hZ2VFbGVtZW50UG9zaXRpb24nIFwiICtcbiAgICAgICAgICAgICAgICAgICAnc2V0dGluZyB0byB0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLmNlbnRlcjtcbiAgICBsb2cuaW5mbyhgV2lsbCB0YXAgb24gaW1hZ2UgZWxlbWVudCBhdCBjb29yZGluYXRlIFske3h9LCAke3l9XWApO1xuXG4gICAgaWYgKGltYWdlRWxlbWVudFRhcFN0cmF0ZWd5ID09PSBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfVzNDKSB7XG4gICAgICAvLyBzZXQgdXAgYSBXM0MgYWN0aW9uIHRvIGNsaWNrIG9uIHRoZSBpbWFnZSBieSBwb3NpdGlvblxuICAgICAgbG9nLmluZm8oJ1dpbGwgdGFwIHVzaW5nIFczQyBhY3Rpb25zJyk7XG4gICAgICBjb25zdCBhY3Rpb24gPSB7XG4gICAgICAgIHR5cGU6ICdwb2ludGVyJyxcbiAgICAgICAgaWQ6ICdtb3VzZScsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtwb2ludGVyVHlwZTogJ3RvdWNoJ30sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICB7dHlwZTogJ3BvaW50ZXJNb3ZlJywgeCwgeSwgZHVyYXRpb246IDB9LFxuICAgICAgICAgIHt0eXBlOiAncG9pbnRlckRvd24nfSxcbiAgICAgICAgICB7dHlwZTogJ3BhdXNlJywgZHVyYXRpb246IFRBUF9EVVJBVElPTl9NU30sXG4gICAgICAgICAge3R5cGU6ICdwb2ludGVyVXAnfSxcbiAgICAgICAgXVxuICAgICAgfTtcblxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGRyaXZlciBoYXMgdGhlIGFwcHJvcHJpYXRlIHBlcmZvcm1BY3Rpb25zIG1ldGhvZFxuICAgICAgaWYgKGRyaXZlci5wZXJmb3JtQWN0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgZHJpdmVyLnBlcmZvcm1BY3Rpb25zKFthY3Rpb25dKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgbm90LCB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlIG90aGVyIG1ldGhvZFxuICAgICAgbG9nLndhcm4oJ0RyaXZlciBkb2VzIG5vdCBzZWVtIHRvIGltcGxlbWVudCBXM0MgYWN0aW9ucywgZmFsbGluZyBiYWNrICcgK1xuICAgICAgICAgICAgICAgJ3RvIFRvdWNoQWN0aW9ucycpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSB3M2Mgc3RyYXRlZ3kgd2FzIG5vdCByZXF1ZXN0ZWQsIGRvIHRoZSBvbmx5IG90aGVyIG9wdGlvbiAobWpzb253cFxuICAgIC8vIHRvdWNoIGFjdGlvbnMpXG4gICAgbG9nLmluZm8oJ1dpbGwgdGFwIHVzaW5nIE1KU09OV1AgVG91Y2hBY3Rpb25zJyk7XG4gICAgY29uc3QgYWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAndGFwJyxcbiAgICAgIG9wdGlvbnM6IHt4LCB5fVxuICAgIH07XG5cbiAgICBpZiAoZHJpdmVyLnBlcmZvcm1Ub3VjaCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGRyaXZlci5wZXJmb3JtVG91Y2goW2FjdGlvbl0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBkaWQgbm90IGltcGxlbWVudCB0aGUgJ3BlcmZvcm1Ub3VjaCcgY29tbWFuZC4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAnRm9yIGRyaXZlcnMgdG8gc3VwcG9ydCBmaW5kaW5nIGltYWdlIGVsZW1lbnRzLCB0aGV5ICcgK1xuICAgICAgICAgICAgICAgICAgICBcInNob3VsZCBzdXBwb3J0ICdwZXJmb3JtVG91Y2gnIGFuZCAncGVyZm9ybUFjdGlvbnMnXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB2YXJpb3VzIEFwcGl1bSBjb21tYW5kcyB0aGF0IGludm9sdmUgYW4gaW1hZ2UgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VEcml2ZXJ9IGRyaXZlciAtIHRoZSBkcml2ZXIgdG8gdXNlIGZvciBjb21tYW5kc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kIC0gdGhlIG5hbWUgb2YgdGhlIGRyaXZlciBjb21tYW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbWdFbElkIC0gdGhlIGlkIG9mIHRoZSBJbWFnZUVsZW1lbnQgdG8gd29yayB3aXRoXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgLSBSZXN0IG9mIGFyZ3VtZW50cyBmb3IgZXhlY3V0ZVNjcmlwdHNcbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gLSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSBjb21tYW5kXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZXhlY3V0ZSAoZHJpdmVyLCBjbWQsIGltZ0VsSWQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWRyaXZlci5faW1nRWxDYWNoZS5oYXMoaW1nRWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1nRWwgPSBkcml2ZXIuX2ltZ0VsQ2FjaGUuZ2V0KGltZ0VsSWQpO1xuXG4gICAgc3dpdGNoIChjbWQpIHtcbiAgICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltZ0VsLmNsaWNrKGRyaXZlcik7XG4gICAgICBjYXNlICdlbGVtZW50RGlzcGxheWVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdnZXRTaXplJzpcbiAgICAgICAgcmV0dXJuIGltZ0VsLnNpemU7XG4gICAgICBjYXNlICdnZXRMb2NhdGlvbic6XG4gICAgICBjYXNlICdnZXRMb2NhdGlvbkluVmlldyc6XG4gICAgICAgIHJldHVybiBpbWdFbC5sb2NhdGlvbjtcbiAgICAgIGNhc2UgJ2dldEVsZW1lbnRSZWN0JzpcbiAgICAgICAgcmV0dXJuIGltZ0VsLnJlY3Q7XG4gICAgICBjYXNlICdnZXRBdHRyaWJ1dGUnOlxuICAgICAgICAvLyAvd2QvaHViL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvYXR0cmlidXRlLzpuYW1lXG4gICAgICAgIC8vIC93ZC9odWIvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnQvOmVsZW1lbnRJZC9hdHRyaWJ1dGUvdmlzdWFsIHNob3VsZCByZXR1biB0aGUgdmlzdWFsIGRhdGFcbiAgICAgICAgLy8gZS5nLiBbXCJjb250ZW50LWRlc2NcIixcImFwcGl1bS1pbWFnZS1lbGVtZW50LXh4eHh4XCIsXCJ4eHh4eFwiXSwgW1widmlzdWFsXCIsXCJhcHBpdW0taW1hZ2UtZWxlbWVudC14eHh4eFwiLFwieHh4eHhcIl1cbiAgICAgICAgaWYgKGFyZ3NbMF0gPT09ICd2aXN1YWwnKSB7XG4gICAgICAgICAgcmV0dXJuIGltZ0VsLm1hdGNoZWRJbWFnZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VJbWFnZUVsZW1lbnRDYWNoZSAobWF4ID0gTUFYX0NBQ0hFX1NJWkUpIHtcbiAgcmV0dXJuIG5ldyBMUlUoe1xuICAgIG1heCxcbiAgICBsZW5ndGg6IChlbCkgPT4gZWwudGVtcGxhdGUubGVuZ3RoLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW1nRWxGcm9tQXJncyAoYXJncykge1xuICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xuICAgIGlmIChfLmlzU3RyaW5nKGFyZykgJiYgYXJnLnN0YXJ0c1dpdGgoSU1BR0VfRUxFTUVOVF9QUkVGSVgpKSB7XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQge1xuICBJbWFnZUVsZW1lbnQsIGdldEltZ0VsRnJvbUFyZ3MsIG1ha2VJbWFnZUVsZW1lbnRDYWNoZSxcbiAgSU1BR0VfRUxfVEFQX1NUUkFURUdZX01KU09OV1AsIElNQUdFX0VMX1RBUF9TVFJBVEVHWV9XM0MsXG4gIERFRkFVTFRfVEVNUExBVEVfSU1BR0VfU0NBTEVcbn07XG4iXSwiZmlsZSI6ImxpYi9iYXNlZHJpdmVyL2ltYWdlLWVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==