cytoscape-angular
Version:
Angular 12+ components for cytoscape charting.
231 lines • 23.7 kB
JavaScript
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';
}
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==