@nova-ui/bits
Version:
SolarWinds Nova Framework
131 lines • 35.4 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// 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, ViewEncapsulation } from "@angular/core";
import moment from "moment/moment";
import { DatePickerInnerComponent } from "./date-picker-inner.component";
import * as i0 from "@angular/core";
import * as i1 from "./date-picker-inner.component";
import * as i2 from "@angular/common";
import * as i3 from "../button/button.component";
/** @ignore */
export class DayPickerComponent {
constructor(datePicker) {
this.datePicker = datePicker;
this.labels = [];
this.rows = [];
this.weekNumbers = [];
/*
* TODO: Check the default value, Added variable
* to avoid build prod crash
*/
this.todayDate = moment().toString();
this.datePicker = datePicker;
}
ngOnInit() {
this.datePicker.stepDay = { months: 1 };
this.datePicker.setRefreshViewHandler(() => {
const picker = this.datePicker;
const value = picker.value && picker.value.isValid()
? picker.value.clone()
: moment();
const month = value.month();
const firstDateOfMonthDayOfWeek = value
.clone()
.set("date", 1)
.day();
const difference = picker.startingDay - firstDateOfMonthDayOfWeek;
const numDisplayedFromPreviousMonth = difference > 0 ? 7 - difference : -difference;
const firstDateOfMonth = numDisplayedFromPreviousMonth > 0
? value
.clone()
.set("date", -numDisplayedFromPreviousMonth + 1)
: value.clone().set("date", 1);
// 42 is the number of days on a six-week calendar
const _days = this.getDates(firstDateOfMonth, 42);
const days = [];
for (let i = 0; i < 42; i++) {
const handler = this.datePicker.handleTimezone
? moment.parseZone
: moment;
const _dateObject = picker.createDateObject(handler(_days[i].date), picker.formatDay);
_dateObject.secondary = _days[i].month !== month;
_dateObject.uid = picker.uniqueId + "-" + i;
_dateObject.isCellVisible = !(picker.onlyCurrentMonth && _dateObject.secondary);
days[i] = _dateObject;
}
this.labels = [];
for (let j = 0; j < 7; j++) {
this.labels[j] = {
abbr: picker.formatDate(days[j].date, picker.formatDayHeader),
full: picker.formatDate(days[j].date, "EEEE"),
};
}
this.title = picker.formatDate(value, picker.formatDayTitle);
this.rows = picker.split(days, 7).map((row) => ({
days: row,
isRowVisible: !(picker.onlyCurrentMonth &&
row[0].secondary &&
row[6].secondary),
}));
if (picker.showWeeks) {
const thursdayIndex = (4 + 7 - picker.startingDay) % 7;
const numWeeks = this.rows.length;
this.weekNumbers = [];
for (let curWeek = 0; curWeek < numWeeks; curWeek++) {
this.weekNumbers.push(moment(this.rows[curWeek].days[thursdayIndex].date).isoWeek());
}
}
}, "day");
this.datePicker.setCompareHandler((date1, date2) => {
const d1 = moment({
year: date1.year(),
month: date1.month(),
date: date1.date(),
});
const d2 = moment({
year: date2.year(),
month: date2.month(),
date: date2.date(),
});
return d1.valueOf() - d2.valueOf();
}, "day");
}
getDates(startDate, n) {
const dates = new Array(n);
let current = startDate.clone();
let i = 0;
while (i < n) {
dates[i++] = {
date: current.toISOString(this.datePicker.handleTimezone),
day: current.day(),
month: current.month(),
};
current = current.clone().date(current.date() + 1);
}
return dates;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DayPickerComponent, deps: [{ token: i1.DatePickerInnerComponent }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DayPickerComponent, selector: "nui-day-picker", ngImport: i0, template: "<table\n *ngIf=\"datePicker.datepickerMode === 'day'\"\n role=\"grid\"\n [attr.aria-labelledby]=\"datePicker.uniqueId + '-title'\"\n aria-activedescendant=\"activeDateId\"\n>\n <thead>\n <tr>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-left\"\n (click)=\"datePicker.move(-1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n <th [attr.colspan]=\"5 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n [id]=\"datePicker.uniqueId + '-title'\"\n displayStyle=\"action\"\n [disabled]=\"\n datePicker.datepickerMode === datePicker.maxMode\n \"\n class=\"change-mode-button\"\n [ngClass]=\"{\n disabled:\n datePicker.datepickerMode === datePicker.maxMode\n }\"\n (click)=\"datePicker.toggleMode($event)\"\n tabindex=\"-1\"\n >\n <span>{{ title }}</span>\n </button>\n </th>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-right\"\n (click)=\"datePicker.move(1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n </tr>\n <tr>\n <th *ngIf=\"datePicker.showWeeks\"></th>\n <th *ngFor=\"let label of labels\" class=\"text-center\">\n <div class=\"day-label\">\n <span aria-label=\"label.full\">{{ label.abbr }}</span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-template\n ngFor\n [ngForOf]=\"rows\"\n let-row=\"$implicit\"\n let-index=\"index\"\n >\n <tr *ngIf=\"row.isRowVisible\">\n <td *ngIf=\"datePicker.showWeeks\" class=\"h6 text-center\">\n <em>{{ weekNumbers[index] }}</em>\n </td>\n <td\n *ngFor=\"let cell of row.days\"\n class=\"text-center day\"\n [id]=\"cell.uid\"\n >\n <button\n *ngIf=\"cell.isCellVisible\"\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n [ngClass]=\"{\n selected: cell.selected,\n disabled: cell.disabled\n }\"\n [disabled]=\"cell.disabled\"\n (click)=\"datePicker.select(cell.date, $event)\"\n tabindex=\"-1\"\n >\n <span\n [ngClass]=\"{\n 'text-muted': cell.secondary,\n 'text-info': cell.current,\n today: cell.today\n }\"\n >{{ cell.label }}</span\n >\n </button>\n </td>\n </tr>\n </ng-template>\n <tr>\n <td [attr.colspan]=\"7 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n class=\"today-button\"\n displayStyle=\"action\"\n [disabled]=\"datePicker.isTodayButtonDisabled\"\n (click)=\"datePicker.select(todayDate, $event)\"\n i18n\n >\n Today\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DayPickerComponent, decorators: [{
type: Component,
args: [{ selector: "nui-day-picker", encapsulation: ViewEncapsulation.None, template: "<table\n *ngIf=\"datePicker.datepickerMode === 'day'\"\n role=\"grid\"\n [attr.aria-labelledby]=\"datePicker.uniqueId + '-title'\"\n aria-activedescendant=\"activeDateId\"\n>\n <thead>\n <tr>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-left\"\n (click)=\"datePicker.move(-1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n <th [attr.colspan]=\"5 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n [id]=\"datePicker.uniqueId + '-title'\"\n displayStyle=\"action\"\n [disabled]=\"\n datePicker.datepickerMode === datePicker.maxMode\n \"\n class=\"change-mode-button\"\n [ngClass]=\"{\n disabled:\n datePicker.datepickerMode === datePicker.maxMode\n }\"\n (click)=\"datePicker.toggleMode($event)\"\n tabindex=\"-1\"\n >\n <span>{{ title }}</span>\n </button>\n </th>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-right\"\n (click)=\"datePicker.move(1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n </tr>\n <tr>\n <th *ngIf=\"datePicker.showWeeks\"></th>\n <th *ngFor=\"let label of labels\" class=\"text-center\">\n <div class=\"day-label\">\n <span aria-label=\"label.full\">{{ label.abbr }}</span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-template\n ngFor\n [ngForOf]=\"rows\"\n let-row=\"$implicit\"\n let-index=\"index\"\n >\n <tr *ngIf=\"row.isRowVisible\">\n <td *ngIf=\"datePicker.showWeeks\" class=\"h6 text-center\">\n <em>{{ weekNumbers[index] }}</em>\n </td>\n <td\n *ngFor=\"let cell of row.days\"\n class=\"text-center day\"\n [id]=\"cell.uid\"\n >\n <button\n *ngIf=\"cell.isCellVisible\"\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n [ngClass]=\"{\n selected: cell.selected,\n disabled: cell.disabled\n }\"\n [disabled]=\"cell.disabled\"\n (click)=\"datePicker.select(cell.date, $event)\"\n tabindex=\"-1\"\n >\n <span\n [ngClass]=\"{\n 'text-muted': cell.secondary,\n 'text-info': cell.current,\n today: cell.today\n }\"\n >{{ cell.label }}</span\n >\n </button>\n </td>\n </tr>\n </ng-template>\n <tr>\n <td [attr.colspan]=\"7 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n class=\"today-button\"\n displayStyle=\"action\"\n [disabled]=\"datePicker.isTodayButtonDisabled\"\n (click)=\"datePicker.select(todayDate, $event)\"\n i18n\n >\n Today\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n" }]
}], ctorParameters: () => [{ type: i1.DatePickerInnerComponent }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItZGF5LXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLWRheS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2xpYi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci1kYXktcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsU0FBUyxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sTUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7O0FBRXpFLGNBQWM7QUFNZCxNQUFNLE9BQU8sa0JBQWtCO0lBWTNCLFlBQW1CLFVBQW9DO1FBQXBDLGVBQVUsR0FBVixVQUFVLENBQTBCO1FBWGhELFdBQU0sR0FBVSxFQUFFLENBQUM7UUFFbkIsU0FBSSxHQUFVLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUVsQzs7O1dBR0c7UUFDSSxjQUFTLEdBQVcsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFHM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztJQUVNLFFBQVE7UUFDWCxJ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QU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7K0dBdklRLGtCQUFrQjttR0FBbEIsa0JBQWtCLHNEQy9CL0Isd29JQW9IQTs7NEZEckZhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDSSxnQkFBZ0IsaUJBRVgsaUJBQWlCLENBQUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IG1vbWVudCwgeyBNb21lbnQgfSBmcm9tIFwibW9tZW50L21vbWVudFwiO1xuXG5pbXBvcnQgeyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgfSBmcm9tIFwiLi9kYXRlLXBpY2tlci1pbm5lci5jb21wb25lbnRcIjtcblxuLyoqIEBpZ25vcmUgKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS1kYXktcGlja2VyXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9kYXRlLXBpY2tlci1kYXktcGlja2VyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRGF5UGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwdWJsaWMgbGFiZWxzOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyByb3dzOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyB3ZWVrTnVtYmVyczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8qXG4gICAgICogIFRPRE86IENoZWNrIHRoZSBkZWZhdWx0IHZhbHVlLCBBZGRlZCB2YXJpYWJsZVxuICAgICAqICB0byBhdm9pZCBidWlsZCBwcm9kIGNyYXNoXG4gICAgICovXG4gICAgcHVibGljIHRvZGF5RGF0ZTogc3RyaW5nID0gbW9tZW50KCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5kYXRlUGlja2VyID0gZGF0ZVBpY2tlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlci5zdGVwRGF5ID0geyBtb250aHM6IDEgfTtcblxuICAgICAgICB0aGlzLmRhdGVQaWNrZXIuc2V0UmVmcmVzaFZpZXdIYW5kbGVyKCgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBpY2tlciA9IHRoaXMuZGF0ZVBpY2tlcjtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgICAgICAgICBwaWNrZXIudmFsdWUgJiYgcGlja2VyLnZhbHVlLmlzVmFsaWQoKVxuICAgICAgICAgICAgICAgICAgICA/IHBpY2tlci52YWx1ZS5jbG9uZSgpXG4gICAgICAgICAgICAgICAgICAgIDogbW9tZW50KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vbnRoID0gdmFsdWUubW9udGgoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0RGF0ZU9mTW9udGhEYXlPZldlZWsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIC5jbG9uZSgpXG4gICAgICAgICAgICAgICAgLnNldChcImRhdGVcIiwgMSlcbiAgICAgICAgICAgICAgICAuZGF5KCk7XG4gICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gcGlja2VyLnN0YXJ0aW5nRGF5IC0gZmlyc3REYXRlT2ZNb250aERheU9mV2VlaztcbiAgICAgICAgICAgIGNvbnN0IG51bURpc3BsYXllZEZyb21QcmV2aW91c01vbnRoID1cbiAgICAgICAgICAgICAgICBkaWZmZXJlbmNlID4gMCA/IDcgLSBkaWZmZXJlbmNlIDogLWRpZmZlcmVuY2U7XG4gICAgICAgICAgICBjb25zdCBmaXJzdERhdGVPZk1vbnRoID1cbiAgICAgICAgICAgICAgICBudW1EaXNwbGF5ZWRGcm9tUHJldmlvdXNNb250aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KFwiZGF0ZVwiLCAtbnVtRGlzcGxheWVkRnJvbVByZXZpb3VzTW9udGggKyAxKVxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlLmNsb25lKCkuc2V0KFwiZGF0ZVwiLCAxKTtcblxuICAgICAgICAgICAgLy8gNDIgaXMgdGhlIG51bWJlciBvZiBkYXlzIG9uIGEgc2l4LXdlZWsgY2FsZW5kYXJcbiAgICAgICAgICAgIGNvbnN0IF9kYXlzOiBhbnlbXSA9IHRoaXMuZ2V0RGF0ZXMoZmlyc3REYXRlT2ZNb250aCwgNDIpO1xuICAgICAgICAgICAgY29uc3QgZGF5czogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuZGF0ZVBpY2tlci5oYW5kbGVUaW1lem9uZVxuICAgICAgICAgICAgICAgICAgICA/IG1vbWVudC5wYXJzZVpvbmVcbiAgICAgICAgICAgICAgICAgICAgOiBtb21lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RhdGVPYmplY3QgPSBwaWNrZXIuY3JlYXRlRGF0ZU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihfZGF5c1tpXS5kYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgcGlja2VyLmZvcm1hdERheVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBfZGF0ZU9iamVjdC5zZWNvbmRhcnkgPSBfZGF5c1tpXS5tb250aCAhPT0gbW9udGg7XG4gICAgICAgICAgICAgICAgX2RhdGVPYmplY3QudWlkID0gcGlja2VyLnVuaXF1ZUlkICsgXCItXCIgKyBpO1xuICAgICAgICAgICAgICAgIF9kYXRlT2JqZWN0LmlzQ2VsbFZpc2libGUgPSAhKFxuICAgICAgICAgICAgICAgICAgICBwaWNrZXIub25seUN1cnJlbnRNb250aCAmJiBfZGF0ZU9iamVjdC5zZWNvbmRhcnlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRheXNbaV0gPSBfZGF0ZU9iamVjdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsc1tqXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWJicjogcGlja2VyLmZvcm1hdERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXlzW2pdLmRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWNrZXIuZm9ybWF0RGF5SGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGZ1bGw6IHBpY2tlci5mb3JtYXREYXRlKGRheXNbal0uZGF0ZSwgXCJFRUVFXCIpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSBwaWNrZXIuZm9ybWF0RGF0ZSh2YWx1ZSwgcGlja2VyLmZvcm1hdERheVRpdGxlKTtcbiAgICAgICAgICAgIHRoaXMucm93cyA9IHBpY2tlci5zcGxpdChkYXlzLCA3KS5tYXAoKHJvdykgPT4gKHtcbiAgICAgICAgICAgICAgICBkYXlzOiByb3csXG4gICAgICAgICAgICAgICAgaXNSb3dWaXNpYmxlOiAhKFxuICAgICAgICAgICAgICAgICAgICBwaWNrZXIub25seUN1cnJlbnRNb250aCAmJlxuICAgICAgICAgICAgICAgICAgICByb3dbMF0uc2Vjb25kYXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgIHJvd1s2XS5zZWNvbmRhcnlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAocGlja2VyLnNob3dXZWVrcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRodXJzZGF5SW5kZXggPSAoNCArIDcgLSBwaWNrZXIuc3RhcnRpbmdEYXkpICUgNztcbiAgICAgICAgICAgICAgICBjb25zdCBudW1XZWVrcyA9IHRoaXMucm93cy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjdXJXZWVrID0gMDsgY3VyV2VlayA8IG51bVdlZWtzOyBjdXJXZWVrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9tZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93c1tjdXJXZWVrXS5kYXlzW3RodXJzZGF5SW5kZXhdLmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICkuaXNvV2VlaygpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcImRheVwiKTtcblxuICAgICAgICB0aGlzLmRhdGVQaWNrZXIuc2V0Q29tcGFyZUhhbmRsZXIoXG4gICAgICAgICAgICAoZGF0ZTE6IE1vbWVudCwgZGF0ZTI6IE1vbWVudCk6IG51bWJlciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZDEgPSBtb21lbnQoe1xuICAgICAgICAgICAgICAgICAgICB5ZWFyOiBkYXRlMS55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiBkYXRlMS5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiBkYXRlMS5kYXRlKCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZDIgPSBtb21lbnQoe1xuICAgICAgICAgICAgICAgICAgICB5ZWFyOiBkYXRlMi55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiBkYXRlMi5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiBkYXRlMi5kYXRlKCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQxLnZhbHVlT2YoKSAtIGQyLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRheVwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldERhdGVzKHN0YXJ0RGF0ZTogTW9tZW50LCBuOiBudW1iZXIpOiBNb21lbnRbXSB7XG4gICAgICAgIGNvbnN0IGRhdGVzOiBhbnlbXSA9IG5ldyBBcnJheShuKTtcblxuICAgICAgICBsZXQgY3VycmVudCA9IHN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBuKSB7XG4gICAgICAgICAgICBkYXRlc1tpKytdID0ge1xuICAgICAgICAgICAgICAgIGRhdGU6IGN1cnJlbnQudG9JU09TdHJpbmcodGhpcy5kYXRlUGlja2VyLmhhbmRsZVRpbWV6b25lKSxcbiAgICAgICAgICAgICAgICBkYXk6IGN1cnJlbnQuZGF5KCksXG4gICAgICAgICAgICAgICAgbW9udGg6IGN1cnJlbnQubW9udGgoKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNsb25lKCkuZGF0ZShjdXJyZW50LmRhdGUoKSArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGVzO1xuICAgIH1cbn1cbiIsIjx0YWJsZVxuICAgICpuZ0lmPVwiZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheSdcIlxuICAgIHJvbGU9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiZGF0ZVBpY2tlci51bmlxdWVJZCArICctdGl0bGUnXCJcbiAgICBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9XCJhY3RpdmVEYXRlSWRcIlxuPlxuICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0eWxlPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNhcmV0LWxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKC0xLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cIjUgKyAoZGF0ZVBpY2tlci5zaG93V2Vla3MgPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG51aS1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJkYXRlUGlja2VyLnVuaXF1ZUlkICsgJy10aXRsZSdcIlxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlID09PSBkYXRlUGlja2VyLm1heE1vZGVcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGFuZ2UtbW9kZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlID09PSBkYXRlUGlja2VyLm1heE1vZGVcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnRvZ2dsZU1vZGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0eWxlPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNhcmV0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVQaWNrZXIubW92ZSgxLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiZGF0ZVBpY2tlci5zaG93V2Vla3NcIj48L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWxhYmVsPVwibGFiZWwuZnVsbFwiPnt7IGxhYmVsLmFiYnIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIG5nRm9yXG4gICAgICAgICAgICBbbmdGb3JPZl09XCJyb3dzXCJcbiAgICAgICAgICAgIGxldC1yb3c9XCIkaW1wbGljaXRcIlxuICAgICAgICAgICAgbGV0LWluZGV4PVwiaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJyb3cuaXNSb3dWaXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiZGF0ZVBpY2tlci5zaG93V2Vla3NcIiBjbGFzcz1cImg2IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxlbT57eyB3ZWVrTnVtYmVyc1tpbmRleF0gfX08L2VtPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdy5kYXlzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlciBkYXlcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY2VsbC51aWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjZWxsLmlzQ2VsbFZpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBjZWxsLnNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjZWxsLmRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjZWxsLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnNlbGVjdChjZWxsLmRhdGUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1tdXRlZCc6IGNlbGwuc2Vjb25kYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1pbmZvJzogY2VsbC5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheTogY2VsbC50b2RheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBjZWxsLmxhYmVsIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCI3ICsgKGRhdGVQaWNrZXIuc2hvd1dlZWtzID8gMSA6IDApXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBudWktYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZGF5LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdHlsZT1cImFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXRlUGlja2VyLmlzVG9kYXlCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnNlbGVjdCh0b2RheURhdGUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBUb2RheVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cbiJdfQ==