UNPKG

@future-grid/fgp-graph

Version:

fgp-graph is a chart lib based on Dygraphs

309 lines (237 loc) 34.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _resizeObserver = require("@juggle/resize-observer"); var _GraphRenderer = require("./widgets/GraphRenderer"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var FgpGraph = // private isReady: boolean = false; /** *Creates an instance of FgpGraph. * @param {HTMLElement} dom * graph container * @param {Array<ViewConfig>} viewConfigs * graph configuration * @memberof FgpGraph */ function FgpGraph(dom, viewConfigs, eventHandlers, syncViews) { var _this = this; _classCallCheck(this, FgpGraph); _defineProperty(this, "graphContainer", void 0); _defineProperty(this, "body", void 0); _defineProperty(this, "graph", void 0); _defineProperty(this, "rangeBarGraph", void 0); _defineProperty(this, "viewConfigs", void 0); _defineProperty(this, "parentDom", void 0); _defineProperty(this, "syncLegend", false); _defineProperty(this, "intervalLabelsArea", void 0); _defineProperty(this, "children", []); _defineProperty(this, "currentDateWindow", []); _defineProperty(this, "id", void 0); _defineProperty(this, "operator", void 0); _defineProperty(this, "eventListeners", void 0); _defineProperty(this, "graphDateWindow", void 0); _defineProperty(this, "syncViews", false); _defineProperty(this, "dateWindowHandler", function (dateWindow, currentView) { if (_this.syncViews) { // store data _this.graphDateWindow = dateWindow; } _this.currentDateWindow = dateWindow; _this.children.forEach(function (graph) { // call updateDatewinow if (graph.id != _this.id) { graph.updateDatewinowInside(dateWindow); } }); }); _defineProperty(this, "changeView", function (view) { // change view // find view _this.viewConfigs.forEach(function (config) { config.show = false; if (config.name === view) { // update show attribute config.show = true; if (_this.syncViews && _this.graphDateWindow) { config.initRange = { start: _this.graphDateWindow[0], end: _this.graphDateWindow[1] }; } _this.operator.init(config, function (graph) { _this.graph = graph; _this.children.forEach(function (graph) { // call updateDatewinow if (graph.id != _this.id) { // update data graph.operator.refresh(); } }); }, function () { _this.children.forEach(function (graph) { // call updateDatewinow if (graph.id != _this.id) { // update data graph.operator.refresh(); } }); }); // check if we need to tell others the view changed. if (_this.eventListeners && _this.eventListeners.onViewChange) { //f call _this.eventListeners.onViewChange(_this, config); } } }); }); _defineProperty(this, "initGraph", function (ready, needSync) { _this.operator = new _GraphRenderer.GraphOperator(_this.graph, _this.rangeBarGraph, _this.graphContainer, _this.body, _this.dateWindowHandler, _this, _this.eventListeners, _this.id, needSync); // which "view" should be shown first? device or scatter? if (_this.viewConfigs) { var showView; // check if showView is undefined if (!showView && _this.viewConfigs.length > 0) { showView = _this.viewConfigs[0]; } else if (!showView && _this.viewConfigs.length === 0) { console.error("view config not found!"); return false; } if (showView) { _this.operator.init(showView, function (graph) { _this.graph = graph; if (ready) { ready(_this); } // this.isReady = true; }, function () { _this.children.forEach(function (graph) { // call updateDatewinow if (graph.id != _this.id) { // update data graph.operator.refresh(); } }); }); } } }); _defineProperty(this, "updateDatewinow", function (datewindow) { // console.log("new datewindow: ".concat(datewindow)); // update graph if (_this.graph) { var range = _this.graph.xAxisRange(); // if datewindow same then ignore that if (range[0] != datewindow[0] || range[1] != datewindow[1]) { // reload data for current graph _this.operator.update(undefined, undefined, true, datewindow); // get all children graphs then run update debugger; _this.children.forEach(function (child) { child.updateDatewinowInside(datewindow, true); }); } } }); _defineProperty(this, "updateDatewinowInside", function (datewindow, forceReload) { // update graph if (_this.graph) { // update current date-window _this.graph.updateOptions({ dateWindow: datewindow }); if (forceReload) { _this.operator.update(undefined, undefined, true, datewindow); } } }); _defineProperty(this, "setChildren", function (graphs) { _this.children = _this.children.concat(graphs); }); _defineProperty(this, "highlightSeries", function (series, duration, type) { // _this.operator.highlightSeries(series, duration, type); }); _defineProperty(this, "reloadData", function () { _this.operator.update(undefined, undefined, true); }); _defineProperty(this, "updateConfig", function (config) { // return "not enabled in this version"; }); _defineProperty(this, "clear", function () { console.warn("under developing!"); }); this.parentDom = dom; this.graphDateWindow = [0, 0]; if (eventHandlers) { this.eventListeners = eventHandlers; } console.log("need to sync views? ".concat(syncViews)); if (syncViews) { this.syncViews = true; } this.id = (Math.random() * 10000 | 0) + 1 + ''; // if id exist then change id to id if (this.parentDom.getAttribute('id')) { this.id = this.parentDom.id; } // if (this.parentDom.getAttribute("fgp-graph-id")) { this.id = this.parentDom.getAttribute("fgp-graph-id"); } var intervalsLabelsAttrs = [{ key: 'class', value: "fgp-interval-labels" }]; this.intervalLabelsArea = _GraphRenderer.DomElementOperator.createElement('div', intervalsLabelsAttrs); var buttonsAttrs = [{ key: 'class', value: "fgp-buttons" }]; var buttonsArea = _GraphRenderer.DomElementOperator.createElement('div', buttonsAttrs); var filterAttrs = [{ key: 'class', value: "fgp-filter-buttons" }]; var filterArea = _GraphRenderer.DomElementOperator.createElement('div', filterAttrs); var toolbarAreaAttrs = [{ key: 'class', value: "fgp-toolbar-area" }]; var toolbarArea = _GraphRenderer.DomElementOperator.createElement('div', toolbarAreaAttrs); // create doms var containerAttrs = [{ key: 'class', value: 'fgp-graph-container noselect' }]; this.graphContainer = _GraphRenderer.DomElementOperator.createElement('div', containerAttrs); var bodyAttrs = [{ key: 'class', value: 'fgp-graph-body' }]; this.body = _GraphRenderer.DomElementOperator.createElement('div', bodyAttrs); this.graphContainer.appendChild(this.body); this.parentDom.appendChild(this.graphContainer); this.viewConfigs = viewConfigs; // listening for div resizing....... var divResizeRo = new _resizeObserver.ResizeObserver(function (roes, observer) { roes.forEach(function (domObserverEntry) { if (_this.graph && domObserverEntry.target.className == 'fgp-graph-body') { console.log("resizing dom: ", domObserverEntry.target.className, 'if someone see a infinite loop here, please report it to author!'); if (isNaN(domObserverEntry.contentRect.width) || isNaN(domObserverEntry.contentRect.height)) {} else { // resize graph manually, because dygraph resizing base on window object. console.log("new size is: ".concat(domObserverEntry.contentRect.width, " ").concat(domObserverEntry.contentRect.height)); var evt = window.document.createEvent('UIEvents'); evt.initEvent('resize', false, false); window.dispatchEvent(evt); } } else { console.log("resizing not support for: ", domObserverEntry.target.className); } }); }); divResizeRo.observe(this.body); } /** *update datewindow for children graphs * @param datewindow * @param currentView * @private * @memberof FgpGraph */ ; exports["default"] = FgpGraph; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJGZ3BHcmFwaCIsImRvbSIsInZpZXdDb25maWdzIiwiZXZlbnRIYW5kbGVycyIsInN5bmNWaWV3cyIsImRhdGVXaW5kb3ciLCJjdXJyZW50VmlldyIsImdyYXBoRGF0ZVdpbmRvdyIsImN1cnJlbnREYXRlV2luZG93IiwiY2hpbGRyZW4iLCJmb3JFYWNoIiwiZ3JhcGgiLCJpZCIsInVwZGF0ZURhdGV3aW5vd0luc2lkZSIsInZpZXciLCJjb25maWciLCJzaG93IiwibmFtZSIsImluaXRSYW5nZSIsInN0YXJ0IiwiZW5kIiwib3BlcmF0b3IiLCJpbml0IiwicmVmcmVzaCIsImV2ZW50TGlzdGVuZXJzIiwib25WaWV3Q2hhbmdlIiwicmVhZHkiLCJuZWVkU3luYyIsIkdyYXBoT3BlcmF0b3IiLCJyYW5nZUJhckdyYXBoIiwiZ3JhcGhDb250YWluZXIiLCJib2R5IiwiZGF0ZVdpbmRvd0hhbmRsZXIiLCJzaG93VmlldyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsImRhdGV3aW5kb3ciLCJsb2ciLCJyYW5nZSIsInhBeGlzUmFuZ2UiLCJ1cGRhdGUiLCJ1bmRlZmluZWQiLCJjaGlsZCIsImZvcmNlUmVsb2FkIiwidXBkYXRlT3B0aW9ucyIsImdyYXBocyIsImNvbmNhdCIsInNlcmllcyIsImR1cmF0aW9uIiwidHlwZSIsImhpZ2hsaWdodFNlcmllcyIsIndhcm4iLCJwYXJlbnREb20iLCJNYXRoIiwicmFuZG9tIiwiZ2V0QXR0cmlidXRlIiwiaW50ZXJ2YWxzTGFiZWxzQXR0cnMiLCJrZXkiLCJ2YWx1ZSIsImludGVydmFsTGFiZWxzQXJlYSIsIkRvbUVsZW1lbnRPcGVyYXRvciIsImNyZWF0ZUVsZW1lbnQiLCJidXR0b25zQXR0cnMiLCJidXR0b25zQXJlYSIsImZpbHRlckF0dHJzIiwiZmlsdGVyQXJlYSIsInRvb2xiYXJBcmVhQXR0cnMiLCJ0b29sYmFyQXJlYSIsImNvbnRhaW5lckF0dHJzIiwiYm9keUF0dHJzIiwiYXBwZW5kQ2hpbGQiLCJkaXZSZXNpemVSbyIsIlJlc2l6ZU9ic2VydmVyIiwicm9lcyIsIm9ic2VydmVyIiwiZG9tT2JzZXJ2ZXJFbnRyeSIsInRhcmdldCIsImNsYXNzTmFtZSIsImlzTmFOIiwiY29udGVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsImV2dCIsIndpbmRvdyIsImRvY3VtZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50Iiwib2JzZXJ2ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUlBOztBQUdBOzs7Ozs7SUFFcUJBLFEsR0FnQ2pCOztBQUdBOzs7Ozs7OztBQVFBLGtCQUFZQyxHQUFaLEVBQThCQyxXQUE5QixFQUE4REMsYUFBOUQsRUFBNkZDLFNBQTdGLEVBQWtIO0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUEsc0NBN0JyRixLQTZCcUY7O0FBQUE7O0FBQUEsb0NBekIvRSxFQXlCK0U7O0FBQUEsNkNBdkI3RSxFQXVCNkU7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUEscUNBYjVFLEtBYTRFOztBQUFBLDZDQTRFdEYsVUFBQ0MsVUFBRCxFQUErQkMsV0FBL0IsRUFBNEQ7QUFFcEYsUUFBSSxLQUFJLENBQUNGLFNBQVQsRUFBb0I7QUFDaEI7QUFDQSxNQUFBLEtBQUksQ0FBQ0csZUFBTCxHQUF1QkYsVUFBdkI7QUFDSDs7QUFFRCxJQUFBLEtBQUksQ0FBQ0csaUJBQUwsR0FBeUJILFVBQXpCOztBQUNBLElBQUEsS0FBSSxDQUFDSSxRQUFMLENBQWNDLE9BQWQsQ0FBc0IsVUFBQUMsS0FBSyxFQUFJO0FBQzNCO0FBQ0EsVUFBSUEsS0FBSyxDQUFDQyxFQUFOLElBQVksS0FBSSxDQUFDQSxFQUFyQixFQUF5QjtBQUNyQkQsUUFBQUEsS0FBSyxDQUFDRSxxQkFBTixDQUE0QlIsVUFBNUI7QUFDSDtBQUNKLEtBTEQ7QUFPSCxHQTNGaUg7O0FBQUEsc0NBaUc5RixVQUFDUyxJQUFELEVBQWtCO0FBQ2xDO0FBQ0E7QUFDQSxJQUFBLEtBQUksQ0FBQ1osV0FBTCxDQUFpQlEsT0FBakIsQ0FBeUIsVUFBQUssTUFBTSxFQUFJO0FBQy9CQSxNQUFBQSxNQUFNLENBQUNDLElBQVAsR0FBYyxLQUFkOztBQUNBLFVBQUlELE1BQU0sQ0FBQ0UsSUFBUCxLQUFnQkgsSUFBcEIsRUFBMEI7QUFDdEI7QUFDQUMsUUFBQUEsTUFBTSxDQUFDQyxJQUFQLEdBQWMsSUFBZDs7QUFFQSxZQUFJLEtBQUksQ0FBQ1osU0FBTCxJQUFrQixLQUFJLENBQUNHLGVBQTNCLEVBQTRDO0FBQ3hDUSxVQUFBQSxNQUFNLENBQUNHLFNBQVAsR0FBbUI7QUFBQ0MsWUFBQUEsS0FBSyxFQUFFLEtBQUksQ0FBQ1osZUFBTCxDQUFxQixDQUFyQixDQUFSO0FBQWlDYSxZQUFBQSxHQUFHLEVBQUUsS0FBSSxDQUFDYixlQUFMLENBQXFCLENBQXJCO0FBQXRDLFdBQW5CO0FBQ0g7O0FBRUQsUUFBQSxLQUFJLENBQUNjLFFBQUwsQ0FBY0MsSUFBZCxDQUFtQlAsTUFBbkIsRUFBMkIsVUFBQ0osS0FBRCxFQUFvQjtBQUMzQyxVQUFBLEtBQUksQ0FBQ0EsS0FBTCxHQUFhQSxLQUFiOztBQUNBLFVBQUEsS0FBSSxDQUFDRixRQUFMLENBQWNDLE9BQWQsQ0FBc0IsVUFBQUMsS0FBSyxFQUFJO0FBQzNCO0FBQ0EsZ0JBQUlBLEtBQUssQ0FBQ0MsRUFBTixJQUFZLEtBQUksQ0FBQ0EsRUFBckIsRUFBeUI7QUFDckI7QUFDQUQsY0FBQUEsS0FBSyxDQUFDVSxRQUFOLENBQWVFLE9BQWY7QUFDSDtBQUNKLFdBTkQ7QUFPSCxTQVRELEVBU0csWUFBTTtBQUNMLFVBQUEsS0FBSSxDQUFDZCxRQUFMLENBQWNDLE9BQWQsQ0FBc0IsVUFBQUMsS0FBSyxFQUFJO0FBQzNCO0FBQ0EsZ0JBQUlBLEtBQUssQ0FBQ0MsRUFBTixJQUFZLEtBQUksQ0FBQ0EsRUFBckIsRUFBeUI7QUFDckI7QUFDQUQsY0FBQUEsS0FBSyxDQUFDVSxRQUFOLENBQWVFLE9BQWY7QUFDSDtBQUNKLFdBTkQ7QUFPSCxTQWpCRCxFQVJzQixDQTJCdEI7OztBQUNBLFlBQUksS0FBSSxDQUFDQyxjQUFMLElBQXVCLEtBQUksQ0FBQ0EsY0FBTCxDQUFvQkMsWUFBL0MsRUFBNkQ7QUFDekQ7QUFDQSxVQUFBLEtBQUksQ0FBQ0QsY0FBTCxDQUFvQkMsWUFBcEIsQ0FBaUMsS0FBakMsRUFBdUNWLE1BQXZDO0FBQ0g7QUFDSjtBQUNKLEtBbkNEO0FBb0NILEdBeElpSDs7QUFBQSxxQ0FnSi9GLFVBQUNXLEtBQUQsRUFBZ0NDLFFBQWhDLEVBQXVEO0FBQ3RFLElBQUEsS0FBSSxDQUFDTixRQUFMLEdBQWdCLElBQUlPLDRCQUFKLENBQWtCLEtBQUksQ0FBQ2pCLEtBQXZCLEVBQThCLEtBQUksQ0FBQ2tCLGFBQW5DLEVBQWtELEtBQUksQ0FBQ0MsY0FBdkQsRUFBdUUsS0FBSSxDQUFDQyxJQUE1RSxFQUFrRixLQUFJLENBQUNDLGlCQUF2RixFQUEwRyxLQUExRyxFQUFnSCxLQUFJLENBQUNSLGNBQXJILEVBQXFJLEtBQUksQ0FBQ1osRUFBMUksRUFBOEllLFFBQTlJLENBQWhCLENBRHNFLENBRXRFOztBQUNBLFFBQUksS0FBSSxDQUFDekIsV0FBVCxFQUFzQjtBQUNsQixVQUFJK0IsUUFBSixDQURrQixDQUVsQjs7QUFDQSxVQUFJLENBQUNBLFFBQUQsSUFBYSxLQUFJLENBQUMvQixXQUFMLENBQWlCZ0MsTUFBakIsR0FBMEIsQ0FBM0MsRUFBOEM7QUFDMUNELFFBQUFBLFFBQVEsR0FBRyxLQUFJLENBQUMvQixXQUFMLENBQWlCLENBQWpCLENBQVg7QUFDSCxPQUZELE1BRU8sSUFBSSxDQUFDK0IsUUFBRCxJQUFhLEtBQUksQ0FBQy9CLFdBQUwsQ0FBaUJnQyxNQUFqQixLQUE0QixDQUE3QyxFQUFnRDtBQUNuREMsUUFBQUEsT0FBTyxDQUFDQyxLQUFSLENBQWMsd0JBQWQ7QUFDQSxlQUFPLEtBQVA7QUFDSDs7QUFFRCxVQUFJSCxRQUFKLEVBQWM7QUFDVixRQUFBLEtBQUksQ0FBQ1osUUFBTCxDQUFjQyxJQUFkLENBQW1CVyxRQUFuQixFQUE2QixVQUFDdEIsS0FBRCxFQUFvQjtBQUM3QyxVQUFBLEtBQUksQ0FBQ0EsS0FBTCxHQUFhQSxLQUFiOztBQUNBLGNBQUllLEtBQUosRUFBVztBQUNQQSxZQUFBQSxLQUFLLENBQUMsS0FBRCxDQUFMO0FBQ0gsV0FKNEMsQ0FLN0M7O0FBQ0gsU0FORCxFQU1HLFlBQU07QUFDTCxVQUFBLEtBQUksQ0FBQ2pCLFFBQUwsQ0FBY0MsT0FBZCxDQUFzQixVQUFBQyxLQUFLLEVBQUk7QUFDM0I7QUFDQSxnQkFBSUEsS0FBSyxDQUFDQyxFQUFOLElBQVksS0FBSSxDQUFDQSxFQUFyQixFQUF5QjtBQUNyQjtBQUNBRCxjQUFBQSxLQUFLLENBQUNVLFFBQU4sQ0FBZUUsT0FBZjtBQUNIO0FBQ0osV0FORDtBQU9ILFNBZEQ7QUFlSDtBQUNKO0FBQ0osR0EvS2lIOztBQUFBLDJDQXVMekYsVUFBQ2MsVUFBRCxFQUFrQztBQUN2RDtBQUNBRixJQUFBQSxPQUFPLENBQUNHLEdBQVIsMkJBQStCRCxVQUEvQixHQUZ1RCxDQUl2RDs7QUFDQSxRQUFJLEtBQUksQ0FBQzFCLEtBQVQsRUFBZ0I7QUFDWixVQUFNNEIsS0FBb0IsR0FBRyxLQUFJLENBQUM1QixLQUFMLENBQVc2QixVQUFYLEVBQTdCLENBRFksQ0FFWjs7O0FBQ0EsVUFBSUQsS0FBSyxDQUFDLENBQUQsQ0FBTCxJQUFZRixVQUFVLENBQUMsQ0FBRCxDQUF0QixJQUE2QkUsS0FBSyxDQUFDLENBQUQsQ0FBTCxJQUFZRixVQUFVLENBQUMsQ0FBRCxDQUF2RCxFQUE0RDtBQUN4RDtBQUNBLFFBQUEsS0FBSSxDQUFDaEIsUUFBTCxDQUFjb0IsTUFBZCxDQUFxQkMsU0FBckIsRUFBZ0NBLFNBQWhDLEVBQTJDLElBQTNDLEVBQWlETCxVQUFqRCxFQUZ3RCxDQUd4RDs7O0FBQ0E7O0FBQ0EsUUFBQSxLQUFJLENBQUM1QixRQUFMLENBQWNDLE9BQWQsQ0FBc0IsVUFBQWlDLEtBQUssRUFBSTtBQUMzQkEsVUFBQUEsS0FBSyxDQUFDOUIscUJBQU4sQ0FBNEJ3QixVQUE1QixFQUF3QyxJQUF4QztBQUNILFNBRkQ7QUFHSDtBQUNKO0FBQ0osR0F6TWlIOztBQUFBLGlEQTJNMUYsVUFBQ0EsVUFBRCxFQUErQk8sV0FBL0IsRUFBeUQ7QUFDN0U7QUFDQSxRQUFJLEtBQUksQ0FBQ2pDLEtBQVQsRUFBZ0I7QUFDWjtBQUNBLE1BQUEsS0FBSSxDQUFDQSxLQUFMLENBQVdrQyxhQUFYLENBQXlCO0FBQ3JCeEMsUUFBQUEsVUFBVSxFQUFFZ0M7QUFEUyxPQUF6Qjs7QUFHQSxVQUFJTyxXQUFKLEVBQWlCO0FBQ2IsUUFBQSxLQUFJLENBQUN2QixRQUFMLENBQWNvQixNQUFkLENBQXFCQyxTQUFyQixFQUFnQ0EsU0FBaEMsRUFBMkMsSUFBM0MsRUFBaURMLFVBQWpEO0FBQ0g7QUFDSjtBQUVKLEdBdk5pSDs7QUFBQSx1Q0ErTjdGLFVBQUNTLE1BQUQsRUFBNkI7QUFDOUMsSUFBQSxLQUFJLENBQUNyQyxRQUFMLEdBQWdCLEtBQUksQ0FBQ0EsUUFBTCxDQUFjc0MsTUFBZCxDQUFxQkQsTUFBckIsQ0FBaEI7QUFDSCxHQWpPaUg7O0FBQUEsMkNBNE96RixVQUFDRSxNQUFELEVBQW1CQyxRQUFuQixFQUFxQ0MsSUFBckMsRUFBdUQ7QUFDNUU7QUFDQSxJQUFBLEtBQUksQ0FBQzdCLFFBQUwsQ0FBYzhCLGVBQWQsQ0FBOEJILE1BQTlCLEVBQXNDQyxRQUF0QyxFQUFnREMsSUFBaEQ7QUFDSCxHQS9PaUg7O0FBQUEsc0NBb1A5RixZQUFNO0FBQ3RCLElBQUEsS0FBSSxDQUFDN0IsUUFBTCxDQUFjb0IsTUFBZCxDQUFxQkMsU0FBckIsRUFBZ0NBLFNBQWhDLEVBQTJDLElBQTNDO0FBQ0gsR0F0UGlIOztBQUFBLHdDQTRQNUYsVUFBQzNCLE1BQUQsRUFBeUI7QUFDM0M7QUFDQSxXQUFPLDZCQUFQO0FBQ0gsR0EvUGlIOztBQUFBLGlDQW9RbkcsWUFBTTtBQUNqQm9CLElBQUFBLE9BQU8sQ0FBQ2lCLElBQVIsQ0FBYSxtQkFBYjtBQUNILEdBdFFpSDs7QUFFOUcsT0FBS0MsU0FBTCxHQUFpQnBELEdBQWpCO0FBQ0EsT0FBS00sZUFBTCxHQUF1QixDQUFDLENBQUQsRUFBSSxDQUFKLENBQXZCOztBQUNBLE1BQUlKLGFBQUosRUFBbUI7QUFDZixTQUFLcUIsY0FBTCxHQUFzQnJCLGFBQXRCO0FBQ0g7O0FBQ0RnQyxFQUFBQSxPQUFPLENBQUNHLEdBQVIsK0JBQW1DbEMsU0FBbkM7O0FBQ0EsTUFBSUEsU0FBSixFQUFlO0FBQ1gsU0FBS0EsU0FBTCxHQUFpQixJQUFqQjtBQUNIOztBQUVELE9BQUtRLEVBQUwsR0FBVSxDQUFDMEMsSUFBSSxDQUFDQyxNQUFMLEtBQWdCLEtBQWhCLEdBQXdCLENBQXpCLElBQThCLENBQTlCLEdBQWtDLEVBQTVDLENBWjhHLENBYzlHOztBQUNBLE1BQUksS0FBS0YsU0FBTCxDQUFlRyxZQUFmLENBQTRCLElBQTVCLENBQUosRUFBdUM7QUFDbkMsU0FBSzVDLEVBQUwsR0FBVSxLQUFLeUMsU0FBTCxDQUFlekMsRUFBekI7QUFDSCxHQWpCNkcsQ0FtQjlHOzs7QUFDQSxNQUFJLEtBQUt5QyxTQUFMLENBQWVHLFlBQWYsQ0FBNEIsY0FBNUIsQ0FBSixFQUFpRDtBQUM3QyxTQUFLNUMsRUFBTCxHQUFrQixLQUFLeUMsU0FBTCxDQUFlRyxZQUFmLENBQTRCLGNBQTVCLENBQWxCO0FBQ0g7O0FBR0QsTUFBSUMsb0JBQXFDLEdBQUcsQ0FBQztBQUFDQyxJQUFBQSxHQUFHLEVBQUUsT0FBTjtBQUFlQyxJQUFBQSxLQUFLLEVBQUU7QUFBdEIsR0FBRCxDQUE1QztBQUNBLE9BQUtDLGtCQUFMLEdBQTBCQyxrQ0FBbUJDLGFBQW5CLENBQWlDLEtBQWpDLEVBQXdDTCxvQkFBeEMsQ0FBMUI7QUFFQSxNQUFJTSxZQUE2QixHQUFHLENBQUM7QUFBQ0wsSUFBQUEsR0FBRyxFQUFFLE9BQU47QUFBZUMsSUFBQUEsS0FBSyxFQUFFO0FBQXRCLEdBQUQsQ0FBcEM7O0FBQ0EsTUFBTUssV0FBVyxHQUFHSCxrQ0FBbUJDLGFBQW5CLENBQWlDLEtBQWpDLEVBQXdDQyxZQUF4QyxDQUFwQjs7QUFFQSxNQUFJRSxXQUE0QixHQUFHLENBQUM7QUFBQ1AsSUFBQUEsR0FBRyxFQUFFLE9BQU47QUFBZUMsSUFBQUEsS0FBSyxFQUFFO0FBQXRCLEdBQUQsQ0FBbkM7O0FBQ0EsTUFBTU8sVUFBVSxHQUFHTCxrQ0FBbUJDLGFBQW5CLENBQWlDLEtBQWpDLEVBQXdDRyxXQUF4QyxDQUFuQjs7QUFFQSxNQUFJRSxnQkFBaUMsR0FBRyxDQUFDO0FBQUNULElBQUFBLEdBQUcsRUFBRSxPQUFOO0FBQWVDLElBQUFBLEtBQUssRUFBRTtBQUF0QixHQUFELENBQXhDOztBQUNBLE1BQU1TLFdBQVcsR0FBR1Asa0NBQW1CQyxhQUFuQixDQUFpQyxLQUFqQyxFQUF3Q0ssZ0JBQXhDLENBQXBCLENBbkM4RyxDQXNDOUc7OztBQUNBLE1BQUlFLGNBQStCLEdBQUcsQ0FBQztBQUFDWCxJQUFBQSxHQUFHLEVBQUUsT0FBTjtBQUFlQyxJQUFBQSxLQUFLLEVBQUU7QUFBdEIsR0FBRCxDQUF0QztBQUNBLE9BQUs3QixjQUFMLEdBQXNCK0Isa0NBQW1CQyxhQUFuQixDQUFpQyxLQUFqQyxFQUF3Q08sY0FBeEMsQ0FBdEI7QUFHQSxNQUFJQyxTQUEwQixHQUFHLENBQUM7QUFBQ1osSUFBQUEsR0FBRyxFQUFFLE9BQU47QUFBZUMsSUFBQUEsS0FBSyxFQUFFO0FBQXRCLEdBQUQsQ0FBakM7QUFDQSxPQUFLNUIsSUFBTCxHQUFZOEIsa0NBQW1CQyxhQUFuQixDQUFpQyxLQUFqQyxFQUF3Q1EsU0FBeEMsQ0FBWjtBQUNBLE9BQUt4QyxjQUFMLENBQW9CeUMsV0FBcEIsQ0FBZ0MsS0FBS3hDLElBQXJDO0FBQ0EsT0FBS3NCLFNBQUwsQ0FBZWtCLFdBQWYsQ0FBMkIsS0FBS3pDLGNBQWhDO0FBQ0EsT0FBSzVCLFdBQUwsR0FBbUJBLFdBQW5CLENBL0M4RyxDQWdEOUc7O0FBQ0EsTUFBTXNFLFdBQVcsR0FBRyxJQUFJQyw4QkFBSixDQUFtQixVQUFDQyxJQUFELEVBQThCQyxRQUE5QixFQUEyQztBQUM5RUQsSUFBQUEsSUFBSSxDQUFDaEUsT0FBTCxDQUFhLFVBQUNrRSxnQkFBRCxFQUFzQjtBQUMvQixVQUFJLEtBQUksQ0FBQ2pFLEtBQUwsSUFBY2lFLGdCQUFnQixDQUFDQyxNQUFqQixDQUF3QkMsU0FBeEIsSUFBcUMsZ0JBQXZELEVBQXlFO0FBQ3JFM0MsUUFBQUEsT0FBTyxDQUFDRyxHQUFSLENBQVksZ0JBQVosRUFBOEJzQyxnQkFBZ0IsQ0FBQ0MsTUFBakIsQ0FBd0JDLFNBQXRELEVBQWlFLGtFQUFqRTs7QUFDQSxZQUFJQyxLQUFLLENBQUNILGdCQUFnQixDQUFDSSxXQUFqQixDQUE2QkMsS0FBOUIsQ0FBTCxJQUE2Q0YsS0FBSyxDQUFDSCxnQkFBZ0IsQ0FBQ0ksV0FBakIsQ0FBNkJFLE1BQTlCLENBQXRELEVBQTZGLENBQzVGLENBREQsTUFDTztBQUNIO0FBQ0EvQyxVQUFBQSxPQUFPLENBQUNHLEdBQVIsd0JBQTRCc0MsZ0JBQWdCLENBQUNJLFdBQWpCLENBQTZCQyxLQUF6RCxjQUFrRUwsZ0JBQWdCLENBQUNJLFdBQWpCLENBQTZCRSxNQUEvRjtBQUNBLGNBQUlDLEdBQUcsR0FBR0MsTUFBTSxDQUFDQyxRQUFQLENBQWdCQyxXQUFoQixDQUE0QixVQUE1QixDQUFWO0FBQ0FILFVBQUFBLEdBQUcsQ0FBQ0ksU0FBSixDQUFjLFFBQWQsRUFBd0IsS0FBeEIsRUFBK0IsS0FBL0I7QUFDQUgsVUFBQUEsTUFBTSxDQUFDSSxhQUFQLENBQXFCTCxHQUFyQjtBQUNIO0FBQ0osT0FWRCxNQVVPO0FBQ0hoRCxRQUFBQSxPQUFPLENBQUNHLEdBQVIsQ0FBWSw0QkFBWixFQUEwQ3NDLGdCQUFnQixDQUFDQyxNQUFqQixDQUF3QkMsU0FBbEU7QUFDSDtBQUNKLEtBZEQ7QUFlSCxHQWhCbUIsQ0FBcEI7QUFpQkFOLEVBQUFBLFdBQVcsQ0FBQ2lCLE9BQVosQ0FBb0IsS0FBSzFELElBQXpCO0FBQ0g7QUFFRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEeWdyYXBoIGZyb20gXCJkeWdyYXBoc1wiO1xuXG5pbXBvcnQge0RvbUF0dHJzLCBWaWV3Q29uZmlnLCBWaWV3T3B0aW9uc30gZnJvbSBcIi4vbWV0YWRhdGEvY29uZmlndXJhdGlvbnNcIjtcblxuaW1wb3J0IHtSZXNpemVPYnNlcnZlciwgUmVzaXplT2JzZXJ2ZXJFbnRyeX0gZnJvbSAnQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXInO1xuXG5pbXBvcnQge0V2ZW50SGFuZGxlcnN9IGZyb20gJy4vbWV0YWRhdGEvZ3JhcGhvcHRpb25zJztcbmltcG9ydCB7RG9tRWxlbWVudE9wZXJhdG9yLCBHcmFwaE9wZXJhdG9yfSBmcm9tIFwiLi93aWRnZXRzL0dyYXBoUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmdwR3JhcGgge1xuXG4gICAgZ3JhcGhDb250YWluZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgYm9keTogSFRNTEVsZW1lbnQ7XG5cbiAgICBwdWJsaWMgZ3JhcGghOiBEeWdyYXBoO1xuXG4gICAgcHJpdmF0ZSByYW5nZUJhckdyYXBoITogRHlncmFwaDtcblxuICAgIHZpZXdDb25maWdzOiBBcnJheTxWaWV3Q29uZmlnPjtcblxuICAgIHByaXZhdGUgcGFyZW50RG9tOiBIVE1MRWxlbWVudDtcblxuICAgIHB1YmxpYyBzeW5jTGVnZW5kOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBpbnRlcnZhbExhYmVsc0FyZWE6IEhUTUxFbGVtZW50O1xuXG4gICAgcHVibGljIGNoaWxkcmVuOiBBcnJheTxGZ3BHcmFwaD4gPSBbXTtcblxuICAgIHB1YmxpYyBjdXJyZW50RGF0ZVdpbmRvdzogbnVtYmVyW10gPSBbXTtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgb3BlcmF0b3IhOiBHcmFwaE9wZXJhdG9yO1xuXG4gICAgZXZlbnRMaXN0ZW5lcnM/OiBFdmVudEhhbmRsZXJzO1xuXG4gICAgcHJpdmF0ZSBncmFwaERhdGVXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHN5bmNWaWV3czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gcHJpdmF0ZSBpc1JlYWR5OiBib29sZWFuID0gZmFsc2U7XG5cblxuICAgIC8qKlxuICAgICAqQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBGZ3BHcmFwaC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkb21cbiAgICAgKiBncmFwaCBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge0FycmF5PFZpZXdDb25maWc+fSB2aWV3Q29uZmlnc1xuICAgICAqIGdyYXBoIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihkb206IEhUTUxFbGVtZW50LCB2aWV3Q29uZmlnczogQXJyYXk8Vmlld0NvbmZpZz4sIGV2ZW50SGFuZGxlcnM/OiBFdmVudEhhbmRsZXJzLCBzeW5jVmlld3M/OiBib29sZWFuKSB7XG5cbiAgICAgICAgdGhpcy5wYXJlbnREb20gPSBkb207XG4gICAgICAgIHRoaXMuZ3JhcGhEYXRlV2luZG93ID0gWzAsIDBdO1xuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycykge1xuICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVycyA9IGV2ZW50SGFuZGxlcnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYG5lZWQgdG8gc3luYyB2aWV3cz8gJHtzeW5jVmlld3N9YCk7XG4gICAgICAgIGlmIChzeW5jVmlld3MpIHtcbiAgICAgICAgICAgIHRoaXMuc3luY1ZpZXdzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSAoTWF0aC5yYW5kb20oKSAqIDEwMDAwIHwgMCkgKyAxICsgJyc7XG5cbiAgICAgICAgLy8gaWYgaWQgZXhpc3QgdGhlbiBjaGFuZ2UgaWQgdG8gaWRcbiAgICAgICAgaWYgKHRoaXMucGFyZW50RG9tLmdldEF0dHJpYnV0ZSgnaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucGFyZW50RG9tLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHRoaXMucGFyZW50RG9tLmdldEF0dHJpYnV0ZShcImZncC1ncmFwaC1pZFwiKSkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IDxzdHJpbmc+dGhpcy5wYXJlbnREb20uZ2V0QXR0cmlidXRlKFwiZmdwLWdyYXBoLWlkXCIpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgaW50ZXJ2YWxzTGFiZWxzQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogXCJmZ3AtaW50ZXJ2YWwtbGFiZWxzXCJ9XTtcbiAgICAgICAgdGhpcy5pbnRlcnZhbExhYmVsc0FyZWEgPSBEb21FbGVtZW50T3BlcmF0b3IuY3JlYXRlRWxlbWVudCgnZGl2JywgaW50ZXJ2YWxzTGFiZWxzQXR0cnMpO1xuXG4gICAgICAgIGxldCBidXR0b25zQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogXCJmZ3AtYnV0dG9uc1wifV07XG4gICAgICAgIGNvbnN0IGJ1dHRvbnNBcmVhID0gRG9tRWxlbWVudE9wZXJhdG9yLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIGJ1dHRvbnNBdHRycyk7XG5cbiAgICAgICAgbGV0IGZpbHRlckF0dHJzOiBBcnJheTxEb21BdHRycz4gPSBbe2tleTogJ2NsYXNzJywgdmFsdWU6IFwiZmdwLWZpbHRlci1idXR0b25zXCJ9XTtcbiAgICAgICAgY29uc3QgZmlsdGVyQXJlYSA9IERvbUVsZW1lbnRPcGVyYXRvci5jcmVhdGVFbGVtZW50KCdkaXYnLCBmaWx0ZXJBdHRycyk7XG5cbiAgICAgICAgbGV0IHRvb2xiYXJBcmVhQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogXCJmZ3AtdG9vbGJhci1hcmVhXCJ9XTtcbiAgICAgICAgY29uc3QgdG9vbGJhckFyZWEgPSBEb21FbGVtZW50T3BlcmF0b3IuY3JlYXRlRWxlbWVudCgnZGl2JywgdG9vbGJhckFyZWFBdHRycyk7XG5cblxuICAgICAgICAvLyBjcmVhdGUgZG9tc1xuICAgICAgICBsZXQgY29udGFpbmVyQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogJ2ZncC1ncmFwaC1jb250YWluZXIgbm9zZWxlY3QnfV07XG4gICAgICAgIHRoaXMuZ3JhcGhDb250YWluZXIgPSBEb21FbGVtZW50T3BlcmF0b3IuY3JlYXRlRWxlbWVudCgnZGl2JywgY29udGFpbmVyQXR0cnMpO1xuXG5cbiAgICAgICAgbGV0IGJvZHlBdHRyczogQXJyYXk8RG9tQXR0cnM+ID0gW3trZXk6ICdjbGFzcycsIHZhbHVlOiAnZmdwLWdyYXBoLWJvZHknfV07XG4gICAgICAgIHRoaXMuYm9keSA9IERvbUVsZW1lbnRPcGVyYXRvci5jcmVhdGVFbGVtZW50KCdkaXYnLCBib2R5QXR0cnMpO1xuICAgICAgICB0aGlzLmdyYXBoQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuYm9keSk7XG4gICAgICAgIHRoaXMucGFyZW50RG9tLmFwcGVuZENoaWxkKHRoaXMuZ3JhcGhDb250YWluZXIpO1xuICAgICAgICB0aGlzLnZpZXdDb25maWdzID0gdmlld0NvbmZpZ3M7XG4gICAgICAgIC8vIGxpc3RlbmluZyBmb3IgZGl2IHJlc2l6aW5nLi4uLi4uLlxuICAgICAgICBjb25zdCBkaXZSZXNpemVSbyA9IG5ldyBSZXNpemVPYnNlcnZlcigocm9lczogUmVzaXplT2JzZXJ2ZXJFbnRyeVtdLCBvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgcm9lcy5mb3JFYWNoKChkb21PYnNlcnZlckVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JhcGggJiYgZG9tT2JzZXJ2ZXJFbnRyeS50YXJnZXQuY2xhc3NOYW1lID09ICdmZ3AtZ3JhcGgtYm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXNpemluZyBkb206IFwiLCBkb21PYnNlcnZlckVudHJ5LnRhcmdldC5jbGFzc05hbWUsICdpZiBzb21lb25lIHNlZSBhIGluZmluaXRlIGxvb3AgaGVyZSwgcGxlYXNlIHJlcG9ydCBpdCB0byBhdXRob3IhJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihkb21PYnNlcnZlckVudHJ5LmNvbnRlbnRSZWN0LndpZHRoKSB8fCBpc05hTihkb21PYnNlcnZlckVudHJ5LmNvbnRlbnRSZWN0LmhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2l6ZSBncmFwaCBtYW51YWxseSwgYmVjYXVzZSBkeWdyYXBoIHJlc2l6aW5nIGJhc2Ugb24gd2luZG93IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBuZXcgc2l6ZSBpczogJHtkb21PYnNlcnZlckVudHJ5LmNvbnRlbnRSZWN0LndpZHRofSAke2RvbU9ic2VydmVyRW50cnkuY29udGVudFJlY3QuaGVpZ2h0fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV2dCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudCgnVUlFdmVudHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5pbml0RXZlbnQoJ3Jlc2l6ZScsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXNpemluZyBub3Qgc3VwcG9ydCBmb3I6IFwiLCBkb21PYnNlcnZlckVudHJ5LnRhcmdldC5jbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZGl2UmVzaXplUm8ub2JzZXJ2ZSh0aGlzLmJvZHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqdXBkYXRlIGRhdGV3aW5kb3cgZm9yIGNoaWxkcmVuIGdyYXBoc1xuICAgICAqIEBwYXJhbSBkYXRld2luZG93XG4gICAgICogQHBhcmFtIGN1cnJlbnRWaWV3XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGRhdGVXaW5kb3dIYW5kbGVyID0gKGRhdGVXaW5kb3c6IFtudW1iZXIsIG51bWJlcl0sIGN1cnJlbnRWaWV3PzogVmlld0NvbmZpZykgPT4ge1xuXG4gICAgICAgIGlmICh0aGlzLnN5bmNWaWV3cykge1xuICAgICAgICAgICAgLy8gc3RvcmUgZGF0YVxuICAgICAgICAgICAgdGhpcy5ncmFwaERhdGVXaW5kb3cgPSBkYXRlV2luZG93O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50RGF0ZVdpbmRvdyA9IGRhdGVXaW5kb3c7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChncmFwaCA9PiB7XG4gICAgICAgICAgICAvLyBjYWxsIHVwZGF0ZURhdGV3aW5vd1xuICAgICAgICAgICAgaWYgKGdyYXBoLmlkICE9IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICBncmFwaC51cGRhdGVEYXRld2lub3dJbnNpZGUoZGF0ZVdpbmRvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGZ1bmMgZm9yIHN3aXRjaGluZyB2aWV3XG4gICAgICogQHBhcmFtIHZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hhbmdlVmlldyA9ICh2aWV3OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY2hhbmdlIHZpZXdcbiAgICAgICAgLy8gZmluZCB2aWV3XG4gICAgICAgIHRoaXMudmlld0NvbmZpZ3MuZm9yRWFjaChjb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLnNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjb25maWcubmFtZSA9PT0gdmlldykge1xuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzaG93IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbmZpZy5zaG93ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN5bmNWaWV3cyAmJiB0aGlzLmdyYXBoRGF0ZVdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuaW5pdFJhbmdlID0ge3N0YXJ0OiB0aGlzLmdyYXBoRGF0ZVdpbmRvd1swXSwgZW5kOiB0aGlzLmdyYXBoRGF0ZVdpbmRvd1sxXX07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRvci5pbml0KGNvbmZpZywgKGdyYXBoOiBEeWdyYXBoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGdyYXBoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdXBkYXRlRGF0ZXdpbm93XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhcGguaWQgIT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgub3BlcmF0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChncmFwaCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHVwZGF0ZURhdGV3aW5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyYXBoLmlkICE9IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLm9wZXJhdG9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHRlbGwgb3RoZXJzIHRoZSB2aWV3IGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXZlbnRMaXN0ZW5lcnMgJiYgdGhpcy5ldmVudExpc3RlbmVycy5vblZpZXdDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9mIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5vblZpZXdDaGFuZ2UodGhpcywgY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBpbml0IGdyYXBoIHdpdGggY29uZmlndXJhdGlvblxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdEdyYXBoID0gKHJlYWR5PzogKGc6IEZncEdyYXBoKSA9PiB2b2lkLCBuZWVkU3luYz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG5ldyBHcmFwaE9wZXJhdG9yKHRoaXMuZ3JhcGgsIHRoaXMucmFuZ2VCYXJHcmFwaCwgdGhpcy5ncmFwaENvbnRhaW5lciwgdGhpcy5ib2R5LCB0aGlzLmRhdGVXaW5kb3dIYW5kbGVyLCB0aGlzLCB0aGlzLmV2ZW50TGlzdGVuZXJzLCB0aGlzLmlkLCBuZWVkU3luYyk7XG4gICAgICAgIC8vIHdoaWNoIFwidmlld1wiIHNob3VsZCBiZSBzaG93biBmaXJzdD8gZGV2aWNlIG9yIHNjYXR0ZXI/XG4gICAgICAgIGlmICh0aGlzLnZpZXdDb25maWdzKSB7XG4gICAgICAgICAgICBsZXQgc2hvd1ZpZXc6IFZpZXdDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBzaG93VmlldyBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghc2hvd1ZpZXcgJiYgdGhpcy52aWV3Q29uZmlncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2hvd1ZpZXcgPSB0aGlzLnZpZXdDb25maWdzWzBdO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc2hvd1ZpZXcgJiYgdGhpcy52aWV3Q29uZmlncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwidmlldyBjb25maWcgbm90IGZvdW5kIVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzaG93Vmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0b3IuaW5pdChzaG93VmlldywgKGdyYXBoOiBEeWdyYXBoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkeSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGdyYXBoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdXBkYXRlRGF0ZXdpbm93XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhcGguaWQgIT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgub3BlcmF0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqdXBkYXRlIGN1cnJyZW50IGdyYXBoIGRhdGV3aW5kb3dcbiAgICAgKiBAcGFyYW0gZGF0ZXdpbmRvd1xuICAgICAqIEBtZW1iZXJvZiBGZ3BHcmFwaFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVEYXRld2lub3cgPSAoZGF0ZXdpbmRvdzogW251bWJlciwgbnVtYmVyXSkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICBjb25zb2xlLmxvZyhgbmV3IGRhdGV3aW5kb3c6ICR7ZGF0ZXdpbmRvd31gKTtcblxuICAgICAgICAvLyB1cGRhdGUgZ3JhcGhcbiAgICAgICAgaWYgKHRoaXMuZ3JhcGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBBcnJheTxudW1iZXI+ID0gdGhpcy5ncmFwaC54QXhpc1JhbmdlKCk7XG4gICAgICAgICAgICAvLyBpZiBkYXRld2luZG93IHNhbWUgdGhlbiBpZ25vcmUgdGhhdFxuICAgICAgICAgICAgaWYgKHJhbmdlWzBdICE9IGRhdGV3aW5kb3dbMF0gfHwgcmFuZ2VbMV0gIT0gZGF0ZXdpbmRvd1sxXSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbG9hZCBkYXRhIGZvciBjdXJyZW50IGdyYXBoXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRvci51cGRhdGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIGRhdGV3aW5kb3cpO1xuICAgICAgICAgICAgICAgIC8vIGdldCBhbGwgY2hpbGRyZW4gZ3JhcGhzIHRoZW4gcnVuIHVwZGF0ZVxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRGF0ZXdpbm93SW5zaWRlKGRhdGV3aW5kb3csIHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHVwZGF0ZURhdGV3aW5vd0luc2lkZSA9IChkYXRld2luZG93OiBbbnVtYmVyLCBudW1iZXJdLCBmb3JjZVJlbG9hZD86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgLy8gdXBkYXRlIGdyYXBoXG4gICAgICAgIGlmICh0aGlzLmdyYXBoKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgY3VycmVudCBkYXRlLXdpbmRvd1xuICAgICAgICAgICAgdGhpcy5ncmFwaC51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBkYXRlV2luZG93OiBkYXRld2luZG93XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3JjZVJlbG9hZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0b3IudXBkYXRlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlLCBkYXRld2luZG93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqYmluZCBjaGlsZHJlbiBncmFwaHNcbiAgICAgKiBAcGFyYW0gZ3JhcGhzXG4gICAgICogY2hpbGRyZW4gZ3JhcGhzXG4gICAgICogQG1lbWJlcm9mIEZncEdyYXBoXG4gICAgICovXG4gICAgcHVibGljIHNldENoaWxkcmVuID0gKGdyYXBoczogQXJyYXk8RmdwR3JhcGg+KSA9PiB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLmNvbmNhdChncmFwaHMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBoaWdobGlnaHQgbGluZSBvbiBncmFwaFxuICAgICAqIEBwYXJhbSBzZXJpZXNcbiAgICAgKiBuYW1lIG9mIGxpbmVzXG4gICAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAgICogdW5oaWdobGlnaHQgYWZ0ZXIgPGR1cmF0aW9uPiBzZWNvbmRzICAwIG1lYW5zIGhpZ2hsaWdodCBmb3JldmVyXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlnaGxpZ2h0U2VyaWVzID0gKHNlcmllczogc3RyaW5nW10sIGR1cmF0aW9uOiBudW1iZXIsIHR5cGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5vcGVyYXRvci5oaWdobGlnaHRTZXJpZXMoc2VyaWVzLCBkdXJhdGlvbiwgdHlwZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHJlbG9hZCBkYXRhIGZvciBncmFwaC4gYmFzZSBvbiBzZXJpZXMgbm90IGNoYW5nZWQhXG4gICAgICovXG4gICAgcHVibGljIHJlbG9hZERhdGEgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMub3BlcmF0b3IudXBkYXRlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogZG8gaXQgbGF0ZXJcbiAgICAgKiBAcGFyYW0gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUNvbmZpZyA9IChjb25maWc6IFZpZXdPcHRpb25zKSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBcIm5vdCBlbmFibGVkIGluIHRoaXMgdmVyc2lvblwiO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjbGVhciBncmFwaFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhciA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKFwidW5kZXIgZGV2ZWxvcGluZyFcIilcbiAgICB9O1xuXG59XG4iXX0=