UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

306 lines 41.1 kB
import * as tslib_1 from "tslib"; var CalendarComponent_1; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Output, EventEmitter, ChangeDetectorRef, ElementRef, ViewChild, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Keys } from '@true-directive/base'; import { Dates } from '@true-directive/base'; import { InternationalizationService } from '../internationalization/internationalization.service'; /** * Calendar component. */ let CalendarComponent = CalendarComponent_1 = class CalendarComponent { constructor(intl, cd, el) { this.intl = intl; this.cd = cd; this.el = el; this.onChange = (_) => { }; this.onTouched = () => { }; this._value = null; this.mode = 'days'; this.dateClick = new EventEmitter(); this.escape = new EventEmitter(); // Day names this.dayNames = []; // Month weeks this.weeks = []; // Year months this.monthRows = []; // Matrix of displayed years this.yearRows = []; this._minYear = 0; this._maxYear = 0; } get value() { return this._value; } set value(v) { if (v !== this._value) { this._value = v; this.createWeeks(this._value); this.onChange(v); } } get valueTime() { let vTime = 0; if (this.value !== null && !isNaN(this.value.getTime())) { vTime = this.value.getTime(); } return vTime; } get monthYear() { const m = this.calendarDateStart.getMonth(); const y = this.calendarDateStart.getFullYear(); if (this.mode === 'days') { return this.intl.locale.longMonthNames[m] + ' ' + y; } if (this.mode === 'months') { return y; } if (this.mode === 'years') { return this._minYear + ' - ' + this._maxYear; } } get today() { return Dates.today(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } blur() { this.onTouched(); } // Отображаем значение в компоненте. Formatter: Ctrl --> View writeValue(value) { if (this.value !== value) { this.value = value; } } setFocus() { this.days.nativeElement.focus(); } isCurrentMonth(d) { return Dates.dateBetween(d, this.calendarDateStart, this.calendarDateEnd); } go(qty) { if (this.mode === 'days') { let newDate; if (qty > 0) { newDate = Dates.firstDateOfNextMonth(this.calendarDateStart); } else { newDate = Dates.firstDateOfPrevMonth(this.calendarDateStart); } this.createWeeks(newDate); } if (this.mode === 'months') { this.calendarDateStart = new Date(this.calendarDateStart.getFullYear() + qty, 0, 1); this.createMonths(); } if (this.mode === 'years') { this.calendarDateStart = new Date(this.calendarDateStart.getFullYear() + 24 * qty, 0, 1); this.createYears(); } } toggleMode() { if (this.mode === 'years') { this.mode = 'days'; this.createWeeks(this.calendarDateStart); } else { if (this.mode === 'months') { this.mode = 'years'; this.createYears(); } else { if (this.mode === 'days') { this.mode = 'months'; this.createMonths(); } } } this.setMode(); } setMode() { this.el.nativeElement.classList.remove('true-mode-days'); this.el.nativeElement.classList.remove('true-mode-months'); this.el.nativeElement.classList.remove('true-mode-years'); this.el.nativeElement.classList.add('true-mode-' + this.mode); } mousedown(e) { e.stopPropagation(); } calendarDateClick(e, d) { if (this.mode === 'days') { this.value = new Date(d); this.dateClick.emit(d); } if (this.mode === 'months') { this.mode = 'days'; this.createWeeks(new Date(d)); } if (this.mode === 'years') { this.calendarDateStart = new Date(d); this.mode = 'months'; this.createMonths(); } this.setMode(); e.preventDefault(); e.stopPropagation(); } // List of dates in selected month createDayNames() { this.dayNames = []; const weekStart = Dates.firstDateOfWeek(Dates.today(), this.intl.locale.firstDayOfWeek); const weekEnd = Dates.lastDateOfWeek(weekStart, this.intl.locale.firstDayOfWeek); for (let d = new Date(weekStart); d.getTime() <= weekEnd.getTime(); d = Dates.nextDate(d)) { const wd = d.getDay(); const dayName = this.intl.locale.shortDayNames[wd]; this.dayNames.push(dayName); } } // List of months to show in months-mode createMonths() { const yy = this.calendarDateStart.getFullYear(); const currentMonthStart = Dates.firstDateOfMonth(Dates.today()); let k = -3; this.monthRows = []; for (let i = 0; i < 6; i++) { let monthRow = []; for (let j = 0; j < 3; j++) { // Month start const dd = new Date(yy, k, 1); monthRow.push({ name: this.intl.locale.shortMonthNames[dd.getMonth()] + ' ' + Dates.yearTwoDigits(dd), date: dd, selected: Dates.isSameMonth(dd, this.value), today: dd.getTime() === currentMonthStart.getTime(), current: Dates.isSameYear(dd, this.calendarDateStart) }); k++; } this.monthRows.push(monthRow); } } // List of dates in selected month createYears() { const yy = this.calendarDateStart.getFullYear(); const currentYearStart = new Date(Dates.today().getFullYear(), 0, 1); const calendarYearStart = new Date(this.calendarDateStart.getFullYear(), 0, 1); this._minYear = yy - 11; let k = this._minYear; this.yearRows = []; for (let i = 0; i < 6; i++) { let yearRow = []; for (let j = 0; j < 4; j++) { const dd = new Date(k, 0, 1); yearRow.push({ name: k + '', date: dd, selected: Dates.isSameYear(dd, this.value), today: dd.getTime() === currentYearStart.getTime(), current: true }); k++; } this.yearRows.push(yearRow); } this._maxYear = k - 1; } createWeeks(date) { if (date === null || isNaN(date.getTime())) { date = Dates.today(); } const firstDayOfWeek = this.intl.locale.firstDayOfWeek; const monthStart = Dates.firstDateOfMonth(date); const monthEnd = Dates.lastDateOfMonth(date); if (this.weeks.length > 0 && this.calendarDateStart !== undefined && this.calendarDateStart.getTime() === monthStart.getTime() && this.calendarDateEnd !== undefined && this.calendarDateEnd.getTime() === monthEnd.getTime()) { return; } this.weeks = []; this.calendarDateStart = monthStart; this.calendarDateEnd = monthEnd; const calendarStart = Dates.firstDateOfWeek(monthStart, firstDayOfWeek); // Iterating weeks of month let weekStart = new Date(calendarStart); let wCounter = 0; while (wCounter < 6) { let week = []; let weekEnd = Dates.lastDateOfWeek(weekStart, firstDayOfWeek); // Iterating days of week for (let d = new Date(weekStart); d.getTime() <= weekEnd.getTime(); d = Dates.nextDate(d)) { week.push(d); } this.weeks.push(week); // Next week weekStart = Dates.nextDate(weekEnd); wCounter++; } } daysKeyDown(e) { let dd = 0; if (e.keyCode === Keys.LEFT) { dd = -1; } if (e.keyCode === Keys.UP) { dd = -7; } if (e.keyCode === Keys.RIGHT) { dd = 1; } if (e.keyCode === Keys.DOWN) { dd = 7; } if (e.keyCode === Keys.ENTER) { this.dateClick.emit(this.value); e.stopPropagation(); } if (e.keyCode === Keys.ESCAPE) { this.escape.emit(this.value); e.stopPropagation(); } if (dd !== 0) { this.value = Dates.addDays(this.value === null ? Dates.today() : this.value, dd); e.stopPropagation(); } } ngOnInit() { this.createDayNames(); this.createWeeks(Dates.today()); } }; tslib_1.__decorate([ ViewChild('days', { static: true }), tslib_1.__metadata("design:type", Object) ], CalendarComponent.prototype, "days", void 0); tslib_1.__decorate([ Output('dateClick'), tslib_1.__metadata("design:type", EventEmitter) ], CalendarComponent.prototype, "dateClick", void 0); tslib_1.__decorate([ Output('escape'), tslib_1.__metadata("design:type", EventEmitter) ], CalendarComponent.prototype, "escape", void 0); CalendarComponent = CalendarComponent_1 = tslib_1.__decorate([ Component({ selector: 'true-calendar', template: "<!-- Buttons -->\r\n<div class=\"true-calendar__controls\">\r\n <div>\r\n <button class=\"true-button\" (click)=\"toggleMode()\" ><b>{{monthYear}}</b></button>\r\n </div>\r\n <div>\r\n <button class=\"true-button prev\" (click)=\"go(-1)\"><span class=\"true-icon-left-open\"></span></button>\r\n <button class=\"true-button next\" (click)=\"go(1)\"><span class=\"true-icon-right-open\"></span></button>\r\n </div>\r\n</div>\r\n\r\n<!-- Day names in header -->\r\n<table class=\"true-day-names\">\r\n <colGroup>\r\n <col *ngFor=\"let d of dayNames\" />\r\n </colGroup>\r\n <thead>\r\n <tr>\r\n <td *ngFor=\"let d of dayNames\" [class.true-transparent]=\"mode!='days'\">{{d}}</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr><td colspan=\"7\"></td></tr>\r\n </tbody>\r\n</table>\r\n\r\n<!-- Month days -->\r\n<table #days class=\"true-days\" tabindex=\"1\" (keydown)=\"daysKeyDown($event)\">\r\n <colGroup>\r\n <col *ngFor=\"let d of dayNames\" />\r\n </colGroup>\r\n <tbody>\r\n <tr *ngFor=\"let w of weeks\">\r\n <td *ngFor=\"let d of w\"\r\n (click)=\"calendarDateClick($event, d)\"\r\n [class.true-selected]=\"d.getTime() === valueTime\"\r\n [class.true-today]=\"d.getTime() === today.getTime()\"\r\n [class.true-current]=\"isCurrentMonth(d)\">{{d.getDate()}}</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n<!-- Months -->\r\n<table class=\"true-months\">\r\n <colGroup>\r\n <col *ngFor=\"let r of monthRows[0]\" />\r\n </colGroup>\r\n <tbody>\r\n <tr *ngFor=\"let r of monthRows\">\r\n <td *ngFor=\"let m of r\"\r\n (click)=\"calendarDateClick($event, m.date)\"\r\n [class.true-transparent]=\"m.hide\"\r\n [class.true-selected]=\"m.selected\"\r\n [class.true-today]=\"m.today\"\r\n [class.true-current]=\"m.current\">{{m.name}}</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n<!-- Years -->\r\n<table class=\"true-years\">\r\n <colGroup>\r\n <col *ngFor=\"let r of yearRows[0]\" />\r\n </colGroup>\r\n <tbody>\r\n <tr *ngFor=\"let r of yearRows\">\r\n <td *ngFor=\"let y of r\"\r\n (click)=\"calendarDateClick($event, y.date)\"\r\n [class.true-selected]=\"y.selected\"\r\n [class.true-today]=\"y.today\"\r\n [class.true-current]=\"1==1\">{{y.name}}</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n", host: { 'class': 'true-calendar true-mode-days', '(mousedown)': 'mousedown($event)', '(touchend)': '$event.stopPropagation()' }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CalendarComponent_1), multi: true }], styles: [":host>table{table-layout:fixed;border-collapse:separate}:host>table:focus{outline:0}:host table.true-days,:host table.true-months,:host table.true-years{display:none}:host.true-mode-days table.true-days,:host.true-mode-months table.true-months,:host.true-mode-years table.true-years{display:table}.true-calendar__controls{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-pack:justify;justify-content:space-between}.true-calendar__controls div:last-child{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}"] }), tslib_1.__metadata("design:paramtypes", [InternationalizationService, ChangeDetectorRef, ElementRef]) ], CalendarComponent); export { CalendarComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvY29udHJvbHMvY2FsZW5kYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQVMsTUFBTSxFQUFlLFlBQVksRUFBRSxpQkFBaUIsRUFDdEUsVUFBVSxFQUFnQixTQUFTLEVBQ1YsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBRW5HOztHQUVHO0FBZ0JILElBQWEsaUJBQWlCLHlCQUE5QixNQUFhLGlCQUFpQjtJQWdWNUIsWUFDVSxJQUFpQyxFQUNqQyxFQUFxQixFQUNyQixFQUFjO1FBRmQsU0FBSSxHQUFKLElBQUksQ0FBNkI7UUFDakMsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDckIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQWpWaEIsYUFBUSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUVyQixXQUFNLEdBQVEsSUFBSSxDQUFDO1FBRXBCLFNBQUksR0FBZ0MsTUFBTSxDQUFDO1FBTWxELGNBQVMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUd2RCxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFtSnBELFlBQVk7UUFDWixhQUFRLEdBQWtCLEVBQUUsQ0FBQztRQUU3QixjQUFjO1FBQ2QsVUFB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QUFFO1lBQ0osT0FBTyxFQUFFLDhCQUE4QjtZQUN2QyxhQUFhLEVBQUUsbUJBQW1CO1lBQ2xDLFlBQVksRUFBRSwwQkFBMEI7U0FDekM7UUFDRCxTQUFTLEVBQUUsQ0FBQztnQkFDUixPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFpQixDQUFDO2dCQUNoRCxLQUFLLEVBQUUsSUFBSTthQUNaLENBQUM7O0tBQ0gsQ0FBQzs2Q0FrVmMsMkJBQTJCO1FBQzdCLGlCQUFpQjtRQUNqQixVQUFVO0dBblZiLGlCQUFpQixDQXFWN0I7U0FyVlksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFZpZXdDaGlsZCxcclxuICAgICAgICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgS2V5cyB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgRGF0ZXMgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEludGVybmF0aW9uYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL2ludGVybmF0aW9uYWxpemF0aW9uL2ludGVybmF0aW9uYWxpemF0aW9uLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENhbGVuZGFyIGNvbXBvbmVudC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGhvc3Q6IHtcclxuICAgICdjbGFzcyc6ICd0cnVlLWNhbGVuZGFyIHRydWUtbW9kZS1kYXlzJyxcclxuICAgICcobW91c2Vkb3duKSc6ICdtb3VzZWRvd24oJGV2ZW50KScsXHJcbiAgICAnKHRvdWNoZW5kKSc6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCknXHJcbiAgfSxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDYWxlbmRhckNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcblxyXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgbW9kZTogJ2RheXMnIHwgJ21vbnRocycgfCAneWVhcnMnID0gJ2RheXMnO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXlzJywge3N0YXRpYzogdHJ1ZX0pXHJcbiAgZGF5czogYW55O1xyXG5cclxuICBAT3V0cHV0KCdkYXRlQ2xpY2snKVxyXG4gIGRhdGVDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgnZXNjYXBlJylcclxuICBlc2NhcGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgY2FsZW5kYXJEYXRlU3RhcnQ6IGFueTtcclxuICBwcml2YXRlIGNhbGVuZGFyRGF0ZUVuZDogYW55O1xyXG5cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLmNyZWF0ZVdlZWtzKHRoaXMuX3ZhbHVlKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZVRpbWUoKTogbnVtYmVyIHtcclxuICAgIGxldCB2VGltZSA9IDA7XHJcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gbnVsbCAmJiAhaXNOYU4odGhpcy52YWx1ZS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgIHZUaW1lID0gdGhpcy52YWx1ZS5nZXRUaW1lKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdlRpbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbW9udGhZZWFyKCkge1xyXG5cclxuICAgIGNvbnN0IG0gPSB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0LmdldE1vbnRoKCk7XHJcbiAgICBjb25zdCB5ID0gdGhpcy5jYWxlbmRhckRhdGVTdGFydC5nZXRGdWxsWWVhcigpO1xyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkYXlzJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnRsLmxvY2FsZS5sb25nTW9udGhOYW1lc1ttXSArICcgJyArIHk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRocycpIHtcclxuICAgICAgcmV0dXJuIHk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuIG1vZGUgPT09ICd5ZWFycycpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21pblllYXIgKyAnIC0gJyArIHRoaXMuX21heFllYXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdG9kYXkoKSB7XHJcbiAgICByZXR1cm4gRGF0ZXMudG9kYXkoKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxyXG5cclxuICBibHVyKCkge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8vINCe0YLQvtCx0YDQsNC20LDQtdC8INC30L3QsNGH0LXQvdC40LUg0LIg0LrQvtC80L/QvtC90LXQvdGC0LUuIEZvcm1hdHRlcjogQ3RybCAtLT4gVmlld1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEZvY3VzKCkge1xyXG4gICAgdGhpcy5kYXlzLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIGlzQ3VycmVudE1vbnRoKGQ6IGFueSkge1xyXG4gICAgcmV0dXJuIERhdGVzLmRhdGVCZXR3ZWVuKGQsIHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQsIHRoaXMuY2FsZW5kYXJEYXRlRW5kKTtcclxuICB9XHJcblxyXG4gIGdvKHF0eTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGF5cycpIHtcclxuICAgICAgbGV0IG5ld0RhdGU7XHJcbiAgICAgIGlmIChxdHkgPiAwICkge1xyXG4gICAgICAgIG5ld0RhdGUgPSBEYXRlcy5maXJzdERhdGVPZk5leHRNb250aCh0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdEYXRlID0gRGF0ZXMuZmlyc3REYXRlT2ZQcmV2TW9udGgodGhpcy5jYWxlbmRhckRhdGVTdGFydCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY3JlYXRlV2Vla3MobmV3RGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRocycpIHtcclxuICAgICAgdGhpcy5jYWxlbmRhckRhdGVTdGFydCA9IG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQuZ2V0RnVsbFllYXIoKSArIHF0eSwgMCwgMSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlTW9udGhzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3llYXJzJykge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0ID0gbmV3IERhdGUodGhpcy5jYWxlbmRhckRhdGVTdGFydC5nZXRGdWxsWWVhcigpICsgMjQgKiBxdHksIDAsIDEpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVllYXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNb2RlKCkge1xyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICd5ZWFycycpIHtcclxuICAgICAgdGhpcy5tb2RlID0gJ2RheXMnO1xyXG4gICAgICB0aGlzLmNyZWF0ZVdlZWtzKHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRocycpIHtcclxuICAgICAgICB0aGlzLm1vZGUgPSAneWVhcnMnO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlWWVhcnMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnZGF5cycpIHtcclxuICAgICAgICAgIHRoaXMubW9kZSA9ICdtb250aHMnO1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNb250aHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldE1vZGUoKTtcclxuICB9XHJcblxyXG4gIHNldE1vZGUoKSB7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndHJ1ZS1tb2RlLWRheXMnKTtcclxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0cnVlLW1vZGUtbW9udGhzJyk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndHJ1ZS1tb2RlLXllYXJzJyk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHJ1ZS1tb2RlLScgKyB0aGlzLm1vZGUpO1xyXG4gIH1cclxuXHJcbiAgbW91c2Vkb3duKGU6IGFueSkge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGNhbGVuZGFyRGF0ZUNsaWNrKGU6IGFueSwgZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGF5cycpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IG5ldyBEYXRlKGQpO1xyXG4gICAgICB0aGlzLmRhdGVDbGljay5lbWl0KGQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aHMnKSB7XHJcbiAgICAgIHRoaXMubW9kZSA9ICdkYXlzJztcclxuICAgICAgdGhpcy5jcmVhdGVXZWVrcyhuZXcgRGF0ZShkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3llYXJzJykge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0ID0gbmV3IERhdGUoZCk7XHJcbiAgICAgIHRoaXMubW9kZSA9ICdtb250aHMnO1xyXG4gICAgICB0aGlzLmNyZWF0ZU1vbnRocygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0TW9kZSgpO1xyXG5cclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLyBEYXkgbmFtZXNcclxuICBkYXlOYW1lczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAvLyBNb250aCB3ZWVrc1xyXG4gIHdlZWtzOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gIC8vIFllYXIgbW9udGhzXHJcbiAgbW9udGhSb3dzOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gIC8vIE1hdHJpeCBvZiBkaXNwbGF5ZWQgeWVhcnNcclxuICB5ZWFyUm93czogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAvLyBMaXN0IG9mIGRhdGVzIGluIHNlbGVjdGVkIG1vbnRoXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXlOYW1lcygpIHtcclxuICAgIHRoaXMuZGF5TmFtZXMgPSBbXTtcclxuICAgIGNvbnN0IHdlZWtTdGFydCA9IERhdGVzLmZpcnN0RGF0ZU9mV2VlayhEYXRlcy50b2RheSgpLCB0aGlzLmludGwubG9jYWxlLmZpcnN0RGF5T2ZXZWVrKTtcclxuICAgIGNvbnN0IHdlZWtFbmQgPSBEYXRlcy5sYXN0RGF0ZU9mV2Vlayh3ZWVrU3RhcnQsIHRoaXMuaW50bC5sb2NhbGUuZmlyc3REYXlPZldlZWspO1xyXG5cclxuICAgIGZvciAobGV0IGQgPSBuZXcgRGF0ZSh3ZWVrU3RhcnQpOyBkLmdldFRpbWUoKSA8PSB3ZWVrRW5kLmdldFRpbWUoKTsgZCA9IERhdGVzLm5leHREYXRlKGQpKSB7XHJcbiAgICAgIGNvbnN0IHdkID0gZC5nZXREYXkoKTtcclxuICAgICAgY29uc3QgZGF5TmFtZSA9IHRoaXMuaW50bC5sb2NhbGUuc2hvcnREYXlOYW1lc1t3ZF07XHJcbiAgICAgIHRoaXMuZGF5TmFtZXMucHVzaChkYXlOYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIExpc3Qgb2YgbW9udGhzIHRvIHNob3cgaW4gbW9udGhzLW1vZGVcclxuICBwcml2YXRlIGNyZWF0ZU1vbnRocygpIHtcclxuXHJcbiAgICBjb25zdCB5eSA9IHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IGN1cnJlbnRNb250aFN0YXJ0ID0gRGF0ZXMuZmlyc3REYXRlT2ZNb250aChEYXRlcy50b2RheSgpKTtcclxuXHJcbiAgICBsZXQgayA9IC0zO1xyXG4gICAgdGhpcy5tb250aFJvd3MgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgIGxldCBtb250aFJvdyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xyXG5cclxuICAgICAgICAvLyBNb250aCBzdGFydFxyXG4gICAgICAgIGNvbnN0IGRkID0gbmV3IERhdGUoeXksIGssIDEpO1xyXG5cclxuICAgICAgICBtb250aFJvdy5wdXNoKFxyXG4gICAgICAgICAgeyBuYW1lOiB0aGlzLmludGwubG9jYWxlLnNob3J0TW9udGhOYW1lc1tkZC5nZXRNb250aCgpXSArICcgJyArIERhdGVzLnllYXJUd29EaWdpdHMoZGQpLFxyXG4gICAgICAgICAgICBkYXRlOiBkZCxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IERhdGVzLmlzU2FtZU1vbnRoKGRkLCB0aGlzLnZhbHVlKSxcclxuICAgICAgICAgICAgdG9kYXk6IGRkLmdldFRpbWUoKSA9PT0gY3VycmVudE1vbnRoU3RhcnQuZ2V0VGltZSgpLFxyXG4gICAgICAgICAgICBjdXJyZW50OiBEYXRlcy5pc1NhbWVZZWFyKGRkLCB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0KSB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBrKys7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb250aFJvd3MucHVzaChtb250aFJvdyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9taW5ZZWFyID0gMDtcclxuICBwcml2YXRlIF9tYXhZZWFyID0gMDtcclxuXHJcbiAgLy8gTGlzdCBvZiBkYXRlcyBpbiBzZWxlY3RlZCBtb250aFxyXG4gIHByaXZhdGUgY3JlYXRlWWVhcnMoKSB7XHJcblxyXG4gICAgY29uc3QgeXkgPSB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0LmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBjdXJyZW50WWVhclN0YXJ0ID0gbmV3IERhdGUoRGF0ZXMudG9kYXkoKS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcclxuICAgIGNvbnN0IGNhbGVuZGFyWWVhclN0YXJ0ID0gbmV3IERhdGUodGhpcy5jYWxlbmRhckRhdGVTdGFydC5nZXRGdWxsWWVhcigpLCAwLCAxKTtcclxuXHJcbiAgICB0aGlzLl9taW5ZZWFyID0geXkgLSAxMTtcclxuICAgIGxldCBrID0gdGhpcy5fbWluWWVhcjtcclxuXHJcbiAgICB0aGlzLnllYXJSb3dzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xyXG4gICAgICBsZXQgeWVhclJvdyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xyXG5cclxuICAgICAgICBjb25zdCBkZCA9IG5ldyBEYXRlKGssIDAsIDEpO1xyXG4gICAgICAgIHllYXJSb3cucHVzaChcclxuICAgICAgICAgIHsgbmFtZTogayArICcnLFxyXG4gICAgICAgICAgICBkYXRlOiBkZCxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IERhdGVzLmlzU2FtZVllYXIoZGQsIHRoaXMudmFsdWUpLFxyXG4gICAgICAgICAgICB0b2RheTogZGQuZ2V0VGltZSgpID09PSBjdXJyZW50WWVhclN0YXJ0LmdldFRpbWUoKSxcclxuICAgICAgICAgICAgY3VycmVudDogdHJ1ZSB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaysrO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMueWVhclJvd3MucHVzaCh5ZWFyUm93KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9tYXhZZWFyID0gayAtIDE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVdlZWtzKGRhdGU6IGFueSkge1xyXG5cclxuICAgIGlmIChkYXRlID09PSBudWxsIHx8IGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xyXG4gICAgICBkYXRlID0gRGF0ZXMudG9kYXkoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuaW50bC5sb2NhbGUuZmlyc3REYXlPZldlZWs7XHJcblxyXG4gICAgY29uc3QgbW9udGhTdGFydCA9IERhdGVzLmZpcnN0RGF0ZU9mTW9udGgoZGF0ZSk7XHJcbiAgICBjb25zdCBtb250aEVuZCA9IERhdGVzLmxhc3REYXRlT2ZNb250aChkYXRlKTtcclxuXHJcbiAgICBpZiAodGhpcy53ZWVrcy5sZW5ndGggPiAwXHJcbiAgICAgICYmIHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0LmdldFRpbWUoKSA9PT0gbW9udGhTdGFydC5nZXRUaW1lKClcclxuICAgICAgJiYgdGhpcy5jYWxlbmRhckRhdGVFbmQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNhbGVuZGFyRGF0ZUVuZC5nZXRUaW1lKCkgPT09IG1vbnRoRW5kLmdldFRpbWUoKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLndlZWtzID0gW107XHJcbiAgICB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0ID0gbW9udGhTdGFydDtcclxuICAgIHRoaXMuY2FsZW5kYXJEYXRlRW5kID0gbW9udGhFbmQ7XHJcblxyXG4gICAgY29uc3QgY2FsZW5kYXJTdGFydCA9IERhdGVzLmZpcnN0RGF0ZU9mV2Vlayhtb250aFN0YXJ0LCBmaXJzdERheU9mV2Vlayk7XHJcblxyXG4gICAgLy8gSXRlcmF0aW5nIHdlZWtzIG9mIG1vbnRoXHJcbiAgICBsZXQgd2Vla1N0YXJ0ID0gbmV3IERhdGUoY2FsZW5kYXJTdGFydCk7XHJcbiAgICBsZXQgd0NvdW50ZXIgPSAwO1xyXG4gICAgd2hpbGUgKHdDb3VudGVyIDwgNikge1xyXG5cclxuICAgICAgbGV0IHdlZWs6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgbGV0IHdlZWtFbmQgPSBEYXRlcy5sYXN0RGF0ZU9mV2Vlayh3ZWVrU3RhcnQsIGZpcnN0RGF5T2ZXZWVrKTtcclxuXHJcbiAgICAgIC8vIEl0ZXJhdGluZyBkYXlzIG9mIHdlZWtcclxuICAgICAgZm9yIChsZXQgZCA9IG5ldyBEYXRlKHdlZWtTdGFydCk7IGQuZ2V0VGltZSgpIDw9IHdlZWtFbmQuZ2V0VGltZSgpOyBkID0gRGF0ZXMubmV4dERhdGUoZCkpIHtcclxuICAgICAgICB3ZWVrLnB1c2goZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMud2Vla3MucHVzaCh3ZWVrKTtcclxuICAgICAgLy8gTmV4dCB3ZWVrXHJcbiAgICAgIHdlZWtTdGFydCA9IERhdGVzLm5leHREYXRlKHdlZWtFbmQpO1xyXG4gICAgICB3Q291bnRlcisrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF5c0tleURvd24oZTogYW55KSB7XHJcblxyXG4gICAgbGV0IGRkID0gMDtcclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkxFRlQpIHtcclxuICAgICAgZGQgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlVQKSB7XHJcbiAgICAgIGRkID0gLTc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5SSUdIVCkge1xyXG4gICAgICBkZCA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ET1dOKSB7XHJcbiAgICAgIGRkID0gNztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVOVEVSKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUNsaWNrLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpIHtcclxuICAgICAgdGhpcy5lc2NhcGUuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGQgIT09IDApIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IERhdGVzLmFkZERheXModGhpcy52YWx1ZSA9PT0gbnVsbCA/IERhdGVzLnRvZGF5KCkgOiB0aGlzLnZhbHVlLCBkZCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGF5TmFtZXMoKTtcclxuICAgIHRoaXMuY3JlYXRlV2Vla3MoRGF0ZXMudG9kYXkoKSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaW50bDogSW50ZXJuYXRpb25hbGl6YXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmXHJcbiAgKSB7IH1cclxufVxyXG4iXX0=