truly-ui
Version:
Web Components for Desktop Applications.
217 lines (215 loc) • 27.3 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Input, Component, Output, EventEmitter } from '@angular/core';
import { Subject } from 'rxjs';
import { TlBackdrop } from '../../../core/components/backdrop/backdrop';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class TlSidebar {
constructor(renderer, element, factory, view) {
this.renderer = renderer;
this.element = element;
this.factory = factory;
this.view = view;
this.opened = false;
this.mode = 'slide';
this.width = 300;
this.position = 'start';
this.dockWidth = 80;
this.dock = false;
this.openedChange = new EventEmitter();
this.open = new EventEmitter();
this.close = new EventEmitter();
this.docked = false;
this.toggleChange = new Subject();
}
ngOnInit() {
this.sidebarWidth = this.width;
this.handleDockAndPosition();
this.handleDockSidebar();
this.listenScroll();
}
ngAfterContentInit() {
setTimeout(() => {
this.toggleChangeEmitter();
}, 1);
}
toggle() {
this.handleBackdropOnOver();
if (this.docked) {
this.openDockSidebar();
return;
}
if (this.dock && !this.docked) {
this.closeDockSidebar();
return;
}
this.opened = !this.opened;
this.toggleChangeEmitter();
}
openDockSidebar() {
this.setDockOpened();
this.opened = true;
this.emitOpenClose();
this.toggleChangeEmitter();
}
closeDockSidebar() {
this.setDockClosed();
this.opened = false;
this.emitOpenClose();
this.toggleChangeEmitter();
}
handleDockAndPosition() {
if (this.dock && this.position === 'end') {
throw Error('The Dock property is unavailable in [end] position');
}
}
handleBackdropOnOver() {
if (this.isModeOver()) {
this.createBackdrop();
}
}
handleDockSidebar() {
if (this.dock && !this.opened) {
this.docked = true;
this.width = this.dockWidth;
this.opened = false;
}
}
listenScroll() {
if (this.isModeOver()) {
this.renderer.listen(document, 'scroll', ($event) => {
this.setBackdropOptions();
});
}
}
toggleChangeEmitter() {
this.toggleChange.next({ 'sidebar': this });
}
emitOpenClose() {
this.opened ? this.open.emit() : this.close.emit();
}
isChangeDockOpen(change) {
return (!change['opened'].currentValue) && (this.dock);
}
isChangeDockClose(change) {
return (change['opened'].currentValue) && (this.dock);
}
setDockClosed() {
this.docked = true;
this.width = this.dockWidth;
this.handleRemoveBackdrop();
}
handleRemoveBackdrop() {
if (this.backdrop) {
this.removeBackdrop();
}
}
setDockOpened() {
this.docked = false;
this.width = this.sidebarWidth;
}
isFirstChange(change) {
return change['opened'].firstChange;
}
isModeOver() {
return this.mode === 'over';
}
setBackdropOptions() {
if (this.backdrop) {
this.backdrop.instance.setBackdropOptions({
'width': this.element.nativeElement.offsetParent.offsetWidth + 'px',
'height': this.element.nativeElement.offsetParent.offsetHeight + 'px',
'top': this.element.nativeElement.offsetParent.getBoundingClientRect().top + 'px',
'left': this.element.nativeElement.offsetParent.getBoundingClientRect().left + 'px',
'zIndex': 1
});
}
}
createBackdrop() {
if (!this.backdrop && this.mode === 'over') {
const componentFactory = this.factory.resolveComponentFactory(TlBackdrop);
this.backdrop = this.view.createComponent(componentFactory);
this.setBackdropOptions();
this.backdrop.instance.click.subscribe(() => {
this.dock ? this.setDockClosed() : this.opened = false;
this.removeBackdrop();
this.openedChange.emit(this.opened);
});
return;
}
this.handleRemoveBackdrop();
}
removeBackdrop() {
if (this.backdrop) {
this.view.remove(this.view.indexOf(this.backdrop));
this.backdrop = undefined;
}
}
ngOnChanges(change) {
if (change['opened']) {
this.openedChange.emit(change['opened'].currentValue);
if (this.isModeOver() && !this.opened) {
this.removeBackdrop();
}
if (this.isModeOver() && this.opened) {
this.createBackdrop();
}
if (this.isChangeDockOpen(change) && (!this.isFirstChange(change))) {
this.setDockClosed();
this.emitOpenClose();
this.toggleChangeEmitter();
return;
}
if (this.isChangeDockClose(change) && (!this.isFirstChange(change))) {
this.setDockOpened();
this.emitOpenClose();
this.toggleChangeEmitter();
return;
}
this.toggleChangeEmitter();
}
}
}
/** @nocollapse */ TlSidebar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlSidebar, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ComponentFactoryResolver }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlSidebar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlSidebar, selector: "tl-sidebar", inputs: { opened: "opened", mode: "mode", width: "width", position: "position", dockWidth: "dockWidth", dock: "dock" }, outputs: { openedChange: "openedChange", open: "open", close: "close" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"sidebar-wrapper\">\n <div class=\"ui-sidebar\"\n [style.width]=\"width + 'px'\"\n [ngClass]=\"{\n 'start': position === 'start',\n 'end': position === 'end',\n 'animate-start': opened && position === 'start',\n 'animate-end': opened && position === 'end',\n 'animate-dock': dock && docked && !opened\n }\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host{position:relative}.sidebar-wrapper{position:relative;height:100%;width:100%}.ui-sidebar{background-color:#f3f3f3;position:absolute;top:0;bottom:0;z-index:800;transition:left .2s cubic-bezier(.69,.01,0,1),right .2s cubic-bezier(.69,.01,0,1),width .2s cubic-bezier(.69,.01,0,1)}.start{left:-1000px;visibility:hidden}.end{right:-1000px;visibility:hidden}.animate-start,.animate-dock{visibility:visible;left:0}.animate-end{visibility:visible;right:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlSidebar, decorators: [{
type: Component,
args: [{ selector: 'tl-sidebar', template: "<div class=\"sidebar-wrapper\">\n <div class=\"ui-sidebar\"\n [style.width]=\"width + 'px'\"\n [ngClass]=\"{\n 'start': position === 'start',\n 'end': position === 'end',\n 'animate-start': opened && position === 'start',\n 'animate-end': opened && position === 'end',\n 'animate-dock': dock && docked && !opened\n }\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host{position:relative}.sidebar-wrapper{position:relative;height:100%;width:100%}.ui-sidebar{background-color:#f3f3f3;position:absolute;top:0;bottom:0;z-index:800;transition:left .2s cubic-bezier(.69,.01,0,1),right .2s cubic-bezier(.69,.01,0,1),width .2s cubic-bezier(.69,.01,0,1)}.start{left:-1000px;visibility:hidden}.end{right:-1000px;visibility:hidden}.animate-start,.animate-dock{visibility:visible;left:0}.animate-end{visibility:visible;right:0}\n"] }]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }]; }, propDecorators: { opened: [{
type: Input
}], mode: [{
type: Input
}], width: [{
type: Input
}], position: [{
type: Input
}], dockWidth: [{
type: Input
}], dock: [{
type: Input
}], openedChange: [{
type: Output
}], open: [{
type: Output
}], close: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3NpZGViYXIvcGFydHMvc2lkZWJhci9zaWRlYmFyLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvc2lkZWJhci9wYXJ0cy9zaWRlYmFyL3NpZGViYXIuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBQ0wsS0FBSyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUcvQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7O0FBUXhFLE1BQU0sT0FBTyxTQUFTO0lBNEJwQixZQUFxQixRQUFtQixFQUNuQixPQUFtQixFQUNuQixPQUFpQyxFQUNqQyxJQUFzQjtRQUh0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFDakMsU0FBSSxHQUFKLElBQUksQ0FBa0I7UUE3QmxDLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixTQUFJLEdBQThCLE9BQU8sQ0FBQztRQUUxQyxVQUFLLEdBQUcsR0FBRyxDQUFDO1FBRVosYUFBUSxHQUFvQixPQUFPLENBQUM7UUFFcEMsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLFNBQUksR0FBRyxLQUFLLENBQUM7UUFFWixpQkFBWSxHQUEwQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpELFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU3QyxVQUFLLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakQs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TzthQUNSO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDOzswSEEvTVUsU0FBUzs4R0FBVCxTQUFTLHdRQ25DdEIscWFBYUE7NEZEc0JhLFNBQVM7a0JBTnJCLFNBQVM7K0JBQ0UsWUFBWTsrTEFPYixNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsSUFBSTtzQkFBYixNQUFNO2dCQUVHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gTUlUIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0IHtcbiAgSW5wdXQsIENvbXBvbmVudCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlcixcbiAgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIFJlbmRlcmVyMixcbiAgRWxlbWVudFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRsQmFja2Ryb3AgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvbmVudHMvYmFja2Ryb3AvYmFja2Ryb3AnO1xuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndGwtc2lkZWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlYmFyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsgJy4vc2lkZWJhci5zY3NzJyBdLFxufSApXG5cbmV4cG9ydCBjbGFzcyBUbFNpZGViYXIgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgb3BlbmVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbW9kZTogJ3B1c2gnIHwgJ292ZXInIHwgJ3NsaWRlJyA9ICdzbGlkZSc7XG5cbiAgQElucHV0KCkgd2lkdGggPSAzMDA7XG5cbiAgQElucHV0KCkgcG9zaXRpb246ICdzdGFydCcgfCAnZW5kJyA9ICdzdGFydCc7XG5cbiAgQElucHV0KCkgZG9ja1dpZHRoID0gODA7XG5cbiAgQElucHV0KCkgZG9jayA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBvcGVuZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgb3BlbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgZG9ja2VkID0gZmFsc2U7XG5cbiAgcHVibGljIHRvZ2dsZUNoYW5nZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBzaWRlYmFyV2lkdGg7XG5cbiAgcHJpdmF0ZSBiYWNrZHJvcDtcblxuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBmYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgICAgICAgICBwcml2YXRlIHZpZXc6IFZpZXdDb250YWluZXJSZWYgKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNpZGViYXJXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgdGhpcy5oYW5kbGVEb2NrQW5kUG9zaXRpb24oKTtcbiAgICB0aGlzLmhhbmRsZURvY2tTaWRlYmFyKCk7XG4gICAgdGhpcy5saXN0ZW5TY3JvbGwoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICB0aGlzLnRvZ2dsZUNoYW5nZUVtaXR0ZXIoKTtcbiAgICB9LCAxICk7XG4gIH1cblxuICB0b2dnbGUoKSB7XG4gICAgdGhpcy5oYW5kbGVCYWNrZHJvcE9uT3ZlcigpO1xuICAgIGlmICggdGhpcy5kb2NrZWQgKSB7XG4gICAgICB0aGlzLm9wZW5Eb2NrU2lkZWJhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICggdGhpcy5kb2NrICYmICF0aGlzLmRvY2tlZCApIHtcbiAgICAgIHRoaXMuY2xvc2VEb2NrU2lkZWJhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlbmVkID0gIXRoaXMub3BlbmVkO1xuICAgIHRoaXMudG9nZ2xlQ2hhbmdlRW1pdHRlcigpO1xuICB9XG5cbiAgb3BlbkRvY2tTaWRlYmFyKCkge1xuICAgIHRoaXMuc2V0RG9ja09wZW5lZCgpO1xuICAgIHRoaXMub3BlbmVkID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXRPcGVuQ2xvc2UoKTtcbiAgICB0aGlzLnRvZ2dsZUNoYW5nZUVtaXR0ZXIoKTtcbiAgfVxuXG4gIGNsb3NlRG9ja1NpZGViYXIoKSB7XG4gICAgdGhpcy5zZXREb2NrQ2xvc2VkKCk7XG4gICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRPcGVuQ2xvc2UoKTtcbiAgICB0aGlzLnRvZ2dsZUNoYW5nZUVtaXR0ZXIoKTtcbiAgfVxuXG4gIGhhbmRsZURvY2tBbmRQb3NpdGlvbigpIHtcbiAgICBpZiAoIHRoaXMuZG9jayAmJiB0aGlzLnBvc2l0aW9uID09PSAnZW5kJyApIHtcbiAgICAgIHRocm93IEVycm9yKCAnVGhlIERvY2sgcHJvcGVydHkgaXMgdW5hdmFpbGFibGUgaW4gW2VuZF0gcG9zaXRpb24nICk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQmFja2Ryb3BPbk92ZXIoKSB7XG4gICAgaWYgKCB0aGlzLmlzTW9kZU92ZXIoKSApIHtcbiAgICAgIHRoaXMuY3JlYXRlQmFja2Ryb3AoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVEb2NrU2lkZWJhcigpIHtcbiAgICBpZiAoIHRoaXMuZG9jayAmJiAhdGhpcy5vcGVuZWQgKSB7XG4gICAgICB0aGlzLmRvY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5kb2NrV2lkdGg7XG4gICAgICB0aGlzLm9wZW5lZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RlblNjcm9sbCgpIHtcbiAgICBpZiAoIHRoaXMuaXNNb2RlT3ZlcigpICkge1xuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oIGRvY3VtZW50LCAnc2Nyb2xsJywgKCAkZXZlbnQgKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0QmFja2Ryb3BPcHRpb25zKCk7XG4gICAgICB9ICk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ2hhbmdlRW1pdHRlcigpIHtcbiAgICB0aGlzLnRvZ2dsZUNoYW5nZS5uZXh0KCB7ICdzaWRlYmFyJzogdGhpcyB9ICk7XG4gIH1cblxuICBlbWl0T3BlbkNsb3NlKCkge1xuICAgIHRoaXMub3BlbmVkID8gdGhpcy5vcGVuLmVtaXQoKSA6IHRoaXMuY2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgaXNDaGFuZ2VEb2NrT3BlbiggY2hhbmdlICkge1xuICAgIHJldHVybiAoIWNoYW5nZVsgJ29wZW5lZCcgXS5jdXJyZW50VmFsdWUpICYmICh0aGlzLmRvY2spO1xuICB9XG5cbiAgaXNDaGFuZ2VEb2NrQ2xvc2UoIGNoYW5nZSApIHtcbiAgICByZXR1cm4gKGNoYW5nZVsgJ29wZW5lZCcgXS5jdXJyZW50VmFsdWUpICYmICh0aGlzLmRvY2spO1xuICB9XG5cbiAgc2V0RG9ja0Nsb3NlZCgpIHtcbiAgICB0aGlzLmRvY2tlZCA9IHRydWU7XG4gICAgdGhpcy53aWR0aCA9IHRoaXMuZG9ja1dpZHRoO1xuICAgIHRoaXMuaGFuZGxlUmVtb3ZlQmFja2Ryb3AoKTtcbiAgfVxuXG4gIGhhbmRsZVJlbW92ZUJhY2tkcm9wKCkge1xuICAgIGlmICggdGhpcy5iYWNrZHJvcCApIHtcbiAgICAgIHRoaXMucmVtb3ZlQmFja2Ryb3AoKTtcbiAgICB9XG4gIH1cblxuICBzZXREb2NrT3BlbmVkKCkge1xuICAgIHRoaXMuZG9ja2VkID0gZmFsc2U7XG4gICAgdGhpcy53aWR0aCA9IHRoaXMuc2lkZWJhcldpZHRoO1xuICB9XG5cbiAgaXNGaXJzdENoYW5nZSggY2hhbmdlICkge1xuICAgIHJldHVybiBjaGFuZ2VbICdvcGVuZWQnIF0uZmlyc3RDaGFuZ2U7XG4gIH1cblxuICBpc01vZGVPdmVyKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdvdmVyJztcbiAgfVxuXG4gIHNldEJhY2tkcm9wT3B0aW9ucygpIHtcbiAgICBpZiAoIHRoaXMuYmFja2Ryb3AgKSB7XG4gICAgICAoPFRsQmFja2Ryb3A+dGhpcy5iYWNrZHJvcC5pbnN0YW5jZSkuc2V0QmFja2Ryb3BPcHRpb25zKFxuICAgICAgICB7XG4gICAgICAgICAgJ3dpZHRoJzogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50Lm9mZnNldFdpZHRoICsgJ3B4JyxcbiAgICAgICAgICAnaGVpZ2h0JzogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50Lm9mZnNldEhlaWdodCArICdweCcsXG4gICAgICAgICAgJ3RvcCc6IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyAncHgnLFxuICAgICAgICAgICdsZWZ0JzogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAncHgnLFxuICAgICAgICAgICd6SW5kZXgnOiAxXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQmFja2Ryb3AoKSB7XG4gICAgaWYgKCAhdGhpcy5iYWNrZHJvcCAmJiB0aGlzLm1vZGUgPT09ICdvdmVyJyApIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmZhY3RvcnkucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoIFRsQmFja2Ryb3AgKTtcbiAgICAgIHRoaXMuYmFja2Ryb3AgPSB0aGlzLnZpZXcuY3JlYXRlQ29tcG9uZW50KCBjb21wb25lbnRGYWN0b3J5ICk7XG4gICAgICB0aGlzLnNldEJhY2tkcm9wT3B0aW9ucygpO1xuICAgICAgKDxUbEJhY2tkcm9wPnRoaXMuYmFja2Ryb3AuaW5zdGFuY2UpLmNsaWNrLnN1YnNjcmliZSggKCkgPT4ge1xuICAgICAgICB0aGlzLmRvY2sgPyB0aGlzLnNldERvY2tDbG9zZWQoKSA6IHRoaXMub3BlbmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVtb3ZlQmFja2Ryb3AoKTtcbiAgICAgICAgdGhpcy5vcGVuZWRDaGFuZ2UuZW1pdCggdGhpcy5vcGVuZWQgKTtcbiAgICAgIH0gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVSZW1vdmVCYWNrZHJvcCgpO1xuICB9XG5cblxuXG4gIHJlbW92ZUJhY2tkcm9wKCkge1xuICAgIGlmICh0aGlzLmJhY2tkcm9wKSB7XG4gICAgICB0aGlzLnZpZXcucmVtb3ZlKCB0aGlzLnZpZXcuaW5kZXhPZiggdGhpcy5iYWNrZHJvcCApICk7XG4gICAgICB0aGlzLmJhY2tkcm9wID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCBjaGFuZ2U6IFNpbXBsZUNoYW5nZXMgKSB7XG4gICAgaWYgKCBjaGFuZ2VbICdvcGVuZWQnIF0gKSB7XG4gICAgICB0aGlzLm9wZW5lZENoYW5nZS5lbWl0KCBjaGFuZ2VbICdvcGVuZWQnIF0uY3VycmVudFZhbHVlICk7XG4gICAgICBpZiAoIHRoaXMuaXNNb2RlT3ZlcigpICYmICF0aGlzLm9wZW5lZCApIHtcbiAgICAgICAgdGhpcy5yZW1vdmVCYWNrZHJvcCgpO1xuICAgICAgfVxuICAgICAgaWYgKCB0aGlzLmlzTW9kZU92ZXIoKSAmJiB0aGlzLm9wZW5lZCApIHtcbiAgICAgICAgdGhpcy5jcmVhdGVCYWNrZHJvcCgpO1xuICAgICAgfVxuICAgICAgaWYgKCB0aGlzLmlzQ2hhbmdlRG9ja09wZW4oIGNoYW5nZSApICYmICghdGhpcy5pc0ZpcnN0Q2hhbmdlKCBjaGFuZ2UgKSkgKSB7XG4gICAgICAgIHRoaXMuc2V0RG9ja0Nsb3NlZCgpO1xuICAgICAgICB0aGlzLmVtaXRPcGVuQ2xvc2UoKTtcbiAgICAgICAgdGhpcy50b2dnbGVDaGFuZ2VFbWl0dGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICggdGhpcy5pc0NoYW5nZURvY2tDbG9zZSggY2hhbmdlICkgJiYgKCF0aGlzLmlzRmlyc3RDaGFuZ2UoIGNoYW5nZSApKSApIHtcbiAgICAgICAgdGhpcy5zZXREb2NrT3BlbmVkKCk7XG4gICAgICAgIHRoaXMuZW1pdE9wZW5DbG9zZSgpO1xuICAgICAgICB0aGlzLnRvZ2dsZUNoYW5nZUVtaXR0ZXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy50b2dnbGVDaGFuZ2VFbWl0dGVyKCk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzaWRlYmFyLXdyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cInVpLXNpZGViYXJcIlxuICAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aCArICdweCdcIlxuICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAnc3RhcnQnOiBwb3NpdGlvbiA9PT0gJ3N0YXJ0JyxcbiAgICAgICAnZW5kJzogcG9zaXRpb24gPT09ICdlbmQnLFxuICAgICAgICdhbmltYXRlLXN0YXJ0Jzogb3BlbmVkICYmIHBvc2l0aW9uID09PSAnc3RhcnQnLFxuICAgICAgICdhbmltYXRlLWVuZCc6IG9wZW5lZCAmJiBwb3NpdGlvbiA9PT0gJ2VuZCcsXG4gICAgICAgJ2FuaW1hdGUtZG9jayc6IGRvY2sgJiYgZG9ja2VkICYmICFvcGVuZWRcbiAgICAgICB9XCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19