UNPKG

geomancy

Version:
686 lines (607 loc) 51.5 kB
'use strict'; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getHouseMeanings = getHouseMeanings; exports.houseRange = houseRange; exports.slugify = slugify; exports.getFigureArray = getFigureArray; exports.House = exports.FigureDetails = exports.Figures = exports.Figure = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); require("source-map-support/register"); var R = require('ramda'); var houseMeanings = require('./data/houses').meanings; function getHouseMeanings() { return houseMeanings; } var COMPANY_DEMI_SIMPLE = [['carcer', 'tristitia', 'cauda-draconis'], ['acquisitio', 'laetitia', 'caput-draconis'], ['puer', 'rubeus', 'cauda-draconis'], ['fortuna-major', 'fortuna-minor'], ['amisso', 'puella', 'caput-draconis'], ['albus', 'conjunctio'], ['populus', 'via']]; var COMPANY_COMPOUND = [['puer', 'puella'], ['amisso', 'acquisitio'], ['albus', 'rubeus'], ['populus', 'via'], ['fortuna-major', 'fortuna-minor'], ['conjunctio', 'carcer'], ['tristitia', 'laetitia'], ['cauda-draconis', 'caput-draconis']]; /** * Forces `x` into the range 0-11 * @param {number} x input * @return {number} safe number */ function houseRange(x) { while (x < 0) { x = x + 12; } return x % 12; } /** * Converts a simple string into a slug for urls * @param {String} name to slugify * @return {String} slugified version */ function slugify(name) { return name.toLowerCase().replace(' ', '-'); } function zero1(flag) { return flag ? '1' : '0'; } function xor(a, b) { return !a != !b; } function padLeft(nr, n, str) { var binary = new Number(nr); binary = binary.toString(2); return Array(n - binary.length + 1).join(str || '0') + binary; } /** * Gets all Geomantic Figures, in binary order. * @return {Array<Figure>} All figrues */ function getFigureArray() { var rv = new Array(16); for (var i = 0; i < 16; i++) { rv[i] = Figure.byFlags(padLeft(i, 4, '0')); } return rv; } /** * A Geomantic Figure * * @param {String} flags element flags */ var Figure = /*#__PURE__*/ function () { function Figure(flags) { (0, _classCallCheck2["default"])(this, Figure); this.flags = flags; } /** * Gets one Figure by name. * * @param {String} name to find * @returns {Figure} named figure */ (0, _createClass2["default"])(Figure, [{ key: "getCompanyType", value: function getCompanyType(other) { if (this.equals(other)) { return 'simple'; } var me = this.slug; var them = other.slug; var company = null; COMPANY_DEMI_SIMPLE.forEach(function (figureSet) { if (figureSet.indexOf(me) > -1 && figureSet.indexOf(them) > -1) { company = 'demi-simple'; } }); if (company) return company; COMPANY_COMPOUND.forEach(function (figureSet) { if (figureSet.indexOf(me) > -1 && figureSet.indexOf(them) > -1) { company = 'compound'; } }); if (company) return company; if (this.fire === other.fire) { return 'capitular'; } return null; } }, { key: "getLine", value: function getLine(ix) { switch (ix) { case 0: return this.fire; case 1: return this.air; case 2: return this.water; case 3: return this.earth; default: throw new Error('IndexError'); } } }, { key: "getActivePoints", value: function getActivePoints() { var _this = this; return ['fire', 'air', 'water', 'earth'].reduce(function (points, element) { if (_this[element]) { return points + 1; } else { return points; } }, 0); } }, { key: "getPoints", value: function getPoints() { var _this2 = this; return ['fire', 'air', 'water', 'earth'].reduce(function (points, element) { if (_this2[element]) { return points + 1; } else { return points + 2; } }, 0); } }, { key: "getStrength", value: function getStrength(house) { var shouldBeStrong = 0; if (this.details.houses.strong === house) shouldBeStrong++;else if (this.details.houses.weak === house) shouldBeStrong--; return shouldBeStrong; } }, { key: "add", value: function add() { var sum = this; var flags; for (var _len = arguments.length, others = new Array(_len), _key = 0; _key < _len; _key++) { others[_key] = arguments[_key]; } others.forEach(function (other) { flags = zero1(xor(sum.earth, other.earth)) + zero1(xor(sum.water, other.water)) + zero1(xor(sum.air, other.air)) + zero1(xor(sum.fire, other.fire)); sum = Figure.byFlags(flags); }); return sum; } }, { key: "equals", value: function equals(other) { if (!(other && other instanceof Figure)) { return false; } return other.flags === this.flags; } }, { key: "toJSON", value: function toJSON() { return JSON.stringify(this.details); } }, { key: "toTextFigure", value: function toTextFigure() { var letter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '*'; var width = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '3'; var lineToText = function lineToText(element) { var work = element ? letter : "".concat(letter, " ").concat(letter); while (work.length < width) { work = work.length % 2 ? " ".concat(work) : "".concat(work, " "); } return work; }; return [lineToText(this.fire), lineToText(this.air), lineToText(this.water), lineToText(this.earth)].join('\n'); } }, { key: "details", get: function get() { if (!this._details) { var flags = this.flags; if (!FigureDetails.has(flags)) { throw new Error('No such figure with flags: ' + flags); } this._details = FigureDetails.get(flags); } return this._details; } }, { key: "flags", get: function get() { return zero1(this.earth) + zero1(this.water) + zero1(this.air) + zero1(this.fire); }, set: function set(raw) { var flags = raw + ''; if (flags.length < 4) { flags = '0'.repeat(4 - flags.length) + flags; } this._details = null; this.earth = flags[0] == '1'; this.water = flags[1] == '1'; this.air = flags[2] == '1'; this.fire = flags[3] == '1'; } }, { key: "name", get: function get() { return this.details.name; } }, { key: "number", get: function get() { return parseInt(this.flags, 10); } }, { key: "slug", get: function get() { return slugify(this.name); } }], [{ key: "byName", value: function byName(name) { var key = slugify(name); if (R.has(key, Figures)) { return Figures[key]; } throw new Error("Figure Not Found: ".concat(name)); } /** * Gets one Figure by its Flags. * * @param {String} flags element flags * @returns {Fgure} figure with flags */ }, { key: "byFlags", value: function byFlags(flags) { if (!FigureDetails.has(flags)) { throw new Error('Figure Not Found'); } return Figure.byName(FigureDetails.get(flags).name); } /** * Gets a Figure by elements. * * @param {Object<String, Boolean>} elements element dictionary * @returns {Figure} figure with specified flags. */ }, { key: "byElements", value: function byElements(elements) { var flags = zero1(elements.earth) + zero1(elements.water) + zero1(elements.air) + zero1(elements.fire); return Figure.byFlags(flags); } }]); return Figure; }(); exports.Figure = Figure; var Figures = {}; exports.Figures = Figures; var FigureDetails = new Map(); exports.FigureDetails = FigureDetails; function makeFigures(figures) { figures.forEach(function (details) { FigureDetails.set(details.flags, details); var figure = new Figure(details.flags); Figures[figure.slug] = figure; }); } // note that the houses are in zero-index order makeFigures([{ name: 'Puer', english: 'Boy', flags: '1011', houses: { strong: 0, weak: 6 } }, { name: 'Amisso', english: 'Loss', flags: '0101', houses: { strong: 1, weak: 7 } }, { name: 'Albus', english: 'White', flags: '0100', houses: { strong: 2, weak: 8 } }, { name: 'Populus', english: 'People', flags: '0000', houses: { strong: 3, weak: 9 } }, { name: 'Fortuna Major', english: 'Greater Fortune', flags: '1100', houses: { strong: 4, weak: 10 } }, { name: 'Conjunctio', english: 'Confunction', flags: '0110', houses: { strong: 5, weak: 11 } }, { name: 'Puella', english: 'Girl', flags: '1101', houses: { strong: 6, weak: 0 } }, { name: 'Rubeus', english: 'Red', flags: '0010', houses: { strong: 7, weak: 1 } }, { name: 'Acquisitio', english: 'Gain', flags: '1010', houses: { strong: 8, weak: 2 } }, { name: 'Carcer', english: 'Prison', flags: '1001', houses: { strong: 9, weak: 3 } }, { name: 'Tristitia', english: 'Sorrow', flags: '1000', houses: { strong: 10, weak: 4 } }, { name: 'Laetitia', english: 'Joy', flags: '0001', houses: { strong: 11, weak: 5 } }, { name: 'Cauda Draconis', english: 'Tail of the Dragon', flags: '0111', houses: { strong: 8, weak: 2 } }, { name: 'Caput Draconis', english: 'Head of the Dragon', flags: '1110', houses: { strong: 5, weak: 11 } }, { name: 'Fortuna Minor', english: 'Lesser Fortune', flags: '0011', houses: { strong: 4, weak: 10 } }, { name: 'Via', english: 'Way', flags: '1111', houses: { strong: 3, weak: 9 } }]); var House = /*#__PURE__*/ function () { function House(index, figure, querent, quesited) { (0, _classCallCheck2["default"])(this, House); this.index = index; this.figure = figure; this.querent = querent; this.quesited = quesited; this._meaning = index < 12 ? houseMeanings[index] : null; } (0, _createClass2["default"])(House, [{ key: "equals", value: function equals(other) { return other.index === this.index; } }, { key: "indexPlus", value: function indexPlus(delta) { return houseRange(this.index + delta); } /** * returns the companion house index. */ }, { key: "isTrineTo", value: function isTrineTo(other) { return this.trines.indexOf(other.index) > -1; } }, { key: "isSquareTo", value: function isSquareTo(other) { return this.squares.indexOf(other.index) > -1; } }, { key: "isSextileTo", value: function isSextileTo(other) { return this.sextiles.indexOf(other.index) > -1; } }, { key: "isOpposedTo", value: function isOpposedTo(other) { return this.opposition === other.index; } }, { key: "getCompanyType", value: function getCompanyType(other) { return this.figure.getCompanyType(other.figure); } /** * Gets the meaning of this house with its figure if any * @return {Object} with members "house" and "figure" */ }, { key: "getMeaning", value: function getMeaning() { var meaning = this._meaning; if (!meaning) { return { house: null, figure: null }; } var houseMeaning = meaning['Meaning']; if (meaning['Geo Meaning']) { houseMeaning = "".concat(houseMeaning, ", ").concat(meaning['Geo Meaning']); } var figureMeaning = ''; if (this.figure) { figureMeaning = meaning[this.figure.name]; } return { house: houseMeaning, figure: figureMeaning }; } }, { key: "hasFigure", value: function hasFigure(other) { if (other instanceof House) { other = other.figure; } if (!other) { return false; } return this.figure.equals(other); } }, { key: "isLessThan", value: function isLessThan(other) { var quesited = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; if (quesited instanceof House) { quesited = house.index; } if (other instanceof House) { other = other.index; } other = other - quesited; return this.index < other; } /** * returns whether 'other' is sinister to this House * @param {House|Number} other House or index of it * @returns {Boolean} true if this one is sinister to other one */ }, { key: "isSinisterOf", value: function isSinisterOf(other) { if (other instanceof House) { other = other.index; } var range = []; for (var i = 1; i < 6; i++) { range.push(this.indexPlus(i)); } return range.indexOf(other) > -1; } /** * returns whether 'other' is dexter to this House * @param {House|Number} other House or index of it * @returns {Boolean} true if this one is dexter to other one */ }, { key: "isDexterOf", value: function isDexterOf(other) { if (other instanceof House) { other = other.index; } return other !== this.index && other !== this.indexPlus(6) && !this.isSinisterOf(other); } }, { key: "getNeighbors", value: function getNeighbors(houses) { return [houses[houseRange(this.index - 1)], houses[houseRange(this.index + 1)]]; } }, { key: "isNextTo", value: function isNextTo(other) { if (other instanceof House) { other = other.index; } else { other = houseRange(other); } return other === houseRange(this.index - 1) || other === houseRange(this.index + 1); } }, { key: "companion", get: function get() { var isEven = this.index % 2 === 0; return this.indexPlus(isEven ? 1 : -1); } }, { key: "trines", get: function get() { return [this.indexPlus(4), this.indexPlus(8)]; } }, { key: "squares", get: function get() { return [this.indexPlus(3), this.indexPlus(-3)]; } }, { key: "sextiles", get: function get() { return [this.indexPlus(2), this.indexPlus(-2)]; } }, { key: "opposition", get: function get() { return this.indexPlus(6); } }, { key: "parents", get: function get() { if (this.index < 8) { return []; } return [(this.index - 8) * 2, (this.index - 8) * 2 + 1]; } }, { key: "strength", get: function get() { if (!this.figure) { return false; } return this.figure.getStrength(this.index); } }]); return House; }(); exports.House = House; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9tb2RlbHMuanMiXSwibmFtZXMiOlsiUiIsInJlcXVpcmUiLCJob3VzZU1lYW5pbmdzIiwibWVhbmluZ3MiLCJnZXRIb3VzZU1lYW5pbmdzIiwiQ09NUEFOWV9ERU1JX1NJTVBMRSIsIkNPTVBBTllfQ09NUE9VTkQiLCJob3VzZVJhbmdlIiwieCIsInNsdWdpZnkiLCJuYW1lIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiemVybzEiLCJmbGFnIiwieG9yIiwiYSIsImIiLCJwYWRMZWZ0IiwibnIiLCJuIiwic3RyIiwiYmluYXJ5IiwiTnVtYmVyIiwidG9TdHJpbmciLCJBcnJheSIsImxlbmd0aCIsImpvaW4iLCJnZXRGaWd1cmVBcnJheSIsInJ2IiwiaSIsIkZpZ3VyZSIsImJ5RmxhZ3MiLCJmbGFncyIsIm90aGVyIiwiZXF1YWxzIiwibWUiLCJzbHVnIiwidGhlbSIsImNvbXBhbnkiLCJmb3JFYWNoIiwiZmlndXJlU2V0IiwiaW5kZXhPZiIsImZpcmUiLCJpeCIsImFpciIsIndhdGVyIiwiZWFydGgiLCJFcnJvciIsInJlZHVjZSIsInBvaW50cyIsImVsZW1lbnQiLCJob3VzZSIsInNob3VsZEJlU3Ryb25nIiwiZGV0YWlscyIsImhvdXNlcyIsInN0cm9uZyIsIndlYWsiLCJzdW0iLCJvdGhlcnMiLCJKU09OIiwic3RyaW5naWZ5IiwibGV0dGVyIiwid2lkdGgiLCJsaW5lVG9UZXh0Iiwid29yayIsIl9kZXRhaWxzIiwiRmlndXJlRGV0YWlscyIsImhhcyIsImdldCIsInJhdyIsInJlcGVhdCIsInBhcnNlSW50Iiwia2V5IiwiRmlndXJlcyIsImJ5TmFtZSIsImVsZW1lbnRzIiwiTWFwIiwibWFrZUZpZ3VyZXMiLCJmaWd1cmVzIiwic2V0IiwiZmlndXJlIiwiZW5nbGlzaCIsIkhvdXNlIiwiaW5kZXgiLCJxdWVyZW50IiwicXVlc2l0ZWQiLCJfbWVhbmluZyIsImRlbHRhIiwidHJpbmVzIiwic3F1YXJlcyIsInNleHRpbGVzIiwib3Bwb3NpdGlvbiIsImdldENvbXBhbnlUeXBlIiwibWVhbmluZyIsImhvdXNlTWVhbmluZyIsImZpZ3VyZU1lYW5pbmciLCJyYW5nZSIsInB1c2giLCJpbmRleFBsdXMiLCJpc1NpbmlzdGVyT2YiLCJpc0V2ZW4iLCJnZXRTdHJlbmd0aCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFNQSxDQUFDLEdBQUdDLE9BQU8sQ0FBQyxPQUFELENBQWpCOztBQUNBLElBQU1DLGFBQWEsR0FBR0QsT0FBTyxDQUFDLGVBQUQsQ0FBUCxDQUF5QkUsUUFBL0M7O0FBRU8sU0FBU0MsZ0JBQVQsR0FBNEI7QUFDakMsU0FBT0YsYUFBUDtBQUNEOztBQUVELElBQU1HLG1CQUFtQixHQUFHLENBQ3hCLENBQUMsUUFBRCxFQUFXLFdBQVgsRUFBd0IsZ0JBQXhCLENBRHdCLEVBRXhCLENBQUMsWUFBRCxFQUFlLFVBQWYsRUFBMkIsZ0JBQTNCLENBRndCLEVBR3hCLENBQUMsTUFBRCxFQUFTLFFBQVQsRUFBbUIsZ0JBQW5CLENBSHdCLEVBSXhCLENBQUMsZUFBRCxFQUFrQixlQUFsQixDQUp3QixFQUt4QixDQUFDLFFBQUQsRUFBVyxRQUFYLEVBQXFCLGdCQUFyQixDQUx3QixFQU14QixDQUFDLE9BQUQsRUFBVSxZQUFWLENBTndCLEVBT3hCLENBQUMsU0FBRCxFQUFZLEtBQVosQ0FQd0IsQ0FBNUI7QUFVQSxJQUFNQyxnQkFBZ0IsR0FBRyxDQUN2QixDQUFDLE1BQUQsRUFBUyxRQUFULENBRHVCLEVBRXZCLENBQUMsUUFBRCxFQUFXLFlBQVgsQ0FGdUIsRUFHdkIsQ0FBQyxPQUFELEVBQVUsUUFBVixDQUh1QixFQUl2QixDQUFDLFNBQUQsRUFBWSxLQUFaLENBSnVCLEVBS3ZCLENBQUMsZUFBRCxFQUFrQixlQUFsQixDQUx1QixFQU12QixDQUFDLFlBQUQsRUFBZSxRQUFmLENBTnVCLEVBT3ZCLENBQUMsV0FBRCxFQUFjLFVBQWQsQ0FQdUIsRUFRdkIsQ0FBQyxnQkFBRCxFQUFtQixnQkFBbkIsQ0FS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OztBQUNELGFBQU8sQ0FBQyxDQUFDLEtBQUtBLEtBQUwsR0FBYSxDQUFkLElBQW1CLENBQXBCLEVBQXVCLENBQUMsS0FBS0EsS0FBTCxHQUFhLENBQWQsSUFBbUIsQ0FBbkIsR0FBdUIsQ0FBOUMsQ0FBUDtBQUNEOzs7d0JBaUZlO0FBQ2QsVUFBSSxDQUFDLEtBQUtILE1BQVYsRUFBa0I7QUFDaEIsZUFBTyxLQUFQO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFLQSxNQUFMLENBQVlxQixXQUFaLENBQXdCLEtBQUtsQixLQUE3QixDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5jb25zdCBSID0gcmVxdWlyZSgncmFtZGEnKTtcbmNvbnN0IGhvdXNlTWVhbmluZ3MgPSByZXF1aXJlKCcuL2RhdGEvaG91c2VzJykubWVhbmluZ3M7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb3VzZU1lYW5pbmdzKCkge1xuICByZXR1cm4gaG91c2VNZWFuaW5ncztcbn1cblxuY29uc3QgQ09NUEFOWV9ERU1JX1NJTVBMRSA9IFtcbiAgICBbJ2NhcmNlcicsICd0cmlzdGl0aWEnLCAnY2F1ZGEtZHJhY29uaXMnXSxcbiAgICBbJ2FjcXVpc2l0aW8nLCAnbGFldGl0aWEnLCAnY2FwdXQtZHJhY29uaXMnXSxcbiAgICBbJ3B1ZXInLCAncnViZXVzJywgJ2NhdWRhLWRyYWNvbmlzJ10sXG4gICAgWydmb3J0dW5hLW1ham9yJywgJ2ZvcnR1bmEtbWlub3InXSxcbiAgICBbJ2FtaXNzbycsICdwdWVsbGEnLCAnY2FwdXQtZHJhY29uaXMnXSxcbiAgICBbJ2FsYnVzJywgJ2Nvbmp1bmN0aW8nXSxcbiAgICBbJ3BvcHVsdXMnLCAndmlhJ11cbl07XG5cbmNvbnN0IENPTVBBTllfQ09NUE9VTkQgPSBbXG4gIFsncHVlcicsICdwdWVsbGEnXSxcbiAgWydhbWlzc28nLCAnYWNxdWlzaXRpbyddLFxuICBbJ2FsYnVzJywgJ3J1YmV1cyddLFxuICBbJ3BvcHVsdXMnLCAndmlhJ10sXG4gIFsnZm9ydHVuYS1tYWpvcicsICdmb3J0dW5hLW1pbm9yJ10sXG4gIFsnY29uanVuY3RpbycsICdjYXJjZXInXSxcbiAgWyd0cmlzdGl0aWEnLCAnbGFldGl0aWEnXSxcbiAgWydjYXVkYS1kcmFjb25pcycsICdjYXB1dC1kcmFjb25pcyddXG5dO1xuXG4vKipcbiAqIEZvcmNlcyBgeGAgaW50byB0aGUgcmFuZ2UgMC0xMVxuICogQHBhcmFtICB7bnVtYmVyfSB4IGlucHV0XG4gKiBAcmV0dXJuIHtudW1iZXJ9IHNhZmUgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob3VzZVJhbmdlICh4KSB7XG4gIHdoaWxlICh4IDwgMCkgeyB4ID0geCArIDEyOyB9XG4gIHJldHVybiB4ICUgMTI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzaW1wbGUgc3RyaW5nIGludG8gYSBzbHVnIGZvciB1cmxzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgdG8gc2x1Z2lmeVxuICogQHJldHVybiB7U3RyaW5nfSBzbHVnaWZpZWQgdmVyc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2x1Z2lmeSAobmFtZSkge1xuICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJyAnLCAnLScpO1xufVxuXG5mdW5jdGlvbiB6ZXJvMSAoZmxhZykge1xuICByZXR1cm4gZmxhZyA/ICcxJyA6ICcwJztcbn1cblxuZnVuY3Rpb24geG9yIChhLCBiKSB7XG4gIHJldHVybiAhYSAhPSAhYjtcbn1cblxuZnVuY3Rpb24gcGFkTGVmdChuciwgbiwgc3RyKXtcbiAgdmFyIGJpbmFyeSA9IG5ldyBOdW1iZXIobnIpO1xuICBiaW5hcnkgPSBiaW5hcnkudG9TdHJpbmcoMik7XG4gIHJldHVybiBBcnJheShuLWJpbmFyeS5sZW5ndGgrMSkuam9pbihzdHJ8fCcwJykrYmluYXJ5O1xufVxuXG4vKipcbiAqIEdldHMgYWxsIEdlb21hbnRpYyBGaWd1cmVzLCBpbiBiaW5hcnkgb3JkZXIuXG4gKiBAcmV0dXJuIHtBcnJheTxGaWd1cmU+fSBBbGwgZmlncnVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlndXJlQXJyYXkoKSB7XG4gICAgbGV0IHJ2ID0gbmV3IEFycmF5KDE2KTtcbiAgICBmb3IgKGxldCBpPTA7IGk8MTY7IGkrKykge1xuICAgICAgcnZbaV0gPSBGaWd1cmUuYnlGbGFncyhwYWRMZWZ0KGksIDQsICcwJykpO1xuICAgIH1cbiAgICByZXR1cm4gcnY7XG59XG5cbi8qKlxuICogQSBHZW9tYW50aWMgRmlndXJlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZsYWdzIGVsZW1lbnQgZmxhZ3NcbiAqL1xuZXhwb3J0IGNsYXNzIEZpZ3VyZSB7XG4gIGNvbnN0cnVjdG9yIChmbGFncykge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9uZSBGaWd1cmUgYnkgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RmlndXJlfSBuYW1lZCBmaWd1cmVcbiAgICovXG4gIHN0YXRpYyBieU5hbWUgKG5hbWUpIHtcbiAgICBjb25zdCBrZXkgPSBzbHVnaWZ5KG5hbWUpO1xuICAgIGlmIChSLmhhcyhrZXksIEZpZ3VyZXMpKSB7XG4gICAgICByZXR1cm4gRmlndXJlc1trZXldO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpZ3VyZSBOb3QgRm91bmQ6ICR7bmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9uZSBGaWd1cmUgYnkgaXRzIEZsYWdzLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZmxhZ3MgZWxlbWVudCBmbGFnc1xuICAgKiBAcmV0dXJucyB7Rmd1cmV9IGZpZ3VyZSB3aXRoIGZsYWdzXG4gICAqL1xuICBzdGF0aWMgYnlGbGFncyAoZmxhZ3MpIHtcbiAgICBpZiAoIUZpZ3VyZURldGFpbHMuaGFzKGZsYWdzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWd1cmUgTm90IEZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiBGaWd1cmUuYnlOYW1lKEZpZ3VyZURldGFpbHMuZ2V0KGZsYWdzKS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgRmlndXJlIGJ5IGVsZW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdDxTdHJpbmcsIEJvb2xlYW4+fSBlbGVtZW50cyBlbGVtZW50IGRpY3Rpb25hcnlcbiAgICogQHJldHVybnMge0ZpZ3VyZX0gZmlndXJlIHdpdGggc3BlY2lmaWVkIGZsYWdzLlxuICAgKi9cbiAgc3RhdGljIGJ5RWxlbWVudHMgKGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZmxhZ3MgPSAoXG4gICAgemVybzEoZWxlbWVudHMuZWFydGgpXG4gICAgKyB6ZXJvMShlbGVtZW50cy53YXRlcilcbiAgICArIHplcm8xKGVsZW1lbnRzLmFpcilcbiAgICArIHplcm8xKGVsZW1lbnRzLmZpcmUpXG4gICAgKTtcblxuICAgIHJldHVybiBGaWd1cmUuYnlGbGFncyhmbGFncyk7XG4gIH1cblxuICBnZXQgZGV0YWlscyAoKSB7XG4gICAgaWYgKCF0aGlzLl9kZXRhaWxzKSB7XG4gICAgICBjb25zdCBmbGFncyA9IHRoaXMuZmxhZ3M7XG4gICAgICBpZiAoIUZpZ3VyZURldGFpbHMuaGFzKGZsYWdzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1Y2ggZmlndXJlIHdpdGggZmxhZ3M6ICcgKyBmbGFncyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9kZXRhaWxzID0gRmlndXJlRGV0YWlscy5nZXQoZmxhZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGV0YWlscztcbiAgfVxuXG4gIGdldCBmbGFncyAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHplcm8xKHRoaXMuZWFydGgpXG4gICAgICArIHplcm8xKHRoaXMud2F0ZXIpXG4gICAgICArIHplcm8xKHRoaXMuYWlyKVxuICAgICAgKyB6ZXJvMSh0aGlzLmZpcmUpXG4gICAgKTtcbiAgfVxuXG4gIHNldCBmbGFncyAocmF3KSB7XG4gICAgbGV0IGZsYWdzID0gcmF3ICsgJyc7XG4gICAgaWYgKGZsYWdzLmxlbmd0aCA8IDQpIHtcbiAgICAgIGZsYWdzID0gJzAnLnJlcGVhdCg0IC0gZmxhZ3MubGVuZ3RoKSArIGZsYWdzO1xuICAgIH1cbiAgICB0aGlzLl9kZXRhaWxzID0gbnVsbDtcbiAgICB0aGlzLmVhcnRoID0gZmxhZ3NbMF0gPT0gJzEnO1xuICAgIHRoaXMud2F0ZXIgPSBmbGFnc1sxXSA9PSAnMSc7XG4gICAgdGhpcy5haXIgPSBmbGFnc1syXSA9PSAnMSc7XG4gICAgdGhpcy5maXJlID0gZmxhZ3NbM10gPT0gJzEnO1xuICB9XG5cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLmRldGFpbHMubmFtZTtcbiAgfVxuXG4gIGdldCBudW1iZXIgKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLmZsYWdzLCAxMCk7XG4gIH1cblxuICBnZXRDb21wYW55VHlwZSAob3RoZXIpIHtcbiAgICBpZiAodGhpcy5lcXVhbHMob3RoZXIpKSB7XG4gICAgICByZXR1cm4gJ3NpbXBsZSc7XG4gICAgfVxuXG4gICAgY29uc3QgbWUgPSB0aGlzLnNsdWc7XG4gICAgY29uc3QgdGhlbSA9IG90aGVyLnNsdWc7XG4gICAgbGV0IGNvbXBhbnkgPSBudWxsO1xuXG4gICAgQ09NUEFOWV9ERU1JX1NJTVBMRS5mb3JFYWNoKGZpZ3VyZVNldCA9PiB7XG4gICAgICBpZiAoZmlndXJlU2V0LmluZGV4T2YobWUpID4gLTEgJiYgZmlndXJlU2V0LmluZGV4T2YodGhlbSkgPiAtMSkge1xuICAgICAgICBjb21wYW55ID0gJ2RlbWktc2ltcGxlJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjb21wYW55KSByZXR1cm4gY29tcGFueTtcblxuICAgIENPTVBBTllfQ09NUE9VTkQuZm9yRWFjaChmaWd1cmVTZXQgPT4ge1xuICAgICAgaWYgKGZpZ3VyZVNldC5pbmRleE9mKG1lKSA+IC0xICYmIGZpZ3VyZVNldC5pbmRleE9mKHRoZW0pID4gLTEpIHtcbiAgICAgICAgY29tcGFueSA9ICdjb21wb3VuZCc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoY29tcGFueSkgcmV0dXJuIGNvbXBhbnk7XG5cbiAgICBpZiAodGhpcy5maXJlID09PSBvdGhlci5maXJlKSB7XG4gICAgICByZXR1cm4gJ2NhcGl0dWxhcic7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRMaW5lIChpeCkge1xuICAgIHN3aXRjaCAoaXgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyZTtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRoaXMuYWlyO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gdGhpcy53YXRlcjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFydGg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luZGV4RXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmVQb2ludHMgKCkge1xuICAgIHJldHVybiBbJ2ZpcmUnLCAnYWlyJywgJ3dhdGVyJywgJ2VhcnRoJ10ucmVkdWNlKChwb2ludHMsIGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0aGlzW2VsZW1lbnRdKSB7XG4gICAgICAgIHJldHVybiBwb2ludHMgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldFBvaW50cyAoKSB7XG4gICAgcmV0dXJuIFsnZmlyZScsICdhaXInLCAnd2F0ZXInLCAnZWFydGgnXS5yZWR1Y2UoKHBvaW50cywgZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKHRoaXNbZWxlbWVudF0pIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cyArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcG9pbnRzICsgMjtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldFN0cmVuZ3RoIChob3VzZSkge1xuICAgIGxldCBzaG91bGRCZVN0cm9uZyA9IDA7XG4gICAgaWYgKHRoaXMuZGV0YWlscy5ob3VzZXMuc3Ryb25nID09PSBob3VzZSkgc2hvdWxkQmVTdHJvbmcrKztcbiAgICBlbHNlIGlmICh0aGlzLmRldGFpbHMuaG91c2VzLndlYWsgPT09IGhvdXNlKSBzaG91bGRCZVN0cm9uZy0tO1xuICAgIHJldHVybiBzaG91bGRCZVN0cm9uZztcbiAgfVxuXG4gIGFkZCAoLi4ub3RoZXJzKSB7XG4gICAgbGV0IHN1bSA9IHRoaXM7XG4gICAgbGV0IGZsYWdzO1xuICAgIG90aGVycy5mb3JFYWNoKG90aGVyID0+IHtcbiAgICAgIGZsYWdzID0gKFxuICAgICAgICB6ZXJvMSh4b3Ioc3VtLmVhcnRoLCBvdGhlci5lYXJ0aCkpICtcbiAgICAgICAgemVybzEoeG9yKHN1bS53YXRlciwgb3RoZXIud2F0ZXIpKSArXG4gICAgICAgIHplcm8xKHhvcihzdW0uYWlyLCBvdGhlci5haXIpKSArXG4gICAgICAgIHplcm8xKHhvcihzdW0uZmlyZSwgb3RoZXIuZmlyZSkpXG4gICAgICApO1xuICAgICAgc3VtID0gRmlndXJlLmJ5RmxhZ3MoZmxhZ3MpO1xuICAgIH0pO1xuICAgIHJldHVybiBzdW07XG4gIH1cblxuICBlcXVhbHMgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgJiYgb3RoZXIgaW5zdGFuY2VvZiBGaWd1cmUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvdGhlci5mbGFncyA9PT0gdGhpcy5mbGFncztcbiAgfVxuXG4gIGdldCBzbHVnICgpIHtcbiAgICByZXR1cm4gc2x1Z2lmeSh0aGlzLm5hbWUpO1xuICB9XG5cbiAgdG9KU09OICgpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5kZXRhaWxzKTtcbiAgfVxuXG4gIHRvVGV4dEZpZ3VyZSAobGV0dGVyID0gJyonLCB3aWR0aCA9ICczJykge1xuICAgIGNvbnN0IGxpbmVUb1RleHQgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgbGV0IHdvcmsgPSBlbGVtZW50ID8gbGV0dGVyIDogYCR7bGV0dGVyfSAke2xldHRlcn1gO1xuICAgICAgd2hpbGUgKHdvcmsubGVuZ3RoIDwgd2lkdGgpIHtcbiAgICAgICAgd29yayA9ICh3b3JrLmxlbmd0aCAlIDIpID8gYCAke3dvcmt9YCA6IGAke3dvcmt9IGA7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29yaztcbiAgICB9O1xuICAgIHJldHVybiBbXG4gICAgICBsaW5lVG9UZXh0KHRoaXMuZmlyZSksXG4gICAgICBsaW5lVG9UZXh0KHRoaXMuYWlyKSxcbiAgICAgIGxpbmVUb1RleHQodGhpcy53YXRlciksXG4gICAgICBsaW5lVG9UZXh0KHRoaXMuZWFydGgpXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmlndXJlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgRmlndXJlRGV0YWlscyA9IG5ldyBNYXAoKTtcblxuZnVuY3Rpb24gbWFrZUZpZ3VyZXMgKGZpZ3VyZXMpIHtcbiAgZmlndXJlcy5mb3JFYWNoKGRldGFpbHMgPT4ge1xuICAgIEZpZ3VyZURldGFpbHMuc2V0KGRldGFpbHMuZmxhZ3MsIGRldGFpbHMpO1xuICAgIGNvbnN0IGZpZ3VyZSA9IG5ldyBGaWd1cmUoZGV0YWlscy5mbGFncyk7XG4gICAgRmlndXJlc1tmaWd1cmUuc2x1Z10gPSBmaWd1cmU7XG4gIH0pO1xufVxuXG4vLyBub3RlIHRoYXQgdGhlIGhvdXNlcyBhcmUgaW4gemVyby1pbmRleCBvcmRlclxubWFrZUZpZ3VyZXMoW1xuICB7XG4gICAgbmFtZTogJ1B1ZXInLFxuICAgIGVuZ2xpc2g6ICdCb3knLFxuICAgIGZsYWdzOiAnMTAxMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAwLCB3ZWFrOiA2fVxuICB9LCB7XG4gICAgbmFtZTogJ0FtaXNzbycsXG4gICAgZW5nbGlzaDogJ0xvc3MnLFxuICAgIGZsYWdzOiAnMDEwMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAxLCB3ZWFrOiA3fVxuICB9LCB7XG4gICAgbmFtZTogJ0FsYnVzJyxcbiAgICBlbmdsaXNoOiAnV2hpdGUnLFxuICAgIGZsYWdzOiAnMDEwMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAyLCB3ZWFrOiA4fVxuICB9LCB7XG4gICAgbmFtZTogJ1BvcHVsdXMnLFxuICAgIGVuZ2xpc2g6ICdQZW9wbGUnLFxuICAgIGZsYWdzOiAnMDAwMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiAzLCB3ZWFrOiA5fVxuICB9LCB7XG4gICAgbmFtZTogJ0ZvcnR1bmEgTWFqb3InLFxuICAgIGVuZ2xpc2g6ICdHcmVhdGVyIEZvcnR1bmUnLFxuICAgIGZsYWdzOiAnMTEwMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA0LCB3ZWFrOiAxMH1cbiAgfSwge1xuICAgIG5hbWU6ICdDb25qdW5jdGlvJyxcbiAgICBlbmdsaXNoOiAnQ29uZnVuY3Rpb24nLFxuICAgIGZsYWdzOiAnMDExMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA1LCB3ZWFrOiAxMX1cbiAgfSwge1xuICAgIG5hbWU6ICdQdWVsbGEnLFxuICAgIGVuZ2xpc2g6ICdHaXJsJyxcbiAgICBmbGFnczogJzExMDEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogNiwgd2VhazogMH1cbiAgfSwge1xuICAgIG5hbWU6ICdSdWJldXMnLFxuICAgIGVuZ2xpc2g6ICdSZWQnLFxuICAgIGZsYWdzOiAnMDAxMCcsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA3LCB3ZWFrOiAxfVxuICB9LCB7XG4gICAgbmFtZTogJ0FjcXVpc2l0aW8nLFxuICAgIGVuZ2xpc2g6ICdHYWluJyxcbiAgICBmbGFnczogJzEwMTAnLFxuICAgIGhvdXNlczoge3N0cm9uZzogOCwgd2VhazogMn1cbiAgfSwge1xuICAgIG5hbWU6ICdDYXJjZXInLFxuICAgIGVuZ2xpc2g6ICdQcmlzb24nLFxuICAgIGZsYWdzOiAnMTAwMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA5LCB3ZWFrOiAzfVxuICB9LCB7XG4gICAgbmFtZTogJ1RyaXN0aXRpYScsXG4gICAgZW5nbGlzaDogJ1NvcnJvdycsXG4gICAgZmxhZ3M6ICcxMDAwJyxcbiAgICBob3VzZXM6IHtzdHJvbmc6IDEwLCB3ZWFrOiA0fVxuICB9LCB7XG4gICAgbmFtZTogJ0xhZXRpdGlhJyxcbiAgICBlbmdsaXNoOiAnSm95JyxcbiAgICBmbGFnczogJzAwMDEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogMTEsIHdlYWs6IDV9XG4gIH0sIHtcbiAgICBuYW1lOiAnQ2F1ZGEgRHJhY29uaXMnLFxuICAgIGVuZ2xpc2g6ICdUYWlsIG9mIHRoZSBEcmFnb24nLFxuICAgIGZsYWdzOiAnMDExMScsXG4gICAgaG91c2VzOiB7c3Ryb25nOiA4LCB3ZWFrOiAyfVxuICB9LCB7XG4gICAgbmFtZTogJ0NhcHV0IERyYWNvbmlzJyxcbiAgICBlbmdsaXNoOiAnSGVhZCBvZiB0aGUgRHJhZ29uJyxcbiAgICBmbGFnczogJzExMTAnLFxuICAgIGhvdXNlczoge3N0cm9uZzogNSwgd2VhazogMTF9XG4gIH0sIHtcbiAgICBuYW1lOiAnRm9ydHVuYSBNaW5vcicsXG4gICAgZW5nbGlzaDogJ0xlc3NlciBGb3J0dW5lJyxcbiAgICBmbGFnczogJzAwMTEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogNCwgd2VhazogMTB9XG4gIH0sIHtcbiAgICBuYW1lOiAnVmlhJyxcbiAgICBlbmdsaXNoOiAnV2F5JyxcbiAgICBmbGFnczogJzExMTEnLFxuICAgIGhvdXNlczoge3N0cm9uZzogMywgd2VhazogOX1cbiAgfVxuXSk7XG5cbmV4cG9ydCBjbGFzcyBIb3VzZSB7XG4gIGNvbnN0cnVjdG9yIChpbmRleCwgZmlndXJlLCBxdWVyZW50LCBxdWVzaXRlZCkge1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZpZ3VyZSA9IGZpZ3VyZTtcbiAgICB0aGlzLnF1ZXJlbnQgPSBxdWVyZW50O1xuICAgIHRoaXMucXVlc2l0ZWQgPSBxdWVzaXRlZDtcbiAgICB0aGlzLl9tZWFuaW5nID0gaW5kZXggPCAxMiA/IGhvdXNlTWVhbmluZ3NbaW5kZXhdIDogbnVsbDtcbiAgfVxuXG4gIGVxdWFscyAob3RoZXIpIHtcbiAgICByZXR1cm4gb3RoZXIuaW5kZXggPT09IHRoaXMuaW5kZXg7XG4gIH1cblxuICBpbmRleFBsdXMgKGRlbHRhKSB7XG4gICAgcmV0dXJuIGhvdXNlUmFuZ2UodGhpcy5pbmRleCArIGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSBjb21wYW5pb24gaG91c2UgaW5kZXguXG4gICAqL1xuICBnZXQgY29tcGFuaW9uICgpIHtcbiAgICBjb25zdCBpc0V2ZW4gPSB0aGlzLmluZGV4ICUgMiA9PT0gMDtcbiAgICByZXR1cm4gdGhpcy5pbmRleFBsdXMoaXNFdmVuID8gMSA6IC0xKTtcbiAgfVxuXG4gIGdldCB0cmluZXMgKCkge1xuICAgIHJldHVybiBbdGhpcy5pbmRleFBsdXMoNCksIHRoaXMuaW5kZXhQbHVzKDgpXTtcbiAgfVxuXG4gIGlzVHJpbmVUbyAob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy50cmluZXMuaW5kZXhPZihvdGhlci5pbmRleCkgPiAtMTtcbiAgfVxuXG4gIGdldCBzcXVhcmVzICgpIHtcbiAgICByZXR1cm4gW3RoaXMuaW5kZXhQbHVzKDMpLCB0aGlzLmluZGV4UGx1cygtMyldO1xuICB9XG5cbiAgaXNTcXVhcmVUbyAob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5zcXVhcmVzLmluZGV4T2Yob3RoZXIuaW5kZXgpID4gLTE7XG4gIH1cblxuICBnZXQgc2V4dGlsZXMgKCkge1xuICAgIHJldHVybiBbdGhpcy5pbmRleFBsdXMoMiksIHRoaXMuaW5kZXhQbHVzKC0yKV07XG4gIH1cblxuICBpc1NleHRpbGVUbyAob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5zZXh0aWxlcy5pbmRleE9mKG90aGVyLmluZGV4KSA+IC0xO1xuICB9XG5cbiAgZ2V0IG9wcG9zaXRpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4UGx1cyg2KTtcbiAgfVxuXG4gIGlzT3Bwb3NlZFRvIChvdGhlcikge1xuICAgIHJldHVybiB0aGlzLm9wcG9zaXRpb24gPT09IG90aGVyLmluZGV4O1xuICB9XG5cbiAgZ2V0IHBhcmVudHMgKCkge1xuICAgIGlmICh0aGlzLmluZGV4IDwgOCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gWyh0aGlzLmluZGV4IC0gOCkgKiAyLCAodGhpcy5pbmRleCAtIDgpICogMiArIDFdO1xuICB9XG5cbiAgZ2V0Q29tcGFueVR5cGUgKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlndXJlLmdldENvbXBhbnlUeXBlKG90aGVyLmZpZ3VyZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWVhbmluZyBvZiB0aGlzIGhvdXNlIHdpdGggaXRzIGZpZ3VyZSBpZiBhbnlcbiAgICogQHJldHVybiB7T2JqZWN0fSB3aXRoIG1lbWJlcnMgXCJob3VzZVwiIGFuZCBcImZpZ3VyZVwiXG4gICAqL1xuICBnZXRNZWFuaW5nICgpIHtcbiAgICBjb25zdCBtZWFuaW5nID0gdGhpcy5fbWVhbmluZztcbiAgICBpZiAoIW1lYW5pbmcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhvdXNlOiBudWxsLFxuICAgICAgICBmaWd1cmU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBob3VzZU1lYW5pbmcgPSBtZWFuaW5nWydNZWFuaW5nJ107XG4gICAgaWYgKG1lYW5pbmdbJ0dlbyBNZWFuaW5nJ10pIHtcbiAgICAgIGhvdXNlTWVhbmluZyA9IGAke2hvdXNlTWVhbmluZ30sICR7bWVhbmluZ1snR2VvIE1lYW5pbmcnXX1gO1xuICAgIH1cbiAgICBsZXQgZmlndXJlTWVhbmluZyA9ICcnO1xuICAgIGlmICh0aGlzLmZpZ3VyZSkge1xuICAgICAgZmlndXJlTWVhbmluZyA9IG1lYW5pbmdbdGhpcy5maWd1cmUubmFtZV07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBob3VzZTogaG91c2VNZWFuaW5nLFxuICAgICAgZmlndXJlOiBmaWd1cmVNZWFuaW5nXG4gICAgfTtcbiAgfVxuXG4gIGhhc0ZpZ3VyZSAob3RoZXIpIHtcbiAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBIb3VzZSkge1xuICAgICAgb3RoZXIgPSBvdGhlci5maWd1cmU7XG4gICAgfVxuICAgIGlmICghb3RoZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlndXJlLmVxdWFscyhvdGhlcik7XG4gIH1cblxuICBpc0xlc3NUaGFuIChvdGhlciwgcXVlc2l0ZWQgPSAwKSB7XG4gICAgaWYgKHF1ZXNpdGVkIGluc3RhbmNlb2YgSG91c2UpIHtcbiAgICAgIHF1ZXNpdGVkID0gaG91c2UuaW5kZXg7XG4gICAgfVxuICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEhvdXNlKSB7XG4gICAgICBvdGhlciA9IG90aGVyLmluZGV4O1xuICAgIH1cbiAgICBvdGhlciA9IG90aGVyIC0gcXVlc2l0ZWQ7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXggPCBvdGhlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHdoZXRoZXIgJ290aGVyJyBpcyBzaW5pc3RlciB0byB0aGlzIEhvdXNlXG4gICAqIEBwYXJhbSB7SG91c2V8TnVtYmVyfSBvdGhlciBIb3VzZSBvciBpbmRleCBvZiBpdFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIG9uZSBpcyBzaW5pc3RlciB0byBvdGhlciBvbmVcbiAgICovXG4gIGlzU2luaXN0ZXJPZiAob3RoZXIpIHtcbiAgICBpZiAob3Ro