UNPKG

@bimeister/pupakit.forms

Version:
125 lines 25.1 kB
import { Injectable } from '@angular/core'; import { filterFalsy, filterNotNil, isNil, shareReplayWithRefCount } from '@bimeister/utilities'; import { BehaviorSubject, combineLatest, NEVER } from 'rxjs'; import { filter, map, switchMap, take } from 'rxjs/operators'; import { dateClearTime } from '../../../declarations/functions/date-clear-time.function'; import { getRangeEndDate } from '../../../declarations/functions/get-range-end-date.function'; import { getRangeStartDate } from '../../../declarations/functions/get-range-start-date.function'; import '../../../declarations/types/date-picker-preview-mode.type'; import '../../../declarations/types/date-picker-selection-mode.type'; import * as i0 from "@angular/core"; const WEEK_DAY_NAMES = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС']; const INVALID_RANGE_SIZE = 2; const VALID_RANGE_SIZE = 2; const DEFAULT_CURRENT_DATE_WITH_CLEARED_TIME = dateClearTime(new Date()); export class DatePickerStateService { constructor() { this.weekDayNames = WEEK_DAY_NAMES; this.currentDate = DEFAULT_CURRENT_DATE_WITH_CLEARED_TIME; this.hours$ = new BehaviorSubject(null); this.minutes$ = new BehaviorSubject(null); this.seconds$ = new BehaviorSubject(null); this.isBackDating$ = new BehaviorSubject(true); this.availableEndDate$ = new BehaviorSubject(Infinity); this.selectionMode$ = new BehaviorSubject('range'); this.previewMode$ = new BehaviorSubject('simple'); this.withSeconds$ = new BehaviorSubject(false); this.selectedDate$ = new BehaviorSubject(null); this.selectedRange$ = new BehaviorSubject([]); this.isSelectionModeDate$ = this.selectionMode$.pipe(map((selectionMode) => selectionMode === 'date'), shareReplayWithRefCount()); this.hoveredDate$ = new BehaviorSubject(null); this.hoveredRange$ = combineLatest([this.selectedRange$, this.hoveredDate$]).pipe(filter((aggregatedDates) => { const selectedRange = aggregatedDates[0]; return !Object.is(selectedRange.length, INVALID_RANGE_SIZE); }), map((aggregatedDates) => { const selectedRange = aggregatedDates[0]; if (Object.is(selectedRange.length, 0)) { return []; } const selectedDateFromRange = selectedRange[selectedRange.length - 1]; const hoveredDate = aggregatedDates[1]; return [selectedDateFromRange, hoveredDate]; }), shareReplayWithRefCount()); } processDateSelection(date) { this.isSelectionModeDate$ .pipe(filterNotNil(), take(1), switchMap((isSelectionModeDate) => { if (isSelectionModeDate) { this.selectedDate$.next(date); return NEVER; } return this.selectedRange$; }), take(1), map((alreadySelectedDates) => Object.is(alreadySelectedDates.length, 1) ? [alreadySelectedDates[alreadySelectedDates.length - 1]] : [])) .subscribe((alreadySelectedDates) => this.selectedRange$.next([...alreadySelectedDates, date])); } processDateHover(date) { this.isSelectionModeDate$.pipe(filterNotNil(), take(1), filterFalsy()).subscribe(() => { this.hoveredDate$.next(date); }); } isSameDate(dateA, dateB) { return !isNil(dateA) && !isNil(dateB) && Object.is(dateA.valueOf(), dateB.valueOf()); } dateIsInDateRange(date, dateRange) { if (isNil(date) || !Array.isArray(dateRange) || Object.is(dateRange.length, 0)) { return false; } const uniqueRangeItemsMs = new Set(dateRange.filter((rangeItem) => !isNil(rangeItem)).map((rangeItem) => rangeItem.valueOf())); const rangeIsInvalid = !Object.is(uniqueRangeItemsMs.size, VALID_RANGE_SIZE); if (rangeIsInvalid) { return false; } const rangeStartDate = getRangeStartDate(dateRange); const rangeEndDate = getRangeEndDate(dateRange); const rangeStartDateMs = rangeStartDate.valueOf(); const rangeEndDateMs = rangeEndDate.valueOf(); const dateToTestMs = date.valueOf(); return rangeStartDateMs < dateToTestMs && rangeEndDateMs > dateToTestMs; } dateIsInDateArray(date, dateArray) { if (isNil(date) || !Array.isArray(dateArray) || Object.is(dateArray.length, 0)) { return false; } return dateArray.some((dateFromRange) => this.isSameDate(dateFromRange, date)); } dateIsRangeStartDate(date, dateRange) { if (isNil(date) || !Array.isArray(dateRange) || Object.is(dateRange.length, 0)) { return false; } const uniqueRangeItemsMs = new Set(dateRange.filter((rangeItem) => !isNil(rangeItem)).map((rangeItem) => rangeItem.valueOf())); const rangeIsInvalid = !Object.is(uniqueRangeItemsMs.size, VALID_RANGE_SIZE); if (rangeIsInvalid) { return false; } const rangeStartDate = getRangeStartDate(dateRange); return this.isSameDate(rangeStartDate, date); } dateIsRangeEndDate(date, dateRange) { if (isNil(date) || !Array.isArray(dateRange) || Object.is(dateRange.length, 0)) { return false; } const uniqueRangeItemsMs = new Set(dateRange.filter((rangeItem) => !isNil(rangeItem)).map((rangeItem) => rangeItem.valueOf())); const rangeIsInvalid = !Object.is(uniqueRangeItemsMs.size, VALID_RANGE_SIZE); if (rangeIsInvalid) { return false; } const rangeEndDate = getRangeEndDate(dateRange); return this.isSameDate(rangeEndDate, date); } dateIsNotAvailable(date, isBackDating, availableEndDate) { return (!isBackDating && date < DEFAULT_CURRENT_DATE_WITH_CLEARED_TIME) || date > availableEndDate; } isDateStartInHoveredAndSelectedRange(date, hoveredRange, selectedRange) { return this.dateIsRangeStartDate(date, hoveredRange) || this.dateIsRangeStartDate(date, selectedRange); } isDateEndInHoveredAndSelectedRange(date, hoveredRange, selectedRange) { return this.dateIsRangeEndDate(date, hoveredRange) || this.dateIsRangeEndDate(date, selectedRange); } } DatePickerStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DatePickerStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); DatePickerStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DatePickerStateService, providedIn: 'any' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DatePickerStateService, decorators: [{ type: Injectable, args: [{ providedIn: 'any' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGUtdGltZS1waWNrZXIvc2VydmljZXMvZGF0ZS1waWNrZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUNsRyxPQUFzQywyREFBMkQsQ0FBQztBQUNsRyxPQUF3Qyw2REFBNkQsQ0FBQzs7QUFFdEcsTUFBTSxjQUFjLEdBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1RSxNQUFNLGtCQUFrQixHQUFXLENBQUMsQ0FBQztBQUNyQyxNQUFNLGdCQUFnQixHQUFXLENBQUMsQ0FBQztBQUVuQyxNQUFNLHNDQUFzQyxHQUFTLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7QUFHL0UsTUFBTSxPQUFPLHNCQUFzQjtJQURuQztRQUVrQixpQkFBWSxHQUFhLGNBQWMsQ0FBQztRQUN4QyxnQkFBVyxHQUFTLHNDQUFzQyxDQUFDO1FBRTNELFdBQU0sR0FBNEIsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLENBQUM7UUFDcEUsYUFBUSxHQUE0QixJQUFJLGVBQWUsQ0FBUyxJQUFJLENBQUMsQ0FBQztRQUN0RSxhQUFRLEdBQTRCLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxDQUFDO1FBRXRFLGtCQUFhLEdBQTZCLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBQzdFLHNCQUFpQixHQUFtQyxJQUFJLGVBQWUsQ0FBZ0IsUUFBUSxDQUFDLENBQUM7UUFFakcsbUJBQWMsR0FDNUIsSUFBSSxlQUFlLENBQTBCLE9BQU8sQ0FBQyxDQUFDO1FBRXhDLGlCQUFZLEdBQTJDLElBQUksZUFBZSxDQUN4RixRQUFRLENBQ1QsQ0FBQztRQUVjLGlCQUFZLEdBQTZCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRTdFLGtCQUFhLEdBQTBCLElBQUksZUFBZSxDQUFPLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLG1CQUFjLEdBQTRCLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRTFFLHlCQUFvQixHQUF3QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDbEYsR0FBRyxDQUFDLENBQUMsYUFBc0MsRUFBRSxFQUFFLENBQUMsYUFBYSxLQUFLLE1BQU0sQ0FBQyxFQUN6RSx1QkFBdUIsRUFBRSxDQUMxQixDQUFDO1FBRWMsaUJBQVksR0FBMEIsSUFBSSxlQUFlLENBQU8sSUFBSSxDQUFDLENBQUM7UUFFdEUsa0JBQWEsR0FBdUIsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlHLE1BQU0sQ0FBQyxDQUFDLGVBQStCLEVBQUUsRUFBRTtZQUN6QyxNQUFNLGFBQWEsR0FBVyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLGVBQStCLEVBQUUsRUFBRTtZQUN0QyxNQUFNLGFBQWEsR0FBVyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxNQUFNLHFCQUFxQixHQUFTLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sV0FBVyxHQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMscUJBQXFCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEVBQ0YsdUJBQXVCLEVBQUUsQ0FDMUIsQ0FBQztLQXFHSDtJQW5HUSxvQkFBb0IsQ0FBQyxJQUFVO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0I7YUFDdEIsSUFBSSxDQUNILFlBQVksRUFBRSxFQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxTQUFTLENBQUMsQ0FBQyxtQkFBNEIsRUFBRSxFQUFFO1lBQ3pDLElBQUksbUJBQW1CLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QixPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxFQUNGLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxHQUFHLENBQUMsQ0FBQyxvQkFBNEIsRUFBRSxFQUFFLENBQ25DLE1BQU0sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3pHLENBQ0Y7YUFDQSxTQUFTLENBQUMsQ0FBQyxvQkFBNEIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RyxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsSUFBVTtRQUNoQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDcEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLEtBQVcsRUFBRSxLQUFXO1FBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVNLGlCQUFpQixDQUFDLElBQVUsRUFBRSxTQUFpQjtRQUNwRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQzlFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLGtCQUFrQixHQUFnQixJQUFJLEdBQUcsQ0FDN0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFlLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUN2RyxDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RGLElBQUksY0FBYyxFQUFFO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLGNBQWMsR0FBUyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBUyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsTUFBTSxnQkFBZ0IsR0FBVyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUQsTUFBTSxjQUFjLEdBQVcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QyxPQUFPLGdCQUFnQixHQUFHLFlBQVksSUFBSSxjQUFjLEdBQUcsWUFBWSxDQUFDO0lBQzFFLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUFVLEVBQUUsU0FBaUI7UUFDcEQsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM5RSxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRU0sb0JBQW9CLENBQUMsSUFBVSxFQUFFLFNBQWlCO1FBQ3ZELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDOUUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sa0JBQWtCLEdBQWdCLElBQUksR0FBRyxDQUM3QyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQWUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQ3ZHLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdEYsSUFBSSxjQUFjLEVBQUU7WUFDbEIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sY0FBYyxHQUFTLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLGtCQUFrQixDQUFDLElBQVUsRUFBRSxTQUFpQjtRQUNyRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQzlFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLGtCQUFrQixHQUFnQixJQUFJLEdBQUcsQ0FDN0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFlLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUN2RyxDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RGLElBQUksY0FBYyxFQUFFO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLFlBQVksR0FBUyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBVSxFQUFFLFlBQXFCLEVBQUUsZ0JBQStCO1FBQzFGLE9BQU8sQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDckcsQ0FBQztJQUVNLG9DQUFvQyxDQUFDLElBQVUsRUFBRSxZQUFvQixFQUFFLGFBQXFCO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFFTSxrQ0FBa0MsQ0FBQyxJQUFVLEVBQUUsWUFBb0IsRUFBRSxhQUFxQjtRQUMvRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRyxDQUFDOztvSEFqSlUsc0JBQXNCO3dIQUF0QixzQkFBc0IsY0FEVCxLQUFLOzRGQUNsQixzQkFBc0I7a0JBRGxDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlsdGVyRmFsc3ksIGZpbHRlck5vdE5pbCwgaXNOaWwsIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50IH0gZnJvbSAnQGJpbWVpc3Rlci91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBORVZFUiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGRhdGVDbGVhclRpbWUgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvZnVuY3Rpb25zL2RhdGUtY2xlYXItdGltZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBnZXRSYW5nZUVuZERhdGUgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvZnVuY3Rpb25zL2dldC1yYW5nZS1lbmQtZGF0ZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBnZXRSYW5nZVN0YXJ0RGF0ZSB9IGZyb20gJy4uLy4uLy4uL2RlY2xhcmF0aW9ucy9mdW5jdGlvbnMvZ2V0LXJhbmdlLXN0YXJ0LWRhdGUuZnVuY3Rpb24nO1xuaW1wb3J0IHsgRGF0ZVBpY2tlclByZXZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL3R5cGVzL2RhdGUtcGlja2VyLXByZXZpZXctbW9kZS50eXBlJztcbmltcG9ydCB7IERhdGVQaWNrZXJTZWxlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL3R5cGVzL2RhdGUtcGlja2VyLXNlbGVjdGlvbi1tb2RlLnR5cGUnO1xuXG5jb25zdCBXRUVLX0RBWV9OQU1FUzogc3RyaW5nW10gPSBbJ9Cf0J0nLCAn0JLQoicsICfQodCgJywgJ9Cn0KInLCAn0J/QoicsICfQodCRJywgJ9CS0KEnXTtcbmNvbnN0IElOVkFMSURfUkFOR0VfU0laRTogbnVtYmVyID0gMjtcbmNvbnN0IFZBTElEX1JBTkdFX1NJWkU6IG51bWJlciA9IDI7XG5cbmNvbnN0IERFRkFVTFRfQ1VSUkVOVF9EQVRFX1dJVEhfQ0xFQVJFRF9USU1FOiBEYXRlID0gZGF0ZUNsZWFyVGltZShuZXcgRGF0ZSgpKTtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAnYW55JyB9KVxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJTdGF0ZVNlcnZpY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgd2Vla0RheU5hbWVzOiBzdHJpbmdbXSA9IFdFRUtfREFZX05BTUVTO1xuICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudERhdGU6IERhdGUgPSBERUZBVUxUX0NVUlJFTlRfREFURV9XSVRIX0NMRUFSRURfVElNRTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaG91cnMkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IG1pbnV0ZXMkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHNlY29uZHMkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXNCYWNrRGF0aW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHVibGljIHJlYWRvbmx5IGF2YWlsYWJsZUVuZERhdGUkOiBCZWhhdmlvclN1YmplY3Q8RGF0ZSB8IG51bWJlcj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGUgfCBudW1iZXI+KEluZmluaXR5KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uTW9kZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlUGlja2VyU2VsZWN0aW9uTW9kZT4gPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZVBpY2tlclNlbGVjdGlvbk1vZGU+KCdyYW5nZScpO1xuXG4gIHB1YmxpYyByZWFkb25seSBwcmV2aWV3TW9kZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlUGlja2VyUHJldmlld01vZGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlUGlja2VyUHJldmlld01vZGU+KFxuICAgICdzaW1wbGUnXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdpdGhTZWNvbmRzJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZT4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZFJhbmdlJDogQmVoYXZpb3JTdWJqZWN0PERhdGVbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGVbXT4oW10pO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc1NlbGVjdGlvbk1vZGVEYXRlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc2VsZWN0aW9uTW9kZSQucGlwZShcbiAgICBtYXAoKHNlbGVjdGlvbk1vZGU6IERhdGVQaWNrZXJTZWxlY3Rpb25Nb2RlKSA9PiBzZWxlY3Rpb25Nb2RlID09PSAnZGF0ZScpLFxuICAgIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50KClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaG92ZXJlZERhdGUkOiBCZWhhdmlvclN1YmplY3Q8RGF0ZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBob3ZlcmVkUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVbXT4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnNlbGVjdGVkUmFuZ2UkLCB0aGlzLmhvdmVyZWREYXRlJF0pLnBpcGUoXG4gICAgZmlsdGVyKChhZ2dyZWdhdGVkRGF0ZXM6IFtEYXRlW10sIERhdGVdKSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFJhbmdlOiBEYXRlW10gPSBhZ2dyZWdhdGVkRGF0ZXNbMF07XG4gICAgICByZXR1cm4gIU9iamVjdC5pcyhzZWxlY3RlZFJhbmdlLmxlbmd0aCwgSU5WQUxJRF9SQU5HRV9TSVpFKTtcbiAgICB9KSxcbiAgICBtYXAoKGFnZ3JlZ2F0ZWREYXRlczogW0RhdGVbXSwgRGF0ZV0pID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUmFuZ2U6IERhdGVbXSA9IGFnZ3JlZ2F0ZWREYXRlc1swXTtcbiAgICAgIGlmIChPYmplY3QuaXMoc2VsZWN0ZWRSYW5nZS5sZW5ndGgsIDApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZUZyb21SYW5nZTogRGF0ZSA9IHNlbGVjdGVkUmFuZ2Vbc2VsZWN0ZWRSYW5nZS5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGhvdmVyZWREYXRlOiBEYXRlID0gYWdncmVnYXRlZERhdGVzWzFdO1xuICAgICAgcmV0dXJuIFtzZWxlY3RlZERhdGVGcm9tUmFuZ2UsIGhvdmVyZWREYXRlXTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheVdpdGhSZWZDb3VudCgpXG4gICk7XG5cbiAgcHVibGljIHByb2Nlc3NEYXRlU2VsZWN0aW9uKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2VsZWN0aW9uTW9kZURhdGUkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyTm90TmlsKCksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoaXNTZWxlY3Rpb25Nb2RlRGF0ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChpc1NlbGVjdGlvbk1vZGVEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSQubmV4dChkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJhbmdlJDtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1hcCgoYWxyZWFkeVNlbGVjdGVkRGF0ZXM6IERhdGVbXSkgPT5cbiAgICAgICAgICBPYmplY3QuaXMoYWxyZWFkeVNlbGVjdGVkRGF0ZXMubGVuZ3RoLCAxKSA/IFthbHJlYWR5U2VsZWN0ZWREYXRlc1thbHJlYWR5U2VsZWN0ZWREYXRlcy5sZW5ndGggLSAxXV0gOiBbXVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChhbHJlYWR5U2VsZWN0ZWREYXRlczogRGF0ZVtdKSA9PiB0aGlzLnNlbGVjdGVkUmFuZ2UkLm5leHQoWy4uLmFscmVhZHlTZWxlY3RlZERhdGVzLCBkYXRlXSkpO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NEYXRlSG92ZXIoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuaXNTZWxlY3Rpb25Nb2RlRGF0ZSQucGlwZShmaWx0ZXJOb3ROaWwoKSwgdGFrZSgxKSwgZmlsdGVyRmFsc3koKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaG92ZXJlZERhdGUkLm5leHQoZGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaXNTYW1lRGF0ZShkYXRlQTogRGF0ZSwgZGF0ZUI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzTmlsKGRhdGVBKSAmJiAhaXNOaWwoZGF0ZUIpICYmIE9iamVjdC5pcyhkYXRlQS52YWx1ZU9mKCksIGRhdGVCLnZhbHVlT2YoKSk7XG4gIH1cblxuICBwdWJsaWMgZGF0ZUlzSW5EYXRlUmFuZ2UoZGF0ZTogRGF0ZSwgZGF0ZVJhbmdlOiBEYXRlW10pOiBib29sZWFuIHtcbiAgICBpZiAoaXNOaWwoZGF0ZSkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSB8fCBPYmplY3QuaXMoZGF0ZVJhbmdlLmxlbmd0aCwgMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdW5pcXVlUmFuZ2VJdGVtc01zOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPihcbiAgICAgIGRhdGVSYW5nZS5maWx0ZXIoKHJhbmdlSXRlbTogRGF0ZSkgPT4gIWlzTmlsKHJhbmdlSXRlbSkpLm1hcCgocmFuZ2VJdGVtOiBEYXRlKSA9PiByYW5nZUl0ZW0udmFsdWVPZigpKVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2VJc0ludmFsaWQ6IGJvb2xlYW4gPSAhT2JqZWN0LmlzKHVuaXF1ZVJhbmdlSXRlbXNNcy5zaXplLCBWQUxJRF9SQU5HRV9TSVpFKTtcbiAgICBpZiAocmFuZ2VJc0ludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2VTdGFydERhdGU6IERhdGUgPSBnZXRSYW5nZVN0YXJ0RGF0ZShkYXRlUmFuZ2UpO1xuICAgIGNvbnN0IHJhbmdlRW5kRGF0ZTogRGF0ZSA9IGdldFJhbmdlRW5kRGF0ZShkYXRlUmFuZ2UpO1xuICAgIGNvbnN0IHJhbmdlU3RhcnREYXRlTXM6IG51bWJlciA9IHJhbmdlU3RhcnREYXRlLnZhbHVlT2YoKTtcbiAgICBjb25zdCByYW5nZUVuZERhdGVNczogbnVtYmVyID0gcmFuZ2VFbmREYXRlLnZhbHVlT2YoKTtcbiAgICBjb25zdCBkYXRlVG9UZXN0TXM6IG51bWJlciA9IGRhdGUudmFsdWVPZigpO1xuXG4gICAgcmV0dXJuIHJhbmdlU3RhcnREYXRlTXMgPCBkYXRlVG9UZXN0TXMgJiYgcmFuZ2VFbmREYXRlTXMgPiBkYXRlVG9UZXN0TXM7XG4gIH1cblxuICBwdWJsaWMgZGF0ZUlzSW5EYXRlQXJyYXkoZGF0ZTogRGF0ZSwgZGF0ZUFycmF5OiBEYXRlW10pOiBib29sZWFuIHtcbiAgICBpZiAoaXNOaWwoZGF0ZSkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZUFycmF5KSB8fCBPYmplY3QuaXMoZGF0ZUFycmF5Lmxlbmd0aCwgMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVBcnJheS5zb21lKChkYXRlRnJvbVJhbmdlOiBEYXRlKSA9PiB0aGlzLmlzU2FtZURhdGUoZGF0ZUZyb21SYW5nZSwgZGF0ZSkpO1xuICB9XG5cbiAgcHVibGljIGRhdGVJc1JhbmdlU3RhcnREYXRlKGRhdGU6IERhdGUsIGRhdGVSYW5nZTogRGF0ZVtdKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTmlsKGRhdGUpIHx8ICFBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkgfHwgT2JqZWN0LmlzKGRhdGVSYW5nZS5sZW5ndGgsIDApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVuaXF1ZVJhbmdlSXRlbXNNczogU2V0PG51bWJlcj4gPSBuZXcgU2V0PG51bWJlcj4oXG4gICAgICBkYXRlUmFuZ2UuZmlsdGVyKChyYW5nZUl0ZW06IERhdGUpID0+ICFpc05pbChyYW5nZUl0ZW0pKS5tYXAoKHJhbmdlSXRlbTogRGF0ZSkgPT4gcmFuZ2VJdGVtLnZhbHVlT2YoKSlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlSXNJbnZhbGlkOiBib29sZWFuID0gIU9iamVjdC5pcyh1bmlxdWVSYW5nZUl0ZW1zTXMuc2l6ZSwgVkFMSURfUkFOR0VfU0laRSk7XG4gICAgaWYgKHJhbmdlSXNJbnZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJhbmdlU3RhcnREYXRlOiBEYXRlID0gZ2V0UmFuZ2VTdGFydERhdGUoZGF0ZVJhbmdlKTtcbiAgICByZXR1cm4gdGhpcy5pc1NhbWVEYXRlKHJhbmdlU3RhcnREYXRlLCBkYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlSXNSYW5nZUVuZERhdGUoZGF0ZTogRGF0ZSwgZGF0ZVJhbmdlOiBEYXRlW10pOiBib29sZWFuIHtcbiAgICBpZiAoaXNOaWwoZGF0ZSkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSB8fCBPYmplY3QuaXMoZGF0ZVJhbmdlLmxlbmd0aCwgMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdW5pcXVlUmFuZ2VJdGVtc01zOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPihcbiAgICAgIGRhdGVSYW5nZS5maWx0ZXIoKHJhbmdlSXRlbTogRGF0ZSkgPT4gIWlzTmlsKHJhbmdlSXRlbSkpLm1hcCgocmFuZ2VJdGVtOiBEYXRlKSA9PiByYW5nZUl0ZW0udmFsdWVPZigpKVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2VJc0ludmFsaWQ6IGJvb2xlYW4gPSAhT2JqZWN0LmlzKHVuaXF1ZVJhbmdlSXRlbXNNcy5zaXplLCBWQUxJRF9SQU5HRV9TSVpFKTtcbiAgICBpZiAocmFuZ2VJc0ludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2VFbmREYXRlOiBEYXRlID0gZ2V0UmFuZ2VFbmREYXRlKGRhdGVSYW5nZSk7XG4gICAgcmV0dXJuIHRoaXMuaXNTYW1lRGF0ZShyYW5nZUVuZERhdGUsIGRhdGUpO1xuICB9XG5cbiAgcHVibGljIGRhdGVJc05vdEF2YWlsYWJsZShkYXRlOiBEYXRlLCBpc0JhY2tEYXRpbmc6IGJvb2xlYW4sIGF2YWlsYWJsZUVuZERhdGU6IERhdGUgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKCFpc0JhY2tEYXRpbmcgJiYgZGF0ZSA8IERFRkFVTFRfQ1VSUkVOVF9EQVRFX1dJVEhfQ0xFQVJFRF9USU1FKSB8fCBkYXRlID4gYXZhaWxhYmxlRW5kRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBpc0RhdGVTdGFydEluSG92ZXJlZEFuZFNlbGVjdGVkUmFuZ2UoZGF0ZTogRGF0ZSwgaG92ZXJlZFJhbmdlOiBEYXRlW10sIHNlbGVjdGVkUmFuZ2U6IERhdGVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGVJc1JhbmdlU3RhcnREYXRlKGRhdGUsIGhvdmVyZWRSYW5nZSkgfHwgdGhpcy5kYXRlSXNSYW5nZVN0YXJ0RGF0ZShkYXRlLCBzZWxlY3RlZFJhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0RhdGVFbmRJbkhvdmVyZWRBbmRTZWxlY3RlZFJhbmdlKGRhdGU6IERhdGUsIGhvdmVyZWRSYW5nZTogRGF0ZVtdLCBzZWxlY3RlZFJhbmdlOiBEYXRlW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlSXNSYW5nZUVuZERhdGUoZGF0ZSwgaG92ZXJlZFJhbmdlKSB8fCB0aGlzLmRhdGVJc1JhbmdlRW5kRGF0ZShkYXRlLCBzZWxlY3RlZFJhbmdlKTtcbiAgfVxufVxuIl19