@nova-ui/bits
Version:
SolarWinds Nova Framework
271 lines • 39.8 kB
JavaScript
import { Injectable } from "@angular/core";
import isNil from "lodash/isNil";
import { OVERLAY_ARROW_SIZE } from "./constants";
import { OverlayPlacement, OverlayPosition, } from "./types";
import * as i0 from "@angular/core";
var OverlayPanelClass;
(function (OverlayPanelClass) {
OverlayPanelClass["overlayCenterTop"] = "overlay-center-top";
OverlayPanelClass["overlayTopLeft"] = "overlay-top-left";
OverlayPanelClass["overlayTopRight"] = "overlay-top-right";
OverlayPanelClass["overlayCenterBottom"] = "overlay-center-bottom";
OverlayPanelClass["overlayBottomRight"] = "overlay-bottom-right";
OverlayPanelClass["overlayBottomLeft"] = "overlay-bottom-left";
OverlayPanelClass["overlayCenterLeft"] = "overlay-center-left";
OverlayPanelClass["overlayLeftTop"] = "overlay-left-top";
OverlayPanelClass["overlayLeftBottom"] = "overlay-left-bottom";
OverlayPanelClass["overlayCenterRight"] = "overlay-center-right";
OverlayPanelClass["overlayRightTop"] = "overlay-right-top";
OverlayPanelClass["overlayRightBottom"] = "overlay-right-bottom";
})(OverlayPanelClass || (OverlayPanelClass = {}));
export class OverlayPositionService {
setOverlayPositionConfig(config) {
this.arrowSize = !isNil(config?.arrowSize)
? config?.arrowSize
: OVERLAY_ARROW_SIZE;
this.arrowPadding = !isNil(config?.arrowPadding)
? config?.arrowPadding
: 0;
this.overlayPositions = getOverlayPositions();
}
updateOffsetOnPositionChanges(positionStrategy, getOverlayRef) {
return positionStrategy.positionChanges.subscribe((connectedPosition) => {
const overlayRefElement = getOverlayRef().overlayElement;
const panelClass = connectedPosition.connectionPair.panelClass;
if (!panelClass) {
return;
}
this.setOverlayOffset(panelClass, overlayRefElement);
});
}
setOverlayOffset(panelClass, overlayRefElement) {
if (Array.isArray(panelClass)) {
panelClass = this.getOverlayPositionPanelClass(panelClass);
}
if (!panelClass) {
return;
}
overlayRefElement.style.marginLeft = "";
overlayRefElement.style.marginTop = "";
overlayRefElement.style.marginBottom = "";
overlayRefElement.style.marginRight = "";
switch (panelClass) {
case OverlayPanelClass.overlayCenterTop:
overlayRefElement.style.marginBottom = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayTopLeft:
overlayRefElement.style.marginRight =
2 * this.arrowPadding + "px";
overlayRefElement.style.marginBottom = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayTopRight:
overlayRefElement.style.marginLeft =
2 * this.arrowPadding + "px";
overlayRefElement.style.marginBottom = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayCenterBottom:
overlayRefElement.style.marginTop = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayBottomRight:
overlayRefElement.style.marginLeft =
2 * this.arrowPadding + "px";
overlayRefElement.style.marginTop = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayBottomLeft:
overlayRefElement.style.marginRight =
2 * this.arrowPadding + "px";
overlayRefElement.style.marginTop = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayCenterLeft:
overlayRefElement.style.marginRight = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayLeftTop:
overlayRefElement.style.marginRight = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayLeftBottom:
overlayRefElement.style.marginRight = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayCenterRight:
overlayRefElement.style.marginLeft = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayRightTop:
overlayRefElement.style.marginLeft = this.arrowSize + "px";
break;
case OverlayPanelClass.overlayRightBottom:
overlayRefElement.style.marginLeft = this.arrowSize + "px";
break;
}
}
getPossiblePositionsForPlacement(placement) {
const possiblePositions = [];
// add positions for the requested placement
possiblePositions.push(...this.getPositionsForPlacement(placement));
// add positions for the opposite placement in case the requested placement
// would be rendered outside the screen
switch (placement) {
case OverlayPlacement.Left:
possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Right), ...this.getPositionsForPlacement(OverlayPlacement.Top), ...this.getPositionsForPlacement(OverlayPlacement.Bottom));
break;
case OverlayPlacement.Right:
possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Left), ...this.getPositionsForPlacement(OverlayPlacement.Top), ...this.getPositionsForPlacement(OverlayPlacement.Bottom));
break;
case OverlayPlacement.Top:
possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Bottom), ...this.getPositionsForPlacement(OverlayPlacement.Left), ...this.getPositionsForPlacement(OverlayPlacement.Right));
break;
case OverlayPlacement.Bottom:
possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Top), ...this.getPositionsForPlacement(OverlayPlacement.Left), ...this.getPositionsForPlacement(OverlayPlacement.Right));
break;
}
return possiblePositions;
}
getOverlayPositionPanelClass(panelClass) {
let result;
for (const panelClassKey in OverlayPanelClass) {
if (OverlayPanelClass.hasOwnProperty(panelClassKey)) {
result = panelClass.find((i) => i === panelClassKey);
}
}
return result || "";
}
/**
* Returns all possible positions for a placement
* Eg: left => [OVERLAY_POSITIONS[centerLeft], OVERLAY_POSITIONS[topLeft], OVERLAY_POSITIONS[bottomLeft]]
*
* @param placement
* @returns ConnectedPosition[]
*/
getPositionsForPlacement(placement) {
let possiblePositionNames = [];
switch (placement) {
case OverlayPlacement.Left:
possiblePositionNames = [
OverlayPosition.centerLeft,
OverlayPosition.leftTop,
OverlayPosition.leftBottom,
];
break;
case OverlayPlacement.Right:
possiblePositionNames = [
OverlayPosition.centerRight,
OverlayPosition.rightTop,
OverlayPosition.rightBottom,
];
break;
case OverlayPlacement.Top:
possiblePositionNames = [
OverlayPosition.centerTop,
OverlayPosition.topLeft,
OverlayPosition.topRight,
];
break;
case OverlayPlacement.Bottom:
possiblePositionNames = [
OverlayPosition.centerBottom,
OverlayPosition.bottomLeft,
OverlayPosition.bottomRight,
];
break;
case OverlayPlacement.Custom:
throw new Error(`Custom position should be handled by user`);
}
return possiblePositionNames.map((positionName) => this.overlayPositions[positionName]);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayPositionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayPositionService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayPositionService, decorators: [{
type: Injectable
}] });
export function getOverlayPositions() {
return {
// TOP
[OverlayPosition.centerTop]: {
panelClass: "overlay-center-top",
originX: "center",
originY: "top",
overlayX: "center",
overlayY: "bottom",
},
[OverlayPosition.topLeft]: {
panelClass: "overlay-top-left",
originX: "end",
originY: "top",
overlayX: "end",
overlayY: "bottom",
},
[OverlayPosition.topRight]: {
panelClass: "overlay-top-right",
originX: "start",
originY: "top",
overlayX: "start",
overlayY: "bottom",
},
// BOTTOM
[OverlayPosition.centerBottom]: {
panelClass: "overlay-center-bottom",
originX: "center",
originY: "bottom",
overlayX: "center",
overlayY: "top",
},
[OverlayPosition.bottomRight]: {
panelClass: "overlay-bottom-right",
originX: "start",
originY: "bottom",
overlayX: "start",
overlayY: "top",
},
[OverlayPosition.bottomLeft]: {
panelClass: "overlay-bottom-left",
originX: "end",
originY: "bottom",
overlayX: "end",
overlayY: "top",
},
// LEFT
[OverlayPosition.centerLeft]: {
panelClass: "overlay-center-left",
originX: "start",
originY: "center",
overlayX: "end",
overlayY: "center",
},
[OverlayPosition.leftTop]: {
panelClass: "overlay-left-top",
originX: "start",
originY: "bottom",
overlayX: "end",
overlayY: "bottom",
},
[OverlayPosition.leftBottom]: {
panelClass: "overlay-left-bottom",
originX: "start",
originY: "top",
overlayX: "end",
overlayY: "top",
},
// RIGHT
[OverlayPosition.centerRight]: {
panelClass: "overlay-center-right",
originX: "end",
originY: "center",
overlayX: "start",
overlayY: "center",
},
[OverlayPosition.rightTop]: {
panelClass: "overlay-right-top",
originX: "end",
originY: "bottom",
overlayX: "start",
overlayY: "bottom",
},
[OverlayPosition.rightBottom]: {
panelClass: "overlay-right-bottom",
originX: "end",
originY: "top",
overlayX: "start",
overlayY: "top",
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wb3NpdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9vdmVybGF5L292ZXJsYXktcG9zaXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEwQkEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFHakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFFSCxnQkFBZ0IsRUFDaEIsZUFBZSxHQUNsQixNQUFNLFNBQVMsQ0FBQzs7QUFFakIsSUFBSyxpQkFhSjtBQWJELFdBQUssaUJBQWlCO0lBQ2xCLDREQUF1QyxDQUFBO0lBQ3ZDLHdEQUFtQyxDQUFBO0lBQ25DLDBEQUFxQyxDQUFBO0lBQ3JDLGtFQUE2QyxDQUFBO0lBQzdDLGdFQUEyQyxDQUFBO0lBQzNDLDhEQUF5QyxDQUFBO0lBQ3pDLDhEQUF5QyxDQUFBO0lBQ3pDLHdEQUFtQyxDQUFBO0lBQ25DLDhEQUF5QyxDQUFBO0lBQ3pDLGdFQUEyQyxDQUFBO0lBQzNDLDBEQUFxQyxDQUFBO0lBQ3JDLGdFQUEyQyxDQUFBO0FBQy9DLENBQUMsRUFiSSxpQkFBaUIsS0FBakIsaUJBQWlCLFFBYXJCO0FBR0QsTUFBTSxPQUFPLHNCQUFzQjtJQU94Qix3QkFBd0IsQ0FDM0IsTUFBc0M7UUFFdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ3RDLENBQUMsQ0FBUyxNQUFNLEVBQUUsU0FBUztZQUMzQixDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO1lBQzVDLENBQUMsQ0FBUyxNQUFNLEVBQUUsWUFBWTtZQUM5QixDQUFDLENBQUMsQ0FB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LFFBQVE7U0FDckI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4QixVQUFVLEVBQUUsbUJBQW1CO1lBQy9CLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzQixVQUFVLEVBQUUsc0JBQXNCO1lBQ2xDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUUsS0FBSztTQUNsQjtLQUNKLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxuICAgIENvbm5lY3RlZFBvc2l0aW9uLFxuICAgIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcbiAgICBPdmVybGF5UmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IE9WRVJMQVlfQVJST1dfU0laRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgICBJT3ZlcmxheVBvc2l0aW9uU2VydmljZUNvbmZpZyxcbiAgICBPdmVybGF5UGxhY2VtZW50LFxuICAgIE92ZXJsYXlQb3NpdGlvbixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZW51bSBPdmVybGF5UGFuZWxDbGFzcyB7XG4gICAgb3ZlcmxheUNlbnRlclRvcCA9IFwib3ZlcmxheS1jZW50ZXItdG9wXCIsXG4gICAgb3ZlcmxheVRvcExlZnQgPSBcIm92ZXJsYXktdG9wLWxlZnRcIixcbiAgICBvdmVybGF5VG9wUmlnaHQgPSBcIm92ZXJsYXktdG9wLXJpZ2h0XCIsXG4gICAgb3ZlcmxheUNlbnRlckJvdHRvbSA9IFwib3ZlcmxheS1jZW50ZXItYm90dG9tXCIsXG4gICAgb3ZlcmxheUJvdHRvbVJpZ2h0ID0gXCJvdmVybGF5LWJvdHRvbS1yaWdodFwiLFxuICAgIG92ZXJsYXlCb3R0b21MZWZ0ID0gXCJvdmVybGF5LWJvdHRvbS1sZWZ0XCIsXG4gICAgb3ZlcmxheUNlbnRlckxlZnQgPSBcIm92ZXJsYXktY2VudGVyLWxlZnRcIixcbiAgICBvdmVybGF5TGVmdFRvcCA9IFwib3ZlcmxheS1sZWZ0LXRvcFwiLFxuICAgIG92ZXJsYXlMZWZ0Qm90dG9tID0gXCJvdmVybGF5LWxlZnQtYm90dG9tXCIsXG4gICAgb3ZlcmxheUNlbnRlclJpZ2h0ID0gXCJvdmVybGF5LWNlbnRlci1yaWdodFwiLFxuICAgIG92ZXJsYXlSaWdodFRvcCA9IFwib3ZlcmxheS1yaWdodC10b3BcIixcbiAgICBvdmVybGF5UmlnaHRCb3R0b20gPSBcIm92ZXJsYXktcmlnaHQtYm90dG9tXCIsXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPdmVybGF5UG9zaXRpb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIG92ZXJsYXlQb3NpdGlvbnM6IFJlY29yZDxPdmVybGF5UG9zaXRpb24sIENvbm5lY3RlZFBvc2l0aW9uPjtcblxuICAgIHByaXZhdGUgYXJyb3dTaXplOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBhcnJvd1BhZGRpbmc6IG51bWJlcjtcbiAgICBwdWJsaWMgY29uZmlnOiBJT3ZlcmxheVBvc2l0aW9uU2VydmljZUNvbmZpZztcblxuICAgIHB1YmxpYyBzZXRPdmVybGF5UG9zaXRpb25Db25maWcoXG4gICAgICAgIGNvbmZpZz86IElPdmVybGF5UG9zaXRpb25TZXJ2aWNlQ29uZmlnXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXJyb3dTaXplID0gIWlzTmlsKGNvbmZpZz8uYXJyb3dTaXplKVxuICAgICAgICAgICAgPyA8bnVtYmVyPmNvbmZpZz8uYXJyb3dTaXplXG4gICAgICAgICAgICA6IE9WRVJMQVlfQVJST1dfU0laRTtcbiAgICAgICAgdGhpcy5hcnJvd1BhZGRpbmcgPSAhaXNOaWwoY29uZmlnPy5hcnJvd1BhZGRpbmcpXG4gICAgICAgICAgICA/IDxudW1iZXI+Y29uZmlnPy5hcnJvd1BhZGRpbmdcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgdGhpcy5vdmVybGF5UG9zaXRpb25zID0gZ2V0T3ZlcmxheVBvc2l0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVPZmZzZXRPblBvc2l0aW9uQ2hhbmdlcyhcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICBnZXRPdmVybGF5UmVmOiAoKSA9PiBPdmVybGF5UmVmXG4gICAgKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uU3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgICAgICAgIChjb25uZWN0ZWRQb3NpdGlvbjogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheVJlZkVsZW1lbnQgPSBnZXRPdmVybGF5UmVmKCkub3ZlcmxheUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxDbGFzcyA9IGNvbm5lY3RlZFBvc2l0aW9uLmNvbm5lY3Rpb25QYWlyLnBhbmVsQ2xhc3M7XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5lbENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRPdmVybGF5T2Zmc2V0KHBhbmVsQ2xhc3MsIG92ZXJsYXlSZWZFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE92ZXJsYXlPZmZzZXQoXG4gICAgICAgIHBhbmVsQ2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvdmVybGF5UmVmRWxlbWVudDogSFRNTEVsZW1lbnRcbiAgICApIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFuZWxDbGFzcykpIHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3MgPSB0aGlzLmdldE92ZXJsYXlQb3NpdGlvblBhbmVsQ2xhc3MocGFuZWxDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhbmVsQ2xhc3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiXCI7XG5cbiAgICAgICAgc3dpdGNoIChwYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQYW5lbENsYXNzLm92ZXJsYXlDZW50ZXJUb3A6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luQm90dG9tID0gdGhpcy5hcnJvd1NpemUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQYW5lbENsYXNzLm92ZXJsYXlUb3BMZWZ0OlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblJpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgMiAqIHRoaXMuYXJyb3dQYWRkaW5nICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbSA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5VG9wUmlnaHQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9XG4gICAgICAgICAgICAgICAgICAgIDIgKiB0aGlzLmFycm93UGFkZGluZyArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSB0aGlzLmFycm93U2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBhbmVsQ2xhc3Mub3ZlcmxheUNlbnRlckJvdHRvbTpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmFycm93U2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBhbmVsQ2xhc3Mub3ZlcmxheUJvdHRvbVJpZ2h0OlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPVxuICAgICAgICAgICAgICAgICAgICAyICogdGhpcy5hcnJvd1BhZGRpbmcgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gdGhpcy5hcnJvd1NpemUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQYW5lbENsYXNzLm92ZXJsYXlCb3R0b21MZWZ0OlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblJpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgMiAqIHRoaXMuYXJyb3dQYWRkaW5nICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5Q2VudGVyTGVmdDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5TGVmdFRvcDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5TGVmdEJvdHRvbTpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5Q2VudGVyUmlnaHQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5UmlnaHRUb3A6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5UmlnaHRCb3R0b206XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBvc3NpYmxlUG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICBwbGFjZW1lbnQ6IE92ZXJsYXlQbGFjZW1lbnRcbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXTtcblxuICAgICAgICAvLyBhZGQgcG9zaXRpb25zIGZvciB0aGUgcmVxdWVzdGVkIHBsYWNlbWVudFxuICAgICAgICBwb3NzaWJsZVBvc2l0aW9ucy5wdXNoKC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KHBsYWNlbWVudCkpO1xuXG4gICAgICAgIC8vIGFkZCBwb3NpdGlvbnMgZm9yIHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIHBsYWNlbWVudFxuICAgICAgICAvLyB3b3VsZCBiZSByZW5kZXJlZCBvdXRzaWRlIHRoZSBzY3JlZW5cbiAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LlRvcCksXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuQm90dG9tKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoT3ZlcmxheVBsYWNlbWVudC5MZWZ0KSxcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoT3ZlcmxheVBsYWNlbWVudC5Ub3ApLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LkJvdHRvbSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGxhY2VtZW50LlRvcDpcbiAgICAgICAgICAgICAgICBwb3NzaWJsZVBvc2l0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LkJvdHRvbSksXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuTGVmdCksXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoT3ZlcmxheVBsYWNlbWVudC5Ub3ApLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LkxlZnQpLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LlJpZ2h0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9zc2libGVQb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPdmVybGF5UG9zaXRpb25QYW5lbENsYXNzKHBhbmVsQ2xhc3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgZm9yIChjb25zdCBwYW5lbENsYXNzS2V5IGluIE92ZXJsYXlQYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBpZiAoT3ZlcmxheVBhbmVsQ2xhc3MuaGFzT3duUHJvcGVydHkocGFuZWxDbGFzc0tleSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBwYW5lbENsYXNzLmZpbmQoKGkpID0+IGkgPT09IHBhbmVsQ2xhc3NLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgXCJcIjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBwb3NzaWJsZSBwb3NpdGlvbnMgZm9yIGEgcGxhY2VtZW50XG4gICAgICogRWc6IGxlZnQgPT4gW09WRVJMQVlfUE9TSVRJT05TW2NlbnRlckxlZnRdLCBPVkVSTEFZX1BPU0lUSU9OU1t0b3BMZWZ0XSwgT1ZFUkxBWV9QT1NJVElPTlNbYm90dG9tTGVmdF1dXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhY2VtZW50XG4gICAgICogQHJldHVybnMgQ29ubmVjdGVkUG9zaXRpb25bXVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICBwbGFjZW1lbnQ6IE92ZXJsYXlQbGFjZW1lbnRcbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgbGV0IHBvc3NpYmxlUG9zaXRpb25OYW1lczogT3ZlcmxheVBvc2l0aW9uW10gPSBbXTtcbiAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25OYW1lcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLmNlbnRlckxlZnQsXG4gICAgICAgICAgICAgICAgICAgIE92ZXJsYXlQb3NpdGlvbi5sZWZ0VG9wLFxuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24ubGVmdEJvdHRvbSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uY2VudGVyUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIE92ZXJsYXlQb3NpdGlvbi5yaWdodFRvcCxcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Ub3A6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uY2VudGVyVG9wLFxuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24udG9wTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uY2VudGVyQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uYm90dG9tTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLmJvdHRvbVJpZ2h0LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5DdXN0b206XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDdXN0b20gcG9zaXRpb24gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdXNlcmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc3NpYmxlUG9zaXRpb25OYW1lcy5tYXAoXG4gICAgICAgICAgICAocG9zaXRpb25OYW1lOiBPdmVybGF5UG9zaXRpb24pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UG9zaXRpb25zW3Bvc2l0aW9uTmFtZV1cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdmVybGF5UG9zaXRpb25zKCk6IFJlY29yZDxcbiAgICBPdmVybGF5UG9zaXRpb24sXG4gICAgQ29ubmVjdGVkUG9zaXRpb25cbj4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRPUFxuICAgICAgICBbT3ZlcmxheVBvc2l0aW9uLmNlbnRlclRvcF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1jZW50ZXItdG9wXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiYm90dG9tXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24udG9wTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS10b3AtbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LXRvcC1yaWdodFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQk9UVE9NXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uY2VudGVyQm90dG9tXToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWNlbnRlci1ib3R0b21cIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxuICAgICAgICAgICAgb3ZlcmxheVg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfSxcbiAgICAgICAgW092ZXJsYXlQb3NpdGlvbi5ib3R0b21SaWdodF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1ib3R0b20tcmlnaHRcIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwic3RhcnRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uYm90dG9tTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1ib3R0b20tbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcInRvcFwiLFxuICAgICAgICB9LFxuICAgICAgICAvLyBMRUZUXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uY2VudGVyTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1jZW50ZXItbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiY2VudGVyXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24ubGVmdFRvcF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1sZWZ0LXRvcFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiYm90dG9tXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24ubGVmdEJvdHRvbV06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1sZWZ0LWJvdHRvbVwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJJR0hUXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uY2VudGVyUmlnaHRdOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktY2VudGVyLXJpZ2h0XCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImVuZFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJjZW50ZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAgW092ZXJsYXlQb3NpdGlvbi5yaWdodFRvcF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1yaWdodC10b3BcIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwiZW5kXCIsXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxuICAgICAgICAgICAgb3ZlcmxheVg6IFwic3RhcnRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tXToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LXJpZ2h0LWJvdHRvbVwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiJdfQ==