@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
275 lines • 37.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { Base } from './export-schedules.interface';
import { TranslateService } from '@ngx-translate/core';
import { formatDate } from '@angular/common';
import { gettext } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
export class CronService {
constructor(translateService) {
this.translateService = translateService;
this.daysOfWeekPosix = [];
this.daysOfMonth = [
{ value: '1', label: '1.' },
{ value: '2', label: '2.' },
{ value: '3', label: '3.' },
{ value: '4', label: '4.' },
{ value: '5', label: '5.' },
{ value: '6', label: '6.' },
{ value: '7', label: '7.' },
{ value: '8', label: '8.' },
{ value: '9', label: '9.' },
{ value: '10', label: '10.' },
{ value: '11', label: '11.' },
{ value: '12', label: '12.' },
{ value: '13', label: '13.' },
{ value: '14', label: '14.' },
{ value: '15', label: '15.' },
{ value: '16', label: '16.' },
{ value: '17', label: '17.' },
{ value: '18', label: '18.' },
{ value: '19', label: '19.' },
{ value: '20', label: '20.' },
{ value: '21', label: '21.' },
{ value: '22', label: '22.' },
{ value: '23', label: '23.' },
{ value: '24', label: '24.' },
{ value: '25', label: '25.' },
{ value: '26', label: '26.' },
{ value: '27', label: '27.' },
{ value: '28', label: '28.' },
{ value: '29', label: '29.' },
{ value: '30', label: '30.' },
{ value: '31', label: '31.' }
];
this.months = [];
this.hours = [];
this.minutes = [];
this.intervals = [
{ value: 2, label: gettext('Hour') },
{ value: 3, label: gettext('Day') },
{ value: 4, label: gettext('Week') },
{ value: 5, label: gettext('Month') },
{ value: 6, label: gettext('Year') }
];
for (let x = 0; x < 24; x++) {
this.hours.push({ value: x.toString(), label: `${x}` });
}
for (let x = 0; x < 60; x = x + 5) {
this.minutes.push({ value: x.toString(), label: `${x}` });
}
for (let x = 0; x < 7; x++) {
this.daysOfWeekPosix.push({
value: x.toString(),
label: this.getWeekDayName({ weekday: x })
});
}
for (let x = 1; x < 13; x++) {
this.months.push({
value: x.toString(),
label: this.getMonthName({ month: x })
});
}
}
generateCron(cronConfig) {
let cron = '';
cron = cronConfig.minute ? `${cronConfig.minute}` : '*';
cron += cronConfig.hour ? ` ${cronConfig.hour}` : ' *';
cron += cronConfig.day ? ` ${cronConfig.day}` : ' *';
cron += cronConfig.month ? ` ${cronConfig.month}` : ' *';
cron += cronConfig.weekday ? ` ${cronConfig.weekday}` : ' *';
return cron;
}
generateCronConfig(cron) {
const parts = cron.split(/\s+/);
const cronConfig = {
minute: parts[0],
hour: parts[1],
day: parts[2],
month: parts[3],
weekday: parts[4]
};
return cronConfig;
}
getBase(cronConfig) {
let base = Base.Initial;
if (cronConfig.minute !== '*' &&
cronConfig.hour === '*' &&
cronConfig.day === '*' &&
cronConfig.month === '*' &&
cronConfig.weekday === '*') {
base = Base.Hour;
}
else if (cronConfig.minute !== '*' &&
cronConfig.hour !== '*' &&
cronConfig.day === '*' &&
cronConfig.month === '*' &&
cronConfig.weekday === '*') {
base = Base.Day;
}
else if (cronConfig.minute !== '*' &&
cronConfig.hour !== '*' &&
cronConfig.day === '*' &&
cronConfig.month === '*' &&
cronConfig.weekday !== '*') {
base = Base.Week;
}
else if (cronConfig.minute !== '*' &&
cronConfig.hour !== '*' &&
cronConfig.day !== '*' &&
cronConfig.month === '*' &&
cronConfig.weekday === '*') {
base = Base.Month;
}
else if (cronConfig.minute !== '*' &&
cronConfig.hour !== '*' &&
cronConfig.day !== '*' &&
cronConfig.month !== '*' &&
cronConfig.weekday === '*') {
base = Base.Year;
}
else {
// cronConfig invalid
}
return base;
}
validateModels(base, cronConfig) {
let valid;
switch (base) {
case Base.Initial: // Please select
valid = false;
break;
case Base.Hour:
if (cronConfig.minute !== '*') {
valid = true;
}
else {
valid = false;
}
break;
case Base.Day:
if (cronConfig.minute !== '*' && cronConfig.hour !== '*') {
valid = true;
}
else {
valid = false;
}
break;
case Base.Week:
if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.weekday !== '*') {
valid = true;
}
else {
valid = false;
}
break;
case Base.Month:
if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.day !== '*') {
valid = true;
}
else {
valid = false;
}
break;
case Base.Year:
if (cronConfig.minute !== '*' &&
cronConfig.hour !== '*' &&
cronConfig.day !== '*' &&
cronConfig.month !== '*') {
valid = true;
}
else {
valid = false;
}
break;
default:
valid = false;
}
return valid;
}
clearNextModels(base, cronConfig) {
if (base === Base.Initial) {
// please select, delete all
// cron expression: every minute at second 0
cronConfig.minute = '*';
cronConfig.hour = '*';
cronConfig.day = '*';
cronConfig.month = '*';
cronConfig.weekday = '*';
}
else if (base === Base.Hour) {
// hour, don't delete minutes
// cron expression: every hour, at whatever minute, at second 0
cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute;
cronConfig.hour = '*';
cronConfig.day = '*';
cronConfig.month = '*';
cronConfig.weekday = '*';
}
else if (base === Base.Day) {
// day, don't delete minutes and hours
// cron expression: every day of every month, at whatever hour and minute, at second 0
cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute;
cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour;
cronConfig.day = '*';
cronConfig.month = '*';
cronConfig.weekday = '*';
}
else if (base === Base.Week) {
// week, delete month and day
// cron expression: every month, at whatever weekday, hour and minute, at second 0
cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute;
cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour;
cronConfig.day = '*';
cronConfig.month = '*';
cronConfig.weekday =
cronConfig.weekday === '*' || cronConfig.weekday === '?'
? this.daysOfWeekPosix[0].value
: cronConfig.weekday;
}
else if (base === Base.Month) {
// month, delete month and weekday
// cron expression: every month, at whatever day of month, hour and minute, at second 0
cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute;
cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour;
cronConfig.day = cronConfig.day === '*' ? this.daysOfMonth[0].value : cronConfig.day;
cronConfig.month = '*';
cronConfig.weekday = '*';
}
else if (base === Base.Year) {
// year, delete weekday
// cron expression: every year, at whatever month, day of month, hour and minute, at second 0
cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute;
cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour;
cronConfig.day = cronConfig.day === '*' ? this.daysOfMonth[0].value : cronConfig.day;
cronConfig.month = cronConfig.month === '*' ? this.months[0].value : cronConfig.month;
cronConfig.weekday = '*';
}
}
getWeekDayName(cronConfig) {
const date = new Date(0);
const firstSundayDate = date.getDate() + 3; // because we know date 0 was on Thursday...
date.setDate(firstSundayDate + parseInt(cronConfig.weekday, 10));
return formatDate(date, 'EEEE', this.translateService.currentLang);
}
getMonthDayName(cronConfig) {
let name = '';
this.daysOfMonth.forEach(item => {
if (item.value === cronConfig.day) {
name = item.label;
}
});
return name;
}
getMonthName(cronConfig) {
const date = new Date(0);
date.setMonth(parseInt(cronConfig.month, 10) - 1);
return formatDate(date, 'LLLL', this.translateService.currentLang);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronService, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.TranslateService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcmVwb3J0cy9jcm9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBRzlDLE1BQU0sT0FBTyxXQUFXO0lBNkN0QixZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQTVDdEQsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsZ0JBQVcsR0FBRztZQUNaLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxF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QixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJ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QUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyw0Q0FBNEM7UUFDeEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsZUFBZSxDQUFDLFVBQXNCO1FBQ3BDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxVQUFzQjtRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7K0dBaFJVLFdBQVc7bUhBQVgsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyb25Db25maWcsIEJhc2UgfSBmcm9tICcuL2V4cG9ydC1zY2hlZHVsZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ3JvblNlcnZpY2Uge1xuICBkYXlzT2ZXZWVrUG9zaXg6IGFueVtdID0gW107XG4gIGRheXNPZk1vbnRoID0gW1xuICAgIHsgdmFsdWU6ICcxJywgbGFiZWw6ICcxLicgfSxcbiAgICB7IHZhbHVlOiAnMicsIGxhYmVsOiAnMi4nIH0sXG4gICAgeyB2YWx1ZTogJzMnLCBsYWJlbDogJzMuJyB9LFxuICAgIHsgdmFsdWU6ICc0JywgbGFiZWw6ICc0LicgfSxcbiAgICB7IHZhbHVlOiAnNScsIGxhYmVsOiAnNS4nIH0sXG4gICAgeyB2YWx1ZTogJzYnLCBsYWJlbDogJzYuJyB9LFxuICAgIHsgdmFsdWU6ICc3JywgbGFiZWw6ICc3LicgfSxcbiAgICB7IHZhbHVlOiAnOCcsIGxhYmVsOiAnOC4nIH0sXG4gICAgeyB2YWx1ZTogJzknLCBsYWJlbDogJzkuJyB9LFxuICAgIHsgdmFsdWU6ICcxMCcsIGxhYmVsOiAnMTAuJyB9LFxuICAgIHsgdmFsdWU6ICcxMScsIGxhYmVsOiAnMTEuJyB9LFxuICAgIHsgdmFsdWU6ICcxMicsIGxhYmVsOiAnMTIuJyB9LFxuICAgIHsgdmFsdWU6ICcxMycsIGxhYmVsOiAnMTMuJyB9LFxuICAgIHsgdmFsdWU6ICcxNCcsIGxhYmVsOiAnMTQuJyB9LFxuICAgIHsgdmFsdWU6ICcxNScsIGxhYmVsOiAnMTUuJyB9LFxuICAgIHsgdmFsdWU6ICcxNicsIGxhYmVsOiAnMTYuJyB9LFxuICAgIHsgdmFsdWU6ICcxNycsIGxhYmVsOiAnMTcuJyB9LFxuICAgIHsgdmFsdWU6ICcxOCcsIGxhYmVsOiAnMTguJyB9LFxuICAgIHsgdmFsdWU6ICcxOScsIGxhYmVsOiAnMTkuJyB9LFxuICAgIHsgdmFsdWU6ICcyMCcsIGxhYmVsOiAnMjAuJyB9LFxuICAgIHsgdmFsdWU6ICcyMScsIGxhYmVsOiAnMjEuJyB9LFxuICAgIHsgdmFsdWU6ICcyMicsIGxhYmVsOiAnMjIuJyB9LFxuICAgIHsgdmFsdWU6ICcyMycsIGxhYmVsOiAnMjMuJyB9LFxuICAgIHsgdmFsdWU6ICcyNCcsIGxhYmVsOiAnMjQuJyB9LFxuICAgIHsgdmFsdWU6ICcyNScsIGxhYmVsOiAnMjUuJyB9LFxuICAgIHsgdmFsdWU6ICcyNicsIGxhYmVsOiAnMjYuJyB9LFxuICAgIHsgdmFsdWU6ICcyNycsIGxhYmVsOiAnMjcuJyB9LFxuICAgIHsgdmFsdWU6ICcyOCcsIGxhYmVsOiAnMjguJyB9LFxuICAgIHsgdmFsdWU6ICcyOScsIGxhYmVsOiAnMjkuJyB9LFxuICAgIHsgdmFsdWU6ICczMCcsIGxhYmVsOiAnMzAuJyB9LFxuICAgIHsgdmFsdWU6ICczMScsIGxhYmVsOiAnMzEuJyB9XG4gIF07XG4gIG1vbnRoczogYW55W10gPSBbXTtcbiAgaG91cnM6IGFueVtdID0gW107XG4gIG1pbnV0ZXM6IGFueVtdID0gW107XG4gIGludGVydmFscyA9IFtcbiAgICB7IHZhbHVlOiAyLCBsYWJlbDogZ2V0dGV4dCgnSG91cicpIH0sXG4gICAgeyB2YWx1ZTogMywgbGFiZWw6IGdldHRleHQoJ0RheScpIH0sXG4gICAgeyB2YWx1ZTogNCwgbGFiZWw6IGdldHRleHQoJ1dlZWsnKSB9LFxuICAgIHsgdmFsdWU6IDUsIGxhYmVsOiBnZXR0ZXh0KCdNb250aCcpIH0sXG4gICAgeyB2YWx1ZTogNiwgbGFiZWw6IGdldHRleHQoJ1llYXInKSB9XG4gIF07XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgMjQ7IHgrKykge1xuICAgICAgdGhpcy5ob3Vycy5wdXNoKHsgdmFsdWU6IHgudG9TdHJpbmcoKSwgbGFiZWw6IGAke3h9YCB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCA2MDsgeCA9IHggKyA1KSB7XG4gICAgICB0aGlzLm1pbnV0ZXMucHVzaCh7IHZhbHVlOiB4LnRvU3RyaW5nKCksIGxhYmVsOiBgJHt4fWAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCA3OyB4KyspIHtcbiAgICAgIHRoaXMuZGF5c09mV2Vla1Bvc2l4LnB1c2goe1xuICAgICAgICB2YWx1ZTogeC50b1N0cmluZygpLFxuICAgICAgICBsYWJlbDogdGhpcy5nZXRXZWVrRGF5TmFtZSh7IHdlZWtkYXk6IHggfSBhcyB1bmtub3duIGFzIENyb25Db25maWcpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB4ID0gMTsgeCA8IDEzOyB4KyspIHtcbiAgICAgIHRoaXMubW9udGhzLnB1c2goe1xuICAgICAgICB2YWx1ZTogeC50b1N0cmluZygpLFxuICAgICAgICBsYWJlbDogdGhpcy5nZXRNb250aE5hbWUoeyBtb250aDogeCB9IGFzIHVua25vd24gYXMgQ3JvbkNvbmZpZylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlQ3Jvbihjcm9uQ29uZmlnOiBDcm9uQ29uZmlnKSB7XG4gICAgbGV0IGNyb24gPSAnJztcbiAgICBjcm9uID0gY3JvbkNvbmZpZy5taW51dGUgPyBgJHtjcm9uQ29uZmlnLm1pbnV0ZX1gIDogJyonO1xuICAgIGNyb24gKz0gY3JvbkNvbmZpZy5ob3VyID8gYCAke2Nyb25Db25maWcuaG91cn1gIDogJyAqJztcbiAgICBjcm9uICs9IGNyb25Db25maWcuZGF5ID8gYCAke2Nyb25Db25maWcuZGF5fWAgOiAnIConO1xuICAgIGNyb24gKz0gY3JvbkNvbmZpZy5tb250aCA/IGAgJHtjcm9uQ29uZmlnLm1vbnRofWAgOiAnIConO1xuICAgIGNyb24gKz0gY3JvbkNvbmZpZy53ZWVrZGF5ID8gYCAke2Nyb25Db25maWcud2Vla2RheX1gIDogJyAqJztcblxuICAgIHJldHVybiBjcm9uO1xuICB9XG5cbiAgZ2VuZXJhdGVDcm9uQ29uZmlnKGNyb246IHN0cmluZykge1xuICAgIGNvbnN0IHBhcnRzID0gY3Jvbi5zcGxpdCgvXFxzKy8pO1xuICAgIGNvbnN0IGNyb25Db25maWc6IENyb25Db25maWcgPSB7XG4gICAgICBtaW51dGU6IHBhcnRzWzBdLFxuICAgICAgaG91cjogcGFydHNbMV0sXG4gICAgICBkYXk6IHBhcnRzWzJdLFxuICAgICAgbW9udGg6IHBhcnRzWzNdLFxuICAgICAgd2Vla2RheTogcGFydHNbNF1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyb25Db25maWc7XG4gIH1cblxuICBnZXRCYXNlKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBsZXQgYmFzZTogQmFzZSA9IEJhc2UuSW5pdGlhbDtcblxuICAgIGlmIChcbiAgICAgIGNyb25Db25maWcubWludXRlICE9PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcuaG91ciA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmRheSA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLm1vbnRoID09PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9PT0gJyonXG4gICAgKSB7XG4gICAgICBiYXNlID0gQmFzZS5Ib3VyO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmhvdXIgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5kYXkgPT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5tb250aCA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgPT09ICcqJ1xuICAgICkge1xuICAgICAgYmFzZSA9IEJhc2UuRGF5O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmhvdXIgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5kYXkgPT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5tb250aCA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgIT09ICcqJ1xuICAgICkge1xuICAgICAgYmFzZSA9IEJhc2UuV2VlaztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY3JvbkNvbmZpZy5taW51dGUgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcuZGF5ICE9PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcubW9udGggPT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID09PSAnKidcbiAgICApIHtcbiAgICAgIGJhc2UgPSBCYXNlLk1vbnRoO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmhvdXIgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5kYXkgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5tb250aCAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgPT09ICcqJ1xuICAgICkge1xuICAgICAgYmFzZSA9IEJhc2UuWWVhcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY3JvbkNvbmZpZyBpbnZhbGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICB2YWxpZGF0ZU1vZGVscyhiYXNlOiBCYXNlLCBjcm9uQ29uZmlnOiBDcm9uQ29uZmlnKSB7XG4gICAgbGV0IHZhbGlkOiBib29sZWFuO1xuICAgIHN3aXRjaCAoYmFzZSkge1xuICAgICAgY2FzZSBCYXNlLkluaXRpYWw6IC8vIFBsZWFzZSBzZWxlY3RcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEJhc2UuSG91cjpcbiAgICAgICAgaWYgKGNyb25Db25maWcubWludXRlICE9PSAnKicpIHtcbiAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQmFzZS5EYXk6XG4gICAgICAgIGlmIChjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmIGNyb25Db25maWcuaG91ciAhPT0gJyonKSB7XG4gICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEJhc2UuV2VlazpcbiAgICAgICAgaWYgKGNyb25Db25maWcubWludXRlICE9PSAnKicgJiYgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiYgY3JvbkNvbmZpZy53ZWVrZGF5ICE9PSAnKicpIHtcbiAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQmFzZS5Nb250aDpcbiAgICAgICAgaWYgKGNyb25Db25maWcubWludXRlICE9PSAnKicgJiYgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiYgY3JvbkNvbmZpZy5kYXkgIT09ICcqJykge1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCYXNlLlllYXI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICAgICAgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiZcbiAgICAgICAgICBjcm9uQ29uZmlnLmRheSAhPT0gJyonICYmXG4gICAgICAgICAgY3JvbkNvbmZpZy5tb250aCAhPT0gJyonXG4gICAgICAgICkge1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBjbGVhck5leHRNb2RlbHMoYmFzZTogQmFzZSwgY3JvbkNvbmZpZzogQ3JvbkNvbmZpZykge1xuICAgIGlmIChiYXNlID09PSBCYXNlLkluaXRpYWwpIHtcbiAgICAgIC8vIHBsZWFzZSBzZWxlY3QsIGRlbGV0ZSBhbGxcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgbWludXRlIGF0IHNlY29uZCAwXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSA9ICcqJztcbiAgICAgIGNyb25Db25maWcuaG91ciA9ICcqJztcbiAgICAgIGNyb25Db25maWcuZGF5ID0gJyonO1xuICAgICAgY3JvbkNvbmZpZy5tb250aCA9ICcqJztcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9ICcqJztcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IEJhc2UuSG91cikge1xuICAgICAgLy8gaG91ciwgZG9uJ3QgZGVsZXRlIG1pbnV0ZXNcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgaG91ciwgYXQgd2hhdGV2ZXIgbWludXRlLCBhdCBzZWNvbmQgMFxuICAgICAgY3JvbkNvbmZpZy5taW51dGUgPSBjcm9uQ29uZmlnLm1pbnV0ZSA9PT0gJyonID8gdGhpcy5taW51dGVzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5taW51dGU7XG4gICAgICBjcm9uQ29uZmlnLmhvdXIgPSAnKic7XG4gICAgICBjcm9uQ29uZmlnLmRheSA9ICcqJztcbiAgICAgIGNyb25Db25maWcubW9udGggPSAnKic7XG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgPSAnKic7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSBCYXNlLkRheSkge1xuICAgICAgLy8gZGF5LCBkb24ndCBkZWxldGUgbWludXRlcyBhbmQgaG91cnNcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgZGF5IG9mIGV2ZXJ5IG1vbnRoLCBhdCB3aGF0ZXZlciBob3VyIGFuZCBtaW51dGUsIGF0IHNlY29uZCAwXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSA9IGNyb25Db25maWcubWludXRlID09PSAnKicgPyB0aGlzLm1pbnV0ZXNbMF0udmFsdWUgOiBjcm9uQ29uZmlnLm1pbnV0ZTtcbiAgICAgIGNyb25Db25maWcuaG91ciA9IGNyb25Db25maWcuaG91ciA9PT0gJyonID8gdGhpcy5ob3Vyc1swXS52YWx1ZSA6IGNyb25Db25maWcuaG91cjtcbiAgICAgIGNyb25Db25maWcuZGF5ID0gJyonO1xuICAgICAgY3JvbkNvbmZpZy5tb250aCA9ICcqJztcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9ICcqJztcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IEJhc2UuV2Vlaykge1xuICAgICAgLy8gd2VlaywgZGVsZXRlIG1vbnRoIGFuZCBkYXlcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgbW9udGgsIGF0IHdoYXRldmVyIHdlZWtkYXksIGhvdXIgYW5kIG1pbnV0ZSwgYXQgc2Vjb25kIDBcbiAgICAgIGNyb25Db25maWcubWludXRlID0gY3JvbkNvbmZpZy5taW51dGUgPT09ICcqJyA/IHRoaXMubWludXRlc1swXS52YWx1ZSA6IGNyb25Db25maWcubWludXRlO1xuICAgICAgY3JvbkNvbmZpZy5ob3VyID0gY3JvbkNvbmZpZy5ob3VyID09PSAnKicgPyB0aGlzLmhvdXJzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5ob3VyO1xuICAgICAgY3JvbkNvbmZpZy5kYXkgPSAnKic7XG4gICAgICBjcm9uQ29uZmlnLm1vbnRoID0gJyonO1xuICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID1cbiAgICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID09PSAnKicgfHwgY3JvbkNvbmZpZy53ZWVrZGF5ID09PSAnPydcbiAgICAgICAgICA/IHRoaXMuZGF5c09mV2Vla1Bvc2l4WzBdLnZhbHVlXG4gICAgICAgICAgOiBjcm9uQ29uZmlnLndlZWtkYXk7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSBCYXNlLk1vbnRoKSB7XG4gICAgICAvLyBtb250aCwgZGVsZXRlIG1vbnRoIGFuZCB3ZWVrZGF5XG4gICAgICAvLyBjcm9uIGV4cHJlc3Npb246IGV2ZXJ5IG1vbnRoLCBhdCB3aGF0ZXZlciBkYXkgb2YgbW9udGgsIGhvdXIgYW5kIG1pbnV0ZSwgYXQgc2Vjb25kIDBcbiAgICAgIGNyb25Db25maWcubWludXRlID0gY3JvbkNvbmZpZy5taW51dGUgPT09ICcqJyA/IHRoaXMubWludXRlc1swXS52YWx1ZSA6IGNyb25Db25maWcubWludXRlO1xuICAgICAgY3JvbkNvbmZpZy5ob3VyID0gY3JvbkNvbmZpZy5ob3VyID09PSAnKicgPyB0aGlzLmhvdXJzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5ob3VyO1xuICAgICAgY3JvbkNvbmZpZy5kYXkgPSBjcm9uQ29uZmlnLmRheSA9PT0gJyonID8gdGhpcy5kYXlzT2ZNb250aFswXS52YWx1ZSA6IGNyb25Db25maWcuZGF5O1xuICAgICAgY3JvbkNvbmZpZy5tb250aCA9ICcqJztcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9ICcqJztcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IEJhc2UuWWVhcikge1xuICAgICAgLy8geWVhciwgZGVsZXRlIHdlZWtkYXlcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgeWVhciwgYXQgd2hhdGV2ZXIgbW9udGgsIGRheSBvZiBtb250aCwgaG91ciBhbmQgbWludXRlLCBhdCBzZWNvbmQgMFxuICAgICAgY3JvbkNvbmZpZy5taW51dGUgPSBjcm9uQ29uZmlnLm1pbnV0ZSA9PT0gJyonID8gdGhpcy5taW51dGVzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5taW51dGU7XG4gICAgICBjcm9uQ29uZmlnLmhvdXIgPSBjcm9uQ29uZmlnLmhvdXIgPT09ICcqJyA/IHRoaXMuaG91cnNbMF0udmFsdWUgOiBjcm9uQ29uZmlnLmhvdXI7XG4gICAgICBjcm9uQ29uZmlnLmRheSA9IGNyb25Db25maWcuZGF5ID09PSAnKicgPyB0aGlzLmRheXNPZk1vbnRoWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5kYXk7XG4gICAgICBjcm9uQ29uZmlnLm1vbnRoID0gY3JvbkNvbmZpZy5tb250aCA9PT0gJyonID8gdGhpcy5tb250aHNbMF0udmFsdWUgOiBjcm9uQ29uZmlnLm1vbnRoO1xuICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID0gJyonO1xuICAgIH1cbiAgfVxuXG4gIGdldFdlZWtEYXlOYW1lKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgY29uc3QgZmlyc3RTdW5kYXlEYXRlID0gZGF0ZS5nZXREYXRlKCkgKyAzOyAvLyBiZWNhdXNlIHdlIGtub3cgZGF0ZSAwIHdhcyBvbiBUaHVyc2RheS4uLlxuICAgIGRhdGUuc2V0RGF0ZShmaXJzdFN1bmRheURhdGUgKyBwYXJzZUludChjcm9uQ29uZmlnLndlZWtkYXksIDEwKSk7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUoZGF0ZSwgJ0VFRUUnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcpO1xuICB9XG5cbiAgZ2V0TW9udGhEYXlOYW1lKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBsZXQgbmFtZSA9ICcnO1xuICAgIHRoaXMuZGF5c09mTW9udGguZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlID09PSBjcm9uQ29uZmlnLmRheSkge1xuICAgICAgICBuYW1lID0gaXRlbS5sYWJlbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgZ2V0TW9udGhOYW1lKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgZGF0ZS5zZXRNb250aChwYXJzZUludChjcm9uQ29uZmlnLm1vbnRoLCAxMCkgLSAxKTtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZShkYXRlLCAnTExMTCcsIHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG4gIH1cbn1cbiJdfQ==