ng-devui
Version:
DevUI components based on Angular
303 lines • 49.7 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, Renderer2, ViewChild } from '@angular/core';
import { createPopper } from '@popperjs/core';
import { Subject } from 'rxjs';
import { AnimationCurves, AnimationDuration } from '../animations';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class PopperComponent {
get open() {
return this._isOpen;
}
set open(value) {
if (this._isOpen === value) {
return;
}
this.animate = true;
if (value) {
this.show();
}
else {
this.close();
}
this._isOpen = value;
PopperComponent.nextTick(() => {
this.openChange.emit(value);
this.setBlurListener();
});
}
static nextTick(fn) {
// Force to run fn after current data changed.
setTimeout(() => fn.bind(this)());
}
constructor(el, renderer, ngZone, changeDetectorRef, doc) {
this.el = el;
this.renderer = renderer;
this.ngZone = ngZone;
this.changeDetectorRef = changeDetectorRef;
this.doc = doc;
this.fluidPopper = true;
this.poppoverAppendDirection = 'bottom';
this.appendTo = 'body';
this.showAnimation = true;
this.popper = null;
this._isOpen = false;
this.directionAnimationTransformOrigin = {
'top': '0 100%',
'bottom': '0 0'
};
this.directionSubject = new Subject();
this.openChange = new EventEmitter();
this.onDocumentClick = ($event) => {
if (!!this.appendTo && this.popperContainer.nativeElement !== $event.target &&
!this.popperContainer.nativeElement.contains($event.target)) {
this.open = false;
}
else if (!this.appendTo && this.open && !this.el.nativeElement.contains($event.target)) {
this.open = false;
}
};
this.blockEvent = ($event) => {
$event.preventDefault();
$event.stopPropagation();
};
this.applyTransitionStyle = (data) => {
const optionsContainer = this.popperContainer.nativeElement;
this.updateContainerTransitionDirection(data?.state?.modifiersData?.flip?._skip);
if (this.animate) {
// perspective(1px) solves pixel shift caused by webkit transform
this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform +
` scale3d(1, 0.8, 1) perspective(1px) ${this.popperDirection === 'bottom' ? 'translateY(-4px)' : 'translateY(4px)'}`);
// Set container init state to transparent as beginning of the transition.
this.renderer.setStyle(optionsContainer, 'opacity', 0);
PopperComponent.nextTick(() => {
this.setTransition('open');
const that = this;
const handler = (e) => {
// remove transition
that.setTransition();
e.currentTarget.removeEventListener(e.type, handler);
};
optionsContainer.addEventListener('transitionend', handler);
this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform.replace('scale3d(1, 0.8, 1)', 'scale3d(1, 1, 1)'));
this.popperDirection === 'bottom' ?
this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform.replace('translateY(-4px)', 'translateY(0)')) :
this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform.replace('translateY(4px)', 'translateY(0)'));
this.renderer.setStyle(optionsContainer, 'opacity', 1);
this.animate = false;
});
}
else {
// handle popper re-rendering, incoming transform doesn't have scale info
this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform + (this.open ? ' scale3d(1, 1, 1)' : ' scale3d(1, 0.8, 1)') + ' perspective(1px)');
}
};
this.document = this.doc;
}
show() {
// Append to selector or original parent.
if (this.appendTo) {
if (this.fluidPopper) {
let popperWidth = this.popperActivator.nativeElement && this.popperActivator.nativeElement.offsetWidth;
if (this.extraConfig && this.extraConfig.extraWidth) {
popperWidth = popperWidth + this.extraConfig.extraWidth;
}
const firstEle = this.popperContainer.nativeElement.firstElementChild;
if (firstEle.classList.contains('devui-search-container')) {
for (const child of this.popperContainer.nativeElement.children) {
child.style.width = `${popperWidth}px`;
}
}
else {
firstEle.style.width = `${popperWidth}px`;
}
}
this.attachPopperContainerToSelector(this.appendTo);
}
else {
this.attachPopperContainerToNode(this.popperParent);
}
this.popper = this.createCustomPopper();
this.renderer.setStyle(this.popperContainer.nativeElement, 'display', 'block');
}
close() {
const popperContainer = this.popperContainer.nativeElement;
this.setTransition('close');
// For IE 11/Edge
if (popperContainer.style.transform.match(/scale3d\(1, 1, 1\)/)) {
// Replace transform open state with close state
this.renderer.setStyle(popperContainer, 'transform', popperContainer.style.transform.replace('scale3d(1, 1, 1)', 'scale3d(1, 0.8, 1)'));
}
else {
// perspective(1px) solves pixel shift caused by webkit transform
this.renderer.setStyle(popperContainer, 'transform', popperContainer.style.transform + ` scale3d(1, 0.8, 1) perspective(1px)`);
}
// Set container to transparent
this.renderer.setStyle(popperContainer, 'opacity', 0.8);
// Can't use bind(this) since it calls itself
const that = this;
const handler = (e) => {
if (!that.open && that.popper) {
// Set final state of container to invisible
that.renderer.setStyle(popperContainer, 'display', 'none');
that.animate = false;
// Remove transition
that.setTransition();
that.popper.destroy();
that.popper = null;
that.detachPopperContainer();
}
e.currentTarget.removeEventListener(e.type, handler);
};
if (this.showAnimation) {
this.popperContainer.nativeElement.addEventListener('transitionend', handler);
}
else {
that.renderer.setStyle(popperContainer, 'display', 'none');
that.animate = false;
that.popper.destroy();
that.popper = null;
that.detachPopperContainer();
}
}
setBlurListener() {
this.ngZone.runOutsideAngular(() => {
if (this.open) {
this.document.addEventListener('click', this.onDocumentClick);
this.popperContainer.nativeElement.addEventListener('click', this.blockEvent);
}
else {
this.document.removeEventListener('click', this.onDocumentClick);
this.popperContainer.nativeElement.removeEventListener('click', this.blockEvent);
}
});
}
updateContainerTransitionDirection(flipped) {
const direction = flipped ? 'top' : 'bottom';
if (this.popperDirection !== direction) {
this.popperDirection = direction;
this.setTransitionOrigin();
}
this.directionSubject.next(this.popperDirection);
}
setTransitionOrigin() {
if (this.popperContainer.nativeElement) {
this.renderer.setStyle(this.popperContainer.nativeElement, 'transform-origin', this.directionAnimationTransformOrigin[this.popperDirection]);
}
}
createCustomPopper() {
return createPopper(this.popperActivator.nativeElement, this.popperContainer.nativeElement, {
placement: 'bottom-start',
modifiers: [
{
name: 'preventOverflow',
options: {
mainAxis: true, // true by default
},
},
{
name: 'applyReactStyle',
phase: 'afterWrite',
enabled: true, // true by default
fn: this.applyTransitionStyle
},
{
name: 'offset',
options: {
offset: this.extraConfig && this.extraConfig.offset
? [parseInt(this.extraConfig.offset.split(',')[0], 10), parseInt(this.extraConfig.offset.split(',')[1], 10)]
: [0, 5], // true by default
},
},
{
name: 'flip',
options: {
flipVariations: true, // true by default
},
},
],
strategy: this.appendTo ? 'fixed' : 'absolute',
});
}
setTransition(command = null) {
const popperContainer = this.popperContainer.nativeElement;
if (this.animate && command) {
if (command === 'open') {
this.renderer.setStyle(popperContainer, 'transition', this.showAnimation
? `all ${AnimationDuration.BASE} ${AnimationCurves.EASE_OUT}` : 'none');
}
else if (command === 'close') {
popperContainer.style.transition = this.showAnimation ? `all ${AnimationDuration.BASE} ${AnimationCurves.EASE_IN}` : 'none';
}
}
else {
this.renderer.setStyle(popperContainer, 'transition', null);
}
}
update() {
PopperComponent.nextTick(() => {
if (this.popper) {
this.popper.forceUpdate();
}
});
}
ngOnDestroy() {
// Close popper
this.open = false;
}
detachPopperContainer() {
// Cache popper's parent and popper node.
this.popperParent = this.popperContainer.nativeElement.parentNode;
this.popperNode = this.popperContainer.nativeElement;
if (this.popperParent && this.popperNode) {
this.popperParent.removeChild(this.popperNode);
}
}
attachPopperContainerToNode(nodeParent) {
if (nodeParent && this.popperNode) {
this.popperParent = nodeParent;
this.popperParent.appendChild(this.popperNode);
}
}
attachPopperContainerToSelector(targetSelector) {
const nodeParent = this.document.querySelector(targetSelector);
this.attachPopperContainerToNode(nodeParent);
}
ngAfterViewInit() {
// Detach popper container once view initialized.
this.detachPopperContainer();
}
directionChange() {
return this.directionSubject.asObservable();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PopperComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PopperComponent, selector: "d-popper-component", inputs: { open: "open", fluidPopper: "fluidPopper", poppoverAppendDirection: "poppoverAppendDirection", appendTo: "appendTo", extraConfig: "extraConfig", showAnimation: "showAnimation" }, outputs: { openChange: "openChange" }, viewQueries: [{ propertyName: "popperActivator", first: true, predicate: ["popperActivator"], descendants: true, static: true }, { propertyName: "popperContainer", first: true, predicate: ["popperContainer"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"popper\">\n <div class=\"popper-activator\" #popperActivator>\n <ng-content select=\"[popper-activator]\"></ng-content>\n </div>\n\n <div\n class=\"popper-container devui-popover-container-{{ poppoverAppendDirection }}\"\n #popperContainer\n [ngClass]=\"{ fluid: fluidPopper && !appendTo }\"\n >\n <div class=\"devui-dropdown-menu-wrap\">\n <ng-content select=\"[popper-prepend]\"></ng-content>\n <div class=\"popper-container-scrollable devui-scrollbar\">\n <ng-content select=\"[popper-container]\"></ng-content>\n </div>\n </div>\n <div class=\"popper-append-area\">\n <ng-content select=\"[popper-append]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [".popper{position:relative;width:100%}.popper .popper-activator{width:100%}.popper-container{display:none;z-index:var(--devui-z-index-dropdown, 1052);position:absolute;box-shadow:var(--devui-shadow-length-feedback-overlay, 0 8px 24px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background:var(--devui-connected-overlay-bg, #ffffff);border:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;border-radius:var(--devui-border-radius, 2px)}.popper-container.devui-popover-container-right,.popper-container.devui-popover-container-left,.popper-container.devui-popover-container-top{display:flex!important}.popper-container.devui-popover-container-right>.devui-dropdown-menu-wrap,.popper-container.devui-popover-container-left>.devui-dropdown-menu-wrap,.popper-container.devui-popover-container-top>.devui-dropdown-menu-wrap{display:inline-block}.popper-container.devui-popover-container-right>.popper-append-area,.popper-container.devui-popover-container-left>.popper-append-area,.popper-container.devui-popover-container-top>.popper-append-area{display:inline-block;overflow:auto}.popper-container.devui-popover-container-right .popper-append-area,.popper-container.devui-popover-container-left .popper-append-area,.popper-container.devui-popover-container-top .popper-append-area{border-left:1px solid var(--devui-dividing-line, #f0f0f0)}.popper-container.devui-popover-container-right .popper-append-area:before,.popper-container.devui-popover-container-left .popper-append-area:before,.popper-container.devui-popover-container-top .popper-append-area:before{display:none}.popper-container.devui-popover-container-top{flex-direction:column-reverse}.popper-container.devui-popover-container-left .popper-append-area{order:-1}.popper-container .popper-container-scrollable{min-height:40px;width:100%;overflow:auto;overflow:overlay}.popper-container.fluid{width:100%}:host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PopperComponent, decorators: [{
type: Component,
args: [{ selector: 'd-popper-component', template: "<div class=\"popper\">\n <div class=\"popper-activator\" #popperActivator>\n <ng-content select=\"[popper-activator]\"></ng-content>\n </div>\n\n <div\n class=\"popper-container devui-popover-container-{{ poppoverAppendDirection }}\"\n #popperContainer\n [ngClass]=\"{ fluid: fluidPopper && !appendTo }\"\n >\n <div class=\"devui-dropdown-menu-wrap\">\n <ng-content select=\"[popper-prepend]\"></ng-content>\n <div class=\"popper-container-scrollable devui-scrollbar\">\n <ng-content select=\"[popper-container]\"></ng-content>\n </div>\n </div>\n <div class=\"popper-append-area\">\n <ng-content select=\"[popper-append]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [".popper{position:relative;width:100%}.popper .popper-activator{width:100%}.popper-container{display:none;z-index:var(--devui-z-index-dropdown, 1052);position:absolute;box-shadow:var(--devui-shadow-length-feedback-overlay, 0 8px 24px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background:var(--devui-connected-overlay-bg, #ffffff);border:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;border-radius:var(--devui-border-radius, 2px)}.popper-container.devui-popover-container-right,.popper-container.devui-popover-container-left,.popper-container.devui-popover-container-top{display:flex!important}.popper-container.devui-popover-container-right>.devui-dropdown-menu-wrap,.popper-container.devui-popover-container-left>.devui-dropdown-menu-wrap,.popper-container.devui-popover-container-top>.devui-dropdown-menu-wrap{display:inline-block}.popper-container.devui-popover-container-right>.popper-append-area,.popper-container.devui-popover-container-left>.popper-append-area,.popper-container.devui-popover-container-top>.popper-append-area{display:inline-block;overflow:auto}.popper-container.devui-popover-container-right .popper-append-area,.popper-container.devui-popover-container-left .popper-append-area,.popper-container.devui-popover-container-top .popper-append-area{border-left:1px solid var(--devui-dividing-line, #f0f0f0)}.popper-container.devui-popover-container-right .popper-append-area:before,.popper-container.devui-popover-container-left .popper-append-area:before,.popper-container.devui-popover-container-top .popper-append-area:before{display:none}.popper-container.devui-popover-container-top{flex-direction:column-reverse}.popper-container.devui-popover-container-left .popper-append-area{order:-1}.popper-container .popper-container-scrollable{min-height:40px;width:100%;overflow:auto;overflow:overlay}.popper-container.fluid{width:100%}:host{display:block}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { open: [{
type: Input
}], fluidPopper: [{
type: Input
}], poppoverAppendDirection: [{
type: Input
}], appendTo: [{
type: Input
}], extraConfig: [{
type: Input
}], showAnimation: [{
type: Input
}], openChange: [{
type: Output
}], popperActivator: [{
type: ViewChild,
args: ['popperActivator', { static: true }]
}], popperContainer: [{
type: ViewChild,
args: ['popperContainer', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldnVpL3V0aWxzL3BvcHBlci9wb3BwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZGV2dWkvdXRpbHMvcG9wcGVyL3BvcHBlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFZbkUsTUFBTSxPQUFPLGVBQWU7SUFFMUIsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFhLElBQUksQ0FBQyxLQUFLO1FBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixlQUFlLENBQUMsUUFBUSxDQUFDLEdB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QyxRQUFRO21HQTdEakUsZUFBZSxraEJDN0I1QixtdEJBcUJBOzs0RkRRYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLG9CQUFvQjs7MEJBaUUrQixNQUFNOzJCQUFDLFFBQVE7eUNBdkQvRCxJQUFJO3NCQUFoQixLQUFLO2dCQWVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQWNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ3lDLGVBQWU7c0JBQTlELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNFLGVBQWU7c0JBQTlELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZVBvcHBlciB9IGZyb20gJ0Bwb3BwZXJqcy9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25DdXJ2ZXMsIEFuaW1hdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi4vYW5pbWF0aW9ucyc7XHJcblxyXG5pbnRlcmZhY2UgRXh0cmFTZXRDb25maWcge1xyXG4gIGV4dHJhV2lkdGg/OiBudW1iZXI7XHJcbiAgb2Zmc2V0Pzogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtcG9wcGVyLWNvbXBvbmVudCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BvcHBlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbYC4vcG9wcGVyLmNvbXBvbmVudC5zY3NzYF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb3BwZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBnZXQgb3BlbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgb3Blbih2YWx1ZSkge1xyXG4gICAgaWYgKHRoaXMuX2lzT3BlbiA9PT0gdmFsdWUpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmFuaW1hdGUgPSB0cnVlO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNPcGVuID0gdmFsdWU7XHJcblxyXG4gICAgUG9wcGVyQ29tcG9uZW50Lm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gICAgICB0aGlzLnNldEJsdXJMaXN0ZW5lcigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGZsdWlkUG9wcGVyID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwb3Bwb3ZlckFwcGVuZERpcmVjdGlvbiA9ICdib3R0b20nO1xyXG4gIEBJbnB1dCgpIGFwcGVuZFRvID0gJ2JvZHknO1xyXG4gIEBJbnB1dCgpIGV4dHJhQ29uZmlnOiBFeHRyYVNldENvbmZpZztcclxuICBASW5wdXQoKSBzaG93QW5pbWF0aW9uID0gdHJ1ZTtcclxuICBwcm90ZWN0ZWQgcG9wcGVyID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX2lzT3BlbjogYW55ID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIGFuaW1hdGU6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIHBvcHBlckRpcmVjdGlvbjogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBkaXJlY3Rpb25BbmltYXRpb25UcmFuc2Zvcm1PcmlnaW4gPSB7XHJcbiAgICAndG9wJzogJzAgMTAwJScsXHJcbiAgICAnYm90dG9tJzogJzAgMCdcclxuICB9O1xyXG4gIHByb3RlY3RlZCBwb3BwZXJOb2RlO1xyXG4gIHByb3RlY3RlZCBwb3BwZXJQYXJlbnQ7XHJcbiAgcHJpdmF0ZSBkaXJlY3Rpb25TdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gIGRvY3VtZW50OiBEb2N1bWVudDtcclxuXHJcbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAVmlld0NoaWxkKCdwb3BwZXJBY3RpdmF0b3InLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3BwZXJBY3RpdmF0b3I6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgncG9wcGVyQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgcG9wcGVyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG5cclxuICBzdGF0aWMgbmV4dFRpY2soZm4pIHtcclxuICAgIC8vIEZvcmNlIHRvIHJ1biBmbiBhZnRlciBjdXJyZW50IGRhdGEgY2hhbmdlZC5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gZm4uYmluZCh0aGlzKSgpKTtcclxuICB9XHJcbiAgb25Eb2N1bWVudENsaWNrID0gKCRldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgaWYgKCEhdGhpcy5hcHBlbmRUbyAmJiB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSAkZXZlbnQudGFyZ2V0ICYmXHJcbiAgICAgICF0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKCRldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICghdGhpcy5hcHBlbmRUbyAmJiB0aGlzLm9wZW4gJiYgIXRoaXMuZWwubmF0aXZlRWxlbWVudC5jb250YWlucygkZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9O1xyXG4gIHByaXZhdGUgYmxvY2tFdmVudCA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlbDogRWxlbWVudFJlZiwgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByb3RlY3RlZCBuZ1pvbmU6IE5nWm9uZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLCBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55KSB7XHJcbiAgICB0aGlzLmRvY3VtZW50ID0gdGhpcy5kb2M7XHJcbiAgfVxyXG5cclxuICBzaG93KCkge1xyXG4gICAgLy8gQXBwZW5kIHRvIHNlbGVjdG9yIG9yIG9yaWdpbmFsIHBhcmVudC5cclxuICAgIGlmICh0aGlzLmFwcGVuZFRvKSB7XHJcbiAgICAgIGlmICh0aGlzLmZsdWlkUG9wcGVyKSB7XHJcbiAgICAgICAgbGV0IHBvcHBlcldpZHRoID0gdGhpcy5wb3BwZXJBY3RpdmF0b3IubmF0aXZlRWxlbWVudCAmJiB0aGlzLnBvcHBlckFjdGl2YXRvci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGlmICh0aGlzLmV4dHJhQ29uZmlnICYmIHRoaXMuZXh0cmFDb25maWcuZXh0cmFXaWR0aCkge1xyXG4gICAgICAgICAgcG9wcGVyV2lkdGggPSBwb3BwZXJXaWR0aCArIHRoaXMuZXh0cmFDb25maWcuZXh0cmFXaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmlyc3RFbGUgPSB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xyXG4gICAgICAgIGlmIChmaXJzdEVsZS5jbGFzc0xpc3QuY29udGFpbnMoJ2RldnVpLXNlYXJjaC1jb250YWluZXInKSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGNoaWxkLnN0eWxlLndpZHRoID0gYCR7cG9wcGVyV2lkdGh9cHhgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaXJzdEVsZS5zdHlsZS53aWR0aCA9IGAke3BvcHBlcldpZHRofXB4YDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hdHRhY2hQb3BwZXJDb250YWluZXJUb1NlbGVjdG9yKHRoaXMuYXBwZW5kVG8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hdHRhY2hQb3BwZXJDb250YWluZXJUb05vZGUodGhpcy5wb3BwZXJQYXJlbnQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3BwZXIgPSB0aGlzLmNyZWF0ZUN1c3RvbVBvcHBlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsICdibG9jaycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZSgpIHtcclxuICAgIGNvbnN0IHBvcHBlckNvbnRhaW5lciA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnNldFRyYW5zaXRpb24oJ2Nsb3NlJyk7XHJcbiAgICAvLyBGb3IgSUUgMTEvRWRnZVxyXG4gICAgaWYgKHBvcHBlckNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0ubWF0Y2goL3NjYWxlM2RcXCgxLCAxLCAxXFwpLykpIHtcclxuICAgICAgLy8gUmVwbGFjZSB0cmFuc2Zvcm0gb3BlbiBzdGF0ZSB3aXRoIGNsb3NlIHN0YXRlXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9wcGVyQ29udGFpbmVyLCAndHJhbnNmb3JtJyxcclxuICAgICAgICBwb3BwZXJDb250YWluZXIuc3R5bGUudHJhbnNmb3JtLnJlcGxhY2UoJ3NjYWxlM2QoMSwgMSwgMSknLCAnc2NhbGUzZCgxLCAwLjgsIDEpJykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcGVyc3BlY3RpdmUoMXB4KSBzb2x2ZXMgcGl4ZWwgc2hpZnQgY2F1c2VkIGJ5IHdlYmtpdCB0cmFuc2Zvcm1cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIHBvcHBlckNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gKyBgIHNjYWxlM2QoMSwgMC44LCAxKSBwZXJzcGVjdGl2ZSgxcHgpYCk7XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgY29udGFpbmVyIHRvIHRyYW5zcGFyZW50XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBvcHBlckNvbnRhaW5lciwgJ29wYWNpdHknLCAwLjgpO1xyXG5cclxuICAgIC8vIENhbid0IHVzZSBiaW5kKHRoaXMpIHNpbmNlIGl0IGNhbGxzIGl0c2VsZlxyXG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcbiAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcclxuICAgICAgaWYgKCF0aGF0Lm9wZW4gJiYgdGhhdC5wb3BwZXIpIHtcclxuICAgICAgICAvLyBTZXQgZmluYWwgc3RhdGUgb2YgY29udGFpbmVyIHRvIGludmlzaWJsZVxyXG4gICAgICAgIHRoYXQucmVuZGVyZXIuc2V0U3R5bGUocG9wcGVyQ29udGFpbmVyLCAnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgdGhhdC5hbmltYXRlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRyYW5zaXRpb25cclxuICAgICAgICB0aGF0LnNldFRyYW5zaXRpb24oKTtcclxuICAgICAgICB0aGF0LnBvcHBlci5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhhdC5wb3BwZXIgPSBudWxsO1xyXG4gICAgICAgIHRoYXQuZGV0YWNoUG9wcGVyQ29udGFpbmVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgZS5jdXJyZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLCBoYW5kbGVyKTtcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5zaG93QW5pbWF0aW9uKSB7XHJcbiAgICAgIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGhhbmRsZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhhdC5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgICAgdGhhdC5hbmltYXRlID0gZmFsc2U7XHJcbiAgICAgIHRoYXQucG9wcGVyLmRlc3Ryb3koKTtcclxuICAgICAgdGhhdC5wb3BwZXIgPSBudWxsO1xyXG4gICAgICB0aGF0LmRldGFjaFBvcHBlckNvbnRhaW5lcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Qmx1ckxpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5vcGVuKSB7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcclxuICAgICAgICB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5ibG9ja0V2ZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgICAgIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmJsb2NrRXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlUcmFuc2l0aW9uU3R5bGUgPSAoZGF0YSkgPT4ge1xyXG4gICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lciA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5lclRyYW5zaXRpb25EaXJlY3Rpb24oZGF0YT8uc3RhdGU/Lm1vZGlmaWVyc0RhdGE/LmZsaXA/Ll9za2lwKTtcclxuICAgIGlmICh0aGlzLmFuaW1hdGUpIHtcclxuICAgICAgLy8gcGVyc3BlY3RpdmUoMXB4KSBzb2x2ZXMgcGl4ZWwgc2hpZnQgY2F1c2VkIGJ5IHdlYmtpdCB0cmFuc2Zvcm1cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvcHRpb25zQ29udGFpbmVyLCAndHJhbnNmb3JtJyxcclxuICAgICAgICBvcHRpb25zQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSArXHJcbiAgICAgICAgYCBzY2FsZTNkKDEsIDAuOCwgMSkgcGVyc3BlY3RpdmUoMXB4KSAke3RoaXMucG9wcGVyRGlyZWN0aW9uID09PSAnYm90dG9tJyA/ICd0cmFuc2xhdGVZKC00cHgpJyA6ICd0cmFuc2xhdGVZKDRweCknfWApO1xyXG4gICAgICAvLyBTZXQgY29udGFpbmVyIGluaXQgc3RhdGUgdG8gdHJhbnNwYXJlbnQgYXMgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2l0aW9uLlxyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG9wdGlvbnNDb250YWluZXIsICdvcGFjaXR5JywgMCk7XHJcbiAgICAgIFBvcHBlckNvbXBvbmVudC5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uKCdvcGVuJyk7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XHJcbiAgICAgICAgICAvLyByZW1vdmUgdHJhbnNpdGlvblxyXG4gICAgICAgICAgdGhhdC5zZXRUcmFuc2l0aW9uKCk7XHJcbiAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsIGhhbmRsZXIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG9wdGlvbnNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgICBvcHRpb25zQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybS5yZXBsYWNlKCdzY2FsZTNkKDEsIDAuOCwgMSknLCAnc2NhbGUzZCgxLCAxLCAxKScpKTtcclxuICAgICAgICB0aGlzLnBvcHBlckRpcmVjdGlvbiA9PT0gJ2JvdHRvbScgP1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvcHRpb25zQ29udGFpbmVyLCAndHJhbnNmb3JtJyxcclxuICAgICAgICAgICAgb3B0aW9uc0NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0ucmVwbGFjZSgndHJhbnNsYXRlWSgtNHB4KScsICd0cmFuc2xhdGVZKDApJykpIDpcclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgICAgIG9wdGlvbnNDb250YWluZXIuc3R5bGUudHJhbnNmb3JtLnJlcGxhY2UoJ3RyYW5zbGF0ZVkoNHB4KScsICd0cmFuc2xhdGVZKDApJykpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ29wYWNpdHknLCAxKTtcclxuICAgICAgICB0aGlzLmFuaW1hdGUgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBoYW5kbGUgcG9wcGVyIHJlLXJlbmRlcmluZywgaW5jb21pbmcgdHJhbnNmb3JtIGRvZXNuJ3QgaGF2ZSBzY2FsZSBpbmZvXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgb3B0aW9uc0NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gKyAodGhpcy5vcGVuID8gJyBzY2FsZTNkKDEsIDEsIDEpJyA6ICcgc2NhbGUzZCgxLCAwLjgsIDEpJykgKyAnIHBlcnNwZWN0aXZlKDFweCknKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRhaW5lclRyYW5zaXRpb25EaXJlY3Rpb24oZmxpcHBlZDogYm9vbGVhbikge1xyXG4gICAgY29uc3QgZGlyZWN0aW9uID0gZmxpcHBlZCA/ICd0b3AnIDogJ2JvdHRvbSc7XHJcbiAgICBpZiAodGhpcy5wb3BwZXJEaXJlY3Rpb24gIT09IGRpcmVjdGlvbikge1xyXG4gICAgICB0aGlzLnBvcHBlckRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcclxuICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uT3JpZ2luKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpcmVjdGlvblN1YmplY3QubmV4dCh0aGlzLnBvcHBlckRpcmVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFRyYW5zaXRpb25PcmlnaW4oKSB7XHJcbiAgICBpZiAodGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0tb3JpZ2luJyxcclxuICAgICAgICB0aGlzLmRpcmVjdGlvbkFuaW1hdGlvblRyYW5zZm9ybU9yaWdpblt0aGlzLnBvcHBlckRpcmVjdGlvbl0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDdXN0b21Qb3BwZXIoKSB7XHJcbiAgICByZXR1cm4gY3JlYXRlUG9wcGVyKHRoaXMucG9wcGVyQWN0aXZhdG9yLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgcGxhY2VtZW50OiAnYm90dG9tLXN0YXJ0JyxcclxuICAgICAgbW9kaWZpZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIG1haW5BeGlzOiB0cnVlLCAvLyB0cnVlIGJ5IGRlZmF1bHRcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnYXBwbHlSZWFjdFN0eWxlJyxcclxuICAgICAgICAgIHBoYXNlOiAnYWZ0ZXJXcml0ZScsXHJcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLCAvLyB0cnVlIGJ5IGRlZmF1bHRcclxuICAgICAgICAgIGZuOiB0aGlzLmFwcGx5VHJhbnNpdGlvblN0eWxlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmV4dHJhQ29uZmlnICYmIHRoaXMuZXh0cmFDb25maWcub2Zmc2V0XHJcbiAgICAgICAgICAgICAgPyBbcGFyc2VJbnQodGhpcy5leHRyYUNvbmZpZy5vZmZzZXQuc3BsaXQoJywnKVswXSwgMTApLCBwYXJzZUludCh0aGlzLmV4dHJhQ29uZmlnLm9mZnNldC5zcGxpdCgnLCcpWzFdLCAxMCldXHJcbiAgICAgICAgICAgICAgOiBbMCwgNV0sIC8vIHRydWUgYnkgZGVmYXVsdFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdmbGlwJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZmxpcFZhcmlhdGlvbnM6IHRydWUsIC8vIHRydWUgYnkgZGVmYXVsdFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBzdHJhdGVneTogdGhpcy5hcHBlbmRUbyA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFRyYW5zaXRpb24oY29tbWFuZCA9IG51bGwpIHtcclxuICAgIGNvbnN0IHBvcHBlckNvbnRhaW5lciA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5hbmltYXRlICYmIGNvbW1hbmQpIHtcclxuICAgICAgaWYgKGNvbW1hbmQgPT09ICdvcGVuJykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9wcGVyQ29udGFpbmVyLCAndHJhbnNpdGlvbicsIHRoaXMuc2hvd0FuaW1hdGlvblxyXG4gICAgICAgICAgPyBgYWxsICR7QW5pbWF0aW9uRHVyYXRpb24uQkFTRX0gJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9PVVR9YCA6ICdub25lJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PT0gJ2Nsb3NlJykge1xyXG4gICAgICAgIHBvcHBlckNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gdGhpcy5zaG93QW5pbWF0aW9uID8gYGFsbCAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9ICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfSU59YCA6ICdub25lJztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICd0cmFuc2l0aW9uJywgbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlKCkge1xyXG4gICAgUG9wcGVyQ29tcG9uZW50Lm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucG9wcGVyKSB7IHRoaXMucG9wcGVyLmZvcmNlVXBkYXRlKCk7IH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBDbG9zZSBwb3BwZXJcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXRhY2hQb3BwZXJDb250YWluZXIoKSB7XHJcbiAgICAvLyBDYWNoZSBwb3BwZXIncyBwYXJlbnQgYW5kIHBvcHBlciBub2RlLlxyXG4gICAgdGhpcy5wb3BwZXJQYXJlbnQgPSB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICB0aGlzLnBvcHBlck5vZGUgPSB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKHRoaXMucG9wcGVyUGFyZW50ICYmIHRoaXMucG9wcGVyTm9kZSkge1xyXG4gICAgICB0aGlzLnBvcHBlclBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlck5vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdHRhY2hQb3BwZXJDb250YWluZXJUb05vZGUobm9kZVBhcmVudCkge1xyXG4gICAgaWYgKG5vZGVQYXJlbnQgJiYgdGhpcy5wb3BwZXJOb2RlKSB7XHJcbiAgICAgIHRoaXMucG9wcGVyUGFyZW50ID0gbm9kZVBhcmVudDtcclxuICAgICAgdGhpcy5wb3BwZXJQYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5wb3BwZXJOb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXR0YWNoUG9wcGVyQ29udGFpbmVyVG9TZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcikge1xyXG4gICAgY29uc3Qgbm9kZVBhcmVudCA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7XHJcbiAgICB0aGlzLmF0dGFjaFBvcHBlckNvbnRhaW5lclRvTm9kZShub2RlUGFyZW50KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIERldGFjaCBwb3BwZXIgY29udGFpbmVyIG9uY2UgdmlldyBpbml0aWFsaXplZC5cclxuICAgIHRoaXMuZGV0YWNoUG9wcGVyQ29udGFpbmVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlyZWN0aW9uQ2hhbmdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicG9wcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJwb3BwZXItYWN0aXZhdG9yXCIgI3BvcHBlckFjdGl2YXRvcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcG9wcGVyLWFjdGl2YXRvcl1cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInBvcHBlci1jb250YWluZXIgZGV2dWktcG9wb3Zlci1jb250YWluZXIte3sgcG9wcG92ZXJBcHBlbmREaXJlY3Rpb24gfX1cIlxuICAgICNwb3BwZXJDb250YWluZXJcbiAgICBbbmdDbGFzc109XCJ7IGZsdWlkOiBmbHVpZFBvcHBlciAmJiAhYXBwZW5kVG8gfVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiZGV2dWktZHJvcGRvd24tbWVudS13cmFwXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcG9wcGVyLXByZXBlbmRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cInBvcHBlci1jb250YWluZXItc2Nyb2xsYWJsZSBkZXZ1aS1zY3JvbGxiYXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3BvcHBlci1jb250YWluZXJdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBvcHBlci1hcHBlbmQtYXJlYVwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3BvcHBlci1hcHBlbmRdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19