ng-virtual-list 16.12.4 → 16.12.9

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.
Files changed (42) hide show
  1. package/esm2022/lib/components/ng-list-item/const/index.mjs +2 -1
  2. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +1 -4
  3. package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +3 -1
  4. package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +5 -15
  5. package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +16 -2
  6. package/esm2022/lib/components/ng-scroll-view/const/index.mjs +2 -2
  7. package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +123 -33
  8. package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +15 -12
  9. package/esm2022/lib/core/interfaces/metrics.mjs +1 -1
  10. package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +1 -1
  11. package/esm2022/lib/core/track-box.mjs +16 -8
  12. package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +6 -6
  13. package/esm2022/lib/models/render-item-config.model.mjs +1 -1
  14. package/esm2022/lib/models/render-item-measures.model.mjs +1 -1
  15. package/esm2022/lib/ng-virtual-list.component.mjs +90 -86
  16. package/esm2022/lib/utils/animator/animator.mjs +12 -6
  17. package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +1 -1
  18. package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +1 -1
  19. package/esm2022/lib/utils/animator/types/easing.mjs +1 -1
  20. package/esm2022/lib/utils/event-emitter/event-emitter.mjs +2 -2
  21. package/esm2022/lib/utils/event-emitter/interfaces/event-emitter.mjs +1 -1
  22. package/fesm2022/ng-virtual-list.mjs +279 -162
  23. package/fesm2022/ng-virtual-list.mjs.map +1 -1
  24. package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +0 -3
  25. package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +1 -6
  26. package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +7 -1
  27. package/lib/components/ng-scroll-view/const/index.d.ts +1 -1
  28. package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +12 -1
  29. package/lib/components/ng-scroller/ng-scroller.component.d.ts +1 -3
  30. package/lib/core/interfaces/metrics.d.ts +2 -0
  31. package/lib/core/interfaces/recalculate-metrics-options.d.ts +1 -0
  32. package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +2 -2
  33. package/lib/models/render-item-config.model.d.ts +4 -0
  34. package/lib/models/render-item-measures.model.d.ts +4 -0
  35. package/lib/ng-virtual-list.component.d.ts +0 -1
  36. package/lib/utils/animator/animator.d.ts +1 -1
  37. package/lib/utils/animator/interfaces/animator-params.d.ts +1 -1
  38. package/lib/utils/animator/interfaces/animator-update-data.d.ts +1 -1
  39. package/lib/utils/animator/types/easing.d.ts +1 -1
  40. package/lib/utils/event-emitter/event-emitter.d.ts +1 -1
  41. package/lib/utils/event-emitter/interfaces/event-emitter.d.ts +1 -1
  42. package/package.json +1 -1
@@ -1,12 +1,12 @@
1
1
  import { Component, inject, Input, ViewChild, } from '@angular/core';
2
2
  import { CdkScrollable } from '@angular/cdk/scrolling';
3
- import { BehaviorSubject, debounceTime, delay, filter, fromEvent, map, of, race, Subject, switchMap, takeUntil, tap } from 'rxjs';
3
+ import { BehaviorSubject, combineLatest, debounceTime, delay, filter, fromEvent, map, of, race, Subject, switchMap, takeUntil, tap } from 'rxjs';
4
4
  import { ANIMATOR_MIN_TIMESTAMP, Animator, easeOutQuad } from '../../utils/animator';
5
5
  import { BEHAVIOR_INSTANT, DEFAULT_ANIMATION_PARAMS, DEFAULT_OVERSCROLL_ENABLED, DEFAULT_SCROLL_BEHAVIOR, DEFAULT_SCROLLING_ONE_BY_ONE, DEFAULT_SCROLLING_SETTINGS, DEFAULT_SNAP_TO_ITEM, DEFAULT_SNAP_TO_ITEM_ALIGN, DEFAULT_SNAPPING_DISTANCE, INTERACTIVE, MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, TOUCH_END, TOUCH_MOVE, TOUCH_START, WHEEL, } from '../../const';
6
- import { ACCELERATION_SCALE, ANIMATION_DURATION, AUTO, DURATION, FRICTION_FORCE, INSTANT, LEFT, MASS, MAX_DIST, MAX_DURATION, MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS, MAX_VELOCITY_TIMESTAMP, OVERSCROLL_START_ITERATION, SCROLL_EVENT, SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SMOOTH, SPEED_SCALE, TOP, } from './const';
6
+ import { ACCELERATION_SCALE, ANIMATION_DURATION, AUTO, DURATION, FRICTION_FORCE, INSTANT, LEFT, MASS, MAX_DIST, MAX_DURATION, MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS, MAX_VELOCITIES_LENGTH, MAX_VELOCITY_TIMESTAMP, MIN_ACCELERATION, MIN_DELTA, OVERSCROLL_START_ITERATION, SCROLL_EVENT, SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SMOOTH, SPEED_SCALE, TOP, } from './const';
7
7
  import { calculateDirection, matrix3d } from './utils';
8
8
  import { BaseScrollView } from './base/base-scroll-view.component';
9
- import { SnapToItemAligns } from '../../enums';
9
+ import { SnapToItemAligns, TextDirections } from '../../enums';
10
10
  import { NgVirtualListService } from '../../ng-virtual-list.service';
11
11
  import { parseFloatOrPersentageValue } from '../../utils/parse-float-or-persentage-value';
12
12
  import { isPercentageValue } from '../../utils/is-persentage-value';
@@ -110,10 +110,34 @@ export class NgScrollView extends BaseScrollView {
110
110
  get averageVelocity() { return this._$averageVelocity.getValue(); }
111
111
  _measureVelocityTimestamp = Date.now();
112
112
  _measureVelocityLastPosition = this._$isVertical.getValue() ? this._y : this._x;
113
- _startPosition = 0;
113
+ _startPositionX = 0;
114
+ _startPositionY = 0;
115
+ set startPosition(v) {
116
+ const isVertical = this._$isVertical.getValue(), c = isVertical ? this._startPositionY : this._startPositionX;
117
+ if (v !== c) {
118
+ if (isVertical) {
119
+ this._startPositionY = v;
120
+ }
121
+ else {
122
+ this._startPositionX = v;
123
+ }
124
+ }
125
+ }
126
+ get startPosition() {
127
+ if (this._$isVertical.getValue()) {
128
+ return this._startPositionY;
129
+ }
130
+ return this._startPositionX;
131
+ }
114
132
  _animator = new Animator();
133
+ _$horizontalAxisInvertion = new BehaviorSubject(false);
134
+ $horizontalAxisInvertion = this._$horizontalAxisInvertion.asObservable();
135
+ get horizontalAxisInvertion() { return this._$horizontalAxisInvertion.getValue(); }
136
+ get inverted() { return this._$horizontalAxisInvertion.getValue(); }
115
137
  _interactive = true;
116
138
  _overscrollIteration = 0;
139
+ _overscrollStartIteration = 0;
140
+ _overscrollApplied = false;
117
141
  set x(v) {
118
142
  this.setX(v);
119
143
  }
@@ -153,7 +177,7 @@ export class NgScrollView extends BaseScrollView {
153
177
  _delta = 0;
154
178
  set delta(v) {
155
179
  this._delta = v;
156
- this._startPosition += v;
180
+ this.startPosition += v;
157
181
  }
158
182
  set startLayoutOffset(v) {
159
183
  if (this._startLayoutOffset !== v) {
@@ -162,6 +186,8 @@ export class NgScrollView extends BaseScrollView {
162
186
  }
163
187
  }
164
188
  get startLayoutOffset() { return this._startLayoutOffset; }
189
+ _scrollDirectionValueX = 0;
190
+ _scrollDirectionValueY = 0;
165
191
  _intersectionComponentId = null;
166
192
  _isAlignmentAnimation = false;
167
193
  get animated() { return this._animator?.isAnimated ?? false; }
@@ -170,6 +196,9 @@ export class NgScrollView extends BaseScrollView {
170
196
  }
171
197
  ngAfterViewInit() {
172
198
  let mouseCanceled = false, touchCanceled = false;
199
+ combineLatest([this.$isVertical, this.$langTextDir]).pipe(takeUntil(this._$unsubscribe), tap(([isVertical, langTextDir]) => {
200
+ this._$horizontalAxisInvertion.next(!isVertical && langTextDir === TextDirections.RTL);
201
+ })).subscribe();
173
202
  const $viewportBounds = this.$viewportBounds;
174
203
  $viewportBounds.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(() => {
175
204
  this._isMoving = false;
@@ -185,18 +214,24 @@ export class NgScrollView extends BaseScrollView {
185
214
  this._$scrollEnd.next(false);
186
215
  })).subscribe();
187
216
  const $wheel = this.$wheel;
188
- $wheel.pipe(takeUntil(this._$unsubscribe), switchMap(v => of(this.averageVelocity)), debounceTime(100), tap(v => {
217
+ $wheel.pipe(takeUntil(this._$unsubscribe), tap(() => {
218
+ this._$grabbing.next(true);
219
+ }), switchMap(v => of(this.averageVelocity)), debounceTime(100), tap(v => {
220
+ this._$grabbing.next(false);
189
221
  this.snapWithInitialForceIfNecessary(v);
222
+ this._overscrollIteration = this._overscrollStartIteration = 0;
223
+ this._overscrollApplied = false;
190
224
  this._scrollDirection.clear();
225
+ this._scrollDirectionValueX = this._scrollDirectionValueY = 0;
191
226
  })).subscribe();
192
227
  const $viewport = of(this.scrollViewport).pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement)), $content = of(this.scrollContent).pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement)), $wheelEmitter = this._inversion ? $viewport : $content;
193
228
  $wheelEmitter.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
194
229
  return fromEvent(content, WHEEL, { passive: false }).pipe(filter(() => this._interactive), takeUntil(this._$unsubscribe), tap(e => {
195
230
  const isVertical = this._$isVertical.getValue();
196
231
  this.emitScrollableEvent();
197
- this.checkOverscroll(e);
232
+ this.checkOverscroll(e, true);
198
233
  this.stopScrolling(true);
199
- const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this._y : this._x, delta = isVertical ? e.deltaY : e.deltaX, dp = (startPos + delta), position = this.isInfinity ? dp : (dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp);
234
+ const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this._y : this._x, delta = isVertical ? e.deltaY : (e.deltaX * (this.horizontalAxisInvertion ? -1 : 1)), dp = (startPos + delta), position = this.isInfinity ? dp : (dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp);
200
235
  this.scroll({ [isVertical ? TOP : LEFT]: position, behavior: INSTANT, userAction: true, blending: false, fireUpdate: true });
201
236
  this._$wheel.next(delta);
202
237
  }));
@@ -237,7 +272,10 @@ export class NgScrollView extends BaseScrollView {
237
272
  $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
238
273
  return fromEvent(content, MOUSE_DOWN, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(v => this._interactive), switchMap(e => {
239
274
  mouseCanceled = false;
275
+ this._overscrollStartIteration = 0;
276
+ this._overscrollApplied = false;
240
277
  this._scrollDirection.clear();
278
+ this._scrollDirectionValueX = this._scrollDirectionValueY = 0;
241
279
  this.cancelOverscroll();
242
280
  this.onDragStart();
243
281
  this.stopScrolling(true);
@@ -249,23 +287,34 @@ export class NgScrollView extends BaseScrollView {
249
287
  const inversion = this._inversion, isVertical = this._$isVertical.getValue();
250
288
  this._isMoving = true;
251
289
  this._$grabbing.next(true);
252
- this._startPosition = (isVertical ? this.y : this.x);
253
- let prevClientPosition = isVertical ? e.clientY : e.clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
290
+ this._startPositionX = this.x;
291
+ this._startPositionY = this.y;
292
+ let prevClientPositionX = (e.clientX) * (this.horizontalAxisInvertion ? -1 : 1), prevClientPositionY = e.clientY, startClientPosX = prevClientPositionX, startClientPosY = prevClientPositionY, offsetsX = new Array(), offsetsY = new Array(), velocitiesX = new Array(), velocitiesY = new Array(), startTime = Date.now();
254
293
  return fromEvent(window, MOUSE_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($mouseDragCancel), tap(e => {
255
294
  this.checkOverscroll(e);
256
295
  }), switchMap(e => {
257
- const { position, currentPos, endTime, scrollDelta } = this.calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities);
258
- prevClientPosition = currentPos;
296
+ const { position: positionX, currentPos: currentPosX, endTime, scrollDelta: scrollDeltaX } = this.calculatePosition(false, true, this.horizontalAxisInvertion, e, inversion, startClientPosX, startTime, prevClientPositionX, offsetsX, velocitiesX), { position: positionY, currentPos: currentPosY, scrollDelta: scrollDeltaY } = this.calculatePosition(true, true, false, e, inversion, startClientPosY, startTime, prevClientPositionY, offsetsY, velocitiesY), position = isVertical ? positionY : positionX;
297
+ prevClientPositionX = currentPosX;
298
+ prevClientPositionY = currentPosY;
299
+ this._scrollDirectionValueX += Math.abs(scrollDeltaX);
300
+ this._scrollDirectionValueY += Math.abs(scrollDeltaY);
259
301
  this.move(isVertical, position, true, true, true);
260
- const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
261
- if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
262
- startClientPos -= offset;
302
+ if (this.isInfinity) {
303
+ const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
304
+ if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
305
+ if (isVertical) {
306
+ startClientPosY -= offset;
307
+ }
308
+ else {
309
+ startClientPosX -= offset;
310
+ }
311
+ }
263
312
  }
264
313
  startTime = endTime;
265
314
  return race([fromEvent(window, MOUSE_UP, { passive: false }), fromEvent(content, MOUSE_UP, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil($mouseDragCancel), tap(e => {
266
315
  mouseCanceled = true;
267
316
  this.cancelOverscroll();
268
- const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp), { a0 } = this.calculateAcceleration(velocities, v0, timestamp);
317
+ const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(isVertical ? offsetsY : offsetsX, isVertical ? scrollDeltaY : scrollDeltaX, timestamp), { a0 } = this.calculateAcceleration(isVertical ? velocitiesY : velocitiesX, v0, timestamp);
269
318
  this._isMoving = false;
270
319
  this._$grabbing.next(false);
271
320
  if (!this.snapIfNecessary(v0, false) && this.scrollBehavior !== BEHAVIOR_INSTANT) {
@@ -315,7 +364,10 @@ export class NgScrollView extends BaseScrollView {
315
364
  $content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
316
365
  return fromEvent(content, TOUCH_START, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(() => this._interactive), switchMap(e => {
317
366
  touchCanceled = false;
367
+ this._overscrollStartIteration = 0;
368
+ this._overscrollApplied = false;
318
369
  this._scrollDirection.clear();
370
+ this._scrollDirectionValueX = this._scrollDirectionValueY = 0;
319
371
  this.cancelOverscroll();
320
372
  this.onDragStart();
321
373
  this.stopScrolling(true);
@@ -327,23 +379,34 @@ export class NgScrollView extends BaseScrollView {
327
379
  const inversion = this._inversion, isVertical = this._$isVertical.getValue();
328
380
  this._isMoving = true;
329
381
  this._$grabbing.next(true);
330
- this._startPosition = (isVertical ? this.y : this.x);
331
- let prevClientPosition = isVertical ? e.touches[e.touches.length - 1].clientY : e.touches[e.touches.length - 1].clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
382
+ this._startPositionX = this.x;
383
+ this._startPositionY = this.y;
384
+ let prevClientPositionX = (e.touches[e.touches.length - 1].clientX) * (this.horizontalAxisInvertion ? -1 : 1), prevClientPositionY = e.touches[e.touches.length - 1].clientY, startClientPosX = prevClientPositionX, startClientPosY = prevClientPositionY, offsetsX = new Array(), offsetsY = new Array(), velocitiesX = new Array(), velocitiesY = new Array(), startTime = Date.now();
332
385
  return fromEvent(window, TOUCH_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($touchCanceler), tap(e => {
333
386
  this.checkOverscroll(e);
334
387
  }), switchMap(e => {
335
- const { position, currentPos, endTime, scrollDelta } = this.calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities);
336
- prevClientPosition = currentPos;
388
+ const { position: positionX, currentPos: currentPosX, endTime, scrollDelta: scrollDeltaX } = this.calculatePosition(false, true, this.horizontalAxisInvertion, e, inversion, startClientPosX, startTime, prevClientPositionX, offsetsX, velocitiesX), { position: positionY, currentPos: currentPosY, scrollDelta: scrollDeltaY } = this.calculatePosition(true, true, false, e, inversion, startClientPosY, startTime, prevClientPositionY, offsetsY, velocitiesY), position = isVertical ? positionY : positionX;
389
+ prevClientPositionX = currentPosX;
390
+ prevClientPositionY = currentPosY;
391
+ this._scrollDirectionValueX += Math.abs(scrollDeltaX);
392
+ this._scrollDirectionValueY += Math.abs(scrollDeltaY);
337
393
  this.move(isVertical, position, true, true, true);
338
- const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
339
- if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
340
- startClientPos -= offset;
394
+ if (this.isInfinity) {
395
+ const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
396
+ if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
397
+ if (isVertical) {
398
+ startClientPosY -= offset;
399
+ }
400
+ else {
401
+ startClientPosX -= offset;
402
+ }
403
+ }
341
404
  }
342
405
  startTime = endTime;
343
406
  return race([fromEvent(window, TOUCH_END, { passive: false }), fromEvent(content, TOUCH_END, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil($touchCanceler), tap(e => {
344
407
  touchCanceled = true;
345
408
  this.cancelOverscroll();
346
- const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp), { a0 } = this.calculateAcceleration(velocities, v0, timestamp);
409
+ const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(isVertical ? offsetsY : offsetsX, isVertical ? scrollDeltaY : scrollDeltaX, timestamp), { a0 } = this.calculateAcceleration(isVertical ? velocitiesY : velocitiesX, v0, timestamp);
347
410
  this._isMoving = false;
348
411
  this._$grabbing.next(false);
349
412
  if (!this.snapIfNecessary(v0, false) && this.scrollBehavior !== BEHAVIOR_INSTANT) {
@@ -425,8 +488,11 @@ export class NgScrollView extends BaseScrollView {
425
488
  }
426
489
  return false;
427
490
  }
428
- calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities) {
429
- const currentPos = isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX, scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = this._startPosition + delta, position = this.isInfinity ? dp : dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp, endTime = Date.now(), timestamp = endTime - startTime, scrollDelta = prevClientPosition === 0 ? 0 : prevClientPosition - currentPos, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp);
491
+ calculatePosition(isVertical, enabled, axisInversion, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities) {
492
+ if (!enabled) {
493
+ return { position: isVertical ? this._y : this._x, currentPos: null, endTime: Date.now(), scrollDelta: 0 };
494
+ }
495
+ const currentPos = (isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX) * (axisInversion ? -1 : 1), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = (isVertical ? this._startPositionY : this._startPositionX) + delta, position = this.isInfinity ? dp : dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp, endTime = Date.now(), timestamp = endTime - startTime, scrollDelta = (prevClientPosition === 0 || prevClientPosition === null) ? 0 : prevClientPosition - currentPos, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp);
430
496
  this.calculateAcceleration(velocities, v0, timestamp);
431
497
  return { position, currentPos, endTime, scrollDelta };
432
498
  }
@@ -455,7 +521,7 @@ export class NgScrollView extends BaseScrollView {
455
521
  }
456
522
  }
457
523
  }
458
- checkOverscroll(e) {
524
+ checkOverscroll(e, wheel = false) {
459
525
  if (!this._overscrollEnabled || !this.overscrollEnabled) {
460
526
  if (e.cancelable) {
461
527
  e.stopImmediatePropagation();
@@ -465,14 +531,35 @@ export class NgScrollView extends BaseScrollView {
465
531
  }
466
532
  if (this._overscrollEnabled) {
467
533
  if (this._$isVertical.getValue()) {
468
- this.checkOverscrollByAxis(e, this._y, this.scrollHeight);
534
+ if (this._overscrollStartIteration < OVERSCROLL_START_ITERATION) {
535
+ this._overscrollStartIteration++;
536
+ this.checkOverscrollByAxis(e, this._y, this.scrollHeight);
537
+ }
538
+ else {
539
+ if (wheel || this._overscrollApplied || this._scrollDirectionValueY > this._scrollDirectionValueX) {
540
+ this._overscrollApplied = true;
541
+ this.checkOverscrollByAxis(e, this._y, this.scrollHeight);
542
+ }
543
+ }
469
544
  }
470
545
  else {
471
- this.checkOverscrollByAxis(e, this._x, this.scrollWidth);
546
+ if (this._overscrollStartIteration < OVERSCROLL_START_ITERATION) {
547
+ this._overscrollStartIteration++;
548
+ this.checkOverscrollByAxis(e, this._x, this.scrollWidth);
549
+ }
550
+ else {
551
+ if (wheel || this._overscrollApplied || this._scrollDirectionValueX > this._scrollDirectionValueY) {
552
+ this._overscrollApplied = true;
553
+ this.checkOverscrollByAxis(e, this._x, this.scrollWidth);
554
+ }
555
+ }
472
556
  }
473
557
  }
474
558
  }
475
559
  calculateVelocity(offsets, delta, timestamp, indexOffset = 10) {
560
+ if (offsets.length > MAX_VELOCITIES_LENGTH) {
561
+ offsets.shift();
562
+ }
476
563
  offsets.push([delta, timestamp < ANIMATOR_MIN_TIMESTAMP ? ANIMATOR_MIN_TIMESTAMP : timestamp]);
477
564
  const len = offsets.length, startIndex = len > indexOffset ? len - indexOffset : 0, lastVSign = calculateDirection(offsets), speedScale = this.scrollingSettings?.speedScale ?? SPEED_SCALE;
478
565
  let vSum = 0;
@@ -488,7 +575,10 @@ export class NgScrollView extends BaseScrollView {
488
575
  return { v0 };
489
576
  }
490
577
  calculateAcceleration(velocities, delta, timestamp, indexOffset = 10) {
491
- velocities.push([delta, timestamp < ANIMATOR_MIN_TIMESTAMP ? ANIMATOR_MIN_TIMESTAMP : timestamp]);
578
+ if (velocities.length > MAX_VELOCITIES_LENGTH) {
579
+ velocities.shift();
580
+ }
581
+ velocities.push([Math.abs(delta) < MIN_DELTA ? 0 : delta, timestamp < ANIMATOR_MIN_TIMESTAMP ? ANIMATOR_MIN_TIMESTAMP : timestamp]);
492
582
  const len = velocities.length, startIndex = len > indexOffset ? len - indexOffset : 0;
493
583
  let aSum = 0, prevV0, iteration = 0, lastVSign = calculateDirection(velocities);
494
584
  const mass = this.scrollingSettings?.mass ?? MASS;
@@ -506,7 +596,7 @@ export class NgScrollView extends BaseScrollView {
506
596
  iteration++;
507
597
  }
508
598
  const a0 = aSum * (this.scrollingSettings?.frictionalForce ?? FRICTION_FORCE);
509
- return { a0 };
599
+ return { a0: Math.abs(a0) < MIN_ACCELERATION ? 0 : a0 };
510
600
  }
511
601
  stopScrolling(force = false) {
512
602
  if (this._isAlignmentAnimation && !force) {
@@ -812,7 +902,7 @@ export class NgScrollView extends BaseScrollView {
812
902
  }
813
903
  refreshCoordinate(x, y) {
814
904
  const scrollContent = this.scrollContent?.nativeElement;
815
- scrollContent.style.transform = matrix3d((this._inversion ? 1 : -1) * x + (this._$isVertical.getValue() ? 0 : this._startLayoutOffset), (this._inversion ? 1 : -1) * y + (this._$isVertical.getValue() ? this._startLayoutOffset : 0));
905
+ scrollContent.style.transform = matrix3d((this._inversion ? 1 : -1) * x * (this.horizontalAxisInvertion ? -1 : 1) + (this._$isVertical.getValue() ? 0 : this._startLayoutOffset), (this._inversion ? 1 : -1) * y + (this._$isVertical.getValue() ? this._startLayoutOffset : 0));
816
906
  }
817
907
  fireScrollEvent(userAction) {
818
908
  this._$scroll.next(userAction);
@@ -860,4 +950,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
860
950
  }], animationParams: [{
861
951
  type: Input
862
952
  }] } });
863
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FDdEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsSSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFVLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFDSCxnQkFBZ0IsRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSw0QkFBNEIsRUFDN0gsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFDaEksVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQ2xFLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFDSCxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLHVDQUF1QyxFQUM1SixzQkFBc0Is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QWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQVFoRCxjQUFjO3NCQURqQixLQUFLO2dCQVdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFXRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBV0YsVUFBVTtzQkFEYixLQUFLO2dCQVdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFXRixlQUFlO3NCQURsQixLQUFLO2dCQVdGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFXRixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGVib3VuY2VUaW1lLCBkZWxheSwgZmlsdGVyLCBmcm9tRXZlbnQsIG1hcCwgb2YsIHJhY2UsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCwgQW5pbWF0b3IsIEVhc2luZywgZWFzZU91dFF1YWQgfSBmcm9tICcuLi8uLi91dGlscy9hbmltYXRvcic7XHJcbmltcG9ydCB7XHJcbiAgICBCRUhBVklPUl9JTlNUQU5ULCBERUZBVUxUX0FOSU1BVElPTl9QQVJBTVMsIERFRkFVTFRfT1ZFUlNDUk9MTF9FTkFCTEVELCBERUZBVUxUX1NDUk9MTF9CRUhBVklPUiwgREVGQVVMVF9TQ1JPTExJTkdfT05FX0JZX09ORSxcclxuICAgIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTLCBERUZBVUxUX1NOQVBfVE9fSVRFTSwgREVGQVVMVF9TTkFQX1RPX0lURU1fQUxJR04sIERFRkFVTFRfU05BUFBJTkdfRElTVEFOQ0UsIElOVEVSQUNUSVZFLCBNT1VTRV9ET1dOLFxyXG4gICAgTU9VU0VfTU9WRSwgTU9VU0VfVVAsIFRPVUNIX0VORCwgVE9VQ0hfTU9WRSwgVE9VQ0hfU1RBUlQsIFdIRUVMLFxyXG59IGZyb20gJy4uLy4uL2NvbnN0JztcclxuaW1wb3J0IHsgSVNjcm9sbFRvUGFyYW1zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHtcclxuICAgIEFDQ0VMRVJBVElPTl9TQ0FMRSwgQU5JTUFUSU9OX0RVUkFUSU9OLCBBVVRPLCBEVVJBVElPTiwgRlJJQ1RJT05fRk9SQ0UsIElOU1RBTlQsIExFRlQsIE1BU1MsIE1BWF9ESVNULCBNQVhfRFVSQVRJT04sIE1BWF9JVEVSQVRJT05TX0ZPUl9BVkVSQUdFX0NBTENVTEFUSU9OUyxcclxuICAgIE1BWF9WRUxPQ0lUWV9USU1FU1RBTVAsIE9WRVJTQ1JPTExfU1RBUlRfSVRFUkFUSU9OLCBTQ1JPTExfRVZFTlQsIFNDUk9MTF9WSUVXX05PUk1BTElaRV9WQUxVRV9GUk9NX1pFUk8sIFNNT09USCwgU1BFRURfU0NBTEUsIFRPUCxcclxufSBmcm9tICcuL2NvbnN0JztcclxuaW1wb3J0IHsgY2FsY3VsYXRlRGlyZWN0aW9uLCBtYXRyaXgzZCB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBCYXNlU2Nyb2xsVmlldyB9IGZyb20gJy4vYmFzZS9iYXNlLXNjcm9sbC12aWV3LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElBbmltYXRpb25QYXJhbXMsIElTY3JvbGxpbmdTZXR0aW5ncyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBTbmFwVG9JdGVtQWxpZ25zIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBOZ1ZpcnR1YWxMaXN0U2VydmljZSB9IGZyb20gJy4uLy4uL25nLXZpcnR1YWwtbGlzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSWQsIFNuYXBwaW5nRGlzdGFuY2UsIFNuYXBUb0l0ZW1BbGlnbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcclxuaW1wb3J0IHsgcGFyc2VGbG9hdE9yUGVyc2VudGFnZVZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGFyc2UtZmxvYXQtb3ItcGVyc2VudGFnZS12YWx1ZSc7XHJcbmltcG9ydCB7IGlzUGVyY2VudGFnZVZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaXMtcGVyc2VudGFnZS12YWx1ZSc7XHJcbmltcG9ydCB7IFNjcm9sbGluZ0RpcmVjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3Njcm9sbGluZy1kaXJlY3Rpb24nO1xyXG5pbXBvcnQgeyBjYWxjdWxhdGVWZWxvY2l0eSB9IGZyb20gJy4vdXRpbHMvY2FsY3VsYXRlLXZlbG9jaXR5JztcclxuXHJcbi8qKlxyXG4gKiBOZ1Njcm9sbFZpZXdcclxuICogTWF4aW11bSBwZXJmb3JtYW5jZSBmb3IgZXh0cmVtZWx5IGxhcmdlIGxpc3RzLlxyXG4gKiBJdCBpcyBiYXNlZCBvbiBhbGdvcml0aG1zIGZvciB2aXJ0dWFsaXphdGlvbiBvZiBzY3JlZW4gb2JqZWN0cy5cclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTYueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb21wb25lbnRzL25nLXNjcm9sbC12aWV3L25nLXNjcm9sbC12aWV3LmNvbXBvbmVudC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgQWxleGFuZHJvdmljaCBHcmViZW5uaWtvdlxyXG4gKiBAZW1haWwgZGpvbm55eEBnbWFpbC5jb21cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICduZy1zY3JvbGwtdmlldycsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbFZpZXcgZXh0ZW5kcyBCYXNlU2Nyb2xsVmlldyB7XHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxWaWV3cG9ydCcsIHsgcmVhZDogQ2RrU2Nyb2xsYWJsZSB9KVxyXG4gICAgcmVhZG9ubHkgY2RrU2Nyb2xsYWJsZTogQ2RrU2Nyb2xsYWJsZSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NlcnZpY2UgPSBpbmplY3QoTmdWaXJ0dWFsTGlzdFNlcnZpY2UpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbEJlaGF2aW9yID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY3JvbGxCZWhhdmlvcj4oREVGQVVMVF9TQ1JPTExfQkVIQVZJT1IpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbEJlaGF2aW9yID0gdGhpcy5fJHNjcm9sbEJlaGF2aW9yLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzY3JvbGxCZWhhdmlvcih2OiBTY3JvbGxCZWhhdmlvcikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc2Nyb2xsQmVoYXZpb3IuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc2Nyb2xsQmVoYXZpb3IubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc2Nyb2xsQmVoYXZpb3IoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsQmVoYXZpb3IuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJG92ZXJzY3JvbGxFbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX09WRVJTQ1JPTExfRU5BQkxFRCk7XHJcbiAgICByZWFkb25seSAkb3ZlcnNjcm9sbEVuYWJsZWQgPSB0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IG92ZXJzY3JvbGxFbmFibGVkKHY6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fJG92ZXJzY3JvbGxFbmFibGVkLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJG92ZXJzY3JvbGxFbmFibGVkLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IG92ZXJzY3JvbGxFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fJG92ZXJzY3JvbGxFbmFibGVkLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGxpbmdTZXR0aW5ncyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVNjcm9sbGluZ1NldHRpbmdzPihERUZBVUxUX1NDUk9MTElOR19TRVRUSU5HUyk7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsaW5nU2V0dGluZ3MgPSB0aGlzLl8kc2Nyb2xsaW5nU2V0dGluZ3MuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNjcm9sbGluZ1NldHRpbmdzKHY6IElTY3JvbGxpbmdTZXR0aW5ncykge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc2Nyb2xsaW5nU2V0dGluZ3MuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc2Nyb2xsaW5nU2V0dGluZ3MubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc2Nyb2xsaW5nU2V0dGluZ3MoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsaW5nU2V0dGluZ3MuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNuYXBUb0l0ZW0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU05BUF9UT19JVEVNKTtcclxuICAgIHJlYWRvbmx5ICRzbmFwVG9JdGVtID0gdGhpcy5fJHNuYXBUb0l0ZW0uYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNuYXBUb0l0ZW0odjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc25hcFRvSXRlbS5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzbmFwVG9JdGVtLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNuYXBUb0l0ZW0oKSB7IHJldHVybiB0aGlzLl8kc25hcFRvSXRlbS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsaW5nT25lQnlPbmUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU0NST0xMSU5HX09ORV9CWV9PTkUpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbGluZ09uZUJ5T25lID0gdGhpcy5fJHNjcm9sbGluZ09uZUJ5T25lLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzY3JvbGxpbmdPbmVCeU9uZSh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzY3JvbGxpbmdPbmVCeU9uZS5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxpbmdPbmVCeU9uZS5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxpbmdPbmVCeU9uZSgpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxpbmdPbmVCeU9uZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc25hcFRvSXRlbUFsaWduID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTbmFwVG9JdGVtQWxpZ24+KERFRkFVTFRfU05BUF9UT19JVEVNX0FMSUdOKTtcclxuICAgIHJlYWRvbmx5ICRzbmFwVG9JdGVtQWxpZ24gPSB0aGlzLl8kc25hcFRvSXRlbUFsaWduLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzbmFwVG9JdGVtQWxpZ24odjogU25hcFRvSXRlbUFsaWduKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzbmFwVG9JdGVtQWxpZ24uZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc25hcFRvSXRlbUFsaWduLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNuYXBUb0l0ZW1BbGlnbigpIHsgcmV0dXJuIHRoaXMuXyRzbmFwVG9JdGVtQWxpZ24uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNuYXBwaW5nRGlzdGFuY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNuYXBwaW5nRGlzdGFuY2U+KERFRkFVTFRfU05BUFBJTkdfRElTVEFOQ0UpO1xyXG4gICAgcmVhZG9ubHkgJHNuYXBwaW5nRGlzdGFuY2UgPSB0aGlzLl8kc25hcHBpbmdEaXN0YW5jZS5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc25hcHBpbmdEaXN0YW5jZSh2OiBTbmFwcGluZ0Rpc3RhbmNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzbmFwcGluZ0Rpc3RhbmNlLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc25hcHBpbmdEaXN0YW5jZSgpIHsgcmV0dXJuIHRoaXMuXyRzbmFwcGluZ0Rpc3RhbmNlLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRhbmltYXRpb25QYXJhbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElBbmltYXRpb25QYXJhbXM+KERFRkFVTFRfQU5JTUFUSU9OX1BBUkFNUyk7XHJcbiAgICByZWFkb25seSAkYW5pbWF0aW9uUGFyYW1zID0gdGhpcy5fJGFuaW1hdGlvblBhcmFtcy5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgYW5pbWF0aW9uUGFyYW1zKHY6IElBbmltYXRpb25QYXJhbXMpIHtcclxuICAgICAgICBpZiAodGhpcy5fJGFuaW1hdGlvblBhcmFtcy5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRhbmltYXRpb25QYXJhbXMubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgYW5pbWF0aW9uUGFyYW1zKCkgeyByZXR1cm4gdGhpcy5fJGFuaW1hdGlvblBhcmFtcy5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9ub3JtYWxpemVWYWx1ZUZyb21aZXJvID0gaW5qZWN0KFNDUk9MTF9WSUVXX05PUk1BTElaRV9WQUxVRV9GUk9NX1pFUk8pO1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXNTY3JvbGxzVG86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Njcm9sbERpcmVjdGlvbiA9IG5ldyBTY3JvbGxpbmdEaXJlY3Rpb24oKTtcclxuICAgIGdldCBzY3JvbGxEaXJlY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbERpcmVjdGlvbi5nZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgJHNjcm9sbERpcmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuX3Njcm9sbERpcmVjdGlvbi4kZGlyZWN0aW9uOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kd2hlZWwgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XHJcbiAgICByZWFkb25seSAkd2hlZWwgPSB0aGlzLl8kd2hlZWwuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGwgPSB0aGlzLl8kc2Nyb2xsLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbEVuZCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsRW5kID0gdGhpcy5fJHNjcm9sbEVuZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ZlbG9jaXRpZXM6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgXyR2ZWxvY2l0eSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICAgIHByb3RlY3RlZCAkdmVsb2NpdHkgPSB0aGlzLl8kdmVsb2NpdHkuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBnZXQgdmVsb2NpdHkoKSB7IHJldHVybiB0aGlzLl8kdmVsb2NpdHkuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJGF2ZXJhZ2VWZWxvY2l0eSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICAgIHByb3RlY3RlZCAkYXZlcmFnZVZlbG9jaXR5ID0gdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5hc09ic2VydmFibGUoKTtcclxuICAgIGdldCBhdmVyYWdlVmVsb2NpdHkoKSB7IHJldHVybiB0aGlzLl8kYXZlcmFnZVZlbG9jaXR5LmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcml2YXRlIF9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXA6IG51bWJlciA9IERhdGUubm93KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfbWVhc3VyZVZlbG9jaXR5TGFzdFBvc2l0aW9uOiBudW1iZXIgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpID8gdGhpcy5feSA6IHRoaXMuX3g7XHJcblxyXG4gICAgcHJpdmF0ZSBfc3RhcnRQb3NpdGlvbiA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9hbmltYXRvciA9IG5ldyBBbmltYXRvcigpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfaW50ZXJhY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX292ZXJzY3JvbGxJdGVyYXRpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgb3ZlcnJpZGUgc2V0IHgodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5zZXRYKHYpO1xyXG4gICAgfVxyXG4gICAgb3ZlcnJpZGUgZ2V0IHgoKSB7IHJldHVybiB0aGlzLl94OyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldFgoeDogbnVtYmVyLCBzbmFwOiBib29sZWFuID0gdHJ1ZSwgbm9ybWFsaXplOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICh4ICE9PSB1bmRlZmluZWQgJiYgIU51bWJlci5pc05hTih4KSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpcmVjdGlvbih4LCB0aGlzLl95KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ggPSB0aGlzLl9hY3R1YWxZID0geDtcclxuXHJcbiAgICAgICAgICAgIGlmIChub3JtYWxpemUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplU2Nyb2xsU2l6ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlVmVsb2NpdHkoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzbmFwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSW50ZXJzZWN0aW9uQ29tcG9uZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgc2V0IHkodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5zZXRZKHYpO1xyXG4gICAgfVxyXG4gICAgb3ZlcnJpZGUgZ2V0IHkoKSB7IHJldHVybiB0aGlzLl95OyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldFkoeTogbnVtYmVyLCBzbmFwOiBib29sZWFuID0gdHJ1ZSwgbm9ybWFsaXplOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICh5ICE9PSB1bmRlZmluZWQgJiYgIU51bWJlci5pc05hTih5KSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpcmVjdGlvbih5LCB0aGlzLl95KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3kgPSB0aGlzLl9hY3R1YWxZID0geTtcclxuXHJcbiAgICAgICAgICAgIGlmIChub3JtYWxpemUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplU2Nyb2xsU2l6ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlVmVsb2NpdHkoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzbmFwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSW50ZXJzZWN0aW9uQ29tcG9uZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kZWx0YTogbnVtYmVyID0gMDtcclxuICAgIHNldCBkZWx0YSh2OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kZWx0YSA9IHY7XHJcbiAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiArPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHNldCBzdGFydExheW91dE9mZnNldCh2OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQgPSB2O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBvdmVycmlkZSBnZXQgc3RhcnRMYXlvdXRPZmZzZXQoKSB7IHJldHVybiB0aGlzLl9zdGFydExheW91dE9mZnNldDsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW50ZXJzZWN0aW9uQ29tcG9uZW50SWQ6IElkIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGdldCBhbmltYXRlZCgpIHsgcmV0dXJuIHRoaXMuX2FuaW1hdG9yPy5pc0FuaW1hdGVkID8/IGZhbHNlOyB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IG1vdXNlQ2FuY2VsZWQgPSBmYWxzZSxcclxuICAgICAgICAgICAgdG91Y2hDYW5jZWxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCAkdmlld3BvcnRCb3VuZHMgPSB0aGlzLiR2aWV3cG9ydEJvdW5kcztcclxuICAgICAgICAkdmlld3BvcnRCb3VuZHMucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1vdXNlQ2FuY2VsZWQgfHwgIXRvdWNoQ2FuY2VsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNuYXBUb0l0ZW0gfHwgdGhpcy5zY3JvbGxpbmdPbmVCeU9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsaWduUG9zaXRpb24odHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkd2hlZWwgPSB0aGlzLiR3aGVlbDtcclxuICAgICAgICAkd2hlZWwucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCh2ID0+IG9mKHRoaXMuYXZlcmFnZVZlbG9jaXR5KSksXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxyXG4gICAgICAgICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNuYXBXaXRoSW5pdGlhbEZvcmNlSWZOZWNlc3Nhcnkodik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJHZpZXdwb3J0ID0gb2YodGhpcy5zY3JvbGxWaWV3cG9ydCkucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgICAgICAgIG1hcCh2ID0+IHYhLm5hdGl2ZUVsZW1lbnQpLFxyXG4gICAgICAgICksICRjb250ZW50ID0gb2YodGhpcy5zY3JvbGxDb250ZW50KS5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgICAgICAgbWFwKHYgPT4gdiEubmF0aXZlRWxlbWVudCksXHJcbiAgICAgICAgKSwgJHdoZWVsRW1pdHRlciA9IHRoaXMuX2ludmVyc2lvbiA/ICR2aWV3cG9ydCA6ICRjb250ZW50O1xyXG5cclxuICAgICAgICAkd2hlZWxFbWl0dGVyLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PFdoZWVsRXZlbnQ+KGNvbnRlbnQsIFdIRUVMLCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2ludGVyYWN0aXZlKSxcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTY3JvbGxhYmxlRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLl95IDogdGhpcy5feCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gaXNWZXJ0aWNhbCA/IGUuZGVsdGFZIDogZS5kZWx0YVgsIGRwID0gKHN0YXJ0UG9zICsgZGVsdGEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmlzSW5maW5pdHkgPyBkcCA6IChkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGwoeyBbaXNWZXJ0aWNhbCA/IFRPUCA6IExFRlRdOiBwb3NpdGlvbiwgYmVoYXZpb3I6IElOU1RBTlQsIHVzZXJBY3Rpb246IHRydWUsIGJsZW5kaW5nOiBmYWxzZSwgZmlyZVVwZGF0ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHdoZWVsLm5leHQoZGVsdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJG1vdXNlVXAgPSByYWNlKFtcclxuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogdHJ1ZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb250ZW50LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiB0cnVlIH0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgIF0pLFxyXG4gICAgICAgICAgICAkbW91c2VEcmFnQ2FuY2VsID0gJG1vdXNlVXAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgZGVsYXkoMCksXHJcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbW91c2VDYW5jZWxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VDYW5jZWxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc25hcFRvSXRlbSAmJiB0aGlzLnNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxpZ25Qb3NpdGlvbih0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX0RPV04sIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxNb3VzZUV2ZW50Pih3aW5kb3csIE1PVVNFX1VQLCB7IHBhc3NpdmU6IGZhbHNlIH0pLCBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSldKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfTU9WRSwgeyBwYXNzaXZlOiBmYWxzZSB9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3VzZUNhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZUNhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwVG9JdGVtIHx8IHRoaXMuc2Nyb2xsaW5nT25lQnlPbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX0RPV04sIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZUNhbmNlbGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoSU5URVJBQ1RJVkUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNpb24gPSB0aGlzLl9pbnZlcnNpb24sIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID0gKGlzVmVydGljYWwgPyB0aGlzLnkgOiB0aGlzLngpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldkNsaWVudFBvc2l0aW9uID0gaXNWZXJ0aWNhbCA/IGUuY2xpZW50WSA6IGUuY2xpZW50WCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50UG9zID0gcHJldkNsaWVudFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdGllcyA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxNb3VzZUV2ZW50Pih3aW5kb3csIE1PVVNFX01PVkUsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKCRtb3VzZURyYWdDYW5jZWwpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyc2Nyb2xsKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwb3NpdGlvbiwgY3VycmVudFBvcywgZW5kVGltZSwgc2Nyb2xsRGVsdGEgfSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oaXNWZXJ0aWNhbCwgZSwgaW52ZXJzaW9uLCBzdGFydENsaWVudFBvcywgc3RhcnRUaW1lLCBwcmV2Q2xpZW50UG9zaXRpb24sIG9mZnNldHMsIHZlbG9jaXRpZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDbGllbnRQb3NpdGlvbiA9IGN1cnJlbnRQb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHBvc2l0aW9uLCB0cnVlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBNYXRoLmFicyhwb3NpdGlvbikgLSBNYXRoLmFicyhpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3gpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLmhlaWdodCA6IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSAoc2Nyb2xsU2l6ZSAtIHZpZXdwb3J0U2l6ZSAqIC41KSB8fCBwb3NpdGlvbiA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50UG9zIC09IG9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFjZShbZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb250ZW50LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJG1vdXNlRHJhZ0NhbmNlbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxPdmVyc2Nyb2xsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBlbmRUaW1lIC0gc3RhcnRUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdjAgfSA9IHRoaXMuY2FsY3VsYXRlVmVsb2NpdHkob2Zmc2V0cywgc2Nyb2xsRGVsdGEsIHRpbWVzdGFtcCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhMCB9ID0gdGhpcy5jYWxjdWxhdGVBY2NlbGVyYXRpb24odmVsb2NpdGllcywgdjAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNuYXBJZk5lY2Vzc2FyeSh2MCwgZmFsc2UpICYmIHRoaXMuc2Nyb2xsQmVoYXZpb3IgIT09IEJFSEFWSU9SX0lOU1RBTlQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVXaXRoQWNjZWxlcmF0aW9uKGlzVmVydGljYWwsIHBvc2l0aW9uLCAwLCB2MCwgYTAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25hcElmTmVjZXNzYXJ5KHYwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJHRvdWNoVXAgPSByYWNlKFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICBmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAkY29udGVudC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IGZyb21FdmVudDxUb3VjaEV2ZW50Pihjb250ZW50LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSkpLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICksXHJcbiAgICAgICAgICAgICR0b3VjaENhbmNlbGVyID0gJHRvdWNoVXAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgZGVsYXkoMCksXHJcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdG91Y2hDYW5jZWxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hDYW5jZWxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc25hcFRvSXRlbSAmJiB0aGlzLnNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxpZ25Qb3NpdGlvbih0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX1NUQVJULCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2ludGVyYWN0aXZlKSxcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYWNlKFtmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxUb3VjaEV2ZW50Pihjb250ZW50LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSldKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHdpbmRvdywgVE9VQ0hfTU9WRSwgeyBwYXNzaXZlOiBmYWxzZSB9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3VjaENhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwVG9JdGVtIHx8IHRoaXMuc2Nyb2xsaW5nT25lQnlPbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX1NUQVJULCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2ludGVyYWN0aXZlKSxcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoQ2FuY2VsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhJTlRFUkFDVElWRSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludmVyc2lvbiA9IHRoaXMuX2ludmVyc2lvbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPSAoaXNWZXJ0aWNhbCA/IHRoaXMueSA6IHRoaXMueCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q2xpZW50UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8gZS50b3VjaGVzW2UudG91Y2hlcy5sZW5ndGggLSAxXS5jbGllbnRZIDogZS50b3VjaGVzW2UudG91Y2hlcy5sZW5ndGggLSAxXS5jbGllbnRYLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3MgPSBwcmV2Q2xpZW50UG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksIHZlbG9jaXRpZXMgPSBuZXcgQXJyYXk8W251bWJlciwgbnVtYmVyXT4oKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9NT1ZFLCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCgkdG91Y2hDYW5jZWxlciksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBjdXJyZW50UG9zLCBlbmRUaW1lLCBzY3JvbGxEZWx0YSB9ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihpc1ZlcnRpY2FsLCBlLCBpbnZlcnNpb24sIHN0YXJ0Q2xpZW50UG9zLCBzdGFydFRpbWUsIHByZXZDbGllbnRQb3NpdGlvbiwgb2Zmc2V0cywgdmVsb2NpdGllcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNsaWVudFBvc2l0aW9uID0gY3VycmVudFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgcG9zaXRpb24sIHRydWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IE1hdGguYWJzKHBvc2l0aW9uKSAtIE1hdGguYWJzKGlzVmVydGljYWwgPyB0aGlzLl95IDogdGhpcy5feCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IChzY3JvbGxTaXplIC0gdmlld3BvcnRTaXplICogLjUpIHx8IHBvc2l0aW9uIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3MgLT0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYWNlKFtmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxUb3VjaEV2ZW50Pihjb250ZW50LCBUT1VDSF9FTkQsIHsgcGFzc2l2ZTogZmFsc2UgfSldKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKCR0b3VjaENhbmNlbGVyKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hDYW5jZWxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGVuZFRpbWUgLSBzdGFydFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2MCB9ID0gdGhpcy5jYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzLCBzY3JvbGxEZWx0YSwgdGltZXN0YW1wKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGEwIH0gPSB0aGlzLmNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc25hcElmTmVjZXNzYXJ5KHYwLCBmYWxzZSkgJiYgdGhpcy5zY3JvbGxCZWhhdmlvciAhPT0gQkVIQVZJT1JfSU5TVEFOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbCwgcG9zaXRpb24sIDAsIHYwLCBhMCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc0FuaW1hdGlvbihpZDogbnVtYmVyID0gLTEpIHsgcmV0dXJuIHRoaXMuX2FuaW1hdG9yPy5oYXNBbmltYXRpb24oaWQpID8/IGZhbHNlOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZURpcmVjdGlvbihwb3NpdGlvbjogbnVtYmVyLCBwcmVQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgZGVsdGEgPSAocG9zaXRpb24gLSB0aGlzLl9kZWx0YSkgLSBwcmVQb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uYWRkKGRlbHRhID4gMCA/IDEgOiBkZWx0YSA8IDAgPyAtMSA6IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBvdmVycmlkZUNvb3JkaW5hdGVzKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgc3VwZXIub3ZlcnJpZGVDb29yZGluYXRlcyh4LCB5KTtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB5IDogeCk7XHJcbiAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtZWFzdXJlVmVsb2NpdHkoKSB7XHJcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodGltZXN0YW1wID09PSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLl95IDogdGhpcy5feCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IDAgfHwgcG9zaXRpb24gPj0gKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWxvY2l0aWVzID0gWzBdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5TGFzdFBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbHRhICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGltZURlbHRhID0gdGltZXN0YW1wIC0gdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkRlbHRhID0gTWF0aC5hYnMocG9zaXRpb24gLSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24pLFxyXG4gICAgICAgICAgICB2ZWxvY2l0eSA9IHRpbWVEZWx0YSA+IDAgPyBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhIDogMDtcclxuICAgICAgICBsZXQgYXZnVmVsb2NpdHkgPSB0aGlzLl92ZWxvY2l0aWVzLmxlbmd0aCA+IDAgPyB0aGlzLl92ZWxvY2l0aWVzLnJlZHVjZSgocCwgYykgPT4gcCArIGMpIDogMDtcclxuICAgICAgICBpZiAodGhpcy5fdmVsb2NpdGllcy5sZW5ndGggPj0gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXZnVmVsb2NpdHkgKz0gdmVsb2NpdHk7XHJcbiAgICAgICAgdGhpcy5fJHZlbG9jaXR5Lm5leHQodmVsb2NpdHkpO1xyXG4gICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMucHVzaCh2ZWxvY2l0eSk7XHJcbiAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KGF2Z1ZlbG9jaXR5IC8gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0b3BNb3ZpbmcoKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHNuYXBJZk5lY2Vzc2FyeSh2MDogbnVtYmVyLCB3aXRoSW5pdGlhbEZvcmNlOiBib29sZWFuID0gdHJ1ZSwgYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpIHx8IChmb3JjZSA/IDEgOiAwKTtcclxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc25hcFRvSXRlbSA9IHRoaXMuc25hcFRvSXRlbTtcclxuICAgICAgICBpZiAoISFzbmFwVG9JdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGluZ09uZUJ5T25lID0gdGhpcy5zY3JvbGxpbmdPbmVCeU9uZTtcclxuICAgICAgICAgICAgaWYgKHNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHdpdGhJbml0aWFsRm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNuYXBXaXRoSW5pdGlhbEZvcmNlSWZOZWNlc3NhcnkodjAsIGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzbmFwV2l0aEluaXRpYWxGb3JjZUlmTmVjZXNzYXJ5KHYwOiBudW1iZXIgfCBudWxsID0gbnVsbCwgYW5pbWF0ZWQgPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNuYXBUb0l0ZW0gKiAuMDEsIHMgPSB0aGlzLmdldFNuYXBwZWRDb21wb25lbnRTaXplKCksXHJcbiAgICAgICAgICAgIHZhID0gcyAhPT0gbnVsbCAmJiB0ICE9PSAwID8gKHMgLyB0KSA6IDA7XHJcbiAgICAgICAgaWYgKHZhID49IE1hdGguYWJzKHYwID8/IHRoaXMuYXZlcmFnZVZlbG9jaXR5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWw6IGJvb2xlYW4sIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgYW55LCBpbnZlcnNpb246IGJvb2xlYW4sIHN0YXJ0Q2xpZW50UG9zOiBudW1iZXIsIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgIHByZXZDbGllbnRQb3NpdGlvbjogbnVtYmVyLCBvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgdmVsb2NpdGllczogQXJyYXk8W251bWJlciwgbnVtYmVyXT5cclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBpc1ZlcnRpY2FsID8gZS50b3VjaGVzPy5bZS50b3VjaGVzPy5sZW5ndGggLSAxXT8uY2xpZW50WSB8fCBlLmNsaWVudFkgOiBlLnRvdWNoZXM/LltlLnRvdWNoZXM/Lmxlbmd0aCAtIDFdPy5jbGllbnRYIHx8IGUuY2xpZW50WCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsIGRlbHRhID0gKGludmVyc2lvbiA/IC0xIDogMSkgKiAoc3RhcnRDbGllbnRQb3MgLSBjdXJyZW50UG9zKSxcclxuICAgICAgICAgICAgZHAgPSB0aGlzLl9zdGFydFBvc2l0aW9uICsgZGVsdGEsIHBvc2l0aW9uID0gdGhpcy5pc0luZmluaXR5ID8gZHAgOiBkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwLFxyXG4gICAgICAgICAgICBlbmRUaW1lID0gRGF0ZS5ub3coKSwgdGltZXN0YW1wID0gZW5kVGltZSAtIHN0YXJ0VGltZSwgc2Nyb2xsRGVsdGEgPSBwcmV2Q2xpZW50UG9zaXRpb24gPT09IDAgPyAwIDogcHJldkNsaWVudFBvc2l0aW9uIC0gY3VycmVudFBvcyxcclxuICAgICAgICAgICAgeyB2MCB9ID0gdGhpcy5jYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzLCBzY3JvbGxEZWx0YSwgdGltZXN0YW1wKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICByZXR1cm4geyBwb3NpdGlvbiwgY3VycmVudFBvcywgZW5kVGltZSwgc2Nyb2xsRGVsdGEgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbmNlbE92ZXJzY3JvbGwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm92ZXJzY3JvbGxFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbiA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja092ZXJzY3JvbGxCeUF4aXMoZTogRXZlbnQsIHBvczogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgcCA9IE1hdGguYWJzKHBvcyk7XHJcbiAgICAgICAgaWYgKHAgPiAwICYmIHAgPCBsaW1pdCkge1xyXG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24gPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVyc2Nyb2xsSXRlcmF0aW9uIDwgT1ZFUlNDUk9MTF9TVEFSVF9JVEVSQVRJT04pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24rKztcclxuICAgICAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrT3ZlcnNjcm9sbChlOiBFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fb3ZlcnNjcm9sbEVuYWJsZWQgfHwgIXRoaXMub3ZlcnNjcm9sbEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9vdmVyc2Nyb2xsRW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feSwgdGhpcy5zY3JvbGxIZWlnaHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feCwgdGhpcy5zY3JvbGxXaWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgZGVsdGE6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIsIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAxMCkge1xyXG4gICAgICAgIG9mZnNldHMucHVzaChbZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxlbiA9IG9mZnNldHMubGVuZ3RoLCBzdGFydEluZGV4ID0gbGVuID4gaW5kZXhPZmZzZXQgPyBsZW4gLSBpbmRleE9mZnNldCA6IDAsIGxhc3RWU2lnbiA9IGNhbGN1bGF0ZURpcmVjdGlvbihvZmZzZXRzKSxcclxuICAgICAgICAgICAgc3BlZWRTY2FsZSA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/LnNwZWVkU2NhbGUgPz8gU1BFRURfU0NBTEU7XHJcbiAgICAgICAgbGV0IHZTdW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4LCBsID0gb2Zmc2V0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcDAgPSBvZmZzZXRzW2ldO1xyXG4gICAgICAgICAgICBpZiAobGFzdFZTaWduICE9PSBNYXRoLnNpZ24ocDBbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdjAgPSAocDBbMV0gIT09IDAgPyBsYXN0VlNpZ24gKiBNYXRoLmFicyhwMFswXSAvIHAwWzFdKSAqIHNwZWVkU2NhbGUgOiAwKTtcclxuICAgICAgICAgICAgdlN1bSArPSBNYXRoLnNpZ24odjApICogTWF0aC5wb3codjAsIDQpICogLjAwMztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGwgPSBNYXRoLm1pbihvZmZzZXRzLmxlbmd0aCwgaW5kZXhPZmZzZXQpLCB2MCA9IGwgPiAwID8gKHZTdW0gLyBsKSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHsgdjAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgZGVsdGE6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIsIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAxMCkge1xyXG4gICAgICAgIHZlbG9jaXRpZXMucHVzaChbZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gdmVsb2NpdGllcy5sZW5ndGgsIHN0YXJ0SW5kZXggPSBsZW4gPiBpbmRleE9mZnNldCA/IGxlbiAtIGluZGV4T2Zmc2V0IDogMDtcclxuICAgICAgICBsZXQgYVN1bSA9IDAsIHByZXZWMDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgaXRlcmF0aW9uID0gMCwgbGFzdFZTaWduID0gY2FsY3VsYXRlRGlyZWN0aW9uKHZlbG9jaXRpZXMpO1xyXG4gICAgICAgIGNvbnN0IG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXNzID8/IE1BU1M7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGwgPSB2ZWxvY2l0aWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2MDAgPSBwcmV2VjAsIHYwMSA9IHZlbG9jaXRpZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChsYXN0VlNpZ24gIT09IE1hdGguc2lnbih2MDFbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodjAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhMCA9IHRpbWVzdGFtcCA8IE1BWF9WRUxPQ0lUWV9USU1FU1RBTVAgPyAodjAwWzFdICE9PSAwID8gKGxhc3RWU2lnbiAqIE1hdGguYWJzKE1hdGguYWJzKHYwMVswXSkgLSBNYXRoLmFicyh2MDBbMF0pKSkgLyBNYXRoLmFicyh2MDBbMV0pIDogMCkgOiAuMTtcclxuICAgICAgICAgICAgICAgIGFTdW0gPSBNYXRoLmFicygoYVN1bSAqIG1hc3MpKSArIE1hdGguYWJzKGEwKTtcclxuICAgICAgICAgICAgICAgIHByZXZWMCA9IHYwMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwcmV2VjAgPSB2MDE7XHJcbiAgICAgICAgICAgIGl0ZXJhdGlvbisrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYTAgPSBhU3VtICogKHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/LmZyaWN0aW9uYWxGb3JjZSA/PyBGUklDVElPTl9GT1JDRSk7XHJcbiAgICAgICAgcmV0dXJuIHsgYTAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wU2Nyb2xsaW5nKGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gJiYgIWZvcmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9hbmltYXRvci5zdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1vdmUoaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgYmxlbmRpbmc6IGJvb2xlYW4gPSBmYWxzZSwgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBmaXJlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsKHsgW2lzVmVydGljYWwgPyBUT1AgOiBMRUZUXTogcG9zaXRpb24sIGJlaGF2aW9yOiBJTlNUQU5ULCBibGVuZGluZywgdXNlckFjdGlvbiwgZmlyZVVwZGF0ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgdjA6IG51bWJlciwgdjogbnVtYmVyLCBhMDogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChhMCAhPT0gMCAmJiB0aW1lc3RhbXAgPCBNQVhfVkVMT0NJVFlfVElNRVNUQU1QKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGR2U2lnbiA9IE1hdGguc2lnbih2KSxcclxuICAgICAgICAgICAgICAgIG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXNzID8/IE1BU1MsXHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IERVUkFUSU9OLCBtYXhEdXJhdGlvbiA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1heER1cmF0aW9uID8/IE1BWF9EVVJBVElPTixcclxuICAgICAgICAgICAgICAgIG1heERpc3QgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXhEaXN0YW5jZSA/PyBNQVhfRElTVCxcclxuICAgICAgICAgICAgICAgIG1heERpc3RhbmNlID0gZHZTaWduICogbWF4RGlzdCwgcyA9IChkdlNpZ24gKiBNYXRoLmFicygoYTAgKiBNYXRoLnBvdyhkdXJhdGlvbiwgMikpICogLjUpIC8gMTAwMDApIC8gbWFzcyxcclxuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMocykgPCBtYXhEaXN0ID8gcyA6IG1heERpc3RhbmNlLCBwb3NpdGlvbldpdGhWZWxvY2l0eSA9IHBvc2l0aW9uICsgKHRoaXMuX2ludmVyc2lvbiA/IC0xIDogMSkgKiBkaXN0YW5jZSxcclxuICAgICAgICAgICAgICAgIGFkID0gTWF0aC5hYnMoYTAgIT09IDAgPyBNYXRoLnNxcnQoYTApIDogMCkgKiBBQ0NFTEVSQVRJT05fU0NBTEUgLyBtYXNzLFxyXG4gICAgICAgICAgICAgICAgYUR1cmF0aW9uID0gYWQgPCBtYXhEdXJhdGlvbiA/IGFkIDogbWF4RHVyYXRpb24sXHJcbiAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gaXNWZXJ0aWNhbCA/IHRoaXMueSA6IHRoaXMueDtcclxuICAgICAgICAgICAgdGhpcy5hbmltYXRlKHN0YXJ0UG9zaXRpb24sIE1hdGgucm91bmQocG9zaXRpb25XaXRoVmVsb2NpdHkpLCBhRHVyYXRpb24sIGVhc2VPdXRRdWFkLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSB0aGlzLl9ub3JtYWxpemVWYWx1ZUZyb21aZXJvID8gMCA6IHRoaXMuc3RhcnRPZmZzZXQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUgPSB0aGlzLnNjcm9sbGFibGUgPyAoKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpIC0gdGhpcy5hbGlnbm1lbnRFbmRPZmZzZXQpIDogMCxcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zY3JvbGxhYmxlID8gKHZhbHVlIDw9IHN0YXJ0T2Zmc2V0ID8gc3RhcnRPZmZzZXQgOiB2YWx1ZSA+IHNjcm9sbFNpemUgPyBzY3JvbGxTaXplIDogdmFsdWUpIDogc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYW5pbWF0ZShzdGFydFZhbHVlOiBudW1iZXIsIGVuZFZhbHVlOiBudW1iZXIsIGR1cmF0aW9uID0gQU5JTUFUSU9OX0RVUkFUSU9OLCBlYXNpbmdGdW5jdGlvbjogRWFzaW5nID0gZWFzZU91dFF1YWQsIGJsZW5kaW5nOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBhbGlnbm1lbnRBdENvbXBsZXRlOiBib29sZWFuID0gdHJ1ZSwgc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzOiBib29sZWFuID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHN0YXJ0VmFsdWU7XHJcbiAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSAhYWxpZ25tZW50QXRDb21wbGV0ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQW5pbWF0aW9uKCkgJiYgYmxlbmRpbmcpIHtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRhYmxlID0gdGhpcy5fYW5pbWF0b3IudXBkYXRlVG8oZW5kVmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAodXBkYXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5pbWF0b3IuaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbmltYXRvci5hbmltYXRlKHtcclxuICAgICAgICAgICAgd2l0aERlbHRhOiB0aGlzLl9zZXJ2aWNlLmR5bmFtaWMgJiYgIXRoaXMuaXNJbmZpbml0eSxcclxuICAgICAgICAgICAgc3RhcnRWYWx1ZSxcclxuICAgICAgICAgICAgZW5kVmFsdWUsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgICAgICBlYXNpbmdGdW5jdGlvbixcclxuICAgICAgICAgICAgZ2V0UHJvcFZhbHVlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94O1xyXG4gICAgICAgICAgICB9LCBvblVwZGF0ZTogKHsgdmFsdWUsIHRpbWVzdGFtcCwgZWxhcHNlZCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNDb29yZGluYXRlc092ZXJyaWRlZCAmJiAhc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNDb29yZGluYXRlc092ZXJyaWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlID0gaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94LCBkZWx0YSA9IGVuZFZhbHVlIC0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRlKGN1cnJlbnRDb29yZGluYXRlLCBjdXJyZW50Q29vcmRpbmF0ZSArIGRlbHRhLCBkdXJhdGlvbiAtIGVsYXBzZWQsIGVhc2luZ0Z1bmN0aW9uLCBibGVuZGluZywgdXNlckFjdGlvbiwgYWxpZ25tZW50QXRDb21wbGV0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSBjYWxjdWxhdGVWZWxvY2l0eShwb3NpdGlvbiwgdmFsdWUgLSB0aGlzLl9kZWx0YSwgdGltZXN0YW1wKSA/PyB0aGlzLmF2ZXJhZ2VWZWxvY2l0eTtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxpZ25tZW50QXRDb21wbGV0ZSAmJiAhdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gJiYgIXNraXBPdmVycmlkZWRDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCB2YWx1ZSwgZmFsc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHZhbHVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICAgICAgfSwgb25Db21wbGV0ZTogKHsgdmFsdWUsIHRpbWVzdGFtcCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSBjYWxjdWxhdGVWZWxvY2l0eShwb3NpdGlvbiwgdmFsdWUsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxpZ25tZW50QXRDb21wbGV0ZSAmJiAhdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gJiYgIXNraXBPdmVycmlkZWRDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc25hcElmTmVjZXNzYXJ5KHYwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHZhbHVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25BbmltYXRpb25Db21wbGV0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldFNuYXBwZWRDb21wb25lbnRTaXplKCkge1xyXG4gICAgICAgIGNvbnN0IGFsaWduID0gdGhpcy5zbmFwVG9JdGVtQWxpZ24sIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLCBzZCA9IHRoaXMuc25hcHBpbmdEaXN0YW5jZSxcclxuICAgICAgICAgICAgc25hcHBpbmdEaXN0YW5jZSA9IHBhcnNlRmxvYXRPclBlcnNlbnRhZ2VWYWx1ZShzZCksXHJcbiAgICAgICAgICAgIGlzUGVyc2VudGFnZVNuYXBwaW5nRGlzdGFuY2UgPSBpc1BlcmNlbnRhZ2VWYWx1ZShzZCk7XHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbERpcmVjdGlvbiA9IHRoaXMuX3Njcm9sbERpcmVjdGlvbi5nZXQoKSxcclxuICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCkgLSB0aGlzLl9zdGFydExheW91dE9mZnNldCxcclxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pLFxyXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50U2l6ZSA9IGlzVmVydGljYWwgPyBjdXJyZW50Q29tcG9uZW50Qm91bmRzPy5oZWlnaHQgPz8gMCA6IGN1cnJlbnRDb21wb25lbnRCb3VuZHM/LndpZHRoID8/IDA7XHJcbiAgICAgICAgc3dpdGNoIChhbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuU1RBUlQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjb21wU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5DRU5URVI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoY3VycmVudENvbXBvbmVudFNpemUgKiAuNSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCArIHZpZXdwb3J0U2l6ZSAqIC41LFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4oYWN0dWFsUG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNvbXBvbmVudEJvdW5kcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcFNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNvbXBTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkVORDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLmhlaWdodCA6IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCArIHZpZXdwb3J0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjb21wU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhbGlnblBvc2l0aW9uKGFuaW1hdGVkOiBib29sZWFuID0gdHJ1ZSwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5zbmFwVG9JdGVtIHx8ICh0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiAmJiAhZm9yY2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpIHx8IChmb3JjZSA/IDEgOiAwKTtcclxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxpZ24gPSB0aGlzLnNuYXBUb0l0ZW1BbGlnbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aCxcclxuICAgICAgICAgICAgc2QgPSB0aGlzLnNuYXBwaW5nRGlzdGFuY2UsXHJcbiAgICAgICAgICAgIHNuYXBwaW5nRGlzdGFuY2UgPSBwYXJzZUZsb2F0T3JQZXJzZW50YWdlVmFsdWUoc2QpLFxyXG4gICAgICAgICAgICBpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID0gaXNQZXJjZW50YWdlVmFsdWUoc2QpO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwsIHNpemU6IG51bWJlciA9IDA7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCkgLSB0aGlzLl9zdGFydExheW91dE9mZnNldCxcclxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pLFxyXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50U2l6ZSA9IGlzVmVydGljYWwgPyBjdXJyZW50Q29tcG9uZW50Qm91bmRzPy5oZWlnaHQgPz8gMCA6IGN1cnJlbnRDb21wb25lbnRCb3VuZHM/LndpZHRoID8/IDA7XHJcbiAgICAgICAgc3dpdGNoIChhbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuU1RBUlQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCwgYWxpZ25tZW50U3RhcnRPZmZzZXQgPSB0aGlzLmFsaWdubWVudFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB5IDogeDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoKSAtIChzdGFydE9mZnNldCAtIGFsaWdubWVudFN0YXJ0T2Zmc2V0KSArIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29tcG9uZW50UG9zaXRpb24gLSAoc3RhcnRPZmZzZXQgLSBhbGlnbm1lbnRTdGFydE9mZnNldCkgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPiBtYXhQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbWF4UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gdGhpcy5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSB0aGlzLnNjcm9sbFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkNFTlRFUjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKGN1cnJlbnRDb21wb25lbnRTaXplICogLjUgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQgKyB2aWV3cG9ydFNpemUgKiAuNSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCwgYWxpZ25tZW50U3RhcnRPZmZzZXQgPSB0aGlzLmFsaWdubWVudFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB5IDogeDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoKSAtIHNpemUgKiAuNSAtIHZpZXdwb3J0U2l6ZSAqIC41IC0gKHN0YXJ0T2Zmc2V0IC0gYWxpZ25tZW50U3RhcnRPZmZzZXQpICogLjU7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb21wb25lbnRQb3NpdGlvbiArIHNpemUgKiAuNSAtIHZpZXdwb3J0U2l6ZSAqIC41IC0gKHN0YXJ0T2Zmc2V0IC0gYWxpZ25tZW50U3RhcnRPZmZzZXQpICogLjUgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSAwIHx8IHBvc2l0aW9uID4gbWF4UG9zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1heFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IHRoaXMuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl94ID0gdGhpcy5zY3JvbGxXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5FTkQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCArIHZpZXdwb3J0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBvc2l0aW9uID0gaXNWZXJ0aWNhbCA/IHkgOiB4O1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb21wb25lbnRQb3NpdGlvbiAtIHZpZXdwb3J0U2l6ZSArIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNQb3MgPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsVG9wIDogdGhpcy5zY3JvbGxMZWZ0KTtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uICE9PSBjUG9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5hbmltYXRlKGNQb3MsIHBvc2l0aW9uLCBhbmltYXRlZCA/IHRoaXMuXyRhbmltYXRpb25QYXJhbXMuZ2V0VmFsdWUoKS5zbmFwVG9JdGVtIDogMSwgZWFzZU91dFF1YWQsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjaGVja0ludGVyc2VjdGlvbkNvbXBvbmVudCgpIHtcclxuICAgICAgICBjb25zdCBhbGlnbiA9IHRoaXMuc25hcFRvSXRlbUFsaWduLCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLmhlaWdodCA6IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLndpZHRoO1xyXG4gICAgICAgIGxldCBjb21wb25lbnRJZDogSWQgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsVG9wIDogdGhpcy5zY3JvbGxMZWZ0KSAtIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgIHN3aXRjaCAoYWxpZ24pIHtcclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLlNUQVJUOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24sIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBjb21wb25lbnRCb3VuZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5DRU5URVI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIHZpZXdwb3J0U2l6ZSAqIC41LFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4oYWN0dWFsUG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGNvbXBvbmVudEJvdW5kcztcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkVORDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsUG9zID0gY3VycmVudFBvc2l0aW9uICsgdmlld3BvcnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4oYWN0dWFsUG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGNvbXBvbmVudEJvdW5kcztcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb21wb25lbnRJZCAhPT0gdGhpcy5faW50ZXJzZWN0aW9uQ29tcG9uZW50SWQgJiYgY29tcG9uZW50SWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VydmljZS5zZXRJbnRlcnNlY3Rpb25FbGVtZW50QnlTbmFwVG9JdGVtQWxpZ24oY29tcG9uZW50SWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9pbnRlcnNlY3Rpb25Db21wb25lbnRJZCA9IGNvbXBvbmVudElkO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkFuaW1hdGlvbkNvbXBsZXRlKHBvc2l0aW9uOiBudW1iZXIpIHsgfVxyXG5cclxuICAgIGZpcmVTY3JvbGwodXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5fJHVwZGF0ZVNjcm9sbEJhci5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsTGltaXRzKHZhbHVlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB0aGlzLl94LCB5ID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdGhpcy5feSwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5eSA9IHRoaXMubm9ybWFsaXplVmFsdWUoeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoeSAhPT0geXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2lsZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3kgPSB5eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnkgPSB5eTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB4eCA9IHRoaXMubm9ybWFsaXplVmFsdWUoeCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoeCAhPT0geHgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2lsZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSB4eDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnggPSB4eDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHNjcm9sbChwYXJhbXM6IElTY3JvbGxUb1BhcmFtcykge1xyXG4gICAgICAgIGNvbnN0IHBvc1ggPSBwYXJhbXMueCB8fCBwYXJhbXMubGVmdCB8fCAwLFxyXG4gICAgICAgICAgICBwb3NZID0gcGFyYW1zLnkgfHwgcGFyYW1zLnRvcCB8fCAwLFxyXG4gICAgICAgICAgICB1c2VyQWN0aW9uID0gcGFyYW1zLnVzZXJBY3Rpb24gPz8gZmFsc2UsXHJcbiAgICAgICAgICAgIHNuYXAgPSBwYXJhbXMuc25hcCA/PyB0cnVlLFxyXG4gICAgICAgICAgICBub3JtYWxpemUgPSBwYXJhbXMubm9ybWFsaXplID8/IHRydWUsXHJcbiAgICAgICAgICAgIGVhc2UgPSBwYXJhbXMuZWFzZSB8fCBlYXNlT3V0UXVhZCxcclxuICAgICAgICAgICAgZmlyZVVwZGF0ZSA9IHBhcmFtcy5maXJlVXBkYXRlID8/IHRydWUsXHJcbiAgICAgICAgICAgIGJlaGF2aW9yID0gcGFyYW1zLmJlaGF2aW9yID8/IElOU1RBTlQsXHJcbiAgICAgICAgICAgIGJsZW5kaW5nID0gcGFyYW1zLmJsZW5kaW5nID8/IHRydWUsXHJcbiAgICAgICAgICAgIGZvcmNlID0gcGFyYW1zLmZvcmNlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHBhcmFtcy5kdXJhdGlvbiA/PyBBTklNQVRJT05fRFVSQVRJT04sXHJcbiAgICAgICAgICAgIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICBjb25zdCB4ID0gdGhpcy5ub3JtYWxpemVWYWx1ZShwb3NYKSxcclxuICAgICAgICAgICAgeSA9IHRoaXMubm9ybWFsaXplVmFsdWUocG9zWSksXHJcbiAgICAgICAgICAgIHByZXZYID0gdGhpcy5feCxcclxuICAgICAgICAgICAgcHJldlkgPSB0aGlzLl95O1xyXG4gICAgICAgIGlmIChiZWhhdmlvciA9PT0gQVVUTyB8fCBiZWhhdmlvciA9PT0gU01PT1RIKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlkgIT09IHkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlKHByZXZZLCB5LCBkdXJhdGlvbiwgZWFzZSwgYmxlbmRpbmcsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZYICE9PSB4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZShwcmV2WCwgeCwgZHVyYXRpb24sIGVhc2UsIGJsZW5kaW5nLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5feSAhPT0geSB8fCBmb3JjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0WSh5LCBzbmFwLCBub3JtYWxpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl94ICE9PSB4IHx8IGZvcmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRYKHgsIHNuYXAsIG5vcm1hbGl6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZW1pdFNjcm9sbGFibGVFdmVudCgpIHtcclxuICAgICAgICBpZiAoISF0aGlzLmNka1Njcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jZGtTY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uZGlzcGF0Y2hFdmVudChTQ1JPTExfRVZFTlQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQ29vcmRpbmF0ZSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbENvbnRlbnQgPSB0aGlzLnNjcm9sbENvbnRlbnQ/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgc2Nyb2xsQ29udGVudC5zdHlsZS50cmFuc2Zvcm0gPSBtYXRyaXgzZCgodGhpcy5faW52ZXJzaW9uID8gMSA6IC0xKSAqIHggKyAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSA/IDAgOiB0aGlzLl9zdGFydExheW91dE9mZnNldCksXHJcbiAgICAgICAgICAgICh0aGlzLl9pbnZlcnNpb24gPyAxIDogLTEpICogeSArICh0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpID8gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQgOiAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGZpcmVTY3JvbGxFdmVudCh1c2VyQWN0aW9uOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fJHNjcm9sbC5uZXh0KHVzZXJBY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkRyYWdTdGFydCgpIHsgfVxyXG5cclxuICAgIHJlc2V0KG9mZnNldDogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xyXG4gICAgICAgIHRoaXMubW92ZSh0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLCBvZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BBbmltYXRpb24oaWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLnN0b3AoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hbmltYXRvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
953
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FDdEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakosT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBVSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQ0gsZ0JBQWdCLEVBQUUsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsdUJBQXVCLEVBQUUsNEJBQTRCLEVBQzdILDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQ2hJLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxHQUNsRSxNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0gsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSx1Q0FBdUMsRUFD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LEtBQUssQ0FBQyxTQUFpQixDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGFBQWEsQ0FBQyxFQUFVO1FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUSxXQUFXO1FBQ2hCLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7d0dBanNDUSxZQUFZOzRGQUFaLFlBQVksZ2NBQ2dCLGFBQWEsb0RBSHhDLEVBQUU7OzRGQUVILFlBQVk7a0JBSnhCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7MEVBR1ksYUFBYTtzQkFEckIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7Z0JBUWhELGNBQWM7c0JBRGpCLEtBQUs7Z0JBV0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQVdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFXRixVQUFVO3NCQURiLEtBQUs7Z0JBV0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQVdGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBV0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQVdGLGVBQWU7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENka1Njcm9sbGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIGRlbGF5LCBmaWx0ZXIsIGZyb21FdmVudCwgbWFwLCBvZiwgcmFjZSwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBTklNQVRPUl9NSU5fVElNRVNUQU1QLCBBbmltYXRvciwgRWFzaW5nLCBlYXNlT3V0UXVhZCB9IGZyb20gJy4uLy4uL3V0aWxzL2FuaW1hdG9yJztcclxuaW1wb3J0IHtcclxuICAgIEJFSEFWSU9SX0lOU1RBTlQsIERFRkFVTFRfQU5JTUFUSU9OX1BBUkFNUywgREVGQVVMVF9PVkVSU0NST0xMX0VOQUJMRUQsIERFRkFVTFRfU0NST0xMX0JFSEFWSU9SLCBERUZBVUxUX1NDUk9MTElOR19PTkVfQllfT05FLFxyXG4gICAgREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1MsIERFRkFVTFRfU05BUF9UT19JVEVNLCBERUZBVUxUX1NOQVBfVE9fSVRFTV9BTElHTiwgREVGQVVMVF9TTkFQUElOR19ESVNUQU5DRSwgSU5URVJBQ1RJVkUsIE1PVVNFX0RPV04sXHJcbiAgICBNT1VTRV9NT1ZFLCBNT1VTRV9VUCwgVE9VQ0hfRU5ELCBUT1VDSF9NT1ZFLCBUT1VDSF9TVEFSVCwgV0hFRUwsXHJcbn0gZnJvbSAnLi4vLi4vY29uc3QnO1xyXG5pbXBvcnQgeyBJU2Nyb2xsVG9QYXJhbXMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgQUNDRUxFUkFUSU9OX1NDQUxFLCBBTklNQVRJT05fRFVSQVRJT04sIEFVVE8sIERVUkFUSU9OLCBGUklDVElPTl9GT1JDRSwgSU5TVEFOVCwgTEVGVCwgTUFTUywgTUFYX0RJU1QsIE1BWF9EVVJBVElPTiwgTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TLFxyXG4gICAgTUFYX1ZFTE9DSVRJRVNfTEVOR1RILFxyXG4gICAgTUFYX1ZFTE9DSVRZX1RJTUVTVEFNUCwgTUlOX0FDQ0VMRVJBVElPTiwgTUlOX0RFTFRBLCBPVkVSU0NST0xMX1NUQVJUX0lURVJBVElPTiwgU0NST0xMX0VWRU5ULCBTQ1JPTExfVklFV19OT1JNQUxJWkVfVkFMVUVfRlJPTV9aRVJPLCBTTU9PVEgsIFNQRUVEX1NDQUxFLCBUT1AsXHJcbn0gZnJvbSAnLi9jb25zdCc7XHJcbmltcG9ydCB7IGNhbGN1bGF0ZURpcmVjdGlvbiwgbWF0cml4M2QgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgQmFzZVNjcm9sbFZpZXcgfSBmcm9tICcuL2Jhc2UvYmFzZS1zY3JvbGwtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJQW5pbWF0aW9uUGFyYW1zLCBJU2Nyb2xsaW5nU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgU25hcFRvSXRlbUFsaWducywgVGV4dERpcmVjdGlvbnMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IE5nVmlydHVhbExpc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbmctdmlydHVhbC1saXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJZCwgU25hcHBpbmdEaXN0YW5jZSwgU25hcFRvSXRlbUFsaWduIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xyXG5pbXBvcnQgeyBwYXJzZUZsb2F0T3JQZXJzZW50YWdlVmFsdWUgfSBmcm9tICcuLi8uLi91dGlscy9wYXJzZS1mbG9hdC1vci1wZXJzZW50YWdlLXZhbHVlJztcclxuaW1wb3J0IHsgaXNQZXJjZW50YWdlVmFsdWUgfSBmcm9tICcuLi8uLi91dGlscy9pcy1wZXJzZW50YWdlLXZhbHVlJztcclxuaW1wb3J0IHsgU2Nyb2xsaW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2Nyb2xsaW5nLWRpcmVjdGlvbic7XHJcbmltcG9ydCB7IGNhbGN1bGF0ZVZlbG9jaXR5IH0gZnJvbSAnLi91dGlscy9jYWxjdWxhdGUtdmVsb2NpdHknO1xyXG5cclxuLyoqXHJcbiAqIE5nU2Nyb2xsVmlld1xyXG4gKiBNYXhpbXVtIHBlcmZvcm1hbmNlIGZvciBleHRyZW1lbHkgbGFyZ2UgbGlzdHMuXHJcbiAqIEl0IGlzIGJhc2VkIG9uIGFsZ29yaXRobXMgZm9yIHZpcnR1YWxpemF0aW9uIG9mIHNjcmVlbiBvYmplY3RzLlxyXG4gKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vRGpvbm55WC9uZy12aXJ0dWFsLWxpc3QvYmxvYi8xNi54L3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL2NvbXBvbmVudHMvbmctc2Nyb2xsLXZpZXcvbmctc2Nyb2xsLXZpZXcuY29tcG9uZW50LnRzXHJcbiAqIEBhdXRob3IgRXZnZW5paSBBbGV4YW5kcm92aWNoIEdyZWJlbm5pa292XHJcbiAqIEBlbWFpbCBkam9ubnl4QGdtYWlsLmNvbVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ25nLXNjcm9sbC12aWV3JyxcclxuICAgIHRlbXBsYXRlOiAnJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5nU2Nyb2xsVmlldyBleHRlbmRzIEJhc2VTY3JvbGxWaWV3IHtcclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbFZpZXdwb3J0JywgeyByZWFkOiBDZGtTY3JvbGxhYmxlIH0pXHJcbiAgICByZWFkb25seSBjZGtTY3JvbGxhYmxlOiBDZGtTY3JvbGxhYmxlIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHByb3RlY3RlZCBfc2VydmljZSA9IGluamVjdChOZ1ZpcnR1YWxMaXN0U2VydmljZSk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsQmVoYXZpb3IgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjcm9sbEJlaGF2aW9yPihERUZBVUxUX1NDUk9MTF9CRUhBVklPUik7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsQmVoYXZpb3IgPSB0aGlzLl8kc2Nyb2xsQmVoYXZpb3IuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNjcm9sbEJlaGF2aW9yKHY6IFNjcm9sbEJlaGF2aW9yKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzY3JvbGxCZWhhdmlvci5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxCZWhhdmlvci5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxCZWhhdmlvcigpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxCZWhhdmlvci5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kb3ZlcnNjcm9sbEVuYWJsZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfT1ZFUlNDUk9MTF9FTkFCTEVEKTtcclxuICAgIHJlYWRvbmx5ICRvdmVyc2Nyb2xsRW5hYmxlZCA9IHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgb3ZlcnNjcm9sbEVuYWJsZWQodjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgb3ZlcnNjcm9sbEVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbGluZ1NldHRpbmdzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJU2Nyb2xsaW5nU2V0dGluZ3M+KERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGxpbmdTZXR0aW5ncyA9IHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc2Nyb2xsaW5nU2V0dGluZ3ModjogSVNjcm9sbGluZ1NldHRpbmdzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxpbmdTZXR0aW5ncygpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc25hcFRvSXRlbSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9TTkFQX1RPX0lURU0pO1xyXG4gICAgcmVhZG9ubHkgJHNuYXBUb0l0ZW0gPSB0aGlzLl8kc25hcFRvSXRlbS5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc25hcFRvSXRlbSh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzbmFwVG9JdGVtLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNuYXBUb0l0ZW0ubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc25hcFRvSXRlbSgpIHsgcmV0dXJuIHRoaXMuXyRzbmFwVG9JdGVtLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGxpbmdPbmVCeU9uZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9TQ1JPTExJTkdfT05FX0JZX09ORSk7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsaW5nT25lQnlPbmUgPSB0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNjcm9sbGluZ09uZUJ5T25lKHY6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNjcm9sbGluZ09uZUJ5T25lLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNjcm9sbGluZ09uZUJ5T25lLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbGluZ09uZUJ5T25lKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGluZ09uZUJ5T25lLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzbmFwVG9JdGVtQWxpZ24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNuYXBUb0l0ZW1BbGlnbj4oREVGQVVMVF9TTkFQX1RPX0lURU1fQUxJR04pO1xyXG4gICAgcmVhZG9ubHkgJHNuYXBUb0l0ZW1BbGlnbiA9IHRoaXMuXyRzbmFwVG9JdGVtQWxpZ24uYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNuYXBUb0l0ZW1BbGlnbih2OiBTbmFwVG9JdGVtQWxpZ24pIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNuYXBUb0l0ZW1BbGlnbi5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzbmFwVG9JdGVtQWxpZ24ubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc25hcFRvSXRlbUFsaWduKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBUb0l0ZW1BbGlnbi5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc25hcHBpbmdEaXN0YW5jZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U25hcHBpbmdEaXN0YW5jZT4oREVGQVVMVF9TTkFQUElOR19ESVNUQU5DRSk7XHJcbiAgICByZWFkb25seSAkc25hcHBpbmdEaXN0YW5jZSA9IHRoaXMuXyRzbmFwcGluZ0Rpc3RhbmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzbmFwcGluZ0Rpc3RhbmNlKHY6IFNuYXBwaW5nRGlzdGFuY2UpIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc25hcHBpbmdEaXN0YW5jZS5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzbmFwcGluZ0Rpc3RhbmNlKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJGFuaW1hdGlvblBhcmFtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUFuaW1hdGlvblBhcmFtcz4oREVGQVVMVF9BTklNQVRJT05fUEFSQU1TKTtcclxuICAgIHJlYWRvbmx5ICRhbmltYXRpb25QYXJhbXMgPSB0aGlzLl8kYW5pbWF0aW9uUGFyYW1zLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBhbmltYXRpb25QYXJhbXModjogSUFuaW1hdGlvblBhcmFtcykge1xyXG4gICAgICAgIGlmICh0aGlzLl8kYW5pbWF0aW9uUGFyYW1zLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJGFuaW1hdGlvblBhcmFtcy5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBhbmltYXRpb25QYXJhbXMoKSB7IHJldHVybiB0aGlzLl8kYW5pbWF0aW9uUGFyYW1zLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX25vcm1hbGl6ZVZhbHVlRnJvbVplcm8gPSBpbmplY3QoU0NST0xMX1ZJRVdfTk9STUFMSVpFX1ZBTFVFX0ZST01fWkVSTyk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc1Njcm9sbHNUbzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByb3RlY3RlZCBfc2Nyb2xsRGlyZWN0aW9uID0gbmV3IFNjcm9sbGluZ0RpcmVjdGlvbigpO1xyXG4gICAgZ2V0IHNjcm9sbERpcmVjdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCAkc2Nyb2xsRGlyZWN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLiRkaXJlY3Rpb247IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyR3aGVlbCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuICAgIHJlYWRvbmx5ICR3aGVlbCA9IHRoaXMuXyR3aGVlbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGwgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbCA9IHRoaXMuXyRzY3JvbGwuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsRW5kID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGxFbmQgPSB0aGlzLl8kc2Nyb2xsRW5kLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfdmVsb2NpdGllczogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG5cclxuICAgIHByb3RlY3RlZCBfJHZlbG9jaXR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gICAgcHJvdGVjdGVkICR2ZWxvY2l0eSA9IHRoaXMuXyR2ZWxvY2l0eS5hc09ic2VydmFibGUoKTtcclxuICAgIGdldCB2ZWxvY2l0eSgpIHsgcmV0dXJuIHRoaXMuXyR2ZWxvY2l0eS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kYXZlcmFnZVZlbG9jaXR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gICAgcHJvdGVjdGVkICRhdmVyYWdlVmVsb2NpdHkgPSB0aGlzLl8kYXZlcmFnZVZlbG9jaXR5LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgZ2V0IGF2ZXJhZ2VWZWxvY2l0eSgpIHsgcmV0dXJuIHRoaXMuXyRhdmVyYWdlVmVsb2NpdHkuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByaXZhdGUgX21lYXN1cmVWZWxvY2l0eVRpbWVzdGFtcDogbnVtYmVyID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICBwcml2YXRlIF9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb246IG51bWJlciA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLl95IDogdGhpcy5feDtcclxuXHJcbiAgICBwcml2YXRlIF9zdGFydFBvc2l0aW9uWCA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfc3RhcnRQb3NpdGlvblkgPSAwO1xyXG5cclxuICAgIHNldCBzdGFydFBvc2l0aW9uKHY6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICBjID0gaXNWZXJ0aWNhbCA/IHRoaXMuX3N0YXJ0UG9zaXRpb25ZIDogdGhpcy5fc3RhcnRQb3NpdGlvblg7XHJcbiAgICAgICAgaWYgKHYgIT09IGMpIHtcclxuICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb25ZID0gdjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb25YID0gdjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RhcnRQb3NpdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRQb3NpdGlvblk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydFBvc2l0aW9uWDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2FuaW1hdG9yID0gbmV3IEFuaW1hdG9yKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kaG9yaXpvbnRhbEF4aXNJbnZlcnRpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHByb3RlY3RlZCAkaG9yaXpvbnRhbEF4aXNJbnZlcnRpb24gPSB0aGlzLl8kaG9yaXpvbnRhbEF4aXNJbnZlcnRpb24uYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBnZXQgaG9yaXpvbnRhbEF4aXNJbnZlcnRpb24oKSB7IHJldHVybiB0aGlzLl8kaG9yaXpvbnRhbEF4aXNJbnZlcnRpb24uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIGdldCBpbnZlcnRlZCgpIHsgcmV0dXJuIHRoaXMuXyRob3Jpem9udGFsQXhpc0ludmVydGlvbi5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbnRlcmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBfb3ZlcnNjcm9sbEl0ZXJhdGlvbjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9vdmVyc2Nyb2xsU3RhcnRJdGVyYXRpb24gPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX292ZXJzY3JvbGxBcHBsaWVkID0gZmFsc2VcclxuXHJcbiAgICBvdmVycmlkZSBzZXQgeCh2OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnNldFgodik7XHJcbiAgICB9XHJcbiAgICBvdmVycmlkZSBnZXQgeCgpIHsgcmV0dXJuIHRoaXMuX3g7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2V0WCh4OiBudW1iZXIsIHNuYXA6IGJvb2xlYW4gPSB0cnVlLCBub3JtYWxpemU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHggIT09IHVuZGVmaW5lZCAmJiAhTnVtYmVyLmlzTmFOKHgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlyZWN0aW9uKHgsIHRoaXMuX3kpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5feCA9IHRoaXMuX2FjdHVhbFkgPSB4O1xyXG5cclxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVTY3JvbGxTaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVWZWxvY2l0eSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNuYXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJbnRlcnNlY3Rpb25Db21wb25lbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQgeSh2OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnNldFkodik7XHJcbiAgICB9XHJcbiAgICBvdmVycmlkZSBnZXQgeSgpIHsgcmV0dXJuIHRoaXMuX3k7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2V0WSh5OiBudW1iZXIsIHNuYXA6IGJvb2xlYW4gPSB0cnVlLCBub3JtYWxpemU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHkgIT09IHVuZGVmaW5lZCAmJiAhTnVtYmVyLmlzTmFOKHkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlyZWN0aW9uKHksIHRoaXMuX3kpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5feSA9IHRoaXMuX2FjdHVhbFkgPSB5O1xyXG5cclxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVTY3JvbGxTaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVWZWxvY2l0eSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNuYXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJbnRlcnNlY3Rpb25Db21wb25lbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RlbHRhOiBudW1iZXIgPSAwO1xyXG4gICAgc2V0IGRlbHRhKHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2RlbHRhID0gdjtcclxuICAgICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gKz0gdjtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQgc3RhcnRMYXlvdXRPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0ICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0ID0gdjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb3ZlcnJpZGUgZ2V0IHN0YXJ0TGF5b3V0T2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQ7IH1cclxuXHJcbiAgICBwcml2YXRlIF9zY3JvbGxEaXJlY3Rpb25WYWx1ZVg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2Nyb2xsRGlyZWN0aW9uVmFsdWVZOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCBfaW50ZXJzZWN0aW9uQ29tcG9uZW50SWQ6IElkIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGdldCBhbmltYXRlZCgpIHsgcmV0dXJuIHRoaXMuX2FuaW1hdG9yPy5pc0FuaW1hdGVkID8/IGZhbHNlOyB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IG1vdXNlQ2FuY2VsZWQgPSBmYWxzZSxcclxuICAgICAgICAgICAgdG91Y2hDYW5jZWxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRpc1ZlcnRpY2FsLCB0aGlzLiRsYW5nVGV4dERpcl0pLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICB0YXAoKFtpc1ZlcnRpY2FsLCBsYW5nVGV4dERpcl0pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuXyRob3Jpem9udGFsQXhpc0ludmVydGlvbi5uZXh0KCFpc1ZlcnRpY2FsICYmIGxhbmdUZXh0RGlyID09PSBUZXh0RGlyZWN0aW9ucy5SVEwpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkdmlld3BvcnRCb3VuZHMgPSB0aGlzLiR2aWV3cG9ydEJvdW5kcztcclxuICAgICAgICAkdmlld3BvcnRCb3VuZHMucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1vdXNlQ2FuY2VsZWQgfHwgIXRvdWNoQ2FuY2VsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNuYXBUb0l0ZW0gfHwgdGhpcy5zY3JvbGxpbmdPbmVCeU9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsaWduUG9zaXRpb24odHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkd2hlZWwgPSB0aGlzLiR3aGVlbDtcclxuICAgICAgICAkd2hlZWwucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCh2ID0+IG9mKHRoaXMuYXZlcmFnZVZlbG9jaXR5KSksXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxyXG4gICAgICAgICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNuYXBXaXRoSW5pdGlhbEZvcmNlSWZOZWNlc3Nhcnkodik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVyc2Nyb2xsSXRlcmF0aW9uID0gdGhpcy5fb3ZlcnNjcm9sbFN0YXJ0SXRlcmF0aW9uID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxBcHBsaWVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvblZhbHVlWCA9IHRoaXMuX3Njcm9sbERpcmVjdGlvblZhbHVlWSA9IDA7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICR2aWV3cG9ydCA9IG9mKHRoaXMuc2Nyb2xsVmlld3BvcnQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICAgICAgICBtYXAodiA9PiB2IS5uYXRpdmVFbGVtZW50KSxcclxuICAgICAgICApLCAkY29udGVudCA9IG9mKHRoaXMuc2Nyb2xsQ29udGVudCkucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgICAgICAgIG1hcCh2ID0+IHYhLm5hdGl2ZUVsZW1lbnQpLFxyXG4gICAgICAgICksICR3aGVlbEVtaXR0ZXIgPSB0aGlzLl9pbnZlcnNpb24gPyAkdmlld3BvcnQgOiAkY29udGVudDtcclxuXHJcbiAgICAgICAgJHdoZWVsRW1pdHRlci5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxXaGVlbEV2ZW50Pihjb250ZW50LCBXSEVFTCwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyc2Nyb2xsKGUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGlzVmVydGljYWwgPyBlLmRlbHRhWSA6IChlLmRlbHRhWCAqICh0aGlzLmhvcml6b250YWxBeGlzSW52ZXJ0aW9uID8gLTEgOiAxKSksIGRwID0gKHN0YXJ0UG9zICsgZGVsdGEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmlzSW5maW5pdHkgPyBkcCA6IChkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGwoeyBbaXNWZXJ0aWNhbCA/IFRPUCA6IExFRlRdOiBwb3NpdGlvbiwgYmVoYXZpb3I6IElOU1RBTlQsIHVzZXJBY3Rpb246IHRydWUsIGJsZW5kaW5nOiBmYWxzZSwgZmlyZVVwZGF0ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHdoZWVsLm5leHQoZGVsdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJG1vdXNlVXAgPSByYWNlKFtcclxuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogdHJ1ZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb250ZW50LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiB0cnVlIH0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgIF0pLFxyXG4gICAgICAgICAgICAkbW91c2VEcmFnQ2FuY2VsID0gJG1vdXNlVXAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgZGVsYXkoMCksXHJcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbW91c2VDYW5jZWxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VDYW5jZWxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc25hcFRvSXRlbSAmJiB0aGlzLnNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxpZ25Qb3NpdGlvbih0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX0RPV04sIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxNb3VzZUV2ZW50Pih3aW5kb3csIE1PVVNFX1VQLCB7IHBhc3NpdmU6IGZhbHNlIH0pLCBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSldKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfTU9WRSwgeyBwYXNzaXZlOiBmYWxzZSB9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3VzZUNhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZUNhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwVG9JdGVtIHx8IHRoaXMuc2Nyb2xsaW5nT25lQnlPbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX0RPV04sIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZUNhbmNlbGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxTdGFydEl0ZXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxBcHBsaWVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVggPSB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoSU5URVJBQ1RJVkUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNpb24gPSB0aGlzLl9pbnZlcnNpb24sIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uWCA9IHRoaXMueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvblkgPSB0aGlzLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q2xpZW50UG9zaXRpb25YOiBudW1iZXIgfCBudWxsID0gKGUuY2xpZW50WCkgKiAodGhpcy5ob3Jpem9udGFsQXhpc0ludmVydGlvbiA/IC0xIDogMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2xpZW50UG9zaXRpb25ZOiBudW1iZXIgfCBudWxsID0gZS5jbGllbnRZLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3NYID0gcHJldkNsaWVudFBvc2l0aW9uWCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50UG9zWSA9IHByZXZDbGllbnRQb3NpdGlvblksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWCA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1kgPSBuZXcgQXJyYXk8W251bWJlciwgbnVtYmVyXT4oKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXRpZXNYID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0aWVzWSA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxNb3VzZUV2ZW50Pih3aW5kb3csIE1PVVNFX01PVkUsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKCRtb3VzZURyYWdDYW5jZWwpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyc2Nyb2xsKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwb3NpdGlvbjogcG9zaXRpb25YLCBjdXJyZW50UG9zOiBjdXJyZW50UG9zWCwgZW5kVGltZSwgc2Nyb2xsRGVsdGE6IHNjcm9sbERlbHRhWCB9ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihmYWxzZSwgdHJ1ZSwgdGhpcy5ob3Jpem9udGFsQXhpc0ludmVydGlvbiwgZSwgaW52ZXJzaW9uLCBzdGFydENsaWVudFBvc1gsIHN0YXJ0VGltZSwgcHJldkNsaWVudFBvc2l0aW9uWCwgb2Zmc2V0c1gsIHZlbG9jaXRpZXNYKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwb3NpdGlvbjogcG9zaXRpb25ZLCBjdXJyZW50UG9zOiBjdXJyZW50UG9zWSwgc2Nyb2xsRGVsdGE6IHNjcm9sbERlbHRhWSB9ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9zaXRpb24odHJ1ZSwgdHJ1ZSwgZmFsc2UsIGUsIGludmVyc2lvbiwgc3RhcnRDbGllbnRQb3NZLCBzdGFydFRpbWUsIHByZXZDbGllbnRQb3NpdGlvblksIG9mZnNldHNZLCB2ZWxvY2l0aWVzWSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gaXNWZXJ0aWNhbCA/IHBvc2l0aW9uWSA6IHBvc2l0aW9uWDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2xpZW50UG9zaXRpb25YID0gY3VycmVudFBvc1g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNsaWVudFBvc2l0aW9uWSA9IGN1cnJlbnRQb3NZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvblZhbHVlWCArPSBNYXRoLmFicyhzY3JvbGxEZWx0YVgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvblZhbHVlWSArPSBNYXRoLmFicyhzY3JvbGxEZWx0YVkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbmZpbml0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBNYXRoLmFicyhwb3NpdGlvbikgLSBNYXRoLmFicyhpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3gpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSAoc2Nyb2xsU2l6ZSAtIHZpZXdwb3J0U2l6ZSAqIC41KSB8fCBwb3NpdGlvbiA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50UG9zWSAtPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50UG9zWCAtPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFjZShbZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb250ZW50LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJG1vdXNlRHJhZ0NhbmNlbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxPdmVyc2Nyb2xsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBlbmRUaW1lIC0gc3RhcnRUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdjAgfSA9IHRoaXMuY2FsY3VsYXRlVmVsb2NpdHkoaXNWZXJ0aWNhbCA/IG9mZnNldHNZIDogb2Zmc2V0c1gsIGlzVmVydGljYWwgPyBzY3JvbGxEZWx0YVkgOiBzY3JvbGxEZWx0YVgsIHRpbWVzdGFtcCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhMCB9ID0gdGhpcy5jYWxjdWxhdGVBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbCA/IHZlbG9jaXRpZXNZIDogdmVsb2NpdGllc1gsIHYwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zbmFwSWZOZWNlc3NhcnkodjAsIGZhbHNlKSAmJiB0aGlzLnNjcm9sbEJlaGF2aW9yICE9PSBCRUhBVklPUl9JTlNUQU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlV2l0aEFjY2VsZXJhdGlvbihpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgMCwgdjAsIGEwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBJZk5lY2Vzc2FyeSh2MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICR0b3VjaFVwID0gcmFjZShcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHdpbmRvdywgVE9VQ0hfRU5ELCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oY29udGVudCwgVE9VQ0hfRU5ELCB7IHBhc3NpdmU6IGZhbHNlIH0pKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICApLFxyXG4gICAgICAgICAgICAkdG91Y2hDYW5jZWxlciA9ICR0b3VjaFVwLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgIGRlbGF5KDApLFxyXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRvdWNoQ2FuY2VsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRvdWNoQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNuYXBUb0l0ZW0gJiYgdGhpcy5zY3JvbGxpbmdPbmVCeU9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsaWduUG9zaXRpb24odHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAkY29udGVudC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxUb3VjaEV2ZW50Pihjb250ZW50LCBUT1VDSF9TVEFSVCwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFjZShbZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHdpbmRvdywgVE9VQ0hfRU5ELCB7IHBhc3NpdmU6IGZhbHNlIH0pLCBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oY29udGVudCwgVE9VQ0hfRU5ELCB7IHBhc3NpdmU6IGZhbHNlIH0pXSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKGZyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX01PVkUsIHsgcGFzc2l2ZTogZmFsc2UgfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG91Y2hDYW5jZWxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hDYW5jZWxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc25hcFRvSXRlbSB8fCB0aGlzLnNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxpZ25Qb3NpdGlvbih0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICAkY29udGVudC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxUb3VjaEV2ZW50Pihjb250ZW50LCBUT1VDSF9TVEFSVCwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxTdGFydEl0ZXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxBcHBsaWVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVggPSB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoSU5URVJBQ1RJVkUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnZlcnNpb24gPSB0aGlzLl9pbnZlcnNpb24sIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uWCA9IHRoaXMueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvblkgPSB0aGlzLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q2xpZW50UG9zaXRpb25YOiBudW1iZXIgfCBudWxsID0gKGUudG91Y2hlc1tlLnRvdWNoZXMubGVuZ3RoIC0gMV0uY2xpZW50WCkgKiAodGhpcy5ob3Jpem9udGFsQXhpc0ludmVydGlvbiA/IC0xIDogMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2xpZW50UG9zaXRpb25ZOiBudW1iZXIgfCBudWxsID0gZS50b3VjaGVzW2UudG91Y2hlcy5sZW5ndGggLSAxXS5jbGllbnRZLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3NYID0gcHJldkNsaWVudFBvc2l0aW9uWCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50UG9zWSA9IHByZXZDbGllbnRQb3NpdGlvblksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWCA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1kgPSBuZXcgQXJyYXk8W251bWJlciwgbnVtYmVyXT4oKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXRpZXNYID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0aWVzWSA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX01PVkUsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKCR0b3VjaENhbmNlbGVyKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb246IHBvc2l0aW9uWCwgY3VycmVudFBvczogY3VycmVudFBvc1gsIGVuZFRpbWUsIHNjcm9sbERlbHRhOiBzY3JvbGxEZWx0YVggfSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oZmFsc2UsIHRydWUsIHRoaXMuaG9yaXpvbnRhbEF4aXNJbnZlcnRpb24sIGUsIGludmVyc2lvbiwgc3RhcnRDbGllbnRQb3NYLCBzdGFydFRpbWUsIHByZXZDbGllbnRQb3NpdGlvblgsIG9mZnNldHNYLCB2ZWxvY2l0aWVzWCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcG9zaXRpb246IHBvc2l0aW9uWSwgY3VycmVudFBvczogY3VycmVudFBvc1ksIHNjcm9sbERlbHRhOiBzY3JvbGxEZWx0YVkgfSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKHRydWUsIHRydWUsIGZhbHNlLCBlLCBpbnZlcnNpb24sIHN0YXJ0Q2xpZW50UG9zWSwgc3RhcnRUaW1lLCBwcmV2Q2xpZW50UG9zaXRpb25ZLCBvZmZzZXRzWSwgdmVsb2NpdGllc1kpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGlzVmVydGljYWwgPyBwb3NpdGlvblkgOiBwb3NpdGlvblg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNsaWVudFBvc2l0aW9uWCA9IGN1cnJlbnRQb3NYO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDbGllbnRQb3NpdGlvblkgPSBjdXJyZW50UG9zWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVggKz0gTWF0aC5hYnMoc2Nyb2xsRGVsdGFYKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVkgKz0gTWF0aC5hYnMoc2Nyb2xsRGVsdGFZKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgcG9zaXRpb24sIHRydWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5hYnMocG9zaXRpb24pIC0gTWF0aC5hYnMoaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLmhlaWdodCA6IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gKHNjcm9sbFNpemUgLSB2aWV3cG9ydFNpemUgKiAuNSkgfHwgcG9zaXRpb24gPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvc1kgLT0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvc1ggLT0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IGVuZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJHRvdWNoQ2FuY2VsZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gZW5kVGltZSAtIHN0YXJ0VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHYwIH0gPSB0aGlzLmNhbGN1bGF0ZVZlbG9jaXR5KGlzVmVydGljYWwgPyBvZmZzZXRzWSA6IG9mZnNldHNYLCBpc1ZlcnRpY2FsID8gc2Nyb2xsRGVsdGFZIDogc2Nyb2xsRGVsdGFYLCB0aW1lc3RhbXApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYTAgfSA9IHRoaXMuY2FsY3VsYXRlQWNjZWxlcmF0aW9uKGlzVmVydGljYWwgPyB2ZWxvY2l0aWVzWSA6IHZlbG9jaXRpZXNYLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc25hcElmTmVjZXNzYXJ5KHYwLCBmYWxzZSkgJiYgdGhpcy5zY3JvbGxCZWhhdmlvciAhPT0gQkVIQVZJT1JfSU5TVEFOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbCwgcG9zaXRpb24sIDAsIHYwLCBhMCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc0FuaW1hdGlvbihpZDogbnVtYmVyID0gLTEpIHsgcmV0dXJuIHRoaXMuX2FuaW1hdG9yPy5oYXNBbmltYXRpb24oaWQpID8/IGZhbHNlOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZURpcmVjdGlvbihwb3NpdGlvbjogbnVtYmVyLCBwcmVQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgZGVsdGEgPSAocG9zaXRpb24gLSB0aGlzLl9kZWx0YSkgLSBwcmVQb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uYWRkKGRlbHRhID4gMCA/IDEgOiBkZWx0YSA8IDAgPyAtMSA6IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBvdmVycmlkZUNvb3JkaW5hdGVzKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgc3VwZXIub3ZlcnJpZGVDb29yZGluYXRlcyh4LCB5KTtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB5IDogeCk7XHJcbiAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtZWFzdXJlVmVsb2NpdHkoKSB7XHJcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodGltZXN0YW1wID09PSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLl95IDogdGhpcy5feCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IDAgfHwgcG9zaXRpb24gPj0gKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWxvY2l0aWVzID0gWzBdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5TGFzdFBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbHRhICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGltZURlbHRhID0gdGltZXN0YW1wIC0gdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkRlbHRhID0gTWF0aC5hYnMocG9zaXRpb24gLSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24pLFxyXG4gICAgICAgICAgICB2ZWxvY2l0eSA9IHRpbWVEZWx0YSA+IDAgPyBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhIDogMDtcclxuICAgICAgICBsZXQgYXZnVmVsb2NpdHkgPSB0aGlzLl92ZWxvY2l0aWVzLmxlbmd0aCA+IDAgPyB0aGlzLl92ZWxvY2l0aWVzLnJlZHVjZSgocCwgYykgPT4gcCArIGMpIDogMDtcclxuICAgICAgICBpZiAodGhpcy5fdmVsb2NpdGllcy5sZW5ndGggPj0gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXZnVmVsb2NpdHkgKz0gdmVsb2NpdHk7XHJcbiAgICAgICAgdGhpcy5fJHZlbG9jaXR5Lm5leHQodmVsb2NpdHkpO1xyXG4gICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMucHVzaCh2ZWxvY2l0eSk7XHJcbiAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KGF2Z1ZlbG9jaXR5IC8gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0b3BNb3ZpbmcoKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHNuYXBJZk5lY2Vzc2FyeSh2MDogbnVtYmVyLCB3aXRoSW5pdGlhbEZvcmNlOiBib29sZWFuID0gdHJ1ZSwgYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpIHx8IChmb3JjZSA/IDEgOiAwKTtcclxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc25hcFRvSXRlbSA9IHRoaXMuc25hcFRvSXRlbTtcclxuICAgICAgICBpZiAoISFzbmFwVG9JdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGluZ09uZUJ5T25lID0gdGhpcy5zY3JvbGxpbmdPbmVCeU9uZTtcclxuICAgICAgICAgICAgaWYgKHNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHdpdGhJbml0aWFsRm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNuYXBXaXRoSW5pdGlhbEZvcmNlSWZOZWNlc3NhcnkodjAsIGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzbmFwV2l0aEluaXRpYWxGb3JjZUlmTmVjZXNzYXJ5KHYwOiBudW1iZXIgfCBudWxsID0gbnVsbCwgYW5pbWF0ZWQgPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNuYXBUb0l0ZW0gKiAuMDEsIHMgPSB0aGlzLmdldFNuYXBwZWRDb21wb25lbnRTaXplKCksXHJcbiAgICAgICAgICAgIHZhID0gcyAhPT0gbnVsbCAmJiB0ICE9PSAwID8gKHMgLyB0KSA6IDA7XHJcbiAgICAgICAgaWYgKHZhID49IE1hdGguYWJzKHYwID8/IHRoaXMuYXZlcmFnZVZlbG9jaXR5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWw6IGJvb2xlYW4sIGVuYWJsZWQ6IGJvb2xlYW4sIGF4aXNJbnZlcnNpb246IGJvb2xlYW4sIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgYW55LCBpbnZlcnNpb246IGJvb2xlYW4sIHN0YXJ0Q2xpZW50UG9zOiBudW1iZXIsIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgIHByZXZDbGllbnRQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCwgb2Zmc2V0czogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sIHZlbG9jaXRpZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+XHJcbiAgICApIHtcclxuICAgICAgICBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcG9zaXRpb246IGlzVmVydGljYWwgPyB0aGlzLl95IDogdGhpcy5feCwgY3VycmVudFBvczogbnVsbCwgZW5kVGltZTogRGF0ZS5ub3coKSwgc2Nyb2xsRGVsdGE6IDAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3VycmVudFBvcyA9IChpc1ZlcnRpY2FsID8gZS50b3VjaGVzPy5bZS50b3VjaGVzPy5sZW5ndGggLSAxXT8uY2xpZW50WSB8fCBlLmNsaWVudFkgOiBlLnRvdWNoZXM/LltlLnRvdWNoZXM/Lmxlbmd0aCAtIDFdPy5jbGllbnRYIHx8IGUuY2xpZW50WCkgKiAoYXhpc0ludmVyc2lvbiA/IC0xIDogMSksXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLCBkZWx0YSA9IChpbnZlcnNpb24gPyAtMSA6IDEpICogKHN0YXJ0Q2xpZW50UG9zIC0gY3VycmVudFBvcyksXHJcbiAgICAgICAgICAgIGRwID0gKGlzVmVydGljYWwgPyB0aGlzLl9zdGFydFBvc2l0aW9uWSA6IHRoaXMuX3N0YXJ0UG9zaXRpb25YKSArIGRlbHRhLCBwb3NpdGlvbiA9IHRoaXMuaXNJbmZpbml0eSA/IGRwIDogZHAgPCAwID8gMCA6IGRwID4gc2Nyb2xsU2l6ZSA/IHNjcm9sbFNpemUgOiBkcCxcclxuICAgICAgICAgICAgZW5kVGltZSA9IERhdGUubm93KCksIHRpbWVzdGFtcCA9IGVuZFRpbWUgLSBzdGFydFRpbWUsIHNjcm9sbERlbHRhID0gKHByZXZDbGllbnRQb3NpdGlvbiA9PT0gMCB8fCBwcmV2Q2xpZW50UG9zaXRpb24gPT09IG51bGwpID8gMCA6IHByZXZDbGllbnRQb3NpdGlvbiAtIGN1cnJlbnRQb3MsXHJcbiAgICAgICAgICAgIHsgdjAgfSA9IHRoaXMuY2FsY3VsYXRlVmVsb2NpdHkob2Zmc2V0cywgc2Nyb2xsRGVsdGEsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBY2NlbGVyYXRpb24odmVsb2NpdGllcywgdjAsIHRpbWVzdGFtcCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IHBvc2l0aW9uLCBjdXJyZW50UG9zLCBlbmRUaW1lLCBzY3JvbGxEZWx0YSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FuY2VsT3ZlcnNjcm9sbCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMub3ZlcnNjcm9sbEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9vdmVyc2Nyb2xsSXRlcmF0aW9uID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrT3ZlcnNjcm9sbEJ5QXhpcyhlOiBFdmVudCwgcG9zOiBudW1iZXIsIGxpbWl0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBwID0gTWF0aC5hYnMocG9zKTtcclxuICAgICAgICBpZiAocCA+IDAgJiYgcCA8IGxpbWl0KSB7XHJcbiAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbiA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24gPCBPVkVSU0NST0xMX1NUQVJUX0lURVJBVElPTikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbisrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tPdmVyc2Nyb2xsKGU6IEV2ZW50LCB3aGVlbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9vdmVyc2Nyb2xsRW5hYmxlZCB8fCAhdGhpcy5vdmVyc2Nyb2xsRW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX292ZXJzY3JvbGxFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3ZlcnNjcm9sbFN0YXJ0SXRlcmF0aW9uIDwgT1ZFUlNDUk9MTF9TVEFSVF9JVEVSQVRJT04pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vdmVyc2Nyb2xsU3RhcnRJdGVyYXRpb24rKztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbEJ5QXhpcyhlLCB0aGlzLl95LCB0aGlzLnNjcm9sbEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aGVlbCB8fCB0aGlzLl9vdmVyc2Nyb2xsQXBwbGllZCB8fCB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVkgPiB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEFwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbEJ5QXhpcyhlLCB0aGlzLl95LCB0aGlzLnNjcm9sbEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJzY3JvbGxTdGFydEl0ZXJhdGlvbiA8IE9WRVJTQ1JPTExfU1RBUlRfSVRFUkFUSU9OKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbFN0YXJ0SXRlcmF0aW9uKys7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feCwgdGhpcy5zY3JvbGxXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aGVlbCB8fCB0aGlzLl9vdmVyc2Nyb2xsQXBwbGllZCB8fCB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVggPiB0aGlzLl9zY3JvbGxEaXJlY3Rpb25WYWx1ZVkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEFwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbEJ5QXhpcyhlLCB0aGlzLl94LCB0aGlzLnNjcm9sbFdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgZGVsdGE6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIsIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAxMCkge1xyXG4gICAgICAgIGlmIChvZmZzZXRzLmxlbmd0aCA+IE1BWF9WRUxPQ0lUSUVTX0xFTkdUSCkge1xyXG4gICAgICAgICAgICBvZmZzZXRzLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9mZnNldHMucHVzaChbZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gb2Zmc2V0cy5sZW5ndGgsIHN0YXJ0SW5kZXggPSBsZW4gPiBpbmRleE9mZnNldCA/IGxlbiAtIGluZGV4T2Zmc2V0IDogMCwgbGFzdFZTaWduID0gY2FsY3VsYXRlRGlyZWN0aW9uKG9mZnNldHMpLFxyXG4gICAgICAgICAgICBzcGVlZFNjYWxlID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncz8uc3BlZWRTY2FsZSA/PyBTUEVFRF9TQ0FMRTtcclxuICAgICAgICBsZXQgdlN1bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGwgPSBvZmZzZXRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwMCA9IG9mZnNldHNbaV07XHJcbiAgICAgICAgICAgIGlmIChsYXN0VlNpZ24gIT09IE1hdGguc2lnbihwMFswXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB2MCA9IChwMFsxXSAhPT0gMCA/IGxhc3RWU2lnbiAqIE1hdGguYWJzKHAwWzBdIC8gcDBbMV0pICogc3BlZWRTY2FsZSA6IDApO1xyXG4gICAgICAgICAgICB2U3VtICs9IE1hdGguc2lnbih2MCkgKiBNYXRoLnBvdyh2MCwgNCkgKiAuMDAzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbCA9IE1hdGgubWluKG9mZnNldHMubGVuZ3RoLCBpbmRleE9mZnNldCksIHYwID0gbCA+IDAgPyAodlN1bSAvIGwpIDogMDtcclxuICAgICAgICByZXR1cm4geyB2MCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQWNjZWxlcmF0aW9uKHZlbG9jaXRpZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LCBkZWx0YTogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlciwgaW5kZXhPZmZzZXQ6IG51bWJlciA9IDEwKSB7XHJcbiAgICAgICAgaWYgKHZlbG9jaXRpZXMubGVuZ3RoID4gTUFYX1ZFTE9DSVRJRVNfTEVOR1RIKSB7XHJcbiAgICAgICAgICAgIHZlbG9jaXRpZXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmVsb2NpdGllcy5wdXNoKFtNYXRoLmFicyhkZWx0YSkgPCBNSU5fREVMVEEgPyAwIDogZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gdmVsb2NpdGllcy5sZW5ndGgsIHN0YXJ0SW5kZXggPSBsZW4gPiBpbmRleE9mZnNldCA/IGxlbiAtIGluZGV4T2Zmc2V0IDogMDtcclxuICAgICAgICBsZXQgYVN1bSA9IDAsIHByZXZWMDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgaXRlcmF0aW9uID0gMCwgbGFzdFZTaWduID0gY2FsY3VsYXRlRGlyZWN0aW9uKHZlbG9jaXRpZXMpO1xyXG4gICAgICAgIGNvbnN0IG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXNzID8/IE1BU1M7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGwgPSB2ZWxvY2l0aWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2MDAgPSBwcmV2VjAsIHYwMSA9IHZlbG9jaXRpZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChsYXN0VlNpZ24gIT09IE1hdGguc2lnbih2MDFbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodjAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhMCA9IHRpbWVzdGFtcCA8IE1BWF9WRUxPQ0lUWV9USU1FU1RBTVAgPyAodjAwWzFdICE9PSAwID8gKGxhc3RWU2lnbiAqIE1hdGguYWJzKE1hdGguYWJzKHYwMVswXSkgLSBNYXRoLmFicyh2MDBbMF0pKSkgLyBNYXRoLmFicyh2MDBbMV0pIDogMCkgOiAuMTtcclxuICAgICAgICAgICAgICAgIGFTdW0gPSBNYXRoLmFicygoYVN1bSAqIG1hc3MpKSArIE1hdGguYWJzKGEwKTtcclxuICAgICAgICAgICAgICAgIHByZXZWMCA9IHYwMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwcmV2VjAgPSB2MDE7XHJcbiAgICAgICAgICAgIGl0ZXJhdGlvbisrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYTAgPSBhU3VtICogKHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/LmZyaWN0aW9uYWxGb3JjZSA/PyBGUklDVElPTl9GT1JDRSk7XHJcbiAgICAgICAgcmV0dXJuIHsgYTA6IE1hdGguYWJzKGEwKSA8IE1JTl9BQ0NFTEVSQVRJT04gPyAwIDogYTAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wU2Nyb2xsaW5nKGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gJiYgIWZvcmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9hbmltYXRvci5zdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1vdmUoaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgYmxlbmRpbmc6IGJvb2xlYW4gPSBmYWxzZSwgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBmaXJlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsKHsgW2lzVmVydGljYWwgPyBUT1AgOiBMRUZUXTogcG9zaXRpb24sIGJlaGF2aW9yOiBJTlNUQU5ULCBibGVuZGluZywgdXNlckFjdGlvbiwgZmlyZVVwZGF0ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgdjA6IG51bWJlciwgdjogbnVtYmVyLCBhMDogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChhMCAhPT0gMCAmJiB0aW1lc3RhbXAgPCBNQVhfVkVMT0NJVFlfVElNRVNUQU1QKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGR2U2lnbiA9IE1hdGguc2lnbih2KSxcclxuICAgICAgICAgICAgICAgIG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXNzID8/IE1BU1MsXHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IERVUkFUSU9OLCBtYXhEdXJhdGlvbiA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1heER1cmF0aW9uID8/IE1BWF9EVVJBVElPTixcclxuICAgICAgICAgICAgICAgIG1heERpc3QgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXhEaXN0YW5jZSA/PyBNQVhfRElTVCxcclxuICAgICAgICAgICAgICAgIG1heERpc3RhbmNlID0gZHZTaWduICogbWF4RGlzdCwgcyA9IChkdlNpZ24gKiBNYXRoLmFicygoYTAgKiBNYXRoLnBvdyhkdXJhdGlvbiwgMikpICogLjUpIC8gMTAwMDApIC8gbWFzcyxcclxuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMocykgPCBtYXhEaXN0ID8gcyA6IG1heERpc3RhbmNlLCBwb3NpdGlvbldpdGhWZWxvY2l0eSA9IHBvc2l0aW9uICsgKHRoaXMuX2ludmVyc2lvbiA/IC0xIDogMSkgKiBkaXN0YW5jZSxcclxuICAgICAgICAgICAgICAgIGFkID0gTWF0aC5hYnMoYTAgIT09IDAgPyBNYXRoLnNxcnQoYTApIDogMCkgKiBBQ0NFTEVSQVRJT05fU0NBTEUgLyBtYXNzLFxyXG4gICAgICAgICAgICAgICAgYUR1cmF0aW9uID0gYWQgPCBtYXhEdXJhdGlvbiA/IGFkIDogbWF4RHVyYXRpb24sXHJcbiAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gaXNWZXJ0aWNhbCA/IHRoaXMueSA6IHRoaXMueDtcclxuICAgICAgICAgICAgdGhpcy5hbmltYXRlKHN0YXJ0UG9zaXRpb24sIE1hdGgucm91bmQocG9zaXRpb25XaXRoVmVsb2NpdHkpLCBhRHVyYXRpb24sIGVhc2VPdXRRdWFkLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSB0aGlzLl9ub3JtYWxpemVWYWx1ZUZyb21aZXJvID8gMCA6IHRoaXMuc3RhcnRPZmZzZXQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUgPSB0aGlzLnNjcm9sbGFibGUgPyAoKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpIC0gdGhpcy5hbGlnbm1lbnRFbmRPZmZzZXQpIDogMCxcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zY3JvbGxhYmxlID8gKHZhbHVlIDw9IHN0YXJ0T2Zmc2V0ID8gc3RhcnRPZmZzZXQgOiB2YWx1ZSA+IHNjcm9sbFNpemUgPyBzY3JvbGxTaXplIDogdmFsdWUpIDogc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYW5pbWF0ZShzdGFydFZhbHVlOiBudW1iZXIsIGVuZFZhbHVlOiBudW1iZXIsIGR1cmF0aW9uID0gQU5JTUFUSU9OX0RVUkFUSU9OLCBlYXNpbmdGdW5jdGlvbjogRWFzaW5nID0gZWFzZU91dFF1YWQsIGJsZW5kaW5nOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBhbGlnbm1lbnRBdENvbXBsZXRlOiBib29sZWFuID0gdHJ1ZSwgc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzOiBib29sZWFuID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHN0YXJ0VmFsdWU7XHJcbiAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSAhYWxpZ25tZW50QXRDb21wbGV0ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQW5pbWF0aW9uKCkgJiYgYmxlbmRpbmcpIHtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRhYmxlID0gdGhpcy5fYW5pbWF0b3IudXBkYXRlVG8oZW5kVmFsdWUpO1xyXG4gICAgICAgICAgICBpZiAodXBkYXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5pbWF0b3IuaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbmltYXRvci5hbmltYXRlKHtcclxuICAgICAgICAgICAgd2l0aERlbHRhOiB0aGlzLl9zZXJ2aWNlLmR5bmFtaWMgJiYgIXRoaXMuaXNJbmZpbml0eSxcclxuICAgICAgICAgICAgc3RhcnRWYWx1ZSxcclxuICAgICAgICAgICAgZW5kVmFsdWUsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgICAgICBlYXNpbmdGdW5jdGlvbixcclxuICAgICAgICAgICAgZ2V0UHJvcFZhbHVlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94O1xyXG4gICAgICAgICAgICB9LCBvblVwZGF0ZTogKHsgdmFsdWUsIHRpbWVzdGFtcCwgZWxhcHNlZCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNDb29yZGluYXRlc092ZXJyaWRlZCAmJiAhc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNDb29yZGluYXRlc092ZXJyaWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlID0gaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94LCBkZWx0YSA9IGVuZFZhbHVlIC0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRlKGN1cnJlbnRDb29yZGluYXRlLCBjdXJyZW50Q29vcmRpbmF0ZSArIGRlbHRhLCBkdXJhdGlvbiAtIGVsYXBzZWQsIGVhc2luZ0Z1bmN0aW9uLCBibGVuZGluZywgdXNlckFjdGlvbiwgYWxpZ25tZW50QXRDb21wbGV0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSBjYWxjdWxhdGVWZWxvY2l0eShwb3NpdGlvbiwgdmFsdWUgLSB0aGlzLl9kZWx0YSwgdGltZXN0YW1wKSA/PyB0aGlzLmF2ZXJhZ2VWZWxvY2l0eTtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxpZ25tZW50QXRDb21wbGV0ZSAmJiAhdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gJiYgIXNraXBPdmVycmlkZWRDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCB2YWx1ZSwgZmFsc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHZhbHVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICAgICAgfSwgb25Db21wbGV0ZTogKHsgdmFsdWUsIHRpbWVzdGFtcCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSBjYWxjdWxhdGVWZWxvY2l0eShwb3NpdGlvbiwgdmFsdWUsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxpZ25tZW50QXRDb21wbGV0ZSAmJiAhdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gJiYgIXNraXBPdmVycmlkZWRDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc25hcElmTmVjZXNzYXJ5KHYwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHZhbHVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25BbmltYXRpb25Db21wbGV0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldFNuYXBwZWRDb21wb25lbnRTaXplKCkge1xyXG4gICAgICAgIGNvbnN0IGFsaWduID0gdGhpcy5zbmFwVG9JdGVtQWxpZ24sIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLCBzZCA9IHRoaXMuc25hcHBpbmdEaXN0YW5jZSxcclxuICAgICAgICAgICAgc25hcHBpbmdEaXN0YW5jZSA9IHBhcnNlRmxvYXRPclBlcnNlbnRhZ2VWYWx1ZShzZCksXHJcbiAgICAgICAgICAgIGlzUGVyc2VudGFnZVNuYXBwaW5nRGlzdGFuY2UgPSBpc1BlcmNlbnRhZ2VWYWx1ZShzZCk7XHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbERpcmVjdGlvbiA9IHRoaXMuX3Njcm9sbERpcmVjdGlvbi5nZXQoKSxcclxuICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCkgLSB0aGlzLl9zdGFydExheW91dE9mZnNldCxcclxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pLFxyXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50U2l6ZSA9IGlzVmVydGljYWwgPyBjdXJyZW50Q29tcG9uZW50Qm91bmRzPy5oZWlnaHQgPz8gMCA6IGN1cnJlbnRDb21wb25lbnRCb3VuZHM/LndpZHRoID8/IDA7XHJcbiAgICAgICAgc3dpdGNoIChhbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuU1RBUlQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjb21wU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5DRU5URVI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoY3VycmVudENvbXBvbmVudFNpemUgKiAuNSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCArIHZpZXdwb3J0U2l6ZSAqIC41LFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4oYWN0dWFsUG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNvbXBvbmVudEJvdW5kcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcFNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNvbXBTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkVORDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLmhlaWdodCA6IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCArIHZpZXdwb3J0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjb21wU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhbGlnblBvc2l0aW9uKGFuaW1hdGVkOiBib29sZWFuID0gdHJ1ZSwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5zbmFwVG9JdGVtIHx8ICh0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiAmJiAhZm9yY2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpIHx8IChmb3JjZSA/IDEgOiAwKTtcclxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxpZ24gPSB0aGlzLnNuYXBUb0l0ZW1BbGlnbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aCxcclxuICAgICAgICAgICAgc2QgPSB0aGlzLnNuYXBwaW5nRGlzdGFuY2UsXHJcbiAgICAgICAgICAgIHNuYXBwaW5nRGlzdGFuY2UgPSBwYXJzZUZsb2F0T3JQZXJzZW50YWdlVmFsdWUoc2QpLFxyXG4gICAgICAgICAgICBpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID0gaXNQZXJjZW50YWdlVmFsdWUoc2QpO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwsIHNpemU6IG51bWJlciA9IDA7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCkgLSB0aGlzLl9zdGFydExheW91dE9mZnNldCxcclxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pLFxyXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50U2l6ZSA9IGlzVmVydGljYWwgPyBjdXJyZW50Q29tcG9uZW50Qm91bmRzPy5oZWlnaHQgPz8gMCA6IGN1cnJlbnRDb21wb25lbnRCb3VuZHM/LndpZHRoID8/IDA7XHJcbiAgICAgICAgc3dpdGNoIChhbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuU1RBUlQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCwgYWxpZ25tZW50U3RhcnRPZmZzZXQgPSB0aGlzLmFsaWdubWVudFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB5IDogeDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoKSAtIChzdGFydE9mZnNldCAtIGFsaWdubWVudFN0YXJ0T2Zmc2V0KSArIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29tcG9uZW50UG9zaXRpb24gLSAoc3RhcnRPZmZzZXQgLSBhbGlnbm1lbnRTdGFydE9mZnNldCkgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPiBtYXhQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbWF4UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gdGhpcy5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSB0aGlzLnNjcm9sbFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkNFTlRFUjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKGN1cnJlbnRDb21wb25lbnRTaXplICogLjUgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQgKyB2aWV3cG9ydFNpemUgKiAuNSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCwgYWxpZ25tZW50U3RhcnRPZmZzZXQgPSB0aGlzLmFsaWdubWVudFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB5IDogeDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoKSAtIHNpemUgKiAuNSAtIHZpZXdwb3J0U2l6ZSAqIC41IC0gKHN0YXJ0T2Zmc2V0IC0gYWxpZ25tZW50U3RhcnRPZmZzZXQpICogLjU7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb21wb25lbnRQb3NpdGlvbiArIHNpemUgKiAuNSAtIHZpZXdwb3J0U2l6ZSAqIC41IC0gKHN0YXJ0T2Zmc2V0IC0gYWxpZ25tZW50U3RhcnRPZmZzZXQpICogLjUgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSAwIHx8IHBvc2l0aW9uID4gbWF4UG9zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1heFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IHRoaXMuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl94ID0gdGhpcy5zY3JvbGxXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5FTkQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICgoc2Nyb2xsRGlyZWN0aW9uID09PSAxID8gY3VycmVudENvbXBvbmVudFNpemUgOiAwKSAtIChpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID8gY3VycmVudENvbXBvbmVudFNpemUgKiBzbmFwcGluZ0Rpc3RhbmNlIDogc25hcHBpbmdEaXN0YW5jZSkpICogc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG9mZnNldCArIHZpZXdwb3J0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBvc2l0aW9uID0gaXNWZXJ0aWNhbCA/IHkgOiB4O1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb21wb25lbnRQb3NpdGlvbiAtIHZpZXdwb3J0U2l6ZSArIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNQb3MgPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsVG9wIDogdGhpcy5zY3JvbGxMZWZ0KTtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uICE9PSBjUG9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5hbmltYXRlKGNQb3MsIHBvc2l0aW9uLCBhbmltYXRlZCA/IHRoaXMuXyRhbmltYXRpb25QYXJhbXMuZ2V0VmFsdWUoKS5zbmFwVG9JdGVtIDogMSwgZWFzZU91dFF1YWQsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjaGVja0ludGVyc2VjdGlvbkNvbXBvbmVudCgpIHtcclxuICAgICAgICBjb25zdCBhbGlnbiA9IHRoaXMuc25hcFRvSXRlbUFsaWduLCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLmhlaWdodCA6IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLndpZHRoO1xyXG4gICAgICAgIGxldCBjb21wb25lbnRJZDogSWQgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsVG9wIDogdGhpcy5zY3JvbGxMZWZ0KSAtIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgIHN3aXRjaCAoYWxpZ24pIHtcclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLlNUQVJUOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24sIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjb21wb25lbnRCb3VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBjb21wb25lbnRCb3VuZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5DRU5URVI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIHZpZXdwb3J0U2l6ZSAqIC41LFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4oYWN0dWFsUG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGNvbXBvbmVudEJvdW5kcztcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkVORDoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsUG9zID0gY3VycmVudFBvc2l0aW9uICsgdmlld3BvcnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4oYWN0dWFsUG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKHBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGNvbXBvbmVudEJvdW5kcztcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb21wb25lbnRJZCAhPT0gdGhpcy5faW50ZXJzZWN0aW9uQ29tcG9uZW50SWQgJiYgY29tcG9uZW50SWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VydmljZS5zZXRJbnRlcnNlY3Rpb25FbGVtZW50QnlTbmFwVG9JdGVtQWxpZ24oY29tcG9uZW50SWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9pbnRlcnNlY3Rpb25Db21wb25lbnRJZCA9IGNvbXBvbmVudElkO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkFuaW1hdGlvbkNvbXBsZXRlKHBvc2l0aW9uOiBudW1iZXIpIHsgfVxyXG5cclxuICAgIGZpcmVTY3JvbGwodXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5fJHVwZGF0ZVNjcm9sbEJhci5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsTGltaXRzKHZhbHVlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB0aGlzLl94LCB5ID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdGhpcy5feSwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5eSA9IHRoaXMubm9ybWFsaXplVmFsdWUoeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoeSAhPT0geXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2lsZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3kgPSB5eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnkgPSB5eTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB4eCA9IHRoaXMubm9ybWFsaXplVmFsdWUoeCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoeCAhPT0geHgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2lsZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSB4eDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnggPSB4eDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHNjcm9sbChwYXJhbXM6IElTY3JvbGxUb1BhcmFtcykge1xyXG4gICAgICAgIGNvbnN0IHBvc1ggPSBwYXJhbXMueCB8fCBwYXJhbXMubGVmdCB8fCAwLFxyXG4gICAgICAgICAgICBwb3NZID0gcGFyYW1zLnkgfHwgcGFyYW1zLnRvcCB8fCAwLFxyXG4gICAgICAgICAgICB1c2VyQWN0aW9uID0gcGFyYW1zLnVzZXJBY3Rpb24gPz8gZmFsc2UsXHJcbiAgICAgICAgICAgIHNuYXAgPSBwYXJhbXMuc25hcCA/PyB0cnVlLFxyXG4gICAgICAgICAgICBub3JtYWxpemUgPSBwYXJhbXMubm9ybWFsaXplID8/IHRydWUsXHJcbiAgICAgICAgICAgIGVhc2UgPSBwYXJhbXMuZWFzZSB8fCBlYXNlT3V0UXVhZCxcclxuICAgICAgICAgICAgZmlyZVVwZGF0ZSA9IHBhcmFtcy5maXJlVXBkYXRlID8/IHRydWUsXHJcbiAgICAgICAgICAgIGJlaGF2aW9yID0gcGFyYW1zLmJlaGF2aW9yID8/IElOU1RBTlQsXHJcbiAgICAgICAgICAgIGJsZW5kaW5nID0gcGFyYW1zLmJsZW5kaW5nID8/IHRydWUsXHJcbiAgICAgICAgICAgIGZvcmNlID0gcGFyYW1zLmZvcmNlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHBhcmFtcy5kdXJhdGlvbiA/PyBBTklNQVRJT05fRFVSQVRJT04sXHJcbiAgICAgICAgICAgIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICBjb25zdCB4ID0gdGhpcy5ub3JtYWxpemVWYWx1ZShwb3NYKSxcclxuICAgICAgICAgICAgeSA9IHRoaXMubm9ybWFsaXplVmFsdWUocG9zWSksXHJcbiAgICAgICAgICAgIHByZXZYID0gdGhpcy5feCxcclxuICAgICAgICAgICAgcHJldlkgPSB0aGlzLl95O1xyXG4gICAgICAgIGlmIChiZWhhdmlvciA9PT0gQVVUTyB8fCBiZWhhdmlvciA9PT0gU01PT1RIKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlkgIT09IHkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlKHByZXZZLCB5LCBkdXJhdGlvbiwgZWFzZSwgYmxlbmRpbmcsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZYICE9PSB4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZShwcmV2WCwgeCwgZHVyYXRpb24sIGVhc2UsIGJsZW5kaW5nLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5feSAhPT0geSB8fCBmb3JjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0WSh5LCBzbmFwLCBub3JtYWxpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl94ICE9PSB4IHx8IGZvcmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRYKHgsIHNuYXAsIG5vcm1hbGl6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZW1pdFNjcm9sbGFibGVFdmVudCgpIHtcclxuICAgICAgICBpZiAoISF0aGlzLmNka1Njcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jZGtTY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uZGlzcGF0Y2hFdmVudChTQ1JPTExfRVZFTlQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQ29vcmRpbmF0ZSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbENvbnRlbnQgPSB0aGlzLnNjcm9sbENvbnRlbnQ/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgc2Nyb2xsQ29udGVudC5zdHlsZS50cmFuc2Zvcm0gPSBtYXRyaXgzZCgodGhpcy5faW52ZXJzaW9uID8gMSA6IC0xKSAqIHggKiAodGhpcy5ob3Jpem9udGFsQXhpc0ludmVydGlvbiA/IC0xIDogMSkgKyAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSA/IDAgOiB0aGlzLl9zdGFydExheW91dE9mZnNldCksXHJcbiAgICAgICAgICAgICh0aGlzLl9pbnZlcnNpb24gPyAxIDogLTEpICogeSArICh0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpID8gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQgOiAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGZpcmVTY3JvbGxFdmVudCh1c2VyQWN0aW9uOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fJHNjcm9sbC5uZXh0KHVzZXJBY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkRyYWdTdGFydCgpIHsgfVxyXG5cclxuICAgIHJlc2V0KG9mZnNldDogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpO1xyXG4gICAgICAgIHRoaXMubW92ZSh0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLCBvZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BBbmltYXRpb24oaWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLnN0b3AoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hbmltYXRvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19