ngx-jalali-date-picker
Version:
This is a configurable date-picker build for Angular applications. Supports latest (Angular 18) version. This date-picker is based on ng2-date-piker and ngx-jalali-date-picker date pickers.
318 lines • 41 kB
JavaScript
import { ECalendarValue } from '../../types/calendar-value-enum';
import { Injectable } from '@angular/core';
import moment from 'jalali-moment';
import * as i0 from "@angular/core";
export class UtilsService {
static debounce(func, wait) {
let timeout;
return function () {
const context = this, args = arguments;
timeout = clearTimeout(timeout);
setTimeout(() => {
func.apply(context, args);
}, wait);
};
}
;
createArray(size) {
return new Array(size).fill(1);
}
convertToMoment(date, format, locale) {
let m;
if (!date) {
m = null;
}
else if (typeof date === 'string') {
m = moment(date, format);
}
else {
m = date.clone();
}
if (m && locale) {
m.locale(locale);
}
return m;
}
isDateValid(date, format, locale) {
if (date === '') {
return true;
}
if (date.length !== format.length) {
return false;
}
return moment.from(date, locale || 'fa', format).isValid();
// return moment(date, format, true).isValid();
}
// todo:: add unit test
getDefaultDisplayDate(current, selected, allowMultiSelect, minDate, locale) {
let m = moment();
if (current) {
m = current.clone();
}
else if (minDate && minDate.isAfter(moment())) {
m = minDate.clone();
}
else if (allowMultiSelect) {
if (selected && selected[selected.length]) {
m = selected[selected.length].clone();
}
}
else if (selected && selected[0]) {
m = selected[0].clone();
}
if (locale) {
m.locale(locale);
}
return m;
}
// todo:: add unit test
getInputType(value, allowMultiSelect) {
if (Array.isArray(value)) {
if (!value.length) {
return ECalendarValue.MomentArr;
}
else if (typeof value[0] === 'string') {
return ECalendarValue.StringArr;
}
else if (moment.isMoment(value[0])) {
return ECalendarValue.MomentArr;
}
}
else {
if (typeof value === 'string') {
return ECalendarValue.String;
}
else if (moment.isMoment(value)) {
return ECalendarValue.Moment;
}
}
return allowMultiSelect ? ECalendarValue.MomentArr : ECalendarValue.Moment;
}
// todo:: add unit test
convertToMomentArray(value, format, allowMultiSelect, locale) {
switch (this.getInputType(value, allowMultiSelect)) {
case (ECalendarValue.String):
return value ? [moment(value, format, true).locale(locale)] : [];
case (ECalendarValue.StringArr):
return value.map(v => v ? moment(v, format, true).locale(locale) : null).filter(Boolean);
case (ECalendarValue.Moment):
return value ? [value.clone().locale(locale)] : [];
case (ECalendarValue.MomentArr):
return (value || []).map(v => v.clone().locale(locale));
default:
return [];
}
}
// todo:: add unit test
convertFromMomentArray(format, value, convertTo, locale) {
switch (convertTo) {
case (ECalendarValue.String):
return value[0] && value[0].locale(locale).format(format);
case (ECalendarValue.StringArr):
return value.filter(Boolean).map(v => v.locale(locale).format(format));
case (ECalendarValue.Moment):
return value[0] ? value[0].clone().locale(locale) : value[0];
case (ECalendarValue.MomentArr):
return value ? value.map(v => v.clone().locale(locale)) : value;
default:
return value;
}
}
convertToString(value, format, locale) {
let tmpVal;
if (typeof value === 'string') {
tmpVal = [value];
}
else if (Array.isArray(value)) {
if (value.length) {
tmpVal = value.map((v) => {
return this.convertToMoment(v, format, locale).format(format);
});
}
else {
tmpVal = value;
}
}
else if (moment.isMoment(value)) {
tmpVal = [value.format(format)];
}
else {
return '';
}
return tmpVal.filter(Boolean).join(' | ');
}
// todo:: add unit test
clearUndefined(obj) {
if (!obj) {
return obj;
}
Object.keys(obj).forEach((key) => (obj[key] === undefined) && delete obj[key]);
return obj;
}
updateSelected(isMultiple, currentlySelected, date, granularity = 'day') {
const isSelected = !date.selected;
if (isMultiple) {
return isSelected
? currentlySelected.concat([date.date])
: currentlySelected.filter(d => !d.isSame(date.date, granularity));
}
else {
return isSelected ? [date.date] : [];
}
}
closestParent(element, selector) {
if (!element) {
return undefined;
}
const match = element.querySelector(selector);
return match || this.closestParent(element.parentElement, selector);
}
onlyTime(m) {
return m && moment.isMoment(m) && moment(m.format('HH:mm:ss'), 'HH:mm:ss');
}
granularityFromType(calendarType) {
switch (calendarType) {
case 'time':
return 'second';
case 'daytime':
return 'second';
default:
return calendarType;
}
}
createValidator({ minDate, maxDate, minTime, maxTime }, format, calendarType, locale) {
let isValid;
let value;
const validators = [];
const granularity = this.granularityFromType(calendarType);
if (minDate) {
const md = this.convertToMoment(minDate, format, locale);
validators.push({
key: 'minDate',
isValid: () => {
const _isValid = value.every(val => val.isSameOrAfter(md, granularity));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxDate) {
const md = this.convertToMoment(maxDate, format, locale);
validators.push({
key: 'maxDate',
isValid: () => {
const _isValid = value.every(val => val.isSameOrBefore(md, granularity));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (minTime) {
const md = this.onlyTime(this.convertToMoment(minTime, format, locale));
validators.push({
key: 'minTime',
isValid: () => {
const _isValid = value.every(val => this.onlyTime(val).isSameOrAfter(md));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
if (maxTime) {
const md = this.onlyTime(this.convertToMoment(maxTime, format, locale));
validators.push({
key: 'maxTime',
isValid: () => {
const _isValid = value.every(val => this.onlyTime(val).isSameOrBefore(md));
isValid = isValid ? _isValid : false;
return _isValid;
}
});
}
return (inputVal) => {
isValid = true;
value = this.convertToMomentArray(inputVal, format, true, locale).filter(Boolean);
if (!value.every(val => val.isValid())) {
return {
format: {
given: inputVal
}
};
}
const errors = validators.reduce((map, err) => {
if (!err.isValid()) {
map[err.key] = {
given: value
};
}
return map;
}, {});
return !isValid ? errors : null;
};
}
datesStringToStringArray(value) {
return (value || '').split('|').map(m => m.trim()).filter(Boolean);
}
getValidMomentArray(value, format, locale) {
return this.datesStringToStringArray(value)
.filter(d => this.isDateValid(d, format, locale))
.map(d => moment(d, format));
}
shouldShowCurrent(showGoToCurrent, mode, min, max) {
return showGoToCurrent &&
mode !== 'time' &&
this.isDateInRange(moment(), min, max);
}
isDateInRange(date, from, to) {
if (!from && !to) {
return true;
}
if (!from)
return date.isBefore(to, 'day');
if (!to)
return date.isAfter(from, 'day');
return date.isBetween(from, to, 'day', '[]');
}
convertPropsToMoment(obj, format, props, locale) {
props.forEach((prop) => {
if (obj.hasOwnProperty(prop)) {
obj[prop] = this.convertToMoment(obj[prop], format, locale);
}
});
}
shouldResetCurrentView(prevConf, currentConf) {
if (prevConf && currentConf) {
if (!prevConf.min && currentConf.min) {
return true;
}
else if (prevConf.min && currentConf.min && !prevConf.min.isSame(currentConf.min, 'd')) {
return true;
}
else if (!prevConf.max && currentConf.max) {
return true;
}
else if (prevConf.max && currentConf.max && !prevConf.max.isSame(currentConf.max, 'd')) {
return true;
}
return false;
}
return false;
}
getNativeElement(elem) {
if (!elem) {
return null;
}
else if (typeof elem === 'string') {
return document.querySelector(elem);
}
else {
return elem;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UtilsService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UtilsService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1qYWxhbGktZGF0ZS1waWNrZXIvc3JjL2xpYi9jb21tb24vc2VydmljZXMvdXRpbHMvdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7O0FBa0JuQyxNQUFNLE9BQU8sWUFBWTtJQUN2QixNQUFNLENBQUMsUUFBUSxDQUFDLElBQWMsRUFBRSxJQUFZO1FBQzFDLElBQUksT0FBTyxDQUFDO1FBQ1osT0FBTztZQUNMLE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsU0FBUyxDQUFDO1lBQ3ZDLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUM7SUFDSixDQUFDO0lBQUEsQ0FBQztJQUVGLFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBeUIsRUFBRSxNQUFjLEVBQUUsTUFBZTtRQUN4RSxJQUFJLENBQUMsQ0FBQztRQUNOLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDWCxDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZ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QyxRQUFRLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO2lCQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6RixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUEwQjtRQUN6QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLE9BQW9CLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDOytHQS9VVSxZQUFZO21IQUFaLFlBQVk7OzRGQUFaLFlBQVk7a0JBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0VDYWxlbmRhclZhbHVlfSBmcm9tICcuLi8uLi90eXBlcy9jYWxlbmRhci12YWx1ZS1lbnVtJztcbmltcG9ydCB7U2luZ2xlQ2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vLi4vdHlwZXMvc2luZ2xlLWNhbGVuZGFyLXZhbHVlJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ2phbGFsaS1tb21lbnQnO1xuaW1wb3J0IHtNb21lbnQsIE1vbWVudElucHV0LCB1bml0T2ZUaW1lfSBmcm9tICdqYWxhbGktbW9tZW50JztcbmltcG9ydCB7Q2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vLi4vdHlwZXMvY2FsZW5kYXItdmFsdWUnO1xuaW1wb3J0IHtJRGF0ZX0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGUubW9kZWwnO1xuaW1wb3J0IHtDYWxlbmRhck1vZGV9IGZyb20gJy4uLy4uL3R5cGVzL2NhbGVuZGFyLW1vZGUnO1xuaW1wb3J0IHtEYXRlVmFsaWRhdG9yfSBmcm9tICcuLi8uLi90eXBlcy92YWxpZGF0b3IudHlwZSc7XG5pbXBvcnQge0lDYWxlbmRhckludGVybmFsfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FsZW5kYXIubW9kZWwnO1xuXG4vL2NvbnN0IG1vbWVudCA9IG1vbWVudE5zO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVMaW1pdHMge1xuICBtaW5EYXRlPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgbWF4RGF0ZT86IFNpbmdsZUNhbGVuZGFyVmFsdWU7XG4gIG1pblRpbWU/OiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBtYXhUaW1lPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFV0aWxzU2VydmljZSB7XG4gIHN0YXRpYyBkZWJvdW5jZShmdW5jOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfSwgd2FpdCk7XG4gICAgfTtcbiAgfTtcblxuICBjcmVhdGVBcnJheShzaXplOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShzaXplKS5maWxsKDEpO1xuICB9XG5cbiAgY29udmVydFRvTW9tZW50KGRhdGU6IFNpbmdsZUNhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBNb21lbnQge1xuICAgIGxldCBtO1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgbSA9IG51bGw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG0gPSBtb21lbnQoZGF0ZSwgZm9ybWF0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IGRhdGUuY2xvbmUoKTtcbiAgICB9XG4gICAgaWYgKG0gJiYgbG9jYWxlKSB7XG4gICAgICBtLmxvY2FsZShsb2NhbGUpO1xuICAgIH1cbiAgICByZXR1cm4gbTtcbiAgfVxuXG4gIGlzRGF0ZVZhbGlkKGRhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXRlID09PSAnJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChkYXRlLmxlbmd0aCAhPT0gZm9ybWF0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbW9tZW50LmZyb20oZGF0ZSwgbG9jYWxlIHx8ICdmYScsIGZvcm1hdCkuaXNWYWxpZCgpO1xuICAgIC8vIHJldHVybiBtb21lbnQoZGF0ZSwgZm9ybWF0LCB0cnVlKS5pc1ZhbGlkKCk7XG4gIH1cblxuICAvLyB0b2RvOjogYWRkIHVuaXQgdGVzdFxuICBnZXREZWZhdWx0RGlzcGxheURhdGUoY3VycmVudDogTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IE1vbWVudFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dNdWx0aVNlbGVjdDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRhdGU6IE1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogc3RyaW5nKTogTW9tZW50IHtcbiAgICBsZXQgbSA9IG1vbWVudCgpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICBtID0gY3VycmVudC5jbG9uZSgpO1xuICAgIH0gZWxzZSBpZiAobWluRGF0ZSAmJiBtaW5EYXRlLmlzQWZ0ZXIobW9tZW50KCkpKSB7XG4gICAgICBtID0gbWluRGF0ZS5jbG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoYWxsb3dNdWx0aVNlbGVjdCkge1xuICAgICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkW3NlbGVjdGVkLmxlbmd0aF0pIHtcbiAgICAgICAgbSA9IHNlbGVjdGVkW3NlbGVjdGVkLmxlbmd0aF0uY2xvbmUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkWzBdKSB7XG4gICAgICBtID0gc2VsZWN0ZWRbMF0uY2xvbmUoKTtcbiAgICB9XG4gICAgaWYgKGxvY2FsZSkge1xuICAgICAgbS5sb2NhbGUobG9jYWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIG07XG4gIH1cblxuICAvLyB0b2RvOjogYWRkIHVuaXQgdGVzdFxuICBnZXRJbnB1dFR5cGUodmFsdWU6IENhbGVuZGFyVmFsdWUsIGFsbG93TXVsdGlTZWxlY3Q6IGJvb2xlYW4pOiBFQ2FsZW5kYXJWYWx1ZSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuTW9tZW50QXJyO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5TdHJpbmdBcnI7XG4gICAgICB9IGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZVswXSkpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLk1vbWVudEFycjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLlN0cmluZztcbiAgICAgIH0gZWxzZSBpZiAobW9tZW50LmlzTW9tZW50KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuTW9tZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxvd011bHRpU2VsZWN0ID8gRUNhbGVuZGFyVmFsdWUuTW9tZW50QXJyIDogRUNhbGVuZGFyVmFsdWUuTW9tZW50O1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgY29udmVydFRvTW9tZW50QXJyYXkodmFsdWU6IENhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nLCBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuLCBsb2NhbGU6IHN0cmluZyk6IE1vbWVudFtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuZ2V0SW5wdXRUeXBlKHZhbHVlLCBhbGxvd011bHRpU2VsZWN0KSkge1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlID8gW21vbWVudCg8c3RyaW5nPnZhbHVlLCBmb3JtYXQsIHRydWUpLmxvY2FsZShsb2NhbGUpXSA6IFtdO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyKTpcbiAgICAgICAgcmV0dXJuICg8c3RyaW5nW10+dmFsdWUpLm1hcCh2ID0+IHYgPyBtb21lbnQodiwgZm9ybWF0LCB0cnVlKS5sb2NhbGUobG9jYWxlKSA6IG51bGwpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudCk6XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IFsoPE1vbWVudD52YWx1ZSkuY2xvbmUoKS5sb2NhbGUobG9jYWxlKV0gOiBbXTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudEFycik6XG4gICAgICAgIHJldHVybiAoPE1vbWVudFtdPnZhbHVlIHx8IFtdKS5tYXAodiA9PiB2LmNsb25lKCkubG9jYWxlKGxvY2FsZSkpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNvbnZlcnRGcm9tTW9tZW50QXJyYXkoZm9ybWF0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1vbWVudFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzogRUNhbGVuZGFyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBzdHJpbmcpOiBDYWxlbmRhclZhbHVlIHtcbiAgICBzd2l0Y2ggKGNvbnZlcnRUbykge1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlWzBdICYmIHZhbHVlWzBdLmxvY2FsZShsb2NhbGUpLmZvcm1hdChmb3JtYXQpO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlLmZpbHRlcihCb29sZWFuKS5tYXAodiA9PiB2LmxvY2FsZShsb2NhbGUpLmZvcm1hdChmb3JtYXQpKTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudCk6XG4gICAgICAgIHJldHVybiB2YWx1ZVswXSA/IHZhbHVlWzBdLmNsb25lKCkubG9jYWxlKGxvY2FsZSkgOiB2YWx1ZVswXTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudEFycik6XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLm1hcCh2ID0+IHYuY2xvbmUoKS5sb2NhbGUobG9jYWxlKSkgOiB2YWx1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IENhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nLCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB0bXBWYWw6IHN0cmluZ1tdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRtcFZhbCA9IFt2YWx1ZV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCkge1xuICAgICAgICB0bXBWYWwgPSAoPFNpbmdsZUNhbGVuZGFyVmFsdWVbXT52YWx1ZSkubWFwKCh2KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRvTW9tZW50KHYsIGZvcm1hdCwgbG9jYWxlKS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0bXBWYWwgPSA8c3RyaW5nW10+dmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtb21lbnQuaXNNb21lbnQodmFsdWUpKSB7XG4gICAgICB0bXBWYWwgPSBbdmFsdWUuZm9ybWF0KGZvcm1hdCldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRtcFZhbC5maWx0ZXIoQm9vbGVhbikuam9pbignIHwgJyk7XG4gIH1cblxuICAvLyB0b2RvOjogYWRkIHVuaXQgdGVzdFxuICBjbGVhclVuZGVmaW5lZDxUPihvYmo6IFQpOiBUIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4gKG9ialtrZXldID09PSB1bmRlZmluZWQpICYmIGRlbGV0ZSBvYmpba2V5XSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHVwZGF0ZVNlbGVjdGVkKGlzTXVsdGlwbGU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgIGN1cnJlbnRseVNlbGVjdGVkOiBNb21lbnRbXSxcbiAgICAgICAgICAgICAgICAgZGF0ZTogSURhdGUsXG4gICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5OiB1bml0T2ZUaW1lLkJhc2UgPSAnZGF5Jyk6IE1vbWVudFtdIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gIWRhdGUuc2VsZWN0ZWQ7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBpc1NlbGVjdGVkXG4gICAgICAgID8gY3VycmVudGx5U2VsZWN0ZWQuY29uY2F0KFtkYXRlLmRhdGVdKVxuICAgICAgICA6IGN1cnJlbnRseVNlbGVjdGVkLmZpbHRlcihkID0+ICFkLmlzU2FtZShkYXRlLmRhdGUsIGdyYW51bGFyaXR5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc1NlbGVjdGVkID8gW2RhdGUuZGF0ZV0gOiBbXTtcbiAgICB9XG4gIH1cblxuICBjbG9zZXN0UGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSA8SFRNTEVsZW1lbnQ+ZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gbWF0Y2ggfHwgdGhpcy5jbG9zZXN0UGFyZW50KGVsZW1lbnQucGFyZW50RWxlbWVudCwgc2VsZWN0b3IpO1xuICB9XG5cbiAgb25seVRpbWUobTogTW9tZW50KTogTW9tZW50IHtcbiAgICByZXR1cm4gbSAmJiBtb21lbnQuaXNNb21lbnQobSkgJiYgbW9tZW50KG0uZm9ybWF0KCdISDptbTpzcycpLCAnSEg6bW06c3MnKTtcbiAgfVxuXG4gIGdyYW51bGFyaXR5RnJvbVR5cGUoY2FsZW5kYXJUeXBlOiBDYWxlbmRhck1vZGUpOiB1bml0T2ZUaW1lLkJhc2Uge1xuICAgIHN3aXRjaCAoY2FsZW5kYXJUeXBlKSB7XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgcmV0dXJuICdzZWNvbmQnO1xuICAgICAgY2FzZSAnZGF5dGltZSc6XG4gICAgICAgIHJldHVybiAnc2Vjb25kJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjYWxlbmRhclR5cGU7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVmFsaWRhdG9yKHttaW5EYXRlLCBtYXhEYXRlLCBtaW5UaW1lLCBtYXhUaW1lfTogRGF0ZUxpbWl0cyxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgY2FsZW5kYXJUeXBlOiBDYWxlbmRhck1vZGUsXG4gICAgICAgICAgICAgICAgICBsb2NhbGU6IHN0cmluZyk6IERhdGVWYWxpZGF0b3Ige1xuICAgIGxldCBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGxldCB2YWx1ZTogTW9tZW50W107XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5ncmFudWxhcml0eUZyb21UeXBlKGNhbGVuZGFyVHlwZSk7XG5cbiAgICBpZiAobWluRGF0ZSkge1xuICAgICAgY29uc3QgbWQgPSB0aGlzLmNvbnZlcnRUb01vbWVudChtaW5EYXRlLCBmb3JtYXQsIGxvY2FsZSk7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBrZXk6ICdtaW5EYXRlJyxcbiAgICAgICAgaXNWYWxpZDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IF9pc1ZhbGlkID0gdmFsdWUuZXZlcnkodmFsID0+IHZhbC5pc1NhbWVPckFmdGVyKG1kLCBncmFudWxhcml0eSkpO1xuICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkID8gX2lzVmFsaWQgOiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gX2lzVmFsaWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtYXhEYXRlKSB7XG4gICAgICBjb25zdCBtZCA9IHRoaXMuY29udmVydFRvTW9tZW50KG1heERhdGUsIGZvcm1hdCwgbG9jYWxlKTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21heERhdGUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdmFsLmlzU2FtZU9yQmVmb3JlKG1kLCBncmFudWxhcml0eSkpO1xuICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkID8gX2lzVmFsaWQgOiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gX2lzVmFsaWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtaW5UaW1lKSB7XG4gICAgICBjb25zdCBtZCA9IHRoaXMub25seVRpbWUodGhpcy5jb252ZXJ0VG9Nb21lbnQobWluVGltZSwgZm9ybWF0LCBsb2NhbGUpKTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21pblRpbWUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdGhpcy5vbmx5VGltZSh2YWwpLmlzU2FtZU9yQWZ0ZXIobWQpKTtcbiAgICAgICAgICBpc1ZhbGlkID0gaXNWYWxpZCA/IF9pc1ZhbGlkIDogZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIF9pc1ZhbGlkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGltZSkge1xuICAgICAgY29uc3QgbWQgPSB0aGlzLm9ubHlUaW1lKHRoaXMuY29udmVydFRvTW9tZW50KG1heFRpbWUsIGZvcm1hdCwgbG9jYWxlKSk7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBrZXk6ICdtYXhUaW1lJyxcbiAgICAgICAgaXNWYWxpZDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IF9pc1ZhbGlkID0gdmFsdWUuZXZlcnkodmFsID0+IHRoaXMub25seVRpbWUodmFsKS5pc1NhbWVPckJlZm9yZShtZCkpO1xuICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkID8gX2lzVmFsaWQgOiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gX2lzVmFsaWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoaW5wdXRWYWw6IENhbGVuZGFyVmFsdWUpID0+IHtcbiAgICAgIGlzVmFsaWQgPSB0cnVlO1xuXG4gICAgICB2YWx1ZSA9IHRoaXMuY29udmVydFRvTW9tZW50QXJyYXkoaW5wdXRWYWwsIGZvcm1hdCwgdHJ1ZSwgbG9jYWxlKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgIGlmICghdmFsdWUuZXZlcnkodmFsID0+IHZhbC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICBnaXZlbjogaW5wdXRWYWxcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRvcnMucmVkdWNlKChtYXAsIGVycikgPT4ge1xuICAgICAgICBpZiAoIWVyci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICBtYXBbZXJyLmtleV0gPSB7XG4gICAgICAgICAgICBnaXZlbjogdmFsdWVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcmV0dXJuICFpc1ZhbGlkID8gZXJyb3JzIDogbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgZGF0ZXNTdHJpbmdUb1N0cmluZ0FycmF5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh2YWx1ZSB8fCAnJykuc3BsaXQoJ3wnKS5tYXAobSA9PiBtLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgZ2V0VmFsaWRNb21lbnRBcnJheSh2YWx1ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcpOiBNb21lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZXNTdHJpbmdUb1N0cmluZ0FycmF5KHZhbHVlKVxuICAgICAgLmZpbHRlcihkID0+IHRoaXMuaXNEYXRlVmFsaWQoZCwgZm9ybWF0LCBsb2NhbGUpKVxuICAgICAgLm1hcChkID0+IG1vbWVudChkLCBmb3JtYXQpKTtcbiAgfVxuXG4gIHNob3VsZFNob3dDdXJyZW50KHNob3dHb1RvQ3VycmVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogQ2FsZW5kYXJNb2RlLFxuICAgICAgICAgICAgICAgICAgICBtaW46IE1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBNb21lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2hvd0dvVG9DdXJyZW50ICYmXG4gICAgICBtb2RlICE9PSAndGltZScgJiZcbiAgICAgIHRoaXMuaXNEYXRlSW5SYW5nZShtb21lbnQoKSwgbWluLCBtYXgpO1xuICB9XG5cbiAgaXNEYXRlSW5SYW5nZShkYXRlOiBNb21lbnQsIGZyb206IE1vbWVudCwgdG86IE1vbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghZnJvbSAmJiAhdG8pIHtyZXR1cm4gdHJ1ZX1cbiAgICBpZiAoIWZyb20pIHJldHVybiBkYXRlLmlzQmVmb3JlKHRvLCAnZGF5Jyk7XG4gICAgaWYgKCF0bykgcmV0dXJuIGRhdGUuaXNBZnRlcihmcm9tLCAnZGF5Jyk7XG4gICAgcmV0dXJuIGRhdGUuaXNCZXR3ZWVuKGZyb20sIHRvLCAnZGF5JywgJ1tdJyk7XG4gIH1cblxuICBjb252ZXJ0UHJvcHNUb01vbWVudChvYmo6IHtba2V5OiBzdHJpbmddOiBhbnl9LCBmb3JtYXQ6IHN0cmluZywgcHJvcHM6IHN0cmluZ1tdLCBsb2NhbGU/OiBzdHJpbmcpIHtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIG9ialtwcm9wXSA9IHRoaXMuY29udmVydFRvTW9tZW50KG9ialtwcm9wXSwgZm9ybWF0LCBsb2NhbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2hvdWxkUmVzZXRDdXJyZW50VmlldzxUIGV4dGVuZHMgSUNhbGVuZGFySW50ZXJuYWw+KHByZXZDb25mOiBULCBjdXJyZW50Q29uZjogVCk6IGJvb2xlYW4ge1xuICAgIGlmIChwcmV2Q29uZiAmJiBjdXJyZW50Q29uZikge1xuICAgICAgaWYgKCFwcmV2Q29uZi5taW4gJiYgY3VycmVudENvbmYubWluKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwcmV2Q29uZi5taW4gJiYgY3VycmVudENvbmYubWluICYmICFwcmV2Q29uZi5taW4uaXNTYW1lKGN1cnJlbnRDb25mLm1pbiwgJ2QnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXByZXZDb25mLm1heCAmJiBjdXJyZW50Q29uZi5tYXgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHByZXZDb25mLm1heCAmJiBjdXJyZW50Q29uZi5tYXggJiYgIXByZXZDb25mLm1heC5pc1NhbWUoY3VycmVudENvbmYubWF4LCAnZCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0TmF0aXZlRWxlbWVudChlbGVtOiBIVE1MRWxlbWVudCB8IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gPEhUTUxFbGVtZW50PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgfVxufVxuIl19