UNPKG

@qeydar/datepicker

Version:

A comprehensive Date and Time Picker for Angular with Jalali calendar support

365 lines 49.7 kB
import { format as formatJalali, parse as parseJalali, addDays as addDaysJalali, addMonths as addMonthsJalali, addYears as addYearsJalali, addHours as addHoursJalali, startOfWeek as startOfWeekJalali, startOfMonth as startOfMonthJalali, endOfMonth as endOfMonthJalali, isSameDay as isSameDayJalali, isSameMonth as isSameMonthJalali, isSameYear as isSameYearJalali, isAfter as isAfterJalali, isBefore as isBeforeJalali, isValid as isValidJalali, max as maxJalali, setYear as setYearJalali, getDaysInMonth as getDaysInMonthJalali } from 'date-fns-jalali'; import { format as formatGregorian, parse as parseGregorian, addDays as addDaysGregorian, addMonths as addMonthsGregorian, addYears as addYearsGregorian, addHours as addHoursGregorian, startOfWeek as startOfWeekGregorian, startOfMonth as startOfMonthGregorian, endOfMonth as endOfMonthGregorian, isSameDay as isSameDayGregorian, isSameMonth as isSameMonthGregorian, isSameYear as isSameYearGregorian, isAfter as isAfterGregorian, isBefore as isBeforeGregorian, isValid as isValidGregorian, max as maxGregorian, setYear as setYearGregorian, getDaysInMonth as getDaysInMonthGregorian, parseISO, startOfDay, isEqual, addMinutes } from 'date-fns'; import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class JalaliDateAdapter { today() { return new Date(); } parse(value, formatString) { if (typeof value === 'string') { // Check if it's in ISO 8601 format if (value.includes('T')) { const parsedDate = parseISO(value); return isValidJalali(parsedDate) ? parsedDate : null; } try { const parsedDate = parseJalali(value, formatString, new Date()); return isValidJalali(parsedDate) ? parsedDate : null; } catch (error) { console.error('Error parsing date:', error); return null; } } else if (value instanceof Date) { return isValidJalali(value) ? value : null; } return null; } format(date, formatString) { return formatJalali(date, formatString); } addDays(date, amount) { return addDaysJalali(date, amount); } addMonths(date, amount) { return addMonthsJalali(date, amount); } addYears(date, amount) { return addYearsJalali(date, amount); } addHours(date, amount) { return addHoursJalali(date, amount); } getYear(date) { return date ? parseInt(formatJalali(date, 'yyyy')) : null; } getMonth(date) { // Jalali months are 1-indexed in date-fns-jalali return date ? parseInt(formatJalali(date, 'M')) - 1 : null; } getDate(date) { return date ? parseInt(formatJalali(date, 'dd')) : null; } getDayOfWeek(date) { return parseInt(formatJalali(date, 'i')) - 1; } getMonthNames(style) { const jalaliMonths = [ 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند' ]; switch (style) { case 'long': return jalaliMonths; case 'short': return jalaliMonths.map(month => month.substring(0, 3)); case 'narrow': return jalaliMonths.map(month => month.substring(0, 1)); default: return jalaliMonths; } } getDateNames() { return Array.from({ length: 31 }, (_, i) => (i + 1).toString()); } getDayOfWeekNames(style) { const formats = { long: 'EEEE', short: 'EEEEE', narrow: 'EEEEEE' }; return Array.from({ length: 7 }, (_, i) => formatJalali(addDaysJalali(startOfWeekJalali(new Date()), i), formats[style])); } getFirstDayOfWeek() { return 6; // Saturday is the first day of the week in the Jalali calendar } getNumDaysInMonth(date) { return parseInt(formatJalali(endOfMonthJalali(date), 'd')); } clone(date) { return new Date(date.getTime()); } createDate(year, month, date) { // Adjust for 0-indexed months in the interface vs 1-indexed months in date-fns-jalali return parseJalali(`${year}/${month + 1}/${date}`, 'yyyy/M/d', new Date()); } isSameDay(date1, date2) { return isSameDayJalali(date1, date2); } isSameMonth(date1, date2) { return isSameMonthJalali(date1, date2); } isSameYear(date1, date2) { return isSameYearJalali(date1, date2); } isAfter(date1, date2) { return isAfterJalali(date1, date2); } isBefore(date1, date2) { return isBeforeJalali(date1, date2); } isEqual(date1, date2) { return isEqual(date1, date2); } startOfMonth(date) { return startOfMonthJalali(date); } endOfMonth(date) { return endOfMonthJalali(date); } startOfWeek(date) { return startOfWeekJalali(date, { weekStartsOn: this.getFirstDayOfWeek() }); } isValidFormat(dateString, formatString) { try { const parsedDate = parseJalali(dateString, formatString, new Date()); if (!isValidJalali(parsedDate)) { return false; } // Check if the formatted parsed date matches the original date string const formattedDate = formatJalali(parsedDate, formatString); return formattedDate === dateString; } catch (error) { return false; } } max(dates) { return maxJalali(dates); } setYear(date, year) { return setYearJalali(date, year); } startOfDay(date) { return startOfDay(date); } getHours(date) { return date ? parseInt(formatJalali(date, 'HH')) : null; } getMinutes(date) { return date ? parseInt(formatJalali(date, 'mm')) : null; } getSeconds(date) { return date ? parseInt(formatJalali(date, 'ss')) : null; } setHours(date, hours) { const newDate = this.clone(date); newDate.setHours(hours); return newDate; } setMinutes(date, minutes) { const newDate = this.clone(date); newDate.setMinutes(minutes); return newDate; } setSeconds(date, seconds) { const newDate = this.clone(date); newDate.setSeconds(seconds); return newDate; } getDaysInMonth(date) { return getDaysInMonthJalali(date); } addMinutes(date, amount) { return addMinutes(date, amount); } } JalaliDateAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JalaliDateAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); JalaliDateAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JalaliDateAdapter, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JalaliDateAdapter, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); export class GregorianDateAdapter { today() { return new Date(); } parse(value, formatString) { if (typeof value === 'string') { // Check if it's in ISO 8601 format if (value.includes('T')) { const parsedDate = parseISO(value); return isValidGregorian(parsedDate) ? parsedDate : null; } try { let parsedDate; if (formatString === "ISO") { parsedDate = parseISO(value); } else { parsedDate = parseGregorian(value, formatString, new Date()); } return isValidGregorian(parsedDate) ? parsedDate : null; } catch (error) { console.error('Error parsing date:', error); return null; } } else if (value instanceof Date) { return isValidGregorian(value) ? value : null; } return null; } format(date, formatString) { return formatGregorian(date, formatString); } addDays(date, amount) { return addDaysGregorian(date, amount); } addMonths(date, amount) { return addMonthsGregorian(date, amount); } addYears(date, amount) { return addYearsGregorian(date, amount); } addHours(date, amount) { return addHoursGregorian(date, amount); } getYear(date) { return date.getFullYear(); } getMonth(date) { return date.getMonth(); } getDate(date) { return date.getDate(); } getDayOfWeek(date) { return date.getDay(); } getMonthNames(style) { const formats = { long: 'MMMM', short: 'MMM', narrow: 'MMMMM' }; return Array.from({ length: 12 }, (_, i) => formatGregorian(new Date(2000, i, 1), formats[style])); } getDateNames() { return Array.from({ length: 31 }, (_, i) => (i + 1).toString()); } getDayOfWeekNames(style) { const formats = { long: 'EEEE', short: 'EEE', narrow: 'EEEEE' }; return Array.from({ length: 7 }, (_, i) => formatGregorian(addDaysGregorian(startOfWeekGregorian(new Date()), i), formats[style])); } getFirstDayOfWeek() { return 0; // Sunday is the first day of the week in the Gregorian calendar } getNumDaysInMonth(date) { return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(); } clone(date) { return new Date(date.getTime()); } createDate(year, month, date) { return new Date(year, month, date); } isSameDay(date1, date2) { return isSameDayGregorian(date1, date2); } isSameMonth(date1, date2) { return isSameMonthGregorian(date1, date2); } isSameYear(date1, date2) { return isSameYearGregorian(date1, date2); } isAfter(date1, date2) { return isAfterGregorian(date1, date2); } isBefore(date1, date2) { return isBeforeGregorian(date1, date2); } isEqual(date1, date2) { return isEqual(date1, date2); } startOfMonth(date) { return startOfMonthGregorian(date); } endOfMonth(date) { return endOfMonthGregorian(date); } startOfWeek(date) { return startOfWeekGregorian(date, { weekStartsOn: this.getFirstDayOfWeek() }); } isValidFormat(dateString, formatString) { try { const parsedDate = parseGregorian(dateString, formatString, new Date()); if (!isValidGregorian(parsedDate)) { return false; } // Check if the formatted parsed date matches the original date string const formattedDate = formatGregorian(parsedDate, formatString); return formattedDate === dateString; } catch (error) { return false; } } max(dates) { return maxGregorian(dates); } setYear(date, year) { return setYearGregorian(date, year); } startOfDay(date) { return startOfDay(date); } getHours(date) { return date ? date.getHours() : null; } getMinutes(date) { return date ? date.getMinutes() : null; } getSeconds(date) { return date ? date.getSeconds() : null; } setHours(date, hours) { const newDate = this.clone(date); newDate.setHours(hours); return newDate; } setMinutes(date, minutes) { const newDate = this.clone(date); newDate.setMinutes(minutes); return newDate; } setSeconds(date, seconds) { const newDate = this.clone(date); newDate.setSeconds(seconds); return newDate; } getDaysInMonth(date) { return getDaysInMonthGregorian(date); } addMinutes(date, amount) { return addMinutes(date, amount); } } GregorianDateAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GregorianDateAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); GregorianDateAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GregorianDateAdapter, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GregorianDateAdapter, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvcWV5ZGFyLWRhdGVwaWNrZXIvc3JjL2RhdGUtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsTUFBTSxJQUFJLFlBQVksRUFDdEIsS0FBSyxJQUFJLFdBQVcsRUFDcEIsT0FBTyxJQUFJLGFBQWEsRUFDeEIsU0FBUyxJQUFJLGVBQWUsRUFDNUIsUUFBUSxJQUFJLGNBQWMsRUFDMUIsUUFBUSxJQUFJLGNBQWMsRUFDMUIsV0FBVyxJQUFJLGlCQUFpQixFQUNoQyxZQUFZLElBQUksa0JBQWtCLEVBQ2xDLFVBQVUsSUFBSSxnQkFBZ0IsRUFDOUIsU0FBUyxJQUFJLGVBQWUsRUFDNUIsV0FBVyxJQUFJLGlCQUFpQixFQUNoQyxVQUFVLElBQUksZ0JBQWdCLEVBQzlCLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLFFBQVEsSUFBSSxjQUFjLEVBQzFCLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLEdBQUcsSUFBSSxTQUFTLEVBQ2hCLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLGNBQWMsSUFBSSxvQkFBb0IsRUFDdkMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQ0wsTUFBTSxJQUFJLGVBQWUsRUFDekIsS0FBSyxJQUFJLGNBQWMsRUFDdkIsT0FBTyxJQUFJLGdCQUFnQixFQUMzQixTQUFTLElBQUksa0JBQWtCLEVBQy9CLFFBQVEsSUFBSSxpQkFBaUIsRUFDN0IsUUFBUSxJQUFJLGlCQUFpQixFQUM3QixXQUFXLElBQUksb0JBQW9CLEVBQ25DLFlBQVksSUFBSSxxQkFBcUIsRUFDckMsVUFBVSxJQUFJLG1CQUFtQixFQUNqQyxTQUFTLElBQUksa0JBQWtCLEVBQy9CLFdBQVcsSUFBSSxvQkFBb0IsRUFDbkMsVUFBVSxJQUFJLG1CQUFtQixFQUNqQyxPQUFPLElBQUksZ0JBQWdCLEVBQzNCLFFBQVEsSUFBSSxpQkFBaUIsRUFD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Q3ZDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBVSxFQUFFLE1BQWM7UUFDbkMsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O2lIQS9NVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIGZvcm1hdCBhcyBmb3JtYXRKYWxhbGksXHJcbiAgcGFyc2UgYXMgcGFyc2VKYWxhbGksXHJcbiAgYWRkRGF5cyBhcyBhZGREYXlzSmFsYWxpLFxyXG4gIGFkZE1vbnRocyBhcyBhZGRNb250aHNKYWxhbGksXHJcbiAgYWRkWWVhcnMgYXMgYWRkWWVhcnNKYWxhbGksXHJcbiAgYWRkSG91cnMgYXMgYWRkSG91cnNKYWxhbGksXHJcbiAgc3RhcnRPZldlZWsgYXMgc3RhcnRPZldlZWtKYWxhbGksXHJcbiAgc3RhcnRPZk1vbnRoIGFzIHN0YXJ0T2ZNb250aEphbGFsaSxcclxuICBlbmRPZk1vbnRoIGFzIGVuZE9mTW9udGhKYWxhbGksXHJcbiAgaXNTYW1lRGF5IGFzIGlzU2FtZURheUphbGFsaSxcclxuICBpc1NhbWVNb250aCBhcyBpc1NhbWVNb250aEphbGFsaSxcclxuICBpc1NhbWVZZWFyIGFzIGlzU2FtZVllYXJKYWxhbGksXHJcbiAgaXNBZnRlciBhcyBpc0FmdGVySmFsYWxpLFxyXG4gIGlzQmVmb3JlIGFzIGlzQmVmb3JlSmFsYWxpLFxyXG4gIGlzVmFsaWQgYXMgaXNWYWxpZEphbGFsaSxcclxuICBtYXggYXMgbWF4SmFsYWxpLFxyXG4gIHNldFllYXIgYXMgc2V0WWVhckphbGFsaSxcclxuICBnZXREYXlzSW5Nb250aCBhcyBnZXREYXlzSW5Nb250aEphbGFsaVxyXG59IGZyb20gJ2RhdGUtZm5zLWphbGFsaSc7XHJcblxyXG5pbXBvcnQge1xyXG4gIGZvcm1hdCBhcyBmb3JtYXRHcmVnb3JpYW4sXHJcbiAgcGFyc2UgYXMgcGFyc2VHcmVnb3JpYW4sXHJcbiAgYWRkRGF5cyBhcyBhZGREYXlzR3JlZ29yaWFuLFxyXG4gIGFkZE1vbnRocyBhcyBhZGRNb250aHNHcmVnb3JpYW4sXHJcbiAgYWRkWWVhcnMgYXMgYWRkWWVhcnNHcmVnb3JpYW4sXHJcbiAgYWRkSG91cnMgYXMgYWRkSG91cnNHcmVnb3JpYW4sXHJcbiAgc3RhcnRPZldlZWsgYXMgc3RhcnRPZldlZWtHcmVnb3JpYW4sXHJcbiAgc3RhcnRPZk1vbnRoIGFzIHN0YXJ0T2ZNb250aEdyZWdvcmlhbixcclxuICBlbmRPZk1vbnRoIGFzIGVuZE9mTW9udGhHcmVnb3JpYW4sXHJcbiAgaXNTYW1lRGF5IGFzIGlzU2FtZURheUdyZWdvcmlhbixcclxuICBpc1NhbWVNb250aCBhcyBpc1NhbWVNb250aEdyZWdvcmlhbixcclxuICBpc1NhbWVZZWFyIGFzIGlzU2FtZVllYXJHcmVnb3JpYW4sXHJcbiAgaXNBZnRlciBhcyBpc0FmdGVyR3JlZ29yaWFuLFxyXG4gIGlzQmVmb3JlIGFzIGlzQmVmb3JlR3JlZ29yaWFuLFxyXG4gIGlzVmFsaWQgYXMgaXNWYWxpZEdyZWdvcmlhbixcclxuICBtYXggYXMgbWF4R3JlZ29yaWFuLFxyXG4gIHNldFllYXIgYXMgc2V0WWVhckdyZWdvcmlhbixcclxuICBnZXREYXlzSW5Nb250aCBhcyBnZXREYXlzSW5Nb250aEdyZWdvcmlhbixcclxuICBwYXJzZUlTTyxcclxuICBzdGFydE9mRGF5LFxyXG4gIGlzRXF1YWwsXHJcbiAgYWRkTWludXRlc1xyXG59IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXRlQWRhcHRlcjxEPiB7XHJcbiAgdG9kYXkoKTogRDtcclxuICBwYXJzZSh2YWx1ZTogYW55LCBmb3JtYXRTdHJpbmc6IHN0cmluZyk6IEQgfCBudWxsO1xyXG4gIGZvcm1hdChkYXRlOiBELCBmb3JtYXRTdHJpbmc6IHN0cmluZyk6IHN0cmluZztcclxuICBhZGREYXlzKGRhdGU6IEQsIGFtb3VudDogbnVtYmVyKTogRDtcclxuICBhZGRNb250aHMoZGF0ZTogRCwgYW1vdW50OiBudW1iZXIpOiBEO1xyXG4gIGFkZFllYXJzKGRhdGU6IEQsIGFtb3VudDogbnVtYmVyKTogRDtcclxuICBhZGRIb3VycyhkYXRlOiBELCBhbW91bnQ6IG51bWJlcik6IEQ7XHJcbiAgZ2V0WWVhcihkYXRlOiBEKTogbnVtYmVyfG51bGw7XHJcbiAgZ2V0TW9udGgoZGF0ZTogRCk6IG51bWJlcnxudWxsO1xyXG4gIGdldERhdGUoZGF0ZTogRCk6IG51bWJlcnxudWxsO1xyXG4gIGdldERheU9mV2VlayhkYXRlOiBEKTogbnVtYmVyO1xyXG4gIGdldE1vbnRoTmFtZXMoc3R5bGU6ICdsb25nJyB8ICdzaG9ydCcgfCAnbmFycm93Jyk6IHN0cmluZ1tdO1xyXG4gIGdldERhdGVOYW1lcygpOiBzdHJpbmdbXTtcclxuICBnZXREYXlPZldlZWtOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW107XHJcbiAgZ2V0Rmlyc3REYXlPZldlZWsoKTogbnVtYmVyO1xyXG4gIGdldE51bURheXNJbk1vbnRoKGRhdGU6IEQpOiBudW1iZXI7XHJcbiAgY2xvbmUoZGF0ZTogRCk6IEQ7XHJcbiAgY3JlYXRlRGF0ZSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRhdGU6IG51bWJlcik6IEQ7XHJcbiAgaXNTYW1lRGF5KGRhdGUxOiBELCBkYXRlMjogRCk6IGJvb2xlYW47XHJcbiAgaXNTYW1lTW9udGgoZGF0ZTE6IEQsIGRhdGUyOiBEKTogYm9vbGVhbjtcclxuICBpc1NhbWVZZWFyKGRhdGUxOiBELCBkYXRlMjogRCk6IGJvb2xlYW47XHJcbiAgaXNBZnRlcihkYXRlMTogRCwgZGF0ZTI6IEQpOiBib29sZWFuO1xyXG4gIGlzQmVmb3JlKGRhdGUxOiBELCBkYXRlMjogRCk6IGJvb2xlYW47XHJcbiAgaXNFcXVhbChkYXRlMTogRCwgZGF0ZTI6IEQpOiBib29sZWFuO1xyXG4gIHN0YXJ0T2ZNb250aChkYXRlOiBEKTogRDtcclxuICBlbmRPZk1vbnRoKGRhdGU6IEQpOiBEO1xyXG4gIHN0YXJ0T2ZXZWVrKGRhdGU6IEQpOiBEO1xyXG4gIGlzVmFsaWRGb3JtYXQoZGF0ZVN0cmluZzogc3RyaW5nLCBmb3JtYXRTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW47XHJcbiAgbWF4KGRhdGVzOiBEW10pOiBEO1xyXG4gIHNldFllYXIoZGF0ZTogRCwgeWVhcjogbnVtYmVyKTogRDtcclxuICBzdGFydE9mRGF5IChkYXRlOiBEKTogRDtcclxuICBnZXRIb3VycyhkYXRlOiBEKTogbnVtYmVyfG51bGw7XHJcbiAgZ2V0TWludXRlcyhkYXRlOiBEKTogbnVtYmVyfG51bGw7XHJcbiAgZ2V0U2Vjb25kcyhkYXRlOiBEKTogbnVtYmVyfG51bGw7XHJcbiAgc2V0SG91cnMoZGF0ZTogRCwgaG91cnM6IG51bWJlcik6IEQ7XHJcbiAgc2V0TWludXRlcyhkYXRlOiBELCBtaW51dGVzOiBudW1iZXIpOiBEO1xyXG4gIHNldFNlY29uZHMoZGF0ZTogRCwgc2Vjb25kczogbnVtYmVyKTogRDtcclxuICBnZXREYXlzSW5Nb250aChkYXRlOiBEKTogbnVtYmVyO1xyXG4gIGFkZE1pbnV0ZXMoZGF0ZTogRCwgYW1vdW50OiBudW1iZXIpOiBEO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBKYWxhbGlEYXRlQWRhcHRlciBpbXBsZW1lbnRzIERhdGVBZGFwdGVyPERhdGU+IHtcclxuICB0b2RheSgpOiBEYXRlIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcGFyc2UodmFsdWU6IGFueSwgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGluIElTTyA4NjAxIGZvcm1hdFxyXG4gICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJ1QnKSkge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBwYXJzZUlTTyh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzVmFsaWRKYWxhbGkocGFyc2VkRGF0ZSkgPyBwYXJzZWREYXRlIDogbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gcGFyc2VKYWxhbGkodmFsdWUsIGZvcm1hdFN0cmluZywgbmV3IERhdGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIGlzVmFsaWRKYWxhbGkocGFyc2VkRGF0ZSkgPyBwYXJzZWREYXRlIDogbnVsbDtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGRhdGU6JywgZXJyb3IpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gaXNWYWxpZEphbGFsaSh2YWx1ZSkgPyB2YWx1ZSA6IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGZvcm1hdChkYXRlOiBEYXRlLCBmb3JtYXRTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZm9ybWF0SmFsYWxpKGRhdGUsIGZvcm1hdFN0cmluZyk7XHJcbiAgfVxyXG5cclxuICBhZGREYXlzKGRhdGU6IERhdGUsIGFtb3VudDogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gYWRkRGF5c0phbGFsaShkYXRlLCBhbW91bnQpO1xyXG4gIH1cclxuXHJcbiAgYWRkTW9udGhzKGRhdGU6IERhdGUsIGFtb3VudDogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gYWRkTW9udGhzSmFsYWxpKGRhdGUsIGFtb3VudCk7XHJcbiAgfVxyXG5cclxuICBhZGRZZWFycyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcik6IERhdGUge1xyXG4gICAgcmV0dXJuIGFkZFllYXJzSmFsYWxpKGRhdGUsIGFtb3VudCk7XHJcbiAgfVxyXG5cclxuICBhZGRIb3VycyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcik6IERhdGUge1xyXG4gICAgcmV0dXJuIGFkZEhvdXJzSmFsYWxpKGRhdGUsIGFtb3VudCk7XHJcbiAgfVxyXG5cclxuICBnZXRZZWFyKGRhdGU6IERhdGUpOiBudW1iZXJ8bnVsbCB7XHJcbiAgICByZXR1cm4gZGF0ZT8gcGFyc2VJbnQoZm9ybWF0SmFsYWxpKGRhdGUsICd5eXl5JykpOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcclxuICAgIC8vIEphbGFsaSBtb250aHMgYXJlIDEtaW5kZXhlZCBpbiBkYXRlLWZucy1qYWxhbGlcclxuICAgIHJldHVybiBkYXRlPyBwYXJzZUludChmb3JtYXRKYWxhbGkoZGF0ZSwgJ00nKSkgLSAxOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZShkYXRlOiBEYXRlKTogbnVtYmVyfG51bGwge1xyXG4gICAgcmV0dXJuIGRhdGU/IHBhcnNlSW50KGZvcm1hdEphbGFsaShkYXRlLCAnZGQnKSk6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXREYXlPZldlZWsoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gcGFyc2VJbnQoZm9ybWF0SmFsYWxpKGRhdGUsICdpJykpIC0gMTtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoTmFtZXMoc3R5bGU6ICdsb25nJyB8ICdzaG9ydCcgfCAnbmFycm93Jyk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGphbGFsaU1vbnRocyA9IFtcclxuICAgICAgJ9mB2LHZiNix2K/bjNmGJywgJ9in2LHYr9uM2KjZh9i02KonLCAn2K7Ysdiv2KfYrycsICfYqtuM2LEnLCAn2YXYsdiv2KfYrycsICfYtNmH2LHbjNmI2LEnLFxyXG4gICAgICAn2YXZh9ixJywgJ9ii2KjYp9mGJywgJ9ii2LDYsScsICfYr9uMJywgJ9io2YfZhdmGJywgJ9in2LPZgdmG2K8nXHJcbiAgICBdO1xyXG5cclxuICAgIHN3aXRjaCAoc3R5bGUpIHtcclxuICAgICAgY2FzZSAnbG9uZyc6XHJcbiAgICAgICAgcmV0dXJuIGphbGFsaU1vbnRocztcclxuICAgICAgY2FzZSAnc2hvcnQnOlxyXG4gICAgICAgIHJldHVybiBqYWxhbGlNb250aHMubWFwKG1vbnRoID0+IG1vbnRoLnN1YnN0cmluZygwLCAzKSk7XHJcbiAgICAgIGNhc2UgJ25hcnJvdyc6XHJcbiAgICAgICAgcmV0dXJuIGphbGFsaU1vbnRocy5tYXAobW9udGggPT4gbW9udGguc3Vic3RyaW5nKDAsIDEpKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gamFsYWxpTW9udGhzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZU5hbWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gKGkgKyAxKS50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIGdldERheU9mV2Vla05hbWVzKHN0eWxlOiAnbG9uZycgfCAnc2hvcnQnIHwgJ25hcnJvdycpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBmb3JtYXRzID0ge1xyXG4gICAgICBsb25nOiAnRUVFRScsXHJcbiAgICAgIHNob3J0OiAnRUVFRUUnLFxyXG4gICAgICBuYXJyb3c6ICdFRUVFRUUnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDcgfSwgKF8sIGkpID0+XHJcbiAgICAgIGZvcm1hdEphbGFsaShhZGREYXlzSmFsYWxpKHN0YXJ0T2ZXZWVrSmFsYWxpKG5ldyBEYXRlKCkpLCBpKSwgZm9ybWF0c1tzdHlsZV0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiA2OyAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGluIHRoZSBKYWxhbGkgY2FsZW5kYXJcclxuICB9XHJcblxyXG4gIGdldE51bURheXNJbk1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHBhcnNlSW50KGZvcm1hdEphbGFsaShlbmRPZk1vbnRoSmFsYWxpKGRhdGUpLCAnZCcpKTtcclxuICB9XHJcblxyXG4gIGNsb25lKGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVEYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF0ZTogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICAvLyBBZGp1c3QgZm9yIDAtaW5kZXhlZCBtb250aHMgaW4gdGhlIGludGVyZmFjZSB2cyAxLWluZGV4ZWQgbW9udGhzIGluIGRhdGUtZm5zLWphbGFsaVxyXG4gICAgcmV0dXJuIHBhcnNlSmFsYWxpKGAke3llYXJ9LyR7bW9udGggKyAxfS8ke2RhdGV9YCwgJ3l5eXkvTS9kJywgbmV3IERhdGUoKSk7XHJcbiAgfVxyXG5cclxuICBpc1NhbWVEYXkoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaXNTYW1lRGF5SmFsYWxpKGRhdGUxLCBkYXRlMik7XHJcbiAgfVxyXG5cclxuICBpc1NhbWVNb250aChkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpc1NhbWVNb250aEphbGFsaShkYXRlMSwgZGF0ZTIpO1xyXG4gIH1cclxuXHJcbiAgaXNTYW1lWWVhcihkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpc1NhbWVZZWFySmFsYWxpKGRhdGUxLCBkYXRlMik7XHJcbiAgfVxyXG5cclxuICBpc0FmdGVyKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzQWZ0ZXJKYWxhbGkoZGF0ZTEsIGRhdGUyKTtcclxuICB9XHJcblxyXG4gIGlzQmVmb3JlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzQmVmb3JlSmFsYWxpKGRhdGUxLCBkYXRlMik7XHJcbiAgfVxyXG5cclxuICBpc0VxdWFsKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzRXF1YWwoZGF0ZTEsIGRhdGUyKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0T2ZNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gc3RhcnRPZk1vbnRoSmFsYWxpKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZW5kT2ZNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gZW5kT2ZNb250aEphbGFsaShkYXRlKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0T2ZXZWVrKGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIHJldHVybiBzdGFydE9mV2Vla0phbGFsaShkYXRlLCB7IHdlZWtTdGFydHNPbjogdGhpcy5nZXRGaXJzdERheU9mV2VlaygpIGFzIDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfSk7XHJcbiAgfVxyXG5cclxuICBpc1ZhbGlkRm9ybWF0KGRhdGVTdHJpbmc6IHN0cmluZywgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBwYXJzZUphbGFsaShkYXRlU3RyaW5nLCBmb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpO1xyXG4gICAgICBpZiAoIWlzVmFsaWRKYWxhbGkocGFyc2VkRGF0ZSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZvcm1hdHRlZCBwYXJzZWQgZGF0ZSBtYXRjaGVzIHRoZSBvcmlnaW5hbCBkYXRlIHN0cmluZ1xyXG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gZm9ybWF0SmFsYWxpKHBhcnNlZERhdGUsIGZvcm1hdFN0cmluZyk7XHJcbiAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRlID09PSBkYXRlU3RyaW5nO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWF4KGRhdGVzOiBEYXRlW10pOiBEYXRlIHtcclxuICAgIHJldHVybiBtYXhKYWxhbGkoZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgc2V0WWVhcihkYXRlOiBEYXRlLCB5ZWFyOiBudW1iZXIpOiBEYXRlIHtcclxuICAgIHJldHVybiBzZXRZZWFySmFsYWxpKGRhdGUsIHllYXIpXHJcbiAgfVxyXG5cclxuICBzdGFydE9mRGF5KGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIHJldHVybiBzdGFydE9mRGF5KGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SG91cnMoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcclxuICAgIHJldHVybiBkYXRlPyBwYXJzZUludChmb3JtYXRKYWxhbGkoZGF0ZSwgJ0hIJykpOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWludXRlcyhkYXRlOiBEYXRlKTogbnVtYmVyfG51bGwge1xyXG4gICAgcmV0dXJuIGRhdGU/IHBhcnNlSW50KGZvcm1hdEphbGFsaShkYXRlLCAnbW0nKSk6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRTZWNvbmRzKGRhdGU6IERhdGUpOiBudW1iZXJ8bnVsbCB7XHJcbiAgICByZXR1cm4gZGF0ZT8gcGFyc2VJbnQoZm9ybWF0SmFsYWxpKGRhdGUsICdzcycpKTogbnVsbDtcclxuICB9XHJcblxyXG4gIHNldEhvdXJzKGRhdGU6IERhdGUsIGhvdXJzOiBudW1iZXIpOiBEYXRlIHtcclxuICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmNsb25lKGRhdGUpO1xyXG4gICAgbmV3RGF0ZS5zZXRIb3Vycyhob3Vycyk7XHJcbiAgICByZXR1cm4gbmV3RGF0ZTtcclxuICB9XHJcblxyXG4gIHNldE1pbnV0ZXMoZGF0ZTogRGF0ZSwgbWludXRlczogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5jbG9uZShkYXRlKTtcclxuICAgIG5ld0RhdGUuc2V0TWludXRlcyhtaW51dGVzKTtcclxuICAgIHJldHVybiBuZXdEYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0U2Vjb25kcyhkYXRlOiBEYXRlLCBzZWNvbmRzOiBudW1iZXIpOiBEYXRlIHtcclxuICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmNsb25lKGRhdGUpO1xyXG4gICAgbmV3RGF0ZS5zZXRTZWNvbmRzKHNlY29uZHMpO1xyXG4gICAgcmV0dXJuIG5ld0RhdGU7XHJcbiAgfVxyXG5cclxuICBnZXREYXlzSW5Nb250aChkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gZ2V0RGF5c0luTW9udGhKYWxhbGkoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBhZGRNaW51dGVzKGRhdGU6IERhdGUsIGFtb3VudDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gYWRkTWludXRlcyhkYXRlLCBhbW91bnQpO1xyXG4gIH1cclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JlZ29yaWFuRGF0ZUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRlQWRhcHRlcjxEYXRlPiB7XHJcbiAgdG9kYXkoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoKTtcclxuICB9XHJcblxyXG4gIHBhcnNlKHZhbHVlOiBhbnksIGZvcm1hdFN0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgIC8vIENoZWNrIGlmIGl0J3MgaW4gSVNPIDg2MDEgZm9ybWF0XHJcbiAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJ1QnKSkge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBwYXJzZUlTTyh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzVmFsaWRHcmVnb3JpYW4ocGFyc2VkRGF0ZSkgPyBwYXJzZWREYXRlIDogbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBsZXQgcGFyc2VkRGF0ZTogRGF0ZTtcclxuICAgICAgICBpZiAoZm9ybWF0U3RyaW5nID09PSBcIklTT1wiKSB7XHJcbiAgICAgICAgICBwYXJzZWREYXRlID0gcGFyc2VJU08odmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJzZWREYXRlID0gcGFyc2VHcmVnb3JpYW4odmFsdWUsIGZvcm1hdFN0cmluZywgbmV3IERhdGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc1ZhbGlkR3JlZ29yaWFuKHBhcnNlZERhdGUpID8gcGFyc2VkRGF0ZSA6IG51bGw7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBkYXRlOicsIGVycm9yKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIGlzVmFsaWRHcmVnb3JpYW4odmFsdWUpID8gdmFsdWUgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBmb3JtYXQoZGF0ZTogRGF0ZSwgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGZvcm1hdEdyZWdvcmlhbihkYXRlLCBmb3JtYXRTdHJpbmcpO1xyXG4gIH1cclxuXHJcbiAgYWRkRGF5cyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcik6IERhdGUge1xyXG4gICAgcmV0dXJuIGFkZERheXNHcmVnb3JpYW4oZGF0ZSwgYW1vdW50KTtcclxuICB9XHJcblxyXG4gIGFkZE1vbnRocyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcik6IERhdGUge1xyXG4gICAgcmV0dXJuIGFkZE1vbnRoc0dyZWdvcmlhbihkYXRlLCBhbW91bnQpO1xyXG4gIH1cclxuXHJcbiAgYWRkWWVhcnMoZGF0ZTogRGF0ZSwgYW1vdW50OiBudW1iZXIpOiBEYXRlIHtcclxuICAgIHJldHVybiBhZGRZZWFyc0dyZWdvcmlhbihkYXRlLCBhbW91bnQpO1xyXG4gIH1cclxuXHJcbiAgYWRkSG91cnMoZGF0ZTogRGF0ZSwgYW1vdW50OiBudW1iZXIpOiBEYXRlIHtcclxuICAgIHJldHVybiBhZGRIb3Vyc0dyZWdvcmlhbihkYXRlLCBhbW91bnQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0WWVhcihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG5cclxuICBnZXRNb250aChkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG5cclxuICBnZXREYXRlKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGRhdGUuZ2V0RGF5KCk7XHJcbiAgfVxyXG5cclxuICBnZXRNb250aE5hbWVzKHN0eWxlOiAnbG9uZycgfCAnc2hvcnQnIHwgJ25hcnJvdycpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBmb3JtYXRzID0ge1xyXG4gICAgICBsb25nOiAnTU1NTScsXHJcbiAgICAgIHNob3J0OiAnTU1NJyxcclxuICAgICAgbmFycm93OiAnTU1NTU0nXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0sIChfLCBpKSA9PlxyXG4gICAgICBmb3JtYXRHcmVnb3JpYW4obmV3IERhdGUoMjAwMCwgaSwgMSksIGZvcm1hdHNbc3R5bGVdKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldERhdGVOYW1lcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMzEgfSwgKF8sIGkpID0+IChpICsgMSkudG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICBnZXREYXlPZldlZWtOYW1lcyhzdHlsZTogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgZm9ybWF0cyA9IHtcclxuICAgICAgbG9uZzogJ0VFRUUnLFxyXG4gICAgICBzaG9ydDogJ0VFRScsXHJcbiAgICAgIG5hcnJvdzogJ0VFRUVFJ1xyXG4gICAgfTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PlxyXG4gICAgICBmb3JtYXRHcmVnb3JpYW4oYWRkRGF5c0dyZWdvcmlhbihzdGFydE9mV2Vla0dyZWdvcmlhbihuZXcgRGF0ZSgpKSwgaSksIGZvcm1hdHNbc3R5bGVdKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldEZpcnN0RGF5T2ZXZWVrKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMDsgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgaW4gdGhlIEdyZWdvcmlhbiBjYWxlbmRhclxyXG4gIH1cclxuXHJcbiAgZ2V0TnVtRGF5c0luTW9udGgoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAwKS5nZXREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBjbG9uZShkYXRlOiBEYXRlKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlRGF0ZSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRhdGU6IG51bWJlcik6IERhdGUge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXRlKTtcclxuICB9XHJcblxyXG4gIGlzU2FtZURheShkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpc1NhbWVEYXlHcmVnb3JpYW4oZGF0ZTEsIGRhdGUyKTtcclxuICB9XHJcblxyXG4gIGlzU2FtZU1vbnRoKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzU2FtZU1vbnRoR3JlZ29yaWFuKGRhdGUxLCBkYXRlMik7XHJcbiAgfVxyXG5cclxuICBpc1NhbWVZZWFyKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzU2FtZVllYXJHcmVnb3JpYW4oZGF0ZTEsIGRhdGUyKTtcclxuICB9XHJcblxyXG4gIGlzQWZ0ZXIoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaXNBZnRlckdyZWdvcmlhbihkYXRlMSwgZGF0ZTIpO1xyXG4gIH1cclxuXHJcbiAgaXNCZWZvcmUoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaXNCZWZvcmVHcmVnb3JpYW4oZGF0ZTEsIGRhdGUyKTtcclxuICB9XHJcblxyXG4gIGlzRXF1YWwoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaXNFcXVhbChkYXRlMSwgZGF0ZTIpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRPZk1vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIHJldHVybiBzdGFydE9mTW9udGhHcmVnb3JpYW4oZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBlbmRPZk1vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIHJldHVybiBlbmRPZk1vbnRoR3JlZ29yaWFuKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRPZldlZWsoZGF0ZTogRGF0ZSk6IERhdGUge1xyXG4gICAgcmV0dXJuIHN0YXJ0T2ZXZWVrR3JlZ29yaWFuKGRhdGUsIHsgd2Vla1N0YXJ0c09uOiB0aGlzLmdldEZpcnN0RGF5T2ZXZWVrKCkgYXMgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB9KTtcclxuICB9XHJcblxyXG4gIGlzVmFsaWRGb3JtYXQoZGF0ZVN0cmluZzogc3RyaW5nLCBmb3JtYXRTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlR3JlZ29yaWFuKGRhdGVTdHJpbmcsIGZvcm1hdFN0cmluZywgbmV3IERhdGUoKSk7XHJcbiAgICAgIGlmICghaXNWYWxpZEdyZWdvcmlhbihwYXJzZWREYXRlKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZm9ybWF0dGVkIHBhcnNlZCBkYXRlIG1hdGNoZXMgdGhlIG9yaWdpbmFsIGRhdGUgc3RyaW5nXHJcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBmb3JtYXRHcmVnb3JpYW4ocGFyc2VkRGF0ZSwgZm9ybWF0U3RyaW5nKTtcclxuICAgICAgcmV0dXJuIGZvcm1hdHRlZERhdGUgPT09IGRhdGVTdHJpbmc7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYXgoZGF0ZXM6IERhdGVbXSk6IERhdGUge1xyXG4gICAgcmV0dXJuIG1heEdyZWdvcmlhbihkYXRlcyk7XHJcbiAgfVxyXG5cclxuICBzZXRZZWFyKGRhdGU6IERhdGUsIHllYXI6IG51bWJlcik6IERhdGUge1xyXG4gICAgcmV0dXJuIHNldFllYXJHcmVnb3JpYW4oZGF0ZSwgeWVhcik7XHJcbiAgfVxyXG5cclxuICBzdGFydE9mRGF5KGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIHJldHVybiBzdGFydE9mRGF5KGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SG91cnMoZGF0ZTogRGF0ZSk6IG51bWJlcnxudWxsIHtcclxuICAgIHJldHVybiBkYXRlPyBkYXRlLmdldEhvdXJzKCk6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRNaW51dGVzKGRhdGU6IERhdGUpOiBudW1iZXJ8bnVsbCB7XHJcbiAgICByZXR1cm4gZGF0ZT8gZGF0ZS5nZXRNaW51dGVzKCk6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRTZWNvbmRzKGRhdGU6IERhdGUpOiBudW1iZXJ8bnVsbCB7XHJcbiAgICByZXR1cm4gZGF0ZT8gZGF0ZS5nZXRTZWNvbmRzKCk6IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRIb3VycyhkYXRlOiBEYXRlLCBob3VyczogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5jbG9uZShkYXRlKTtcclxuICAgIG5ld0RhdGUuc2V0SG91cnMoaG91cnMpO1xyXG4gICAgcmV0dXJuIG5ld0RhdGU7XHJcbiAgfVxyXG5cclxuICBzZXRNaW51dGVzKGRhdGU6IERhdGUsIG1pbnV0ZXM6IG51bWJlcik6IERhdGUge1xyXG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuY2xvbmUoZGF0ZSk7XHJcbiAgICBuZXdEYXRlLnNldE1pbnV0ZXMobWludXRlcyk7XHJcbiAgICByZXR1cm4gbmV3RGF0ZTtcclxuICB9XHJcblxyXG4gIHNldFNlY29uZHMoZGF0ZTogRGF0ZSwgc2Vjb25kczogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5jbG9uZShkYXRlKTtcclxuICAgIG5ld0RhdGUuc2V0U2Vjb25kcyhzZWNvbmRzKTtcclxuICAgIHJldHVybiBuZXdEYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF5c0luTW9udGgoZGF0ZTogRGF0ZSkge1xyXG4gICAgcmV0dXJuIGdldERheXNJbk1vbnRoR3JlZ29yaWFuKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgYWRkTWludXRlcyhkYXRlOiBEYXRlLCBhbW91bnQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGFkZE1pbnV0ZXMoZGF0ZSwgYW1vdW50KTtcclxuICB9XHJcbn0iXX0=