systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
144 lines • 20.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { addDays, addMonths, addWeeks, addYears, getDaysInMonth } from 'date-fns';
import * as i0 from "@angular/core";
export class DataTransformerService {
processShortcuts(date, fromDateForRelative) {
const regExp = new RegExp('^[\-]?[0-9]+[DWSMYA]$', 'i');
if (regExp.test(date)) {
const shortcut = date.substr(-1)
.toUpperCase();
const amount = Number(date.slice(0, -1));
const fromDate = fromDateForRelative ? fromDateForRelative : new Date();
switch (shortcut) {
case 'D':
return addDays(fromDate, amount);
case 'W':
case 'S':
return addWeeks(fromDate, amount);
case 'M':
return addMonths(fromDate, amount);
case 'Y':
case 'A':
return addYears(fromDate, amount);
}
}
return undefined;
}
infereDate(date, dateFormat) {
let dateTmp = date.trim();
const dayPosition = dateFormat.lastIndexOf('d');
const monthPosition = dateFormat.lastIndexOf('m');
const yearPosition = dateFormat.lastIndexOf('y');
const dayBefore = dayPosition < monthPosition;
const yearBefore = yearPosition < dayPosition;
let firstSeparatorPosition;
let secondSeparatorPosition;
const separator = this.getDateSeparator(dateFormat);
if (separator) {
// Get separator positions before removing them
firstSeparatorPosition = dateTmp.indexOf(separator);
secondSeparatorPosition = dateTmp.lastIndexOf(separator);
dateTmp = this.removeSeparator(dateTmp, separator);
// After removing the desired separator, no other separator is expected
if (this.getDateSeparator(dateTmp)) {
return undefined;
}
}
const dayLength = this.getDayLength(dateTmp, dayBefore, yearBefore, firstSeparatorPosition, secondSeparatorPosition);
const monthLength = [4, 6, 8].some(length => dateTmp.length === length) ? dayLength : 2 / dayLength;
const yearLength = [7, 8].some(length => dateTmp.length === length) ? 4 : 2;
if (dayLength && monthLength && yearLength) {
return this.getFormattedDate(dateTmp, dayBefore, yearBefore, dayLength, monthLength, yearLength);
}
return undefined;
}
getDayLength(date, dayBefore, yearBefore, firstSeparatorPosition, secondSeparatorPosition) {
switch (date.length) {
case 4:
return 1;
case 6:
case 8:
return 2;
case 5:
case 7:
if (firstSeparatorPosition > 0 && secondSeparatorPosition !== firstSeparatorPosition) {
let dayLength;
if (secondSeparatorPosition - firstSeparatorPosition === 2) {
dayLength = 1;
}
else {
dayLength = 2;
}
if (!dayBefore) {
dayLength = 2 / dayLength;
}
if (!yearBefore) {
dayLength = 2 / dayLength;
}
return dayLength;
}
}
}
getFormattedDate(dateTmp, dayBefore, yearBefore, dayLength, monthLength, yearLength) {
let dayInDate;
let monthInDate;
let yearInDate;
if (yearBefore) {
yearInDate = +dateTmp.substring(0, yearLength);
if (dayBefore) {
dayInDate = +dateTmp.substring(yearLength, yearLength + dayLength);
monthInDate = +dateTmp.substring(yearLength + dayLength) - 1;
}
else {
monthInDate = +dateTmp.substring(yearLength, yearLength + monthLength) - 1;
dayInDate = +dateTmp.substring(yearLength + monthLength);
}
}
else {
if (dayBefore) {
dayInDate = +dateTmp.substring(0, dayLength);
monthInDate = +dateTmp.substring(dayLength, dayLength + monthLength) - 1;
}
else {
monthInDate = +dateTmp.substring(0, monthLength) - 1;
dayInDate = +dateTmp.substring(monthLength, monthLength + dayLength);
}
yearInDate = +dateTmp.substring(monthLength + dayLength);
}
if (yearInDate < 100) {
yearInDate = 2000 + yearInDate;
}
return (this.checkMonthNumber(monthInDate) && this.checkDayNumber(yearInDate, monthInDate, dayInDate))
? new Date(yearInDate, monthInDate, dayInDate)
: null;
}
checkMonthNumber(monthInDate) {
return (monthInDate >= 0 && monthInDate <= 11); // Months go from 0 to 11
}
checkDayNumber(yearInDate, monthInDate, dayInDate) {
return (dayInDate >= 1 && dayInDate <= getDaysInMonth(new Date(yearInDate, monthInDate)));
}
getDateSeparator(dateFormat) {
let dateSeparator;
if (dateFormat.includes('/')) {
dateSeparator = '/';
}
else if (dateFormat.includes('-')) {
dateSeparator = '-';
}
else if (dateFormat.includes('.')) {
dateSeparator = '.';
}
return dateSeparator;
}
removeSeparator(dateTmp, dateSeparator) {
return dateTmp.split(dateSeparator)
.join('');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DataTransformerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DataTransformerService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DataTransformerService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10cmFuc2Zvcm1lci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZS10cmFuc2Zvcm1lci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBR2xGLE1BQU0sT0FBTyxzQkFBc0I7SUFFM0IsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLG1CQUF5QjtRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUIsV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekUsUUFBUSxRQUFRLEVBQUU7Z0JBQ2pCLEtBQUssR0FBRztvQkFDUCxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLEtBQUssR0FBRyxDQUFDO2dCQUNULEtBQUssR0FBRztvQkFDUCxPQUFPLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7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Q0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUMxQyxJQUFJLGFBQXFCLENBQUM7UUFDMUIsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLGFBQWEsR0FBRyxHQUFHLENBQUM7U0FDcEI7YUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEMsYUFBYSxHQUFHLEdBQUcsQ0FBQztTQUNwQjthQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdEIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFlLEVBQUUsYUFBcUI7UUFDN0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQzthQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDWixDQUFDOzhHQWpKVyxzQkFBc0I7a0hBQXRCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGFkZERheXMsIGFkZE1vbnRocywgYWRkV2Vla3MsIGFkZFllYXJzLCBnZXREYXlzSW5Nb250aCB9IGZyb20gJ2RhdGUtZm5zJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGFUcmFuc2Zvcm1lclNlcnZpY2Uge1xuXG5cdHB1YmxpYyBwcm9jZXNzU2hvcnRjdXRzKGRhdGU6IHN0cmluZywgZnJvbURhdGVGb3JSZWxhdGl2ZTogRGF0ZSk6IERhdGUge1xuXHRcdGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoJ15bXFwtXT9bMC05XStbRFdTTVlBXSQnLCAnaScpO1xuXHRcdGlmIChyZWdFeHAudGVzdChkYXRlKSkge1xuXHRcdFx0Y29uc3Qgc2hvcnRjdXQgPSBkYXRlLnN1YnN0cigtMSlcblx0XHRcdFx0LnRvVXBwZXJDYXNlKCk7XG5cdFx0XHRjb25zdCBhbW91bnQgPSBOdW1iZXIoZGF0ZS5zbGljZSgwLCAtMSkpO1xuXHRcdFx0Y29uc3QgZnJvbURhdGUgPSBmcm9tRGF0ZUZvclJlbGF0aXZlID8gIGZyb21EYXRlRm9yUmVsYXRpdmUgOiBuZXcgRGF0ZSgpO1xuXHRcdFx0c3dpdGNoIChzaG9ydGN1dCkge1xuXHRcdFx0XHRjYXNlICdEJzpcblx0XHRcdFx0XHRyZXR1cm4gYWRkRGF5cyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdFx0Y2FzZSAnVyc6XG5cdFx0XHRcdGNhc2UgJ1MnOlxuXHRcdFx0XHRcdHJldHVybiBhZGRXZWVrcyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdFx0Y2FzZSAnTSc6XG5cdFx0XHRcdFx0cmV0dXJuIGFkZE1vbnRocyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdFx0Y2FzZSAnWSc6XG5cdFx0XHRcdGNhc2UgJ0EnOlxuXHRcdFx0XHRcdHJldHVybiBhZGRZZWFycyhmcm9tRGF0ZSwgYW1vdW50KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpbmZlcmVEYXRlKGRhdGU6IHN0cmluZywgZGF0ZUZvcm1hdDogc3RyaW5nKTogRGF0ZSB7XG5cdFx0bGV0IGRhdGVUbXAgPSBkYXRlLnRyaW0oKTtcblxuXHRcdGNvbnN0IGRheVBvc2l0aW9uID0gZGF0ZUZvcm1hdC5sYXN0SW5kZXhPZignZCcpO1xuXHRcdGNvbnN0IG1vbnRoUG9zaXRpb24gPSBkYXRlRm9ybWF0Lmxhc3RJbmRleE9mKCdtJyk7XG5cdFx0Y29uc3QgeWVhclBvc2l0aW9uID0gZGF0ZUZvcm1hdC5sYXN0SW5kZXhPZigneScpO1xuXG5cdFx0Y29uc3QgZGF5QmVmb3JlID0gZGF5UG9zaXRpb24gPCBtb250aFBvc2l0aW9uO1xuXHRcdGNvbnN0IHllYXJCZWZvcmUgPSB5ZWFyUG9zaXRpb24gPCBkYXlQb3NpdGlvbjtcblxuXHRcdGxldCBmaXJzdFNlcGFyYXRvclBvc2l0aW9uOiBudW1iZXI7XG5cdFx0bGV0IHNlY29uZFNlcGFyYXRvclBvc2l0aW9uOiBudW1iZXI7XG5cblx0XHRjb25zdCBzZXBhcmF0b3IgPSB0aGlzLmdldERhdGVTZXBhcmF0b3IoZGF0ZUZvcm1hdCk7XG5cdFx0aWYgKHNlcGFyYXRvcikge1xuXHRcdFx0Ly8gR2V0IHNlcGFyYXRvciBwb3NpdGlvbnMgYmVmb3JlIHJlbW92aW5nIHRoZW1cblx0XHRcdGZpcnN0U2VwYXJhdG9yUG9zaXRpb24gPSBkYXRlVG1wLmluZGV4T2Yoc2VwYXJhdG9yKTtcblx0XHRcdHNlY29uZFNlcGFyYXRvclBvc2l0aW9uID0gZGF0ZVRtcC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuXG5cdFx0XHRkYXRlVG1wID0gdGhpcy5yZW1vdmVTZXBhcmF0b3IoZGF0ZVRtcCwgc2VwYXJhdG9yKTtcblx0XHRcdC8vIEFmdGVyIHJlbW92aW5nIHRoZSBkZXNpcmVkIHNlcGFyYXRvciwgbm8gb3RoZXIgc2VwYXJhdG9yIGlzIGV4cGVjdGVkXG5cdFx0XHRpZiAodGhpcy5nZXREYXRlU2VwYXJhdG9yKGRhdGVUbXApKSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGF5TGVuZ3RoID0gdGhpcy5nZXREYXlMZW5ndGgoZGF0ZVRtcCwgZGF5QmVmb3JlLCB5ZWFyQmVmb3JlLCBmaXJzdFNlcGFyYXRvclBvc2l0aW9uLCBzZWNvbmRTZXBhcmF0b3JQb3NpdGlvbik7XG5cdFx0Y29uc3QgbW9udGhMZW5ndGggPSBbNCwgNiwgOF0uc29tZShsZW5ndGggPT4gZGF0ZVRtcC5sZW5ndGggPT09IGxlbmd0aCkgPyBkYXlMZW5ndGggOiAyIC8gZGF5TGVuZ3RoO1xuXHRcdGNvbnN0IHllYXJMZW5ndGggPSBbNywgOF0uc29tZShsZW5ndGggPT4gZGF0ZVRtcC5sZW5ndGggPT09IGxlbmd0aCkgPyA0IDogMjtcblxuXHRcdGlmIChkYXlMZW5ndGggJiYgbW9udGhMZW5ndGggJiYgeWVhckxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0Rm9ybWF0dGVkRGF0ZShkYXRlVG1wLCBkYXlCZWZvcmUsIHllYXJCZWZvcmUsIGRheUxlbmd0aCwgbW9udGhMZW5ndGgsIHllYXJMZW5ndGgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwcml2YXRlIGdldERheUxlbmd0aChkYXRlOiBzdHJpbmcsIGRheUJlZm9yZTogYm9vbGVhbiwgeWVhckJlZm9yZTogYm9vbGVhbiwgZmlyc3RTZXBhcmF0b3JQb3NpdGlvbjogbnVtYmVyLCBzZWNvbmRTZXBhcmF0b3JQb3NpdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRzd2l0Y2ggKGRhdGUubGVuZ3RoKSB7XG5cdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0Y2FzZSA2OlxuXHRcdFx0Y2FzZSA4OlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdGNhc2UgNTpcblx0XHRcdGNhc2UgNzpcblx0XHRcdFx0aWYgKGZpcnN0U2VwYXJhdG9yUG9zaXRpb24gPiAwICYmIHNlY29uZFNlcGFyYXRvclBvc2l0aW9uICE9PSBmaXJzdFNlcGFyYXRvclBvc2l0aW9uKSB7XG5cdFx0XHRcdFx0bGV0IGRheUxlbmd0aDogbnVtYmVyO1xuXHRcdFx0XHRcdGlmIChzZWNvbmRTZXBhcmF0b3JQb3NpdGlvbiAtIGZpcnN0U2VwYXJhdG9yUG9zaXRpb24gPT09IDIpIHtcblx0XHRcdFx0XHRcdGRheUxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRheUxlbmd0aCA9IDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghZGF5QmVmb3JlKSB7XG5cdFx0XHRcdFx0XHRkYXlMZW5ndGggPSAyIC8gZGF5TGVuZ3RoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXllYXJCZWZvcmUpIHtcblx0XHRcdFx0XHRcdGRheUxlbmd0aCA9IDIgLyBkYXlMZW5ndGg7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGRheUxlbmd0aDtcblx0XHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0Rm9ybWF0dGVkRGF0ZShkYXRlVG1wOiBzdHJpbmcsIGRheUJlZm9yZTogYm9vbGVhbiwgeWVhckJlZm9yZTogYm9vbGVhbiwgZGF5TGVuZ3RoOiBudW1iZXIsIG1vbnRoTGVuZ3RoOiBudW1iZXIsIHllYXJMZW5ndGgpOiBEYXRlIHtcblx0XHRsZXQgZGF5SW5EYXRlOiBudW1iZXI7XG5cdFx0bGV0IG1vbnRoSW5EYXRlOiBudW1iZXI7XG5cdFx0bGV0IHllYXJJbkRhdGU6IG51bWJlcjtcblx0XHRpZiAoeWVhckJlZm9yZSkge1xuXHRcdFx0eWVhckluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZygwLCB5ZWFyTGVuZ3RoKTtcblx0XHRcdGlmIChkYXlCZWZvcmUpIHtcblx0XHRcdFx0ZGF5SW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKHllYXJMZW5ndGgsIHllYXJMZW5ndGggKyBkYXlMZW5ndGgpO1xuXHRcdFx0XHRtb250aEluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyh5ZWFyTGVuZ3RoICsgZGF5TGVuZ3RoKSAtIDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtb250aEluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyh5ZWFyTGVuZ3RoLCB5ZWFyTGVuZ3RoICsgbW9udGhMZW5ndGgpIC0gMTtcblx0XHRcdFx0ZGF5SW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKHllYXJMZW5ndGggKyBtb250aExlbmd0aCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChkYXlCZWZvcmUpIHtcblx0XHRcdFx0ZGF5SW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKDAsIGRheUxlbmd0aCk7XG5cdFx0XHRcdG1vbnRoSW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKGRheUxlbmd0aCwgZGF5TGVuZ3RoICsgbW9udGhMZW5ndGgpIC0gMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vbnRoSW5EYXRlID0gK2RhdGVUbXAuc3Vic3RyaW5nKDAsIG1vbnRoTGVuZ3RoKSAtIDE7XG5cdFx0XHRcdGRheUluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyhtb250aExlbmd0aCwgbW9udGhMZW5ndGggKyBkYXlMZW5ndGgpO1xuXHRcdFx0fVxuXHRcdFx0eWVhckluRGF0ZSA9ICtkYXRlVG1wLnN1YnN0cmluZyhtb250aExlbmd0aCArIGRheUxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKHllYXJJbkRhdGUgPCAxMDApIHtcblx0XHRcdHllYXJJbkRhdGUgPSAyMDAwICsgeWVhckluRGF0ZTtcblx0XHR9XG5cdFx0cmV0dXJuICh0aGlzLmNoZWNrTW9udGhOdW1iZXIobW9udGhJbkRhdGUpICYmIHRoaXMuY2hlY2tEYXlOdW1iZXIoeWVhckluRGF0ZSxtb250aEluRGF0ZSxkYXlJbkRhdGUpKVxuXHRcdFx0PyBuZXcgRGF0ZSh5ZWFySW5EYXRlLCBtb250aEluRGF0ZSwgZGF5SW5EYXRlKVxuXHRcdFx0OiBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSBjaGVja01vbnRoTnVtYmVyKG1vbnRoSW5EYXRlOiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKG1vbnRoSW5EYXRlID49IDAgJiYgbW9udGhJbkRhdGUgPD0gMTEpOyAvLyBNb250aHMgZ28gZnJvbSAwIHRvIDExXG5cdH1cblxuXHRwcml2YXRlIGNoZWNrRGF5TnVtYmVyKHllYXJJbkRhdGU6IG51bWJlciwgbW9udGhJbkRhdGU6IG51bWJlciwgZGF5SW5EYXRlOiBudW1iZXIpOiBib29sZWFue1xuXHRcdHJldHVybiAoZGF5SW5EYXRlID49IDEgJiYgZGF5SW5EYXRlIDw9IGdldERheXNJbk1vbnRoKG5ldyBEYXRlKHllYXJJbkRhdGUsIG1vbnRoSW5EYXRlKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXREYXRlU2VwYXJhdG9yKGRhdGVGb3JtYXQ6IHN0cmluZykge1xuXHRcdGxldCBkYXRlU2VwYXJhdG9yOiBzdHJpbmc7XG5cdFx0aWYgKGRhdGVGb3JtYXQuaW5jbHVkZXMoJy8nKSkge1xuXHRcdFx0ZGF0ZVNlcGFyYXRvciA9ICcvJztcblx0XHR9IGVsc2UgaWYgKGRhdGVGb3JtYXQuaW5jbHVkZXMoJy0nKSkge1xuXHRcdFx0ZGF0ZVNlcGFyYXRvciA9ICctJztcblx0XHR9IGVsc2UgaWYgKGRhdGVGb3JtYXQuaW5jbHVkZXMoJy4nKSkge1xuXHRcdFx0ZGF0ZVNlcGFyYXRvciA9ICcuJztcblx0XHR9XG5cdFx0cmV0dXJuIGRhdGVTZXBhcmF0b3I7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNlcGFyYXRvcihkYXRlVG1wOiBzdHJpbmcsIGRhdGVTZXBhcmF0b3I6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGRhdGVUbXAuc3BsaXQoZGF0ZVNlcGFyYXRvcilcblx0XHRcdC5qb2luKCcnKTtcblx0fVxufVxuIl19