air-lib
Version:
This is Air's angular component library
603 lines • 60.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import * as moment_ from 'moment';
import * as i0 from "@angular/core";
/** @type {?} */
const moment = moment_;
export class DateService {
constructor() { }
/**
* @param {?} value
* @param {?} locale
* @return {?}
*/
dateFormatString(value, locale) {
if (!value) {
return '';
}
/** @type {?} */
const date = new Date(value + '+0000');
return this.formatDate(date, locale);
}
/**
* @param {?} date
* @return {?}
*/
getDayAndMonth(date) {
return moment(date).format('D MMMM');
}
/**
* @param {?} dateStr
* @param {?} locale
* @return {?}
*/
formatDate(dateStr, locale) {
return this.getCustomDateWithTitle(dateStr, locale, true);
}
/**
* @param {?} fromUtc
* @param {?} toUtc
* @param {?} locale
* @return {?}
*/
formatPeriod(fromUtc, toUtc, locale) {
return this.getCustomPeriod({ 'FromUtc': fromUtc, 'ToUtc': toUtc }, locale);
}
/**
* @param {?} date
* @param {?} locale
* @return {?}
*/
formatTime(date, locale) {
if (!locale) {
locale = 'ru';
}
moment.locale(locale);
/** @type {?} */
const mask = 'HH:mm';
/** @type {?} */
const utcDate = moment.utc(date).toDate();
/** @type {?} */
const fDate = moment(utcDate).local().format(mask);
return fDate;
}
/**
* @param {?} date
* @param {?} locale
* @param {?} isFullMonth
* @return {?}
*/
getCustomDate(date, locale, isFullMonth) {
if (!locale) {
locale = 'ru';
}
moment.locale(locale);
/** @type {?} */
const isCurrentYear = moment(date).isSame(moment(), 'year');
/** @type {?} */
let mask = 'D MMM';
if (isFullMonth) {
mask = mask.concat('M');
}
if (!isCurrentYear) {
mask = mask.concat(' YYYY');
}
/** @type {?} */
const fDate = moment(date).format(mask);
return fDate;
}
/**
* @param {?} date
* @param {?} locale
* @param {?} isFullMonth
* @return {?}
*/
getCustomDateWithTitle(date, locale, isFullMonth) {
switch (locale) {
case 'ru':
case 'ru-RU':
locale = 'ru';
break;
case 'en':
case 'en-US':
locale = 'en';
break;
case 'ua':
case 'ua-UA':
locale = 'ua';
break;
default:
locale = 'ru';
break;
}
/** @type {?} */
const localeDays = {
'en': {
'yesterday': 'yesterday',
'today': 'today'
},
'ru': {
'yesterday': 'вчера',
'today': 'сегодня'
},
'ua': {
'yesterday': 'вчора',
'today': 'сьогодні'
}
};
moment.locale(locale);
/** @type {?} */
const isToday = moment(date).isSame(moment(), 'day');
/** @type {?} */
const isYesterday = moment(date).isSame(moment().subtract(1, 'days'), 'day');
/** @type {?} */
const today = localeDays[locale]['today'];
/** @type {?} */
const yesterday = localeDays[locale]['yesterday'];
/** @type {?} */
let fDate = this.getCustomDate(date, locale, isFullMonth);
if (isToday) {
fDate = today;
}
if (isYesterday) {
fDate = yesterday;
}
return fDate;
}
/**
* @param {?} period
* @param {?} locale
* @return {?}
*/
getCustomPeriod(period, locale) {
if (!locale) {
locale = 'ru';
}
switch (locale) {
case 'ru':
case 'ru-RU':
locale = 'ru';
break;
case 'en':
case 'en-US':
locale = 'en';
break;
case 'ua':
case 'ua-UA':
locale = 'ua';
break;
default:
locale = 'ru';
break;
}
/** @type {?} */
const localeYears = {
'en': {
'year': 'Year',
'years': 'YY'
},
'ru': {
'year': 'год',
'years': 'гг.'
},
'ua': {
'year': 'рік',
'years': 'рр.'
}
};
moment.locale(locale);
/** @type {?} */
const year = localeYears[locale]['year'];
/** @type {?} */
const years = localeYears[locale]['years'];
/** @type {?} */
let fromFilter;
/** @type {?} */
let toFilter;
/** @type {?} */
const isSameDates = moment(period.FromUtc).isSame(moment(period.ToUtc), 'day');
/** @type {?} */
const isSameMonth = moment(period.FromUtc).isSame(moment(period.ToUtc), 'month');
/** @type {?} */
const isSameYear = moment(period.FromUtc).isSame(moment(period.ToUtc), 'year');
/** @type {?} */
const isFromDateIsStartOfMonth = moment(period.FromUtc).isSame(moment(period.FromUtc).startOf('month'), 'day');
/** @type {?} */
const isToDateIsEndOfMonth = moment(period.ToUtc).isSame(moment(period.ToUtc).endOf('month'), 'day');
/** @type {?} */
const isFromDateIsStartOfYear = moment(period.FromUtc).isSame(moment(period.FromUtc).startOf('year'), 'day');
/** @type {?} */
const isToDateIsEndOfYear = moment(period.ToUtc).isSame(moment(period.ToUtc).endOf('year'), 'day');
/** @type {?} */
const isFromDateInCurrentYear = moment(period.FromUtc).isSame(moment(), 'year');
/** @type {?} */
const isToDateInCurrentYear = moment(period.ToUtc).isSame(moment(), 'year');
if (isSameDates) {
return this.getCustomDateWithTitle(period.FromUtc, locale, true);
}
if (isFromDateIsStartOfYear && isToDateIsEndOfYear) {
if (isSameYear) {
return moment(period.FromUtc).format('YYYY') + ' ' + year;
}
else {
return moment(period.FromUtc).format('YYYY') + ' - ' + moment(period.FromUtc).format('YYYY') + ' ' + years;
}
}
if (isFromDateIsStartOfMonth && isToDateIsEndOfMonth) {
if (isSameMonth) {
if (isSameYear) {
if (isToDateInCurrentYear) {
return moment(period.FromUtc).format('MMMM');
}
else {
return moment(period.FromUtc).format('MMMM YYYY');
}
}
else {
return moment(period.FromUtc).format('MMM YYYY') + ' - ' + moment(period.ToUtc).format('MMM YYYY');
}
}
else {
if (isSameYear) {
if (isToDateInCurrentYear) {
return moment(period.FromUtc).format('MMMM') + ' - ' + moment(period.ToUtc).format('MMMM');
}
else {
return moment(period.FromUtc).format('MMMM') + ' - ' + moment(period.ToUtc).format('MMMM YYYY');
}
}
else {
return moment(period.FromUtc).format('MMM YYYY') + ' - ' + moment(period.ToUtc).format('MMM YYYY');
}
}
}
else {
if (isSameMonth) {
if (isSameYear) {
if (isToDateInCurrentYear) {
return moment(period.FromUtc).format('D') + ' - ' + moment(period.ToUtc).format('D MMM');
}
else {
return moment(period.FromUtc).format('D') + ' - ' + moment(period.ToUtc).format('D MMM YYYY');
}
}
else {
return moment(period.FromUtc).format('D MMM YYYY') + ' - ' + moment(period.ToUtc).format('D MMM YYYY');
}
}
else {
if (isFromDateIsStartOfMonth) {
fromFilter = 'MMM';
toFilter = 'D MMM';
}
else if (isToDateIsEndOfMonth) {
fromFilter = 'D MMM';
toFilter = 'MMM';
}
else {
fromFilter = 'D MMM';
toFilter = 'D MMM';
}
if (isSameYear) {
if (!isToDateInCurrentYear) {
toFilter = toFilter.concat(' YYYY');
}
}
else {
if (!isFromDateInCurrentYear) {
fromFilter = fromFilter.concat(' YYYY');
}
if (!isToDateInCurrentYear) {
toFilter = toFilter.concat(' YYYY');
}
}
return moment(period.FromUtc).format(fromFilter) + ' - ' + moment(period.ToUtc).format(toFilter);
}
}
}
/**
* @param {?} period
* @return {?}
*/
getDiffPeriod(period) {
/** @type {?} */
const start = moment(period.FromUtc);
/** @type {?} */
const finish = moment(period.ToUtc);
/** @type {?} */
let cntYears = finish.year() - start.year();
/** @type {?} */
let cntMonths = finish.month() - start.month();
/** @type {?} */
let cntDays = finish.date() - start.date();
if (cntDays < 0) {
if (finish.daysInMonth() === finish.date()) {
cntDays = 0;
}
else {
cntMonths--;
/** @type {?} */
const fMonth = finish.month() - 1;
/** @type {?} */
const cntDaysInMonth = moment([finish.year(), fMonth < 0 ? 11 : fMonth, 1]).daysInMonth();
cntDays = (start.date() > cntDaysInMonth ? 0 : cntDaysInMonth - start.date()) + finish.date();
}
}
if (cntMonths < 0) {
cntYears--;
cntMonths = 11 - start.month() + finish.month();
}
return { years: cntYears, months: cntMonths, days: cntDays };
}
/**
* @param {?} years
* @param {?} months
* @param {?} days
* @param {?} locale
* @param {?} and
* @return {?}
*/
getPeriodString(years, months, days, locale, and) {
/** @type {?} */
const andSpaced = and ? ' ' + and + ' ' : ' ';
if (years) {
/** @type {?} */
const monthStr = this.getMonthString(months, locale);
return `${this.getYearString(years, locale)}${monthStr ? andSpaced : ''}${monthStr}`;
}
else if (months) {
/** @type {?} */
const dayStr = this.getDayString(days, false, locale);
return `${this.getMonthString(months, locale)}${dayStr ? andSpaced : ''}${dayStr}`;
}
else {
return this.getDayString(days, true, locale);
}
}
/**
* @private
* @param {?} years
* @param {?} locale
* @return {?}
*/
getYearString(years, locale) {
if (!years) {
return '';
}
if (locale === 'ru') {
if (years < 5) {
if (years === 1) {
return `${years} год`;
}
return `${years} года`;
}
else {
return `${years} лет`;
}
}
else {
if (years === 1) {
return `${years} year`;
}
return `${years} years`;
}
}
/**
* @private
* @param {?} months
* @param {?} locale
* @return {?}
*/
getMonthString(months, locale) {
if (!months) {
return '';
}
if (locale === 'ru') {
if (months < 5) {
if (months === 1) {
return `${months} месяц`;
}
return `${months} месяца`;
}
else {
return `${months} месяцев`;
}
}
else {
if (months === 1) {
return `${months} month`;
}
return `${months} months`;
}
}
/**
* @private
* @param {?} days
* @param {?=} isSingle
* @param {?=} locale
* @return {?}
*/
getDayString(days, isSingle = true, locale) {
if (locale === 'ru') {
if (days) {
if (days < 5 || (days > 20 && days < 25)) {
if (days === 1) {
if (isSingle) {
return 'вчера';
}
return `${days} день`;
}
if (days === 21) {
return `${days} день`;
}
return `${days} дня`;
}
else {
return `${days} дней`;
}
}
else {
if (isSingle) {
return 'сегодня';
}
}
}
else {
if (days) {
if (days === 1) {
if (isSingle) {
return 'yesterday';
}
return `${days} day`;
}
return `${days} days`;
}
else {
if (isSingle) {
return 'today';
}
}
}
return '';
}
/**
* @param {?} period
* @param {?} locale
* @param {?} and
* @param {?=} flag
* @return {?}
*/
getCustomDiffPeriod(period, locale, and, flag = false) {
/** @type {?} */
const dateTimeFrom = moment(period.FromUtc);
/** @type {?} */
const dateTimeTo = moment(period.ToUtc);
if (!locale || locale.includes('ru')) {
locale = 'ru';
}
moment.locale(locale);
if (!and || flag) {
and = '';
}
/** @type {?} */
const diff = this.getDiffPeriod(period);
return this.getPeriodString(diff.years, diff.months, diff.days, locale, and);
}
/**
* @param {?} periodDictionary
* @param {?} ranges
* @param {?} fullperiod
* @return {?}
*/
setPresetPeriods(periodDictionary, ranges, fullperiod) {
/** @type {?} */
let fyear;
/** @type {?} */
let fmonth;
/** @type {?} */
let fdate;
if (fullperiod) {
fyear = fullperiod.FromUtc.getFullYear();
fmonth = fullperiod.FromUtc.getMonth();
fdate = fullperiod.FromUtc.getDate();
}
else {
fyear = moment().year();
fmonth = moment().month();
fdate = moment().date();
}
periodDictionary.forEach(function (period) {
switch (period.Type) {
case 'Today':
ranges[period.Name] = [moment(), moment(), period.Type];
break;
case 'Yesterday':
ranges[period.Name] = [moment().subtract(1, 'days'), moment().subtract(1, 'days'), period.Type];
break;
case 'CurrentWeek':
ranges[period.Name] = [moment().subtract(6, 'days'), moment(), period.Type];
break;
case 'CurrentMonth':
ranges[period.Name] = [moment().startOf('month'), moment(), period.Type];
break;
case 'LastMonth':
ranges[period.Name] = [
moment().subtract(1, 'months')
.startOf('month'), moment().subtract(1, 'months')
.endOf('month'), period.Type
];
break;
case 'CurrentYear':
ranges[period.Name] = [moment().startOf('year'), moment().endOf('year'), period.Type];
break;
case 'LastYear':
ranges[period.Name] = [
moment().subtract(1, 'year')
.startOf('year'), moment().subtract(1, 'year')
.endOf('year'), period.Type
];
break;
case 'FullTime':
ranges[period.Name] = [moment([fyear, fmonth, fdate]), moment(), period.Type];
break;
}
});
}
/**
* @return {?}
*/
getMonths() {
return moment.months();
}
/**
* @return {?}
*/
getMonthsShortName() {
return Array.apply(0, Array(12)).map((_, i) => moment().month(i).format('MMM'));
}
/**
* @param {?} date
* @return {?}
*/
getTotalDaysFromYoutubeDate(date) {
return moment(date).diff(moment([1970, 0, 1]), 'days');
}
/**
* @param {?} fromUtc
* @param {?} toUtc
* @param {?} locale
* @return {?}
*/
getPeriodInMonths(fromUtc, toUtc, locale) {
if (!locale) {
locale = 'ru';
}
moment.locale(locale);
/** @type {?} */
const isSameMonth = moment(fromUtc).isSame(moment(toUtc), 'month');
/** @type {?} */
const isSameYear = moment(fromUtc).isSame(moment(toUtc), 'year');
if (isSameMonth || isSameYear) {
return moment(fromUtc).format('MMMM YYYY');
}
return moment(fromUtc).format('MMMM YYYY') + ' - ' + moment(toUtc).format('MMMM YYYY');
}
/**
* @param {?} data
* @return {?}
*/
transformDate(data) {
return new Date((new Date(data)).getTime() + 60000 * (-new Date().getTimezoneOffset()));
}
}
DateService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
DateService.ctorParameters = () => [];
/** @nocollapse */ DateService.ngInjectableDef = i0.defineInjectable({ factory: function DateService_Factory() { return new DateService(); }, token: DateService, providedIn: "root" });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9kYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7OztNQUU1QixNQUFNLEdBQUcsT0FBTztBQU10QixNQUFNO0lBRUosZ0JBQWdCLENBQUM7Ozs7OztJQUVWLGdCQUFnQixDQUFDLEtBQVUsRUFBRSxNQUFjO1FBQzlDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLEVBQUUsQ0FBQztTQUNiOztjQUVLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQzs7Ozs7SUFFTSxjQUFjLENBQUMsSUFBVTtRQUM1QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQzs7Ozs7O0lBRU0sVUFBVSxDQUFDLE9BQVksRUFBRSxNQUFxQjtRQUNqRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlELENBQUM7Ozs7Ozs7SUFFTSxZQUFZLENBQUMsT0FBWSxFQUFFLEtBQVUsRUFBRSxNQUFtQjtRQUM3RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRixDQUFDOzs7Ozs7SUFFTSxVQUFVLENBQUMsSUFBUyxFQUFFLE1BQWM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNU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QVUsRUFBRSxNQUFxQjtRQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7O2NBRWhCLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUM7O2NBQzVELFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7UUFFaEUsSUFBSSxXQUFXLElBQUksVUFBVSxFQUFFO1lBQzNCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QztRQUVELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRixDQUFDOzs7OztJQUVNLGFBQWEsQ0FBQyxJQUFTO1FBQzFCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDOzs7WUEvZEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNb21lbnRNb2R1bGUgfSBmcm9tICduZ3gtbW9tZW50JztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBkYXRlRm9ybWF0U3RyaW5nKHZhbHVlOiBhbnksIGxvY2FsZTogc3RyaW5nKSB7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlICsgJyswMDAwJyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUoZGF0ZSwgbG9jYWxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXlBbmRNb250aChkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoJ0QgTU1NTScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcm1hdERhdGUoZGF0ZVN0cjogYW55LCBsb2NhbGU6IHN0cmluZyB8IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VzdG9tRGF0ZVdpdGhUaXRsZShkYXRlU3RyLCBsb2NhbGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcm1hdFBlcmlvZChmcm9tVXRjOiBhbnksIHRvVXRjOiBhbnksIGxvY2FsZTogc3RyaW5nfG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VzdG9tUGVyaW9kKHsgJ0Zyb21VdGMnOiBmcm9tVXRjLCAnVG9VdGMnOiB0b1V0YyB9LCBsb2NhbGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcm1hdFRpbWUoZGF0ZTogYW55LCBsb2NhbGU6IHN0cmluZykge1xyXG4gICAgICBpZiAoIWxvY2FsZSkge1xyXG4gICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgfVxyXG5cclxuICAgICAgbW9tZW50LmxvY2FsZShsb2NhbGUpO1xyXG5cclxuICAgICAgY29uc3QgbWFzayA9ICdISDptbSc7XHJcbiAgICAgIGNvbnN0IHV0Y0RhdGUgPSBtb21lbnQudXRjKGRhdGUpLnRvRGF0ZSgpO1xyXG4gICAgICBjb25zdCBmRGF0ZSA9IG1vbWVudCh1dGNEYXRlKS5sb2NhbCgpLmZvcm1hdChtYXNrKTtcclxuXHJcbiAgICAgIHJldHVybiBmRGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDdXN0b21EYXRlKGRhdGU6IGFueSwgbG9jYWxlOiBzdHJpbmcsIGlzRnVsbE1vbnRoOiBib29sZWFuKSB7XHJcbiAgICAgIGlmICghbG9jYWxlKSB7XHJcbiAgICAgICAgICBsb2NhbGUgPSAncnUnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBtb21lbnQubG9jYWxlKGxvY2FsZSk7XHJcblxyXG4gICAgICBjb25zdCBpc0N1cnJlbnRZZWFyID0gbW9tZW50KGRhdGUpLmlzU2FtZShtb21lbnQoKSwgJ3llYXInKTtcclxuICAgICAgbGV0IG1hc2sgPSAnRCBNTU0nO1xyXG5cclxuICAgICAgaWYgKGlzRnVsbE1vbnRoKSB7XHJcbiAgICAgICAgICBtYXNrID0gbWFzay5jb25jYXQoJ00nKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpc0N1cnJlbnRZZWFyKSB7XHJcbiAgICAgICAgICBtYXNrID0gbWFzay5jb25jYXQoJyBZWVlZJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZEYXRlID0gbW9tZW50KGRhdGUpLmZvcm1hdChtYXNrKTtcclxuXHJcbiAgICAgIHJldHVybiBmRGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDdXN0b21EYXRlV2l0aFRpdGxlKGRhdGU6IGFueSwgbG9jYWxlOiBzdHJpbmcgfCBudWxsLCBpc0Z1bGxNb250aDogYm9vbGVhbikge1xyXG5cclxuICAgICAgc3dpdGNoIChsb2NhbGUpIHtcclxuICAgICAgICAgIGNhc2UgJ3J1JzpcclxuICAgICAgICAgIGNhc2UgJ3J1LVJVJzpcclxuICAgICAgICAgICAgICBsb2NhbGUgPSAncnUnO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZW4nOlxyXG4gICAgICAgICAgY2FzZSAnZW4tVVMnOlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICdlbic7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICd1YSc6XHJcbiAgICAgICAgICBjYXNlICd1YS1VQSc6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3VhJztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbG9jYWxlRGF5cyA9IHtcclxuICAgICAgICAgICdlbic6IHtcclxuICAgICAgICAgICAgICAneWVzdGVyZGF5JzogJ3llc3RlcmRheScsXHJcbiAgICAgICAgICAgICAgJ3RvZGF5JzogJ3RvZGF5J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgICdydSc6IHtcclxuICAgICAgICAgICAgICAneWVzdGVyZGF5JzogJ9Cy0YfQtdGA0LAnLFxyXG4gICAgICAgICAgICAgICd0b2RheSc6ICfRgdC10LPQvtC00L3RjydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAndWEnOiB7XHJcbiAgICAgICAgICAgICAgJ3llc3RlcmRheSc6ICfQstGH0L7RgNCwJyxcclxuICAgICAgICAgICAgICAndG9kYXknOiAn0YHRjNC+0LPQvtC00L3RlidcclxuICAgICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1vbWVudC5sb2NhbGUobG9jYWxlKTtcclxuXHJcbiAgICAgIGNvbnN0IGlzVG9kYXkgPSBtb21lbnQoZGF0ZSkuaXNTYW1lKG1vbWVudCgpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzWWVzdGVyZGF5ID0gbW9tZW50KGRhdGUpLmlzU2FtZShtb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLCAnZGF5Jyk7XHJcblxyXG4gICAgICBjb25zdCB0b2RheSA9IGxvY2FsZURheXNbbG9jYWxlXVsndG9kYXknXTtcclxuICAgICAgY29uc3QgeWVzdGVyZGF5ID0gbG9jYWxlRGF5c1tsb2NhbGVdWyd5ZXN0ZXJkYXknXTtcclxuXHJcbiAgICAgIGxldCBmRGF0ZSA9IHRoaXMuZ2V0Q3VzdG9tRGF0ZShkYXRlLCBsb2NhbGUsIGlzRnVsbE1vbnRoKTtcclxuXHJcbiAgICAgIGlmIChpc1RvZGF5KSB7XHJcbiAgICAgICAgICBmRGF0ZSA9IHRvZGF5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNZZXN0ZXJkYXkpIHtcclxuICAgICAgICAgIGZEYXRlID0geWVzdGVyZGF5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VzdG9tUGVyaW9kKHBlcmlvZDogYW55LCBsb2NhbGU6IHN0cmluZ3xudWxsKSB7XHJcbiAgICBpZiAoIWxvY2FsZSkge1xyXG4gICAgICBsb2NhbGUgPSAncnUnO1xyXG4gICAgfVxyXG4gICAgICBzd2l0Y2ggKGxvY2FsZSkge1xyXG4gICAgICAgICAgY2FzZSAncnUnOlxyXG4gICAgICAgICAgY2FzZSAncnUtUlUnOlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICdydSc7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdlbic6XHJcbiAgICAgICAgICBjYXNlICdlbi1VUyc6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ2VuJztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ3VhJzpcclxuICAgICAgICAgIGNhc2UgJ3VhLVVBJzpcclxuICAgICAgICAgICAgICBsb2NhbGUgPSAndWEnO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBsb2NhbGUgPSAncnUnO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGxvY2FsZVllYXJzID0ge1xyXG4gICAgICAgICAgJ2VuJzoge1xyXG4gICAgICAgICAgICAgICd5ZWFyJzogJ1llYXInLFxyXG4gICAgICAgICAgICAgICd5ZWFycyc6ICdZWSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAncnUnOiB7XHJcbiAgICAgICAgICAgICAgJ3llYXInOiAn0LPQvtC0JyxcclxuICAgICAgICAgICAgICAneWVhcnMnOiAn0LPQsy4nXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgJ3VhJzoge1xyXG4gICAgICAgICAgICAgICd5ZWFyJzogJ9GA0ZbQuicsXHJcbiAgICAgICAgICAgICAgJ3llYXJzJzogJ9GA0YAuJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbW9tZW50LmxvY2FsZShsb2NhbGUpO1xyXG5cclxuICAgICAgY29uc3QgeWVhciA9IGxvY2FsZVllYXJzW2xvY2FsZV1bJ3llYXInXTtcclxuICAgICAgY29uc3QgeWVhcnMgPSBsb2NhbGVZZWFyc1tsb2NhbGVdWyd5ZWFycyddO1xyXG4gICAgICBsZXQgZnJvbUZpbHRlcjogYW55O1xyXG4gICAgICBsZXQgdG9GaWx0ZXI6IGFueTtcclxuXHJcbiAgICAgIGNvbnN0IGlzU2FtZURhdGVzID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Ub1V0YyksICdkYXknKTtcclxuICAgICAgY29uc3QgaXNTYW1lTW9udGggPSBtb21lbnQocGVyaW9kLkZyb21VdGMpLmlzU2FtZShtb21lbnQocGVyaW9kLlRvVXRjKSwgJ21vbnRoJyk7XHJcbiAgICAgIGNvbnN0IGlzU2FtZVllYXIgPSBtb21lbnQocGVyaW9kLkZyb21VdGMpLmlzU2FtZShtb21lbnQocGVyaW9kLlRvVXRjKSwgJ3llYXInKTtcclxuICAgICAgY29uc3QgaXNGcm9tRGF0ZUlzU3RhcnRPZk1vbnRoID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5zdGFydE9mKCdtb250aCcpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzVG9EYXRlSXNFbmRPZk1vbnRoID0gbW9tZW50KHBlcmlvZC5Ub1V0YykuaXNTYW1lKG1vbWVudChwZXJpb2QuVG9VdGMpLmVuZE9mKCdtb250aCcpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzRnJvbURhdGVJc1N0YXJ0T2ZZZWFyID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5zdGFydE9mKCd5ZWFyJyksICdkYXknKTtcclxuICAgICAgY29uc3QgaXNUb0RhdGVJc0VuZE9mWWVhciA9IG1vbWVudChwZXJpb2QuVG9VdGMpLmlzU2FtZShtb21lbnQocGVyaW9kLlRvVXRjKS5lbmRPZigneWVhcicpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzRnJvbURhdGVJbkN1cnJlbnRZZWFyID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KCksICd5ZWFyJyk7XHJcbiAgICAgIGNvbnN0IGlzVG9EYXRlSW5DdXJyZW50WWVhciA9IG1vbWVudChwZXJpb2QuVG9VdGMpLmlzU2FtZShtb21lbnQoKSwgJ3llYXInKTtcclxuXHJcbiAgICAgIGlmIChpc1NhbWVEYXRlcykge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VzdG9tRGF0ZVdpdGhUaXRsZShwZXJpb2QuRnJvbVV0YywgbG9jYWxlLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzRnJvbURhdGVJc1N0YXJ0T2ZZZWFyICYmIGlzVG9EYXRlSXNFbmRPZlllYXIpIHtcclxuICAgICAgICAgIGlmIChpc1NhbWVZZWFyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KCdZWVlZJykgKyAnICcgKyB5ZWFyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5mb3JtYXQoJ1lZWVknKSArICcgLSAnICsgbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5mb3JtYXQoJ1lZWVknKSArICcgJyArIHllYXJzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNGcm9tRGF0ZUlzU3RhcnRPZk1vbnRoICYmIGlzVG9EYXRlSXNFbmRPZk1vbnRoKSB7XHJcbiAgICAgICAgICBpZiAoaXNTYW1lTW9udGgpIHtcclxuICAgICAgICAgICAgICBpZiAoaXNTYW1lWWVhcikge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXNUb0RhdGVJbkN1cnJlbnRZZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5mb3JtYXQoJ01NTU0nKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQocGVyaW9kLkZyb21VdGMpLmZvcm1hdCgnTU1NTSBZWVlZJyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5mb3JtYXQoJ01NTSBZWVlZJykgKyAnIC0gJyArIG1vbWVudChwZXJpb2QuVG9VdGMpLmZvcm1hdCgnTU1NIFlZWVknKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChpc1NhbWVZZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpc1RvRGF0ZUluQ3VycmVudFllYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQocGVyaW9kLkZyb21VdGMpLmZvcm1hdCgnTU1NTScpICsgJyAtICcgKyBtb21lbnQocGVyaW9kLlRvVXRjKS5mb3JtYXQoJ01NTU0nKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQocGVyaW9kLkZyb21VdGMpLmZvcm1hdCgnTU1NTScpICsgJyAtICcgKyBtb21lbnQocGVyaW9kLlRvVXRjKS5mb3JtYXQoJ01NTU0gWVlZWScpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KCdNTU0gWVlZWScpICsgJyAtICcgKyBtb21lbnQocGVyaW9kLlRvVXRjKS5mb3JtYXQoJ01NTSBZWVlZJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGlzU2FtZU1vbnRoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGlzU2FtZVllYXIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlzVG9EYXRlSW5DdXJyZW50WWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KCdEJykgKyAnIC0gJyArIG1vbWVudChwZXJpb2QuVG9VdGMpLmZvcm1hdCgnRCBNTU0nKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQocGVyaW9kLkZyb21VdGMpLmZvcm1hdCgnRCcpICsgJyAtICcgKyBtb21lbnQocGVyaW9kLlRvVXRjKS5mb3JtYXQoJ0QgTU1NIFlZWVknKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQocGVyaW9kLkZyb21VdGMpLmZvcm1hdCgnRCBNTU0gWVlZWScpICsgJyAtICcgKyBtb21lbnQocGVyaW9kLlRvVXRjKS5mb3JtYXQoJ0QgTU1NIFlZWVknKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChpc0Zyb21EYXRlSXNTdGFydE9mTW9udGgpIHtcclxuICAgICAgICAgICAgICAgICAgZnJvbUZpbHRlciA9ICdNTU0nO1xyXG4gICAgICAgICAgICAgICAgICB0b0ZpbHRlciA9ICdEIE1NTSc7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1RvRGF0ZUlzRW5kT2ZNb250aCkge1xyXG4gICAgICAgICAgICAgICAgICBmcm9tRmlsdGVyID0gJ0QgTU1NJztcclxuICAgICAgICAgICAgICAgICAgdG9GaWx0ZXIgPSAnTU1NJztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBmcm9tRmlsdGVyID0gJ0QgTU1NJztcclxuICAgICAgICAgICAgICAgICAgdG9GaWx0ZXIgPSAnRCBNTU0nO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKGlzU2FtZVllYXIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFpc1RvRGF0ZUluQ3VycmVudFllYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRvRmlsdGVyID0gdG9GaWx0ZXIuY29uY2F0KCcgWVlZWScpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zyb21EYXRlSW5DdXJyZW50WWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbUZpbHRlciA9IGZyb21GaWx0ZXIuY29uY2F0KCcgWVlZWScpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmICghaXNUb0RhdGVJbkN1cnJlbnRZZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0b0ZpbHRlciA9IHRvRmlsdGVyLmNvbmNhdCgnIFlZWVknKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KGZyb21GaWx0ZXIpICsgJyA