ngx-mat-cdk
Version:
Extra Components for Angular Material including Filters,Drag Drop File, MatSelect Mobile Version
182 lines • 21.3 kB
JavaScript
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
import { animate, state, style, transition, trigger } from '@angular/animations';
export class NgxWindowComponent {
constructor() {
this.style = {};
this.panelWidth = '100%';
this.panelHeight = '250px';
this.hasAngle = false;
this.afterOpenPanel = new EventEmitter();
this.afterClosePanel = new EventEmitter();
this.directionOpenPanel = DirectionDropDownOpenPanel.top;
this.isOpen = false;
this._loading = true;
this._animateLoading = true;
}
ngOnInit() {
this.addScrollEvent();
}
toggle() {
if (this.isOpen) {
this.closePanel();
}
else {
this.openPanel();
}
}
onResize() {
if (this.elWindow) {
this.setPosition();
}
}
scrollEvenFunc(ev) {
if (this.elWindow) {
this.setPosition();
}
}
removeScrollEvent() {
document.removeEventListener('scroll', this.scrollEvent);
}
addScrollEvent() {
this.scrollEvent = this.scrollEvenFunc.bind(this);
document.addEventListener('scroll', this.scrollEvent, true);
}
onKeydown(event) {
// const target = event.target as HTMLElement;
if (event.keyCode === 27) {
this.closePanel();
}
}
onClick(event) {
const target = event.target;
if ((this.targetEl && this.targetEl.contains(target)) || (this.elWindow && this.elWindow.nativeElement.contains(target))) {
return;
}
else {
this.closePanel();
}
}
openPanel() {
this._loading = true;
this._animateLoading = true;
this.isOpen = true;
setTimeout(() => {
if (this.targetEl) {
}
else if (window.event) {
this.targetEl = window.event.target;
}
else {
return;
}
this.setPosition();
this.appendToContainer();
this.afterOpenPanel.emit();
this._loading = false;
this._animateLoading = false;
setTimeout(() => {
}, 500);
}, 5);
}
closePanel() {
this.isOpen = false;
this.style = {};
this.afterClosePanel.emit();
}
appendToContainer() {
window.document.documentElement.appendChild(this.elWindow.nativeElement);
}
getCoords(el) {
if (el) {
const boundingCoords = el.getBoundingClientRect();
const coords = {
left: boundingCoords.left + window.pageXOffset,
right: boundingCoords.right + window.pageXOffset,
top: boundingCoords.top + window.pageYOffset,
bottom: boundingCoords.bottom + window.pageYOffset
};
return coords;
}
return null;
}
setPosition() {
const coords = this.getCoords(this.targetEl);
if (!coords) {
return;
}
const offsetTop = this.hasAngle ? 9 : 0;
this.style['left'] = `${coords.left}px`;
this.style['top'] = `${coords.top + this.targetEl.clientHeight + offsetTop}px`;
if (this.panelWidth === '100%') {
this.style['width'] = `${this.targetEl.clientWidth}px`;
}
else {
this.panelWidth = typeof (this.panelWidth) === 'number' ? `${this.panelWidth}px` : this.panelWidth;
this.style['width'] = this.panelWidth;
}
if (!this.elWindow) {
return;
}
// const panelHeight = this.elWindow.nativeElement.clientHeight;
// if (
// coords.bottom + panelHeight >
// window.document.documentElement.clientHeight
// ) {
// this.directionOpenPanel = DirectionDropDownOpenPanel.bottom;
// this.style['top'] = `${coords.top - panelHeight - 3 - offsetTop}px`;
// } else {
this.directionOpenPanel = DirectionDropDownOpenPanel.top;
// }
}
ngOnDestroy() {
this.removeScrollEvent();
}
get DirectionOpenPanel() {
return DirectionDropDownOpenPanel;
}
}
NgxWindowComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-window',
template: "<!--<div [@animateWin]=\"_animateLoading?'hide':'show'\">-->\r\n<div [style.visibility]=\"_loading? 'hidden': ''\" [ngStyle]=\"style\"\r\n *ngIf=\"isOpen\" #elWindow class=\"ngx-window box-shadow-dep-4\">\r\n <div *ngIf=\"hasAngle\" class=\"ngx-window-angle\"\r\n [class.angly-top]=\"directionOpenPanel === DirectionOpenPanel.top\"\r\n [class.angly-bottom]=\"directionOpenPanel === DirectionOpenPanel.bottom\"\r\n >\r\n\r\n </div>\r\n\r\n <div [style.height.px]=\"panelHeight\"\r\n [style.height]=\"panelHeight\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n<!--</div>-->\r\n\r\n",
encapsulation: ViewEncapsulation.None,
animations: [
trigger('animateWin', [
state('hide', style({
marginTop: '10px',
opacity: 0
})),
state('show', style({
marginTop: 0,
opacity: 1
})),
transition('hide=>show', [
animate('0.5s ease-out')
]),
transition('show=>hide', [
animate('0.3s ease-out')
])
])
],
styles: [".ngx-window{top:0;width:0;z-index:1001}.ngx-window,.ngx-window-angle{background-color:#fff;position:absolute}.ngx-window-angle{height:18px;left:6px;transform:rotate(45deg);width:18px}.ngx-window-angle.angle-bottom{bottom:-6px}.ngx-window-angle.angle-top{top:-6px}.ngx-container-window{position:absolute}"]
},] }
];
NgxWindowComponent.ctorParameters = () => [];
NgxWindowComponent.propDecorators = {
elWindow: [{ type: ViewChild, args: ['elWindow',] }],
panelWidth: [{ type: Input }],
panelHeight: [{ type: Input }],
targetEl: [{ type: Input }],
hasAngle: [{ type: Input }],
afterOpenPanel: [{ type: Output }],
afterClosePanel: [{ type: Output }],
onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }],
onKeydown: [{ type: HostListener, args: ['window:keydown', ['$event'],] }],
onClick: [{ type: HostListener, args: ['window:click', ['$event'],] }]
};
export var DirectionDropDownOpenPanel;
(function (DirectionDropDownOpenPanel) {
DirectionDropDownOpenPanel[DirectionDropDownOpenPanel["top"] = 0] = "top";
DirectionDropDownOpenPanel[DirectionDropDownOpenPanel["bottom"] = 1] = "bottom";
})(DirectionDropDownOpenPanel || (DirectionDropDownOpenPanel = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXdpbmRvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvQWxpcmV6YSBNb2hhbW1hZGkvc291cmNlL3JlcG9zL015TGlicmFyeS9Bbmd1bGFyLkxpYnJhcnkvbGlicy9wcm9qZWN0cy9uZ3gtbWF0LWNkay9zcmMvIiwic291cmNlcyI6WyJsaWIvbmd4LXdpbmRvdy9uZ3gtd2luZG93LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxPQUFPLEVBQWEsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUEyQjFGLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0I7UUFHQSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRUYsZUFBVSxHQUFRLE1BQU0sQ0FBQztRQUN6QixnQkFBVyxHQUFRLE9BQU8sQ0FBQztRQUUzQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFcEQsdUJBQWtCLEdBQStCLDBCQUEwQixDQUFDLEdBQUcsQ0FBQztRQUNoRixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixvQkFBZSxHQUFHLElBQUksQ0FBQztJQWR2QixDQUFDO0lBaUJELFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7YUFBTTtZQUNMLElBQUks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QkFNRSxTQUFTLFNBQUMsVUFBVTt5QkFDcEIsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7dUJBQ0wsS0FBSzs2QkFDTCxNQUFNOzhCQUNOLE1BQU07dUJBb0JOLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7d0JBc0J4QyxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7c0JBUXpDLFlBQVksU0FBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0FBcUcxQyxNQUFNLENBQU4sSUFBWSwwQkFHWDtBQUhELFdBQVksMEJBQTBCO0lBQ3BDLHlFQUFHLENBQUE7SUFDSCwrRUFBTSxDQUFBO0FBQ1IsQ0FBQyxFQUhXLDBCQUEwQixLQUExQiwwQkFBMEIsUUFHckMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7YW5pbWF0ZSwgYW5pbWF0aW9uLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtd2luZG93JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LXdpbmRvdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LXdpbmRvdy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignYW5pbWF0ZVdpbicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGUnLCBzdHlsZSh7XHJcbiAgICAgICAgbWFyZ2luVG9wOiAnMTBweCcsXHJcbiAgICAgICAgb3BhY2l0eTogMFxyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdzaG93Jywgc3R5bGUoe1xyXG4gICAgICAgIG1hcmdpblRvcDogMCxcclxuICAgICAgICBvcGFjaXR5OiAxXHJcbiAgICAgIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZT0+c2hvdycsIFtcclxuICAgICAgICBhbmltYXRlKCcwLjVzIGVhc2Utb3V0JylcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Nob3c9PmhpZGUnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnMC4zcyBlYXNlLW91dCcpXHJcbiAgICAgIF0pXHJcblxyXG4gICAgXSlcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hXaW5kb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICBzdHlsZSA9IHt9O1xyXG4gIEBWaWV3Q2hpbGQoJ2VsV2luZG93JykgZWxXaW5kb3c6IEVsZW1lbnRSZWY7XHJcbiAgQElucHV0KCkgcGFuZWxXaWR0aDogYW55ID0gJzEwMCUnO1xyXG4gIEBJbnB1dCgpIHBhbmVsSGVpZ2h0OiBhbnkgPSAnMjUwcHgnO1xyXG4gIEBJbnB1dCgpIHRhcmdldEVsOiBIVE1MRWxlbWVudDtcclxuICBASW5wdXQoKSBoYXNBbmdsZSA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBhZnRlck9wZW5QYW5lbCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBhZnRlckNsb3NlUGFuZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgZGlyZWN0aW9uT3BlblBhbmVsOiBEaXJlY3Rpb25Ecm9wRG93bk9wZW5QYW5lbCA9IERpcmVjdGlvbkRyb3BEb3duT3BlblBhbmVsLnRvcDtcclxuICBpc09wZW4gPSBmYWxzZTtcclxuICBfbG9hZGluZyA9IHRydWU7XHJcbiAgX2FuaW1hdGVMb2FkaW5nID0gdHJ1ZTtcclxuICBzY3JvbGxFdmVudDtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmFkZFNjcm9sbEV2ZW50KCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoKSB7XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5QYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25SZXNpemUoKSB7XHJcbiAgICBpZiAodGhpcy5lbFdpbmRvdykge1xyXG4gICAgICB0aGlzLnNldFBvc2l0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzY3JvbGxFdmVuRnVuYyhldjogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVsV2luZG93KSB7XHJcbiAgICAgIHRoaXMuc2V0UG9zaXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVNjcm9sbEV2ZW50KCk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudCk7XHJcbiAgfVxyXG5cclxuICBhZGRTY3JvbGxFdmVudCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2Nyb2xsRXZlbnQgPSB0aGlzLnNjcm9sbEV2ZW5GdW5jLmJpbmQodGhpcyk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbEV2ZW50LCB0cnVlKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xyXG4gICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCh0aGlzLnRhcmdldEVsICYmIHRoaXMudGFyZ2V0RWwuY29udGFpbnModGFyZ2V0KSkgfHwgKHRoaXMuZWxXaW5kb3cgJiYgdGhpcy5lbFdpbmRvdy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlblBhbmVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLl9hbmltYXRlTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudGFyZ2V0RWwpIHtcclxuICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnRhcmdldEVsID0gd2luZG93LmV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRQb3NpdGlvbigpO1xyXG4gICAgICB0aGlzLmFwcGVuZFRvQ29udGFpbmVyKCk7XHJcbiAgICAgIHRoaXMuYWZ0ZXJPcGVuUGFuZWwuZW1pdCgpO1xyXG4gICAgICB0aGlzLl9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2FuaW1hdGVMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB9LCA1MDApO1xyXG4gICAgfSwgNSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZVBhbmVsKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuc3R5bGUgPSB7fTtcclxuICAgIHRoaXMuYWZ0ZXJDbG9zZVBhbmVsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwZW5kVG9Db250YWluZXIoKTogdm9pZCB7XHJcbiAgICB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZWxXaW5kb3cubmF0aXZlRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvb3JkcyhlbDogSFRNTEVsZW1lbnQpOiBDb29yZHMge1xyXG4gICAgaWYgKGVsKSB7XHJcbiAgICAgIGNvbnN0IGJvdW5kaW5nQ29vcmRzID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IGNvb3JkczogQ29vcmRzID0ge1xyXG4gICAgICAgIGxlZnQ6IGJvdW5kaW5nQ29vcmRzLmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQsXHJcbiAgICAgICAgcmlnaHQ6IGJvdW5kaW5nQ29vcmRzLnJpZ2h0ICsgd2luZG93LnBhZ2VYT2Zmc2V0LFxyXG4gICAgICAgIHRvcDogYm91bmRpbmdDb29yZHMudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0LFxyXG4gICAgICAgIGJvdHRvbTogYm91bmRpbmdDb29yZHMuYm90dG9tICsgd2luZG93LnBhZ2VZT2Zmc2V0XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBjb29yZHM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHNldFBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5nZXRDb29yZHModGhpcy50YXJnZXRFbCk7XHJcbiAgICBpZiAoIWNvb3Jkcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBvZmZzZXRUb3AgPSB0aGlzLmhhc0FuZ2xlID8gOSA6IDA7XHJcbiAgICB0aGlzLnN0eWxlWydsZWZ0J10gPSBgJHtjb29yZHMubGVmdH1weGA7XHJcbiAgICB0aGlzLnN0eWxlWyd0b3AnXSA9IGAke2Nvb3Jkcy50b3AgKyB0aGlzLnRhcmdldEVsLmNsaWVudEhlaWdodCArIG9mZnNldFRvcH1weGA7XHJcbiAgICBpZiAodGhpcy5wYW5lbFdpZHRoID09PSAnMTAwJScpIHtcclxuICAgICAgdGhpcy5zdHlsZVsnd2lkdGgnXSA9IGAke3RoaXMudGFyZ2V0RWwuY2xpZW50V2lkdGh9cHhgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYW5lbFdpZHRoID0gdHlwZW9mICh0aGlzLnBhbmVsV2lkdGgpID09PSAnbnVtYmVyJyA/IGAke3RoaXMucGFuZWxXaWR0aH1weGAgOiB0aGlzLnBhbmVsV2lkdGg7XHJcbiAgICAgIHRoaXMuc3R5bGVbJ3dpZHRoJ10gPSB0aGlzLnBhbmVsV2lkdGg7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZWxXaW5kb3cpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc3QgcGFuZWxIZWlnaHQgPSB0aGlzLmVsV2luZG93Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgLy8gaWYgKFxyXG4gICAgLy8gICBjb29yZHMuYm90dG9tICsgcGFuZWxIZWlnaHQgPlxyXG4gICAgLy8gICB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxyXG4gICAgLy8gKSB7XHJcbiAgICAvLyAgIHRoaXMuZGlyZWN0aW9uT3BlblBhbmVsID0gRGlyZWN0aW9uRHJvcERvd25PcGVuUGFuZWwuYm90dG9tO1xyXG4gICAgLy8gICB0aGlzLnN0eWxlWyd0b3AnXSA9IGAke2Nvb3Jkcy50b3AgLSBwYW5lbEhlaWdodCAtIDMgLSBvZmZzZXRUb3B9cHhgO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIHRoaXMuZGlyZWN0aW9uT3BlblBhbmVsID0gRGlyZWN0aW9uRHJvcERvd25PcGVuUGFuZWwudG9wO1xyXG5cclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1vdmVTY3JvbGxFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IERpcmVjdGlvbk9wZW5QYW5lbCgpIHtcclxuICAgIHJldHVybiBEaXJlY3Rpb25Ecm9wRG93bk9wZW5QYW5lbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29vcmRzIHtcclxuICBsZWZ0OiBudW1iZXI7XHJcbiAgcmlnaHQ6IG51bWJlcjtcclxuICB0b3A6IG51bWJlcjtcclxuICBib3R0b206IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gRGlyZWN0aW9uRHJvcERvd25PcGVuUGFuZWwge1xyXG4gIHRvcCxcclxuICBib3R0b21cclxufVxyXG4iXX0=