UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

169 lines 25.4 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { DOCUMENT } from "@angular/common"; import { Inject, Injectable } from "@angular/core"; import _isNil from "lodash/isNil"; import { popoverConstants } from "../../constants/popover.constants"; import { EdgeDetectionService } from "../../services/edge-detection.service"; import { PositionService } from "../../services/position.service"; import * as i0 from "@angular/core"; import * as i1 from "../../services/position.service"; import * as i2 from "../../services/edge-detection.service"; /** * @dynamic * @ignore */ export class PopoverModalService { constructor(positionService, document, edgeDetector) { this.positionService = positionService; this.document = document; this.edgeDetector = edgeDetector; } setPosition(popoverModal, popoverTrigger, appendToBody, contextPlacement) { // Element with dimensions const popoverElement = (popoverModal.querySelector(".nui-popover-container")); const edgeDetectionResult = this.edgeDetector.canBe(popoverTrigger, popoverElement); if (_isNil(edgeDetectionResult)) { throw new Error("edgeDetectionResult is Nil"); } const placementAndAlignment = this.getPlacementAndAlignment(edgeDetectionResult, contextPlacement); const placement = placementAndAlignment.placement; const arrowPosition = placementAndAlignment.alignment; const position = this.positionService.getPosition(popoverTrigger, popoverElement, `${placement}-${arrowPosition}`, appendToBody); position.top += this.getYAdjustment(popoverTrigger, placementAndAlignment); position.left += this.getXAdjustment(popoverTrigger, placementAndAlignment); return { placement, position, arrowPosition, }; } getPlacementAndAlignment(edgeDetectionResult, contextPlacement) { const canOpenHorizontally = edgeDetectionResult.placed.right || edgeDetectionResult.placed.left; const canOpenVertically = edgeDetectionResult.placed.top || edgeDetectionResult.placed.bottom; // placements const canBePlacedRight = edgeDetectionResult.placed.right ? "right" : "left"; const canBePlacedLeft = edgeDetectionResult.placed.left ? "left" : "right"; const canBePlacedBottom = edgeDetectionResult.placed.bottom ? "bottom" : "top"; const canBePlacedTop = edgeDetectionResult.placed.top ? "top" : "bottom"; // alignments const canBeAlignedTop = edgeDetectionResult.aligned.top ? "top" : "bottom"; const canBeAlignedRight = edgeDetectionResult.aligned.right ? "right" : "left"; const canBeAlignedLeft = edgeDetectionResult.aligned.left ? "left" : "right"; // if horizontal/vertical placement is possible opening left/right/top/bottom respectively switch (contextPlacement) { case "left": return { placement: canOpenHorizontally ? canBePlacedLeft : canBePlacedBottom, alignment: canOpenHorizontally ? canBeAlignedTop : canBeAlignedRight, }; case "right": return { placement: canOpenHorizontally ? canBePlacedRight : canBePlacedBottom, alignment: canOpenHorizontally ? canBeAlignedTop : canBeAlignedRight, }; case "bottom": return { placement: canOpenVertically ? canBePlacedBottom : canBePlacedRight, alignment: canOpenVertically ? canBeAlignedLeft : canBeAlignedTop, }; case "top": return { placement: canOpenVertically ? canBePlacedTop : canBePlacedRight, alignment: canOpenVertically ? canBeAlignedLeft : canBeAlignedTop, }; default: return { placement: canOpenHorizontally ? canBePlacedRight : canBePlacedBottom, alignment: canOpenHorizontally ? canBeAlignedTop : canBeAlignedRight, }; } } // calculating adjustments for popover modal on Y axis getYAdjustment(popoverTrigger, placementAndAlignment) { // y-adjustment not needed for top or bottom placement if (placementAndAlignment.placement === "top" || placementAndAlignment.placement === "bottom") { return 0; } const yAdjustment = popoverTrigger.offsetHeight / 2 - (popoverConstants.arrowOffset + popoverConstants.arrowBorderWidth); return placementAndAlignment.alignment === "top" ? yAdjustment : -yAdjustment; } // calculating adjustments for popover modal on X axis // popover modal should be always on center on X axis getXAdjustment(popoverTrigger, placementAndAlignment) { // x-adjustment not needed for left or right placement if (placementAndAlignment.placement === "left" || placementAndAlignment.placement === "right") { return 0; } const xAdjustment = popoverTrigger.offsetWidth / 2 - (popoverConstants.arrowOffset + popoverConstants.arrowBorderWidth); return placementAndAlignment.alignment === "left" ? xAdjustment : -xAdjustment; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverModalService, deps: [{ token: i1.PositionService }, { token: DOCUMENT }, { token: i2.EdgeDetectionService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverModalService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverModalService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.PositionService }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i2.EdgeDetectionService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1tb2RhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wb3BvdmVyL3BvcG92ZXItbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUdsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7QUFtQ2xFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxtQkFBbUI7SUFDNUIsWUFDWSxlQUFnQyxFQUNkLFFBQWtCLEVBQ3BDLFlBQWtDO1FBRmxDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQXNCO0lBQzNDLENBQUM7SUFFRyxXQUFXLENBQ2QsWUFBeUIsRUFDekIsY0FBMkIsRUFDM0IsWUFBcUIsRUFDckIsZ0JBQWtDO1FBRWxDLDBCQUEwQjtRQUMxQixNQUFN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Q1o7UUFFRCxNQUFNLFdBQVcsR0FDYixjQUFjLENBQUMsWUFBWSxHQUFHLENBQUM7WUFDL0IsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RSxPQUFPLHFCQUFxQixDQUFDLFNBQVMsS0FBSyxLQUFLO1lBQzVDLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQscURBQXFEO0lBQzdDLGNBQWMsQ0FDbEIsY0FBMkIsRUFDM0IscUJBQWlEO1FBRWpELHNEQUFzRDtRQUN0RCxJQUNJLHFCQUFxQixDQUFDLFNBQVMsS0FBSyxNQUFNO1lBQzFDLHFCQUFxQixDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQzdDO1lBQ0UsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE1BQU0sV0FBVyxHQUNiLGNBQWMsQ0FBQyxXQUFXLEdBQUcsQ0FBQztZQUM5QixDQUFDLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8scUJBQXFCLENBQUMsU0FBUyxLQUFLLE1BQU07WUFDN0MsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDdkIsQ0FBQzsrR0EvS1EsbUJBQW1CLGlEQUdoQixRQUFRO21IQUhYLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBSUYsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC9pc05pbFwiO1xuXG5pbXBvcnQgeyBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgcG9wb3ZlckNvbnN0YW50cyB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMvcG9wb3Zlci5jb25zdGFudHNcIjtcbmltcG9ydCB7IEVkZ2VEZXRlY3Rpb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VkZ2UtZGV0ZWN0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBvc2l0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9wb3NpdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJRWRnZURldGVjdGlvblJlc3VsdCB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9wdWJsaWMtYXBpXCI7XG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuaW50ZXJmYWNlIElQb3BvdmVyUGxhY2VtZW50QWxpZ25tZW50IHtcbiAgICBwbGFjZW1lbnQ6IFBvcG92ZXJQbGFjZW1lbnQ7XG4gICAgYWxpZ25tZW50OiBQb3BvdmVyQWxpZ25tZW50O1xufVxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCB0eXBlIFBvcG92ZXJBbGlnbm1lbnQgPSBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiO1xuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBvcG92ZXJNb2RhbENvbnRleHQge1xuICAgIGFycm93TWFyZ2luVG9wPzogbnVtYmVyO1xuICAgIGljb246IHN0cmluZztcbiAgICBwb3BvdmVyUG9zaXRpb24/OiBzdHJpbmc7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgcGxhY2VtZW50PzogUG9wb3ZlclBsYWNlbWVudDtcbn1cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQb3BvdmVyUG9zaXRpb24ge1xuICAgIHBsYWNlbWVudDogUG9wb3ZlclBsYWNlbWVudDtcbiAgICBhcnJvd1Bvc2l0aW9uOiBQb3BvdmVyQWxpZ25tZW50O1xuICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHRvcDogbnVtYmVyO1xuICAgICAgICBsZWZ0OiBudW1iZXI7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBAZHluYW1pY1xuICogQGlnbm9yZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9wb3Zlck1vZGFsU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcG9zaXRpb25TZXJ2aWNlOiBQb3NpdGlvblNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICAgICBwcml2YXRlIGVkZ2VEZXRlY3RvcjogRWRnZURldGVjdGlvblNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc2V0UG9zaXRpb24oXG4gICAgICAgIHBvcG92ZXJNb2RhbDogSFRNTEVsZW1lbnQsXG4gICAgICAgIHBvcG92ZXJUcmlnZ2VyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgYXBwZW5kVG9Cb2R5OiBib29sZWFuLFxuICAgICAgICBjb250ZXh0UGxhY2VtZW50OiBQb3BvdmVyUGxhY2VtZW50XG4gICAgKTogSVBvcG92ZXJQb3NpdGlvbiB7XG4gICAgICAgIC8vIEVsZW1lbnQgd2l0aCBkaW1lbnNpb25zXG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbGVtZW50ID0gPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgIHBvcG92ZXJNb2RhbC5xdWVyeVNlbGVjdG9yKFwiLm51aS1wb3BvdmVyLWNvbnRhaW5lclwiKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlZGdlRGV0ZWN0aW9uUmVzdWx0ID0gdGhpcy5lZGdlRGV0ZWN0b3IuY2FuQmUoXG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlcixcbiAgICAgICAgICAgIHBvcG92ZXJFbGVtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKF9pc05pbChlZGdlRGV0ZWN0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZWRnZURldGVjdGlvblJlc3VsdCBpcyBOaWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwbGFjZW1lbnRBbmRBbGlnbm1lbnQgPSB0aGlzLmdldFBsYWNlbWVudEFuZEFsaWdubWVudChcbiAgICAgICAgICAgIGVkZ2VEZXRlY3Rpb25SZXN1bHQsXG4gICAgICAgICAgICBjb250ZXh0UGxhY2VtZW50XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IHBsYWNlbWVudEFuZEFsaWdubWVudC5wbGFjZW1lbnQ7XG4gICAgICAgIGNvbnN0IGFycm93UG9zaXRpb24gPSBwbGFjZW1lbnRBbmRBbGlnbm1lbnQuYWxpZ25tZW50O1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb25TZXJ2aWNlLmdldFBvc2l0aW9uKFxuICAgICAgICAgICAgcG9wb3ZlclRyaWdnZXIsXG4gICAgICAgICAgICBwb3BvdmVyRWxlbWVudCxcbiAgICAgICAgICAgIGAke3BsYWNlbWVudH0tJHthcnJvd1Bvc2l0aW9ufWAsXG4gICAgICAgICAgICBhcHBlbmRUb0JvZHlcbiAgICAgICAgKTtcbiAgICAgICAgcG9zaXRpb24udG9wICs9IHRoaXMuZ2V0WUFkanVzdG1lbnQoXG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlcixcbiAgICAgICAgICAgIHBsYWNlbWVudEFuZEFsaWdubWVudFxuICAgICAgICApO1xuICAgICAgICBwb3NpdGlvbi5sZWZ0ICs9IHRoaXMuZ2V0WEFkanVzdG1lbnQoXG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlcixcbiAgICAgICAgICAgIHBsYWNlbWVudEFuZEFsaWdubWVudFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICBhcnJvd1Bvc2l0aW9uLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGxhY2VtZW50QW5kQWxpZ25tZW50KFxuICAgICAgICBlZGdlRGV0ZWN0aW9uUmVzdWx0OiBJRWRnZURldGVjdGlvblJlc3VsdCxcbiAgICAgICAgY29udGV4dFBsYWNlbWVudDogUG9wb3ZlclBsYWNlbWVudFxuICAgICk6IElQb3BvdmVyUGxhY2VtZW50QWxpZ25tZW50IHtcbiAgICAgICAgY29uc3QgY2FuT3Blbkhvcml6b250YWxseSA9XG4gICAgICAgICAgICBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC5yaWdodCB8fCBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC5sZWZ0O1xuICAgICAgICBjb25zdCBjYW5PcGVuVmVydGljYWxseSA9XG4gICAgICAgICAgICBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC50b3AgfHwgZWRnZURldGVjdGlvblJlc3VsdC5wbGFjZWQuYm90dG9tO1xuICAgICAgICAvLyBwbGFjZW1lbnRzXG4gICAgICAgIGNvbnN0IGNhbkJlUGxhY2VkUmlnaHQgPSBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC5yaWdodFxuICAgICAgICAgICAgPyBcInJpZ2h0XCJcbiAgICAgICAgICAgIDogXCJsZWZ0XCI7XG4gICAgICAgIGNvbnN0IGNhbkJlUGxhY2VkTGVmdCA9IGVkZ2VEZXRlY3Rpb25SZXN1bHQucGxhY2VkLmxlZnRcbiAgICAgICAgICAgID8gXCJsZWZ0XCJcbiAgICAgICAgICAgIDogXCJyaWdodFwiO1xuICAgICAgICBjb25zdCBjYW5CZVBsYWNlZEJvdHRvbSA9IGVkZ2VEZXRlY3Rpb25SZXN1bHQucGxhY2VkLmJvdHRvbVxuICAgICAgICAgICAgPyBcImJvdHRvbVwiXG4gICAgICAgICAgICA6IFwidG9wXCI7XG4gICAgICAgIGNvbnN0IGNhbkJlUGxhY2VkVG9wID0gZWRnZURldGVjdGlvblJlc3VsdC5wbGFjZWQudG9wXG4gICAgICAgICAgICA/IFwidG9wXCJcbiAgICAgICAgICAgIDogXCJib3R0b21cIjtcbiAgICAgICAgLy8gYWxpZ25tZW50c1xuICAgICAgICBjb25zdCBjYW5CZUFsaWduZWRUb3AgPSBlZGdlRGV0ZWN0aW9uUmVzdWx0LmFsaWduZWQudG9wXG4gICAgICAgICAgICA/IFwidG9wXCJcbiAgICAgICAgICAgIDogXCJib3R0b21cIjtcbiAgICAgICAgY29uc3QgY2FuQmVBbGlnbmVkUmlnaHQgPSBlZGdlRGV0ZWN0aW9uUmVzdWx0LmFsaWduZWQucmlnaHRcbiAgICAgICAgICAgID8gXCJyaWdodFwiXG4gICAgICAgICAgICA6IFwibGVmdFwiO1xuICAgICAgICBjb25zdCBjYW5CZUFsaWduZWRMZWZ0ID0gZWRnZURldGVjdGlvblJlc3VsdC5hbGlnbmVkLmxlZnRcbiAgICAgICAgICAgID8gXCJsZWZ0XCJcbiAgICAgICAgICAgIDogXCJyaWdodFwiO1xuICAgICAgICAvLyBpZiBob3Jpem9udGFsL3ZlcnRpY2FsIHBsYWNlbWVudCBpcyBwb3NzaWJsZSBvcGVuaW5nIGxlZnQvcmlnaHQvdG9wL2JvdHRvbSByZXNwZWN0aXZlbHlcbiAgICAgICAgc3dpdGNoIChjb250ZXh0UGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVQbGFjZWRCb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZUFsaWduZWRUb3BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVBbGlnbmVkUmlnaHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZFJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlUGxhY2VkQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5Ib3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY2FuQmVBbGlnbmVkVG9wXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlQWxpZ25lZFJpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50OiBjYW5PcGVuVmVydGljYWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZEJvdHRvbVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjYW5CZVBsYWNlZFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5WZXJ0aWNhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNhbkJlQWxpZ25lZExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVBbGlnbmVkVG9wLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlIFwidG9wXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50OiBjYW5PcGVuVmVydGljYWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZFRvcFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjYW5CZVBsYWNlZFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5WZXJ0aWNhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNhbkJlQWxpZ25lZExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVBbGlnbmVkVG9wLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZFJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlUGxhY2VkQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5Ib3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY2FuQmVBbGlnbmVkVG9wXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlQWxpZ25lZFJpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGluZyBhZGp1c3RtZW50cyBmb3IgcG9wb3ZlciBtb2RhbCBvbiBZIGF4aXNcbiAgICBwcml2YXRlIGdldFlBZGp1c3RtZW50KFxuICAgICAgICBwb3BvdmVyVHJpZ2dlcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHBsYWNlbWVudEFuZEFsaWdubWVudDogSVBvcG92ZXJQbGFjZW1lbnRBbGlnbm1lbnRcbiAgICApOiBudW1iZXIge1xuICAgICAgICAvLyB5LWFkanVzdG1lbnQgbm90IG5lZWRlZCBmb3IgdG9wIG9yIGJvdHRvbSBwbGFjZW1lbnRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50LnBsYWNlbWVudCA9PT0gXCJ0b3BcIiB8fFxuICAgICAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50LnBsYWNlbWVudCA9PT0gXCJib3R0b21cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeUFkanVzdG1lbnQgPVxuICAgICAgICAgICAgcG9wb3ZlclRyaWdnZXIub2Zmc2V0SGVpZ2h0IC8gMiAtXG4gICAgICAgICAgICAocG9wb3ZlckNvbnN0YW50cy5hcnJvd09mZnNldCArIHBvcG92ZXJDb25zdGFudHMuYXJyb3dCb3JkZXJXaWR0aCk7XG4gICAgICAgIHJldHVybiBwbGFjZW1lbnRBbmRBbGlnbm1lbnQuYWxpZ25tZW50ID09PSBcInRvcFwiXG4gICAgICAgICAgICA/IHlBZGp1c3RtZW50XG4gICAgICAgICAgICA6IC15QWRqdXN0bWVudDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGluZyBhZGp1c3RtZW50cyBmb3IgcG9wb3ZlciBtb2RhbCBvbiBYIGF4aXNcbiAgICAvLyBwb3BvdmVyIG1vZGFsIHNob3VsZCBiZSBhbHdheXMgb24gY2VudGVyIG9uIFggYXhpc1xuICAgIHByaXZhdGUgZ2V0WEFkanVzdG1lbnQoXG4gICAgICAgIHBvcG92ZXJUcmlnZ2VyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50OiBJUG9wb3ZlclBsYWNlbWVudEFsaWdubWVudFxuICAgICk6IG51bWJlciB7XG4gICAgICAgIC8vIHgtYWRqdXN0bWVudCBub3QgbmVlZGVkIGZvciBsZWZ0IG9yIHJpZ2h0IHBsYWNlbWVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwbGFjZW1lbnRBbmRBbGlnbm1lbnQucGxhY2VtZW50ID09PSBcImxlZnRcIiB8fFxuICAgICAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50LnBsYWNlbWVudCA9PT0gXCJyaWdodFwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4QWRqdXN0bWVudCA9XG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlci5vZmZzZXRXaWR0aCAvIDIgLVxuICAgICAgICAgICAgKHBvcG92ZXJDb25zdGFudHMuYXJyb3dPZmZzZXQgKyBwb3BvdmVyQ29uc3RhbnRzLmFycm93Qm9yZGVyV2lkdGgpO1xuICAgICAgICByZXR1cm4gcGxhY2VtZW50QW5kQWxpZ25tZW50LmFsaWdubWVudCA9PT0gXCJsZWZ0XCJcbiAgICAgICAgICAgID8geEFkanVzdG1lbnRcbiAgICAgICAgICAgIDogLXhBZGp1c3RtZW50O1xuICAgIH1cbn1cbiJdfQ==