UNPKG

air-lib

Version:

This is Air's angular component library

603 lines 60.5 kB
/** * @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