docx4js
Version:
javascript docx parser
393 lines (352 loc) • 50.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _officeDocument = require("../officeDocument");
var _officeDocument2 = _interopRequireDefault(_officeDocument);
var _part = require("../part");
var _part2 = _interopRequireDefault(_part);
var _drawml = require("../drawml");
var _drawml2 = _interopRequireDefault(_drawml);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var OfficeDocument = function (_Base) {
_inherits(OfficeDocument, _Base);
function OfficeDocument() {
_classCallCheck(this, OfficeDocument);
return _possibleConstructorReturn(this, (OfficeDocument.__proto__ || Object.getPrototypeOf(OfficeDocument)).apply(this, arguments));
}
_createClass(OfficeDocument, [{
key: "_init",
value: function _init() {
_get(OfficeDocument.prototype.__proto__ || Object.getPrototypeOf(OfficeDocument.prototype), "_init", this).call(this);
this._assignRel("tableStyles,viewProps,presProps".split(","));
}
}, {
key: "render",
value: function render(createElement) {
var identify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.identify.bind(this.constructor);
if (this.tableStyles) {
this.renderNode(this.tableStyles.root().children().get(0), createElement, identify);
}
return this.renderNode(this.content("p\\:presentation").get(0), createElement, identify);
}
}, {
key: "parse",
value: function parse(domHandler) {
var identify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.identify.bind(this.constructor);
var createElement = domHandler.createElement.bind(domHandler);
function _identify() {
var model = identify.apply(undefined, arguments);
if (model && (typeof model === "undefined" ? "undefined" : _typeof(model)) == "object") {
domHandler.emit.apply(domHandler, ["*", model].concat(Array.prototype.slice.call(arguments)));
domHandler.emit.apply(domHandler, [model.type, model].concat(Array.prototype.slice.call(arguments)));
if (domHandler["on" + model.type]) domHandler["on" + model.type].apply(domHandler, [model].concat(Array.prototype.slice.call(arguments)));
}
return model;
}
return this.render(createElement, _identify);
}
}, {
key: "slide",
value: function slide(_ref) {
var id = _ref.id,
rid = _ref["r:id"];
return this.getRel(rid);
}
}, {
key: "master",
value: function master(_ref2) {
var id = _ref2.id,
rid = _ref2["r:id"];
return this.slide.apply(this, arguments);
}
}, {
key: "notesMaster",
value: function notesMaster() {
return this.slide.apply(this, arguments);
}
}, {
key: "handoutMaster",
value: function handoutMaster() {
return this.slide.apply(this, arguments);
}
}, {
key: "masterPartOfLayout",
value: function masterPartOfLayout(wXmlLayoutIdInMaster) {
var masterRoot = this.$(wXmlLayoutIdInMaster).root().get(0);
var masterPartName = masterRoot.attribs.part;
return this.doc.getRelObject(masterPartName);
}
}]);
return OfficeDocument;
}(_officeDocument2.default);
OfficeDocument.identities = {
presentation: function presentation(wXml, officeDocument) {
var $ = officeDocument.content("p\\:presentation");
var content = "p\\:handoutMasterIdLst,p\\:notesMasterIdLst,p\\:sldIdLst,p\\:sldMasterIdLst";
var children = $.children(content).toArray();
var orders = { "p:sldMasterIdLst": 1, "p:sldIdLst": 2 };
children.sort(function (a, b) {
return (orders[a.name] || 99) - (orders[b.name] || 99);
});
var sz = function sz(_ref3) {
var _ref3$attribs = _ref3.attribs,
cx = _ref3$attribs.cx,
cy = _ref3$attribs.cy;
return { width: officeDocument.doc.emu2Px(cx), height: officeDocument.doc.emu2Px(cy) };
};
var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: ":not(" + content + ",a\\:extLst)",
sldSz: sz,
notesSz: sz
}));
return _extends({}, props, { type: "document", children: children });
},
sldMasterId: function sldMasterId(wXml, officeDocument) {
var content = "p\\:sldLayoutIdLst,p\\:cSld";
var $ = officeDocument.master(wXml.attribs);
var $master = $("p\\:sldMaster");
var props = $master.props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: ":not(" + content + ",a\\:extLst)"
}));
var children = $master.children(content).toArray();
var orders = { "p:sldLayoutLst": 1, "p:cSld": 2 };
children.sort(function (a, b) {
return (orders[a.name] || 99) - (orders[b.name] || 99);
});
return _extends({}, props, { part: $.part, children: children, type: "slideMaster" });
},
sldId: function sldId(wXml, officeDocument) {
var content = "p\\:cSld";
var $ = officeDocument.slide(wXml.attribs);
var $slide = $('p\\:sld');
var props = $slide.props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: ":not(" + content + ",a\\:extLst)"
}));
var children = $slide.children(content).toArray();
var slidePart = officeDocument.getRelPart(wXml.attribs["r:id"]);
var layoutTarget = officeDocument.doc.normalizePath(slidePart.normalizePath(slidePart.getRelTarget("slideLayout")));
var layoutPart = new _part2.default(layoutTarget, officeDocument.doc);
var masterTarget = officeDocument.doc.normalizePath(layoutPart.normalizePath(layoutPart.getRelTarget("slideMaster")));
return _extends({}, props, { part: $.part, layout: layoutTarget, master: masterTarget, children: children, type: "slide" });
},
notesMasterId: function notesMasterId(wXml, officeDocument) {
var $ = officeDocument.notesMaster(wXml.attribs);
return { part: $.part, type: "noteMaster" };
},
handoutMasterId: function handoutMasterId(wXml, officeDocument) {
var $ = officeDocument.handoutMaster(wXml.attribs);
return { part: $.part, type: "handoutMaster" };
},
sldLayoutId: function sldLayoutId(wXml, officeDocument) {
//in master
var content = "p\\:cSld";
var master = officeDocument.$(wXml).part();
var $ = new _part2.default(master, officeDocument.doc).getRel(wXml.attribs["r:id"]);
var $layout = $("p\\:sldLayout");
var props = $layout.props({ __filter: ":not(" + content + ",a\\:extLst)" });
var children = $layout.children(content).toArray();
return _extends({}, props, { part: $.part, master: master, children: children, type: "slideLayout" });
},
spTree: function spTree(wXml, officeDocument) {
var content = ":not(p\\:nvGrpSpPr,p\\:grpSpPr)";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var props = officeDocument.$(wXml).props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: "p\\:nvGrpSpPr,p\\:grpSpPr",
tidy: function tidy(_ref4) {
var grpSpPr = _ref4.grpSpPr,
_ref4$nvGrpSpPr = _ref4.nvGrpSpPr,
_ref4$nvGrpSpPr$cNvPr = _ref4$nvGrpSpPr.cNvPr,
cNvPr = _ref4$nvGrpSpPr$cNvPr === undefined ? {} : _ref4$nvGrpSpPr$cNvPr,
_ref4$nvGrpSpPr$cNvSp = _ref4$nvGrpSpPr.cNvSpPr,
cNvSpPr = _ref4$nvGrpSpPr$cNvSp === undefined ? {} : _ref4$nvGrpSpPr$cNvSp,
_ref4$nvGrpSpPr$nvPr = _ref4$nvGrpSpPr.nvPr,
nvPr = _ref4$nvGrpSpPr$nvPr === undefined ? {} : _ref4$nvGrpSpPr$nvPr,
others = _objectWithoutProperties(_ref4, ["grpSpPr", "nvGrpSpPr"]);
return _extends({}, grpSpPr, cNvPr, cNvSpPr, nvPr, others);
}
}));
return _extends({}, props, { type: "spTree", children: children });
},
pic: function pic(wXml, officeDocument) {
var props = officeDocument.$(wXml).props(_extends({}, (0, _drawml2.default)(officeDocument), {
tidy: function tidy(_ref5) {
var spPr = _ref5.spPr,
_ref5$nvPicPr = _ref5.nvPicPr,
_ref5$nvPicPr$cNvPr = _ref5$nvPicPr.cNvPr,
cNvPr = _ref5$nvPicPr$cNvPr === undefined ? {} : _ref5$nvPicPr$cNvPr,
_ref5$nvPicPr$cNvSpPr = _ref5$nvPicPr.cNvSpPr,
cNvSpPr = _ref5$nvPicPr$cNvSpPr === undefined ? {} : _ref5$nvPicPr$cNvSpPr,
_ref5$nvPicPr$nvPr = _ref5$nvPicPr.nvPr,
nvPr = _ref5$nvPicPr$nvPr === undefined ? {} : _ref5$nvPicPr$nvPr,
others = _objectWithoutProperties(_ref5, ["spPr", "nvPicPr"]);
return _extends({}, spPr, cNvPr, cNvSpPr, nvPr, others);
}
}));
return _extends({}, props, { type: "picture" });
},
sp: function sp(wXml, officeDocument) {
var content = "p\\:txBody";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var commonProps = (0, _drawml2.default)(officeDocument);
var names = _extends({ spLocks: "locks", ph: "placeholder" }, commonProps.names);
var props = $.props(_extends({}, commonProps, {
__filter: ":not(" + content + ",a\\:extLst)",
names: names,
ph: function ph(_ref6) {
var _ref6$attribs = _ref6.attribs,
_ref6$attribs$type = _ref6$attribs.type,
type = _ref6$attribs$type === undefined ? "body" : _ref6$attribs$type,
idx = _ref6$attribs.idx;
return { type: type, idx: idx };
},
tidy: function tidy(_ref7) {
var spPr = _ref7.spPr,
_ref7$nvSpPr = _ref7.nvSpPr,
_ref7$nvSpPr$cNvPr = _ref7$nvSpPr.cNvPr,
cNvPr = _ref7$nvSpPr$cNvPr === undefined ? {} : _ref7$nvSpPr$cNvPr,
_ref7$nvSpPr$cNvSpPr = _ref7$nvSpPr.cNvSpPr,
cNvSpPr = _ref7$nvSpPr$cNvSpPr === undefined ? {} : _ref7$nvSpPr$cNvSpPr,
_ref7$nvSpPr$nvPr = _ref7$nvSpPr.nvPr,
nvPr = _ref7$nvSpPr$nvPr === undefined ? {} : _ref7$nvSpPr$nvPr;
return _extends({}, spPr, cNvPr, cNvSpPr, nvPr);
}
}));
var txBody = OfficeDocument.identities.txBody(children[0], officeDocument);
return _extends({}, props, { children: children }, txBody, { type: "shape" });
},
txBody: function txBody(wXml, officeDocument) {
var content = "a\\:p";
var $ = officeDocument.$(wXml);
var children = $.children("a\\:p").toArray();
var textStyle = $.props(_extends({}, (0, _drawml2.default)(officeDocument), {
lnSpcReduction: function lnSpcReduction(v) {
return parseInt(v);
},
fontScale: function fontScale(v) {
return parseInt(v);
},
__filter: ":not(a\\:p,a\\:extLst)",
tidy: function tidy(_ref8) {
var _ref8$lstStyle = _ref8.lstStyle,
lstStyle = _ref8$lstStyle === undefined ? {} : _ref8$lstStyle,
_ref8$bodyPr = _ref8.bodyPr,
bodyPr = _ref8$bodyPr === undefined ? {} : _ref8$bodyPr,
others = _objectWithoutProperties(_ref8, ["lstStyle", "bodyPr"]);
return _extends({}, others, bodyPr, lstStyle);
}
}));
return { textStyle: textStyle, children: children, type: "txBody" };
},
p: function p(wXml, officeDocument) {
var content = ":not(a\\:pPr,a\\:endParaRPr)";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var style = $.children("a\\:pPr").props((0, _drawml2.default)(officeDocument));
var defaultStyle = $.children("a\\:endParaRPr").props((0, _drawml2.default)(officeDocument));
return { style: _extends({ lvl: 0 }, style), defaultStyle: defaultStyle, children: children, type: "p" };
},
r: function r(wXml, officeDocument) {
var content = ":not(a\\:rPr)";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var style = $.children("a\\:rPr").props(_extends({}, (0, _drawml2.default)(officeDocument)));
return { style: style, children: children, type: "r" };
},
chart: function chart(wXml, officeDocument) {
return { type: "chart" };
},
relIds: function relIds(wXml, officeDocument) {
return { type: "diagram" };
},
graphicFrame: function graphicFrame(wXml, officeDocument) {
var content = "a\\:graphic";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: ":not(" + content + ",a\\:extLst)",
tidy: function tidy(_ref9) {
var spPr = _ref9.spPr,
_ref9$nvGraphicFrameP = _ref9.nvGraphicFramePr,
_ref9$nvGraphicFrameP2 = _ref9$nvGraphicFrameP.cNvPr,
cNvPr = _ref9$nvGraphicFrameP2 === undefined ? {} : _ref9$nvGraphicFrameP2,
_ref9$nvGraphicFrameP3 = _ref9$nvGraphicFrameP.cNvSpPr,
cNvSpPr = _ref9$nvGraphicFrameP3 === undefined ? {} : _ref9$nvGraphicFrameP3,
_ref9$nvGraphicFrameP4 = _ref9$nvGraphicFrameP.nvPr,
nvPr = _ref9$nvGraphicFrameP4 === undefined ? {} : _ref9$nvGraphicFrameP4,
others = _objectWithoutProperties(_ref9, ["spPr", "nvGraphicFramePr"]);
return _extends({}, spPr, cNvPr, cNvSpPr, nvPr, others);
}
}));
return _extends({}, props, { children: children, type: "graphicFrame" });
},
tbl: function tbl(wXml, officeDocument) {
var content = "a\\:tr";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: ":not(" + content + ", a\\:extLst)",
tableStyleId: function tableStyleId(_ref10) {
var children = _ref10.children;
return children.find(function (a) {
return a.data;
}).data;
},
tblGrid: function tblGrid(_ref11) {
var children = _ref11.children;
return children.filter(function (a) {
return a.name;
}).reduce(function (cols, _ref12) {
var w = _ref12.attribs.w;
cols.push(officeDocument.doc.emu2Px(w));
return cols;
}, []);
},
tidy: function tidy(_ref13) {
var tblPr = _ref13.tblPr,
cols = _ref13.tblGrid,
others = _objectWithoutProperties(_ref13, ["tblPr", "tblGrid"]);
return _extends({}, tblPr, { cols: cols }, others);
}
}));
return _extends({}, props, { children: children, type: "tbl" });
},
tblStyle: function tblStyle(wXml, officeDocument) {
var $ = officeDocument.$(wXml);
var props = $.props((0, _drawml2.default)(officeDocument));
return _extends({}, props, { type: "tblStyle" });
},
tr: function tr(wXml, officeDocument) {
var $ = officeDocument.$(wXml);
var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: ":not(*)",
h: function h(v) {
return officeDocument.doc.emu2Px(v);
},
names: { h: "height" }
}));
return _extends({}, props, { children: wXml.children, type: "tr" });
},
tc: function tc(wXml, officeDocument) {
var content = "a\\:txBody";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var props = $.props({
__filter: ":not(" + content + ",a\\:extLst)"
});
return _extends({}, props, { type: "tc", children: children });
}
};
exports.default = OfficeDocument;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVueG1sL3BwdHgvb2ZmaWNlRG9jdW1lbnQuanMiXSwibmFtZXMiOlsiT2ZmaWNlRG9jdW1lbnQiLCJfYXNzaWduUmVsIiwic3BsaXQiLCJjcmVhdGVFbGVtZW50IiwiaWRlbnRpZnkiLCJjb25zdHJ1Y3RvciIsImJpbmQiLCJ0YWJsZVN0eWxlcyIsInJlbmRlck5vZGUiLCJyb290IiwiY2hpbGRyZW4iLCJnZXQiLCJjb250ZW50IiwiZG9tSGFuZGxlciIsIl9pZGVudGlmeSIsIm1vZGVsIiwiYXJndW1lbnRzIiwiZW1pdCIsInR5cGUiLCJyZW5kZXIiLCJpZCIsInJpZCIsImdldFJlbCIsInNsaWRlIiwid1htbExheW91dElkSW5NYXN0ZXIiLCJtYXN0ZXJSb290IiwiJCIsIm1hc3RlclBhcnROYW1lIiwiYXR0cmlicyIsInBhcnQiLCJkb2MiLCJnZXRSZWxPYmplY3QiLCJpZGVudGl0aWVzIiwicHJlc2VudGF0aW9uIiwid1htbCIsIm9mZmljZURvY3VtZW50IiwidG9BcnJheSIsIm9yZGVycyIsInNvcnQiLCJhIiwiYiIsIm5hbWUiLCJzeiIsImN4IiwiY3kiLCJ3aWR0aCIsImVtdTJQeCIsImhlaWdodCIsInByb3BzIiwiX19maWx0ZXIiLCJzbGRTeiIsIm5vdGVzU3oiLCJzbGRNYXN0ZXJJZCIsIm1hc3RlciIsIiRtYXN0ZXIiLCJzbGRJZCIsIiRzbGlkZSIsInNsaWRlUGFydCIsImdldFJlbFBhcnQiLCJsYXlvdXRUYXJnZXQiLCJub3JtYWxpemVQYXRoIiwiZ2V0UmVsVGFyZ2V0IiwibGF5b3V0UGFydCIsIm1hc3RlclRhcmdldCIsImxheW91dCIsIm5vdGVzTWFzdGVySWQiLCJub3Rlc01hc3RlciIsImhhbmRvdXRNYXN0ZXJJZCIsImhhbmRvdXRNYXN0ZXIiLCJzbGRMYXlvdXRJZCIsIiRsYXlvdXQiLCJzcFRyZWUiLCJ0aWR5IiwiZ3JwU3BQciIsIm52R3JwU3BQciIsImNOdlByIiwiY052U3BQciIsIm52UHIiLCJvdGhlcnMiLCJwaWMiLCJzcFByIiwibnZQaWNQciIsInNwIiwiY29tbW9uUHJvcHMiLCJuYW1lcyIsInNwTG9ja3MiLCJwaCIsImlkeCIsIm52U3BQciIsInR4Qm9keSIsInRleHRTdHlsZSIsImxuU3BjUmVkdWN0aW9uIiwicGFyc2VJbnQiLCJ2IiwiZm9udFNjYWxlIiwibHN0U3R5bGUiLCJib2R5UHIiLCJwIiwic3R5bGUiLCJkZWZhdWx0U3R5bGUiLCJsdmwiLCJyIiwiY2hhcnQiLCJyZWxJZHMiLCJncmFwaGljRnJhbWUiLCJudkdyYXBoaWNGcmFtZVByIiwidGJsIiwidGFibGVTdHlsZUlkIiwiZmluZCIsImRhdGEiLCJ0YmxHcmlkIiwiZmlsdGVyIiwicmVkdWNlIiwiY29scyIsInciLCJwdXNoIiwidGJsUHIiLCJ0YmxTdHlsZSIsInRyIiwiaCIsInRjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7SUFFcUJBLGM7Ozs7Ozs7Ozs7O2dDQUNWO0FBQ0g7QUFDQSxpQkFBS0MsVUFBTCxDQUFnQixrQ0FBa0NDLEtBQWxDLENBQXdDLEdBQXhDLENBQWhCO0FBQ0g7OzsrQkFFTUMsYSxFQUF5RTtBQUFBLGdCQUExREMsUUFBMEQsdUVBQWpELEtBQUtDLFdBQUwsQ0FBaUJELFFBQWpCLENBQTBCRSxJQUExQixDQUErQixLQUFLRCxXQUFwQyxDQUFpRDs7QUFDNUUsZ0JBQUcsS0FBS0UsV0FBUixFQUFvQjtBQUNoQixxQkFBS0MsVUFBTCxDQUFnQixLQUFLRCxXQUFMLENBQWlCRSxJQUFqQixHQUF3QkMsUUFBeEIsR0FBbUNDLEdBQW5DLENBQXVDLENBQXZDLENBQWhCLEVBQTJEUixhQUEzRCxFQUEwRUMsUUFBMUU7QUFDSDtBQUNELG1CQUFPLEtBQUtJLFVBQUwsQ0FBZ0IsS0FBS0ksT0FBTCxDQUFhLGtCQUFiLEVBQWlDRCxHQUFqQyxDQUFxQyxDQUFyQyxDQUFoQixFQUF5RFIsYUFBekQsRUFBd0VDLFFBQXhFLENBQVA7QUFDSDs7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QkFBV3ZFLEtBQVgsSUFBa0J0QyxVQUFTd0IsS0FBS3hCLFFBQWhDLEVBQTBDUSxNQUFLLElBQS9DO0FBQ0gsS0FsTWE7QUFvTWRzRyxNQXBNYyxjQW9NWHRGLElBcE1XLEVBb01MQyxjQXBNSyxFQW9NVTtBQUNwQixZQUFNdkIsVUFBUSxZQUFkO0FBQ0EsWUFBTWMsSUFBRVMsZUFBZVQsQ0FBZixDQUFpQlEsSUFBakIsQ0FBUjtBQUNBLFlBQU14QixXQUFTZ0IsRUFBRWhCLFFBQUYsQ0FBV0UsT0FBWCxFQUFvQndCLE9BQXBCLEVBQWY7QUFDQSxZQUFNWSxRQUFNdEIsRUFBRXNCLEtBQUYsQ0FBUTtBQUNoQkMsZ0NBQWlCckMsT0FBakI7QUFEZ0IsU0FBUixDQUFaO0FBR0EsNEJBQVdvQyxLQUFYLElBQWtCOUIsTUFBSyxJQUF2QixFQUE2QlIsa0JBQTdCO0FBQ0g7QUE1TWEsQztrQkFuRERWLGMiLCJmaWxlIjoib2ZmaWNlRG9jdW1lbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZSBmcm9tIFwiLi4vb2ZmaWNlRG9jdW1lbnRcIlxuaW1wb3J0IFBhcnQgZnJvbSBcIi4uL3BhcnRcIlxuaW1wb3J0IGRyYXdtbCBmcm9tIFwiLi4vZHJhd21sXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2ZmaWNlRG9jdW1lbnQgZXh0ZW5kcyBCYXNle1xuICAgIF9pbml0KCl7XG4gICAgICAgIHN1cGVyLl9pbml0KClcbiAgICAgICAgdGhpcy5fYXNzaWduUmVsKFwidGFibGVTdHlsZXMsdmlld1Byb3BzLHByZXNQcm9wc1wiLnNwbGl0KFwiLFwiKSlcbiAgICB9XG5cbiAgICByZW5kZXIoY3JlYXRlRWxlbWVudCwgaWRlbnRpZnk9dGhpcy5jb25zdHJ1Y3Rvci5pZGVudGlmeS5iaW5kKHRoaXMuY29uc3RydWN0b3IpKXtcbiAgICAgICAgaWYodGhpcy50YWJsZVN0eWxlcyl7XG4gICAgICAgICAgICB0aGlzLnJlbmRlck5vZGUodGhpcy50YWJsZVN0eWxlcy5yb290KCkuY2hpbGRyZW4oKS5nZXQoMCksIGNyZWF0ZUVsZW1lbnQsIGlkZW50aWZ5KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlck5vZGUodGhpcy5jb250ZW50KFwicFxcXFw6cHJlc2VudGF0aW9uXCIpLmdldCgwKSwgY3JlYXRlRWxlbWVudCwgaWRlbnRpZnkpXG4gICAgfVxuXG4gICAgcGFyc2UoZG9tSGFuZGxlcixpZGVudGlmeT10aGlzLmNvbnN0cnVjdG9yLmlkZW50aWZ5LmJpbmQodGhpcy5jb25zdHJ1Y3Rvcikpe1xuXHRcdGNvbnN0IGNyZWF0ZUVsZW1lbnQ9ZG9tSGFuZGxlci5jcmVhdGVFbGVtZW50LmJpbmQoZG9tSGFuZGxlcilcblx0XHRmdW5jdGlvbiBfaWRlbnRpZnkoKXtcblx0XHRcdGxldCBtb2RlbD1pZGVudGlmeSguLi5hcmd1bWVudHMpXG5cdFx0XHRpZihtb2RlbCAmJiB0eXBlb2YobW9kZWwpPT1cIm9iamVjdFwiKXtcblx0XHRcdFx0ZG9tSGFuZGxlci5lbWl0KFwiKlwiLG1vZGVsLC4uLmFyZ3VtZW50cylcblx0XHRcdFx0ZG9tSGFuZGxlci5lbWl0KG1vZGVsLnR5cGUsIG1vZGVsLC4uLmFyZ3VtZW50cylcblx0XHRcdFx0aWYoZG9tSGFuZGxlcltgb24ke21vZGVsLnR5cGV9YF0pXG5cdFx0XHRcdFx0ZG9tSGFuZGxlcltgb24ke21vZGVsLnR5cGV9YF0obW9kZWwsLi4uYXJndW1lbnRzKVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1vZGVsXG5cdFx0fVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcihjcmVhdGVFbGVtZW50LCBfaWRlbnRpZnkpXG5cdH1cblxuICAgIHNsaWRlKHtpZCxcInI6aWRcIjpyaWR9KXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVsKHJpZClcbiAgICB9XG5cbiAgICBtYXN0ZXIoe2lkLFwicjppZFwiOnJpZH0pe1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZSguLi5hcmd1bWVudHMpXG4gICAgfVxuXG4gICAgbm90ZXNNYXN0ZXIoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGUoLi4uYXJndW1lbnRzKVxuICAgIH1cblxuICAgIGhhbmRvdXRNYXN0ZXIoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGUoLi4uYXJndW1lbnRzKVxuICAgIH1cblxuICAgIG1hc3RlclBhcnRPZkxheW91dCh3WG1sTGF5b3V0SWRJbk1hc3Rlcil7XG4gICAgICAgIGNvbnN0IG1hc3RlclJvb3Q9dGhpcy4kKHdYbWxMYXlvdXRJZEluTWFzdGVyKS5yb290KCkuZ2V0KDApXG4gICAgICAgIGNvbnN0IHtwYXJ0Om1hc3RlclBhcnROYW1lfT1tYXN0ZXJSb290LmF0dHJpYnNcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldFJlbE9iamVjdChtYXN0ZXJQYXJ0TmFtZSlcbiAgICB9XG5cbiAgICBzdGF0aWMgaWRlbnRpdGllcz17XG4gICAgICAgIHByZXNlbnRhdGlvbih3WG1sLG9mZmljZURvY3VtZW50KXtcblx0XHRcdGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuY29udGVudChcInBcXFxcOnByZXNlbnRhdGlvblwiKVxuICAgICAgICAgICAgY29uc3QgY29udGVudD1cInBcXFxcOmhhbmRvdXRNYXN0ZXJJZExzdCxwXFxcXDpub3Rlc01hc3RlcklkTHN0LHBcXFxcOnNsZElkTHN0LHBcXFxcOnNsZE1hc3RlcklkTHN0XCJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuPSQuY2hpbGRyZW4oY29udGVudCkudG9BcnJheSgpXG4gICAgICAgICAgICBjb25zdCBvcmRlcnM9e1wicDpzbGRNYXN0ZXJJZExzdFwiOjEsIFwicDpzbGRJZExzdFwiOjJ9XG4gICAgICAgICAgICBjaGlsZHJlbi5zb3J0KChhLGIpPT4ob3JkZXJzW2EubmFtZV18fDk5KS0ob3JkZXJzW2IubmFtZV18fDk5KSlcblxuICAgICAgICAgICAgY29uc3Qgc3o9KHthdHRyaWJzOntjeCxjeX19KT0+KHt3aWR0aDpvZmZpY2VEb2N1bWVudC5kb2MuZW11MlB4KGN4KSxoZWlnaHQ6b2ZmaWNlRG9jdW1lbnQuZG9jLmVtdTJQeChjeSl9KVxuICAgICAgICAgICAgY29uc3QgcHJvcHM9JC5wcm9wcyh7XG4gICAgICAgICAgICAgICAgLi4uZHJhd21sKG9mZmljZURvY3VtZW50KSxcbiAgICAgICAgICAgICAgICBfX2ZpbHRlcjpgOm5vdCgke2NvbnRlbnR9LGFcXFxcOmV4dExzdClgLFxuICAgICAgICAgICAgICAgIHNsZFN6OnN6LCBcbiAgICAgICAgICAgICAgICBub3Rlc1N6OnN6LFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmV0dXJuIHsuLi5wcm9wcywgdHlwZTpcImRvY3VtZW50XCIsY2hpbGRyZW59XG5cdFx0fSxcblxuICAgICAgICBzbGRNYXN0ZXJJZCh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50PVwicFxcXFw6c2xkTGF5b3V0SWRMc3QscFxcXFw6Y1NsZFwiXG4gICAgICAgICAgICBjb25zdCAkPW9mZmljZURvY3VtZW50Lm1hc3Rlcih3WG1sLmF0dHJpYnMpXG4gICAgICAgICAgICBjb25zdCAkbWFzdGVyPSQoXCJwXFxcXDpzbGRNYXN0ZXJcIilcbiAgICAgICAgICAgIGNvbnN0IHByb3BzPSRtYXN0ZXIucHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmRyYXdtbChvZmZpY2VEb2N1bWVudCksXG4gICAgICAgICAgICAgICAgX19maWx0ZXI6YDpub3QoJHtjb250ZW50fSxhXFxcXDpleHRMc3QpYCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbj0kbWFzdGVyLmNoaWxkcmVuKGNvbnRlbnQpLnRvQXJyYXkoKVxuICAgICAgICAgICAgY29uc3Qgb3JkZXJzPXtcInA6c2xkTGF5b3V0THN0XCI6MSwgXCJwOmNTbGRcIjoyfVxuICAgICAgICAgICAgY2hpbGRyZW4uc29ydCgoYSxiKT0+KG9yZGVyc1thLm5hbWVdfHw5OSktKG9yZGVyc1tiLm5hbWVdfHw5OSkpXG5cbiAgICAgICAgICAgIHJldHVybiB7Li4ucHJvcHMsIHBhcnQ6ICQucGFydCwgY2hpbGRyZW4sdHlwZTpcInNsaWRlTWFzdGVyXCJ9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2xkSWQod1htbCxvZmZpY2VEb2N1bWVudCl7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50PVwicFxcXFw6Y1NsZFwiXG4gICAgICAgICAgICBjb25zdCAkPW9mZmljZURvY3VtZW50LnNsaWRlKHdYbWwuYXR0cmlicylcbiAgICAgICAgICAgIGNvbnN0ICRzbGlkZT0kKCdwXFxcXDpzbGQnKVxuICAgICAgICAgICAgY29uc3QgcHJvcHM9JHNsaWRlLnByb3BzKHtcbiAgICAgICAgICAgICAgICAuLi5kcmF3bWwob2ZmaWNlRG9jdW1lbnQpLFxuICAgICAgICAgICAgICAgIF9fZmlsdGVyOmA6bm90KCR7Y29udGVudH0sYVxcXFw6ZXh0THN0KWAsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW49JHNsaWRlLmNoaWxkcmVuKGNvbnRlbnQpLnRvQXJyYXkoKVxuXG4gICAgICAgICAgICBjb25zdCBzbGlkZVBhcnQ9b2ZmaWNlRG9jdW1lbnQuZ2V0UmVsUGFydCh3WG1sLmF0dHJpYnNbXCJyOmlkXCJdKVxuICAgICAgICAgICAgY29uc3QgbGF5b3V0VGFyZ2V0PW9mZmljZURvY3VtZW50LmRvYy5ub3JtYWxpemVQYXRoKHNsaWRlUGFydC5ub3JtYWxpemVQYXRoKHNsaWRlUGFydC5nZXRSZWxUYXJnZXQoXCJzbGlkZUxheW91dFwiKSkpXG4gICAgICAgICAgICBjb25zdCBsYXlvdXRQYXJ0PW5ldyBQYXJ0KGxheW91dFRhcmdldCxvZmZpY2VEb2N1bWVudC5kb2MpXG4gICAgICAgICAgICBjb25zdCBtYXN0ZXJUYXJnZXQ9b2ZmaWNlRG9jdW1lbnQuZG9jLm5vcm1hbGl6ZVBhdGgobGF5b3V0UGFydC5ub3JtYWxpemVQYXRoKGxheW91dFBhcnQuZ2V0UmVsVGFyZ2V0KFwic2xpZGVNYXN0ZXJcIikpKVxuICAgICAgICAgICAgcmV0dXJuIHsuLi5wcm9wcyxwYXJ0OiQucGFydCwgbGF5b3V0OmxheW91dFRhcmdldCwgbWFzdGVyOm1hc3RlclRhcmdldCwgY2hpbGRyZW4sIHR5cGU6XCJzbGlkZVwifVxuICAgICAgICB9LFxuXG4gICAgICAgIG5vdGVzTWFzdGVySWQod1htbCwgb2ZmaWNlRG9jdW1lbnQpe1xuICAgICAgICAgICAgY29uc3QgJD1vZmZpY2VEb2N1bWVudC5ub3Rlc01hc3Rlcih3WG1sLmF0dHJpYnMpXG4gICAgICAgICAgICByZXR1cm4ge3BhcnQ6JC5wYXJ0LHR5cGU6XCJub3RlTWFzdGVyXCIsfVxuICAgICAgICB9LFxuXG4gICAgICAgIGhhbmRvdXRNYXN0ZXJJZCh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XG4gICAgICAgICAgICBjb25zdCAkPW9mZmljZURvY3VtZW50LmhhbmRvdXRNYXN0ZXIod1htbC5hdHRyaWJzKVxuICAgICAgICAgICAgcmV0dXJuIHtwYXJ0OiQucGFydCx0eXBlOlwiaGFuZG91dE1hc3RlclwiLCB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2xkTGF5b3V0SWQod1htbCxvZmZpY2VEb2N1bWVudCl7Ly9pbiBtYXN0ZXJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ9XCJwXFxcXDpjU2xkXCJcbiAgICAgICAgICAgIGNvbnN0IG1hc3Rlcj1vZmZpY2VEb2N1bWVudC4kKHdYbWwpLnBhcnQoKVxuICAgICAgICAgICAgY29uc3QgJD1uZXcgUGFydChtYXN0ZXIsb2ZmaWNlRG9jdW1lbnQuZG9jKS5nZXRSZWwod1htbC5hdHRyaWJzW1wicjppZFwiXSlcbiAgICAgICAgICAgIGNvbnN0ICRsYXlvdXQ9JChcInBcXFxcOnNsZExheW91dFwiKVxuICAgICAgICAgICAgY29uc3QgcHJvcHM9JGxheW91dC5wcm9wcyh7X19maWx0ZXI6YDpub3QoJHtjb250ZW50fSxhXFxcXDpleHRMc3QpYH0pXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbj0kbGF5b3V0LmNoaWxkcmVuKGNvbnRlbnQpLnRvQXJyYXkoKVxuXG4gICAgICAgICAgICByZXR1cm4gey4uLnByb3BzLHBhcnQ6JC5wYXJ0LCBtYXN0ZXIsIGNoaWxkcmVuLCB0eXBlOlwic2xpZGVMYXlvdXRcIiwgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHNwVHJlZSh3WG1sLG9mZmljZURvY3VtZW50KXtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ9XCI6bm90KHBcXFxcOm52R3JwU3BQcixwXFxcXDpncnBTcFByKVwiXG4gICAgICAgICAgICBjb25zdCAkPW9mZmljZURvY3VtZW50LiQod1htbClcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuPSQuY2hpbGRyZW4oY29udGVudCkudG9BcnJheSgpXG4gICAgICAgICAgICBjb25zdCBwcm9wcz1vZmZpY2VEb2N1bWVudC4kKHdYbWwpLnByb3BzKHtcbiAgICAgICAgICAgICAgICAuLi5kcmF3bWwob2ZmaWNlRG9jdW1lbnQpLFxuICAgICAgICAgICAgICAgIF9fZmlsdGVyOmBwXFxcXDpudkdycFNwUHIscFxcXFw6Z3JwU3BQcmAsXG4gICAgICAgICAgICAgICAgdGlkeTooe2dycFNwUHIsIG52R3JwU3BQcjp7Y052UHI9e30sY052U3BQcj17fSxudlByPXt9fSwgLi4ub3RoZXJzfSk9Pih7Li4uZ3JwU3BQciwgLi4uY052UHIsLi4uY052U3BQciwuLi5udlByLC4uLm90aGVyc30pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gey4uLnByb3BzLHR5cGU6XCJzcFRyZWVcIiwgY2hpbGRyZW59XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGljKHdYbWwsIG9mZmljZURvY3VtZW50KXtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzPW9mZmljZURvY3VtZW50LiQod1htbCkucHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmRyYXdtbChvZmZpY2VEb2N1bWVudCksXG4gICAgICAgICAgICAgICAgdGlkeTooe3NwUHIsIG52UGljUHI6e2NOdlByPXt9LGNOdlNwUHI9e30sbnZQcj17fX0sIC4uLm90aGVyc30pPT4oey4uLnNwUHIsIC4uLmNOdlByLC4uLmNOdlNwUHIsLi4ubnZQciwuLi5vdGhlcnN9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiB7Li4ucHJvcHMsdHlwZTpcInBpY3R1cmVcIn1cbiAgICAgICAgfSxcblxuICAgICAgICBzcCh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50PVwicFxcXFw6dHhCb2R5XCJcblx0XHRcdGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW49JC5jaGlsZHJlbihjb250ZW50KS50b0FycmF5KClcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vblByb3BzPWRyYXdtbChvZmZpY2VEb2N1bWVudClcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzPXtzcExvY2tzOlwibG9ja3NcIiwgcGg6XCJwbGFjZWhvbGRlclwiLCAuLi5jb21tb25Qcm9wcy5uYW1lc31cbiAgICAgICAgICAgIGNvbnN0IHByb3BzPSQucHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgICAgIF9fZmlsdGVyOmA6bm90KCR7Y29udGVudH0sYVxcXFw6ZXh0THN0KWAsXG4gICAgICAgICAgICAgICAgbmFtZXMsXG4gICAgICAgICAgICAgICAgcGg6KHthdHRyaWJzOnt0eXBlPVwiYm9keVwiLGlkeH19KT0+KHt0eXBlLGlkeH0pLFxuICAgICAgICAgICAgICAgIHRpZHk6KHtzcFByLCBudlNwUHI6e2NOdlByPXt9LGNOdlNwUHI9e30sbnZQcj17fX19KT0+KHsuLi5zcFByLCAuLi5jTnZQciwuLi5jTnZTcFByLC4uLm52UHJ9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY29uc3QgdHhCb2R5PU9mZmljZURvY3VtZW50LmlkZW50aXRpZXMudHhCb2R5KGNoaWxkcmVuWzBdLG9mZmljZURvY3VtZW50KVxuICAgICAgICAgICAgcmV0dXJuIHsuLi5wcm9wcywgY2hpbGRyZW4sIC4uLnR4Qm9keSwgdHlwZTpcInNoYXBlXCJ9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdHhCb2R5KHdYbWwsIG9mZmljZURvY3VtZW50KXtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ9XCJhXFxcXDpwXCJcblx0XHRcdGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW49JC5jaGlsZHJlbihcImFcXFxcOnBcIikudG9BcnJheSgpXG4gICAgICAgICAgICBjb25zdCB0ZXh0U3R5bGU9JC5wcm9wcyh7XG4gICAgICAgICAgICAgICAgLi4uZHJhd21sKG9mZmljZURvY3VtZW50KSxcbiAgICAgICAgICAgICAgICBsblNwY1JlZHVjdGlvbjp2PT5wYXJzZUludCh2KSxcbiAgICAgICAgICAgICAgICBmb250U2NhbGU6IHY9PnBhcnNlSW50KHYpLFxuICAgICAgICAgICAgICAgIF9fZmlsdGVyOmA6bm90KGFcXFxcOnAsYVxcXFw6ZXh0THN0KWAsXG4gICAgICAgICAgICAgICAgdGlkeTooe2xzdFN0eWxlPXt9LGJvZHlQcj17fSwuLi5vdGhlcnN9KT0+KHsuLi5vdGhlcnMsIC4uLmJvZHlQciwgLi4ubHN0U3R5bGV9KVxuICAgICAgICAgICAgfSlcblx0XHRcdHJldHVybiB7dGV4dFN0eWxlLCBjaGlsZHJlbiwgdHlwZTpcInR4Qm9keVwifVxuICAgICAgICB9LFxuXG4gICAgICAgIHAod1htbCwgb2ZmaWNlRG9jdW1lbnQpe1xuICAgICAgICAgICAgY29uc3QgY29udGVudD1cIjpub3QoYVxcXFw6cFByLGFcXFxcOmVuZFBhcmFSUHIpXCJcbiAgICAgICAgICAgIGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW49JC5jaGlsZHJlbihjb250ZW50KS50b0FycmF5KClcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlPSQuY2hpbGRyZW4oXCJhXFxcXDpwUHJcIikucHJvcHMoZHJhd21sKG9mZmljZURvY3VtZW50KSlcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTdHlsZT0kLmNoaWxkcmVuKFwiYVxcXFw6ZW5kUGFyYVJQclwiKS5wcm9wcyhkcmF3bWwob2ZmaWNlRG9jdW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIHtzdHlsZTp7bHZsOjAsIC4uLnN0eWxlfSwgZGVmYXVsdFN0eWxlLCBjaGlsZHJlbiwgdHlwZTpcInBcIn1cbiAgICAgICAgfSxcblxuICAgICAgICByKHdYbWwsb2ZmaWNlRG9jdW1lbnQpe1xuICAgICAgICAgICAgY29uc3QgY29udGVudD1cIjpub3QoYVxcXFw6clByKVwiXG4gICAgICAgICAgICBjb25zdCAkPW9mZmljZURvY3VtZW50LiQod1htbClcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuPSQuY2hpbGRyZW4oY29udGVudCkudG9BcnJheSgpXG4gICAgICAgICAgICBjb25zdCBzdHlsZT0kLmNoaWxkcmVuKFwiYVxcXFw6clByXCIpLnByb3BzKHsuLi5kcmF3bWwob2ZmaWNlRG9jdW1lbnQpfSlcbiAgICAgICAgICAgIHJldHVybiB7c3R5bGUsIGNoaWxkcmVuLCB0eXBlOlwiclwifVxuICAgICAgICB9LFxuXG4gICAgICAgIGNoYXJ0KHdYbWwsIG9mZmljZURvY3VtZW50KXtcbiAgICAgICAgICAgIHJldHVybiB7dHlwZTogXCJjaGFydFwifVxuICAgICAgICB9LFxuXG4gICAgICAgIHJlbElkcyh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XG4gICAgICAgICAgICByZXR1cm4ge3R5cGU6XCJkaWFncmFtXCJ9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ3JhcGhpY0ZyYW1lKHdYbWwsIG9mZmljZURvY3VtZW50KXtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ9XCJhXFxcXDpncmFwaGljXCJcbiAgICAgICAgICAgIGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW49JC5jaGlsZHJlbihjb250ZW50KS50b0FycmF5KClcbiAgICAgICAgICAgIGNvbnN0IHByb3BzPSQucHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmRyYXdtbChvZmZpY2VEb2N1bWVudCksXG4gICAgICAgICAgICAgICAgX19maWx0ZXI6YDpub3QoJHtjb250ZW50fSxhXFxcXDpleHRMc3QpYCxcbiAgICAgICAgICAgICAgICB0aWR5Oih7c3BQciwgbnZHcmFwaGljRnJhbWVQcjp7Y052UHI9e30sY052U3BQcj17fSxudlByPXt9fSwgLi4ub3RoZXJzfSk9Pih7Li4uc3BQciwgLi4uY052UHIsLi4uY052U3BQciwuLi5udlByLC4uLm90aGVyc30pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIHsuLi5wcm9wcywgY2hpbGRyZW4sIHR5cGU6XCJncmFwaGljRnJhbWVcIn1cbiAgICAgICAgfSxcblxuICAgICAgICB0Ymwod1htbCwgb2ZmaWNlRG9jdW1lbnQpe1xuICAgICAgICAgICAgY29uc3QgY29udGVudD1cImFcXFxcOnRyXCJcbiAgICAgICAgICAgIGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW49JC5jaGlsZHJlbihjb250ZW50KS50b0FycmF5KClcbiAgICAgICAgICAgIGNvbnN0IHByb3BzPSQucHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmRyYXdtbChvZmZpY2VEb2N1bWVudCksXG4gICAgICAgICAgICAgICAgX19maWx0ZXI6YDpub3QoJHtjb250ZW50fSwgYVxcXFw6ZXh0THN0KWAsXG4gICAgICAgICAgICAgICAgdGFibGVTdHlsZUlkOih7Y2hpbGRyZW59KT0+Y2hpbGRyZW4uZmluZChhPT5hLmRhdGEpLmRhdGEsXG4gICAgICAgICAgICAgICAgdGJsR3JpZDooe2NoaWxkcmVufSk9PmNoaWxkcmVuLmZpbHRlcihhPT5hLm5hbWUpLnJlZHVjZSgoY29scyx7YXR0cmliczp7d319KT0+e1xuICAgICAgICAgICAgICAgICAgICBjb2xzLnB1c2gob2ZmaWNlRG9jdW1lbnQuZG9jLmVtdTJQeCh3KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHNcbiAgICAgICAgICAgICAgICB9LFtdKSxcbiAgICAgICAgICAgICAgICB0aWR5Oih7dGJsUHIsIHRibEdyaWQ6Y29scywgLi4ub3RoZXJzfSk9Pih7Li4udGJsUHIsIGNvbHMsIC4uLm90aGVyc30pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIHsuLi5wcm9wcywgY2hpbGRyZW4sIHR5cGU6XCJ0YmxcIn1cbiAgICAgICAgfSxcblxuICAgICAgICB0YmxTdHlsZSh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XG4gICAgICAgICAgICBjb25zdCAkPW9mZmljZURvY3VtZW50LiQod1htbClcbiAgICAgICAgICAgIGNvbnN0IHByb3BzPSQucHJvcHMoZHJhd21sKG9mZmljZURvY3VtZW50KSlcbiAgICAgICAgICAgIHJldHVybiB7Li4ucHJvcHMsIHR5cGU6XCJ0YmxTdHlsZVwifVxuICAgICAgICB9LFxuXG4gICAgICAgIHRyKHdYbWwsIG9mZmljZURvY3VtZW50KXtcbiAgICAgICAgICAgIGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxuICAgICAgICAgICAgY29uc3QgcHJvcHM9JC5wcm9wcyh7XG4gICAgICAgICAgICAgICAgLi4uZHJhd21sKG9mZmljZURvY3VtZW50KSxcbiAgICAgICAgICAgICAgICBfX2ZpbHRlcjpcIjpub3QoKilcIixcbiAgICAgICAgICAgICAgICBoOnY9Pm9mZmljZURvY3VtZW50LmRvYy5lbXUyUHgodiksXG4gICAgICAgICAgICAgICAgbmFtZXM6e2g6XCJoZWlnaHRcIn1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gey4uLnByb3BzLCBjaGlsZHJlbjp3WG1sLmNoaWxkcmVuLCB0eXBlOlwidHJcIn1cbiAgICAgICAgfSxcblxuICAgICAgICB0Yyh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50PVwiYVxcXFw6dHhCb2R5XCJcbiAgICAgICAgICAgIGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxuICAgICAgICAgICAgY29uc3QgY2hpbGR