@taiga-ui/kit
Version:
Taiga UI Angular main components kit
235 lines • 36.6 kB
JavaScript
import { __decorate, __extends, __param } from "tslib";
import { DOCUMENT } from '@angular/common';
import { ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, forwardRef, Host, Inject, Injector, Input, NgZone, OnDestroy, Optional, Renderer2, ViewContainerRef, } from '@angular/core';
import { ALWAYS_TRUE_HANDLER, CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_SPACE, getNativeFocused, px, TuiActiveZoneDirective, TuiBooleanHandler, TuiDestroyService, TuiParentsScrollService, TuiPortalService, typedFromEvent, } from '@taiga-ui/cdk';
import { AbstractTuiDropdown, TUI_DOCUMENT_OR_SHADOW_ROOT, TUI_DROPDOWN_DIRECTIVE, TUI_ELEMENT_REF, } from '@taiga-ui/core';
import { getWordRange } from '@taiga-ui/kit/utils/dom';
import { merge } from 'rxjs';
import { map, switchMapTo, takeUntil } from 'rxjs/operators';
// @dynamic
var TuiDropdownSelectionDirective = /** @class */ (function (_super) {
__extends(TuiDropdownSelectionDirective, _super);
function TuiDropdownSelectionDirective(documentRef, componentFactoryResolver, injector, portalService, elementRef, activeZone, shadowRootRef, customElementRef, destroy$, refresh$, changeDetectorRef, ngZone, renderer, viewContainerRef) {
var _this = _super.call(this, componentFactoryResolver, injector, portalService, customElementRef || elementRef, activeZone) || this;
_this.refresh$ = refresh$;
_this.changeDetectorRef = changeDetectorRef;
_this.ngZone = ngZone;
_this.renderer = renderer;
_this.viewContainerRef = viewContainerRef;
_this.position = "selection" /* Selection */;
_this.visibilityHandler = ALWAYS_TRUE_HANDLER;
_this.documentRef = shadowRootRef || documentRef;
_this.range = _this.documentRef.createRange();
var nativeElement = _this.elementRef.nativeElement;
merge(typedFromEvent(_this.documentRef, 'mouseup'), typedFromEvent(nativeElement, 'mousedown').pipe(switchMapTo(typedFromEvent(nativeElement, 'mousemove').pipe(takeUntil(typedFromEvent(_this.documentRef, 'mouseup'))))), typedFromEvent(nativeElement, 'keyup'))
.pipe(map(function () {
var active = getNativeFocused(_this.documentRef);
var selection = _this.documentRef.getSelection();
if ((active instanceof HTMLInputElement ||
active instanceof HTMLTextAreaElement) &&
nativeElement.contains(active)) {
return _this.veryVerySadInputFix(active);
}
return selection && selection.rangeCount
? selection.getRangeAt(0)
: _this.range;
}), takeUntil(destroy$))
.subscribe(function (range) {
var contained = nativeElement.contains(range.commonAncestorContainer);
_this.range = contained ? range : _this.range;
var valid = contained &&
(!_this.visibilityHandler || _this.visibilityHandler(_this.range));
_this.toggleDropdownBox(valid || _this.inDropdown(range));
});
return _this;
}
TuiDropdownSelectionDirective_1 = TuiDropdownSelectionDirective;
Object.defineProperty(TuiDropdownSelectionDirective.prototype, "tuiDropdownSelection", {
set: function (handler) {
if (!handler) {
return;
}
var inHostAndValid = this.elementRef.nativeElement.contains(this.range.commonAncestorContainer) &&
handler(this.range);
this.visibilityHandler = handler;
this.toggleDropdownBox(inHostAndValid);
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiDropdownSelectionDirective.prototype, "clientRect", {
get: function () {
var defaultView = this.documentRef.defaultView;
var rangeRect = this.rangeRect;
var frameElement = defaultView ? defaultView.frameElement : null;
if (!frameElement) {
return rangeRect;
}
var documentRect = frameElement.getBoundingClientRect();
return {
top: rangeRect.top + documentRect.top,
left: rangeRect.left + documentRect.left,
right: rangeRect.left + documentRect.left + rangeRect.width,
bottom: rangeRect.top + documentRect.top + rangeRect.height,
width: rangeRect.width,
height: rangeRect.height,
};
},
enumerable: true,
configurable: true
});
TuiDropdownSelectionDirective.prototype.ngOnDestroy = function () {
this.closeDropdownBox();
if (this.ghost) {
this.renderer.removeChild(this.viewContainerRef.element.nativeElement, this.ghost);
}
};
Object.defineProperty(TuiDropdownSelectionDirective.prototype, "rangeRect", {
/**
* get ClientRect of current Range according to provided position
*/
get: function () {
switch (this.position) {
case "tag" /* Tag */:
var commonAncestorContainer = this.range.commonAncestorContainer;
var element = commonAncestorContainer.nodeType === Node.ELEMENT_NODE
? commonAncestorContainer
: commonAncestorContainer.parentNode;
return element.getBoundingClientRect();
case "word" /* Word */:
return getWordRange(this.range).getBoundingClientRect();
default:
return this.range.getBoundingClientRect();
}
},
enumerable: true,
configurable: true
});
/**
* Toggle dropdown visibility (has to be in ngZone.run because it could be initiated inside iframe in Editor)
*/
TuiDropdownSelectionDirective.prototype.toggleDropdownBox = function (visible) {
var _this = this;
this.ngZone.run(function () {
if (visible) {
_this.openDropdownBox();
}
else {
_this.closeDropdownBox();
}
_this.changeDetectorRef.markForCheck();
});
};
/**
* Check if Node is inside dropdown
*/
TuiDropdownSelectionDirective.prototype.boxContains = function (node) {
return (!!this.dropdownBoxRef &&
this.dropdownBoxRef.location.nativeElement.contains(node));
};
/**
* Check if given range is at leaset partially inside dropdown
*/
TuiDropdownSelectionDirective.prototype.inDropdown = function (range) {
var startContainer = range.startContainer, endContainer = range.endContainer;
var inDropdown = this.boxContains(range.commonAncestorContainer);
var hostToDropdown = this.boxContains(endContainer) &&
this.elementRef.nativeElement.contains(startContainer);
var dropdownToHost = this.boxContains(startContainer) &&
this.elementRef.nativeElement.contains(endContainer);
return inDropdown || hostToDropdown || dropdownToHost;
};
/**
* Position invisible DIV and create Range similar to selected range inside input/textarea
*/
TuiDropdownSelectionDirective.prototype.veryVerySadInputFix = function (element) {
var _a = this.ghost, ghost = _a === void 0 ? this.initGhost(element) : _a;
var _b = element.getBoundingClientRect(), top = _b.top, left = _b.left, width = _b.width, height = _b.height;
var selectionStart = element.selectionStart, selectionEnd = element.selectionEnd;
var range = this.documentRef.createRange();
var hostRect = this.elementRef.nativeElement.getBoundingClientRect();
ghost.style.top = px(top - hostRect.top);
ghost.style.left = px(left - hostRect.left);
ghost.style.width = px(width);
ghost.style.height = px(height);
ghost.textContent = CHAR_ZERO_WIDTH_SPACE + element.value + CHAR_NO_BREAK_SPACE;
range.setStart(ghost.firstChild, selectionStart || 0);
range.setEnd(ghost.firstChild, selectionEnd || 0);
return range;
};
/**
* Create an invisible DIV styled exactly like input/textarea element inside directive
*/
TuiDropdownSelectionDirective.prototype.initGhost = function (element) {
var ghost = this.renderer.createElement('div');
var nativeElement = this.viewContainerRef.element.nativeElement;
var _a = getComputedStyle(element), font = _a.font, letterSpacing = _a.letterSpacing, textTransform = _a.textTransform, padding = _a.padding;
ghost.style.position = 'absolute';
ghost.style.pointerEvents = 'none';
ghost.style.opacity = '0';
ghost.style.whiteSpace = 'pre-wrap';
ghost.style.font = font;
ghost.style.letterSpacing = letterSpacing;
ghost.style.textTransform = textTransform;
ghost.style.padding = padding;
this.renderer.appendChild(nativeElement, ghost);
this.ghost = ghost;
return ghost;
};
var TuiDropdownSelectionDirective_1;
TuiDropdownSelectionDirective.ctorParameters = function () { return [
{ type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: ComponentFactoryResolver, decorators: [{ type: Inject, args: [ComponentFactoryResolver,] }] },
{ type: Injector, decorators: [{ type: Inject, args: [Injector,] }] },
{ type: TuiPortalService, decorators: [{ type: Inject, args: [TuiPortalService,] }] },
{ type: ElementRef, decorators: [{ type: Host }, { type: Inject, args: [ElementRef,] }] },
{ type: TuiActiveZoneDirective, decorators: [{ type: Inject, args: [TuiActiveZoneDirective,] }, { type: Optional }] },
{ type: Document, decorators: [{ type: Inject, args: [TUI_DOCUMENT_OR_SHADOW_ROOT,] }, { type: Optional }] },
{ type: ElementRef, decorators: [{ type: Inject, args: [TUI_ELEMENT_REF,] }, { type: Optional }] },
{ type: TuiDestroyService, decorators: [{ type: Inject, args: [TuiDestroyService,] }] },
{ type: TuiParentsScrollService, decorators: [{ type: Inject, args: [TuiParentsScrollService,] }] },
{ type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] },
{ type: NgZone, decorators: [{ type: Inject, args: [NgZone,] }] },
{ type: Renderer2, decorators: [{ type: Inject, args: [Renderer2,] }] },
{ type: ViewContainerRef, decorators: [{ type: Inject, args: [ViewContainerRef,] }] }
]; };
__decorate([
Input()
], TuiDropdownSelectionDirective.prototype, "tuiDropdownSelection", null);
__decorate([
Input('tuiDropdownSelectionPosition')
], TuiDropdownSelectionDirective.prototype, "position", void 0);
TuiDropdownSelectionDirective = TuiDropdownSelectionDirective_1 = __decorate([
Directive({
selector: '[tuiDropdownSelection]:not(ng-container)',
providers: [
{
provide: TUI_DROPDOWN_DIRECTIVE,
useExisting: forwardRef(function () { return TuiDropdownSelectionDirective_1; }),
},
TuiParentsScrollService,
TuiDestroyService,
],
}),
__param(0, Inject(DOCUMENT)),
__param(1, Inject(ComponentFactoryResolver)),
__param(2, Inject(Injector)),
__param(3, Inject(TuiPortalService)),
__param(4, Host()), __param(4, Inject(ElementRef)),
__param(5, Inject(TuiActiveZoneDirective)),
__param(5, Optional()),
__param(6, Inject(TUI_DOCUMENT_OR_SHADOW_ROOT)),
__param(6, Optional()),
__param(7, Inject(TUI_ELEMENT_REF)),
__param(7, Optional()),
__param(8, Inject(TuiDestroyService)),
__param(9, Inject(TuiParentsScrollService)),
__param(10, Inject(ChangeDetectorRef)),
__param(11, Inject(NgZone)),
__param(12, Inject(Renderer2)),
__param(13, Inject(ViewContainerRef))
], TuiDropdownSelectionDirective);
return TuiDropdownSelectionDirective;
}(AbstractTuiDropdown));
export { TuiDropdownSelectionDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tc2VsZWN0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YWlnYS11aS9raXQvZGlyZWN0aXZlcy9kcm9wZG93bi1zZWxlY3Rpb24vIiwic291cmNlcyI6WyJkcm9wZG93bi1zZWxlY3Rpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNILGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLFNBQVMsRUFDVCxnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixFQUFFLEVBQ0Ysc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixjQUFjLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QixlQUFlLEdBRWxCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsV0FBVztBQVlYO0lBQ1ksaURBQW1CO0lBMkIzQix1Q0FDc0IsV0FBcUIsRUFFdkMsd0JBQWtELEVBQ2hDLFFBQWtCLEVBQ1YsYUFBK0IsRUFDN0Is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QUFDLGNBQU0sT0FBQSwrQkFBNkIsRUFBN0IsQ0FBNkIsQ0FBQztpQkFDL0Q7Z0JBQ0QsdUJBQXVCO2dCQUN2QixpQkFBaUI7YUFDcEI7U0FDSixDQUFDO1FBOEJPLFdBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2hCLFdBQUEsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFFaEMsV0FBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEIsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUN4QixXQUFBLElBQUksRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUIsV0FBQSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUM5QixXQUFBLFFBQVEsRUFBRSxDQUFBO1FBRVYsV0FBQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtRQUNuQyxXQUFBLFFBQVEsRUFBRSxDQUFBO1FBRVYsV0FBQSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDdkIsV0FBQSxRQUFRLEVBQUUsQ0FBQTtRQUVWLFdBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFekIsV0FBQSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUMvQixZQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ3pCLFlBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2QsWUFBQSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakIsWUFBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtPQWxEcEIsNkJBQTZCLENBb1B6QztJQUFELG9DQUFDO0NBQUEsQUFwUEQsQ0FDWSxtQkFBbUIsR0FtUDlCO1NBcFBZLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3QsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBTFdBWVNfVFJVRV9IQU5ETEVSLFxuICAgIENIQVJfTk9fQlJFQUtfU1BBQ0UsXG4gICAgQ0hBUl9aRVJPX1dJRFRIX1NQQUNFLFxuICAgIGdldE5hdGl2ZUZvY3VzZWQsXG4gICAgcHgsXG4gICAgVHVpQWN0aXZlWm9uZURpcmVjdGl2ZSxcbiAgICBUdWlCb29sZWFuSGFuZGxlcixcbiAgICBUdWlEZXN0cm95U2VydmljZSxcbiAgICBUdWlQYXJlbnRzU2Nyb2xsU2VydmljZSxcbiAgICBUdWlQb3J0YWxTZXJ2aWNlLFxuICAgIHR5cGVkRnJvbUV2ZW50LFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RUdWlEcm9wZG93bixcbiAgICBUVUlfRE9DVU1FTlRfT1JfU0hBRE9XX1JPT1QsXG4gICAgVFVJX0RST1BET1dOX0RJUkVDVElWRSxcbiAgICBUVUlfRUxFTUVOVF9SRUYsXG4gICAgVHVpRHJvcGRvd24sXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7VHVpRHJvcGRvd25Qb3NpdGlvbn0gZnJvbSAnQHRhaWdhLXVpL2tpdC9lbnVtcyc7XG5pbXBvcnQge2dldFdvcmRSYW5nZX0gZnJvbSAnQHRhaWdhLXVpL2tpdC91dGlscy9kb20nO1xuaW1wb3J0IHttZXJnZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc3dpdGNoTWFwVG8sIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBAZHluYW1pY1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbdHVpRHJvcGRvd25TZWxlY3Rpb25dOm5vdChuZy1jb250YWluZXIpJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX0RST1BET1dOX0RJUkVDVElWRSxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFR1aURyb3Bkb3duU2VsZWN0aW9uRGlyZWN0aXZlKSxcbiAgICAgICAgfSxcbiAgICAgICAgVHVpUGFyZW50c1Njcm9sbFNlcnZpY2UsXG4gICAgICAgIFR1aURlc3Ryb3lTZXJ2aWNlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aURyb3Bkb3duU2VsZWN0aW9uRGlyZWN0aXZlXG4gICAgZXh0ZW5kcyBBYnN0cmFjdFR1aURyb3Bkb3duXG4gICAgaW1wbGVtZW50cyBUdWlEcm9wZG93biwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKVxuICAgIHNldCB0dWlEcm9wZG93blNlbGVjdGlvbihoYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxSYW5nZT4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbkhvc3RBbmRWYWxpZCA9XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSAmJlxuICAgICAgICAgICAgaGFuZGxlcih0aGlzLnJhbmdlKTtcblxuICAgICAgICB0aGlzLnZpc2liaWxpdHlIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93bkJveChpbkhvc3RBbmRWYWxpZCk7XG4gICAgfVxuXG4gICAgQElucHV0KCd0dWlEcm9wZG93blNlbGVjdGlvblBvc2l0aW9uJylcbiAgICBwb3NpdGlvbiA9IFR1aURyb3Bkb3duUG9zaXRpb24uU2VsZWN0aW9uO1xuXG4gICAgcHJpdmF0ZSByYW5nZTogUmFuZ2U7XG5cbiAgICBwcml2YXRlIHZpc2liaWxpdHlIYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxSYW5nZT4gPSBBTFdBWVNfVFJVRV9IQU5ETEVSO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFJlZjogRG9jdW1lbnQ7XG5cbiAgICBwcml2YXRlIGdob3N0PzogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnRSZWY6IERvY3VtZW50LFxuICAgICAgICBASW5qZWN0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcilcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIEBJbmplY3QoSW5qZWN0b3IpIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgQEluamVjdChUdWlQb3J0YWxTZXJ2aWNlKSBwb3J0YWxTZXJ2aWNlOiBUdWlQb3J0YWxTZXJ2aWNlLFxuICAgICAgICBASG9zdCgpIEBJbmplY3QoRWxlbWVudFJlZikgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIEBJbmplY3QoVHVpQWN0aXZlWm9uZURpcmVjdGl2ZSlcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgYWN0aXZlWm9uZTogVHVpQWN0aXZlWm9uZURpcmVjdGl2ZSB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoVFVJX0RPQ1VNRU5UX09SX1NIQURPV19ST09UKVxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBzaGFkb3dSb290UmVmOiBEb2N1bWVudCB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoVFVJX0VMRU1FTlRfUkVGKVxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBjdXN0b21FbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoVHVpRGVzdHJveVNlcnZpY2UpXG4gICAgICAgIGRlc3Ryb3kkOiBUdWlEZXN0cm95U2VydmljZSxcbiAgICAgICAgQEluamVjdChUdWlQYXJlbnRzU2Nyb2xsU2VydmljZSkgcmVhZG9ubHkgcmVmcmVzaCQ6IFR1aVBhcmVudHNTY3JvbGxTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChOZ1pvbmUpIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIEBJbmplY3QoUmVuZGVyZXIyKSBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIEBJbmplY3QoVmlld0NvbnRhaW5lclJlZikgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgIGluamVjdG9yLFxuICAgICAgICAgICAgcG9ydGFsU2VydmljZSxcbiAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRSZWYgfHwgZWxlbWVudFJlZixcbiAgICAgICAgICAgIGFjdGl2ZVpvbmUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRSZWYgPSBzaGFkb3dSb290UmVmIHx8IGRvY3VtZW50UmVmO1xuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICAgIGNvbnN0IHtuYXRpdmVFbGVtZW50fSA9IHRoaXMuZWxlbWVudFJlZjtcblxuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIHR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jdW1lbnRSZWYsICdtb3VzZXVwJyksXG4gICAgICAgICAgICB0eXBlZEZyb21FdmVudChuYXRpdmVFbGVtZW50LCAnbW91c2Vkb3duJykucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXBUbyhcbiAgICAgICAgICAgICAgICAgICAgdHlwZWRGcm9tRXZlbnQobmF0aXZlRWxlbWVudCwgJ21vdXNlbW92ZScpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ21vdXNldXAnKSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0eXBlZEZyb21FdmVudChuYXRpdmVFbGVtZW50LCAna2V5dXAnKSxcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gZ2V0TmF0aXZlRm9jdXNlZCh0aGlzLmRvY3VtZW50UmVmKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5kb2N1bWVudFJlZi5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aXZlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVFbGVtZW50LmNvbnRhaW5zKGFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJ5VmVyeVNhZElucHV0Rml4KGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMucmFuZ2U7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKGRlc3Ryb3kkKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmFuZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lZCA9IG5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZSA9IGNvbnRhaW5lZCA/IHJhbmdlIDogdGhpcy5yYW5nZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICghdGhpcy52aXNpYmlsaXR5SGFuZGxlciB8fCB0aGlzLnZpc2liaWxpdHlIYW5kbGVyKHRoaXMucmFuZ2UpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcGRvd25Cb3godmFsaWQgfHwgdGhpcy5pbkRyb3Bkb3duKHJhbmdlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgY2xpZW50UmVjdCgpOiBDbGllbnRSZWN0IHtcbiAgICAgICAgY29uc3Qge2RlZmF1bHRWaWV3fSA9IHRoaXMuZG9jdW1lbnRSZWY7XG4gICAgICAgIGNvbnN0IHtyYW5nZVJlY3R9ID0gdGhpcztcbiAgICAgICAgY29uc3QgZnJhbWVFbGVtZW50ID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnQgOiBudWxsO1xuXG4gICAgICAgIGlmICghZnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VSZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRSZWN0ID0gZnJhbWVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IHJhbmdlUmVjdC50b3AgKyBkb2N1bWVudFJlY3QudG9wLFxuICAgICAgICAgICAgbGVmdDogcmFuZ2VSZWN0LmxlZnQgKyBkb2N1bWVudFJlY3QubGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiByYW5nZVJlY3QubGVmdCArIGRvY3VtZW50UmVjdC5sZWZ0ICsgcmFuZ2VSZWN0LndpZHRoLFxuICAgICAgICAgICAgYm90dG9tOiByYW5nZVJlY3QudG9wICsgZG9jdW1lbnRSZWN0LnRvcCArIHJhbmdlUmVjdC5oZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogcmFuZ2VSZWN0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiByYW5nZVJlY3QuaGVpZ2h0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd25Cb3goKTtcblxuICAgICAgICBpZiAodGhpcy5naG9zdCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgIHRoaXMuZ2hvc3QsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IENsaWVudFJlY3Qgb2YgY3VycmVudCBSYW5nZSBhY2NvcmRpbmcgdG8gcHJvdmlkZWQgcG9zaXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCByYW5nZVJlY3QoKTogQ2xpZW50UmVjdCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICAgICAgY2FzZSBUdWlEcm9wZG93blBvc2l0aW9uLlRhZzpcbiAgICAgICAgICAgICAgICBjb25zdCB7Y29tbW9uQW5jZXN0b3JDb250YWluZXJ9ID0gdGhpcy5yYW5nZTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3JDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKGVsZW1lbnQgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjYXNlIFR1aURyb3Bkb3duUG9zaXRpb24uV29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V29yZFJhbmdlKHRoaXMucmFuZ2UpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSBkcm9wZG93biB2aXNpYmlsaXR5IChoYXMgdG8gYmUgaW4gbmdab25lLnJ1biBiZWNhdXNlIGl0IGNvdWxkIGJlIGluaXRpYXRlZCBpbnNpZGUgaWZyYW1lIGluIEVkaXRvcilcbiAgICAgKi9cbiAgICBwcml2YXRlIHRvZ2dsZURyb3Bkb3duQm94KHZpc2libGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRHJvcGRvd25Cb3goKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duQm94KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIE5vZGUgaXMgaW5zaWRlIGRyb3Bkb3duXG4gICAgICovXG4gICAgcHJpdmF0ZSBib3hDb250YWlucyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMuZHJvcGRvd25Cb3hSZWYgJiZcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Cb3hSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyhub2RlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGdpdmVuIHJhbmdlIGlzIGF0IGxlYXNldCBwYXJ0aWFsbHkgaW5zaWRlIGRyb3Bkb3duXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbkRyb3Bkb3duKHJhbmdlOiBSYW5nZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7c3RhcnRDb250YWluZXIsIGVuZENvbnRhaW5lcn0gPSByYW5nZTtcbiAgICAgICAgY29uc3QgaW5Ecm9wZG93biA9IHRoaXMuYm94Q29udGFpbnMocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICAgICAgICBjb25zdCBob3N0VG9Ecm9wZG93biA9XG4gICAgICAgICAgICB0aGlzLmJveENvbnRhaW5zKGVuZENvbnRhaW5lcikgJiZcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHN0YXJ0Q29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgZHJvcGRvd25Ub0hvc3QgPVxuICAgICAgICAgICAgdGhpcy5ib3hDb250YWlucyhzdGFydENvbnRhaW5lcikgJiZcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGVuZENvbnRhaW5lcik7XG5cbiAgICAgICAgcmV0dXJuIGluRHJvcGRvd24gfHwgaG9zdFRvRHJvcGRvd24gfHwgZHJvcGRvd25Ub0hvc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9zaXRpb24gaW52aXNpYmxlIERJViBhbmQgY3JlYXRlIFJhbmdlIHNpbWlsYXIgdG8gc2VsZWN0ZWQgcmFuZ2UgaW5zaWRlIGlucHV0L3RleHRhcmVhXG4gICAgICovXG4gICAgcHJpdmF0ZSB2ZXJ5VmVyeVNhZElucHV0Rml4KGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogUmFuZ2Uge1xuICAgICAgICBjb25zdCB7Z2hvc3QgPSB0aGlzLmluaXRHaG9zdChlbGVtZW50KX0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7dG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0fSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kfSA9IGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGdob3N0LnN0eWxlLnRvcCA9IHB4KHRvcCAtIGhvc3RSZWN0LnRvcCk7XG4gICAgICAgIGdob3N0LnN0eWxlLmxlZnQgPSBweChsZWZ0IC0gaG9zdFJlY3QubGVmdCk7XG4gICAgICAgIGdob3N0LnN0eWxlLndpZHRoID0gcHgod2lkdGgpO1xuICAgICAgICBnaG9zdC5zdHlsZS5oZWlnaHQgPSBweChoZWlnaHQpO1xuICAgICAgICBnaG9zdC50ZXh0Q29udGVudCA9IENIQVJfWkVST19XSURUSF9TUEFDRSArIGVsZW1lbnQudmFsdWUgKyBDSEFSX05PX0JSRUFLX1NQQUNFO1xuXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGdob3N0LmZpcnN0Q2hpbGQhLCBzZWxlY3Rpb25TdGFydCB8fCAwKTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKGdob3N0LmZpcnN0Q2hpbGQhLCBzZWxlY3Rpb25FbmQgfHwgMCk7XG5cbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnZpc2libGUgRElWIHN0eWxlZCBleGFjdGx5IGxpa2UgaW5wdXQvdGV4dGFyZWEgZWxlbWVudCBpbnNpZGUgZGlyZWN0aXZlXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0R2hvc3QoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGdob3N0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3Qge25hdGl2ZUVsZW1lbnR9ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHtmb250LCBsZXR0ZXJTcGFjaW5nLCB0ZXh0VHJhbnNmb3JtLCBwYWRkaW5nfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICAgICAgZ2hvc3Quc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBnaG9zdC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICBnaG9zdC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICBnaG9zdC5zdHlsZS53aGl0ZVNwYWNlID0gJ3ByZS13cmFwJztcbiAgICAgICAgZ2hvc3Quc3R5bGUuZm9udCA9IGZvbnQ7XG4gICAgICAgIGdob3N0LnN0eWxlLmxldHRlclNwYWNpbmcgPSBsZXR0ZXJTcGFjaW5nO1xuICAgICAgICBnaG9zdC5zdHlsZS50ZXh0VHJhbnNmb3JtID0gdGV4dFRyYW5zZm9ybTtcbiAgICAgICAgZ2hvc3Quc3R5bGUucGFkZGluZyA9IHBhZGRpbmc7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChuYXRpdmVFbGVtZW50LCBnaG9zdCk7XG4gICAgICAgIHRoaXMuZ2hvc3QgPSBnaG9zdDtcblxuICAgICAgICByZXR1cm4gZ2hvc3Q7XG4gICAgfVxufVxuIl19