ng-business-hours
Version:
Angular component allows you to show and manage business hours
149 lines • 23.2 kB
JavaScript
import { Component, forwardRef, Input } from '@angular/core';
import { FormBuilder, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import moment from 'moment';
import { LocalizedDatePipe } from './localized-date.pipe';
import { daySettingsValidator } from './day-settings.validator';
export class NgBusinessHoursComponent {
constructor(localizedDatePipe, fb) {
this.localizedDatePipe = localizedDatePipe;
this.fb = fb;
this.timeFrom = '09:00';
this.timeTo = '18:00';
this.isoWeek = true;
this.val = '';
this.disabled = false;
this.startTime = '00:00';
this.maxTime = '24:00';
this.interval = 15;
this.timeFormat = 'HH:mm';
this.defaultBusinessHours = [
{ open: true, from: this.timeFrom, to: this.timeTo },
{ open: true, from: this.timeFrom, to: this.timeTo },
{ open: true, from: this.timeFrom, to: this.timeTo },
{ open: true, from: this.timeFrom, to: this.timeTo },
{ open: true, from: this.timeFrom, to: this.timeTo },
{ open: false, from: '', to: '' },
{ open: false, from: '', to: '' },
];
this.onChange = (obj) => {
const values = Object.values(obj);
this.onValuesChange(values);
};
this.onValuesChange = (value) => { };
this.onTouched = () => { };
this.weekdays = Array.from(Array(7).keys());
this.timeOptions = this.getTimeOptions(this.startTime, this.maxTime, this.interval);
this.businessHours = this.defaultBusinessHours;
this.initForm();
}
ngOnInit() {
this.formValueChangesSubscription = this.form.valueChanges.subscribe(this.onChange);
}
registerOnChange(fn) {
this.onValuesChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
if (isDisabled) {
this.form.disable();
}
else {
this.form.enable();
}
}
writeValue(obj) {
if (obj && obj.length > 0) {
const values = Object.assign({}, obj);
this.businessHours = values;
this.form.setValue(values, { emitEvent: false });
}
else {
this.form.setValue(this.defaultBusinessHours, { emitEvent: true });
}
}
validate(control) {
if (this.form.valid) {
return null;
}
return { businessHoursInvalid: true };
}
onChangeOperationState(i) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
if (this.disabled) {
return;
}
this.businessHours[i].open = !this.businessHours[i].open;
(_b = (_a = this.form.get(String(i))) === null || _a === void 0 ? void 0 : _a.get('open')) === null || _b === void 0 ? void 0 : _b.setValue(this.businessHours[i].open);
if (this.businessHours[i].open) {
(_d = (_c = this.form.get(String(i))) === null || _c === void 0 ? void 0 : _c.get('from')) === null || _d === void 0 ? void 0 : _d.setValue(this.timeFrom);
(_f = (_e = this.form.get(String(i))) === null || _e === void 0 ? void 0 : _e.get('to')) === null || _f === void 0 ? void 0 : _f.setValue(this.timeTo);
}
else {
(_h = (_g = this.form.get(String(i))) === null || _g === void 0 ? void 0 : _g.get('from')) === null || _h === void 0 ? void 0 : _h.setValue('');
(_k = (_j = this.form.get(String(i))) === null || _j === void 0 ? void 0 : _j.get('to')) === null || _k === void 0 ? void 0 : _k.setValue('');
}
}
getDateForWeekDay(num) {
return moment().startOf(this.isoWeek ? 'isoWeek' : 'week').add(num, 'day').toDate();
}
initForm() {
this.form = this.fb.group({});
let fg;
this.weekdays.forEach((value, index) => {
fg = this.fb.group({
open: [{ value: this.businessHours[index].open, disabled: this.disabled }],
from: [{ value: this.businessHours[index].from, disabled: this.disabled }],
to: [{ value: this.businessHours[index].to, disabled: this.disabled }],
}, { validators: daySettingsValidator });
this.form.addControl(String(index), fg);
});
}
getTimeOptions(startTime, maxTime, interval) {
const start = moment(startTime, 'HH:mm');
const max = moment(maxTime, 'HH:mm');
const timeOptions = [];
while (start <= max) {
timeOptions.push(moment(start).format(this.timeFormat));
start.add(interval, 'minutes');
}
return timeOptions;
}
ngOnDestroy() {
this.formValueChangesSubscription.unsubscribe();
}
}
NgBusinessHoursComponent.decorators = [
{ type: Component, args: [{
selector: 'ng-business-hours',
template: "<form [formGroup]=\"form\" *ngIf=\"form\">\n <div class=\"business-hours\"\n [ngClass]=\"disabled ? 'business-hours--disabled' : ''\">\n <div *ngFor=\"let day of weekdays; index as i\" [formGroupName]=\"i\" class=\"day\">\n <div class=\"business-hours__left\">\n <div class=\"day__weekday\">{{getDateForWeekDay(i) | localizedDate | titlecase}}</div>\n <div class=\"day__box\"\n (click)=\"onChangeOperationState(i)\"\n [ngClass]=\"businessHours[i]['open'] ? 'day__box--open' : 'day__box--closed'\">\n <input type=\"checkbox\" class=\"invisible\" formControlName=\"open\"/>\n </div>\n </div>\n <div class=\"business-hours__right\">\n <div class=\"operation-time\">\n <div class=\"operation-time__input\">\n <mat-form-field [ngClass]=\"!businessHours[i]['open'] ? 'invisible' : ''\">\n <mat-label>{{timeFromLabel ? timeFromLabel : 'From'}}</mat-label>\n <mat-select value=\"{{businessHours[i]['from']}}\" formControlName=\"from\">\n <mat-option *ngFor=\"let timeOption of timeOptions\" [value]=\"timeOption\">{{timeOption}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"operation-time__input\">\n <mat-form-field [ngClass]=\"!businessHours[i]['open'] ? 'invisible' : ''\">\n <mat-label>{{timeToLabel ? timeToLabel : 'To'}}</mat-label>\n <mat-select value=\"{{businessHours[i]['to']}}\" formControlName=\"to\">\n <mat-option *ngFor=\"let timeOption of timeOptions\" [value]=\"timeOption\">{{timeOption}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <mat-error *ngIf=\"form.get(i.toString())?.hasError('timeToMustBeGreaterThenTimeFrom')\" class=\"text-small-error\">\n {{validationErrorMessage ? validationErrorMessage : 'The \"From\" must be earlier than the \"To\"'}}\n </mat-error>\n </div>\n </div>\n </div>\n </div>\n</form>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => NgBusinessHoursComponent),
},
{
provide: NG_VALIDATORS,
multi: true,
useExisting: forwardRef(() => NgBusinessHoursComponent),
}
],
styles: [".business-hours__left{width:70px}.business-hours__right{width:calc(100% - 70px)}.business-hours--disabled{color:rgba(0,0,0,.38)}.day{clear:both;width:100%;display:flex}.day__box{height:2rem;border:1px solid #888;border-radius:5px;float:right;width:2rem;cursor:pointer;margin-top:.25rem}.day__box--open{border:1px solid #56e399;background-color:#56e399}.day__box--closed{border:1px solid #ced4da;background-color:#ced4da}.day__weekday{margin-top:.7rem;float:left}.operation-time{float:left;width:100%}.operation-time__input{margin-left:1rem;float:left;width:calc(50% - 1rem)}.invisible{visibility:hidden!important}::ng-deep .mat-form-field,::ng-deep .mat-form-field-infix{width:100%}::ng-deep .mat-form-field-wrapper{padding:0}.text-small-error{margin-top:-.75rem;margin-left:1rem;display:block;float:left;font-size:.65rem}.business-hours--disabled .day__box{opacity:.7;cursor:auto}"]
},] }
];
NgBusinessHoursComponent.ctorParameters = () => [
{ type: LocalizedDatePipe },
{ type: FormBuilder }
];
NgBusinessHoursComponent.propDecorators = {
timeFromLabel: [{ type: Input }],
timeToLabel: [{ type: Input }],
validationErrorMessage: [{ type: Input }],
timeFrom: [{ type: Input }],
timeTo: [{ type: Input }],
isoWeek: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctYnVzaW5lc3MtaG91cnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYnVzaW5lc3MtaG91cnMvc3JjL2xpYi9uZy1idXNpbmVzcy1ob3Vycy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBR0wsV0FBVyxFQUVYLGFBQWEsRUFDYixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFvQjlELE1BQU0sT0FBTyx3QkFBd0I7SUFzQ25DLFlBQW9CLGlCQUFvQyxFQUFVLEVBQWU7UUFBN0Qsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUFVLE9BQUUsR0FBRixFQUFFLENBQWE7UUFsQ3hFLGFBQVEsR0FBRyxPQUFPLENBQUM7UUFDbkIsV0FBTSxHQUFHLE9BQU8sQ0FBQztRQUNqQixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXhCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSWpCLGNBQVMsR0FBRyxPQUFPLENBQUM7UUFDcEIsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUNsQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsZUFBVSxHQUFHLE9BQU8sQ0FBQztRQUlyQix5QkFBb0IsR0FBaUM7WUFDbkQsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDO1lBQ2xELEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztZQUNsRCxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUM7WUFDbEQsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDO1lBQ2xELEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztZQUNsRCxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFDO1lBQy9CLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUM7U0FDaEMsQ0FBQztRQUdGLGFBQVEsR0FBRyxDQUFDLEdBQWlDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFBO1FBQ0QsbUJBQWMsR0FBRyxDQUFDLEtBQW1DLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUM3RCxjQUFTLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBR25CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3JCO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFPO1FBQ2hCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sTUFBTSxxQkFBTyxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztTQUNoRDthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7U0FDbEU7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQXdCO1FBQy9CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbkIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsQ0FBUzs7UUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekQsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQUUsR0FBRyxDQUFDLE1BQU0sMkNBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1FBRTVFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDOUIsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQUUsR0FBRyxDQUFDLE1BQU0sMkNBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDL0QsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQUUsR0FBRyxDQUFDLElBQUksMkNBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7U0FDNUQ7YUFBTTtZQUNMLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUFFLEdBQUcsQ0FBQyxNQUFNLDJDQUFHLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDcEQsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQUUsR0FBRyxDQUFDLElBQUksMkNBQUcsUUFBUSxDQUFDLEVBQUUsRUFBRTtTQUNuRDtJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLE9BQU8sTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0RixDQUFDO0lBRU8sUUFBUTtRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsSUFBSSxFQUFFLENBQUM7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNyQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ2hCO2dCQUNFLElBQUksRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUM7Z0JBQ3hFLElBQUksRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUM7Z0JBQ3hFLEVBQUUsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUM7YUFDckUsRUFDRCxFQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBQyxDQUNuQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxTQUFpQixFQUFFLE9BQWUsRUFBRSxRQUFnQjtRQUN6RSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFckMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sS0FBSyxJQUFJLEdBQUcsRUFBRTtZQUNuQixXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDeEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDaEM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsRCxDQUFDOzs7WUF6SkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLG1qRUFBaUQ7Z0JBRWpELFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixLQUFLLEVBQUUsSUFBSTt3QkFDWCxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO3FCQUN4RDtvQkFDRDt3QkFDRSxPQUFPLEVBQUUsYUFBYTt3QkFDdEIsS0FBSyxFQUFFLElBQUk7d0JBQ1gsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztxQkFDeEQ7aUJBQ0Y7O2FBQ0Y7OztZQXBCTyxpQkFBaUI7WUFUdkIsV0FBVzs7OzRCQStCVixLQUFLOzBCQUNMLEtBQUs7cUNBQ0wsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7c0JBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Hcm91cCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0xvY2FsaXplZERhdGVQaXBlfSBmcm9tICcuL2xvY2FsaXplZC1kYXRlLnBpcGUnO1xuaW1wb3J0IHtkYXlTZXR0aW5nc1ZhbGlkYXRvcn0gZnJvbSAnLi9kYXktc2V0dGluZ3MudmFsaWRhdG9yJztcbmltcG9ydCB7TmdCdXNpbmVzc0hvdXJzRGF5U2V0dGluZ3N9IGZyb20gJy4vbmctYnVzaW5lc3MtaG91cnMtZGF5LXNldHRpbmdzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctYnVzaW5lc3MtaG91cnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctYnVzaW5lc3MtaG91cnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZy1idXNpbmVzcy1ob3Vycy5jb21wb25lbnQuc2FzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdCdXNpbmVzc0hvdXJzQ29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nQnVzaW5lc3NIb3Vyc0NvbXBvbmVudCksXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5nQnVzaW5lc3NIb3Vyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgQElucHV0KCkgdGltZUZyb21MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSB0aW1lVG9MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSB2YWxpZGF0aW9uRXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHRpbWVGcm9tID0gJzA5OjAwJztcbiAgQElucHV0KCkgdGltZVRvID0gJzE4OjAwJztcbiAgQElucHV0KCkgaXNvV2VlayA9IHRydWU7XG5cbiAgdmFsID0gJyc7XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIGZvcm0hOiBGb3JtR3JvdXA7XG4gIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG5cbiAgc3RhcnRUaW1lID0gJzAwOjAwJztcbiAgbWF4VGltZSA9ICcyNDowMCc7XG4gIGludGVydmFsID0gMTU7XG4gIHRpbWVGb3JtYXQgPSAnSEg6bW0nO1xuICB0aW1lT3B0aW9ucyE6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzITogbnVtYmVyW107XG4gIGRlZmF1bHRCdXNpbmVzc0hvdXJzOiBOZ0J1c2luZXNzSG91cnNEYXlTZXR0aW5nc1tdID0gW1xuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiBmYWxzZSwgZnJvbTogJycsIHRvOiAnJ30sXG4gICAge29wZW46IGZhbHNlLCBmcm9tOiAnJywgdG86ICcnfSxcbiAgXTtcbiAgYnVzaW5lc3NIb3VycyE6IE5nQnVzaW5lc3NIb3Vyc0RheVNldHRpbmdzW107XG5cbiAgb25DaGFuZ2UgPSAob2JqOiBOZ0J1c2luZXNzSG91cnNEYXlTZXR0aW5nc1tdKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhvYmopO1xuICAgIHRoaXMub25WYWx1ZXNDaGFuZ2UodmFsdWVzKTtcbiAgfVxuICBvblZhbHVlc0NoYW5nZSA9ICh2YWx1ZTogTmdCdXNpbmVzc0hvdXJzRGF5U2V0dGluZ3NbXSkgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9jYWxpemVkRGF0ZVBpcGU6IExvY2FsaXplZERhdGVQaXBlLCBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMud2Vla2RheXMgPSBBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSk7XG4gICAgdGhpcy50aW1lT3B0aW9ucyA9IHRoaXMuZ2V0VGltZU9wdGlvbnModGhpcy5zdGFydFRpbWUsIHRoaXMubWF4VGltZSwgdGhpcy5pbnRlcnZhbCk7XG4gICAgdGhpcy5idXNpbmVzc0hvdXJzID0gdGhpcy5kZWZhdWx0QnVzaW5lc3NIb3VycztcbiAgICB0aGlzLmluaXRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0aGlzLm9uQ2hhbmdlKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25WYWx1ZXNDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogW10pOiB2b2lkIHtcbiAgICBpZiAob2JqICYmIG9iai5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7Li4ub2JqfTtcbiAgICAgIHRoaXMuYnVzaW5lc3NIb3VycyA9IHZhbHVlcztcbiAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh2YWx1ZXMsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh0aGlzLmRlZmF1bHRCdXNpbmVzc0hvdXJzLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7YnVzaW5lc3NIb3Vyc0ludmFsaWQ6IHRydWV9O1xuICB9XG5cbiAgb25DaGFuZ2VPcGVyYXRpb25TdGF0ZShpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVzaW5lc3NIb3Vyc1tpXS5vcGVuID0gIXRoaXMuYnVzaW5lc3NIb3Vyc1tpXS5vcGVuO1xuICAgIHRoaXMuZm9ybS5nZXQoU3RyaW5nKGkpKT8uZ2V0KCdvcGVuJyk/LnNldFZhbHVlKHRoaXMuYnVzaW5lc3NIb3Vyc1tpXS5vcGVuKTtcblxuICAgIGlmICh0aGlzLmJ1c2luZXNzSG91cnNbaV0ub3Blbikge1xuICAgICAgdGhpcy5mb3JtLmdldChTdHJpbmcoaSkpPy5nZXQoJ2Zyb20nKT8uc2V0VmFsdWUodGhpcy50aW1lRnJvbSk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KFN0cmluZyhpKSk/LmdldCgndG8nKT8uc2V0VmFsdWUodGhpcy50aW1lVG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm0uZ2V0KFN0cmluZyhpKSk/LmdldCgnZnJvbScpPy5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KFN0cmluZyhpKSk/LmdldCgndG8nKT8uc2V0VmFsdWUoJycpO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGVGb3JXZWVrRGF5KG51bTogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIG1vbWVudCgpLnN0YXJ0T2YodGhpcy5pc29XZWVrID8gJ2lzb1dlZWsnIDogJ3dlZWsnKS5hZGQobnVtLCAnZGF5JykudG9EYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIGxldCBmZztcbiAgICB0aGlzLndlZWtkYXlzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgZmcgPSB0aGlzLmZiLmdyb3VwKFxuICAgICAgICB7XG4gICAgICAgICAgb3BlbjogW3t2YWx1ZTogdGhpcy5idXNpbmVzc0hvdXJzW2luZGV4XS5vcGVuLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZH1dLFxuICAgICAgICAgIGZyb206IFt7dmFsdWU6IHRoaXMuYnVzaW5lc3NIb3Vyc1tpbmRleF0uZnJvbSwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWR9XSxcbiAgICAgICAgICB0bzogW3t2YWx1ZTogdGhpcy5idXNpbmVzc0hvdXJzW2luZGV4XS50bywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWR9XSxcbiAgICAgICAgfSxcbiAgICAgICAge3ZhbGlkYXRvcnM6IGRheVNldHRpbmdzVmFsaWRhdG9yfVxuICAgICAgKTtcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKFN0cmluZyhpbmRleCksIGZnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGltZU9wdGlvbnMoc3RhcnRUaW1lOiBzdHJpbmcsIG1heFRpbWU6IHN0cmluZywgaW50ZXJ2YWw6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGFydCA9IG1vbWVudChzdGFydFRpbWUsICdISDptbScpO1xuICAgIGNvbnN0IG1heCA9IG1vbWVudChtYXhUaW1lLCAnSEg6bW0nKTtcblxuICAgIGNvbnN0IHRpbWVPcHRpb25zID0gW107XG4gICAgd2hpbGUgKHN0YXJ0IDw9IG1heCkge1xuICAgICAgdGltZU9wdGlvbnMucHVzaChtb21lbnQoc3RhcnQpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpKTtcbiAgICAgIHN0YXJ0LmFkZChpbnRlcnZhbCwgJ21pbnV0ZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZU9wdGlvbnM7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19