UNPKG

ng2-date-picker

Version:

[![Build Status](https://travis-ci.org/vlio20/angular-datepicker.svg?branch=master)](https://travis-ci.org/vlio20/angular-datepicker) [![Backers on Open Collective](https://opencollective.com/angular-datepicker/backers/badge.svg)](#backers) [![Sponsor

306 lines 38.6 kB
import * as tslib_1 from "tslib"; import { ECalendarValue } from '../../types/calendar-value-enum'; import { Injectable } from '@angular/core'; import * as momentNs from 'moment'; var moment = momentNs; var UtilsService = /** @class */ (function () { function UtilsService() { } UtilsService.debounce = function (func, wait) { var timeout; return function () { var context = this, args = arguments; timeout = clearTimeout(timeout); setTimeout(function () { func.apply(context, args); }, wait); }; }; ; UtilsService.prototype.createArray = function (size) { return new Array(size).fill(1); }; UtilsService.prototype.convertToMoment = function (date, format) { if (!date) { return null; } else if (typeof date === 'string') { return moment(date, format); } else { return date.clone(); } }; UtilsService.prototype.isDateValid = function (date, format) { if (date === '') { return true; } return moment(date, format, true).isValid(); }; // todo:: add unit test UtilsService.prototype.getDefaultDisplayDate = function (current, selected, allowMultiSelect, minDate) { if (current) { return current.clone(); } else if (minDate && minDate.isAfter(moment())) { return minDate.clone(); } else if (allowMultiSelect) { if (selected && selected[selected.length]) { return selected[selected.length].clone(); } } else if (selected && selected[0]) { return selected[0].clone(); } return moment(); }; // todo:: add unit test UtilsService.prototype.getInputType = function (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 UtilsService.prototype.convertToMomentArray = function (value, format, allowMultiSelect) { switch (this.getInputType(value, allowMultiSelect)) { case (ECalendarValue.String): return value ? [moment(value, format, true)] : []; case (ECalendarValue.StringArr): return value.map(function (v) { return v ? moment(v, format, true) : null; }).filter(Boolean); case (ECalendarValue.Moment): return value ? [value.clone()] : []; case (ECalendarValue.MomentArr): return (value || []).map(function (v) { return v.clone(); }); default: return []; } }; // todo:: add unit test UtilsService.prototype.convertFromMomentArray = function (format, value, convertTo) { switch (convertTo) { case (ECalendarValue.String): return value[0] && value[0].format(format); case (ECalendarValue.StringArr): return value.filter(Boolean).map(function (v) { return v.format(format); }); case (ECalendarValue.Moment): return value[0] ? value[0].clone() : value[0]; case (ECalendarValue.MomentArr): return value ? value.map(function (v) { return v.clone(); }) : value; default: return value; } }; UtilsService.prototype.convertToString = function (value, format) { var _this = this; var tmpVal; if (typeof value === 'string') { tmpVal = [value]; } else if (Array.isArray(value)) { if (value.length) { tmpVal = value.map(function (v) { return _this.convertToMoment(v, format).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 UtilsService.prototype.clearUndefined = function (obj) { if (!obj) { return obj; } Object.keys(obj).forEach(function (key) { return (obj[key] === undefined) && delete obj[key]; }); return obj; }; UtilsService.prototype.updateSelected = function (isMultiple, currentlySelected, date, granularity) { if (granularity === void 0) { granularity = 'day'; } if (isMultiple) { return !date.selected ? currentlySelected.concat([date.date]) : currentlySelected.filter(function (d) { return !d.isSame(date.date, granularity); }); } else { return !date.selected ? [date.date] : []; } }; UtilsService.prototype.closestParent = function (element, selector) { if (!element) { return undefined; } var match = element.querySelector(selector); return match || this.closestParent(element.parentElement, selector); }; UtilsService.prototype.onlyTime = function (m) { return m && moment.isMoment(m) && moment(m.format('HH:mm:ss'), 'HH:mm:ss'); }; UtilsService.prototype.granularityFromType = function (calendarType) { switch (calendarType) { case 'time': return 'second'; case 'daytime': return 'second'; default: return calendarType; } }; UtilsService.prototype.createValidator = function (_a, format, calendarType) { var _this = this; var minDate = _a.minDate, maxDate = _a.maxDate, minTime = _a.minTime, maxTime = _a.maxTime; var isValid; var value; var validators = []; var granularity = this.granularityFromType(calendarType); if (minDate) { var md_1 = this.convertToMoment(minDate, format); validators.push({ key: 'minDate', isValid: function () { var _isValid = value.every(function (val) { return val.isSameOrAfter(md_1, granularity); }); isValid = isValid ? _isValid : false; return _isValid; } }); } if (maxDate) { var md_2 = this.convertToMoment(maxDate, format); validators.push({ key: 'maxDate', isValid: function () { var _isValid = value.every(function (val) { return val.isSameOrBefore(md_2, granularity); }); isValid = isValid ? _isValid : false; return _isValid; } }); } if (minTime) { var md_3 = this.onlyTime(this.convertToMoment(minTime, format)); validators.push({ key: 'minTime', isValid: function () { var _isValid = value.every(function (val) { return _this.onlyTime(val).isSameOrAfter(md_3); }); isValid = isValid ? _isValid : false; return _isValid; } }); } if (maxTime) { var md_4 = this.onlyTime(this.convertToMoment(maxTime, format)); validators.push({ key: 'maxTime', isValid: function () { var _isValid = value.every(function (val) { return _this.onlyTime(val).isSameOrBefore(md_4); }); isValid = isValid ? _isValid : false; return _isValid; } }); } return function (inputVal) { isValid = true; value = _this.convertToMomentArray(inputVal, format, true).filter(Boolean); if (!value.every(function (val) { return val.isValid(); })) { return { format: { given: inputVal } }; } var errors = validators.reduce(function (map, err) { if (!err.isValid()) { map[err.key] = { given: value }; } return map; }, {}); return !isValid ? errors : null; }; }; UtilsService.prototype.datesStringToStringArray = function (value) { return (value || '').split('|').map(function (m) { return m.trim(); }).filter(Boolean); }; UtilsService.prototype.getValidMomentArray = function (value, format) { var _this = this; return this.datesStringToStringArray(value) .filter(function (d) { return _this.isDateValid(d, format); }) .map(function (d) { return moment(d, format); }); }; UtilsService.prototype.shouldShowCurrent = function (showGoToCurrent, mode, min, max) { return showGoToCurrent && mode !== 'time' && this.isDateInRange(moment(), min, max); }; UtilsService.prototype.isDateInRange = function (date, from, to) { return date.isBetween(from, to, 'day', '[]'); }; UtilsService.prototype.convertPropsToMoment = function (obj, format, props) { var _this = this; props.forEach(function (prop) { if (obj.hasOwnProperty(prop)) { obj[prop] = _this.convertToMoment(obj[prop], format); } }); }; UtilsService.prototype.shouldResetCurrentView = function (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; }; UtilsService.prototype.getNativeElement = function (elem) { if (!elem) { return null; } else if (typeof elem === 'string') { return document.querySelector(elem); } else { return elem; } }; UtilsService = tslib_1.__decorate([ Injectable() ], UtilsService); return UtilsService; }()); export { UtilsService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nMi1kYXRlLXBpY2tlci8iLCJzb3VyY2VzIjpbImNvbW1vbi9zZXJ2aWNlcy91dGlscy91dGlscy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLFFBQVEsQ0FBQztBQVFuQyxJQUFNLE1BQU0sR0FBRyxRQUFRLENBQUM7QUFVeEI7SUFBQTtJQThUQSxDQUFDO0lBN1RRLHFCQUFRLEdBQWYsVUFBZ0IsSUFBYyxFQUFFLElBQVk7UUFDMUMsSUFBSSxPQUFPLENBQUM7UUFDWixPQUFPO1lBQ0wsSUFBTSxPQUFPLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxTQUFTLENBQUM7WUFDdkMsT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxVQUFVLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUFBLENBQUM7SUFFRixrQ0FBVyxHQUFYLFVBQVksSUFBWTtRQUN0QixPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsc0NBQWUsR0FBZixVQUFnQixJQUF5QixFQUFFLE1BQWM7UUFDdkQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNuQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDN0I7YUFB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QU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx1Q0FBZ0IsR0FBaEIsVUFBaUIsSUFBMEI7UUFDekMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNuQyxPQUFvQixRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQTdUVSxZQUFZO1FBRHhCLFVBQVUsRUFBRTtPQUNBLFlBQVksQ0E4VHhCO0lBQUQsbUJBQUM7Q0FBQSxBQTlURCxJQThUQztTQTlUWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFQ2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vLi4vdHlwZXMvY2FsZW5kYXItdmFsdWUtZW51bSc7XG5pbXBvcnQge1NpbmdsZUNhbGVuZGFyVmFsdWV9IGZyb20gJy4uLy4uL3R5cGVzL3NpbmdsZS1jYWxlbmRhci12YWx1ZSc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgbW9tZW50TnMgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7TW9tZW50LCB1bml0T2ZUaW1lfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtDYWxlbmRhclZhbHVlfSBmcm9tICcuLi8uLi90eXBlcy9jYWxlbmRhci12YWx1ZSc7XG5pbXBvcnQge0lEYXRlfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZS5tb2RlbCc7XG5pbXBvcnQge0NhbGVuZGFyTW9kZX0gZnJvbSAnLi4vLi4vdHlwZXMvY2FsZW5kYXItbW9kZSc7XG5pbXBvcnQge0RhdGVWYWxpZGF0b3J9IGZyb20gJy4uLy4uL3R5cGVzL3ZhbGlkYXRvci50eXBlJztcbmltcG9ydCB7SUNhbGVuZGFySW50ZXJuYWx9IGZyb20gJy4uLy4uL21vZGVscy9jYWxlbmRhci5tb2RlbCc7XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudE5zO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVMaW1pdHMge1xuICBtaW5EYXRlPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbiAgbWF4RGF0ZT86IFNpbmdsZUNhbGVuZGFyVmFsdWU7XG4gIG1pblRpbWU/OiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBtYXhUaW1lPzogU2luZ2xlQ2FsZW5kYXJWYWx1ZTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFV0aWxzU2VydmljZSB7XG4gIHN0YXRpYyBkZWJvdW5jZShmdW5jOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfSwgd2FpdCk7XG4gICAgfTtcbiAgfTtcblxuICBjcmVhdGVBcnJheShzaXplOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShzaXplKS5maWxsKDEpO1xuICB9XG5cbiAgY29udmVydFRvTW9tZW50KGRhdGU6IFNpbmdsZUNhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nKTogTW9tZW50IHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbW9tZW50KGRhdGUsIGZvcm1hdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkYXRlLmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgaXNEYXRlVmFsaWQoZGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXRlID09PSAnJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudChkYXRlLCBmb3JtYXQsIHRydWUpLmlzVmFsaWQoKTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGdldERlZmF1bHREaXNwbGF5RGF0ZShjdXJyZW50OiBNb21lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogTW9tZW50W10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluRGF0ZTogTW9tZW50KTogTW9tZW50IHtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKG1pbkRhdGUgJiYgbWluRGF0ZS5pc0FmdGVyKG1vbWVudCgpKSkge1xuICAgICAgcmV0dXJuIG1pbkRhdGUuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKGFsbG93TXVsdGlTZWxlY3QpIHtcbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZFtzZWxlY3RlZC5sZW5ndGhdKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFtzZWxlY3RlZC5sZW5ndGhdLmNsb25lKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZFswXSkge1xuICAgICAgcmV0dXJuIHNlbGVjdGVkWzBdLmNsb25lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudCgpO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RcbiAgZ2V0SW5wdXRUeXBlKHZhbHVlOiBDYWxlbmRhclZhbHVlLCBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuKTogRUNhbGVuZGFyVmFsdWUge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLk1vbWVudEFycjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyO1xuICAgICAgfSBlbHNlIGlmIChtb21lbnQuaXNNb21lbnQodmFsdWVbMF0pKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5Nb21lbnRBcnI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBFQ2FsZW5kYXJWYWx1ZS5TdHJpbmc7XG4gICAgICB9IGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxlbmRhclZhbHVlLk1vbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsb3dNdWx0aVNlbGVjdCA/IEVDYWxlbmRhclZhbHVlLk1vbWVudEFyciA6IEVDYWxlbmRhclZhbHVlLk1vbWVudDtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNvbnZlcnRUb01vbWVudEFycmF5KHZhbHVlOiBDYWxlbmRhclZhbHVlLCBmb3JtYXQ6IHN0cmluZywgYWxsb3dNdWx0aVNlbGVjdDogYm9vbGVhbik6IE1vbWVudFtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuZ2V0SW5wdXRUeXBlKHZhbHVlLCBhbGxvd011bHRpU2VsZWN0KSkge1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlID8gW21vbWVudCg8c3RyaW5nPnZhbHVlLCBmb3JtYXQsIHRydWUpXSA6IFtdO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyKTpcbiAgICAgICAgcmV0dXJuICg8c3RyaW5nW10+dmFsdWUpLm1hcCh2ID0+IHYgPyBtb21lbnQodiwgZm9ybWF0LCB0cnVlKSA6IG51bGwpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudCk6XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IFsoPE1vbWVudD52YWx1ZSkuY2xvbmUoKV0gOiBbXTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudEFycik6XG4gICAgICAgIHJldHVybiAoPE1vbWVudFtdPnZhbHVlIHx8IFtdKS5tYXAodiA9PiB2LmNsb25lKCkpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNvbnZlcnRGcm9tTW9tZW50QXJyYXkoZm9ybWF0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1vbWVudFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzogRUNhbGVuZGFyVmFsdWUpOiBDYWxlbmRhclZhbHVlIHtcbiAgICBzd2l0Y2ggKGNvbnZlcnRUbykge1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlWzBdICYmIHZhbHVlWzBdLmZvcm1hdChmb3JtYXQpO1xuICAgICAgY2FzZSAoRUNhbGVuZGFyVmFsdWUuU3RyaW5nQXJyKTpcbiAgICAgICAgcmV0dXJuIHZhbHVlLmZpbHRlcihCb29sZWFuKS5tYXAodiA9PiB2LmZvcm1hdChmb3JtYXQpKTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudCk6XG4gICAgICAgIHJldHVybiB2YWx1ZVswXSA/IHZhbHVlWzBdLmNsb25lKCkgOiB2YWx1ZVswXTtcbiAgICAgIGNhc2UgKEVDYWxlbmRhclZhbHVlLk1vbWVudEFycik6XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLm1hcCh2ID0+IHYuY2xvbmUoKSkgOiB2YWx1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IENhbGVuZGFyVmFsdWUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgdG1wVmFsOiBzdHJpbmdbXTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0bXBWYWwgPSBbdmFsdWVdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdG1wVmFsID0gKDxTaW5nbGVDYWxlbmRhclZhbHVlW10+dmFsdWUpLm1hcCgodikgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUb01vbWVudCh2LCBmb3JtYXQpLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRtcFZhbCA9IDxzdHJpbmdbXT52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcbiAgICAgIHRtcFZhbCA9IFt2YWx1ZS5mb3JtYXQoZm9ybWF0KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdG1wVmFsLmZpbHRlcihCb29sZWFuKS5qb2luKCcgfCAnKTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0XG4gIGNsZWFyVW5kZWZpbmVkPFQ+KG9iajogVCk6IFQge1xuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoa2V5KSA9PiAob2JqW2tleV0gPT09IHVuZGVmaW5lZCkgJiYgZGVsZXRlIG9ialtrZXldKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgdXBkYXRlU2VsZWN0ZWQoaXNNdWx0aXBsZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgY3VycmVudGx5U2VsZWN0ZWQ6IE1vbWVudFtdLFxuICAgICAgICAgICAgICAgICBkYXRlOiBJRGF0ZSxcbiAgICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHk6IHVuaXRPZlRpbWUuQmFzZSA9ICdkYXknKTogTW9tZW50W10ge1xuICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICByZXR1cm4gIWRhdGUuc2VsZWN0ZWRcbiAgICAgICAgPyBjdXJyZW50bHlTZWxlY3RlZC5jb25jYXQoW2RhdGUuZGF0ZV0pXG4gICAgICAgIDogY3VycmVudGx5U2VsZWN0ZWQuZmlsdGVyKGQgPT4gIWQuaXNTYW1lKGRhdGUuZGF0ZSwgZ3JhbnVsYXJpdHkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICFkYXRlLnNlbGVjdGVkID8gW2RhdGUuZGF0ZV0gOiBbXTtcbiAgICB9XG4gIH1cblxuICBjbG9zZXN0UGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSA8SFRNTEVsZW1lbnQ+ZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gbWF0Y2ggfHwgdGhpcy5jbG9zZXN0UGFyZW50KGVsZW1lbnQucGFyZW50RWxlbWVudCwgc2VsZWN0b3IpO1xuICB9XG5cbiAgb25seVRpbWUobTogTW9tZW50KTogTW9tZW50IHtcbiAgICByZXR1cm4gbSAmJiBtb21lbnQuaXNNb21lbnQobSkgJiYgbW9tZW50KG0uZm9ybWF0KCdISDptbTpzcycpLCAnSEg6bW06c3MnKTtcbiAgfVxuXG4gIGdyYW51bGFyaXR5RnJvbVR5cGUoY2FsZW5kYXJUeXBlOiBDYWxlbmRhck1vZGUpOiB1bml0T2ZUaW1lLkJhc2Uge1xuICAgIHN3aXRjaCAoY2FsZW5kYXJUeXBlKSB7XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgcmV0dXJuICdzZWNvbmQnO1xuICAgICAgY2FzZSAnZGF5dGltZSc6XG4gICAgICAgIHJldHVybiAnc2Vjb25kJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjYWxlbmRhclR5cGU7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVmFsaWRhdG9yKHttaW5EYXRlLCBtYXhEYXRlLCBtaW5UaW1lLCBtYXhUaW1lfTogRGF0ZUxpbWl0cyxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgY2FsZW5kYXJUeXBlOiBDYWxlbmRhck1vZGUpOiBEYXRlVmFsaWRhdG9yIHtcbiAgICBsZXQgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBsZXQgdmFsdWU6IE1vbWVudFtdO1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBjb25zdCBncmFudWxhcml0eSA9IHRoaXMuZ3JhbnVsYXJpdHlGcm9tVHlwZShjYWxlbmRhclR5cGUpO1xuXG4gICAgaWYgKG1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5jb252ZXJ0VG9Nb21lbnQobWluRGF0ZSwgZm9ybWF0KTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21pbkRhdGUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdmFsLmlzU2FtZU9yQWZ0ZXIobWQsIGdyYW51bGFyaXR5KSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5jb252ZXJ0VG9Nb21lbnQobWF4RGF0ZSwgZm9ybWF0KTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21heERhdGUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdmFsLmlzU2FtZU9yQmVmb3JlKG1kLCBncmFudWxhcml0eSkpO1xuICAgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkID8gX2lzVmFsaWQgOiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gX2lzVmFsaWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtaW5UaW1lKSB7XG4gICAgICBjb25zdCBtZCA9IHRoaXMub25seVRpbWUodGhpcy5jb252ZXJ0VG9Nb21lbnQobWluVGltZSwgZm9ybWF0KSk7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBrZXk6ICdtaW5UaW1lJyxcbiAgICAgICAgaXNWYWxpZDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IF9pc1ZhbGlkID0gdmFsdWUuZXZlcnkodmFsID0+IHRoaXMub25seVRpbWUodmFsKS5pc1NhbWVPckFmdGVyKG1kKSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1heFRpbWUpIHtcbiAgICAgIGNvbnN0IG1kID0gdGhpcy5vbmx5VGltZSh0aGlzLmNvbnZlcnRUb01vbWVudChtYXhUaW1lLCBmb3JtYXQpKTtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGtleTogJ21heFRpbWUnLFxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgX2lzVmFsaWQgPSB2YWx1ZS5ldmVyeSh2YWwgPT4gdGhpcy5vbmx5VGltZSh2YWwpLmlzU2FtZU9yQmVmb3JlKG1kKSk7XG4gICAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWQgPyBfaXNWYWxpZCA6IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBfaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChpbnB1dFZhbDogQ2FsZW5kYXJWYWx1ZSkgPT4ge1xuICAgICAgaXNWYWxpZCA9IHRydWU7XG5cbiAgICAgIHZhbHVlID0gdGhpcy5jb252ZXJ0VG9Nb21lbnRBcnJheShpbnB1dFZhbCwgZm9ybWF0LCB0cnVlKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgIGlmICghdmFsdWUuZXZlcnkodmFsID0+IHZhbC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICBnaXZlbjogaW5wdXRWYWxcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRvcnMucmVkdWNlKChtYXAsIGVycikgPT4ge1xuICAgICAgICBpZiAoIWVyci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICBtYXBbZXJyLmtleV0gPSB7XG4gICAgICAgICAgICBnaXZlbjogdmFsdWVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcmV0dXJuICFpc1ZhbGlkID8gZXJyb3JzIDogbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgZGF0ZXNTdHJpbmdUb1N0cmluZ0FycmF5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh2YWx1ZSB8fCAnJykuc3BsaXQoJ3wnKS5tYXAobSA9PiBtLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgZ2V0VmFsaWRNb21lbnRBcnJheSh2YWx1ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IE1vbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlc1N0cmluZ1RvU3RyaW5nQXJyYXkodmFsdWUpXG4gICAgICAuZmlsdGVyKGQgPT4gdGhpcy5pc0RhdGVWYWxpZChkLCBmb3JtYXQpKVxuICAgICAgLm1hcChkID0+IG1vbWVudChkLCBmb3JtYXQpKTtcbiAgfVxuXG4gIHNob3VsZFNob3dDdXJyZW50KHNob3dHb1RvQ3VycmVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogQ2FsZW5kYXJNb2RlLFxuICAgICAgICAgICAgICAgICAgICBtaW46IE1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBNb21lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2hvd0dvVG9DdXJyZW50ICYmXG4gICAgICBtb2RlICE9PSAndGltZScgJiZcbiAgICAgIHRoaXMuaXNEYXRlSW5SYW5nZShtb21lbnQoKSwgbWluLCBtYXgpO1xuICB9XG5cbiAgaXNEYXRlSW5SYW5nZShkYXRlOiBNb21lbnQsIGZyb206IE1vbWVudCwgdG86IE1vbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRlLmlzQmV0d2Vlbihmcm9tLCB0bywgJ2RheScsICdbXScpO1xuICB9XG5cbiAgY29udmVydFByb3BzVG9Nb21lbnQob2JqOiB7W2tleTogc3RyaW5nXTogYW55fSwgZm9ybWF0OiBzdHJpbmcsIHByb3BzOiBzdHJpbmdbXSkge1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgb2JqW3Byb3BdID0gdGhpcy5jb252ZXJ0VG9Nb21lbnQob2JqW3Byb3BdLCBmb3JtYXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2hvdWxkUmVzZXRDdXJyZW50VmlldzxUIGV4dGVuZHMgSUNhbGVuZGFySW50ZXJuYWw+KHByZXZDb25mOiBULCBjdXJyZW50Q29uZjogVCk6IGJvb2xlYW4ge1xuICAgIGlmIChwcmV2Q29uZiAmJiBjdXJyZW50Q29uZikge1xuICAgICAgaWYgKCFwcmV2Q29uZi5taW4gJiYgY3VycmVudENvbmYubWluKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwcmV2Q29uZi5taW4gJiYgY3VycmVudENvbmYubWluICYmICFwcmV2Q29uZi5taW4uaXNTYW1lKGN1cnJlbnRDb25mLm1pbiwgJ2QnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXByZXZDb25mLm1heCAmJiBjdXJyZW50Q29uZi5tYXgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHByZXZDb25mLm1heCAmJiBjdXJyZW50Q29uZi5tYXggJiYgIXByZXZDb25mLm1heC5pc1NhbWUoY3VycmVudENvbmYubWF4LCAnZCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0TmF0aXZlRWxlbWVudChlbGVtOiBIVE1MRWxlbWVudCB8IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gPEhUTUxFbGVtZW50PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgfVxufVxuIl19