UNPKG

cytoscape-angular

Version:
231 lines 23.7 kB
import { Component, Input, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "primeng/progressspinner"; const _c0 = ["cyGraph"]; function CytoscapeGraphComponent_p_progressSpinner_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "p-progressSpinner", 3); } } /** * The API is a little odd to provide flexibility. * EITHER bind to cyOptions (type CytoscapeOptions), to control the options yourself * OR this component will build a CytoscapeOptions internally by using all the other inputs. * If cyOptions is supplied, all other inputs are ignored. * The cyOptions container (HTML element) is always ignored and set internally. */ export class CytoscapeGraphComponent { constructor() { this.debug = false; this.showToolbar = true; this.loading = false; } ngOnChanges(changes) { console.log('cytoscape graph component ngOnChanges. changes:', JSON.stringify(changes)); if (changes["style"]) { console.log('changes["style"]:', JSON.stringify(changes["style"])); this.runWhileLoading(this.updateStyles.bind(this)); } } centerElements(selector) { if (!this.cy) { return; } const elems = this.cy.$(selector); this.cy.center(elems); } zoomToElement(selector, level = 3) { var _a, _b; let position = (_b = (_a = this.cy) === null || _a === void 0 ? void 0 : _a.$(selector)) === null || _b === void 0 ? void 0 : _b.position(); if (!position) { console.warn(`Cannot zoom to ${selector}`); } this.cy.zoom({ level: level, position: position }); } render() { this.runWhileLoading(this.rerender.bind(this)); } runWhileLoading(f) { this.loading = true; setTimeout(() => { f(); setTimeout(() => { this.loading = false; }, 30); }, 0); } updateStyles() { if (this.cy && this.style) { this.cy.style(this.style); } } rerender() { //TODO : this takes a heavy-handed approach, refine for performance if (!this.cyGraph) { console.warn(`No cyGraph found`); return; } const cyOptions = this.cyOptions || { // ignored, use nodes and edges // elements: this.elements, autolock: this.autolock, autoungrabify: this.autoungrabify, autounselectify: this.autounselectify, boxSelectionEnabled: this.boxSelectionEnabled, container: this.cyGraph.nativeElement, desktopTapThreshold: this.desktopTapThreshold, hideEdgesOnViewport: this.hideEdgesOnViewport, hideLabelsOnViewport: this.hideLabelsOnViewport, layout: this.layoutOptions, maxZoom: this.maxZoom, minZoom: this.minZoom, motionBlur: this.motionBlur, motionBlurOpacity: this.motionBlurOpacity, pan: this.pan, panningEnabled: this.panningEnabled, pixelRatio: this.pixelRatio, selectionType: this.selectionType, style: this.style, styleEnabled: this.styleEnabled, textureOnViewport: this.textureOnViewport, touchTapThreshold: this.touchTapThreshold, userPanningEnabled: this.userPanningEnabled, userZoomingEnabled: this.userZoomingEnabled, wheelSensitivity: this.wheelSensitivity, zoomingEnabled: this.zoomingEnabled, zoom: this.zoom, }; // TODO do reset() instead? this.cy = cytoscape(cyOptions); this.cy.startBatch(); this.cy.boxSelectionEnabled(this.boxSelectionEnabled); this.cy.nodes().remove(); this.cy.edges().remove(); if (this.nodes) { this.cy.add(this.nodes); } if (this.edges) { this.cy.add(this.edges); } this.cy.endBatch(); if (this.layoutOptions) { this.cy.layout(this.layoutOptions).run(); } } } CytoscapeGraphComponent.ɵfac = function CytoscapeGraphComponent_Factory(t) { return new (t || CytoscapeGraphComponent)(); }; CytoscapeGraphComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CytoscapeGraphComponent, selectors: [["cytoscape-graph"]], viewQuery: function CytoscapeGraphComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.cyGraph = _t.first); } }, inputs: { debug: "debug", nodes: "nodes", edges: "edges", autolock: "autolock", autoungrabify: "autoungrabify", autounselectify: "autounselectify", boxSelectionEnabled: "boxSelectionEnabled", desktopTapThreshold: "desktopTapThreshold", hideEdgesOnViewport: "hideEdgesOnViewport", hideLabelsOnViewport: "hideLabelsOnViewport", layoutOptions: "layoutOptions", maxZoom: "maxZoom", minZoom: "minZoom", motionBlur: "motionBlur", motionBlurOpacity: "motionBlurOpacity", pan: "pan", panningEnabled: "panningEnabled", pixelRatio: "pixelRatio", selectionType: "selectionType", style: "style", styleEnabled: "styleEnabled", textureOnViewport: "textureOnViewport", touchTapThreshold: "touchTapThreshold", userPanningEnabled: "userPanningEnabled", userZoomingEnabled: "userZoomingEnabled", wheelSensitivity: "wheelSensitivity", zoom: "zoom", zoomingEnabled: "zoomingEnabled", showToolbar: "showToolbar" }, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 1, consts: [["class", "spinner", "strokeWidth", "4", "fill", "#EEEEEE", "animationDuration", ".5s", 4, "ngIf"], [1, "graphWrapper"], ["cyGraph", ""], ["strokeWidth", "4", "fill", "#EEEEEE", "animationDuration", ".5s", 1, "spinner"]], template: function CytoscapeGraphComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, CytoscapeGraphComponent_p_progressSpinner_0_Template, 1, 0, "p-progressSpinner", 0); i0.ɵɵelement(1, "div", 1, 2); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.loading); } }, directives: [i1.NgIf, i2.ProgressSpinner], styles: [".spinner[_ngcontent-%COMP%] {\n position: absolute;\n left: '350px';\n z-index: 10;\n width: '250px';\n height: '250px';\n }\n @keyframes ui-progress-spinner-color {\n 100%,\n 0% {\n stroke: #d62d20;\n }\n 40% {\n stroke: #0057e7;\n }\n 66% {\n stroke: #008744;\n }\n 80%,\n 90% {\n stroke: #ffa700;\n }\n }\n .graphWrapper[_ngcontent-%COMP%] {\n height: 100%;\n width: 100%;\n }"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CytoscapeGraphComponent, [{ type: Component, args: [{ selector: 'cytoscape-graph', template: ` <p-progressSpinner *ngIf="loading" class="spinner" strokeWidth="4" fill="#EEEEEE" animationDuration=".5s"></p-progressSpinner> <div #cyGraph class="graphWrapper"> </div> `, styles: [` .spinner { position: absolute; left: '350px'; z-index: 10; width: '250px'; height: '250px'; } @keyframes ui-progress-spinner-color { 100%, 0% { stroke: #d62d20; } 40% { stroke: #0057e7; } 66% { stroke: #008744; } 80%, 90% { stroke: #ffa700; } } .graphWrapper { height: 100%; width: 100%; }` ] }] }], function () { return []; }, { cyGraph: [{ type: ViewChild, args: ['cyGraph'] }], debug: [{ type: Input }], nodes: [{ type: Input }], edges: [{ type: Input }], autolock: [{ type: Input }], autoungrabify: [{ type: Input }], autounselectify: [{ type: Input }], boxSelectionEnabled: [{ type: Input }], desktopTapThreshold: [{ type: Input }], hideEdgesOnViewport: [{ type: Input }], hideLabelsOnViewport: [{ type: Input }], layoutOptions: [{ type: Input }], maxZoom: [{ type: Input }], minZoom: [{ type: Input }], motionBlur: [{ type: Input }], motionBlurOpacity: [{ type: Input }], pan: [{ type: Input }], panningEnabled: [{ type: Input }], pixelRatio: [{ type: Input }], selectionType: [{ type: Input }], style: [{ type: Input }], styleEnabled: [{ type: Input }], textureOnViewport: [{ type: Input }], touchTapThreshold: [{ type: Input }], userPanningEnabled: [{ type: Input }], userZoomingEnabled: [{ type: Input }], wheelSensitivity: [{ type: Input }], zoom: [{ type: Input }], zoomingEnabled: [{ type: Input }], showToolbar: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3l0b3NjYXBlLWdyYXBoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2N5dG9zY2FwZS1hbmd1bGFyL3NyYy9saWIvY3l0b3NjYXBlLWdyYXBoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxLQUFLLEVBQTRCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTs7Ozs7O0lBd0I1Ryx1Q0FBOEg7O0FBVmxJOzs7Ozs7R0FNRztBQXNDSCxNQUFNLE9BQU8sdUJBQXVCO0lBcUVsQztRQWhFQSxVQUFLLEdBQUcsS0FBSyxDQUFBO1FBMERiLGdCQUFXLEdBQUcsSUFBSSxDQUFBO1FBSWxCLFlBQU8sR0FBWSxLQUFLLENBQUE7SUFHeEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFzQjtRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNyRixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNsRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7U0FDbkQ7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUFDLFFBQVE7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDWixPQUFNO1NBQ1A7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMs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SDthQUNGO3NDQUdDLE9BQU87a0JBRE4sU0FBUzttQkFBQyxTQUFTO1lBSXBCLEtBQUs7a0JBREosS0FBSztZQUlOLEtBQUs7a0JBREosS0FBSztZQUdOLEtBQUs7a0JBREosS0FBSztZQUlOLFFBQVE7a0JBRFAsS0FBSztZQUdOLGFBQWE7a0JBRFosS0FBSztZQUdOLGVBQWU7a0JBRGQsS0FBSztZQUdOLG1CQUFtQjtrQkFEbEIsS0FBSztZQUdOLG1CQUFtQjtrQkFEbEIsS0FBSztZQUdOLG1CQUFtQjtrQkFEbEIsS0FBSztZQUdOLG9CQUFvQjtrQkFEbkIsS0FBSztZQUdOLGFBQWE7a0JBRFosS0FBSztZQUdOLE9BQU87a0JBRE4sS0FBSztZQUdOLE9BQU87a0JBRE4sS0FBSztZQUdOLFVBQVU7a0JBRFQsS0FBSztZQUdOLGlCQUFpQjtrQkFEaEIsS0FBSztZQUdOLEdBQUc7a0JBREYsS0FBSztZQUdOLGNBQWM7a0JBRGIsS0FBSztZQUdOLFVBQVU7a0JBRFQsS0FBSztZQUdOLGFBQWE7a0JBRFosS0FBSztZQUdOLEtBQUs7a0JBREosS0FBSztZQUdOLFlBQVk7a0JBRFgsS0FBSztZQUdOLGlCQUFpQjtrQkFEaEIsS0FBSztZQUdOLGlCQUFpQjtrQkFEaEIsS0FBSztZQUdOLGtCQUFrQjtrQkFEakIsS0FBSztZQUdOLGtCQUFrQjtrQkFEakIsS0FBSztZQUdOLGdCQUFnQjtrQkFEZixLQUFLO1lBR04sSUFBSTtrQkFESCxLQUFLO1lBR04sY0FBYztrQkFEYixLQUFLO1lBR04sV0FBVztrQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0ICogYXMgY3kgZnJvbSAnY3l0b3NjYXBlJ1xuaW1wb3J0IHtcbiAgQ3l0b3NjYXBlT3B0aW9ucyxcbiAgRWRnZURlZmluaXRpb24sXG4gIExheW91dE9wdGlvbnMsXG4gIE5vZGVEZWZpbml0aW9uLFxuICBQb3NpdGlvbixcbiAgU2VsZWN0aW9uVHlwZSxcbiAgU3R5bGVzaGVldFxufSBmcm9tICdjeXRvc2NhcGUnXG5cbmRlY2xhcmUgdmFyIGN5dG9zY2FwZTogYW55XG5cbi8qKlxuICogVGhlIEFQSSBpcyBhIGxpdHRsZSBvZGQgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eS5cbiAqIEVJVEhFUiBiaW5kIHRvIGN5T3B0aW9ucyAodHlwZSBDeXRvc2NhcGVPcHRpb25zKSwgdG8gY29udHJvbCB0aGUgb3B0aW9ucyB5b3Vyc2VsZlxuICogT1IgdGhpcyBjb21wb25lbnQgd2lsbCBidWlsZCBhIEN5dG9zY2FwZU9wdGlvbnMgaW50ZXJuYWxseSBieSB1c2luZyBhbGwgdGhlIG90aGVyIGlucHV0cy5cbiAqIElmIGN5T3B0aW9ucyBpcyBzdXBwbGllZCwgYWxsIG90aGVyIGlucHV0cyBhcmUgaWdub3JlZC5cbiAqIFRoZSBjeU9wdGlvbnMgY29udGFpbmVyIChIVE1MIGVsZW1lbnQpIGlzIGFsd2F5cyBpZ25vcmVkIGFuZCBzZXQgaW50ZXJuYWxseS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3l0b3NjYXBlLWdyYXBoJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8cC1wcm9ncmVzc1NwaW5uZXIgKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgc3Ryb2tlV2lkdGg9XCI0XCIgZmlsbD1cIiNFRUVFRUVcIiBhbmltYXRpb25EdXJhdGlvbj1cIi41c1wiPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPGRpdiAjY3lHcmFwaCBjbGFzcz1cImdyYXBoV3JhcHBlclwiPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnNwaW5uZXIge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgbGVmdDogJzM1MHB4JztcbiAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgd2lkdGg6ICcyNTBweCc7XG4gICAgICBoZWlnaHQ6ICcyNTBweCc7XG4gICAgfVxuICAgIEBrZXlmcmFtZXMgdWktcHJvZ3Jlc3Mtc3Bpbm5lci1jb2xvciB7XG4gICAgICAxMDAlLFxuICAgICAgMCUge1xuICAgICAgICBzdHJva2U6ICNkNjJkMjA7XG4gICAgICB9XG4gICAgICA0MCUge1xuICAgICAgICBzdHJva2U6ICMwMDU3ZTc7XG4gICAgICB9XG4gICAgICA2NiUge1xuICAgICAgICBzdHJva2U6ICMwMDg3NDQ7XG4gICAgICB9XG4gICAgICA4MCUsXG4gICAgICA5MCUge1xuICAgICAgICBzdHJva2U6ICNmZmE3MDA7XG4gICAgICB9XG4gICAgfVxuICAgIC5ncmFwaFdyYXBwZXIge1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfWBcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDeXRvc2NhcGVHcmFwaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoJ2N5R3JhcGgnKVxuICBjeUdyYXBoOiBFbGVtZW50UmVmXG5cbiAgQElucHV0KClcbiAgZGVidWcgPSBmYWxzZVxuXG4gIEBJbnB1dCgpXG4gIG5vZGVzOiBOb2RlRGVmaW5pdGlvbltdXG4gIEBJbnB1dCgpXG4gIGVkZ2VzOiBFZGdlRGVmaW5pdGlvbltdXG5cbiAgQElucHV0KClcbiAgYXV0b2xvY2s6IGJvb2xlYW5cbiAgQElucHV0KClcbiAgYXV0b3VuZ3JhYmlmeTogYm9vbGVhblxuICBASW5wdXQoKVxuICBhdXRvdW5zZWxlY3RpZnk6IGJvb2xlYW5cbiAgQElucHV0KClcbiAgYm94U2VsZWN0aW9uRW5hYmxlZDogYm9vbGVhblxuICBASW5wdXQoKVxuICBkZXNrdG9wVGFwVGhyZXNob2xkOiBudW1iZXJcbiAgQElucHV0KClcbiAgaGlkZUVkZ2VzT25WaWV3cG9ydDogYm9vbGVhblxuICBASW5wdXQoKVxuICBoaWRlTGFiZWxzT25WaWV3cG9ydDogYm9vbGVhblxuICBASW5wdXQoKVxuICBsYXlvdXRPcHRpb25zOiBMYXlvdXRPcHRpb25zXG4gIEBJbnB1dCgpXG4gIG1heFpvb206IG51bWJlclxuICBASW5wdXQoKVxuICBtaW5ab29tOiBudW1iZXJcbiAgQElucHV0KClcbiAgbW90aW9uQmx1cjogYm9vbGVhblxuICBASW5wdXQoKVxuICBtb3Rpb25CbHVyT3BhY2l0eTogbnVtYmVyXG4gIEBJbnB1dCgpXG4gIHBhbjogUG9zaXRpb25cbiAgQElucHV0KClcbiAgcGFubmluZ0VuYWJsZWQ6IGJvb2xlYW5cbiAgQElucHV0KClcbiAgcGl4ZWxSYXRpbzogbnVtYmVyIHwgJ2F1dG8nXG4gIEBJbnB1dCgpXG4gIHNlbGVjdGlvblR5cGU6IFNlbGVjdGlvblR5cGVcbiAgQElucHV0KClcbiAgc3R5bGU6IFN0eWxlc2hlZXRbXVxuICBASW5wdXQoKVxuICBzdHlsZUVuYWJsZWQ6IGJvb2xlYW5cbiAgQElucHV0KClcbiAgdGV4dHVyZU9uVmlld3BvcnQ6IGJvb2xlYW5cbiAgQElucHV0KClcbiAgdG91Y2hUYXBUaHJlc2hvbGQ6IG51bWJlclxuICBASW5wdXQoKVxuICB1c2VyUGFubmluZ0VuYWJsZWQ6IGJvb2xlYW5cbiAgQElucHV0KClcbiAgdXNlclpvb21pbmdFbmFibGVkOiBib29sZWFuXG4gIEBJbnB1dCgpXG4gIHdoZWVsU2Vuc2l0aXZpdHk6IG51bWJlclxuICBASW5wdXQoKVxuICB6b29tOiAxXG4gIEBJbnB1dCgpXG4gIHpvb21pbmdFbmFibGVkOiBib29sZWFuXG4gIEBJbnB1dCgpXG4gIHNob3dUb29sYmFyID0gdHJ1ZVxuXG4gIGN5T3B0aW9uczogQ3l0b3NjYXBlT3B0aW9uc1xuICBwcml2YXRlIGN5OiBjeS5Db3JlXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBhbnkge1xuICAgIGNvbnNvbGUubG9nKCdjeXRvc2NhcGUgZ3JhcGggY29tcG9uZW50IG5nT25DaGFuZ2VzLiBjaGFuZ2VzOicsIEpTT04uc3RyaW5naWZ5KGNoYW5nZXMpKVxuICAgICAgaWYgKGNoYW5nZXNbXCJzdHlsZVwiXSkge1xuICAgICAgICBjb25zb2xlLmxvZygnY2hhbmdlc1tcInN0eWxlXCJdOicsIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJzdHlsZVwiXSkpXG4gICAgICAgIHRoaXMucnVuV2hpbGVMb2FkaW5nKHRoaXMudXBkYXRlU3R5bGVzLmJpbmQodGhpcykpXG4gICAgICB9XG4gIH1cblxuICBwdWJsaWMgY2VudGVyRWxlbWVudHMoc2VsZWN0b3IpIHtcbiAgICBpZiAoIXRoaXMuY3kpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBlbGVtcyA9IHRoaXMuY3kuJChzZWxlY3RvcilcbiAgICB0aGlzLmN5LmNlbnRlcihlbGVtcylcbiAgfVxuXG4gIHB1YmxpYyB6b29tVG9FbGVtZW50KHNlbGVjdG9yOiBzdHJpbmcsIGxldmVsID0gMykge1xuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY3k/LiQoc2VsZWN0b3IpPy5wb3NpdGlvbigpXG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgY29uc29sZS53YXJuKGBDYW5ub3Qgem9vbSB0byAke3NlbGVjdG9yfWApXG4gICAgfVxuICAgIHRoaXMuY3kuem9vbSh7XG4gICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgdGhpcy5ydW5XaGlsZUxvYWRpbmcodGhpcy5yZXJlbmRlci5iaW5kKHRoaXMpKVxuICB9XG5cbiAgcHVibGljIHJ1bldoaWxlTG9hZGluZyhmOiBGdW5jdGlvbikge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgZigpXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgIH0sIDMwKVxuICAgIH0sIDApXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlcygpIHtcbiAgICBpZiAodGhpcy5jeSAmJiB0aGlzLnN0eWxlKSB7XG4gICAgICB0aGlzLmN5LnN0eWxlKHRoaXMuc3R5bGUpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlcmVuZGVyKCkge1xuICAgIC8vVE9ETyA6IHRoaXMgdGFrZXMgYSBoZWF2eS1oYW5kZWQgYXBwcm9hY2gsIHJlZmluZSBmb3IgcGVyZm9ybWFuY2VcbiAgICBpZiAoIXRoaXMuY3lHcmFwaCkge1xuICAgICAgY29uc29sZS53YXJuKGBObyBjeUdyYXBoIGZvdW5kYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGN5T3B0aW9ucyA9IHRoaXMuY3lPcHRpb25zIHx8IHtcbiAgICAgIC8vIGlnbm9yZWQsIHVzZSBub2RlcyBhbmQgZWRnZXNcbiAgICAgIC8vIGVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLFxuICAgICAgYXV0b2xvY2s6IHRoaXMuYXV0b2xvY2ssXG4gICAgICBhdXRvdW5ncmFiaWZ5OiB0aGlzLmF1dG91bmdyYWJpZnksXG4gICAgICBhdXRvdW5zZWxlY3RpZnk6IHRoaXMuYXV0b3Vuc2VsZWN0aWZ5LFxuICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZDogdGhpcy5ib3hTZWxlY3Rpb25FbmFibGVkLFxuICAgICAgY29udGFpbmVyOiB0aGlzLmN5R3JhcGgubmF0aXZlRWxlbWVudCxcbiAgICAgIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IHRoaXMuZGVza3RvcFRhcFRocmVzaG9sZCxcbiAgICAgIGhpZGVFZGdlc09uVmlld3BvcnQ6IHRoaXMuaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIGhpZGVMYWJlbHNPblZpZXdwb3J0OiB0aGlzLmhpZGVMYWJlbHNPblZpZXdwb3J0LFxuICAgICAgbGF5b3V0OiB0aGlzLmxheW91dE9wdGlvbnMsXG4gICAgICBtYXhab29tOiB0aGlzLm1heFpvb20sXG4gICAgICBtaW5ab29tOiB0aGlzLm1pblpvb20sXG4gICAgICBtb3Rpb25CbHVyOiB0aGlzLm1vdGlvbkJsdXIsXG4gICAgICBtb3Rpb25CbHVyT3BhY2l0eTogdGhpcy5tb3Rpb25CbHVyT3BhY2l0eSxcbiAgICAgIHBhbjogdGhpcy5wYW4sXG4gICAgICBwYW5uaW5nRW5hYmxlZDogdGhpcy5wYW5uaW5nRW5hYmxlZCxcbiAgICAgIHBpeGVsUmF0aW86IHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgIHNlbGVjdGlvblR5cGU6IHRoaXMuc2VsZWN0aW9uVHlwZSxcbiAgICAgIHN0eWxlOiB0aGlzLnN0eWxlLFxuICAgICAgc3R5bGVFbmFibGVkOiB0aGlzLnN0eWxlRW5hYmxlZCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0OiB0aGlzLnRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgdG91Y2hUYXBUaHJlc2hvbGQ6IHRoaXMudG91Y2hUYXBUaHJlc2hvbGQsXG4gICAgICB1c2VyUGFubmluZ0VuYWJsZWQ6IHRoaXMudXNlclBhbm5pbmdFbmFibGVkLFxuICAgICAgdXNlclpvb21pbmdFbmFibGVkOiB0aGlzLnVzZXJab29taW5nRW5hYmxlZCxcbiAgICAgIHdoZWVsU2Vuc2l0aXZpdHk6IHRoaXMud2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHpvb21pbmdFbmFibGVkOiB0aGlzLnpvb21pbmdFbmFibGVkLFxuICAgICAgem9vbTogdGhpcy56b29tLFxuICAgIH1cbiAgICAvLyBUT0RPIGRvIHJlc2V0KCkgaW5zdGVhZD9cbiAgICB0aGlzLmN5ID0gY3l0b3NjYXBlKGN5T3B0aW9ucylcbiAgICB0aGlzLmN5LnN0YXJ0QmF0Y2goKVxuICAgIHRoaXMuY3kuYm94U2VsZWN0aW9uRW5hYmxlZCh0aGlzLmJveFNlbGVjdGlvbkVuYWJsZWQpXG4gICAgdGhpcy5jeS5ub2RlcygpLnJlbW92ZSgpXG4gICAgdGhpcy5jeS5lZGdlcygpLnJlbW92ZSgpXG4gICAgaWYgKHRoaXMubm9kZXMpIHtcbiAgICAgIHRoaXMuY3kuYWRkKHRoaXMubm9kZXMpXG4gICAgfVxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XG4gICAgICB0aGlzLmN5LmFkZCh0aGlzLmVkZ2VzKVxuICAgIH1cbiAgICB0aGlzLmN5LmVuZEJhdGNoKClcbiAgICBpZiAodGhpcy5sYXlvdXRPcHRpb25zKSB7XG4gICAgICB0aGlzLmN5LmxheW91dCh0aGlzLmxheW91dE9wdGlvbnMpLnJ1bigpXG4gICAgfVxuICB9XG59XG5cbi8qXG5HcmFkaWVudDpcblxuYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycyA6IFRoZSBjb2xvdXJzIG9mIHRoZSBiYWNrZ3JvdW5kIGdyYWRpZW50IHN0b3BzIChlLmcuIGN5YW4gbWFnZW50YSB5ZWxsb3cpLlxuYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyA6IFRoZSBwb3NpdGlvbnMgb2YgdGhlIGJhY2tncm91bmQgZ3JhZGllbnQgc3RvcHMgKGUuZy4gMCUgNTAlIDEwMCUpLiBJZiBub3Qgc3BlY2lmaWVkIG9yIGludmFsaWQsIHRoZSBzdG9wcyB3aWxsIGRpdmlkZSBlcXVhbGx5LlxuYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24gOiBGb3IgYmFja2dyb3VuZC1maWxsOiBsaW5lYXItZ3JhZGllbnQsIHRoaXMgcHJvcGVydHkgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBiYWNrZ3JvdW5kIGdyYWRpZW50LiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQ6XG50by1ib3R0b20gKGRlZmF1bHQpXG50by10b3BcbnRvLWxlZnRcbnRvLXJpZ2h0XG50by1ib3R0b20tcmlnaHRcbnRvLWJvdHRvbS1sZWZ0XG50by10b3AtcmlnaHRcbnRvLXRvcC1sZWZ0XG4gKi9cbiJdfQ==