UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

123 lines (121 loc) 20.5 kB
/* 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 { Component, ContentChild, Input, TemplateRef, ViewChild, Output, EventEmitter, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../blockui/blockui"; import * as i3 from "ngx-virtual-scroller"; import * as i4 from "./parts/timeline-item/timeline-item"; export class TlTimeline { constructor(change) { this.change = change; this.data = []; this.clearOnUpdateData = false; this.align = 'left'; this.height = '400px'; this.keyTitle = 'title'; this.keyText = 'text'; this.keyDate = 'date'; this.rowsPage = 20; this.mode = 'basic'; this.color = 'primary'; this.enableUnequalChildrenSizes = true; this.bufferAmount = 5; this.lazyLoad = new EventEmitter(); this.buffer = []; this.skip = 0; this.loadingMoreData = false; this.nothingFound = false; } ngOnInit() { } onInit(lineItem, item, index) { lineItem.setTemplateView(item, index); } ngOnChanges(changes) { this.loadingMoreData = false; if (this.data.length > 0) { if (this.clearOnUpdateData) { this.buffer = this.data; } else { this.buffer = this.buffer.concat(this.data); } this.nothingFound = false; return this.loadingMoreData = false; } if (this.data.length === 0 && this.buffer.length > 0) { this.nothingFound = false; return this.loadingMoreData = false; } if (this.data.length === 0 && this.buffer.length === 0) { return this.nothingFound = true; } } fetchMore(event) { if (!this.loadingMoreData && this.mode === 'infinite') { if (event.endIndex !== this.buffer.length - 1) { return; } this.loadingMoreData = true; this.skip = this.buffer.length; this.lazyLoad.emit({ skip: this.skip, limit: this.rowsPage }); } } } /** @nocollapse */ TlTimeline.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlTimeline, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlTimeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlTimeline, selector: "tl-timeline", inputs: { data: "data", clearOnUpdateData: "clearOnUpdateData", align: "align", height: "height", keyTitle: "keyTitle", keyText: "keyText", keyDate: "keyDate", rowsPage: "rowsPage", mode: "mode", color: "color", enableUnequalChildrenSizes: "enableUnequalChildrenSizes", bufferAmount: "bufferAmount" }, outputs: { lazyLoad: "lazyLoad" }, queries: [{ propertyName: "customTemplate", first: true, predicate: TemplateRef, descendants: true, static: true }], viewQueries: [{ propertyName: "listComponent", first: true, predicate: ["listComponent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [tlBlockui]=\"loadingMoreData\" [class]=\"'tl-timeline ' + color\">\n <virtual-scroller #scroll [items]=\"buffer\" [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes\" [bufferAmount]=\"bufferAmount\" [checkResizeInterval]=\"300\" (vsEnd)=\"fetchMore($event)\" class=\"tl-timeline-scroll\" [style.height]=\"height\">\n <tl-timeline-item #line\n *ngFor=\"let item of scroll.viewPortItems; let i = index; let even = even\"\n [data]=\"data\"\n [attr.data-index]=\"skip + i\"\n [date]=\"item[keyDate]\"\n [template]=\"(customTemplate) ? customTemplate : basicTemplate\"\n (initialize)=\"onInit(line, item, i)\"\n [align]=\"align\"\n [side]=\"even\"\n [ngClass]=\"(align === 'right') ? 'ltr' : null\">\n </tl-timeline-item>\n </virtual-scroller>\n <ng-template let-item=\"item\" let-index=\"index\" #basicTemplate>\n <div class=\"content-head-default\">\n <span class=\"content-title\">{{ item[keyTitle] }}</span>\n </div>\n <div class=\"content-body-default\">\n <div class=\"content-text\">\n {{ item[keyText] }}\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [".tl-timeline-scroll{overflow-y:auto;overflow-x:auto;padding:0 5px 0 20px}.ltr{direction:ltr}.rtl{direction:rtl}.tl-timeline-scroll::-webkit-scrollbar{width:8px}.ui-timeline-content{margin:0 10px 0 20px}.content-head-default{width:100%;padding:5px 10px;border-top-left-radius:6px;border-top-right-radius:6px}.content-head-default .content-title{font-size:14px;font-weight:700}.content-body-default{border-top:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px}.content-body-default .content-text{padding:5px 10px;font-size:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.TlBlockUI, selector: "[tlBlockui]", inputs: ["tlBlockui", "dimensionsFrom", "blockuiConfig"] }, { kind: "component", type: i3.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "RTL", "useMarginInsteadOfTranslate", "ssrViewportWidth", "ssrViewportHeight", "compareItems", "checkResizeInterval", "modifyOverflowStyleOfParentScroll", "resizeBypassRefreshThreshold", "scrollAnimationTime", "scrollDebounceTime", "scrollThrottlingTime", "scrollbarHeight", "scrollbarWidth", "stripedTable", "horizontal", "enableUnequalChildrenSizes", "bufferAmount", "items", "parentScroll", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "component", type: i4.TlTimelineItem, selector: "tl-timeline-item", inputs: ["align", "side", "date", "color", "data", "template"], outputs: ["initialize"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlTimeline, decorators: [{ type: Component, args: [{ selector: 'tl-timeline', template: "<div [tlBlockui]=\"loadingMoreData\" [class]=\"'tl-timeline ' + color\">\n <virtual-scroller #scroll [items]=\"buffer\" [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes\" [bufferAmount]=\"bufferAmount\" [checkResizeInterval]=\"300\" (vsEnd)=\"fetchMore($event)\" class=\"tl-timeline-scroll\" [style.height]=\"height\">\n <tl-timeline-item #line\n *ngFor=\"let item of scroll.viewPortItems; let i = index; let even = even\"\n [data]=\"data\"\n [attr.data-index]=\"skip + i\"\n [date]=\"item[keyDate]\"\n [template]=\"(customTemplate) ? customTemplate : basicTemplate\"\n (initialize)=\"onInit(line, item, i)\"\n [align]=\"align\"\n [side]=\"even\"\n [ngClass]=\"(align === 'right') ? 'ltr' : null\">\n </tl-timeline-item>\n </virtual-scroller>\n <ng-template let-item=\"item\" let-index=\"index\" #basicTemplate>\n <div class=\"content-head-default\">\n <span class=\"content-title\">{{ item[keyTitle] }}</span>\n </div>\n <div class=\"content-body-default\">\n <div class=\"content-text\">\n {{ item[keyText] }}\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [".tl-timeline-scroll{overflow-y:auto;overflow-x:auto;padding:0 5px 0 20px}.ltr{direction:ltr}.rtl{direction:rtl}.tl-timeline-scroll::-webkit-scrollbar{width:8px}.ui-timeline-content{margin:0 10px 0 20px}.content-head-default{width:100%;padding:5px 10px;border-top-left-radius:6px;border-top-right-radius:6px}.content-head-default .content-title{font-size:14px;font-weight:700}.content-body-default{border-top:none;border-bottom-left-radius:6px;border-bottom-right-radius:6px}.content-body-default .content-text{padding:5px 10px;font-size:12px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{ type: Input, args: ['data'] }], clearOnUpdateData: [{ type: Input }], align: [{ type: Input }], height: [{ type: Input }], keyTitle: [{ type: Input }], keyText: [{ type: Input }], keyDate: [{ type: Input }], rowsPage: [{ type: Input }], mode: [{ type: Input }], color: [{ type: Input }], enableUnequalChildrenSizes: [{ type: Input }], bufferAmount: [{ type: Input }], lazyLoad: [{ type: Output }], listComponent: [{ type: ViewChild, args: ['listComponent', { static: true }] }], customTemplate: [{ type: ContentChild, args: [TemplateRef, { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy90aW1lbGluZS90aW1lbGluZS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3RpbWVsaW5lL3RpbWVsaW5lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBb0JFO0FBRUYsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBRVosS0FBSyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUXZCLE1BQU0sT0FBTyxVQUFVO0lBd0NyQixZQUFtQixNQUF5QjtRQUF6QixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQXRDN0IsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVoQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFMUIsVUFBSyxHQUFHLE1BQU0sQ0FBQztRQUVmLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFakIsYUFBUSxHQUFHLE9BQU8sQ0FBQztRQUVuQixZQUFPLEdBQUcsTUFBTSxDQUFDO1FBRWpCLFlBQU8sR0FBRyxNQUFNLENBQUM7UUFFakIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVkLFNBQUksR0FBRyxPQUFPLENBQUM7UUFFZixVQUFLLEdBQUcsU0FBUyxDQUFDO1FBRWxCLCtCQUEwQixHQUFHLElBQUksQ0FBQztRQUVsQyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVoQixhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFNcEQsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUVaLFNBQUksR0FBRyxDQUFDLENBQUM7UUFFVCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4QixpQkFBWSxHQUFHLEtBQUssQ0FBQztJQUVtQixDQUFDO0lBRWhELFFBQVEsS0FBSSxDQUFDO0lBRWIsTUFBTSxDQUFDLFFBQXdCLEVBQUUsSUFBSSxFQUFFLEtBQUs7UUFDMUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRztZQUMxQixJQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztTQUNyQztRQUVELElBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRztZQUN0RCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1NBQ3JDO1FBRUQsSUFBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFHO1lBQ3hELE9BQU8sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRztZQUN0RCxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFHO2dCQUFFLE9BQU87YUFBRTtZQUMzRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBRSxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQzs7MkhBN0VVLFVBQVU7K0dBQVYsVUFBVSxnYkE4QlAsV0FBVyxpTkN2RTNCLG94Q0F5QkE7NEZEZ0JhLFVBQVU7a0JBTHRCLFNBQVM7K0JBQ0UsYUFBYTt3R0FNUixJQUFJO3NCQUFsQixLQUFLO3VCQUFDLE1BQU07Z0JBRUosaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUVxQyxhQUFhO3NCQUF4RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRUMsY0FBYztzQkFBeEQsWUFBWTt1QkFBQyxXQUFXLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBNSVQgTGljZW5zZVxuXG4gICAgQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICAgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAgICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAgICBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICAgIFNPRlRXQVJFLlxuKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3RvclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VGxUaW1lbGluZUl0ZW19IGZyb20gJy4vcGFydHMvdGltZWxpbmUtaXRlbS90aW1lbGluZS1pdGVtJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGwtdGltZWxpbmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZWxpbmUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpbWVsaW5lLnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGxUaW1lbGluZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoJ2RhdGEnKSBkYXRhID0gW107XG5cbiAgQElucHV0KCkgY2xlYXJPblVwZGF0ZURhdGEgPSBmYWxzZTtcblxuICBASW5wdXQoKSBhbGlnbiA9ICdsZWZ0JztcblxuICBASW5wdXQoKSBoZWlnaHQgPSAnNDAwcHgnO1xuXG4gIEBJbnB1dCgpIGtleVRpdGxlID0gJ3RpdGxlJztcblxuICBASW5wdXQoKSBrZXlUZXh0ID0gJ3RleHQnO1xuXG4gIEBJbnB1dCgpIGtleURhdGUgPSAnZGF0ZSc7XG5cbiAgQElucHV0KCkgcm93c1BhZ2UgPSAyMDtcblxuICBASW5wdXQoKSBtb2RlID0gJ2Jhc2ljJztcblxuICBASW5wdXQoKSBjb2xvciA9ICdwcmltYXJ5JztcblxuICBASW5wdXQoKSBlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcyA9IHRydWU7XG5cbiAgQElucHV0KCkgYnVmZmVyQW1vdW50ID0gNTtcblxuICBAT3V0cHV0KCkgbGF6eUxvYWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2xpc3RDb21wb25lbnQnLCB7c3RhdGljOiB0cnVlfSkgbGlzdENvbXBvbmVudDogRWxlbWVudFJlZjtcblxuICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmLCB7c3RhdGljOiB0cnVlfSkgY3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgcHVibGljIGJ1ZmZlciA9IFtdO1xuXG4gIHB1YmxpYyBza2lwID0gMDtcblxuICBwdWJsaWMgbG9hZGluZ01vcmVEYXRhID0gZmFsc2U7XG5cbiAgcHVibGljIG5vdGhpbmdGb3VuZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjaGFuZ2U6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge31cblxuICBvbkluaXQobGluZUl0ZW06IFRsVGltZWxpbmVJdGVtLCBpdGVtLCBpbmRleCkge1xuICAgIGxpbmVJdGVtLnNldFRlbXBsYXRlVmlldyhpdGVtLCBpbmRleCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9yZURhdGEgPSBmYWxzZTtcbiAgICBpZiAoIHRoaXMuZGF0YS5sZW5ndGggPiAwICkge1xuICAgICAgaWYgKCB0aGlzLmNsZWFyT25VcGRhdGVEYXRhICkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuY29uY2F0KHRoaXMuZGF0YSk7XG4gICAgICB9XG4gICAgICB0aGlzLm5vdGhpbmdGb3VuZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ01vcmVEYXRhID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCB0aGlzLmRhdGEubGVuZ3RoID09PSAwICYmIHRoaXMuYnVmZmVyLmxlbmd0aCA+IDAgKSB7XG4gICAgICB0aGlzLm5vdGhpbmdGb3VuZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ01vcmVEYXRhID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCB0aGlzLmRhdGEubGVuZ3RoID09PSAwICYmIHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGhpbmdGb3VuZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZmV0Y2hNb3JlKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmdNb3JlRGF0YSAmJiB0aGlzLm1vZGUgPT09ICdpbmZpbml0ZScpICB7XG4gICAgICBpZiAoZXZlbnQuZW5kSW5kZXggIT09IHRoaXMuYnVmZmVyLmxlbmd0aCAtIDEgKSB7IHJldHVybjsgfVxuICAgICAgdGhpcy5sb2FkaW5nTW9yZURhdGEgPSB0cnVlO1xuICAgICAgdGhpcy5za2lwID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgdGhpcy5sYXp5TG9hZC5lbWl0KCB7IHNraXA6IHRoaXMuc2tpcCwgbGltaXQ6IHRoaXMucm93c1BhZ2UgfSApO1xuICAgIH1cbiAgfVxuXG5cbn1cbiIsIjxkaXYgW3RsQmxvY2t1aV09XCJsb2FkaW5nTW9yZURhdGFcIiBbY2xhc3NdPVwiJ3RsLXRpbWVsaW5lICcgKyBjb2xvclwiPlxuICA8dmlydHVhbC1zY3JvbGxlciAjc2Nyb2xsIFtpdGVtc109XCJidWZmZXJcIiBbZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNdPVwiZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNcIiBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudFwiIFtjaGVja1Jlc2l6ZUludGVydmFsXT1cIjMwMFwiICh2c0VuZCk9XCJmZXRjaE1vcmUoJGV2ZW50KVwiIGNsYXNzPVwidGwtdGltZWxpbmUtc2Nyb2xsXCIgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIj5cbiAgICA8dGwtdGltZWxpbmUtaXRlbSAjbGluZVxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjcm9sbC52aWV3UG9ydEl0ZW1zOyBsZXQgaSA9IGluZGV4OyBsZXQgZXZlbiA9IGV2ZW5cIlxuICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwic2tpcCArIGlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkYXRlXT1cIml0ZW1ba2V5RGF0ZV1cIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCIoY3VzdG9tVGVtcGxhdGUpID8gY3VzdG9tVGVtcGxhdGUgOiBiYXNpY1RlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbGl6ZSk9XCJvbkluaXQobGluZSwgaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFthbGlnbl09XCJhbGlnblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NpZGVdPVwiZXZlblwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKGFsaWduID09PSAncmlnaHQnKSA/ICdsdHInIDogbnVsbFwiPlxuICAgIDwvdGwtdGltZWxpbmUtaXRlbT5cbiAgPC92aXJ0dWFsLXNjcm9sbGVyPlxuICA8bmctdGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWluZGV4PVwiaW5kZXhcIiAjYmFzaWNUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1oZWFkLWRlZmF1bHRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY29udGVudC10aXRsZVwiPnt7IGl0ZW1ba2V5VGl0bGVdIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWJvZHktZGVmYXVsdFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtdGV4dFwiPlxuICAgICAgICB7eyBpdGVtW2tleVRleHRdIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19