UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

191 lines (190 loc) 20.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ElementRef, ViewChild, HostListener, Inject, Input, Renderer2, } from '@angular/core'; import { Subject } from 'rxjs'; import { DOCUMENT } from '@angular/common'; export class AsiDropdownContainer { /** * @param {?} document * @param {?} renderer * @param {?} elementRef */ constructor(document, renderer, elementRef) { this.document = document; this.renderer = renderer; this.elementRef = elementRef; this.calculWidth = true; this.subjectContainer = new Subject(); } /** * @param {?} event * @return {?} */ documentClick(event) { if (!this.drop.nativeElement.contains(event.target)) { this.asiDropDownService.canClose(this.index, this.canClose).subscribe(close => { if (close) { setTimeout(() => { this.close(); }); } }); } } /** * @return {?} */ close() { this.subjectContainer.next(this); this.subjectContainer.complete(); } /** * @return {?} */ onClose() { return this.subjectContainer.asObservable(); } /** * Move the container under htmlElement * @param {?} relativeTo The parent HTMLElement of the dropdown * @return {?} */ forElement(relativeTo) { this.referenceElement = relativeTo; /** @type {?} */ const rectRelativeTo = relativeTo.getBoundingClientRect(); /** @type {?} */ const bodyComputedStyle = getComputedStyle(this.document.body); /** @type {?} */ const bodyMarginTop = parseInt(bodyComputedStyle.marginTop.slice(0, -2), 10); /** @type {?} */ const parentComputedStyle = getComputedStyle(this.elementRef.nativeElement); /** @type {?} */ const parentMarginTop = parseInt(parentComputedStyle.marginTop.slice(0, -2), 10); /** @type {?} */ const parentMarginLeft = parseInt(parentComputedStyle.marginLeft.slice(0, -2), 10); /** @type {?} */ const rectElement = this.elementRef.nativeElement.getBoundingClientRect(); /** @type {?} */ const screenVerticalPosition = rectRelativeTo.top - bodyMarginTop; if (screenVerticalPosition > this.document.body.clientHeight / 2) { /** @type {?} */ const bodyVerticalPosition = rectElement.bottom - rectRelativeTo.top + parentMarginTop; this.drop.nativeElement.style.bottom = bodyVerticalPosition + 'px'; this.drop.nativeElement.style.marginBottom = '2px'; } else { /** @type {?} */ const bodyVerticalPosition = -rectElement.top + rectRelativeTo.top - parentMarginTop + relativeTo.offsetHeight; this.drop.nativeElement.style.top = bodyVerticalPosition + 'px'; this.drop.nativeElement.style.marginTop = '2px'; } this.drop.nativeElement.style.left = rectRelativeTo.left - rectElement.left - parentMarginLeft + 'px'; this.drop.nativeElement.style.width = relativeTo.offsetWidth + 'px'; } /** * @param {?} asiDrownDown The content to display in the container * @return {?} */ show(asiDrownDown) { setTimeout(() => { this.template = asiDrownDown.contentTemplate; /** @type {?} */ let visibility = this.drop.nativeElement.style.visibility; this.drop.nativeElement.style.visibility = 'hidden'; if (asiDrownDown.dropDownClass) { this.renderer.addClass(this.elementRef.nativeElement, asiDrownDown.dropDownClass); } setTimeout(() => { /** @type {?} */ const dropContainer = this.drop.nativeElement.getBoundingClientRect(); if (dropContainer.right > this.document.documentElement.clientWidth) { this.drop.nativeElement.style.left = (this.drop.nativeElement.offsetLeft - dropContainer.right + this.document.documentElement.clientWidth) + 'px'; } /** @type {?} */ let dropRight = this.drop.nativeElement.offsetLeft + this.drop.nativeElement.offsetWidth; if (dropRight > this.document.documentElement.clientWidth) { this.drop.nativeElement.style.left = this.drop.nativeElement.offsetLeft + this.document.documentElement.scrollLeft - (dropRight - this.document.documentElement.clientWidth) + 'px'; } this.drop.nativeElement.style.visibility = visibility; }); }); } /** * @param {?} service * @return {?} */ injectService(service) { this.asiDropDownService = service; } /** * @param {?} index * @return {?} */ setIndex(index) { this.index = index; this.elementRef.nativeElement.style.zIndex = AsiDropdownContainer.BASE_INDEX + index; } /** * @param {?} calculWidth * @return {?} */ setCalculWidth(calculWidth) { if (calculWidth) { this.drop.nativeElement.style.width = this.referenceElement.offsetWidth + 'px'; } else { this.drop.nativeElement.style.width = ''; } } } AsiDropdownContainer.BASE_INDEX = 125; AsiDropdownContainer.decorators = [ { type: Component, args: [{ selector: 'asi-dropdown-container', host: { 'class': 'asi-component asi-dropdown-container' }, template: "<div #drop class=\"dropdown-container\">\r\n <ng-template [ngTemplateOutlet]=\"template\"></ng-template>\r\n</div>" }] } ]; /** @nocollapse */ AsiDropdownContainer.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: Renderer2 }, { type: ElementRef } ]; AsiDropdownContainer.propDecorators = { calculWidth: [{ type: Input }], drop: [{ type: ViewChild, args: ['drop', { read: ElementRef },] }], documentClick: [{ type: HostListener, args: ['document:mouseup', ['$event'],] }] }; if (false) { /** @type {?} */ AsiDropdownContainer.BASE_INDEX; /** @type {?} */ AsiDropdownContainer.prototype.index; /** @type {?} */ AsiDropdownContainer.prototype.canClose; /** @type {?} */ AsiDropdownContainer.prototype.calculWidth; /** @type {?} */ AsiDropdownContainer.prototype.drop; /** @type {?} */ AsiDropdownContainer.prototype.subjectContainer; /** @type {?} */ AsiDropdownContainer.prototype.asiDropDownService; /** @type {?} */ AsiDropdownContainer.prototype.template; /** @type {?} */ AsiDropdownContainer.prototype.referenceElement; /** @type {?} */ AsiDropdownContainer.prototype.document; /** @type {?} */ AsiDropdownContainer.prototype.renderer; /** @type {?} */ AsiDropdownContainer.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWRyb3Bkb3duLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWRyb3Bkb3duL2NvbnRhaW5lci9hc2ktZHJvcGRvd24tY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU8zQyxNQUFNOzs7Ozs7SUFrQkosWUFBc0MsUUFBYSxFQUFVLFFBQW1CLEVBQVUsVUFBc0I7UUFBMUUsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZOzJCQVh6RixJQUFJO2dDQUkrQixJQUFJLE9BQU8sRUFBRTtLQU82Qzs7Ozs7SUFHcEgsYUFBYSxDQUFDLEtBQWlCO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzVFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ1YsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7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QUFDLFFBQVE7WUE3QjVCLFNBQVM7WUFMVCxVQUFVOzs7MEJBdUJULEtBQUs7bUJBRUwsU0FBUyxTQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7NEJBV3RDLFlBQVksU0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzaURyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uL2FzaS1kcm9wZG93bi5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBUZW1wbGF0ZVJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBSZW5kZXJlcjIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQXNpRHJvcERvd24gfSBmcm9tICcuLi9hc2ktZHJvcGRvd24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhc2ktZHJvcGRvd24tY29udGFpbmVyJyxcclxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1kcm9wZG93bi1jb250YWluZXInIH0sXHJcbiAgdGVtcGxhdGVVcmw6ICdhc2ktZHJvcGRvd24tY29udGFpbmVyLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNpRHJvcGRvd25Db250YWluZXIge1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBCQVNFX0lOREVYID0gMTI1O1xyXG5cclxuICBpbmRleDogbnVtYmVyO1xyXG4gIGNhbkNsb3NlOiBGdW5jdGlvbjtcclxuXHJcbiAgQElucHV0KCkgY2FsY3VsV2lkdGggPSB0cnVlO1xyXG5cclxuICBAVmlld0NoaWxkKCdkcm9wJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3A6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgc3ViamVjdENvbnRhaW5lcjogU3ViamVjdDxBc2lEcm9wZG93bkNvbnRhaW5lcj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwcml2YXRlIGFzaURyb3BEb3duU2VydmljZTogQXNpRHJvcGRvd25TZXJ2aWNlO1xyXG5cclxuICBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgcHJpdmF0ZSByZWZlcmVuY2VFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgZG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuYXNpRHJvcERvd25TZXJ2aWNlLmNhbkNsb3NlKHRoaXMuaW5kZXgsIHRoaXMuY2FuQ2xvc2UpLnN1YnNjcmliZShjbG9zZSA9PiB7XHJcbiAgICAgICAgaWYgKGNsb3NlKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLnN1YmplY3RDb250YWluZXIubmV4dCh0aGlzKTtcclxuICAgIHRoaXMuc3ViamVjdENvbnRhaW5lci5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2UgZXZlbnQgd2hlbiBjbGljayBvdXRzaWRlXHJcbiAgb25DbG9zZSgpOiBPYnNlcnZhYmxlPEFzaURyb3Bkb3duQ29udGFpbmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbmVyLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZSB0aGUgY29udGFpbmVyIHVuZGVyIGh0bWxFbGVtZW50XHJcbiAgICogQHBhcmFtIHJlbGF0aXZlVG8gVGhlIHBhcmVudCBIVE1MRWxlbWVudCBvZiB0aGUgZHJvcGRvd25cclxuICAgKi9cclxuICBmb3JFbGVtZW50KHJlbGF0aXZlVG86IGFueSkge1xyXG4gICAgdGhpcy5yZWZlcmVuY2VFbGVtZW50ID0gcmVsYXRpdmVUbztcclxuXHJcbiAgICBjb25zdCByZWN0UmVsYXRpdmVUbyA9IHJlbGF0aXZlVG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgLy8gR2V0IHRoZSBjb21wdXRlZCBjbGFzcyBtYXJnaW4gKGZyb20gYm90aCBzdHlsZSArIGNzcyBjbGFzcylcclxuICAgIGNvbnN0IGJvZHlDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvY3VtZW50LmJvZHkpO1xyXG4gICAgY29uc3QgYm9keU1hcmdpblRvcCA9IHBhcnNlSW50KGJvZHlDb21wdXRlZFN0eWxlLm1hcmdpblRvcC5zbGljZSgwLCAtMiksIDEwKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGNvbXB1dGVkIGNsYXNzIG1hcmdpbiAoZnJvbSBib3RoIHN0eWxlICsgY3NzIGNsYXNzKVxyXG4gICAgY29uc3QgcGFyZW50Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgIGNvbnN0IHBhcmVudE1hcmdpblRvcCA9IHBhcnNlSW50KHBhcmVudENvbXB1dGVkU3R5bGUubWFyZ2luVG9wLnNsaWNlKDAsIC0yKSwgMTApO1xyXG4gICAgY29uc3QgcGFyZW50TWFyZ2luTGVmdCA9IHBhcnNlSW50KHBhcmVudENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdC5zbGljZSgwLCAtMiksIDEwKTtcclxuXHJcbiAgICBjb25zdCByZWN0RWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIGNvbnN0IHNjcmVlblZlcnRpY2FsUG9zaXRpb24gPSByZWN0UmVsYXRpdmVUby50b3AgLSBib2R5TWFyZ2luVG9wO1xyXG4gICAgaWYgKHNjcmVlblZlcnRpY2FsUG9zaXRpb24gPiB0aGlzLmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IC8gMikge1xyXG4gICAgICAvLyBzaG93IG92ZXIgdGhlIGVsZW1lbnRcclxuICAgICAgY29uc3QgYm9keVZlcnRpY2FsUG9zaXRpb24gPSByZWN0RWxlbWVudC5ib3R0b20gLSByZWN0UmVsYXRpdmVUby50b3AgKyBwYXJlbnRNYXJnaW5Ub3A7XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLmJvdHRvbSA9IGJvZHlWZXJ0aWNhbFBvc2l0aW9uICsgJ3B4JztcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luQm90dG9tID0gJzJweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBzaG93IHVuZGVyIHRoZSBlbGVtZW50XHJcbiAgICAgIGNvbnN0IGJvZHlWZXJ0aWNhbFBvc2l0aW9uID0gLSByZWN0RWxlbWVudC50b3AgKyByZWN0UmVsYXRpdmVUby50b3AgLSBwYXJlbnRNYXJnaW5Ub3AgKyByZWxhdGl2ZVRvLm9mZnNldEhlaWdodDtcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gYm9keVZlcnRpY2FsUG9zaXRpb24gKyAncHgnO1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSAnMnB4JztcclxuICAgIH1cclxuICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSByZWN0UmVsYXRpdmVUby5sZWZ0IC0gcmVjdEVsZW1lbnQubGVmdCAtIHBhcmVudE1hcmdpbkxlZnQgKyAncHgnO1xyXG5cclxuICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gcmVsYXRpdmVUby5vZmZzZXRXaWR0aCArICdweCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gYXNpRHJvd25Eb3duIFRoZSBjb250ZW50IHRvIGRpc3BsYXkgaW4gdGhlIGNvbnRhaW5lclxyXG4gICAqL1xyXG4gIHNob3coYXNpRHJvd25Eb3duOiBBc2lEcm9wRG93bikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudGVtcGxhdGUgPSBhc2lEcm93bkRvd24uY29udGVudFRlbXBsYXRlO1xyXG4gICAgICBsZXQgdmlzaWJpbGl0eSA9IHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk7XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgaWYgKGFzaURyb3duRG93bi5kcm9wRG93bkNsYXNzKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgYXNpRHJvd25Eb3duLmRyb3BEb3duQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRyb3BDb250YWluZXIgPSB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBpZiAoZHJvcENvbnRhaW5lci5yaWdodCA+IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID1cclxuICAgICAgICAgICAgKHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgLSBkcm9wQ29udGFpbmVyLnJpZ2h0ICsgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpICsgJ3B4JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkcm9wUmlnaHQgPSB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgaWYgKGRyb3BSaWdodCA+IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdFxyXG4gICAgICAgICAgICArIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgLSAoZHJvcFJpZ2h0IC0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5qZWN0U2VydmljZShzZXJ2aWNlOiBBc2lEcm9wZG93blNlcnZpY2UpIHtcclxuICAgIHRoaXMuYXNpRHJvcERvd25TZXJ2aWNlID0gc2VydmljZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS56SW5kZXggPSBBc2lEcm9wZG93bkNvbnRhaW5lci5CQVNFX0lOREVYICsgaW5kZXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2FsY3VsV2lkdGgoY2FsY3VsV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIGlmIChjYWxjdWxXaWR0aCkge1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMucmVmZXJlbmNlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=