@dereekb/dbx-form 9.24.15 → 9.24.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import { DateBlockDayOfWeekFactory, DateBlockIndex, DateBlockRangeWithRange, DateOrDateBlockIndex, DateRange, DateScheduleDateFilterConfig, DateScheduleDayCode, DateScheduleRange, DateTimingRelativeIndexFactory, DateOrDateRangeOrDateBlockIndexOrDateBlockRange, DateTimezoneUtcNormalInstance, DateBlock, DateBlockDurationSpan } from '@dereekb/date';
2
- import { Maybe, TimezoneString, DecisionFunction, IterableOrValue, MaybeMap, DayOfWeek, AllOrNoneSelection, ArrayOrValue } from '@dereekb/util';
1
+ import { DateBlockDayOfWeekFactory, DateBlockIndex, DateBlockRangeWithRange, DateRange, DateScheduleDateFilterConfig, DateScheduleDayCode, DateScheduleRange, DateTimingRelativeIndexFactory, DateOrDateRangeOrDateBlockIndexOrDateBlockRange, DateTimezoneUtcNormalInstance, DateBlock, DateBlockDurationSpan, DateTimingRelativeIndexFactoryInput } from '@dereekb/date';
2
+ import { Maybe, TimezoneString, DecisionFunction, IterableOrValue, MaybeMap, DayOfWeek, AllOrNoneSelection, ArrayOrValue, ISO8601DayString } from '@dereekb/util';
3
3
  import { ComponentStore } from '@ngrx/component-store';
4
4
  import { Observable } from 'rxjs';
5
5
  import { CalendarScheduleSelectionCellContentFactory, CalendarScheduleSelectionValue } from './calendar.schedule.selection';
@@ -85,13 +85,13 @@ export interface CalendarScheduleSelectionState extends PartialCalendarScheduleS
85
85
  /**
86
86
  * Decision function that returns true if a value is enabled given the current filter.
87
87
  */
88
- isEnabledFilterDay: DecisionFunction<DateOrDateBlockIndex>;
88
+ isEnabledFilterDay: DecisionFunction<DateTimingRelativeIndexFactoryInput>;
89
89
  /**
90
90
  * Decision function that returns true if a value is enabled.
91
91
  *
92
92
  * This function does not take the current filter into account.
93
93
  */
94
- isEnabledDay: DecisionFunction<DateOrDateBlockIndex>;
94
+ isEnabledDay: DecisionFunction<DateTimingRelativeIndexFactoryInput>;
95
95
  /**
96
96
  * CalendarScheduleSelectionCellContentFactory for the view.
97
97
  */
@@ -132,8 +132,8 @@ export declare class DbxCalendarScheduleSelectionStore extends ComponentStore<Ca
132
132
  * @deprecated This is not the same as the current selection value. This is the set of manually togged off dates. It will be removed in a future update.
133
133
  */
134
134
  readonly selectedDates$: Observable<Set<DateBlockIndex>>;
135
- readonly isEnabledFilterDayFunction$: Observable<DecisionFunction<DateOrDateBlockIndex>>;
136
- readonly isEnabledDayFunction$: Observable<DecisionFunction<DateOrDateBlockIndex>>;
135
+ readonly isEnabledFilterDayFunction$: Observable<DecisionFunction<DateTimingRelativeIndexFactoryInput>>;
136
+ readonly isEnabledDayFunction$: Observable<DecisionFunction<DateTimingRelativeIndexFactoryInput>>;
137
137
  readonly currentDateRange$: Observable<Maybe<DateRange>>;
138
138
  readonly computeSelectionResultRelativeToFilter$: Observable<Maybe<boolean>>;
139
139
  readonly startBeingUsedFromFilter$: Observable<Maybe<boolean>>;
@@ -143,8 +143,13 @@ export declare class DbxCalendarScheduleSelectionStore extends ComponentStore<Ca
143
143
  readonly effectiveTimezone$: Observable<Maybe<TimezoneString>>;
144
144
  readonly effectiveTimezoneNormal$: Observable<DateTimezoneUtcNormalInstance | undefined>;
145
145
  readonly currentSelectionValue$: Observable<Maybe<CalendarScheduleSelectionValue>>;
146
+ readonly currentSelectionValueStart$: Observable<Maybe<Date>>;
147
+ readonly currentSelectionValueDateBlockTimingDateFactory$: Observable<import("@dereekb/date").DateBlockTimingDateFactory<{
148
+ start: Date;
149
+ }> | undefined>;
146
150
  readonly currentSelectionValueDateBlockDurationSpan$: Observable<DateBlockDurationSpan<DateBlock>[]>;
147
151
  readonly selectionValueSelectedIndexes$: Observable<Set<DateBlockIndex>>;
152
+ readonly selectionValueSelectedDates$: Observable<Set<ISO8601DayString>>;
148
153
  readonly selectionValue$: Observable<CalendarScheduleSelectionValue>;
149
154
  readonly currentSelectionValueWithTimezone$: Observable<Maybe<CalendarScheduleSelectionValue>>;
150
155
  readonly selectionValueWithTimezone$: Observable<CalendarScheduleSelectionValue>;
@@ -162,11 +167,11 @@ export declare class DbxCalendarScheduleSelectionStore extends ComponentStore<Ca
162
167
  readonly clearFilter: () => void;
163
168
  readonly setTimezone: (() => void) | ((observableOrValue: Maybe<string> | Observable<Maybe<string>>) => import("rxjs").Subscription);
164
169
  readonly setInputRange: (observableOrValue: CalendarScheduleSelectionInputDateRange | Observable<CalendarScheduleSelectionInputDateRange>) => import("rxjs").Subscription;
165
- readonly toggleSelectedDates: (observableOrValue: IterableOrValue<DateOrDateBlockIndex> | Observable<IterableOrValue<DateOrDateBlockIndex>>) => import("rxjs").Subscription;
166
- readonly addSelectedDates: (observableOrValue: IterableOrValue<DateOrDateBlockIndex> | Observable<IterableOrValue<DateOrDateBlockIndex>>) => import("rxjs").Subscription;
167
- readonly removeSelectedDates: (observableOrValue: IterableOrValue<DateOrDateBlockIndex> | Observable<IterableOrValue<DateOrDateBlockIndex>>) => import("rxjs").Subscription;
168
- readonly setSelectedDates: (observableOrValue: IterableOrValue<DateOrDateBlockIndex> | Observable<IterableOrValue<DateOrDateBlockIndex>>) => import("rxjs").Subscription;
169
- readonly setSelectedIndexes: (observableOrValue: IterableOrValue<DateOrDateBlockIndex> | Observable<IterableOrValue<DateOrDateBlockIndex>>) => import("rxjs").Subscription;
170
+ readonly toggleSelectedDates: (observableOrValue: IterableOrValue<DateTimingRelativeIndexFactoryInput> | Observable<IterableOrValue<DateTimingRelativeIndexFactoryInput>>) => import("rxjs").Subscription;
171
+ readonly addSelectedDates: (observableOrValue: IterableOrValue<DateTimingRelativeIndexFactoryInput> | Observable<IterableOrValue<DateTimingRelativeIndexFactoryInput>>) => import("rxjs").Subscription;
172
+ readonly removeSelectedDates: (observableOrValue: IterableOrValue<DateTimingRelativeIndexFactoryInput> | Observable<IterableOrValue<DateTimingRelativeIndexFactoryInput>>) => import("rxjs").Subscription;
173
+ readonly setSelectedDates: (observableOrValue: IterableOrValue<DateTimingRelativeIndexFactoryInput> | Observable<IterableOrValue<DateTimingRelativeIndexFactoryInput>>) => import("rxjs").Subscription;
174
+ readonly setSelectedIndexes: (observableOrValue: IterableOrValue<DateTimingRelativeIndexFactoryInput> | Observable<IterableOrValue<DateTimingRelativeIndexFactoryInput>>) => import("rxjs").Subscription;
170
175
  readonly selectAllDates: (observableOrValue: AllOrNoneSelection | Observable<AllOrNoneSelection>) => import("rxjs").Subscription;
171
176
  readonly setInitialSelectionState: (() => void) | ((observableOrValue: Maybe<AllOrNoneSelection> | Observable<Maybe<AllOrNoneSelection>>) => import("rxjs").Subscription);
172
177
  readonly setScheduleDays: (() => void) | ((observableOrValue: Maybe<Iterable<DateScheduleDayCode>> | Observable<Maybe<Iterable<DateScheduleDayCode>>>) => import("rxjs").Subscription);
@@ -192,10 +197,10 @@ export declare function updateStateWithDateScheduleRangeValue(state: CalendarSch
192
197
  export declare function updateStateWithChangedScheduleDays(state: CalendarScheduleSelectionState, change: Maybe<Iterable<DateScheduleDayCode>>): CalendarScheduleSelectionState;
193
198
  export interface CalendarScheduleSelectionStateDatesChange {
194
199
  reset?: true;
195
- toggle?: IterableOrValue<DateOrDateBlockIndex>;
196
- add?: IterableOrValue<DateOrDateBlockIndex>;
197
- remove?: IterableOrValue<DateOrDateBlockIndex>;
198
- set?: IterableOrValue<DateOrDateBlockIndex>;
200
+ toggle?: IterableOrValue<DateTimingRelativeIndexFactoryInput>;
201
+ add?: IterableOrValue<DateTimingRelativeIndexFactoryInput>;
202
+ remove?: IterableOrValue<DateTimingRelativeIndexFactoryInput>;
203
+ set?: IterableOrValue<DateTimingRelativeIndexFactoryInput>;
199
204
  selectAll?: AllOrNoneSelection;
200
205
  /**
201
206
  * Inverts the set date changing behavior so that the set input is treated as items that should be retained instead of excluded.
@@ -208,7 +213,7 @@ export declare function updateStateWithChangedDates(state: CalendarScheduleSelec
208
213
  export declare function noSelectionCalendarScheduleSelectionState(state: CalendarScheduleSelectionState): CalendarScheduleSelectionState;
209
214
  export declare function updateStateWithChangedRange(state: CalendarScheduleSelectionState, change: CalendarScheduleSelectionInputDateRange): CalendarScheduleSelectionState;
210
215
  export declare function finalizeNewCalendarScheduleSelectionState(nextState: CalendarScheduleSelectionState): CalendarScheduleSelectionState;
211
- export declare function isEnabledDayInCalendarScheduleSelectionState(state: CalendarScheduleSelectionState): DecisionFunction<DateOrDateBlockIndex>;
216
+ export declare function isEnabledDayInCalendarScheduleSelectionState(state: CalendarScheduleSelectionState): DecisionFunction<DateTimingRelativeIndexFactoryInput>;
212
217
  export declare function computeScheduleSelectionValue(state: CalendarScheduleSelectionState): Maybe<CalendarScheduleSelectionValue>;
213
218
  export interface CalendarScheduleSelectionRangeAndExclusion extends DateRange {
214
219
  dateBlockRange: DateBlockRangeWithRange;
@@ -1,10 +1,10 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { dateBlockDayOfWeekFactory, dateBlockTimingDateFactory, dateScheduleDateFilter, copyDateScheduleDateFilterConfig, DateScheduleDayCode, dateScheduleEncodedWeek, dateTimingRelativeIndexFactory, expandDateScheduleDayCodes, expandDateScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateBlockRangeFunction, isSameDate, isSameDateDay, isSameDateRange, isSameDateScheduleRange, dateTimingRelativeIndexArrayFactory, isInfiniteDateRange, copyHoursAndMinutesFromDate, dateTimezoneUtcNormal, expandDateScheduleRange } from '@dereekb/date';
2
+ import { dateBlockDayOfWeekFactory, dateBlockTimingDateFactory, dateScheduleDateFilter, copyDateScheduleDateFilterConfig, DateScheduleDayCode, dateScheduleEncodedWeek, dateTimingRelativeIndexFactory, expandDateScheduleDayCodes, expandDateScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateBlockRangeFunction, isSameDate, isSameDateDay, isSameDateRange, isSameDateScheduleRange, dateTimingRelativeIndexArrayFactory, isInfiniteDateRange, copyHoursAndMinutesFromDate, dateTimezoneUtcNormal, expandDateScheduleRange, formatToISO8601DayString } from '@dereekb/date';
3
3
  import { distinctUntilHasDifferentValues, filterMaybe } from '@dereekb/rxjs';
4
- import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, setsAreEquivalent, range, unique, mergeArrays, removeFromSet } from '@dereekb/util';
4
+ import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, setsAreEquivalent, range, unique, mergeArrays, removeFromSet, mapValuesToSet } from '@dereekb/util';
5
5
  import { ComponentStore } from '@ngrx/component-store';
6
6
  import { startOfDay, endOfDay, isBefore } from 'date-fns';
7
- import { distinctUntilChanged, map, shareReplay, switchMap, tap, first, combineLatestWith } from 'rxjs';
7
+ import { distinctUntilChanged, map, shareReplay, switchMap, tap, first, combineLatestWith, of } from 'rxjs';
8
8
  import { defaultCalendarScheduleSelectionCellContentFactory } from './calendar.schedule.selection';
9
9
  import * as i0 from "@angular/core";
10
10
  export function initialCalendarScheduleSelectionState() {
@@ -84,8 +84,13 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
84
84
  this.effectiveTimezone$ = this.state$.pipe(map((x) => (!calendarScheduleStartBeingUsedFromFilter(x) && x.timezone ? x.timezone : undefined)), distinctUntilChanged(), shareReplay(1));
85
85
  this.effectiveTimezoneNormal$ = this.state$.pipe(map((x) => (!calendarScheduleStartBeingUsedFromFilter(x) && x.timezoneNormal ? x.timezoneNormal : undefined)), distinctUntilChanged(), shareReplay(1));
86
86
  this.currentSelectionValue$ = this.state$.pipe(map((x) => x.currentSelectionValue), shareReplay(1));
87
+ this.currentSelectionValueStart$ = this.currentSelectionValue$.pipe(map((x) => x?.dateScheduleRange.start), distinctUntilChanged(isSameDate), shareReplay(1));
88
+ this.currentSelectionValueDateBlockTimingDateFactory$ = this.currentSelectionValueStart$.pipe(map((start) => (start ? dateBlockTimingDateFactory({ start }) : undefined)), shareReplay(1));
87
89
  this.currentSelectionValueDateBlockDurationSpan$ = this.currentSelectionValue$.pipe(map((x) => (x ? expandDateScheduleRange(x) : [])), shareReplay(1));
88
90
  this.selectionValueSelectedIndexes$ = this.currentSelectionValueDateBlockDurationSpan$.pipe(map((x) => new Set(x.map((y) => y.i))), distinctUntilHasDifferentValues(), shareReplay(1));
91
+ this.selectionValueSelectedDates$ = this.currentSelectionValueDateBlockTimingDateFactory$.pipe(switchMap((dateFactory) => {
92
+ return dateFactory ? this.selectionValueSelectedIndexes$.pipe(map((x) => mapValuesToSet(x, (y) => formatToISO8601DayString(dateFactory(y))))) : of(new Set());
93
+ }), shareReplay(1));
89
94
  this.selectionValue$ = this.currentSelectionValue$.pipe(filterMaybe(), shareReplay(1));
90
95
  this.currentSelectionValueWithTimezone$ = this.currentSelectionValue$.pipe(combineLatestWith(this.effectiveTimezoneNormal$), map(([x, timezoneNormal]) => {
91
96
  if (x && timezoneNormal) {
@@ -424,7 +429,7 @@ export function isEnabledDayInCalendarScheduleSelectionState(state) {
424
429
  return (input) => {
425
430
  const index = indexFactory(input);
426
431
  const dayOfWeek = indexDayOfWeek(index);
427
- const isInSelectedRange = isInStartAndEndRange(input);
432
+ const isInSelectedRange = isInStartAndEndRange(index);
428
433
  const isSelected = state.toggledIndexes.has(index);
429
434
  const isAllowedDayOfWeek = allowedDaysOfWeek.has(dayOfWeek);
430
435
  const result = isAllowedDayOfWeek && ((isInSelectedRange && !isSelected) || (isSelected && !isInSelectedRange));
@@ -549,4 +554,4 @@ export function computeCalendarScheduleSelectionDateBlockRange(state) {
549
554
  return undefined;
550
555
  }
551
556
  }
552
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwseUJBQXlCLEVBR3pCLDBCQUEwQixFQUcxQixzQkFBc0IsRUFDdEIsZ0NBQWdDLEVBRWhDLG1CQUFtQixFQUNuQix1QkFBdUIsRUFJdkIsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQix3Q0FBd0MsRUFDeEMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsa0NBQWtDLEVBQ2xDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUNmLHVCQUF1QixFQUV2QixtQ0FBbUMsRUFDbkMsbUJBQW1CLEVBQ25CLDJCQUEyQixFQUMzQixxQkFBcUIsRUFFckIsdUJBQXVCLEVBR3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQUUsaUJBQWlCLEVBQWEsS0FBSyxFQUFzQixNQUFNLEVBQUUsV0FBVyxFQUFnQixhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMVMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxRCxPQUFPLEVBQWMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FB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QztLQUNsQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5LFxuICBkYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5LFxuICBEYXRlQmxvY2tJbmRleCxcbiAgRGF0ZUJsb2NrUmFuZ2VXaXRoUmFuZ2UsXG4gIGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5LFxuICBEYXRlT3JEYXRlQmxvY2tJbmRleCxcbiAgRGF0ZVJhbmdlLFxuICBkYXRlU2NoZWR1bGVEYXRlRmlsdGVyLFxuICBjb3B5RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyxcbiAgRGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyxcbiAgRGF0ZVNjaGVkdWxlRGF5Q29kZSxcbiAgZGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWssXG4gIERhdGVTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlU2NoZWR1bGVSYW5nZSxcbiAgRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnksXG4gIGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzLFxuICBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0LFxuICBmaW5kTWF4RGF0ZSxcbiAgZmluZE1pbkRhdGUsXG4gIGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24sXG4gIElzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzU2FtZURhdGUsXG4gIGlzU2FtZURhdGVEYXksXG4gIGlzU2FtZURhdGVSYW5nZSxcbiAgaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2UsXG4gIERhdGVPckRhdGVSYW5nZU9yRGF0ZUJsb2NrSW5kZXhPckRhdGVCbG9ja1JhbmdlLFxuICBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEFycmF5RmFjdG9yeSxcbiAgaXNJbmZpbml0ZURhdGVSYW5nZSxcbiAgY29weUhvdXJzQW5kTWludXRlc0Zyb21EYXRlLFxuICBkYXRlVGltZXpvbmVVdGNOb3JtYWwsXG4gIERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlLFxuICBleHBhbmREYXRlU2NoZWR1bGVSYW5nZSxcbiAgRGF0ZUJsb2NrLFxuICBEYXRlQmxvY2tEdXJhdGlvblNwYW5cbn0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsSGFzRGlmZmVyZW50VmFsdWVzLCBmaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgTWF5YmUsIFRpbWV6b25lU3RyaW5nLCBEZWNpc2lvbkZ1bmN0aW9uLCBJdGVyYWJsZU9yVmFsdWUsIGl0ZXJhYmxlVG9BcnJheSwgYWRkVG9TZXQsIHRvZ2dsZUluU2V0LCBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24sIE1heWJlTWFwLCBtaW5BbmRNYXhOdW1iZXIsIHNldHNBcmVFcXVpdmFsZW50LCBEYXlPZldlZWssIHJhbmdlLCBBbGxPck5vbmVTZWxlY3Rpb24sIHVuaXF1ZSwgbWVyZ2VBcnJheXMsIEFycmF5T3JWYWx1ZSwgcmVtb3ZlRnJvbVNldCB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RvcmUgfSBmcm9tICdAbmdyeC9jb21wb25lbnQtc3RvcmUnO1xuaW1wb3J0IHsgc3RhcnRPZkRheSwgZW5kT2ZEYXksIGlzQmVmb3JlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwLCBmaXJzdCwgY29tYmluZUxhdGVzdFdpdGggfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnksIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZSwgZGVmYXVsdENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnkgfSBmcm9tICcuL2NhbGVuZGFyLnNjaGVkdWxlLnNlbGVjdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlIHtcbiAgLyoqXG4gICAqIElucHV0IFN0YXJ0IERhdGVcbiAgICovXG4gIGlucHV0U3RhcnQ6IERhdGU7XG4gIC8qKlxuICAgKiBJbnB1dCBFbmQgRGF0ZVxuICAgKi9cbiAgaW5wdXRFbmQ6IERhdGU7XG59XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UgPSBQYXJ0aWFsPE1heWJlTWFwPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSBleHRlbmRzIFBhcnRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogUmVhZG9ubHkgc3RhdGUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIERvZXMgbm90IGFmZmVjdCBzdGF0ZSBjaGFuZ2VzIGRpcmVjdGx5LCBidXQgaW5zdGVhZCBhY3RzIGFzIGEgZmxhZyBmb3IgdGhlIHBhcmVudCB2aWV3IHRvIHNldCBhbmQgdGhlIGNvbnN1bWluZyB2aWV3cyB0byB1cGRhdGUgb24uXG4gICAqL1xuICBpc1ZpZXdSZWFkb25seT86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogRmlsdGVycyB0aGUgZGF5cyBvZiB0aGUgc2NoZWR1bGUgdG8gb25seSBhbGxvdyBzZWxlY3RpbmcgZGF5cyBpbiB0aGUgc2NoZWR1bGUuXG4gICAqXG4gICAqIElmIGZpbHRlci5zdGFydCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgdGltZXpvbmUgaXMgaWdub3JlZCwgaWYgb25lIGlzIHByZXNlbnQuXG4gICAqL1xuICBmaWx0ZXI/OiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZXhjbHVzaW9ucyB0aGF0IG1heSBub3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbHRlci5cbiAgICovXG4gIGlucHV0RXhjbHVzaW9ucz86IE1heWJlPEFycmF5T3JWYWx1ZTxEYXRlT3JEYXRlUmFuZ2VPckRhdGVCbG9ja0luZGV4T3JEYXRlQmxvY2tSYW5nZT4+O1xuICAvKipcbiAgICogVGhlIGNvbXB1dGVkIGV4Y2x1c2lvbnMgZ2l2ZW4gdGhlIGlucHV0IGV4Y2x1c2lvbnMuXG4gICAqL1xuICBjb21wdXRlZEV4Y2x1c2lvbnM/OiBNYXliZTxEYXRlQmxvY2tJbmRleFtdPjtcbiAgLyoqXG4gICAqIFRoZSBtaW4vbWF4IGRhdGUgcmFuZ2UuIFVzZWQgZm9yIHJlc3RyaWN0aW5nIHRoZSBtaW4vbWF4IHZhbHVlLiBXb3JrcyB3aXRoIHRoZSBmaWx0ZXIuIFRoZSBncmVhdGVyL2xlc3NlciBvZiB0aGUgc3RhcnQvZW5kIGRhdGVzIGFyZSB1c2VkIGlmIGJvdGggYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgbWluTWF4RGF0ZVJhbmdlPzogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUuIElzIHVwZGF0ZWQgYXMgdGhlIGlucHV0U3RhcnQgaXMgbW9kaWZpZWQgb3IgZmlsdGVyIGlzIHByb3ZpZGVkIHRoYXQgcHJvdmlkZXMgdGhlIHN0YXJ0IGRhdGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRvZGF5IGFuZCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHN0YXJ0OiBEYXRlO1xuICAvKipcbiAgICogVGltZXpvbmUgdG8gdXNlLiBPbmx5SW5mbHVlbmNlcyB0aGUgb3V0cHV0IHN0YXJ0IGRhdGUuXG4gICAqL1xuICB0aW1lem9uZT86IE1heWJlPFRpbWV6b25lU3RyaW5nPjtcbiAgLyoqXG4gICAqIEN1cnJlbnQgdGltZXpvbmUgbm9ybWFsIHdpdGggdGhlIGN1cnJlbnQgdGltZXpvbmUuXG4gICAqL1xuICB0aW1lem9uZU5vcm1hbD86IE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPjtcbiAgLyoqXG4gICAqIERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeVxuICAgKi9cbiAgaW5kZXhGYWN0b3J5OiBEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3Rvcnk7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBtYW51YWxseSBzZWxlY3RlZCBkYXRlcyB3aXRoaW4gdGhlIHBpY2tlZCByYW5nZS4gVGhpcyBpcyBOT1QgdGhlIHNldCBvZiBhbGwgc2VsZWN0ZWQgaW5kZXhlcyBpbiB0ZXJtcyBvZiBvdXRwdXQuXG4gICAqXG4gICAqIFZhbHVlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgdGhlIFwiaW5wdXRcIiByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9uLCB3aGlsZSB0aG9zZVxuICAgKiB0aGF0IGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIHJhbmdlIGFyZSBjb25zaWRlcmVkIHRvZ2dsZWQgb2ZmLlxuICAgKlxuICAgKiBJZiBkYXRlcyBhcmUgc2VsZWN0ZWQsIGFuZCB0aGVuIGEgcmFuZ2UgaXMgc2VsZWN0ZWQsIHRoZW4gdGhvc2UgZGF0ZXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IGZhbGxcbiAgICogd2l0aGluIHRoZSByYW5nZSBhcmUgY2xlYXJlZCBmcm9tIHNlbGVjdGlvbi5cbiAgICpcbiAgICogVGhlc2UgaW5kZXhlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRhdGUuXG4gICAqL1xuICB0b2dnbGVkSW5kZXhlczogU2V0PERhdGVCbG9ja0luZGV4PjtcbiAgLyoqXG4gICAqIERheXMgb2YgdGhlIHNjaGVkdWxlIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgcGlja2VkLlxuICAgKi9cbiAgc2NoZWR1bGVEYXlzOiBTZXQ8RGF0ZVNjaGVkdWxlRGF5Q29kZT47XG4gIC8qKlxuICAgKiBTZXQgb2YgdGhlIGRheXMgb2Ygd2VlayB0aGF0IGFyZSBhbGxvd2VkLlxuICAgKi9cbiAgYWxsb3dlZERheXNPZldlZWs6IFNldDxEYXlPZldlZWs+O1xuICAvKipcbiAgICpcbiAgICovXG4gIGluZGV4RGF5T2ZXZWVrOiBEYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkIGdpdmVuIHRoZSBjdXJyZW50IGZpbHRlci5cbiAgICovXG4gIGlzRW5hYmxlZEZpbHRlckRheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBEZWNpc2lvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUgY3VycmVudCBmaWx0ZXIgaW50byBhY2NvdW50LlxuICAgKi9cbiAgaXNFbmFibGVkRGF5OiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVPckRhdGVCbG9ja0luZGV4PjtcbiAgLyoqXG4gICAqIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnkgZm9yIHRoZSB2aWV3LlxuICAgKi9cbiAgY2VsbENvbnRlbnRGYWN0b3J5OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5O1xuICAvKipcbiAgICogQ3VycmVudCBzZWxlY3Rpb24gdmFsdWUuXG4gICAqL1xuICBjdXJyZW50U2VsZWN0aW9uVmFsdWU/OiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWU+O1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBmaWx0ZXIgYXMgdGhlIHN0YXJ0IGFuZCBlbmQgcmFuZ2UgaW5zdGVhZCBvZiBvcHRpbWl6aW5nIGZvciB0aGUgY3VycmVudCBpbmRleC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyPzogTWF5YmU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24gc3RhdGUgd2hlbiB0aGUgY2FsZW5kYXIgaXMgcmVzZXQuXG4gICAqL1xuICBpbml0aWFsU2VsZWN0aW9uU3RhdGU/OiBNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSgpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCBzY2hlZHVsZURheXMgPSBuZXcgU2V0KFtEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtEQVksIERhdGVTY2hlZHVsZURheUNvZGUuV0VFS0VORF0pO1xuICBjb25zdCBhbGxvd2VkRGF5c09mV2VlayA9IGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQoQXJyYXkuZnJvbShzY2hlZHVsZURheXMpKTtcbiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xuICBjb25zdCBpbmRleEZhY3RvcnkgPSBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnkoeyBzdGFydCB9KTtcbiAgY29uc3QgaW5kZXhEYXlPZldlZWsgPSBkYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5KHN0YXJ0KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0LFxuICAgIGluZGV4RmFjdG9yeSxcbiAgICB0b2dnbGVkSW5kZXhlczogbmV3IFNldCgpLFxuICAgIHNjaGVkdWxlRGF5cyxcbiAgICBhbGxvd2VkRGF5c09mV2VlayxcbiAgICBpbmRleERheU9mV2VlayxcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXk6ICgpID0+IHRydWUsXG4gICAgaXNFbmFibGVkRGF5OiAoKSA9PiBmYWxzZSxcbiAgICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogdHJ1ZSxcbiAgICBjZWxsQ29udGVudEZhY3Rvcnk6IGRlZmF1bHRDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluRGF0ZSh4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4pOiBNYXliZTxEYXRlPiB7XG4gIHJldHVybiBmaW5kTWF4RGF0ZShbeC5maWx0ZXI/LnN0YXJ0LCB4Lm1pbk1heERhdGVSYW5nZT8uc3RhcnRdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGVuZGFyU2NoZWR1bGVNYXhEYXRlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IE1heWJlPERhdGU+IHtcbiAgcmV0dXJuIGZpbmRNaW5EYXRlKFt4LmZpbHRlcj8uZW5kLCB4Lm1pbk1heERhdGVSYW5nZT8uZW5kXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IFBhcnRpYWw8RGF0ZVJhbmdlPiB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGNhbGVuZGFyU2NoZWR1bGVNaW5EYXRlKHgpIHx8IHVuZGVmaW5lZCxcbiAgICBlbmQ6IGNhbGVuZGFyU2NoZWR1bGVNYXhEYXRlKHgpIHx8IHVuZGVmaW5lZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXInPikge1xuICByZXR1cm4geC5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiB4LmZpbHRlcj8uc3RhcnQgIT0gbnVsbDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZSBleHRlbmRzIENvbXBvbmVudFN0b3JlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCkpO1xuICB9XG5cbiAgLy8gTUFSSzpcbiAgcmVhZG9ubHkgdG9nZ2xlU2VsZWN0aW9uID0gdGhpcy5lZmZlY3QoKGlucHV0OiBPYnNlcnZhYmxlPHZvaWQ+KSA9PiB7XG4gICAgcmV0dXJuIGlucHV0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgdGhpcy5uZXh0VG9nZ2xlU2VsZWN0aW9uJC5waXBlKFxuICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgZmlsdGVyTWF5YmUoKSxcbiAgICAgICAgICB0YXAoKHgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsRGF0ZXMoeCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xuXG4gIC8vIE1BUks6IEFjY2Vzc29yc1xuICByZWFkb25seSBmaWx0ZXIkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguZmlsdGVyKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbWluTWF4RGF0ZVJhbmdlJCA9IHRoaXMuc3RhdGUkLnBpcGUobWFwKGNhbGVuZGFyU2NoZWR1bGVNaW5BbmRNYXhEYXRlUmFuZ2UpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlUmFuZ2UpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgbWluRGF0ZSQgPSB0aGlzLm1pbk1heERhdGVSYW5nZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHg/LnN0YXJ0KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICByZWFkb25seSBtYXhEYXRlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZW5kKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSQgPSB0aGlzLm1pbk1heERhdGVSYW5nZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHggIT0gbnVsbCAmJiB4LnN0YXJ0ICE9IG51bGwgJiYgeC5lbmQgIT0gbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0U3RhcnQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaW5wdXRTdGFydCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dEVuZCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pbnB1dEVuZCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50SW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8TWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9KSA9PiAoeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9KSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGUoYS5pbnB1dFN0YXJ0LCBiLmlucHV0U3RhcnQpICYmIGlzU2FtZURhdGUoYS5pbnB1dEVuZCwgYi5pbnB1dEVuZCkpLFxuICAgIG1hcCgoeCkgPT4ge1xuICAgICAgaWYgKHguaW5wdXRTdGFydCAmJiB4LmlucHV0RW5kKSB7XG4gICAgICAgIHJldHVybiB4IGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFJhbmdlJDogT2JzZXJ2YWJsZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U+ID0gdGhpcy5jdXJyZW50SW5wdXRSYW5nZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB2YWx1ZS4gVGhpcyBpcyB0aGUgc2V0IG9mIG1hbnVhbGx5IHRvZ2dlZCBvZmYgZGF0ZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB1cGRhdGUuXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RlZERhdGVzJDogT2JzZXJ2YWJsZTxTZXQ8RGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnRvZ2dsZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZEZpbHRlckRheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNFbmFibGVkRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyJDogT2JzZXJ2YWJsZTxNYXliZTxib29sZWFuPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIC8vXG4gICAgbWFwKGNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cyQ6IE9ic2VydmFibGU8U2V0PERhdGVTY2hlZHVsZURheUNvZGU+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNjaGVkdWxlRGF5cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoc2V0c0FyZUVxdWl2YWxlbnQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHgudGltZXpvbmUpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBlZmZlY3RpdmVUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoIWNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIoeCkgJiYgeC50aW1lem9uZSA/IHgudGltZXpvbmUgOiB1bmRlZmluZWQpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZWZmZWN0aXZlVGltZXpvbmVOb3JtYWwkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICghY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4KSAmJiB4LnRpbWV6b25lTm9ybWFsID8geC50aW1lem9uZU5vcm1hbCA6IHVuZGVmaW5lZCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY3VycmVudFNlbGVjdGlvblZhbHVlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQ6IE9ic2VydmFibGU8RGF0ZUJsb2NrRHVyYXRpb25TcGFuPERhdGVCbG9jaz5bXT4gPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4ID8gZXhwYW5kRGF0ZVNjaGVkdWxlUmFuZ2UoeCkgOiBbXSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVTZWxlY3RlZEluZGV4ZXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQmxvY2tEdXJhdGlvblNwYW4kLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBuZXcgU2V0KHgubWFwKCh5KSA9PiB5LmkpKSksXG4gICAgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcygpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmVmZmVjdGl2ZVRpbWV6b25lTm9ybWFsJCksXG4gICAgbWFwKChbeCwgdGltZXpvbmVOb3JtYWxdKSA9PiB7XG4gICAgICBpZiAoeCAmJiB0aW1lem9uZU5vcm1hbCkge1xuICAgICAgICB4ID0ge1xuICAgICAgICAgIGRhdGVTY2hlZHVsZVJhbmdlOiB7XG4gICAgICAgICAgICAuLi54LmRhdGVTY2hlZHVsZVJhbmdlLFxuICAgICAgICAgICAgc3RhcnQ6IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoeC5kYXRlU2NoZWR1bGVSYW5nZS5zdGFydCksXG4gICAgICAgICAgICBlbmQ6IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoeC5kYXRlU2NoZWR1bGVSYW5nZS5lbmQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHg7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQ6IE9ic2VydmFibGU8RGF0ZUJsb2NrRHVyYXRpb25TcGFuPERhdGVCbG9jaz5bXT4gPSB0aGlzLnNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gZXhwYW5kRGF0ZVNjaGVkdWxlUmFuZ2UoeCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbmV4dFRvZ2dsZVNlbGVjdGlvbiQ6IE9ic2VydmFibGU8TWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPj4gPSB0aGlzLmhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSkgPT4ge1xuICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTxNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+PjtcblxuICAgICAgaWYgKGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSkge1xuICAgICAgICBvYnMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShtYXAoKHgpID0+ICh4ID8gJ25vbmUnIDogJ2FsbCcpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShtYXAoKHgpID0+ICh4ID8gJ25vbmUnIDogdW5kZWZpbmVkKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JzO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudERhdGVTY2hlZHVsZVJhbmdlVmFsdWUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5kYXRlU2NoZWR1bGVSYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSQgPSB0aGlzLmN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZVZhbHVlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBjZWxsQ29udGVudEZhY3RvcnkkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY2VsbENvbnRlbnRGYWN0b3J5KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNDdXN0b21pemVkJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnRvZ2dsZWRJbmRleGVzLnNpemUgPiAwKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNWaWV3UmVhZG9ubHkkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNWaWV3UmVhZG9ubHkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvLyBNQVJLOiBTdGF0ZSBDaGFuZ2VzXG4gIHJlYWRvbmx5IHNldE1pbk1heERhdGVSYW5nZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhNaW5NYXhEYXRlUmFuZ2UpO1xuICByZWFkb25seSBzZXRGaWx0ZXIgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoRmlsdGVyKTtcbiAgcmVhZG9ubHkgc2V0RXhjbHVzaW9ucyA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhFeGNsdXNpb25zKTtcbiAgcmVhZG9ubHkgc2V0Q29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpO1xuICByZWFkb25seSBjbGVhckZpbHRlciA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgdW5kZWZpbmVkKSk7XG5cbiAgcmVhZG9ubHkgc2V0VGltZXpvbmUgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoVGltZXpvbmVWYWx1ZSk7XG4gIHJlYWRvbmx5IHNldElucHV0UmFuZ2UgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKTtcblxuICAvLyBOT1RFOiBTZWxlY3RlZCBkYXRlcyBhcmUgTk9UIHNlbGVjdGVkIGluZGV4ZXMuIFRoZXkgYXJlIHRoZSBpbnRlcm5hbCBzZWxlY3RlZCBkYXRlcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzZWxlY3Rpb24uXG4gIHJlYWRvbmx5IHRvZ2dsZVNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCB0b2dnbGU6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyB0b2dnbGUgfSkpO1xuICByZWFkb25seSBhZGRTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgYWRkOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgYWRkIH0pKTtcbiAgcmVhZG9ubHkgcmVtb3ZlU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHJlbW92ZTogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHJlbW92ZSB9KSk7XG4gIHJlYWRvbmx5IHNldFNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzZXQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZXQgfSkpO1xuXG4gIC8vIE5PVEU6IFNlbGVjdGVkIGluZGV4ZXMgYXJlIHRoZSB0eXBpY2FsL2V4cGVjdGVkIGluZGV4ZXMgdGhhdCBhcmUgc2VsZWN0ZWQgb3Igbm90LlxuICByZWFkb25seSBzZXRTZWxlY3RlZEluZGV4ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzZXQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZXQsIGludmVydFNldEJlaGF2aW9yOiB0cnVlIH0pKTtcblxuICByZWFkb25seSBzZWxlY3RBbGxEYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHNlbGVjdEFsbDogQWxsT3JOb25lU2VsZWN0aW9uID0gJ2FsbCcpID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZWxlY3RBbGwgfSkpO1xuICByZWFkb25seSBzZXRJbml0aWFsU2VsZWN0aW9uU3RhdGUgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKTtcblxuICByZWFkb25seSBzZXRTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyk7XG4gIHJlYWRvbmx5IHNldEFsbG93QWxsU2NoZWR1bGVEYXlzID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZSwgbnVsbCkpO1xuXG4gIHJlYWRvbmx5IHNldERhdGVTY2hlZHVsZVJhbmdlVmFsdWUgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCB2YWx1ZTogTWF5YmU8RGF0ZVNjaGVkdWxlUmFuZ2U+KSA9PiB1cGRhdGVTdGF0ZVdpdGhEYXRlU2NoZWR1bGVSYW5nZVZhbHVlKHN0YXRlLCB2YWx1ZSkpO1xuICByZWFkb25seSBzZXRDZWxsQ29udGVudEZhY3RvcnkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBjZWxsQ29udGVudEZhY3Rvcnk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnkpID0+ICh7IC4uLnN0YXRlLCBjZWxsQ29udGVudEZhY3RvcnkgfSkpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IHRoZSBwYXJlbnQgdmlldyB0byBwcm9wb2dhdGUgYSByZWFkb25seSBzdGF0ZS5cbiAgICpcbiAgICogU2hvdWxkIHR5cGljYWxseSBub3QgYmUgdXNlZCBieSB0aGUgdXNlciBkaXJlY3RseSB3aXRoIHRoZSBpbnRlbnRpb24gb2YgdGhlIHBhcmVudCBzeW5jaHJvbml6aW5nIHRvIHRoaXMgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBzZXRWaWV3UmVhZG9ubHlTdGF0ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGlzVmlld1JlYWRvbmx5OiBib29sZWFuKSA9PiAoeyAuLi5zdGF0ZSwgaXNWaWV3UmVhZG9ubHkgfSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGluaXRpYWxTZWxlY3Rpb25TdGF0ZTogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgdG9nZ2xlZEluZGV4ZXMgfSA9IHN0YXRlO1xuXG4gIGlmICh0b2dnbGVkSW5kZXhlcy5zaXplID09PSAwICYmIGluaXRpYWxTZWxlY3Rpb25TdGF0ZSA9PT0gJ2FsbCcpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZWxlY3RBbGw6IGluaXRpYWxTZWxlY3Rpb25TdGF0ZSB9KTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBpbml0aWFsU2VsZWN0aW9uU3RhdGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKGN1cnJlbnRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogTWF5YmU8Ym9vbGVhbj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBsZXQgc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uY3VycmVudFN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciB9O1xuXG4gIGlmIChCb29sZWFuKGN1cnJlbnRTdGF0ZS5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcikgIT09IEJvb2xlYW4oY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHt9KTsgLy8gcmVjYWxjdWxhdGUgaWYgY2hhbmdlIG9jY3VycyBhcyBpdCB3aWxsIGFmZmVjdCB0aGUgb3V0cHV0IHZhbHVlXG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhFeGNsdXNpb25zKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0RXhjbHVzaW9uczogTWF5YmU8QXJyYXlPclZhbHVlPERhdGVPckRhdGVSYW5nZU9yRGF0ZUJsb2NrSW5kZXhPckRhdGVCbG9ja1JhbmdlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBsZXQgY29tcHV0ZWRFeGNsdXNpb25zOiBNYXliZTxEYXRlQmxvY2tJbmRleFtdPjtcblxuICBpZiAoaW5wdXRFeGNsdXNpb25zKSB7XG4gICAgY29uc3QgeyBpbmRleEZhY3RvcnkgfSA9IHN0YXRlO1xuICAgIGNvbnN0IGluZGV4QXJyYXlGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhBcnJheUZhY3RvcnkoaW5kZXhGYWN0b3J5KTtcbiAgICBjb21wdXRlZEV4Y2x1c2lvbnMgPSBpbmRleEFycmF5RmFjdG9yeShpbnB1dEV4Y2x1c2lvbnMpO1xuICB9XG5cbiAgc3RhdGUgPSB7IC4uLnN0YXRlLCBpbnB1dEV4Y2x1c2lvbnMsIGNvbXB1dGVkRXhjbHVzaW9ucyB9O1xuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBzdGF0ZS5maWx0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTWluTWF4RGF0ZVJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIG1pbk1heERhdGVSYW5nZTogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIHN0YXRlID0geyAuLi5zdGF0ZSB9O1xuXG4gIGlmIChtaW5NYXhEYXRlUmFuZ2UgIT0gbnVsbCAmJiAhaXNJbmZpbml0ZURhdGVSYW5nZShtaW5NYXhEYXRlUmFuZ2UpKSB7XG4gICAgc3RhdGUubWluTWF4RGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnQ6IG1pbk1heERhdGVSYW5nZS5zdGFydCAhPSBudWxsID8gc3RhcnRPZkRheShtaW5NYXhEYXRlUmFuZ2Uuc3RhcnQpIDogdW5kZWZpbmVkLFxuICAgICAgZW5kOiBtaW5NYXhEYXRlUmFuZ2UuZW5kICE9IG51bGwgPyBlbmRPZkRheShtaW5NYXhEYXRlUmFuZ2UuZW5kKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIHN0YXRlLm1pbk1heERhdGVSYW5nZTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGUsIHN0YXRlLmZpbHRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5wdXRGaWx0ZXI6IE1heWJlPERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBjb21wdXRlZEV4Y2x1c2lvbnM6IGV4Y2x1c2lvbnMsIG1pbk1heERhdGVSYW5nZSB9ID0gc3RhdGU7XG5cbiAgbGV0IGlzRW5hYmxlZEZpbHRlckRheTogTWF5YmU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gKCkgPT4gdHJ1ZTtcbiAgbGV0IGZpbHRlcjogTWF5YmU8RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4gPSBudWxsO1xuXG4gIC8vIGNyZWF0ZSB0aGUgZmlsdGVyIHVzaW5nIGlucHV0RmlsdGVyLCBleGNsdXNpb25zLCBhbmQgbWluTWF4RGF0ZVJhbmdlXG4gIGlmIChpbnB1dEZpbHRlciB8fCBleGNsdXNpb25zPy5sZW5ndGggfHwgbWluTWF4RGF0ZVJhbmdlKSB7XG4gICAgbGV0IGVuYWJsZWRGaWx0ZXI6IERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc7XG5cbiAgICBpZiAoaW5wdXRGaWx0ZXIpIHtcbiAgICAgIGZpbHRlciA9IGNvcHlEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnKGlucHV0RmlsdGVyKTsgLy8gY29weSBmaWx0ZXJcblxuICAgICAgaWYgKGV4Y2x1c2lvbnM/Lmxlbmd0aCkge1xuICAgICAgICBlbmFibGVkRmlsdGVyID0ge1xuICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgICBleDogdW5pcXVlKG1lcmdlQXJyYXlzKFtmaWx0ZXIuZXgsIGV4Y2x1c2lvbnNdKSlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuYWJsZWRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuYWJsZWRGaWx0ZXIgPSB7XG4gICAgICAgIHc6ICc4OScsXG4gICAgICAgIGV4OiBleGNsdXNpb25zIGFzIG51bWJlcltdXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtaW5NYXhEYXRlUmFuZ2UpIHtcbiAgICAgIGVuYWJsZWRGaWx0ZXIubWluTWF4RGF0ZVJhbmdlID0gbWluTWF4RGF0ZVJhbmdlO1xuICAgICAgZW5hYmxlZEZpbHRlci5zZXRTdGFydEFzTWluRGF0ZSA9IGZpbHRlcj8uc3RhcnQgPyB0cnVlIDogZmFsc2U7IC8vIElmIGEgc3RhcnQgZGF0ZSBpcyBzZXQsIHRoZW4gaXQgYmVjb21lcyB0aGUgZmxvb3IuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIGlucHV0IGZpbHRlciBoYXMgYSBzdGFydCBkYXRlLCB1c2UgdGhhdCBhcyB0aGUgcmVsYXRpdmUgc3RhcnQgdG8gZW5zdXJlIGluZGV4ZXMgYXJlIGNvbXBhcmVkIHRoZSBzYW1lLFxuICAgICAqIG90aGVyd2lzZSB1c2UgdGhlIHN0YXRlJ3Mgc3RhcnQuIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgaW5kZXggY2FsY3VsYXRpb25zLlxuICAgICAqL1xuICAgIGVuYWJsZWRGaWx0ZXIuc3RhcnQgPSBpbnB1dEZpbHRlcj8uc3RhcnQgPz8gc3RhdGUuc3RhcnQ7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGZpbHRlclxuICAgIGlzRW5hYmxlZEZpbHRlckRheSA9IGRhdGVTY2hlZHVsZURhdGVGaWx0ZXIoZW5hYmxlZEZpbHRlcik7XG4gIH1cblxuICBzdGF0ZSA9IHsgLi4uc3RhdGUsIGZpbHRlciwgaXNFbmFibGVkRmlsdGVyRGF5IH07XG5cbiAgLy8gRm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBhYm92ZSwgdXNlIHRoZSBmaWx0ZXIncyBzdGFydCBkYXRlIGFzIHRoZSByZWxhdGl2ZSBzdGFydCBpZiBhcHBsaWNhYmxlLlxuICBpZiAoZmlsdGVyICYmIGZpbHRlci5zdGFydCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gZmlsdGVyLnN0YXJ0O1xuICAgIHN0YXRlLnN0YXJ0ID0gc3RhcnQ7XG4gICAgc3RhdGUuaW5kZXhGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KHsgc3RhcnQgfSk7XG4gICAgc3RhdGUuaW5kZXhEYXlPZldlZWsgPSBkYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5KHN0YXJ0KTtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gcmUtYXBwbHkgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHN0YXRlIG9uY2UgZmlsdGVyIGlzIGFwcGxpZWRcbiAgaWYgKHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSkge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKHN0YXRlLCBzdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUpO1xuICB9XG5cbiAgLy8gcmUtY2FsY3VsYXRlIHRoZSBzZWxlY3Rpb24gZ2l2ZW4gdGhlIGZpbHRlclxuICBjb25zdCB7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0gPSBzdGF0ZTtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKHN0YXRlLCB7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoVGltZXpvbmVWYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCB0aW1lem9uZTogTWF5YmU8VGltZXpvbmVTdHJpbmc+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBjdXJyZW50U2VsZWN0aW9uVmFsdWUgfSA9IHN0YXRlO1xuXG4gIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gdGltZXpvbmUgPyBkYXRlVGltZXpvbmVVdGNOb3JtYWwoeyB0aW1lem9uZSB9KSA6IHVuZGVmaW5lZDtcblxuICBpZiAodGltZXpvbmVOb3JtYWwgJiYgY3VycmVudFNlbGVjdGlvblZhbHVlKSB7XG4gICAgLy8gdXBkYXRlIHRoZSBzZWxlY3Rpb24gdmFsdWUgdG8gcmVmbGVjdCB0aGUgdGltZXpvbmUgY2hhbmdlcy5cblxuICAgIGNvbnN0IHsgZGF0ZVNjaGVkdWxlUmFuZ2U6IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZSB9ID0gY3VycmVudFNlbGVjdGlvblZhbHVlO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGltZXpvbmVOb3JtYWwudGFyZ2V0RGF0ZVRvU3lzdGVtRGF0ZShjdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZCA9IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoY3VycmVudERhdGVTY2hlZHVsZVJhbmdlLmVuZCk7XG5cbiAgICBjb25zdCBuZXdSYW5nZTogRGF0ZVNjaGVkdWxlUmFuZ2UgPSB7XG4gICAgICAuLi5jdXJyZW50U2VsZWN0aW9uVmFsdWUuZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgIH07XG5cbiAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSh7IC4uLnN0YXRlLCB0aW1lem9uZSwgdGltZXpvbmVOb3JtYWwgfSwgbmV3UmFuZ2UpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IC4uLnN0YXRlLCB0aW1lem9uZSwgdGltZXpvbmVOb3JtYWwgfTsgLy8gbm8gY2hhbmdlIGluIHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBNYXliZTxEYXRlU2NoZWR1bGVSYW5nZT4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHRpbWV6b25lTm9ybWFsLCBjdXJyZW50U2VsZWN0aW9uVmFsdWUgfSA9IHN0YXRlO1xuICBjb25zdCBjdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2UgPSBjdXJyZW50U2VsZWN0aW9uVmFsdWU/LmRhdGVTY2hlZHVsZVJhbmdlOyAvLyBjdXJyZW50IHJhbmdlIGlzIGFsd2F5cyBpbiBzeXN0ZW0gdGltZVxuXG4gIGlmICghY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcihzdGF0ZSkgJiYgdGltZXpvbmVOb3JtYWwpIHtcbiAgICAvLyBXaGVuIHVzaW5nIHRpbWV6b25lcywgYWx3YXlzIHJldHVybiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF5LiBJbnB1dHMgYXJlIGNvbnZlcnRlZCB0byB0aGUgc3lzdGVtIHRpbWUgYW5kIHVzZWQgYXMgdGhlIHN0YXJ0IG9mIHRoZSBkYXkuXG4gICAgLy8gT3V0cHV0cyByZW1haW4gYWNjdXJhdGUuXG5cbiAgICBpZiAoY2hhbmdlKSB7XG4gICAgICBjaGFuZ2UgPSB7XG4gICAgICAgIC4uLmNoYW5nZSxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZEYXkodGltZXpvbmVOb3JtYWwuc3lzdGVtRGF0ZVRvVGFyZ2V0RGF0ZShjaGFuZ2Uuc3RhcnQpKSxcbiAgICAgICAgZW5kOiBzdGFydE9mRGF5KHRpbWV6b25lTm9ybWFsLnN5c3RlbURhdGVUb1RhcmdldERhdGUoY2hhbmdlLmVuZCkpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzU2FtZVZhbHVlID0gaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2UoY3VycmVudERhdGVTY2hlZHVsZVJhbmdlLCBjaGFuZ2UpO1xuXG4gIGlmIChpc1NhbWVWYWx1ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoY2hhbmdlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRTdGFydDogY2hhbmdlLnN0YXJ0LCBpbnB1dEVuZDogY2hhbmdlLmVuZCwgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoY2hhbmdlLmV4KSB9O1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKSwgZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXMoY2hhbmdlLncgfHwgJzg5JykpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGUpOyAvLyBjbGVhciBzZWxlY3Rpb24sIHJldGFpbiBkaXNhYmxlZCBkYXlzXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogTWF5YmU8SXRlcmFibGU8RGF0ZVNjaGVkdWxlRGF5Q29kZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBzY2hlZHVsZURheXM6IGN1cnJlbnRTY2hlZHVsZURheXMgfSA9IHN0YXRlO1xuICBjb25zdCBzY2hlZHVsZURheXMgPSBuZXcgU2V0KGNoYW5nZSB8fCBbRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKTtcblxuICBpZiAoc2V0c0FyZUVxdWl2YWxlbnQoY3VycmVudFNjaGVkdWxlRGF5cywgc2NoZWR1bGVEYXlzKSkge1xuICAgIHJldHVybiBzdGF0ZTsgLy8gbm8gY2hhbmdlXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0KEFycmF5LmZyb20oc2NoZWR1bGVEYXlzKSk7XG4gICAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgc2NoZWR1bGVEYXlzLCBhbGxvd2VkRGF5c09mV2VlayB9O1xuICAgIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlRGF0ZXNDaGFuZ2Uge1xuICByZXNldD86IHRydWU7XG4gIHRvZ2dsZT86IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIGFkZD86IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIHJlbW92ZT86IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIHNldD86IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIHNlbGVjdEFsbD86IEFsbE9yTm9uZVNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEludmVydHMgdGhlIHNldCBkYXRlIGNoYW5naW5nIGJlaGF2aW9yIHNvIHRoYXQgdGhlIHNldCBpbnB1dCBpcyB0cmVhdGVkIGFzIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIHJldGFpbmVkIGluc3RlYWQgb2YgZXhjbHVkZWQuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiBzZXQgaXMgbm90IHVzZWQuIElnbm9yZWQgZm9yIHNlbGVjdEFsbC5cbiAgICovXG4gIGludmVydFNldEJlaGF2aW9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZURhdGVzQ2hhbmdlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBpbmRleEZhY3RvcnksIGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleERheU9mV2VlaywgaW5wdXRTdGFydDogY3VycmVudElucHV0U3RhcnQsIGlucHV0RW5kOiBjdXJyZW50SW5wdXRFbmQsIG1pbk1heERhdGVSYW5nZSwgZmlsdGVyIH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBzdGFydDogbWluRGF0ZSwgZW5kOiBtYXhEYXRlIH0gPSBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHN0YXRlKTtcbiAgbGV0IGlucHV0U3RhcnQgPSBjdXJyZW50SW5wdXRTdGFydDtcbiAgbGV0IGlucHV0RW5kID0gY3VycmVudElucHV0RW5kO1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc2V0IG9mIGluZGV4ZXMgdGhhdCBhcmUgaW50ZXJuYWxseSBcInNlbGVjdGVkXCIgc28gdGhhdCB0aGV5IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBpbnB1dFN0YXJ0L2lucHV0RW5kIGRhdGUgcmFuZ2UuXG4gICAqXG4gICAqIERvIG5vdCBjb25mdXNlIHRoaXMgd2l0aCB0aGUgYWN0dWFsIGluZGV4ZXMgdGhhdCBhcmUgc2VsZWN0ZWQuXG4gICAqL1xuICBsZXQgdG9nZ2xlZEluZGV4ZXM6IFNldDxEYXRlQmxvY2tJbmRleD47XG5cbiAgZnVuY3Rpb24gYXNJbmRleGVzKGluZGV4ZXM6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pOiBEYXRlQmxvY2tJbmRleFtdIHtcbiAgICByZXR1cm4gaXRlcmFibGVUb0FycmF5KGluZGV4ZXMpLm1hcChpbmRleEZhY3RvcnkpO1xuICB9XG5cbiAgaWYgKGNoYW5nZS5yZXNldCB8fCBjaGFuZ2Uuc2VsZWN0QWxsICE9IG51bGwgfHwgY2hhbmdlLnNldCAhPSBudWxsKSB7XG4gICAgbGV0IHNldDogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4Pj4gPSBjaGFuZ2Uuc2V0ID8/IFtdO1xuICAgIGNvbnN0IHNlbGVjdEFsbDogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPiA9IGNoYW5nZS5yZXNldCA9PT0gdHJ1ZSA/IHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSA6IGNoYW5nZS5zZWxlY3RBbGw7XG5cbiAgICBzd2l0Y2ggKHNlbGVjdEFsbCkge1xuICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgaWYgKG1pbkRhdGUgIT0gbnVsbCAmJiBtYXhEYXRlICE9IG51bGwpIHtcbiAgICAgICAgICBpbnB1dFN0YXJ0ID0gbWluRGF0ZTtcbiAgICAgICAgICBpbnB1dEVuZCA9IG1heERhdGU7XG4gICAgICAgICAgc2V0ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgaW5wdXRTdGFydCA9IG51bGw7XG4gICAgICAgIGlucHV0RW5kID0gbnVsbDtcbiAgICAgICAgc2V0ID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChhc0luZGV4ZXMoc2V0KSk7XG5cbiAgICBpZiAoY2hhbmdlLmludmVydFNldEJlaGF2aW9yICYmIG1pbkRhdGUgJiYgbWF4RGF0ZSAmJiAhc2VsZWN0QWxsKSB7XG4gICAgICBjb25zdCBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShtaW5EYXRlKTtcbiAgICAgIGNvbnN0IG1heEluZGV4ID0gaW5kZXhGYWN0b3J5KG1heERhdGUpO1xuXG4gICAgICBpbnB1dFN0YXJ0ID0gbWluRGF0ZTtcbiAgICAgIGlucHV0RW5kID0gbWF4RGF0ZTtcbiAgICAgIHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChyYW5nZShtaW5JbmRleCwgbWF4SW5kZXggKyAxKS5maWx0ZXIoKHgpID0+ICF0b2dnbGVkSW5kZXhlcy5oYXMoeCkpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9nZ2xlZEluZGV4ZXMgPSBuZXcgU2V0KHN0YXRlLnRvZ2dsZWRJbmRleGVzKTtcblxuICAgIGlmIChjaGFuZ2UudG9nZ2xlKSB7XG4gICAgICBjb25zdCBhbGxvd2VkVG9Ub2dnbGUgPSBhc0luZGV4ZXMoY2hhbmdlLnRvZ2dsZSkuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgICAgIHRvZ2dsZUluU2V0KHRvZ2dsZWRJbmRleGVzLCBhbGxvd2VkVG9Ub2dnbGUpO1xuICAgIH1cblxuICAgIGxldCBhZGRUb0V4Y2x1c2lvbjogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4Pj47XG4gICAgbGV0IHJlbW92ZUZyb21FeGNsdXNpb246IE1heWJlPEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4+O1xuXG4gICAgaWYgKGNoYW5nZS5hZGQpIHtcbiAgICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IpIHtcbiAgICAgICAgYWRkVG9FeGNsdXNpb24gPSBjaGFuZ2UuYWRkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJvbUV4Y2x1c2lvbiA9IGNoYW5nZS5hZGQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS5yZW1vdmUpIHtcbiAgICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IpIHtcbiAgICAgICAgcmVtb3ZlRnJvbUV4Y2x1c2lvbiA9IGNoYW5nZS5yZW1vdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRUb0V4Y2x1c2lvbiA9IGNoYW5nZS5yZW1vdmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFkZFRvRXhjbHVzaW9uKSB7XG4gICAgICByZW1vdmVGcm9tU2V0KHRvZ2dsZWRJbmRleGVzLCBhc0luZGV4ZXMoYWRkVG9FeGNsdXNpb24pKTtcbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlRnJvbUV4Y2x1c2lvbikge1xuICAgICAgYWRkVG9TZXQodG9nZ2xlZEluZGV4ZXMsIGFzSW5kZXhlcyhyZW1vdmVGcm9tRXhjbHVzaW9uKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIHRvZ2dsZWRJbmRleGVzIH07XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuXG4gIC8vIFJlY2FsY3VsYXRlIHRoZSByYW5nZSBhbmQgc2ltcGxpZmllZCB0byBleGNsdXNpb25zXG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24obmV4dFN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24pIHtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5uZXh0U3RhdGUsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KHJhbmdlQW5kRXhjbHVzaW9uLmV4Y2x1ZGVkKSwgaW5wdXRTdGFydDogcmFuZ2VBbmRFeGNsdXNpb24uc3RhcnQsIGlucHV0RW5kOiByYW5nZUFuZEV4Y2x1c2lvbi5lbmQgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gc2VsZWN0ZWQgZGF5c1xuICAgIHJldHVybiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHsgLi4uc3RhdGUsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KCksIGlucHV0U3RhcnQ6IG51bGwsIGlucHV0RW5kOiBudWxsIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBpbnB1dFN0YXJ0OiBjdXJyZW50SW5wdXRTdGFydCwgaW5wdXRFbmQ6IGN1cnJlbnRJbnB1dEVuZCwgaW5kZXhGYWN0b3J5LCBtaW5NYXhEYXRlUmFuZ2UgfSA9IHN0YXRlO1xuICBjb25zdCB7IHN0YXJ0OiBtaW5EYXRlLCBlbmQ6IG1heERhdGUgfTogUGFydGlhbDxEYXRlUmFuZ2U+ID0gbWluTWF4RGF0ZVJhbmdlID8/IHt9O1xuXG4gIGNvbnN0IGlucHV0U3RhcnQ6IERhdGUgPSBzdGFydE9mRGF5KGNoYW5nZS5pbnB1dFN0YXJ0KTtcbiAgY29uc3QgaW5wdXRFbmQ6IERhdGUgPSBlbmRPZkRheShjaGFuZ2UuaW5wdXRFbmQpO1xuXG4gIGNvbnN0IGlzVmFsaWRSYW5nZSA9IG1pbkRhdGUgIT0gbnVsbCB8fCBtYXhEYXRlICE9IG51bGwgPyBpc0RhdGVJbkRhdGVSYW5nZUZ1bmN0aW9uKHsgc3RhcnQ6IG1pbkRhdGUgPz8gdW5kZWZpbmVkLCBlbmQ6IG1heERhdGUgPz8gdW5kZWZpbmVkIH0pIDogKCkgPT4gdHJ1ZTtcblxuICBpZiAoIWlzVmFsaWRSYW5nZShpbnB1dFN0YXJ0KSB8fCAhaXNWYWxpZFJhbmdlKGlucHV0RW5kKSB8fCAoaXNTYW1lRGF0ZURheShpbnB1dFN0YXJ0LCBjdXJyZW50SW5wdXRTdGFydCkgJiYgaXNTYW1lRGF0ZURheShpbnB1dEVuZCwgY3VycmVudElucHV0RW5kKSkpIHtcbiAgICByZXR1cm4gc3RhdGU7IC8vIGlmIG5vIGNoYW5nZSwgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLlxuICB9XG5cbiAgLy8gcmV0YWluIGFsbCBpbmRleGVzIHRoYXQgYXJlIHdpdGhpbiB0aGUgbmV3IHJhbmdlXG4gIGNvbnN0IG1pbkluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0U3RhcnQpO1xuICBjb25zdCBtYXhJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dEVuZCkgKyAxO1xuXG4gIGNvbnN0IGN1cnJlbnRJbmRleGVzOiBEYXRlQmxvY2tJbmRleFtdID0gQXJyYXkuZnJvbShzdGF0ZS50b2dnbGVkSW5kZXhlcyk7XG4gIGNvbnN0IGlzSW5DdXJyZW50UmFuZ2UgPSBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24oeyBtaW5JbmRleCwgbWF4SW5kZXggfSk7XG4gIGNvbnN0IGV4Y2x1ZGVkSW5kZXhlc0luTmV3UmFuZ2UgPSBjdXJyZW50SW5kZXhlcy5maWx0ZXIoaXNJbkN1cnJlbnRSYW5nZSk7XG4gIGNvbnN0IHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChleGNsdWRlZEluZGV4ZXNJbk5ld1JhbmdlKTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCB0b2dnbGVkSW5kZXhlcywgaW5wdXRTdGFydCwgaW5wdXRFbmQgfTtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICBuZXh0U3RhdGUuY3VycmVudFNlbGVjdGlvblZhbHVlID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uVmFsdWUobmV4dFN0YXRlKTtcbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVPckRhdGVCbG9ja0luZGV4PiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgaW5kZXhEYXlPZldlZWssIGFsbG93ZWREYXlzT2ZXZWVrIH0gPSBzdGF0ZTtcblxuICBsZXQgaXNJblN0YXJ0QW5kRW5kUmFuZ2U6IElzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb247XG5cbiAgaWYgKGlucHV0U3RhcnQgJiYgaW5wdXRFbmQpIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9IGlzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24oeyBzdGFydDogc3RhdGUuc3RhcnQsIHJhbmdlOiB7IHN0YXJ0OiBpbnB1dFN0YXJ0LCBlbmQ6IGlucHV0RW5kIH0gfSk7XG4gIH0gZWxzZSB7XG4gICAgaXNJblN0YXJ0QW5kRW5kUmFuZ2UgPSAoKSA9PiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoaW5wdXQ6IERhdGVPckRhdGVCbG9ja0luZGV4KSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXQpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGluZGV4RGF5T2ZXZWVrKGluZGV4KTtcblxuICAgIGNvbnN0IGlzSW5TZWxlY3RlZFJhbmdlID0gaXNJblN0YXJ0QW5kRW5kUmFuZ2UoaW5wdXQpO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBzdGF0ZS50b2dnbGVkSW5kZXhlcy5oYXMoaW5kZXgpO1xuICAgIGNvbnN0IGlzQWxsb3dlZERheU9mV2VlayA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhkYXlPZldlZWspO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gaXNBbGxvd2VkRGF5T2ZXZWVrICYmICgoaXNJblNlbGVjdGVkUmFuZ2UgJiYgIWlzU2VsZWN0ZWQpIHx8IChpc1NlbGVjdGVkICYmICFpc0luU2VsZWN0ZWRSYW5nZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBzY2hlZHVsZURheXMsIGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleERheU9mV2VlaywgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIsIGZpbHRlciB9ID0gc3RhdGU7XG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24oc3RhdGUpO1xuXG4gIGlmIChyYW5nZUFuZEV4Y2x1c2lvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IHN0YXJ0OiByYW5nZVN0YXJ0LCBlbmQ6IHJhbmdlRW5kLCBleGNsdWRlZDogYWxsRXhjbHVkZWQsIGRhdGVCbG9ja1JhbmdlIH0gPSByYW5nZUFuZEV4Y2x1c2lvbjtcbiAgbGV0IGZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2U6IERhdGVCbG9ja0luZGV4W10gPSBbXTtcbiAgbGV0IGluZGV4T2Zmc2V0ID0gZGF0ZUJsb2NrUmFuZ2UuaTtcblxuICBsZXQgc3RhcnQgPSByYW5nZVN0YXJ0O1xuICBsZXQgZW5kID0gcmFuZ2VFbmQ7XG5cbiAgLy8gSWYgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgaXMgdHJ1ZSwgdGhlbiB3ZSBuZWVkIHRvIG9mZnNldCB0aGUgdmFsdWVzIHRvIGJlIHJlbGF0aXZlIHRvIHRoYXQgc3RhcnQuXG4gIGlmIChjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiBmaWx0ZXI/LnN0YXJ0KSB7XG4gICAgc3RhcnQgPSBmaWx0ZXIuc3RhcnQ7XG5cbiAgICBpZiAoZmlsdGVyPy5lbmQpIHtcbiAgICAgIGVuZCA9IGNvcHlIb3Vyc0FuZE1pbnV0ZXNGcm9tRGF0ZShlbmQsIGZpbHRlci5lbmQpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQgPSBpbmRleEZhY3RvcnkocmFuZ2VTdGFydCkgLSBpbmRleEZhY3Rvcnkoc3RhcnQpO1xuICAgIGZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2UgPSByYW5nZSgwLCBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0KTtcbiAgICBpbmRleE9mZnNldCA9IGluZGV4T2Zmc2V0IC0gZmlsdGVyU3RhcnRJbmRleE9mZnNldDtcbiAgfVxuXG4gIGNvbnN0IGV4Y2x1ZGVkID0gY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXJcbiAgICA/IGFsbEV4Y2x1ZGVkLmZpbHRlcigoeCkgPT4ge1xuICAgICAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoeCkpOyAvLyA/Pz9cbiAgICAgICAgcmV0dXJuIGlzRXhjbHVkZWRJbmRleDtcbiAgICAgIH0pXG4gICAgOiBhbGxFeGNsdWRlZDtcblxuICBjb25zdCBvZmZzZXRFeGNsdWRlZDogRGF0ZUJsb2NrSW5kZXhbXSA9IGV4Y2x1ZGVkLm1hcCgoeCkgPT4geCAtIGluZGV4T2Zmc2V0KTsgLy8gc2V0IHRvIHRoZSBwcm9wZXIgb2Zmc2V0XG5cbiAgY29uc3QgZXggPSBbLi4uZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZSwgLi4ub2Zmc2V0RXhjbHVkZWRdO1xuXG4gIGNvbnN0IHc6IERhdGVTY2hlZHVsZUVuY29kZWRXZWVrID0gZGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWsoc2NoZWR1bGVEYXlzKTtcbiAgY29uc3QgZDogRGF0ZUJsb2NrSW5kZXhbXSA9IFtdOyAvLyBcImluY2x1ZGVkXCIgYmxvY2tzIGFyZSBuZXZlciB1c2VkL2NhbGN1bGF0ZWQuXG5cbiAgLy8gQWx3YXlzIGVuc3VyZSB0aGUgZW5kIGlzIGFmdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydC5cbiAgaWYgKGlzQmVmb3JlKGVuZCwgc3RhcnQpKSB7XG4gICAgZW5kID0gc3RhcnQ7IC8vIGVuZCBpcyBzdGFydFxuICB9XG5cbiAgY29uc3QgZGF0ZVNjaGVkdWxlUmFuZ2U6IERhdGVTY2hlZHVsZVJhbmdlID0ge1xuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICB3LFxuICAgIGQsXG4gICAgZXhcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGRhdGVTY2hlZHVsZVJhbmdlLFxuICAgIG1pbk1heFJhbmdlOiB7IHN0YXJ0LCBlbmQgfVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbiBleHRlbmRzIERhdGVSYW5nZSB7XG4gIGRhdGVCbG9ja1JhbmdlOiBEYXRlQmxvY2tSYW5nZVdpdGhSYW5nZTtcbiAgZXhjbHVkZWQ6IERhdGVCbG9ja0luZGV4W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbihzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uPiB7XG4gIGNvbnN0IHsgaXNFbmFibGVkRGF5LCBpc0VuYWJsZWRGaWx0ZXJEYXkgfSA9IHN0YXRlO1xuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5KHN0YXRlKTtcbiAgY29uc3QgZGF0ZUJsb2NrUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlKTtcblxuICBpZiAoZGF0ZUJsb2NrUmFuZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsOyAvLyByZXR1cm5zIG51bGwgaWYgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLlxuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS5pKTtcbiAgY29uc3QgZW5kID0gZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UudG8pO1xuXG4gIGNvbnN0IGV4Y2x1ZGVkOiBEYXRlQmxvY2tJbmRleFtdID0gcmFuZ2UoZGF0ZUJsb2NrUmFuZ2UuaSwgZGF0ZUJsb2NrUmFuZ2UudG8gKyAxKS5maWx0ZXIoKHgpID0+IHtcbiAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSAhaXNFbmFibGVkRGF5KHgpIHx8ICFpc0VuYWJsZWRGaWx0ZXJEYXkoeCk7XG4gICAgcmV0dXJuIGlzRXhjbHVkZWRJbmRleDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24gPSB7XG4gICAgZGF0ZUJsb2NrUmFuZ2UsXG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIGV4Y2x1ZGVkXG4gIH07XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVSYW5nZT4ge1xuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5KHN0YXRlKTtcbiAgY29uc3QgZGF0ZUJsb2NrUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlKTtcbiAgY29uc3QgZGF0ZVJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+ID0gZGF0ZUJsb2NrUmFuZ2UgIT0gbnVsbCA/IHsgc3RhcnQ6IGRhdGVGYWN0b3J5KGRhdGVCbG9ja1JhbmdlLmkpLCBlbmQ6IGRhdGVGYWN0b3J5KGRhdGVCbG9ja1JhbmdlLnRvIGFzIG51bWJlcikgfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRhdGVSYW5nZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlPiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrLCBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSB9ID0gc3RhdGU7XG4gIGNvbnN0IGVuYWJsZWRFeGNsdXNpb25JbmRleGVzID0gQXJyYXkuZnJvbShzdGF0ZS50b2dnbGVkSW5kZXhlcykuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgY29uc3QgbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMgPSBtaW5BbmRNYXhOdW1iZXIoZW5hYmxlZEV4Y2x1c2lvbkluZGV4ZXMpO1xuXG4gIGxldCBzdGFydFJhbmdlOiBNYXliZTxEYXRlQmxvY2tJbmRleD47XG4gIGxldCBlbmRSYW5nZTogTWF5YmU8RGF0ZUJsb2NrSW5kZXg+O1xuXG4gIGlmIChtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcykge1xuICAgIHN0YXJ0UmFuZ2UgPSBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcy5taW47XG4gICAgZW5kUmFuZ2UgPSBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcy5tYXg7XG4gIH1cblxuICBpZiAoaW5wdXRTdGFydCAhPSBudWxsICYmIGlucHV0RW5kICE9IG51bGwpIHtcbiAgICBjb25zdCBpbnB1dFN0YXJ0SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCk7XG4gICAgY29uc3QgaW5wdXRFbmRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dEVuZCk7XG5cbiAgICBzdGFydFJhbmdlID0gc3RhcnRSYW5nZSAhPSBudWxsID8gTWF0aC5taW4oaW5wdXRTdGFydEluZGV4LCBzdGFydFJhbmdlKSA6IGlucHV0U3RhcnRJbmRleDtcbiAgICBlbmRSYW5nZSA9IGVuZFJhbmdlICE9IG51bGwgPyBNYXRoLm1heChpbnB1dEVuZEluZGV4LCBlbmRSYW5nZSkgOiBpbnB1dEVuZEluZGV4O1xuICB9XG5cbiAgaWYgKHN0YXJ0UmFuZ2UgIT0gbnVsbCAmJiBlbmRSYW5nZSAhPSBudWxsKSB7XG4gICAgY29uc3Qgc2NhblN0YXJ0SW5kZXggPSBzdGFydFJhbmdlO1xuICAgIGNvbnN0IHNjYW5FbmRJbmRleCA9IGVuZFJhbmdlO1xuXG4gICAgLy8gY2xlYXIgc3RhcnQgYW5kIGVuZFxuICAgIHN0YXJ0UmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgZW5kUmFuZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBpZiB0aGUgbWluIGlzIGVxdWFsIHRvIHRoZSBzdGFydCBpbmRleCwgdGhlbiB3ZSBhcmUgaW4gdGhlIHJhbmdlIGFuZCBuZWVkIHRvIGl0ZXJhdGUgZGF0ZXMgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBpcyBub3Qgc2VsZWN0ZWQvZXhjbHVkZWQuXG4gICAgZm9yIChsZXQgaSA9IHNjYW5TdGFydEluZGV4OyBpIDw9IHNjYW5FbmRJbmRleDsgaSArPSAxKSB7XG4gICAgICBpZiAoaXNFbmFibGVkRmlsdGVyRGF5KGkpICYmIGlzRW5hYmxlZERheShpKSkge1xuICAgICAgICBzdGFydFJhbmdlID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2FtZSB3aXRoIHRoZSBtYXhcbiAgICBmb3IgKGxldCBpID0gc2NhbkVuZEluZGV4OyBpID49IHNjYW5TdGFydEluZGV4OyBpIC09IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIGVuZFJhbmdlID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0UmFuZ2UgIT0gbnVsbCAmJiBlbmRSYW5nZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgaTogc3RhcnRSYW5nZSwgdG86IGVuZFJhbmdlIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
557
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwseUJBQXlCLEVBR3pCLDBCQUEwQixFQUcxQixzQkFBc0IsRUFDdEIsZ0NBQWdDLEVBRWhDLG1CQUFtQixFQUNuQix1QkFBdUIsRUFJdkIsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQix3Q0FBd0MsRUFDeEMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsa0NBQWtDLEVBQ2xDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUNmLHVCQUF1QixFQUV2QixtQ0FBbUMsRUFDbkMsbUJBQW1CLEVBQ25CLDJCQUEyQixFQUMzQixxQkFBcUIsRUFFckIsdUJBQXVCLEVBR3ZCLHdCQUF3QixFQUV6QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsK0JBQStCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBNEQsZUFBZSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsaUNBQWlDLEVBQVksZUFBZSxFQUFFLGlCQUFpQixFQUFhLEtBQUssRUFBc0IsTUFBTSxFQUFFLFdBQVcsRUFBZ0IsYUFBYSxFQUF1QyxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL1YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxRCxPQUFPLEVBQWMsb0JBQW9CLEVBQUUsR0FBRyxFQUFF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QUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztLQUNqRjtJQUVELElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1FBQzFDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztRQUNsQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUM7UUFFOUIsc0JBQXNCO1FBQ3RCLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDdkIsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUVyQiw4SUFBOEk7UUFDOUksS0FBSyxJQUFJLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RELElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1QyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07YUFDUDtTQUNGO1FBRUQsb0JBQW9CO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0RCxJQUFJLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUMsUUFBUSxHQUFHLENBQUMsQ0FBQztnQkFDYixNQUFNO2FBQ1A7U0FDRjtLQUNGO0lBRUQsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7UUFDMUMsT0FBTyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0tBQ3hDO1NBQU07UUFDTCxPQUFPLFNBQVMsQ0FBQztLQUNsQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5LFxuICBkYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5LFxuICBEYXRlQmxvY2tJbmRleCxcbiAgRGF0ZUJsb2NrUmFuZ2VXaXRoUmFuZ2UsXG4gIGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5LFxuICBEYXRlT3JEYXRlQmxvY2tJbmRleCxcbiAgRGF0ZVJhbmdlLFxuICBkYXRlU2NoZWR1bGVEYXRlRmlsdGVyLFxuICBjb3B5RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyxcbiAgRGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyxcbiAgRGF0ZVNjaGVkdWxlRGF5Q29kZSxcbiAgZGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWssXG4gIERhdGVTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlU2NoZWR1bGVSYW5nZSxcbiAgRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnksXG4gIGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzLFxuICBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0LFxuICBmaW5kTWF4RGF0ZSxcbiAgZmluZE1pbkRhdGUsXG4gIGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24sXG4gIElzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzU2FtZURhdGUsXG4gIGlzU2FtZURhdGVEYXksXG4gIGlzU2FtZURhdGVSYW5nZSxcbiAgaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2UsXG4gIERhdGVPckRhdGVSYW5nZU9yRGF0ZUJsb2NrSW5kZXhPckRhdGVCbG9ja1JhbmdlLFxuICBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEFycmF5RmFjdG9yeSxcbiAgaXNJbmZpbml0ZURhdGVSYW5nZSxcbiAgY29weUhvdXJzQW5kTWludXRlc0Zyb21EYXRlLFxuICBkYXRlVGltZXpvbmVVdGNOb3JtYWwsXG4gIERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlLFxuICBleHBhbmREYXRlU2NoZWR1bGVSYW5nZSxcbiAgRGF0ZUJsb2NrLFxuICBEYXRlQmxvY2tEdXJhdGlvblNwYW4sXG4gIGZvcm1hdFRvSVNPODYwMURheVN0cmluZyxcbiAgRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXRcbn0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsSGFzRGlmZmVyZW50VmFsdWVzLCBmaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgTWF5YmUsIFRpbWV6b25lU3RyaW5nLCBEZWNpc2lvbkZ1bmN0aW9uLCBJdGVyYWJsZU9yVmFsdWUsIGl0ZXJhYmxlVG9BcnJheSwgYWRkVG9TZXQsIHRvZ2dsZUluU2V0LCBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24sIE1heWJlTWFwLCBtaW5BbmRNYXhOdW1iZXIsIHNldHNBcmVFcXVpdmFsZW50LCBEYXlPZldlZWssIHJhbmdlLCBBbGxPck5vbmVTZWxlY3Rpb24sIHVuaXF1ZSwgbWVyZ2VBcnJheXMsIEFycmF5T3JWYWx1ZSwgcmVtb3ZlRnJvbVNldCwgSVNPODYwMURheVN0cmluZywgZmlsdGVyVmFsdWVzVG9TZXQsIG1hcFZhbHVlc1RvU2V0IH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZSB9IGZyb20gJ0BuZ3J4L2NvbXBvbmVudC1zdG9yZSc7XG5pbXBvcnQgeyBzdGFydE9mRGF5LCBlbmRPZkRheSwgaXNCZWZvcmUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAsIGZpcnN0LCBjb21iaW5lTGF0ZXN0V2l0aCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnksIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZSwgZGVmYXVsdENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnkgfSBmcm9tICcuL2NhbGVuZGFyLnNjaGVkdWxlLnNlbGVjdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlIHtcbiAgLyoqXG4gICAqIElucHV0IFN0YXJ0IERhdGVcbiAgICovXG4gIGlucHV0U3RhcnQ6IERhdGU7XG4gIC8qKlxuICAgKiBJbnB1dCBFbmQgRGF0ZVxuICAgKi9cbiAgaW5wdXRFbmQ6IERhdGU7XG59XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UgPSBQYXJ0aWFsPE1heWJlTWFwPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSBleHRlbmRzIFBhcnRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogUmVhZG9ubHkgc3RhdGUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIERvZXMgbm90IGFmZmVjdCBzdGF0ZSBjaGFuZ2VzIGRpcmVjdGx5LCBidXQgaW5zdGVhZCBhY3RzIGFzIGEgZmxhZyBmb3IgdGhlIHBhcmVudCB2aWV3IHRvIHNldCBhbmQgdGhlIGNvbnN1bWluZyB2aWV3cyB0byB1cGRhdGUgb24uXG4gICAqL1xuICBpc1ZpZXdSZWFkb25seT86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogRmlsdGVycyB0aGUgZGF5cyBvZiB0aGUgc2NoZWR1bGUgdG8gb25seSBhbGxvdyBzZWxlY3RpbmcgZGF5cyBpbiB0aGUgc2NoZWR1bGUuXG4gICAqXG4gICAqIElmIGZpbHRlci5zdGFydCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgdGltZXpvbmUgaXMgaWdub3JlZCwgaWYgb25lIGlzIHByZXNlbnQuXG4gICAqL1xuICBmaWx0ZXI/OiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZXhjbHVzaW9ucyB0aGF0IG1heSBub3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbHRlci5cbiAgICovXG4gIGlucHV0RXhjbHVzaW9ucz86IE1heWJlPEFycmF5T3JWYWx1ZTxEYXRlT3JEYXRlUmFuZ2VPckRhdGVCbG9ja0luZGV4T3JEYXRlQmxvY2tSYW5nZT4+O1xuICAvKipcbiAgICogVGhlIGNvbXB1dGVkIGV4Y2x1c2lvbnMgZ2l2ZW4gdGhlIGlucHV0IGV4Y2x1c2lvbnMuXG4gICAqL1xuICBjb21wdXRlZEV4Y2x1c2lvbnM/OiBNYXliZTxEYXRlQmxvY2tJbmRleFtdPjtcbiAgLyoqXG4gICAqIFRoZSBtaW4vbWF4IGRhdGUgcmFuZ2UuIFVzZWQgZm9yIHJlc3RyaWN0aW5nIHRoZSBtaW4vbWF4IHZhbHVlLiBXb3JrcyB3aXRoIHRoZSBmaWx0ZXIuIFRoZSBncmVhdGVyL2xlc3NlciBvZiB0aGUgc3RhcnQvZW5kIGRhdGVzIGFyZSB1c2VkIGlmIGJvdGggYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgbWluTWF4RGF0ZVJhbmdlPzogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUuIElzIHVwZGF0ZWQgYXMgdGhlIGlucHV0U3RhcnQgaXMgbW9kaWZpZWQgb3IgZmlsdGVyIGlzIHByb3ZpZGVkIHRoYXQgcHJvdmlkZXMgdGhlIHN0YXJ0IGRhdGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRvZGF5IGFuZCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHN0YXJ0OiBEYXRlO1xuICAvKipcbiAgICogVGltZXpvbmUgdG8gdXNlLiBPbmx5SW5mbHVlbmNlcyB0aGUgb3V0cHV0IHN0YXJ0IGRhdGUuXG4gICAqL1xuICB0aW1lem9uZT86IE1heWJlPFRpbWV6b25lU3RyaW5nPjtcbiAgLyoqXG4gICAqIEN1cnJlbnQgdGltZXpvbmUgbm9ybWFsIHdpdGggdGhlIGN1cnJlbnQgdGltZXpvbmUuXG4gICAqL1xuICB0aW1lem9uZU5vcm1hbD86IE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPjtcbiAgLyoqXG4gICAqIERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeVxuICAgKi9cbiAgaW5kZXhGYWN0b3J5OiBEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3Rvcnk7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBtYW51YWxseSBzZWxlY3RlZCBkYXRlcyB3aXRoaW4gdGhlIHBpY2tlZCByYW5nZS4gVGhpcyBpcyBOT1QgdGhlIHNldCBvZiBhbGwgc2VsZWN0ZWQgaW5kZXhlcyBpbiB0ZXJtcyBvZiBvdXRwdXQuXG4gICAqXG4gICAqIFZhbHVlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgdGhlIFwiaW5wdXRcIiByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9uLCB3aGlsZSB0aG9zZVxuICAgKiB0aGF0IGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIHJhbmdlIGFyZSBjb25zaWRlcmVkIHRvZ2dsZWQgb2ZmLlxuICAgKlxuICAgKiBJZiBkYXRlcyBhcmUgc2VsZWN0ZWQsIGFuZCB0aGVuIGEgcmFuZ2UgaXMgc2VsZWN0ZWQsIHRoZW4gdGhvc2UgZGF0ZXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IGZhbGxcbiAgICogd2l0aGluIHRoZSByYW5nZSBhcmUgY2xlYXJlZCBmcm9tIHNlbGVjdGlvbi5cbiAgICpcbiAgICogVGhlc2UgaW5kZXhlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRhdGUuXG4gICAqL1xuICB0b2dnbGVkSW5kZXhlczogU2V0PERhdGVCbG9ja0luZGV4PjtcbiAgLyoqXG4gICAqIERheXMgb2YgdGhlIHNjaGVkdWxlIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgcGlja2VkLlxuICAgKi9cbiAgc2NoZWR1bGVEYXlzOiBTZXQ8RGF0ZVNjaGVkdWxlRGF5Q29kZT47XG4gIC8qKlxuICAgKiBTZXQgb2YgdGhlIGRheXMgb2Ygd2VlayB0aGF0IGFyZSBhbGxvd2VkLlxuICAgKi9cbiAgYWxsb3dlZERheXNPZldlZWs6IFNldDxEYXlPZldlZWs+O1xuICAvKipcbiAgICpcbiAgICovXG4gIGluZGV4RGF5T2ZXZWVrOiBEYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkIGdpdmVuIHRoZSBjdXJyZW50IGZpbHRlci5cbiAgICovXG4gIGlzRW5hYmxlZEZpbHRlckRheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD47XG4gIC8qKlxuICAgKiBEZWNpc2lvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUgY3VycmVudCBmaWx0ZXIgaW50byBhY2NvdW50LlxuICAgKi9cbiAgaXNFbmFibGVkRGF5OiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PjtcbiAgLyoqXG4gICAqIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnkgZm9yIHRoZSB2aWV3LlxuICAgKi9cbiAgY2VsbENvbnRlbnRGYWN0b3J5OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5O1xuICAvKipcbiAgICogQ3VycmVudCBzZWxlY3Rpb24gdmFsdWUuXG4gICAqL1xuICBjdXJyZW50U2VsZWN0aW9uVmFsdWU/OiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWU+O1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBmaWx0ZXIgYXMgdGhlIHN0YXJ0IGFuZCBlbmQgcmFuZ2UgaW5zdGVhZCBvZiBvcHRpbWl6aW5nIGZvciB0aGUgY3VycmVudCBpbmRleC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyPzogTWF5YmU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24gc3RhdGUgd2hlbiB0aGUgY2FsZW5kYXIgaXMgcmVzZXQuXG4gICAqL1xuICBpbml0aWFsU2VsZWN0aW9uU3RhdGU/OiBNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSgpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCBzY2hlZHVsZURheXMgPSBuZXcgU2V0KFtEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtEQVksIERhdGVTY2hlZHVsZURheUNvZGUuV0VFS0VORF0pO1xuICBjb25zdCBhbGxvd2VkRGF5c09mV2VlayA9IGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQoQXJyYXkuZnJvbShzY2hlZHVsZURheXMpKTtcbiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xuICBjb25zdCBpbmRleEZhY3RvcnkgPSBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnkoeyBzdGFydCB9KTtcbiAgY29uc3QgaW5kZXhEYXlPZldlZWsgPSBkYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5KHN0YXJ0KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0LFxuICAgIGluZGV4RmFjdG9yeSxcbiAgICB0b2dnbGVkSW5kZXhlczogbmV3IFNldCgpLFxuICAgIHNjaGVkdWxlRGF5cyxcbiAgICBhbGxvd2VkRGF5c09mV2VlayxcbiAgICBpbmRleERheU9mV2VlayxcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXk6ICgpID0+IHRydWUsXG4gICAgaXNFbmFibGVkRGF5OiAoKSA9PiBmYWxzZSxcbiAgICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogdHJ1ZSxcbiAgICBjZWxsQ29udGVudEZhY3Rvcnk6IGRlZmF1bHRDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluRGF0ZSh4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4pOiBNYXliZTxEYXRlPiB7XG4gIHJldHVybiBmaW5kTWF4RGF0ZShbeC5maWx0ZXI/LnN0YXJ0LCB4Lm1pbk1heERhdGVSYW5nZT8uc3RhcnRdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGVuZGFyU2NoZWR1bGVNYXhEYXRlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IE1heWJlPERhdGU+IHtcbiAgcmV0dXJuIGZpbmRNaW5EYXRlKFt4LmZpbHRlcj8uZW5kLCB4Lm1pbk1heERhdGVSYW5nZT8uZW5kXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IFBhcnRpYWw8RGF0ZVJhbmdlPiB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGNhbGVuZGFyU2NoZWR1bGVNaW5EYXRlKHgpIHx8IHVuZGVmaW5lZCxcbiAgICBlbmQ6IGNhbGVuZGFyU2NoZWR1bGVNYXhEYXRlKHgpIHx8IHVuZGVmaW5lZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXInPikge1xuICByZXR1cm4geC5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiB4LmZpbHRlcj8uc3RhcnQgIT0gbnVsbDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZSBleHRlbmRzIENvbXBvbmVudFN0b3JlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCkpO1xuICB9XG5cbiAgLy8gTUFSSzpcbiAgcmVhZG9ubHkgdG9nZ2xlU2VsZWN0aW9uID0gdGhpcy5lZmZlY3QoKGlucHV0OiBPYnNlcnZhYmxlPHZvaWQ+KSA9PiB7XG4gICAgcmV0dXJuIGlucHV0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgdGhpcy5uZXh0VG9nZ2xlU2VsZWN0aW9uJC5waXBlKFxuICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgZmlsdGVyTWF5YmUoKSxcbiAgICAgICAgICB0YXAoKHgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsRGF0ZXMoeCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xuXG4gIC8vIE1BUks6IEFjY2Vzc29yc1xuICByZWFkb25seSBmaWx0ZXIkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguZmlsdGVyKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbWluTWF4RGF0ZVJhbmdlJCA9IHRoaXMuc3RhdGUkLnBpcGUobWFwKGNhbGVuZGFyU2NoZWR1bGVNaW5BbmRNYXhEYXRlUmFuZ2UpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlUmFuZ2UpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgbWluRGF0ZSQgPSB0aGlzLm1pbk1heERhdGVSYW5nZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHg/LnN0YXJ0KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICByZWFkb25seSBtYXhEYXRlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZW5kKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGhhc0NvbmZpZ3VyZWRNaW5NYXhSYW5nZSQgPSB0aGlzLm1pbk1heERhdGVSYW5nZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHggIT0gbnVsbCAmJiB4LnN0YXJ0ICE9IG51bGwgJiYgeC5lbmQgIT0gbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0U3RhcnQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaW5wdXRTdGFydCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dEVuZCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pbnB1dEVuZCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50SW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8TWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9KSA9PiAoeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9KSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGUoYS5pbnB1dFN0YXJ0LCBiLmlucHV0U3RhcnQpICYmIGlzU2FtZURhdGUoYS5pbnB1dEVuZCwgYi5pbnB1dEVuZCkpLFxuICAgIG1hcCgoeCkgPT4ge1xuICAgICAgaWYgKHguaW5wdXRTdGFydCAmJiB4LmlucHV0RW5kKSB7XG4gICAgICAgIHJldHVybiB4IGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFJhbmdlJDogT2JzZXJ2YWJsZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U+ID0gdGhpcy5jdXJyZW50SW5wdXRSYW5nZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB2YWx1ZS4gVGhpcyBpcyB0aGUgc2V0IG9mIG1hbnVhbGx5IHRvZ2dlZCBvZmYgZGF0ZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB1cGRhdGUuXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RlZERhdGVzJDogT2JzZXJ2YWJsZTxTZXQ8RGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnRvZ2dsZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZEZpbHRlckRheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNFbmFibGVkRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyJDogT2JzZXJ2YWJsZTxNYXliZTxib29sZWFuPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIC8vXG4gICAgbWFwKGNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cyQ6IE9ic2VydmFibGU8U2V0PERhdGVTY2hlZHVsZURheUNvZGU+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNjaGVkdWxlRGF5cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoc2V0c0FyZUVxdWl2YWxlbnQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHgudGltZXpvbmUpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBlZmZlY3RpdmVUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoIWNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIoeCkgJiYgeC50aW1lem9uZSA/IHgudGltZXpvbmUgOiB1bmRlZmluZWQpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZWZmZWN0aXZlVGltZXpvbmVOb3JtYWwkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICghY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4KSAmJiB4LnRpbWV6b25lTm9ybWFsID8geC50aW1lem9uZU5vcm1hbCA6IHVuZGVmaW5lZCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY3VycmVudFNlbGVjdGlvblZhbHVlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZVN0YXJ0JCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUJsb2NrVGltaW5nRGF0ZUZhY3RvcnkkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWVTdGFydCQucGlwZShcbiAgICBtYXAoKHN0YXJ0KSA9PiAoc3RhcnQgPyBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeSh7IHN0YXJ0IH0pIDogdW5kZWZpbmVkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQmxvY2tEdXJhdGlvblNwYW4kOiBPYnNlcnZhYmxlPERhdGVCbG9ja0R1cmF0aW9uU3BhbjxEYXRlQmxvY2s+W10+ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IGV4cGFuZERhdGVTY2hlZHVsZVJhbmdlKHgpIDogW10pKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlU2VsZWN0ZWRJbmRleGVzJDogT2JzZXJ2YWJsZTxTZXQ8RGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUJsb2NrRHVyYXRpb25TcGFuJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gbmV3IFNldCh4Lm1hcCgoeSkgPT4geS5pKSkpLFxuICAgIGRpc3RpbmN0VW50aWxIYXNEaWZmZXJlbnRWYWx1ZXMoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlU2VsZWN0ZWREYXRlcyQ6IE9ic2VydmFibGU8U2V0PElTTzg2MDFEYXlTdHJpbmc+PiA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUJsb2NrVGltaW5nRGF0ZUZhY3RvcnkkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChkYXRlRmFjdG9yeSkgPT4ge1xuICAgICAgcmV0dXJuIGRhdGVGYWN0b3J5ID8gdGhpcy5zZWxlY3Rpb25WYWx1ZVNlbGVjdGVkSW5kZXhlcyQucGlwZShtYXAoKHgpID0+IG1hcFZhbHVlc1RvU2V0KHgsICh5KSA9PiBmb3JtYXRUb0lTTzg2MDFEYXlTdHJpbmcoZGF0ZUZhY3RvcnkoeSkpKSkpIDogb2YobmV3IFNldDxJU084NjAxRGF5U3RyaW5nPigpKTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy5lZmZlY3RpdmVUaW1lem9uZU5vcm1hbCQpLFxuICAgIG1hcCgoW3gsIHRpbWV6b25lTm9ybWFsXSkgPT4ge1xuICAgICAgaWYgKHggJiYgdGltZXpvbmVOb3JtYWwpIHtcbiAgICAgICAgeCA9IHtcbiAgICAgICAgICBkYXRlU2NoZWR1bGVSYW5nZToge1xuICAgICAgICAgICAgLi4ueC5kYXRlU2NoZWR1bGVSYW5nZSxcbiAgICAgICAgICAgIHN0YXJ0OiB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKHguZGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgZW5kOiB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKHguZGF0ZVNjaGVkdWxlUmFuZ2UuZW5kKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB4O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmVEYXRlQmxvY2tEdXJhdGlvblNwYW4kOiBPYnNlcnZhYmxlPERhdGVCbG9ja0R1cmF0aW9uU3BhbjxEYXRlQmxvY2s+W10+ID0gdGhpcy5zZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQucGlwZShcbiAgICBtYXAoKHgpID0+IGV4cGFuZERhdGVTY2hlZHVsZVJhbmdlKHgpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG5leHRUb2dnbGVTZWxlY3Rpb24kOiBPYnNlcnZhYmxlPE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4+ID0gdGhpcy5oYXNDb25maWd1cmVkTWluTWF4UmFuZ2UkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPj47XG5cbiAgICAgIGlmIChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6ICdhbGwnKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6IHVuZGVmaW5lZCkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVTY2hlZHVsZVJhbmdlVmFsdWUkID0gdGhpcy5jdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgY2VsbENvbnRlbnRGYWN0b3J5JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmNlbGxDb250ZW50RmFjdG9yeSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzQ3VzdG9taXplZCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC50b2dnbGVkSW5kZXhlcy5zaXplID4gMCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzVmlld1JlYWRvbmx5JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzVmlld1JlYWRvbmx5KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLy8gTUFSSzogU3RhdGUgQ2hhbmdlc1xuICByZWFkb25seSBzZXRNaW5NYXhEYXRlUmFuZ2UgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoTWluTWF4RGF0ZVJhbmdlKTtcbiAgcmVhZG9ubHkgc2V0RmlsdGVyID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aEZpbHRlcik7XG4gIHJlYWRvbmx5IHNldEV4Y2x1c2lvbnMgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoRXhjbHVzaW9ucyk7XG4gIHJlYWRvbmx5IHNldENvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aENvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKTtcbiAgcmVhZG9ubHkgY2xlYXJGaWx0ZXIgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGUsIHVuZGVmaW5lZCkpO1xuXG4gIHJlYWRvbmx5IHNldFRpbWV6b25lID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aFRpbWV6b25lVmFsdWUpO1xuICByZWFkb25seSBzZXRJbnB1dFJhbmdlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZSk7XG5cbiAgLy8gTk9URTogU2VsZWN0ZWQgZGF0ZXMgYXJlIE5PVCBzZWxlY3RlZCBpbmRleGVzLiBUaGV5IGFyZSB0aGUgaW50ZXJuYWwgc2VsZWN0ZWQgZGF0ZXMgdGhhdCBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICByZWFkb25seSB0b2dnbGVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdG9nZ2xlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgdG9nZ2xlIH0pKTtcbiAgcmVhZG9ubHkgYWRkU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGFkZDogSXRlcmFibGVPclZhbHVlPERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeUlucHV0PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IGFkZCB9KSk7XG4gIHJlYWRvbmx5IHJlbW92ZVNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCByZW1vdmU6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyByZW1vdmUgfSkpO1xuICByZWFkb25seSBzZXRTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2V0IH0pKTtcblxuICAvLyBOT1RFOiBTZWxlY3RlZCBpbmRleGVzIGFyZSB0aGUgdHlwaWNhbC9leHBlY3RlZCBpbmRleGVzIHRoYXQgYXJlIHNlbGVjdGVkIG9yIG5vdC5cbiAgcmVhZG9ubHkgc2V0U2VsZWN0ZWRJbmRleGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2V0LCBpbnZlcnRTZXRCZWhhdmlvcjogdHJ1ZSB9KSk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0QWxsRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzZWxlY3RBbGw6IEFsbE9yTm9uZVNlbGVjdGlvbiA9ICdhbGwnKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2VsZWN0QWxsIH0pKTtcbiAgcmVhZG9ubHkgc2V0SW5pdGlhbFNlbGVjdGlvblN0YXRlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aEluaXRpYWxTZWxlY3Rpb25TdGF0ZSk7XG5cbiAgcmVhZG9ubHkgc2V0U2NoZWR1bGVEYXlzID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMpO1xuICByZWFkb25seSBzZXRBbGxvd0FsbFNjaGVkdWxlRGF5cyA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoc3RhdGUsIG51bGwpKTtcblxuICByZWFkb25seSBzZXREYXRlU2NoZWR1bGVSYW5nZVZhbHVlID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdmFsdWU6IE1heWJlPERhdGVTY2hlZHVsZVJhbmdlPikgPT4gdXBkYXRlU3RhdGVXaXRoRGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZShzdGF0ZSwgdmFsdWUpKTtcbiAgcmVhZG9ubHkgc2V0Q2VsbENvbnRlbnRGYWN0b3J5ID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgY2VsbENvbnRlbnRGYWN0b3J5OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5KSA9PiAoeyAuLi5zdGF0ZSwgY2VsbENvbnRlbnRGYWN0b3J5IH0pKTtcblxuICAvKipcbiAgICogVXNlZCBieSB0aGUgcGFyZW50IHZpZXcgdG8gcHJvcG9nYXRlIGEgcmVhZG9ubHkgc3RhdGUuXG4gICAqXG4gICAqIFNob3VsZCB0eXBpY2FsbHkgbm90IGJlIHVzZWQgYnkgdGhlIHVzZXIgZGlyZWN0bHkgd2l0aCB0aGUgaW50ZW50aW9uIG9mIHRoZSBwYXJlbnQgc3luY2hyb25pemluZyB0byB0aGlzIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0Vmlld1JlYWRvbmx5U3RhdGUgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBpc1ZpZXdSZWFkb25seTogYm9vbGVhbikgPT4gKHsgLi4uc3RhdGUsIGlzVmlld1JlYWRvbmx5IH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aEluaXRpYWxTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBpbml0aWFsU2VsZWN0aW9uU3RhdGU6IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHRvZ2dsZWRJbmRleGVzIH0gPSBzdGF0ZTtcblxuICBpZiAodG9nZ2xlZEluZGV4ZXMuc2l6ZSA9PT0gMCAmJiBpbml0aWFsU2VsZWN0aW9uU3RhdGUgPT09ICdhbGwnKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2VsZWN0QWxsOiBpbml0aWFsU2VsZWN0aW9uU3RhdGUgfSk7XG4gIH1cblxuICByZXR1cm4geyAuLi5zdGF0ZSwgaW5pdGlhbFNlbGVjdGlvblN0YXRlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcihjdXJyZW50U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXI6IE1heWJlPGJvb2xlYW4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbGV0IHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUgPSB7IC4uLmN1cnJlbnRTdGF0ZSwgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgfTtcblxuICBpZiAoQm9vbGVhbihjdXJyZW50U3RhdGUuY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpICE9PSBCb29sZWFuKGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKSkge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7fSk7IC8vIHJlY2FsY3VsYXRlIGlmIGNoYW5nZSBvY2N1cnMgYXMgaXQgd2lsbCBhZmZlY3QgdGhlIG91dHB1dCB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRXhjbHVzaW9ucyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBpbnB1dEV4Y2x1c2lvbnM6IE1heWJlPEFycmF5T3JWYWx1ZTxEYXRlT3JEYXRlUmFuZ2VPckRhdGVCbG9ja0luZGV4T3JEYXRlQmxvY2tSYW5nZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbGV0IGNvbXB1dGVkRXhjbHVzaW9uczogTWF5YmU8RGF0ZUJsb2NrSW5kZXhbXT47XG5cbiAgaWYgKGlucHV0RXhjbHVzaW9ucykge1xuICAgIGNvbnN0IHsgaW5kZXhGYWN0b3J5IH0gPSBzdGF0ZTtcbiAgICBjb25zdCBpbmRleEFycmF5RmFjdG9yeSA9IGRhdGVUaW1pbmdSZWxhdGl2ZUluZGV4QXJyYXlGYWN0b3J5KGluZGV4RmFjdG9yeSk7XG4gICAgY29tcHV0ZWRFeGNsdXNpb25zID0gaW5kZXhBcnJheUZhY3RvcnkoaW5wdXRFeGNsdXNpb25zKTtcbiAgfVxuXG4gIHN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRFeGNsdXNpb25zLCBjb21wdXRlZEV4Y2x1c2lvbnMgfTtcbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgc3RhdGUuZmlsdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBtaW5NYXhEYXRlUmFuZ2U6IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBzdGF0ZSA9IHsgLi4uc3RhdGUgfTtcblxuICBpZiAobWluTWF4RGF0ZVJhbmdlICE9IG51bGwgJiYgIWlzSW5maW5pdGVEYXRlUmFuZ2UobWluTWF4RGF0ZVJhbmdlKSkge1xuICAgIHN0YXRlLm1pbk1heERhdGVSYW5nZSA9IHtcbiAgICAgIHN0YXJ0OiBtaW5NYXhEYXRlUmFuZ2Uuc3RhcnQgIT0gbnVsbCA/IHN0YXJ0T2ZEYXkobWluTWF4RGF0ZVJhbmdlLnN0YXJ0KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuZDogbWluTWF4RGF0ZVJhbmdlLmVuZCAhPSBudWxsID8gZW5kT2ZEYXkobWluTWF4RGF0ZVJhbmdlLmVuZCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBzdGF0ZS5taW5NYXhEYXRlUmFuZ2U7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBzdGF0ZS5maWx0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0RmlsdGVyOiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgY29tcHV0ZWRFeGNsdXNpb25zOiBleGNsdXNpb25zLCBtaW5NYXhEYXRlUmFuZ2UgfSA9IHN0YXRlO1xuXG4gIGxldCBpc0VuYWJsZWRGaWx0ZXJEYXk6IE1heWJlPERlY2lzaW9uRnVuY3Rpb248RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PiA9ICgpID0+IHRydWU7XG4gIGxldCBmaWx0ZXI6IE1heWJlPERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+ID0gbnVsbDtcblxuICAvLyBjcmVhdGUgdGhlIGZpbHRlciB1c2luZyBpbnB1dEZpbHRlciwgZXhjbHVzaW9ucywgYW5kIG1pbk1heERhdGVSYW5nZVxuICBpZiAoaW5wdXRGaWx0ZXIgfHwgZXhjbHVzaW9ucz8ubGVuZ3RoIHx8IG1pbk1heERhdGVSYW5nZSkge1xuICAgIGxldCBlbmFibGVkRmlsdGVyOiBEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnO1xuXG4gICAgaWYgKGlucHV0RmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSBjb3B5RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyhpbnB1dEZpbHRlcik7IC8vIGNvcHkgZmlsdGVyXG5cbiAgICAgIGlmIChleGNsdXNpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgZW5hYmxlZEZpbHRlciA9IHtcbiAgICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgICAgZXg6IHVuaXF1ZShtZXJnZUFycmF5cyhbZmlsdGVyLmV4LCBleGNsdXNpb25zXSkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmFibGVkRmlsdGVyID0gZmlsdGVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbmFibGVkRmlsdGVyID0ge1xuICAgICAgICB3OiAnODknLFxuICAgICAgICBleDogZXhjbHVzaW9ucyBhcyBudW1iZXJbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWluTWF4RGF0ZVJhbmdlKSB7XG4gICAgICBlbmFibGVkRmlsdGVyLm1pbk1heERhdGVSYW5nZSA9IG1pbk1heERhdGVSYW5nZTtcbiAgICAgIGVuYWJsZWRGaWx0ZXIuc2V0U3RhcnRBc01pbkRhdGUgPSBmaWx0ZXI/LnN0YXJ0ID8gdHJ1ZSA6IGZhbHNlOyAvLyBJZiBhIHN0YXJ0IGRhdGUgaXMgc2V0LCB0aGVuIGl0IGJlY29tZXMgdGhlIGZsb29yLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBpbnB1dCBmaWx0ZXIgaGFzIGEgc3RhcnQgZGF0ZSwgdXNlIHRoYXQgYXMgdGhlIHJlbGF0aXZlIHN0YXJ0IHRvIGVuc3VyZSBpbmRleGVzIGFyZSBjb21wYXJlZCB0aGUgc2FtZSxcbiAgICAgKiBvdGhlcndpc2UgdXNlIHRoZSBzdGF0ZSdzIHN0YXJ0LiBUaGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIGluZGV4IGNhbGN1bGF0aW9ucy5cbiAgICAgKi9cbiAgICBlbmFibGVkRmlsdGVyLnN0YXJ0ID0gaW5wdXRGaWx0ZXI/LnN0YXJ0ID8/IHN0YXRlLnN0YXJ0O1xuXG4gICAgLy8gY3JlYXRlIHRoZSBmaWx0ZXJcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXkgPSBkYXRlU2NoZWR1bGVEYXRlRmlsdGVyKGVuYWJsZWRGaWx0ZXIpO1xuICB9XG5cbiAgc3RhdGUgPSB7IC4uLnN0YXRlLCBmaWx0ZXIsIGlzRW5hYmxlZEZpbHRlckRheSB9O1xuXG4gIC8vIEZvciB0aGUgc2FtZSByZWFzb24gYXMgYWJvdmUsIHVzZSB0aGUgZmlsdGVyJ3Mgc3RhcnQgZGF0ZSBhcyB0aGUgcmVsYXRpdmUgc3RhcnQgaWYgYXBwbGljYWJsZS5cbiAgaWYgKGZpbHRlciAmJiBmaWx0ZXIuc3RhcnQpIHtcbiAgICBjb25zdCBzdGFydCA9IGZpbHRlci5zdGFydDtcbiAgICBzdGF0ZS5zdGFydCA9IHN0YXJ0O1xuICAgIHN0YXRlLmluZGV4RmFjdG9yeSA9IGRhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeSh7IHN0YXJ0IH0pO1xuICAgIHN0YXRlLmluZGV4RGF5T2ZXZWVrID0gZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeShzdGFydCk7XG4gIH1cblxuICAvLyBhdHRlbXB0IHRvIHJlLWFwcGx5IHRoZSBpbml0aWFsIHNlbGVjdGlvbiBzdGF0ZSBvbmNlIGZpbHRlciBpcyBhcHBsaWVkXG4gIGlmIChzdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aEluaXRpYWxTZWxlY3Rpb25TdGF0ZShzdGF0ZSwgc3RhdGUuaW5pdGlhbFNlbGVjdGlvblN0YXRlKTtcbiAgfVxuXG4gIC8vIHJlLWNhbGN1bGF0ZSB0aGUgc2VsZWN0aW9uIGdpdmVuIHRoZSBmaWx0ZXJcbiAgY29uc3QgeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9ID0gc3RhdGU7XG5cbiAgaWYgKGlucHV0U3RhcnQgJiYgaW5wdXRFbmQpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZSwgeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aFRpbWV6b25lVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgdGltZXpvbmU6IE1heWJlPFRpbWV6b25lU3RyaW5nPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgY3VycmVudFNlbGVjdGlvblZhbHVlIH0gPSBzdGF0ZTtcblxuICBjb25zdCB0aW1lem9uZU5vcm1hbCA9IHRpbWV6b25lID8gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHsgdGltZXpvbmUgfSkgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHRpbWV6b25lTm9ybWFsICYmIGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSkge1xuICAgIC8vIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIHZhbHVlIHRvIHJlZmxlY3QgdGhlIHRpbWV6b25lIGNoYW5nZXMuXG5cbiAgICBjb25zdCB7IGRhdGVTY2hlZHVsZVJhbmdlOiBjdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2UgfSA9IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZTtcbiAgICBjb25zdCBzdGFydCA9IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoY3VycmVudERhdGVTY2hlZHVsZVJhbmdlLnN0YXJ0KTtcbiAgICBjb25zdCBlbmQgPSB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZS5lbmQpO1xuXG4gICAgY29uc3QgbmV3UmFuZ2U6IERhdGVTY2hlZHVsZVJhbmdlID0ge1xuICAgICAgLi4uY3VycmVudFNlbGVjdGlvblZhbHVlLmRhdGVTY2hlZHVsZVJhbmdlLFxuICAgICAgc3RhcnQsXG4gICAgICBlbmRcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoeyAuLi5zdGF0ZSwgdGltZXpvbmUsIHRpbWV6b25lTm9ybWFsIH0sIG5ld1JhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyAuLi5zdGF0ZSwgdGltZXpvbmUsIHRpbWV6b25lTm9ybWFsIH07IC8vIG5vIGNoYW5nZSBpbiB2YWx1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhEYXRlU2NoZWR1bGVSYW5nZVZhbHVlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogTWF5YmU8RGF0ZVNjaGVkdWxlUmFuZ2U+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyB0aW1lem9uZU5vcm1hbCwgY3VycmVudFNlbGVjdGlvblZhbHVlIH0gPSBzdGF0ZTtcbiAgY29uc3QgY3VycmVudERhdGVTY2hlZHVsZVJhbmdlID0gY3VycmVudFNlbGVjdGlvblZhbHVlPy5kYXRlU2NoZWR1bGVSYW5nZTsgLy8gY3VycmVudCByYW5nZSBpcyBhbHdheXMgaW4gc3lzdGVtIHRpbWVcblxuICBpZiAoIWNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIoc3RhdGUpICYmIHRpbWV6b25lTm9ybWFsKSB7XG4gICAgLy8gV2hlbiB1c2luZyB0aW1lem9uZXMsIGFsd2F5cyByZXR1cm4gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRheS4gSW5wdXRzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIHN5c3RlbSB0aW1lIGFuZCB1c2VkIGFzIHRoZSBzdGFydCBvZiB0aGUgZGF5LlxuICAgIC8vIE91dHB1dHMgcmVtYWluIGFjY3VyYXRlLlxuXG4gICAgaWYgKGNoYW5nZSkge1xuICAgICAgY2hhbmdlID0ge1xuICAgICAgICAuLi5jaGFuZ2UsXG4gICAgICAgIHN0YXJ0OiBzdGFydE9mRGF5KHRpbWV6b25lTm9ybWFsLnN5c3RlbURhdGVUb1RhcmdldERhdGUoY2hhbmdlLnN0YXJ0KSksXG4gICAgICAgIGVuZDogc3RhcnRPZkRheSh0aW1lem9uZU5vcm1hbC5zeXN0ZW1EYXRlVG9UYXJnZXREYXRlKGNoYW5nZS5lbmQpKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc1NhbWVWYWx1ZSA9IGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZSwgY2hhbmdlKTtcblxuICBpZiAoaXNTYW1lVmFsdWUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNoYW5nZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBuZXh0U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uc3RhdGUsIGlucHV0U3RhcnQ6IGNoYW5nZS5zdGFydCwgaW5wdXRFbmQ6IGNoYW5nZS5lbmQsIHRvZ2dsZWRJbmRleGVzOiBuZXcgU2V0KGNoYW5nZS5leCkgfTtcbiAgICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSksIGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzKGNoYW5nZS53IHx8ICc4OScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vU2VsZWN0aW9uQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlKTsgLy8gY2xlYXIgc2VsZWN0aW9uLCByZXRhaW4gZGlzYWJsZWQgZGF5c1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IE1heWJlPEl0ZXJhYmxlPERhdGVTY2hlZHVsZURheUNvZGU+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgc2NoZWR1bGVEYXlzOiBjdXJyZW50U2NoZWR1bGVEYXlzIH0gPSBzdGF0ZTtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChjaGFuZ2UgfHwgW0RhdGVTY2hlZHVsZURheUNvZGUuV0VFS0RBWSwgRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLRU5EXSk7XG5cbiAgaWYgKHNldHNBcmVFcXVpdmFsZW50KGN1cnJlbnRTY2hlZHVsZURheXMsIHNjaGVkdWxlRGF5cykpIHtcbiAgICByZXR1cm4gc3RhdGU7IC8vIG5vIGNoYW5nZVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFsbG93ZWREYXlzT2ZXZWVrID0gZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXNUb0RheU9mV2Vla1NldChBcnJheS5mcm9tKHNjaGVkdWxlRGF5cykpO1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUsIHNjaGVkdWxlRGF5cywgYWxsb3dlZERheXNPZldlZWsgfTtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZURhdGVzQ2hhbmdlIHtcbiAgcmVzZXQ/OiB0cnVlO1xuICB0b2dnbGU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICBhZGQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICByZW1vdmU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICBzZXQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+O1xuICBzZWxlY3RBbGw/OiBBbGxPck5vbmVTZWxlY3Rpb247XG4gIC8qKlxuICAgKiBJbnZlcnRzIHRoZSBzZXQgZGF0ZSBjaGFuZ2luZyBiZWhhdmlvciBzbyB0aGF0IHRoZSBzZXQgaW5wdXQgaXMgdHJlYXRlZCBhcyBpdGVtcyB0aGF0IHNob3VsZCBiZSByZXRhaW5lZCBpbnN0ZWFkIG9mIGV4Y2x1ZGVkLlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4gc2V0IGlzIG5vdCB1c2VkLiBJZ25vcmVkIGZvciBzZWxlY3RBbGwuXG4gICAqL1xuICBpbnZlcnRTZXRCZWhhdmlvcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGVEYXRlc0NoYW5nZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWssIGlucHV0U3RhcnQ6IGN1cnJlbnRJbnB1dFN0YXJ0LCBpbnB1dEVuZDogY3VycmVudElucHV0RW5kLCBtaW5NYXhEYXRlUmFuZ2UsIGZpbHRlciB9ID0gc3RhdGU7XG4gIGNvbnN0IHsgc3RhcnQ6IG1pbkRhdGUsIGVuZDogbWF4RGF0ZSB9ID0gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZShzdGF0ZSk7XG4gIGxldCBpbnB1dFN0YXJ0ID0gY3VycmVudElucHV0U3RhcnQ7XG4gIGxldCBpbnB1dEVuZCA9IGN1cnJlbnRJbnB1dEVuZDtcblxuICAvKipcbiAgICogVGhpcyBpcyBhIHNldCBvZiBpbmRleGVzIHRoYXQgYXJlIGludGVybmFsbHkgXCJzZWxlY3RlZFwiIHNvIHRoYXQgdGhleSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXRTdGFydC9pbnB1dEVuZCBkYXRlIHJhbmdlLlxuICAgKlxuICAgKiBEbyBub3QgY29uZnVzZSB0aGlzIHdpdGggdGhlIGFjdHVhbCBpbmRleGVzIHRoYXQgYXJlIHNlbGVjdGVkLlxuICAgKi9cbiAgbGV0IHRvZ2dsZWRJbmRleGVzOiBTZXQ8RGF0ZUJsb2NrSW5kZXg+O1xuXG4gIGZ1bmN0aW9uIGFzSW5kZXhlcyhpbmRleGVzOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+KTogRGF0ZUJsb2NrSW5kZXhbXSB7XG4gICAgcmV0dXJuIGl0ZXJhYmxlVG9BcnJheShpbmRleGVzKS5tYXAoaW5kZXhGYWN0b3J5KTtcbiAgfVxuXG4gIGlmIChjaGFuZ2UucmVzZXQgfHwgY2hhbmdlLnNlbGVjdEFsbCAhPSBudWxsIHx8IGNoYW5nZS5zZXQgIT0gbnVsbCkge1xuICAgIGxldCBzZXQ6IE1heWJlPEl0ZXJhYmxlT3JWYWx1ZTxEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+ID0gY2hhbmdlLnNldCA/PyBbXTtcbiAgICBjb25zdCBzZWxlY3RBbGw6IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4gPSBjaGFuZ2UucmVzZXQgPT09IHRydWUgPyBzdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUgOiBjaGFuZ2Uuc2VsZWN0QWxsO1xuXG4gICAgc3dpdGNoIChzZWxlY3RBbGwpIHtcbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGlmIChtaW5EYXRlICE9IG51bGwgJiYgbWF4RGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgaW5wdXRTdGFydCA9IG1pbkRhdGU7XG4gICAgICAgICAgaW5wdXRFbmQgPSBtYXhEYXRlO1xuICAgICAgICAgIHNldCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIGlucHV0U3RhcnQgPSBudWxsO1xuICAgICAgICBpbnB1dEVuZCA9IG51bGw7XG4gICAgICAgIHNldCA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQoYXNJbmRleGVzKHNldCkpO1xuXG4gICAgaWYgKGNoYW5nZS5pbnZlcnRTZXRCZWhhdmlvciAmJiBtaW5EYXRlICYmIG1heERhdGUgJiYgIXNlbGVjdEFsbCkge1xuICAgICAgY29uc3QgbWluSW5kZXggPSBpbmRleEZhY3RvcnkobWluRGF0ZSk7XG4gICAgICBjb25zdCBtYXhJbmRleCA9IGluZGV4RmFjdG9yeShtYXhEYXRlKTtcblxuICAgICAgaW5wdXRTdGFydCA9IG1pbkRhdGU7XG4gICAgICBpbnB1dEVuZCA9IG1heERhdGU7XG4gICAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQocmFuZ2UobWluSW5kZXgsIG1heEluZGV4ICsgMSkuZmlsdGVyKCh4KSA9PiAhdG9nZ2xlZEluZGV4ZXMuaGFzKHgpKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRvZ2dsZWRJbmRleGVzID0gbmV3IFNldChzdGF0ZS50b2dnbGVkSW5kZXhlcyk7XG5cbiAgICBpZiAoY2hhbmdlLnRvZ2dsZSkge1xuICAgICAgY29uc3QgYWxsb3dlZFRvVG9nZ2xlID0gYXNJbmRleGVzKGNoYW5nZS50b2dnbGUpLmZpbHRlcigoaSkgPT4gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKGkpKSk7XG4gICAgICB0b2dnbGVJblNldCh0b2dnbGVkSW5kZXhlcywgYWxsb3dlZFRvVG9nZ2xlKTtcbiAgICB9XG5cbiAgICBsZXQgYWRkVG9FeGNsdXNpb246IE1heWJlPEl0ZXJhYmxlT3JWYWx1ZTxEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4+O1xuICAgIGxldCByZW1vdmVGcm9tRXhjbHVzaW9uOiBNYXliZTxJdGVyYWJsZU9yVmFsdWU8RGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5SW5wdXQ+PjtcblxuICAgIGlmIChjaGFuZ2UuYWRkKSB7XG4gICAgICBpZiAoY2hhbmdlLmludmVydFNldEJlaGF2aW9yKSB7XG4gICAgICAgIGFkZFRvRXhjbHVzaW9uID0gY2hhbmdlLmFkZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUZyb21FeGNsdXNpb24gPSBjaGFuZ2UuYWRkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2UucmVtb3ZlKSB7XG4gICAgICBpZiAoY2hhbmdlLmludmVydFNldEJlaGF2aW9yKSB7XG4gICAgICAgIHJlbW92ZUZyb21FeGNsdXNpb24gPSBjaGFuZ2UucmVtb3ZlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkVG9FeGNsdXNpb24gPSBjaGFuZ2UucmVtb3ZlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhZGRUb0V4Y2x1c2lvbikge1xuICAgICAgcmVtb3ZlRnJvbVNldCh0b2dnbGVkSW5kZXhlcywgYXNJbmRleGVzKGFkZFRvRXhjbHVzaW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZUZyb21FeGNsdXNpb24pIHtcbiAgICAgIGFkZFRvU2V0KHRvZ2dsZWRJbmRleGVzLCBhc0luZGV4ZXMocmVtb3ZlRnJvbUV4Y2x1c2lvbikpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUsIGlucHV0U3RhcnQsIGlucHV0RW5kLCB0b2dnbGVkSW5kZXhlcyB9O1xuICBuZXh0U3RhdGUuaXNFbmFibGVkRGF5ID0gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcblxuICAvLyBSZWNhbGN1bGF0ZSB0aGUgcmFuZ2UgYW5kIHNpbXBsaWZpZWQgdG8gZXhjbHVzaW9uc1xuICBjb25zdCByYW5nZUFuZEV4Y2x1c2lvbiA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKG5leHRTdGF0ZSk7XG5cbiAgaWYgKHJhbmdlQW5kRXhjbHVzaW9uKSB7XG4gICAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHsgLi4ubmV4dFN0YXRlLCB0b2dnbGVkSW5kZXhlczogbmV3IFNldChyYW5nZUFuZEV4Y2x1c2lvbi5leGNsdWRlZCksIGlucHV0U3RhcnQ6IHJhbmdlQW5kRXhjbHVzaW9uLnN0YXJ0LCBpbnB1dEVuZDogcmFuZ2VBbmRFeGNsdXNpb24uZW5kIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIHNlbGVjdGVkIGRheXNcbiAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSh7IC4uLnN0YXRlLCB0b2dnbGVkSW5kZXhlczogbmV3IFNldCgpLCBpbnB1dFN0YXJ0OiBudWxsLCBpbnB1dEVuZDogbnVsbCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgaW5wdXRTdGFydDogY3VycmVudElucHV0U3RhcnQsIGlucHV0RW5kOiBjdXJyZW50SW5wdXRFbmQsIGluZGV4RmFjdG9yeSwgbWluTWF4RGF0ZVJhbmdlIH0gPSBzdGF0ZTtcbiAgY29uc3QgeyBzdGFydDogbWluRGF0ZSwgZW5kOiBtYXhEYXRlIH06IFBhcnRpYWw8RGF0ZVJhbmdlPiA9IG1pbk1heERhdGVSYW5nZSA/PyB7fTtcblxuICBjb25zdCBpbnB1dFN0YXJ0OiBEYXRlID0gc3RhcnRPZkRheShjaGFuZ2UuaW5wdXRTdGFydCk7XG4gIGNvbnN0IGlucHV0RW5kOiBEYXRlID0gZW5kT2ZEYXkoY2hhbmdlLmlucHV0RW5kKTtcblxuICBjb25zdCBpc1ZhbGlkUmFuZ2UgPSBtaW5EYXRlICE9IG51bGwgfHwgbWF4RGF0ZSAhPSBudWxsID8gaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBtaW5EYXRlID8/IHVuZGVmaW5lZCwgZW5kOiBtYXhEYXRlID8/IHVuZGVmaW5lZCB9KSA6ICgpID0+IHRydWU7XG5cbiAgaWYgKCFpc1ZhbGlkUmFuZ2UoaW5wdXRTdGFydCkgfHwgIWlzVmFsaWRSYW5nZShpbnB1dEVuZCkgfHwgKGlzU2FtZURhdGVEYXkoaW5wdXRTdGFydCwgY3VycmVudElucHV0U3RhcnQpICYmIGlzU2FtZURhdGVEYXkoaW5wdXRFbmQsIGN1cnJlbnRJbnB1dEVuZCkpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBpZiBubyBjaGFuZ2UsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAgfVxuXG4gIC8vIHJldGFpbiBhbGwgaW5kZXhlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIG5ldyByYW5nZVxuICBjb25zdCBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgY29uc3QgbWF4SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRFbmQpICsgMTtcblxuICBjb25zdCBjdXJyZW50SW5kZXhlczogRGF0ZUJsb2NrSW5kZXhbXSA9IEFycmF5LmZyb20oc3RhdGUudG9nZ2xlZEluZGV4ZXMpO1xuICBjb25zdCBpc0luQ3VycmVudFJhbmdlID0gaXNJbmRleE51bWJlckluSW5kZXhSYW5nZUZ1bmN0aW9uKHsgbWluSW5kZXgsIG1heEluZGV4IH0pO1xuICBjb25zdCBleGNsdWRlZEluZGV4ZXNJbk5ld1JhbmdlID0gY3VycmVudEluZGV4ZXMuZmlsdGVyKGlzSW5DdXJyZW50UmFuZ2UpO1xuICBjb25zdCB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQoZXhjbHVkZWRJbmRleGVzSW5OZXdSYW5nZSk7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgdG9nZ2xlZEluZGV4ZXMsIGlucHV0U3RhcnQsIGlucHV0RW5kIH07XG4gIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBuZXh0U3RhdGUuaXNFbmFibGVkRGF5ID0gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgbmV4dFN0YXRlLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblZhbHVlKG5leHRTdGF0ZSk7XG4gIHJldHVybiBuZXh0U3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogRGVjaXNpb25GdW5jdGlvbjxEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dD4ge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIGluZGV4RGF5T2ZXZWVrLCBhbGxvd2VkRGF5c09mV2VlayB9ID0gc3RhdGU7XG5cbiAgbGV0IGlzSW5TdGFydEFuZEVuZFJhbmdlOiBJc0RhdGVXaXRoaW5EYXRlQmxvY2tSYW5nZUZ1bmN0aW9uO1xuXG4gIGlmIChpbnB1dFN0YXJ0ICYmIGlucHV0RW5kKSB7XG4gICAgaXNJblN0YXJ0QW5kRW5kUmFuZ2UgPSBpc0RhdGVXaXRoaW5EYXRlQmxvY2tSYW5nZUZ1bmN0aW9uKHsgc3RhcnQ6IHN0YXRlLnN0YXJ0LCByYW5nZTogeyBzdGFydDogaW5wdXRTdGFydCwgZW5kOiBpbnB1dEVuZCB9IH0pO1xuICB9IGVsc2Uge1xuICAgIGlzSW5TdGFydEFuZEVuZFJhbmdlID0gKCkgPT4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKGlucHV0OiBEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlJbnB1dCkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0KTtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBpbmRleERheU9mV2VlayhpbmRleCk7XG5cbiAgICBjb25zdCBpc0luU2VsZWN0ZWRSYW5nZSA9IGlzSW5TdGFydEFuZEVuZFJhbmdlKGluZGV4KTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gc3RhdGUudG9nZ2xlZEluZGV4ZXMuaGFzKGluZGV4KTtcbiAgICBjb25zdCBpc0FsbG93ZWREYXlPZldlZWsgPSBhbGxvd2VkRGF5c09mV2Vlay5oYXMoZGF5T2ZXZWVrKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGlzQWxsb3dlZERheU9mV2VlayAmJiAoKGlzSW5TZWxlY3RlZFJhbmdlICYmICFpc1NlbGVjdGVkKSB8fCAoaXNTZWxlY3RlZCAmJiAhaXNJblNlbGVjdGVkUmFuZ2UpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZT4ge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgc2NoZWR1bGVEYXlzLCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWssIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyLCBmaWx0ZXIgfSA9IHN0YXRlO1xuICBjb25zdCByYW5nZUFuZEV4Y2x1c2lvbiA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGFydDogcmFuZ2VTdGFydCwgZW5kOiByYW5nZUVuZCwgZXhjbHVkZWQ6IGFsbEV4Y2x1ZGVkLCBkYXRlQmxvY2tSYW5nZSB9ID0gcmFuZ2VBbmRFeGNsdXNpb247XG4gIGxldCBmaWx0ZXJPZmZzZXRFeGNsdWRlZFJhbmdlOiBEYXRlQmxvY2tJbmRleFtdID0gW107XG4gIGxldCBpbmRleE9mZnNldCA9IGRhdGVCbG9ja1JhbmdlLmk7XG5cbiAgbGV0IHN0YXJ0ID0gcmFuZ2VTdGFydDtcbiAgbGV0IGVuZCA9IHJhbmdlRW5kO1xuXG4gIC8vIElmIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyIGlzIHRydWUsIHRoZW4gd2UgbmVlZCB0byBvZmZzZXQgdGhlIHZhbHVlcyB0byBiZSByZWxhdGl2ZSB0byB0aGF0IHN0YXJ0LlxuICBpZiAoY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgJiYgZmlsdGVyPy5zdGFydCkge1xuICAgIHN0YXJ0ID0gZmlsdGVyLnN0YXJ0O1xuXG4gICAgaWYgKGZpbHRlcj8uZW5kKSB7XG4gICAgICBlbmQgPSBjb3B5SG91cnNBbmRNaW51dGVzRnJvbURhdGUoZW5kLCBmaWx0ZXIuZW5kKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0ID0gaW5kZXhGYWN0b3J5KHJhbmdlU3RhcnQpIC0gaW5kZXhGYWN0b3J5KHN0YXJ0KTtcbiAgICBmaWx0ZXJPZmZzZXRFeGNsdWRlZFJhbmdlID0gcmFuZ2UoMCwgZmlsdGVyU3RhcnRJbmRleE9mZnNldCk7XG4gICAgaW5kZXhPZmZzZXQgPSBpbmRleE9mZnNldCAtIGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQ7XG4gIH1cblxuICBjb25zdCBleGNsdWRlZCA9IGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyXG4gICAgPyBhbGxFeGNsdWRlZC5maWx0ZXIoKHgpID0+IHtcbiAgICAgICAgY29uc3QgaXNFeGNsdWRlZEluZGV4ID0gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKHgpKTsgLy8gPz8/XG4gICAgICAgIHJldHVybiBpc0V4Y2x1ZGVkSW5kZXg7XG4gICAgICB9KVxuICAgIDogYWxsRXhjbHVkZWQ7XG5cbiAgY29uc3Qgb2Zmc2V0RXhjbHVkZWQ6IERhdGVCbG9ja0luZGV4W10gPSBleGNsdWRlZC5tYXAoKHgpID0+IHggLSBpbmRleE9mZnNldCk7IC8vIHNldCB0byB0aGUgcHJvcGVyIG9mZnNldFxuXG4gIGNvbnN0IGV4ID0gWy4uLmZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2UsIC4uLm9mZnNldEV4Y2x1ZGVkXTtcblxuICBjb25zdCB3OiBEYXRlU2NoZWR1bGVFbmNvZGVkV2VlayA9IGRhdGVTY2hlZHVsZUVuY29kZWRXZWVrKHNjaGVkdWxlRGF5cyk7XG4gIGNvbnN0IGQ6IERhdGVCbG9ja0luZGV4W10gPSBbXTsgLy8gXCJpbmNsdWRlZFwiIGJsb2NrcyBhcmUgbmV2ZXIgdXNlZC9jYWxjdWxhdGVkLlxuXG4gIC8vIEFsd2F5cyBlbnN1cmUgdGhlIGVuZCBpcyBhZnRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQuXG4gIGlmIChpc0JlZm9yZShlbmQsIHN0YXJ0KSkge1xuICAgIGVuZCA9IHN0YXJ0OyAvLyBlbmQgaXMgc3RhcnRcbiAgfVxuXG4gIGNvbnN0IGRhdGVTY2hlZHVsZVJhbmdlOiBEYXRlU2NoZWR1bGVSYW5nZSA9IHtcbiAgICBzdGFydCxcbiAgICBlbmQsXG4gICAgdyxcbiAgICBkLFxuICAgIGV4XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRlU2NoZWR1bGVSYW5nZSxcbiAgICBtaW5NYXhSYW5nZTogeyBzdGFydCwgZW5kIH1cbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24gZXh0ZW5kcyBEYXRlUmFuZ2Uge1xuICBkYXRlQmxvY2tSYW5nZTogRGF0ZUJsb2NrUmFuZ2VXaXRoUmFuZ2U7XG4gIGV4Y2x1ZGVkOiBEYXRlQmxvY2tJbmRleFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24oc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbj4ge1xuICBjb25zdCB7IGlzRW5hYmxlZERheSwgaXNFbmFibGVkRmlsdGVyRGF5IH0gPSBzdGF0ZTtcbiAgY29uc3QgZGF0ZUZhY3RvcnkgPSBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeShzdGF0ZSk7XG4gIGNvbnN0IGRhdGVCbG9ja1JhbmdlID0gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQmxvY2tSYW5nZShzdGF0ZSk7XG5cbiAgaWYgKGRhdGVCbG9ja1JhbmdlID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gcmV0dXJucyBudWxsIGlmIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZC5cbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UuaSk7XG4gIGNvbnN0IGVuZCA9IGRhdGVGYWN0b3J5KGRhdGVCbG9ja1JhbmdlLnRvKTtcblxuICBjb25zdCBleGNsdWRlZDogRGF0ZUJsb2NrSW5kZXhbXSA9IHJhbmdlKGRhdGVCbG9ja1JhbmdlLmksIGRhdGVCbG9ja1JhbmdlLnRvICsgMSkuZmlsdGVyKCh4KSA9PiB7XG4gICAgY29uc3QgaXNFeGNsdWRlZEluZGV4ID0gIWlzRW5hYmxlZERheSh4KSB8fCAhaXNFbmFibGVkRmlsdGVyRGF5KHgpO1xuICAgIHJldHVybiBpc0V4Y2x1ZGVkSW5kZXg7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdDogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uID0ge1xuICAgIGRhdGVCbG9ja1JhbmdlLFxuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICBleGNsdWRlZFxuICB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlUmFuZ2U+IHtcbiAgY29uc3QgZGF0ZUZhY3RvcnkgPSBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeShzdGF0ZSk7XG4gIGNvbnN0IGRhdGVCbG9ja1JhbmdlID0gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQmxvY2tSYW5nZShzdGF0ZSk7XG4gIGNvbnN0IGRhdGVSYW5nZTogTWF5YmU8RGF0ZVJhbmdlPiA9IGRhdGVCbG9ja1JhbmdlICE9IG51bGwgPyB7IHN0YXJ0OiBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS5pKSwgZW5kOiBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS50byBhcyBudW1iZXIpIH0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBkYXRlUmFuZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlQmxvY2tSYW5nZVdpdGhSYW5nZT4ge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleERheU9mV2VlaywgaXNFbmFibGVkRGF5LCBpc0VuYWJsZWRGaWx0ZXJEYXkgfSA9IHN0YXRlO1xuICBjb25zdCBlbmFibGVkRXhjbHVzaW9uSW5kZXhlcyA9IEFycmF5LmZyb20oc3RhdGUudG9nZ2xlZEluZGV4ZXMpLmZpbHRlcigoaSkgPT4gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKGkpKSk7XG4gIGNvbnN0IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzID0gbWluQW5kTWF4TnVtYmVyKGVuYWJsZWRFeGNsdXNpb25JbmRleGVzKTtcblxuICBsZXQgc3RhcnRSYW5nZTogTWF5YmU8RGF0ZUJsb2NrSW5kZXg+O1xuICBsZXQgZW5kUmFuZ2U6IE1heWJlPERhdGVCbG9ja0luZGV4PjtcblxuICBpZiAobWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMpIHtcbiAgICBzdGFydFJhbmdlID0gbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMubWluO1xuICAgIGVuZFJhbmdlID0gbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMubWF4O1xuICB9XG5cbiAgaWYgKGlucHV0U3RhcnQgIT0gbnVsbCAmJiBpbnB1dEVuZCAhPSBudWxsKSB7XG4gICAgY29uc3QgaW5wdXRTdGFydEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0U3RhcnQpO1xuICAgIGNvbnN0IGlucHV0RW5kSW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRFbmQpO1xuXG4gICAgc3RhcnRSYW5nZSA9IHN0YXJ0UmFuZ2UgIT0gbnVsbCA/IE1hdGgubWluKGlucHV0U3RhcnRJbmRleCwgc3RhcnRSYW5nZSkgOiBpbnB1dFN0YXJ0SW5kZXg7XG4gICAgZW5kUmFuZ2UgPSBlbmRSYW5nZSAhPSBudWxsID8gTWF0aC5tYXgoaW5wdXRFbmRJbmRleCwgZW5kUmFuZ2UpIDogaW5wdXRFbmRJbmRleDtcbiAgfVxuXG4gIGlmIChzdGFydFJhbmdlICE9IG51bGwgJiYgZW5kUmFuZ2UgIT0gbnVsbCkge1xuICAgIGNvbnN0IHNjYW5TdGFydEluZGV4ID0gc3RhcnRSYW5nZTtcbiAgICBjb25zdCBzY2FuRW5kSW5kZXggPSBlbmRSYW5nZTtcblxuICAgIC8vIGNsZWFyIHN0YXJ0IGFuZCBlbmRcbiAgICBzdGFydFJhbmdlID0gdW5kZWZpbmVkO1xuICAgIGVuZFJhbmdlID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gaWYgdGhlIG1pbiBpcyBlcXVhbCB0byB0aGUgc3RhcnQgaW5kZXgsIHRoZW4gd2UgYXJlIGluIHRoZSByYW5nZSBhbmQgbmVlZCB0byBpdGVyYXRlIGRhdGVzIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgaXMgbm90IHNlbGVjdGVkL2V4Y2x1ZGVkLlxuICAgIGZvciAobGV0IGkgPSBzY2FuU3RhcnRJbmRleDsgaSA8PSBzY2FuRW5kSW5kZXg7IGkgKz0gMSkge1xuICAgICAgaWYgKGlzRW5hYmxlZEZpbHRlckRheShpKSAmJiBpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgc3RhcnRSYW5nZSA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNhbWUgd2l0aCB0aGUgbWF4XG4gICAgZm9yIChsZXQgaSA9IHNjYW5FbmRJbmRleDsgaSA+PSBzY2FuU3RhcnRJbmRleDsgaSAtPSAxKSB7XG4gICAgICBpZiAoaXNFbmFibGVkRmlsdGVyRGF5KGkpICYmIGlzRW5hYmxlZERheShpKSkge1xuICAgICAgICBlbmRSYW5nZSA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdGFydFJhbmdlICE9IG51bGwgJiYgZW5kUmFuZ2UgIT0gbnVsbCkge1xuICAgIHJldHVybiB7IGk6IHN0YXJ0UmFuZ2UsIHRvOiBlbmRSYW5nZSB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==