UNPKG

air-lib

Version:

This is Air's angular component library

714 lines 63.8 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 {?} */ var moment = moment_; var DateService = /** @class */ (function () { function DateService() { } /** * @param {?} value * @param {?} locale * @return {?} */ DateService.prototype.dateFormatString = /** * @param {?} value * @param {?} locale * @return {?} */ function (value, locale) { if (!value) { return ''; } /** @type {?} */ var date = new Date(value + '+0000'); return this.formatDate(date, locale); }; /** * @param {?} date * @return {?} */ DateService.prototype.getDayAndMonth = /** * @param {?} date * @return {?} */ function (date) { return moment(date).format('D MMMM'); }; /** * @param {?} dateStr * @param {?} locale * @return {?} */ DateService.prototype.formatDate = /** * @param {?} dateStr * @param {?} locale * @return {?} */ function (dateStr, locale) { return this.getCustomDateWithTitle(dateStr, locale, true); }; /** * @param {?} fromUtc * @param {?} toUtc * @param {?} locale * @return {?} */ DateService.prototype.formatPeriod = /** * @param {?} fromUtc * @param {?} toUtc * @param {?} locale * @return {?} */ function (fromUtc, toUtc, locale) { return this.getCustomPeriod({ 'FromUtc': fromUtc, 'ToUtc': toUtc }, locale); }; /** * @param {?} date * @param {?} locale * @return {?} */ DateService.prototype.formatTime = /** * @param {?} date * @param {?} locale * @return {?} */ function (date, locale) { if (!locale) { locale = 'ru'; } moment.locale(locale); /** @type {?} */ var mask = 'HH:mm'; /** @type {?} */ var utcDate = moment.utc(date).toDate(); /** @type {?} */ var fDate = moment(utcDate).local().format(mask); return fDate; }; /** * @param {?} date * @param {?} locale * @param {?} isFullMonth * @return {?} */ DateService.prototype.getCustomDate = /** * @param {?} date * @param {?} locale * @param {?} isFullMonth * @return {?} */ function (date, locale, isFullMonth) { if (!locale) { locale = 'ru'; } moment.locale(locale); /** @type {?} */ var isCurrentYear = moment(date).isSame(moment(), 'year'); /** @type {?} */ var mask = 'D MMM'; if (isFullMonth) { mask = mask.concat('M'); } if (!isCurrentYear) { mask = mask.concat(' YYYY'); } /** @type {?} */ var fDate = moment(date).format(mask); return fDate; }; /** * @param {?} date * @param {?} locale * @param {?} isFullMonth * @return {?} */ DateService.prototype.getCustomDateWithTitle = /** * @param {?} date * @param {?} locale * @param {?} isFullMonth * @return {?} */ function (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 {?} */ var localeDays = { 'en': { 'yesterday': 'yesterday', 'today': 'today' }, 'ru': { 'yesterday': 'вчера', 'today': 'сегодня' }, 'ua': { 'yesterday': 'вчора', 'today': 'сьогодні' } }; moment.locale(locale); /** @type {?} */ var isToday = moment(date).isSame(moment(), 'day'); /** @type {?} */ var isYesterday = moment(date).isSame(moment().subtract(1, 'days'), 'day'); /** @type {?} */ var today = localeDays[locale]['today']; /** @type {?} */ var yesterday = localeDays[locale]['yesterday']; /** @type {?} */ var fDate = this.getCustomDate(date, locale, isFullMonth); if (isToday) { fDate = today; } if (isYesterday) { fDate = yesterday; } return fDate; }; /** * @param {?} period * @param {?} locale * @return {?} */ DateService.prototype.getCustomPeriod = /** * @param {?} period * @param {?} locale * @return {?} */ function (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 {?} */ var localeYears = { 'en': { 'year': 'Year', 'years': 'YY' }, 'ru': { 'year': 'год', 'years': 'гг.' }, 'ua': { 'year': 'рік', 'years': 'рр.' } }; moment.locale(locale); /** @type {?} */ var year = localeYears[locale]['year']; /** @type {?} */ var years = localeYears[locale]['years']; /** @type {?} */ var fromFilter; /** @type {?} */ var toFilter; /** @type {?} */ var isSameDates = moment(period.FromUtc).isSame(moment(period.ToUtc), 'day'); /** @type {?} */ var isSameMonth = moment(period.FromUtc).isSame(moment(period.ToUtc), 'month'); /** @type {?} */ var isSameYear = moment(period.FromUtc).isSame(moment(period.ToUtc), 'year'); /** @type {?} */ var isFromDateIsStartOfMonth = moment(period.FromUtc).isSame(moment(period.FromUtc).startOf('month'), 'day'); /** @type {?} */ var isToDateIsEndOfMonth = moment(period.ToUtc).isSame(moment(period.ToUtc).endOf('month'), 'day'); /** @type {?} */ var isFromDateIsStartOfYear = moment(period.FromUtc).isSame(moment(period.FromUtc).startOf('year'), 'day'); /** @type {?} */ var isToDateIsEndOfYear = moment(period.ToUtc).isSame(moment(period.ToUtc).endOf('year'), 'day'); /** @type {?} */ var isFromDateInCurrentYear = moment(period.FromUtc).isSame(moment(), 'year'); /** @type {?} */ var 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 {?} */ DateService.prototype.getDiffPeriod = /** * @param {?} period * @return {?} */ function (period) { /** @type {?} */ var start = moment(period.FromUtc); /** @type {?} */ var finish = moment(period.ToUtc); /** @type {?} */ var cntYears = finish.year() - start.year(); /** @type {?} */ var cntMonths = finish.month() - start.month(); /** @type {?} */ var cntDays = finish.date() - start.date(); if (cntDays < 0) { if (finish.daysInMonth() === finish.date()) { cntDays = 0; } else { cntMonths--; /** @type {?} */ var fMonth = finish.month() - 1; /** @type {?} */ var 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 {?} */ DateService.prototype.getPeriodString = /** * @param {?} years * @param {?} months * @param {?} days * @param {?} locale * @param {?} and * @return {?} */ function (years, months, days, locale, and) { /** @type {?} */ var andSpaced = and ? ' ' + and + ' ' : ' '; if (years) { /** @type {?} */ var monthStr = this.getMonthString(months, locale); return "" + this.getYearString(years, locale) + (monthStr ? andSpaced : '') + monthStr; } else if (months) { /** @type {?} */ var 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 {?} */ DateService.prototype.getYearString = /** * @private * @param {?} years * @param {?} locale * @return {?} */ function (years, locale) { if (!years) { return ''; } if (locale === 'ru') { if (years < 5) { if (years === 1) { return years + " \u0433\u043E\u0434"; } return years + " \u0433\u043E\u0434\u0430"; } else { return years + " \u043B\u0435\u0442"; } } else { if (years === 1) { return years + " year"; } return years + " years"; } }; /** * @private * @param {?} months * @param {?} locale * @return {?} */ DateService.prototype.getMonthString = /** * @private * @param {?} months * @param {?} locale * @return {?} */ function (months, locale) { if (!months) { return ''; } if (locale === 'ru') { if (months < 5) { if (months === 1) { return months + " \u043C\u0435\u0441\u044F\u0446"; } return months + " \u043C\u0435\u0441\u044F\u0446\u0430"; } else { return months + " \u043C\u0435\u0441\u044F\u0446\u0435\u0432"; } } else { if (months === 1) { return months + " month"; } return months + " months"; } }; /** * @private * @param {?} days * @param {?=} isSingle * @param {?=} locale * @return {?} */ DateService.prototype.getDayString = /** * @private * @param {?} days * @param {?=} isSingle * @param {?=} locale * @return {?} */ function (days, isSingle, locale) { if (isSingle === void 0) { isSingle = true; } if (locale === 'ru') { if (days) { if (days < 5 || (days > 20 && days < 25)) { if (days === 1) { if (isSingle) { return 'вчера'; } return days + " \u0434\u0435\u043D\u044C"; } if (days === 21) { return days + " \u0434\u0435\u043D\u044C"; } return days + " \u0434\u043D\u044F"; } else { return days + " \u0434\u043D\u0435\u0439"; } } 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 {?} */ DateService.prototype.getCustomDiffPeriod = /** * @param {?} period * @param {?} locale * @param {?} and * @param {?=} flag * @return {?} */ function (period, locale, and, flag) { if (flag === void 0) { flag = false; } /** @type {?} */ var dateTimeFrom = moment(period.FromUtc); /** @type {?} */ var dateTimeTo = moment(period.ToUtc); if (!locale || locale.includes('ru')) { locale = 'ru'; } moment.locale(locale); if (!and || flag) { and = ''; } /** @type {?} */ var diff = this.getDiffPeriod(period); return this.getPeriodString(diff.years, diff.months, diff.days, locale, and); }; /** * @param {?} periodDictionary * @param {?} ranges * @param {?} fullperiod * @return {?} */ DateService.prototype.setPresetPeriods = /** * @param {?} periodDictionary * @param {?} ranges * @param {?} fullperiod * @return {?} */ function (periodDictionary, ranges, fullperiod) { /** @type {?} */ var fyear; /** @type {?} */ var fmonth; /** @type {?} */ var 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 {?} */ DateService.prototype.getMonths = /** * @return {?} */ function () { return moment.months(); }; /** * @return {?} */ DateService.prototype.getMonthsShortName = /** * @return {?} */ function () { return Array.apply(0, Array(12)).map(function (_, i) { return moment().month(i).format('MMM'); }); }; /** * @param {?} date * @return {?} */ DateService.prototype.getTotalDaysFromYoutubeDate = /** * @param {?} date * @return {?} */ function (date) { return moment(date).diff(moment([1970, 0, 1]), 'days'); }; /** * @param {?} fromUtc * @param {?} toUtc * @param {?} locale * @return {?} */ DateService.prototype.getPeriodInMonths = /** * @param {?} fromUtc * @param {?} toUtc * @param {?} locale * @return {?} */ function (fromUtc, toUtc, locale) { if (!locale) { locale = 'ru'; } moment.locale(locale); /** @type {?} */ var isSameMonth = moment(fromUtc).isSame(moment(toUtc), 'month'); /** @type {?} */ var 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 {?} */ DateService.prototype.transformDate = /** * @param {?} data * @return {?} */ function (data) { return new Date((new Date(data)).getTime() + 60000 * (-new Date().getTimezoneOffset())); }; DateService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; DateService.ctorParameters = function () { return []; }; /** @nocollapse */ DateService.ngInjectableDef = i0.defineInjectable({ factory: function DateService_Factory() { return new DateService(); }, token: DateService, providedIn: "root" }); return DateService; }()); export { DateService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9kYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7OztJQUU1QixNQUFNLEdBQUcsT0FBTztBQUV0QjtJQU1FO0lBQWdCLENBQUM7Ozs7OztJQUVWLHNDQUFnQjs7Ozs7SUFBdkIsVUFBd0IsS0FBVSxFQUFFLE1BQWM7UUFDOUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ2I7O1lBRUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDOzs7OztJQUVNLG9DQUFjOzs7O0lBQXJCLFVBQXNCLElBQVU7UUFDNUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7OztJQUVNLGdDQUFVOzs7OztJQUFqQixVQUFrQixPQUFZLEVBQUUsTUFBcUI7UUFDakQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDOzs7Ozs7O0lBRU0sa0NBQVk7Ozs7OztJQUFuQixVQUFvQixPQUFZLEVBQUUsS0FBVSxFQUFFLE1BQW1CO1FBQzdELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hGLENBQUM7Ozs7OztJQUVNLGdDQUFVOzs7OztJQUFq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QVUsU0FBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7Ozs7c0JBUkQ7Q0FzZUMsQUFoZUQsSUFnZUM7U0E1ZFksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTW9tZW50TW9kdWxlIH0gZnJvbSAnbmd4LW1vbWVudCc7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBwdWJsaWMgZGF0ZUZvcm1hdFN0cmluZyh2YWx1ZTogYW55LCBsb2NhbGU6IHN0cmluZykge1xyXG4gICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSArICcrMDAwMCcpO1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKGRhdGUsIGxvY2FsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF5QW5kTW9udGgoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdEIE1NTU0nKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXREYXRlKGRhdGVTdHI6IGFueSwgbG9jYWxlOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbURhdGVXaXRoVGl0bGUoZGF0ZVN0ciwgbG9jYWxlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXRQZXJpb2QoZnJvbVV0YzogYW55LCB0b1V0YzogYW55LCBsb2NhbGU6IHN0cmluZ3xudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbVBlcmlvZCh7ICdGcm9tVXRjJzogZnJvbVV0YywgJ1RvVXRjJzogdG9VdGMgfSwgbG9jYWxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXRUaW1lKGRhdGU6IGFueSwgbG9jYWxlOiBzdHJpbmcpIHtcclxuICAgICAgaWYgKCFsb2NhbGUpIHtcclxuICAgICAgICAgIGxvY2FsZSA9ICdydSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG1vbWVudC5sb2NhbGUobG9jYWxlKTtcclxuXHJcbiAgICAgIGNvbnN0IG1hc2sgPSAnSEg6bW0nO1xyXG4gICAgICBjb25zdCB1dGNEYXRlID0gbW9tZW50LnV0YyhkYXRlKS50b0RhdGUoKTtcclxuICAgICAgY29uc3QgZkRhdGUgPSBtb21lbnQodXRjRGF0ZSkubG9jYWwoKS5mb3JtYXQobWFzayk7XHJcblxyXG4gICAgICByZXR1cm4gZkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VzdG9tRGF0ZShkYXRlOiBhbnksIGxvY2FsZTogc3RyaW5nLCBpc0Z1bGxNb250aDogYm9vbGVhbikge1xyXG4gICAgICBpZiAoIWxvY2FsZSkge1xyXG4gICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgfVxyXG5cclxuICAgICAgbW9tZW50LmxvY2FsZShsb2NhbGUpO1xyXG5cclxuICAgICAgY29uc3QgaXNDdXJyZW50WWVhciA9IG1vbWVudChkYXRlKS5pc1NhbWUobW9tZW50KCksICd5ZWFyJyk7XHJcbiAgICAgIGxldCBtYXNrID0gJ0QgTU1NJztcclxuXHJcbiAgICAgIGlmIChpc0Z1bGxNb250aCkge1xyXG4gICAgICAgICAgbWFzayA9IG1hc2suY29uY2F0KCdNJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghaXNDdXJyZW50WWVhcikge1xyXG4gICAgICAgICAgbWFzayA9IG1hc2suY29uY2F0KCcgWVlZWScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBmRGF0ZSA9IG1vbWVudChkYXRlKS5mb3JtYXQobWFzayk7XHJcblxyXG4gICAgICByZXR1cm4gZkRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VzdG9tRGF0ZVdpdGhUaXRsZShkYXRlOiBhbnksIGxvY2FsZTogc3RyaW5nIHwgbnVsbCwgaXNGdWxsTW9udGg6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgIHN3aXRjaCAobG9jYWxlKSB7XHJcbiAgICAgICAgICBjYXNlICdydSc6XHJcbiAgICAgICAgICBjYXNlICdydS1SVSc6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2VuJzpcclxuICAgICAgICAgIGNhc2UgJ2VuLVVTJzpcclxuICAgICAgICAgICAgICBsb2NhbGUgPSAnZW4nO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAndWEnOlxyXG4gICAgICAgICAgY2FzZSAndWEtVUEnOlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICd1YSc7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICdydSc7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGxvY2FsZURheXMgPSB7XHJcbiAgICAgICAgICAnZW4nOiB7XHJcbiAgICAgICAgICAgICAgJ3llc3RlcmRheSc6ICd5ZXN0ZXJkYXknLFxyXG4gICAgICAgICAgICAgICd0b2RheSc6ICd0b2RheSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAncnUnOiB7XHJcbiAgICAgICAgICAgICAgJ3llc3RlcmRheSc6ICfQstGH0LXRgNCwJyxcclxuICAgICAgICAgICAgICAndG9kYXknOiAn0YHQtdCz0L7QtNC90Y8nXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgJ3VhJzoge1xyXG4gICAgICAgICAgICAgICd5ZXN0ZXJkYXknOiAn0LLRh9C+0YDQsCcsXHJcbiAgICAgICAgICAgICAgJ3RvZGF5JzogJ9GB0YzQvtCz0L7QtNC90ZYnXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtb21lbnQubG9jYWxlKGxvY2FsZSk7XHJcblxyXG4gICAgICBjb25zdCBpc1RvZGF5ID0gbW9tZW50KGRhdGUpLmlzU2FtZShtb21lbnQoKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc1llc3RlcmRheSA9IG1vbWVudChkYXRlKS5pc1NhbWUobW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKSwgJ2RheScpO1xyXG5cclxuICAgICAgY29uc3QgdG9kYXkgPSBsb2NhbGVEYXlzW2xvY2FsZV1bJ3RvZGF5J107XHJcbiAgICAgIGNvbnN0IHllc3RlcmRheSA9IGxvY2FsZURheXNbbG9jYWxlXVsneWVzdGVyZGF5J107XHJcblxyXG4gICAgICBsZXQgZkRhdGUgPSB0aGlzLmdldEN1c3RvbURhdGUoZGF0ZSwgbG9jYWxlLCBpc0Z1bGxNb250aCk7XHJcblxyXG4gICAgICBpZiAoaXNUb2RheSkge1xyXG4gICAgICAgICAgZkRhdGUgPSB0b2RheTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzWWVzdGVyZGF5KSB7XHJcbiAgICAgICAgICBmRGF0ZSA9IHllc3RlcmRheTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZEYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEN1c3RvbVBlcmlvZChwZXJpb2Q6IGFueSwgbG9jYWxlOiBzdHJpbmd8bnVsbCkge1xyXG4gICAgaWYgKCFsb2NhbGUpIHtcclxuICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgIH1cclxuICAgICAgc3dpdGNoIChsb2NhbGUpIHtcclxuICAgICAgICAgIGNhc2UgJ3J1JzpcclxuICAgICAgICAgIGNhc2UgJ3J1LVJVJzpcclxuICAgICAgICAgICAgICBsb2NhbGUgPSAncnUnO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZW4nOlxyXG4gICAgICAgICAgY2FzZSAnZW4tVVMnOlxyXG4gICAgICAgICAgICAgIGxvY2FsZSA9ICdlbic7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICd1YSc6XHJcbiAgICAgICAgICBjYXNlICd1YS1VQSc6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3VhJztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgbG9jYWxlID0gJ3J1JztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsb2NhbGVZZWFycyA9IHtcclxuICAgICAgICAgICdlbic6IHtcclxuICAgICAgICAgICAgICAneWVhcic6ICdZZWFyJyxcclxuICAgICAgICAgICAgICAneWVhcnMnOiAnWVknXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgJ3J1Jzoge1xyXG4gICAgICAgICAgICAgICd5ZWFyJzogJ9Cz0L7QtCcsXHJcbiAgICAgICAgICAgICAgJ3llYXJzJzogJ9Cz0LMuJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgICd1YSc6IHtcclxuICAgICAgICAgICAgICAneWVhcic6ICfRgNGW0LonLFxyXG4gICAgICAgICAgICAgICd5ZWFycyc6ICfRgNGALidcclxuICAgICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1vbWVudC5sb2NhbGUobG9jYWxlKTtcclxuXHJcbiAgICAgIGNvbnN0IHllYXIgPSBsb2NhbGVZZWFyc1tsb2NhbGVdWyd5ZWFyJ107XHJcbiAgICAgIGNvbnN0IHllYXJzID0gbG9jYWxlWWVhcnNbbG9jYWxlXVsneWVhcnMnXTtcclxuICAgICAgbGV0IGZyb21GaWx0ZXI6IGFueTtcclxuICAgICAgbGV0IHRvRmlsdGVyOiBhbnk7XHJcblxyXG4gICAgICBjb25zdCBpc1NhbWVEYXRlcyA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudChwZXJpb2QuVG9VdGMpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzU2FtZU1vbnRoID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Ub1V0YyksICdtb250aCcpO1xyXG4gICAgICBjb25zdCBpc1NhbWVZZWFyID0gbW9tZW50KHBlcmlvZC5Gcm9tVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Ub1V0YyksICd5ZWFyJyk7XHJcbiAgICAgIGNvbnN0IGlzRnJvbURhdGVJc1N0YXJ0T2ZNb250aCA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudChwZXJpb2QuRnJvbVV0Yykuc3RhcnRPZignbW9udGgnKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc1RvRGF0ZUlzRW5kT2ZNb250aCA9IG1vbWVudChwZXJpb2QuVG9VdGMpLmlzU2FtZShtb21lbnQocGVyaW9kLlRvVXRjKS5lbmRPZignbW9udGgnKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc0Zyb21EYXRlSXNTdGFydE9mWWVhciA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudChwZXJpb2QuRnJvbVV0Yykuc3RhcnRPZigneWVhcicpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGlzVG9EYXRlSXNFbmRPZlllYXIgPSBtb21lbnQocGVyaW9kLlRvVXRjKS5pc1NhbWUobW9tZW50KHBlcmlvZC5Ub1V0YykuZW5kT2YoJ3llYXInKSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBpc0Zyb21EYXRlSW5DdXJyZW50WWVhciA9IG1vbWVudChwZXJpb2QuRnJvbVV0YykuaXNTYW1lKG1vbWVudCgpLCAneWVhcicpO1xyXG4gICAgICBjb25zdCBpc1RvRGF0ZUluQ3VycmVudFllYXIgPSBtb21lbnQocGVyaW9kLlRvVXRjKS5pc1NhbWUobW9tZW50KCksICd5ZWFyJyk7XHJcblxyXG4gICAgICBpZiAoaXNTYW1lRGF0ZXMpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbURhdGVXaXRoVGl0bGUocGVyaW9kLkZyb21VdGMsIGxvY2FsZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc0Zyb21EYXRlSXNTdGFydE9mWWVhciAmJiBpc1RvRGF0ZUlzRW5kT2ZZZWFyKSB7XHJcbiAgICAgICAgICBpZiAoaXNTYW1lWWVhcikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBtb21lbnQocGVyaW9kLkZyb21VdGMpLmZvcm1hdCgnWVlZWScpICsgJyAnICsgeWVhcjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KCdZWVlZJykgKyAnIC0gJyArIG1vbWVudChwZXJpb2QuRnJvbVV0YykuZm9ybWF0KCdZWVlZJykgKyAnICcgKyB5ZWFycztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzRnJvbURhdGVJc1N0YXJ0T2ZNb250aCAmJiBpc1RvRGF0ZUlzRW5kT2ZNb250aCkge1xyXG4gICAgICAgICAgaWYgKGlzU2FtZU1vbnRoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGlzU2FtZVllYXIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlzVG9EYXRlSW5DdXJyZW50WWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJu