UNPKG

@junte/ui

Version:

Quality Angular UI components kit

382 lines 58.8 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, Renderer2, TemplateRef, ViewChild } from '@angular/core'; import { Behaviour } from '../../core/enums/behaviour'; import { Breakpoint } from '../../core/enums/breakpoint'; import { Feature } from '../../core/enums/feature'; import { Gutter } from '../../core/enums/gutter'; import { Placement } from '../../core/enums/placement'; import { Position } from '../../core/enums/position'; import { Triggers } from '../../core/enums/triggers'; import { BreakpointService } from '../../layout/responsive/breakpoint.service'; import { DeviceService } from '../../layout/responsive/device.service'; var PADDING_SIZE = 8; var DROPDOWN_PADDING_SIZE = 4; var PopoverOptions = /** @class */ (function () { function PopoverOptions(defs) { if (defs === void 0) { defs = null; } this.trigger = Triggers.hover; this.position = Position.bottom; this.placement = Placement.absolute; this.maxHeight = '500px'; this.padding = Gutter.normal; this.features = [Feature.smarty]; this.disabled = false; Object.assign(this, defs); } return PopoverOptions; }()); export { PopoverOptions }; var PopoverPosition = /** @class */ (function () { function PopoverPosition(top, left, shiftX, shiftY) { if (shiftX === void 0) { shiftX = 0; } if (shiftY === void 0) { shiftY = 0; } this.top = top; this.left = left; this.shiftX = shiftX; this.shiftY = shiftY; } return PopoverPosition; }()); var PopoverComponent = /** @class */ (function () { function PopoverComponent(renderer, hostRef, cd, breakpoint, device) { this.renderer = renderer; this.hostRef = hostRef; this.cd = cd; this.breakpoint = breakpoint; this.device = device; this.observers = { target: this.createObserver(), host: this.createObserver() }; this.options = new PopoverOptions(); this.host = 'jnt-popover-host'; } Object.defineProperty(PopoverComponent.prototype, "placement", { get: function () { return this.options.placement; }, enumerable: true, configurable: true }); Object.defineProperty(PopoverComponent.prototype, "context", { get: function () { return this.options.context; }, enumerable: true, configurable: true }); PopoverComponent.prototype.createObserver = function () { var _this = this; return new MutationObserver(function () { return _this.update(); }); }; PopoverComponent.prototype.getMaxSizes = function () { var _a, _b; var rect = this.target.getBoundingClientRect(); var maxWidth = +((_a = this.options.maxWidth) === null || _a === void 0 ? void 0 : _a.replace('px', '')); var maxHeight = +((_b = this.options.maxHeight) === null || _b === void 0 ? void 0 : _b.replace('px', '')); var padding = this.options.behaviour === Behaviour.dropdown ? DROPDOWN_PADDING_SIZE : PADDING_SIZE; var fullMaxWidth = null; var fullMaxHeight = null; switch (this.position) { case Position.top: { fullMaxHeight = rect.top - padding; if (this.options.behaviour === Behaviour.dropdown) { fullMaxWidth = window.innerWidth - rect.left - padding; } break; } case Position.right: { fullMaxWidth = window.innerWidth - rect.left - padding - rect.width; if (this.options.behaviour === Behaviour.dropdown) { fullMaxHeight = window.innerHeight - rect.top - padding; } break; } case Position.bottom: { fullMaxHeight = window.innerHeight - rect.top - padding - rect.height; if (this.options.behaviour === Behaviour.dropdown) { fullMaxWidth = window.innerWidth - rect.left - padding; } break; } case Position.rightBottom: { fullMaxHeight = window.innerHeight - rect.top - padding - rect.height; if (this.options.behaviour === Behaviour.dropdown) { fullMaxWidth = rect.right - padding; } break; } case Position.left: { fullMaxWidth = rect.left - padding; if (this.options.behaviour === Behaviour.dropdown) { fullMaxHeight = window.innerHeight - rect.top - padding; } break; } } if (!!fullMaxWidth) { this.options.maxWidth = (!!maxWidth ? Math.min(maxWidth, fullMaxWidth) : fullMaxWidth) + "px"; } if (!!fullMaxHeight) { this.options.maxHeight = (!!maxHeight ? Math.min(maxHeight, fullMaxHeight) : fullMaxHeight) + "px"; } }; PopoverComponent.prototype.checkPosition = function (position) { var rect = this.target.getBoundingClientRect(); var host = this.hostRef.nativeElement; var offsetLeft = this.options.placement === Placement.absolute ? window.pageXOffset || document.documentElement.offsetLeft : 0; var offsetTop = this.options.placement === Placement.absolute ? window.pageYOffset || document.documentElement.offsetTop : 0; var padding = this.options.behaviour === Behaviour.dropdown ? DROPDOWN_PADDING_SIZE : PADDING_SIZE; switch (this.position) { case Position.top: { var shift = offsetTop - padding + host.clientHeight; if (position.top - shift < 0) { if (rect.top + padding + host.clientHeight < window.innerHeight) { this.position = Position.bottom; } else if (rect.right + padding + host.clientWidth < window.innerWidth) { this.position = Position.right; } else if (rect.left - padding - host.clientWidth > 0) { this.position = Position.left; } else { this.getMaxSizes(); } } break; } case Position.right: { var shift = offsetLeft - padding - this.target.clientWidth - host.clientWidth; if (position.left - shift > window.innerWidth) { if (rect.left - padding - host.clientWidth > 0) { this.position = Position.left; } else if (rect.top + padding + host.clientHeight < window.innerHeight) { this.position = Position.bottom; } else if (rect.top - padding - host.clientHeight > 0) { this.position = Position.top; } else { this.getMaxSizes(); } } break; } case Position.bottom: case Position.rightBottom: { var shift = offsetTop + padding - this.target.clientHeight - host.clientHeight; if (position.top - shift > window.innerHeight) { if (rect.top - padding - host.clientHeight > 0) { this.position = Position.top; } else if (rect.right + padding + host.clientWidth < window.innerWidth) { this.position = Position.right; } else if (rect.left - padding - host.clientWidth > 0) { this.position = Position.left; } else { this.getMaxSizes(); } } break; } case Position.left: { var shift = offsetLeft - padding + host.clientWidth; if (position.left - shift < 0) { if (rect.right + padding + host.clientWidth < window.innerWidth) { this.position = Position.right; } else if (rect.top + padding + host.clientHeight < window.innerHeight) { this.position = Position.bottom; } else if (rect.top - padding - host.clientHeight > 0) { this.position = Position.top; } else { this.getMaxSizes(); } } break; } } }; PopoverComponent.prototype.getPosition = function () { var _a; var rect = this.target.getBoundingClientRect(); var offsetLeft = this.options.placement === Placement.absolute ? window.pageXOffset || document.documentElement.offsetLeft : 0; var offsetTop = this.options.placement === Placement.absolute ? window.pageYOffset || document.documentElement.offsetTop : 0; var position = new PopoverPosition(rect.top + offsetTop, rect.left + offsetLeft); var host = this.hostRef.nativeElement; this.position = this.options.position; if ((_a = this.options.features) === null || _a === void 0 ? void 0 : _a.includes(Feature.smarty)) { this.checkPosition(position); } else { this.getMaxSizes(); } this.renderer.setAttribute(host, 'data-placement', this.position); this.cd.detectChanges(); switch (this.position) { case Position.top: { position.top -= host.clientHeight; position.left += (this.target.clientWidth - host.clientWidth) / 2; position.shiftX = position.left < 0 ? position.left : (position.left > (window.innerWidth + offsetLeft) - host.clientWidth ? host.clientWidth - ((window.innerWidth + offsetLeft) - position.left) : 0); break; } case Position.right: { position.top += (this.target.clientHeight - host.clientHeight) / 2; position.left += this.target.clientWidth; position.shiftY = (position.top - offsetTop) < 0 ? position.top - offsetTop : (position.top > (window.innerHeight + offsetTop) - host.clientHeight ? host.clientHeight - ((window.innerHeight + offsetTop) - position.top) : 0); break; } case Position.bottom: case Position.rightBottom: { position.top += this.target.clientHeight; position.left += (this.target.clientWidth - host.clientWidth) / 2; position.shiftX = position.left < 0 ? position.left : (position.left > (window.innerWidth + offsetLeft) - host.clientWidth ? host.clientWidth - ((window.innerWidth + offsetLeft) - position.left) : 0); break; } case Position.left: { position.top += (this.target.clientHeight - host.clientHeight) / 2; position.left -= host.clientWidth; position.shiftY = (position.top - offsetTop) < 0 ? position.top - offsetTop : (position.top > (window.innerHeight + offsetTop) - host.clientHeight ? host.clientHeight - ((window.innerHeight + offsetTop) - position.top) : 0); break; } } return position; }; // TODO: options to type with optionals?. PopoverComponent.prototype.show = function (_a, options) { var target = _a.nativeElement; if (options === void 0) { options = {}; } this.target = target; this.options = new PopoverOptions(options); this.minWidth = this.options.minWidth || (this.options.behaviour === Behaviour.dropdown ? this.target.clientWidth + 'px' : null); // TODO: think to be better this.observers.target.observe(target, { childList: true, subtree: true }); this.observers.host.observe(this.hostRef.nativeElement, { childList: true, subtree: true }); this.renderer.setAttribute(this.hostRef.nativeElement, 'data-dropdown', this.options.behaviour === Behaviour.dropdown ? 'true' : 'false'); this.renderer.setStyle(this.hostRef.nativeElement, 'display', 'block'); this.cd.detectChanges(); }; PopoverComponent.prototype.picked = function (elements) { return elements.indexOf(this.hostRef.nativeElement) !== -1; }; PopoverComponent.prototype.update = function () { if (!this.target) { console.error('target is not defined'); return; } var host = this.hostRef.nativeElement; this.renderer.removeStyle(this.arrow.nativeElement, 'top'); this.renderer.removeStyle(this.arrow.nativeElement, 'left'); this.renderer.removeStyle(host, 'top'); this.renderer.removeStyle(host, 'left'); this.renderer.setStyle(host, 'width', this.breakpoint.current === Breakpoint.mobile && (this.position === Position.top || this.position === Position.bottom) ? '100%' : 'auto'); var position = this.getPosition(); var rect = this.target.getBoundingClientRect(); var left = position.left - position.shiftX; var top = position.top - position.shiftY; if (this.options.behaviour === Behaviour.dropdown) { this.getMaxSizes(); if (this.position === Position.top || this.position === Position.bottom) { left = rect.left + (this.placement === Placement.absolute ? window.pageXOffset : 0); } else if (this.position === Position.rightTop || this.position === Position.rightBottom) { this.renderer.setStyle(host, 'width', this.breakpoint.current === Breakpoint.mobile ? this.options.maxWidth : 'auto'); left = rect.left - host.clientWidth + rect.width + (this.placement === Placement.absolute ? window.pageXOffset : 0); } else { top = rect.top + (this.placement === Placement.absolute ? window.pageYOffset : 0); } } this.renderer.setStyle(host, 'top', top + "px"); this.renderer.setStyle(host, 'left', left + "px"); if (this.options.behaviour !== Behaviour.dropdown) { switch (this.position) { case Position.top: case Position.bottom: case Position.rightBottom: { this.renderer.setStyle(this.arrow.nativeElement, 'left', "calc(50% + " + position.shiftX + "px)"); break; } case Position.right: case Position.left: { this.renderer.setStyle(this.arrow.nativeElement, 'top', "calc(50% + " + position.shiftY + "px"); break; } } } this.cd.detectChanges(); }; PopoverComponent.prototype.hide = function () { this.observers.target.disconnect(); this.observers.host.disconnect(); this.options = new PopoverOptions(); this.renderer.setStyle(this.hostRef.nativeElement, 'display', 'none'); this.cd.detectChanges(); }; PopoverComponent.ctorParameters = function () { return [ { type: Renderer2 }, { type: ElementRef }, { type: ChangeDetectorRef }, { type: BreakpointService }, { type: DeviceService } ]; }; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], PopoverComponent.prototype, "host", void 0); __decorate([ HostBinding('style.position'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], PopoverComponent.prototype, "placement", null); __decorate([ HostBinding('attr.context'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], PopoverComponent.prototype, "context", null); __decorate([ HostBinding('attr.data-placement'), __metadata("design:type", Object) ], PopoverComponent.prototype, "position", void 0); __decorate([ HostBinding('style.min-width'), __metadata("design:type", String) ], PopoverComponent.prototype, "minWidth", void 0); __decorate([ ViewChild('arrow'), __metadata("design:type", ElementRef) ], PopoverComponent.prototype, "arrow", void 0); PopoverComponent = __decorate([ Component({ selector: 'jnt-popover', template: "<ng-template #defaultContentTemplate>\n <div child-of=\"jnt-popover-host\" data-content>\n {{options.content}}\n </div>\n</ng-template>\n\n<svg child-of=\"jnt-popover-host\" #arrow data-arrow width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\">\n <g child-of=\"jnt-popover-host\" clip-path=\"url(#popover_marker_clip)\">\n <g child-of=\"jnt-popover-host\" data-inner>\n <path child-of=\"jnt-popover-host\" d=\"M4 14C8.41827 14 11 22 13 22C15 22 17.5817 14 22 14L4 14Z\"></path>\n </g>\n <rect child-of=\"jnt-popover-host\" y=\"6\" width=\"26\" height=\"8\"></rect>\n </g>\n <defs child-of=\"jnt-popover-host\" >\n <filter child-of=\"jnt-popover-host\" id=\"popover_marker_shadow-light\" x=\"-4\" y=\"6\" width=\"34\" height=\"24\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood child-of=\"jnt-popover-host\" flood-opacity=\"0\" result=\"BackgroundImageFix\"></feFlood>\n <feColorMatrix child-of=\"jnt-popover-host\" in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"></feColorMatrix>\n <feGaussianBlur child-of=\"jnt-popover-host\" stdDeviation=\"4\"></feGaussianBlur>\n <feColorMatrix child-of=\"jnt-popover-host\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"></feColorMatrix>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow\"></feBlend>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow\" result=\"shape\"></feBlend>\n </filter>\n <filter child-of=\"jnt-popover-host\" id=\"popover_marker_shadow-dark\" x=\"-4\" y=\"6\" width=\"34\" height=\"24\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood child-of=\"jnt-popover-host\" flood-opacity=\"0\" result=\"BackgroundImageFix\"></feFlood>\n <feColorMatrix child-of=\"jnt-popover-host\" in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"></feColorMatrix>\n <feGaussianBlur child-of=\"jnt-popover-host\" stdDeviation=\"4\"></feGaussianBlur>\n <feColorMatrix child-of=\"jnt-popover-host\" type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0\"></feColorMatrix>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow\"></feBlend>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow\" result=\"shape\"></feBlend>\n </filter>\n <clipPath child-of=\"jnt-popover-host\" id=\"popover_marker_clip\">\n <rect child-of=\"jnt-popover-host\" width=\"26\" height=\"26\"></rect>\n </clipPath>\n </defs>\n</svg>\n\n<div child-of=\"jnt-popover-host\" data-wrapper role=\"popover\"\n [attr.data-windows]=\"device.platform.windows\"\n [attr.data-padding]=\"options.padding\"\n [ngStyle]=\"{'max-height': options.maxHeight, 'max-width': options.maxWidth}\">\n <div child-of=\"jnt-popover-host\" data-title *ngIf=\"options.title\">{{options.title}}</div>\n\n <ng-container *ngTemplateOutlet=\"!!options.contentTemplate\n ? options.contentTemplate : defaultContentTemplate\">\n </ng-container>\n</div>", changeDetection: ChangeDetectionStrategy.OnPush }), __metadata("design:paramtypes", [Renderer2, ElementRef, ChangeDetectorRef, BreakpointService, DeviceService]) ], PopoverComponent); return PopoverComponent; }()); export { PopoverComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AanVudGUvdWkvIiwic291cmNlcyI6WyJsaWIvb3ZlcmxheXMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RSxJQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsSUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFFaEM7SUFpQkUsd0JBQVksSUFBb0M7UUFBcEMscUJBQUEsRUFBQSxXQUFvQztRQVpoRCxZQUFPLEdBQWEsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNuQyxhQUFRLEdBQWEsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxjQUFTLEdBQWMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUcxQyxjQUFTLEdBQUcsT0FBTyxD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REFDMUI7SUFHVDtRQURDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQzs7c0RBQ2Q7SUFHakI7UUFEQyxTQUFTLENBQUMsT0FBTyxDQUFDO2tDQUNaLFVBQVU7bURBQUM7SUEzQlAsZ0JBQWdCO1FBTDVCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLHF1R0FBMEM7WUFDMUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07U0FDaEQsQ0FBQzt5Q0E4QjhCLFNBQVM7WUFDVixVQUFVO1lBQ2YsaUJBQWlCO1lBQ1QsaUJBQWlCO1lBQ3RCLGFBQWE7T0FqQzdCLGdCQUFnQixDQW1UNUI7SUFBRCx1QkFBQztDQUFBLEFBblRELElBbVRDO1NBblRZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3VyIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9iZWhhdmlvdXInO1xuaW1wb3J0IHsgQnJlYWtwb2ludCB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvYnJlYWtwb2ludCc7XG5pbXBvcnQgeyBGZWF0dXJlIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9mZWF0dXJlJztcbmltcG9ydCB7IEd1dHRlciB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvZ3V0dGVyJztcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvcGxhY2VtZW50JztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9wb3NpdGlvbic7XG5pbXBvcnQgeyBUcmlnZ2VycyB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvdHJpZ2dlcnMnO1xuaW1wb3J0IHsgQnJlYWtwb2ludFNlcnZpY2UgfSBmcm9tICcuLi8uLi9sYXlvdXQvcmVzcG9uc2l2ZS9icmVha3BvaW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGV2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2RldmljZS5zZXJ2aWNlJztcblxuY29uc3QgUEFERElOR19TSVpFID0gODtcbmNvbnN0IERST1BET1dOX1BBRERJTkdfU0laRSA9IDQ7XG5cbmV4cG9ydCBjbGFzcyBQb3BvdmVyT3B0aW9ucyB7XG5cbiAgdGl0bGU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xuICBjb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIHRyaWdnZXI6IFRyaWdnZXJzID0gVHJpZ2dlcnMuaG92ZXI7XG4gIHBvc2l0aW9uOiBQb3NpdGlvbiA9IFBvc2l0aW9uLmJvdHRvbTtcbiAgcGxhY2VtZW50OiBQbGFjZW1lbnQgPSBQbGFjZW1lbnQuYWJzb2x1dGU7XG4gIG1heFdpZHRoOiBzdHJpbmc7XG4gIG1pbldpZHRoOiBzdHJpbmc7XG4gIG1heEhlaWdodCA9ICc1MDBweCc7XG4gIHBhZGRpbmc6IEd1dHRlciA9IEd1dHRlci5ub3JtYWw7XG4gIGZlYXR1cmVzOiBGZWF0dXJlW10gPSBbRmVhdHVyZS5zbWFydHldO1xuICBiZWhhdmlvdXI6IEJlaGF2aW91cjtcbiAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgY29udGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRlZnM6IFBhcnRpYWw8UG9wb3Zlck9wdGlvbnM+ID0gbnVsbCkge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGVmcyk7XG4gIH1cblxufVxuXG5jbGFzcyBQb3BvdmVyUG9zaXRpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBsZWZ0OiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBzaGlmdFg6IG51bWJlciA9IDAsXG4gICAgICAgICAgICAgIHB1YmxpYyBzaGlmdFk6IG51bWJlciA9IDApIHtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtcG9wb3ZlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmVuY2Fwc3VsYXRlZC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSBvYnNlcnZlcnMgPSB7dGFyZ2V0OiB0aGlzLmNyZWF0ZU9ic2VydmVyKCksIGhvc3Q6IHRoaXMuY3JlYXRlT2JzZXJ2ZXIoKX07XG5cbiAgb3B0aW9ucyA9IG5ldyBQb3BvdmVyT3B0aW9ucygpO1xuICB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5ob3N0JylcbiAgcmVhZG9ubHkgaG9zdCA9ICdqbnQtcG9wb3Zlci1ob3N0JztcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJylcbiAgZ2V0IHBsYWNlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBsYWNlbWVudDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5jb250ZXh0JylcbiAgZ2V0IGNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZXh0O1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtcGxhY2VtZW50JylcbiAgcG9zaXRpb247XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5taW4td2lkdGgnKVxuICBtaW5XaWR0aDogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoJ2Fycm93JylcbiAgYXJyb3c6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBwcml2YXRlIGhvc3RSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGJyZWFrcG9pbnQ6IEJyZWFrcG9pbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgZGV2aWNlOiBEZXZpY2VTZXJ2aWNlKSB7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9ic2VydmVyKCkge1xuICAgIHJldHVybiBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF4U2l6ZXMoKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heFdpZHRoID0gK3RoaXMub3B0aW9ucy5tYXhXaWR0aD8ucmVwbGFjZSgncHgnLCAnJyk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gK3RoaXMub3B0aW9ucy5tYXhIZWlnaHQ/LnJlcGxhY2UoJ3B4JywgJycpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLm9wdGlvbnMuYmVoYXZpb3VyID09PSBCZWhhdmlvdXIuZHJvcGRvd24gPyBEUk9QRE9XTl9QQURESU5HX1NJWkUgOiBQQURESU5HX1NJWkU7XG4gICAgbGV0IGZ1bGxNYXhXaWR0aCA9IG51bGw7XG4gICAgbGV0IGZ1bGxNYXhIZWlnaHQgPSBudWxsO1xuICAgIHN3aXRjaCAodGhpcy5wb3NpdGlvbikge1xuICAgICAgY2FzZSBQb3NpdGlvbi50b3A6IHtcbiAgICAgICAgZnVsbE1heEhlaWdodCA9IHJlY3QudG9wIC0gcGFkZGluZztcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWhhdmlvdXIgPT09IEJlaGF2aW91ci5kcm9wZG93bikge1xuICAgICAgICAgIGZ1bGxNYXhXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5sZWZ0IC0gcGFkZGluZztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUG9zaXRpb24ucmlnaHQ6IHtcbiAgICAgICAgZnVsbE1heFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSByZWN0LmxlZnQgLSBwYWRkaW5nIC0gcmVjdC53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWhhdmlvdXIgPT09IEJlaGF2aW91ci5kcm9wZG93bikge1xuICAgICAgICAgIGZ1bGxNYXhIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCAtIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uLmJvdHRvbToge1xuICAgICAgICBmdWxsTWF4SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSBwYWRkaW5nIC0gcmVjdC5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYmVoYXZpb3VyID09PSBCZWhhdmlvdXIuZHJvcGRvd24pIHtcbiAgICAgICAgICBmdWxsTWF4V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdCAtIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uLnJpZ2h0Qm90dG9tOiB7XG4gICAgICAgIGZ1bGxNYXhIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCAtIHBhZGRpbmcgLSByZWN0LmhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWhhdmlvdXIgPT09IEJlaGF2aW91ci5kcm9wZG93bikge1xuICAgICAgICAgIGZ1bGxNYXhXaWR0aCA9IHJlY3QucmlnaHQgLSBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbi5sZWZ0OiB7XG4gICAgICAgIGZ1bGxNYXhXaWR0aCA9IHJlY3QubGVmdCAtIHBhZGRpbmc7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYmVoYXZpb3VyID09PSBCZWhhdmlvdXIuZHJvcGRvd24pIHtcbiAgICAgICAgICBmdWxsTWF4SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghIWZ1bGxNYXhXaWR0aCkge1xuICAgICAgdGhpcy5vcHRpb25zLm1heFdpZHRoID0gYCR7ISFtYXhXaWR0aCA/IE1hdGgubWluKG1heFdpZHRoLCBmdWxsTWF4V2lkdGgpIDogZnVsbE1heFdpZHRofXB4YDtcbiAgICB9XG4gICAgaWYgKCEhZnVsbE1heEhlaWdodCkge1xuICAgICAgdGhpcy5vcHRpb25zLm1heEhlaWdodCA9IGAkeyEhbWF4SGVpZ2h0ID8gTWF0aC5taW4obWF4SGVpZ2h0LCBmdWxsTWF4SGVpZ2h0KSA6IGZ1bGxNYXhIZWlnaHR9cHhgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQb3NpdGlvbihwb3NpdGlvbjogUG9wb3ZlclBvc2l0aW9uKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHtuYXRpdmVFbGVtZW50OiBob3N0fSA9IHRoaXMuaG9zdFJlZjtcbiAgICBjb25zdCBvZmZzZXRMZWZ0ID0gdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9PT0gUGxhY2VtZW50LmFic29sdXRlXG4gICAgICA/IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0TGVmdCA6IDA7XG4gICAgY29uc3Qgb2Zmc2V0VG9wID0gdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9PT0gUGxhY2VtZW50LmFic29sdXRlXG4gICAgICA/IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0VG9wIDogMDtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5vcHRpb25zLmJlaGF2aW91ciA9PT0gQmVoYXZpb3VyLmRyb3Bkb3duID8gRFJPUERPV05fUEFERElOR19TSVpFIDogUEFERElOR19TSVpFO1xuXG4gICAgc3dpdGNoICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICBjYXNlIFBvc2l0aW9uLnRvcDoge1xuICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldFRvcCAtIHBhZGRpbmcgKyBob3N0LmNsaWVudEhlaWdodDtcbiAgICAgICAgaWYgKHBvc2l0aW9uLnRvcCAtIHNoaWZ0IDwgMCkge1xuICAgICAgICAgIGlmIChyZWN0LnRvcCArIHBhZGRpbmcgKyBob3N0LmNsaWVudEhlaWdodCA8IHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFBvc2l0aW9uLmJvdHRvbTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY3QucmlnaHQgKyBwYWRkaW5nICsgaG9zdC5jbGllbnRXaWR0aCA8IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24ucmlnaHQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWN0LmxlZnQgLSBwYWRkaW5nIC0gaG9zdC5jbGllbnRXaWR0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBQb3NpdGlvbi5sZWZ0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldE1heFNpemVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbi5yaWdodDoge1xuICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldExlZnQgLSBwYWRkaW5nIC0gdGhpcy50YXJnZXQuY2xpZW50V2lkdGggLSBob3N0LmNsaWVudFdpZHRoO1xuICAgICAgICBpZiAocG9zaXRpb24ubGVmdCAtIHNoaWZ0ID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICBpZiAocmVjdC5sZWZ0IC0gcGFkZGluZyAtIGhvc3QuY2xpZW50V2lkdGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24ubGVmdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY3QudG9wICsgcGFkZGluZyArIGhvc3QuY2xpZW50SGVpZ2h0IDwgd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24uYm90dG9tO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjdC50b3AgLSBwYWRkaW5nIC0gaG9zdC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24udG9wO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldE1heFNpemVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbi5ib3R0b206XG4gICAgICBjYXNlIFBvc2l0aW9uLnJpZ2h0Qm90dG9tOiB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gb2Zmc2V0VG9wICsgcGFkZGluZyAtIHRoaXMudGFyZ2V0LmNsaWVudEhlaWdodCAtIGhvc3QuY2xpZW50SGVpZ2h0O1xuICAgICAgICBpZiAocG9zaXRpb24udG9wIC0gc2hpZnQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICBpZiAocmVjdC50b3AgLSBwYWRkaW5nIC0gaG9zdC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24udG9wO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjdC5yaWdodCArIHBhZGRpbmcgKyBob3N0LmNsaWVudFdpZHRoIDwgd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBQb3NpdGlvbi5yaWdodDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY3QubGVmdCAtIHBhZGRpbmcgLSBob3N0LmNsaWVudFdpZHRoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFBvc2l0aW9uLmxlZnQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0TWF4U2l6ZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uLmxlZnQ6IHtcbiAgICAgICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRMZWZ0IC0gcGFkZGluZyArIGhvc3QuY2xpZW50V2lkdGg7XG4gICAgICAgIGlmIC