@esotericsoftware/spine-core 4.3.5 → 4.3.6

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.
@@ -27,8 +27,8 @@
27
27
  * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
  *****************************************************************************/
29
29
  /** biome-ignore-all lint/style/noNonNullAssertion: reference runtime expects some nullable to not be null */
30
- import { Animation, AttachmentTimeline, DrawOrderFolderTimeline, DrawOrderTimeline, EventTimeline, RotateTimeline, Timeline } from "./Animation.js";
31
- import { Interpolation, MathUtils, Pool, StringSet, Utils } from "./Utils.js";
30
+ import { Animation, AttachmentTimeline, DrawOrderFolderTimeline, DrawOrderTimeline, EventTimeline, MixFrom, RotateTimeline, Timeline } from "./Animation.js";
31
+ import { Interpolation, MathUtils, Pool, Utils } from "./Utils.js";
32
32
  /** Applies animations over time, queues animations for later playback, mixes (crossfading) between animations, and applies
33
33
  * multiple animations on top of each other (layering).
34
34
  *
@@ -48,7 +48,7 @@ export class AnimationState {
48
48
  events = [];
49
49
  listeners = [];
50
50
  queue = new EventQueue(this);
51
- propertyIds = new StringSet();
51
+ propertyIds = new Map();
52
52
  animationsChanged = false;
53
53
  trackEntryPool = new Pool(() => new TrackEntry());
54
54
  constructor(data) {
@@ -175,9 +175,9 @@ export class AnimationState {
175
175
  Utils.webkit602BugfixHelper(alpha);
176
176
  const timeline = timelines[ii];
177
177
  if (timeline instanceof AttachmentTimeline)
178
- this.applyAttachmentTimeline(timeline, skeleton, applyTime, true, true);
178
+ this.applyAttachmentTimeline(timeline, skeleton, applyTime, MixFrom.setup, true);
179
179
  else
180
- timeline.apply(skeleton, animationLast, applyTime, applyEvents, alpha, true, false, false, false);
180
+ timeline.apply(skeleton, animationLast, applyTime, applyEvents, alpha, MixFrom.setup, false, false, false);
181
181
  }
182
182
  }
183
183
  else {
@@ -189,17 +189,17 @@ export class AnimationState {
189
189
  current.timelinesRotation.length = timelineCount << 1;
190
190
  for (let ii = 0; ii < timelineCount; ii++) {
191
191
  const timeline = timelines[ii];
192
- const fromSetup = (timelineMode[ii] & FIRST) !== 0;
192
+ const from = timelineMode[ii] & MODE;
193
193
  if (!shortestRotation && timeline instanceof RotateTimeline) {
194
- this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, fromSetup, current.timelinesRotation, ii << 1, firstFrame);
194
+ this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, from, current.timelinesRotation, ii << 1, firstFrame);
195
195
  }
196
196
  else if (timeline instanceof AttachmentTimeline) {
197
- this.applyAttachmentTimeline(timeline, skeleton, applyTime, fromSetup, retainAttachments);
197
+ this.applyAttachmentTimeline(timeline, skeleton, applyTime, from, retainAttachments);
198
198
  }
199
199
  else {
200
200
  // This fixes the WebKit 602 specific issue described at https://esotericsoftware.com/forum/d/10109-ios-10-disappearing-graphics
201
201
  Utils.webkit602BugfixHelper(alpha);
202
- timeline.apply(skeleton, animationLast, applyTime, applyEvents, alpha, fromSetup, add, false, false);
202
+ timeline.apply(skeleton, animationLast, applyTime, applyEvents, alpha, from, add, false, false);
203
203
  }
204
204
  }
205
205
  }
@@ -211,7 +211,7 @@ export class AnimationState {
211
211
  current.nextTrackLast = current.trackTime;
212
212
  }
213
213
  // Set slot attachments to the setup pose if they were set temporarily to apply deform timelines.
214
- const setupState = this.unkeyedState + SETUP;
214
+ const setupState = this.unkeyedState + ATTACH_SETUP;
215
215
  const slots = skeleton.slots;
216
216
  for (let i = 0, n = skeleton.slots.length; i < n; i++) {
217
217
  const slot = slots[i];
@@ -250,26 +250,26 @@ export class AnimationState {
250
250
  for (let i = 0; i < timelineCount; i++) {
251
251
  const timeline = timelines[i];
252
252
  const mode = timelineMode[i];
253
- const fromSetup = (mode & FIRST) !== 0;
253
+ const mixFrom = mode & MODE;
254
254
  let alpha = 0;
255
255
  if ((mode & HOLD) !== 0) {
256
256
  const holdMix = timelineHoldMix[i];
257
257
  alpha = holdMix == null ? alphaHold : alphaHold * (1 - holdMix.mix());
258
258
  }
259
259
  else {
260
- if (!drawOrder && timeline instanceof DrawOrderTimeline && !fromSetup)
260
+ if (!drawOrder && timeline instanceof DrawOrderTimeline && mixFrom === MixFrom.current)
261
261
  continue;
262
262
  alpha = alphaMix;
263
263
  }
264
264
  from.totalAlpha += alpha;
265
265
  if (!shortestRotation && timeline instanceof RotateTimeline) {
266
- this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, fromSetup, timelinesRotation, i << 1, firstFrame);
266
+ this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, mixFrom, timelinesRotation, i << 1, firstFrame);
267
267
  }
268
268
  else if (timeline instanceof AttachmentTimeline)
269
- this.applyAttachmentTimeline(timeline, skeleton, applyTime, fromSetup, retainAttachments && alpha >= from.alphaAttachmentThreshold);
269
+ this.applyAttachmentTimeline(timeline, skeleton, applyTime, mixFrom, retainAttachments && alpha >= from.alphaAttachmentThreshold);
270
270
  else {
271
- const out = !drawOrder || !(timeline instanceof DrawOrderTimeline) || !fromSetup;
272
- timeline.apply(skeleton, animationLast, applyTime, events, alpha, fromSetup, add, out, false);
271
+ const out = !drawOrder || !(timeline instanceof DrawOrderTimeline) || mixFrom === MixFrom.current;
272
+ timeline.apply(skeleton, animationLast, applyTime, events, alpha, mixFrom, add, out, false);
273
273
  }
274
274
  }
275
275
  if (from.reverse && mix < from.eventThreshold)
@@ -283,11 +283,11 @@ export class AnimationState {
283
283
  }
284
284
  /** Applies the attachment timeline and sets {@link Slot.attachmentState}.
285
285
  * @param retain True if the attachment remains after apply, false if temporary for deform timelines. */
286
- applyAttachmentTimeline(timeline, skeleton, time, fromSetup, retain) {
286
+ applyAttachmentTimeline(timeline, skeleton, time, from, retain) {
287
287
  const slot = skeleton.slots[timeline.slotIndex];
288
288
  if (!slot.bone.active)
289
289
  return;
290
- if (!retain && slot.attachmentState === this.unkeyedState + RETAIN)
290
+ if (!retain && slot.attachmentState === this.unkeyedState + ATTACH_RETAIN)
291
291
  return;
292
292
  let setup = time < timeline.frames[0];
293
293
  let name = null;
@@ -296,23 +296,23 @@ export class AnimationState {
296
296
  setup = !retain && name == null;
297
297
  }
298
298
  if (setup) {
299
- if (!fromSetup)
299
+ if (from === MixFrom.current)
300
300
  return;
301
301
  name = slot.data.attachmentName;
302
302
  }
303
303
  slot.pose.setAttachment(name == null ? null : skeleton.getAttachment(slot.data.index, name));
304
304
  if (retain)
305
- slot.attachmentState = this.unkeyedState + RETAIN;
305
+ slot.attachmentState = this.unkeyedState + ATTACH_RETAIN;
306
306
  else if (!setup) //
307
- slot.attachmentState = this.unkeyedState + SETUP;
307
+ slot.attachmentState = this.unkeyedState + ATTACH_SETUP;
308
308
  }
309
309
  /** Applies the rotate timeline, mixing with the current pose while keeping the same rotation direction chosen as the shortest
310
310
  * the first time the mixing was applied. */
311
- applyRotateTimeline(timeline, skeleton, time, alpha, fromSetup, timelinesRotation, i, firstFrame) {
311
+ applyRotateTimeline(timeline, skeleton, time, alpha, from, timelinesRotation, i, firstFrame) {
312
312
  if (firstFrame)
313
313
  timelinesRotation[i] = 0;
314
314
  if (alpha === 1) {
315
- timeline.apply(skeleton, 0, time, null, 1, fromSetup, false, false, false);
315
+ timeline.apply(skeleton, 0, time, null, 1, from, false, false, false);
316
316
  return;
317
317
  }
318
318
  const bone = skeleton.bones[timeline.boneIndex];
@@ -320,13 +320,24 @@ export class AnimationState {
320
320
  return;
321
321
  const pose = bone.pose, setup = bone.data.setupPose;
322
322
  const frames = timeline.frames;
323
- if (time < frames[0]) { // Time is before first frame.
324
- if (fromSetup)
325
- pose.rotation = setup.rotation;
326
- return;
323
+ let r1, r2;
324
+ if (time < frames[0]) {
325
+ switch (from) {
326
+ case MixFrom.setup: {
327
+ pose.rotation = setup.rotation;
328
+ return;
329
+ }
330
+ case MixFrom.current: {
331
+ return;
332
+ }
333
+ }
334
+ r1 = pose.rotation;
335
+ r2 = setup.rotation;
336
+ }
337
+ else {
338
+ r1 = from === MixFrom.setup ? setup.rotation : pose.rotation;
339
+ r2 = setup.rotation + timeline.getCurveValue(time);
327
340
  }
328
- const r1 = fromSetup ? setup.rotation : pose.rotation;
329
- const r2 = setup.rotation + timeline.getCurveValue(time);
330
341
  // Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.
331
342
  let total = 0, diff = r2 - r1;
332
343
  diff -= Math.ceil(diff / 360 - 0.5) * 360;
@@ -680,50 +691,42 @@ export class AnimationState {
680
691
  this.animationsChanged = false;
681
692
  const tracks = this.tracks;
682
693
  for (let i = 0, n = tracks.length; i < n; i++) {
683
- let entry = tracks[i];
684
- if (!entry)
694
+ const track = tracks[i];
695
+ if (!track)
685
696
  continue;
697
+ let entry = track;
686
698
  while (entry.mixingFrom)
687
699
  entry = entry.mixingFrom;
688
700
  do {
689
- this.computeHold(entry);
701
+ this.computeHold(entry, track);
690
702
  entry = entry.mixingTo;
691
703
  } while (entry);
692
704
  }
693
705
  this.propertyIds.clear();
694
706
  }
695
- computeHold(entry) {
707
+ computeHold(entry, track) {
696
708
  const timelines = entry.animation.timelines;
697
709
  const timelinesCount = entry.animation.timelines.length;
698
710
  const timelineMode = entry.timelineMode;
699
711
  timelineMode.length = timelinesCount;
700
712
  const timelineHoldMix = entry.timelineHoldMix;
701
713
  timelineHoldMix.length = 0;
702
- const propertyIds = this.propertyIds;
703
714
  const add = entry.additive, keepHold = entry.keepHold;
704
715
  const to = entry.mixingTo;
705
- outer: for (let i = 0; i < timelinesCount; i++) {
716
+ for (let i = 0; i < timelinesCount; i++) {
706
717
  const timeline = timelines[i];
707
718
  const ids = timeline.propertyIds;
708
- const first = propertyIds.addAll(ids)
709
- && !(timeline instanceof DrawOrderFolderTimeline && propertyIds.contains(DrawOrderTimeline.propertyID));
719
+ const from = this.from(track, timeline, ids);
710
720
  if (add && timeline.additive) {
711
- timelineMode[i] = first ? FIRST : SUBSEQUENT;
721
+ timelineMode[i] = from;
712
722
  continue;
713
723
  }
714
- for (let from = entry.mixingFrom; from != null; from = from.mixingFrom) {
715
- if (from.animation.hasTimeline(ids)) {
716
- // An earlier entry on this track keys this property, isolating it from lower tracks.
717
- timelineMode[i] = SUBSEQUENT;
718
- continue outer;
719
- }
720
- }
721
724
  // Hold if the next entry will overwrite this property.
722
725
  let mode;
723
726
  if (to === null || timeline.instant || (to.additive && timeline.additive) || !to.animation?.hasTimeline(ids))
724
- mode = first ? FIRST : SUBSEQUENT;
727
+ mode = from;
725
728
  else {
726
- mode = first ? HOLD_FIRST : HOLD;
729
+ mode = from | HOLD;
727
730
  // Find next entry that doesn't overwrite this property. Its mix fades out the hold, instead of it ending abruptly.
728
731
  for (let next = to.mixingTo; next != null; next = next.mixingTo) {
729
732
  if ((next.additive && timeline.additive) || !next.animation?.hasTimeline(ids)) {
@@ -738,6 +741,32 @@ export class AnimationState {
738
741
  timelineMode[i] = mode;
739
742
  }
740
743
  }
744
+ from(track, timeline, ids) {
745
+ const propertyIds = this.propertyIds;
746
+ let from = SETUP;
747
+ // Reference runtime uses LongMap.putMissing. Map has no equivalent, so get/set preserves those semantics here.
748
+ for (let i = 0, n = ids.length; i < n; i++) {
749
+ const owner = propertyIds.get(ids[i]);
750
+ if (owner === undefined) {
751
+ propertyIds.set(ids[i], track);
752
+ }
753
+ else {
754
+ if (owner !== track) {
755
+ while (++i < n)
756
+ if (!propertyIds.has(ids[i]))
757
+ propertyIds.set(ids[i], track);
758
+ return CURRENT;
759
+ }
760
+ from = FIRST;
761
+ }
762
+ }
763
+ if (timeline instanceof DrawOrderFolderTimeline) {
764
+ const first = propertyIds.get(DrawOrderTimeline.propertyID);
765
+ if (first != null)
766
+ return first !== track ? CURRENT : FIRST;
767
+ }
768
+ return from;
769
+ }
741
770
  /** Returns the track entry for the animation currently playing on the track, or null if no animation is currently playing. */
742
771
  getTrack(trackIndex) {
743
772
  if (trackIndex < 0)
@@ -959,8 +988,8 @@ export class TrackEntry {
959
988
  return mix;
960
989
  }
961
990
  /** For each timeline:
962
- * - Bit 0, FIRST: 0 = mix from current pose, 1 = mix from setup pose. Timeline is first to set the property.
963
- * - Bit 1, HOLD: 0 = mix out using alphaMix, 1 = apply full alpha to prevent dipping. Timeline is first on its track to
991
+ * - Bits 0-1: MixFrom.
992
+ * - Bit 2, HOLD: 0 = mix out using alphaMix, 1 = apply full alpha to prevent dipping. Timeline is first on its track to
964
993
  * set the property and the next entry (mixingTo) also sets it. When held, timelineHoldMix's mix controls how the hold fades
965
994
  * out (for 3+ entry chains where the chain eventually stops setting the property). */
966
995
  timelineMode = [];
@@ -1171,10 +1200,11 @@ export class AnimationStateAdapter {
1171
1200
  event(entry, event) {
1172
1201
  }
1173
1202
  }
1174
- export const SUBSEQUENT = 0;
1175
- export const FIRST = 1;
1176
- export const HOLD = 2;
1177
- export const HOLD_FIRST = 3;
1203
+ export const CURRENT = 0;
1178
1204
  export const SETUP = 1;
1179
- export const RETAIN = 2;
1180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uU3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQW5pbWF0aW9uU3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLDZHQUE2RztBQUU3RyxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLcEosT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHOUU7OztzSUFHc0k7QUFDdEksTUFBTSxPQUFPLGNBQWM7SUFDMUIsTUFBTSxDQUFVLGNBQWMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWpFLHVEQUF1RDtJQUN2RCxJQUFJLENBQXFCO0lBRXpCLHlIQUF5SDtJQUNoSCxNQUFNLEdBQUcsRUFBMkIsQ0FBQztJQUU5Qzs7O3dFQUdvRTtJQUNwRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUVSLE1BQU0sR0FBRyxFQUFhLENBQUM7SUFDdkIsU0FBUyxHQUFHLEVBQThCLENBQUM7SUFDcEQsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLFdBQVcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQzlCLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUUxQixjQUFjLEdBQUcsSUFBSSxJQUFJLENBQWEsR0FBRyxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBRTlELFlBQWEsSUFBd0I7UUFDcEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIs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Q3RCLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWUgZXhwZWN0cyBzb21lIG51bGxhYmxlIHRvIG5vdCBiZSBudWxsICovXG5cbmltcG9ydCB7IEFuaW1hdGlvbiwgQXR0YWNobWVudFRpbWVsaW5lLCBEcmF3T3JkZXJGb2xkZXJUaW1lbGluZSwgRHJhd09yZGVyVGltZWxpbmUsIEV2ZW50VGltZWxpbmUsIFJvdGF0ZVRpbWVsaW5lLCBUaW1lbGluZSB9IGZyb20gXCIuL0FuaW1hdGlvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBbmltYXRpb25TdGF0ZURhdGEgfSBmcm9tIFwiLi9BbmltYXRpb25TdGF0ZURhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tIFwiLi9FdmVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3QgfSBmcm9tIFwiLi9TbG90LmpzXCI7XG5pbXBvcnQgeyBJbnRlcnBvbGF0aW9uLCBNYXRoVXRpbHMsIFBvb2wsIFN0cmluZ1NldCwgVXRpbHMgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG5cbi8qKiBBcHBsaWVzIGFuaW1hdGlvbnMgb3ZlciB0aW1lLCBxdWV1ZXMgYW5pbWF0aW9ucyBmb3IgbGF0ZXIgcGxheWJhY2ssIG1peGVzIChjcm9zc2ZhZGluZykgYmV0d2VlbiBhbmltYXRpb25zLCBhbmQgYXBwbGllc1xuICogbXVsdGlwbGUgYW5pbWF0aW9ucyBvbiB0b3Agb2YgZWFjaCBvdGhlciAobGF5ZXJpbmcpLlxuICpcbiAqIFNlZSBbQXBwbHlpbmcgQW5pbWF0aW9uc10oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWFwcGx5aW5nLWFuaW1hdGlvbnMjQW5pbWF0aW9uU3RhdGUtQVBJKSBpbiB0aGUgU3BpbmUgUnVudGltZXMgR3VpZGUuICovXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uU3RhdGUge1xuXHRzdGF0aWMgcmVhZG9ubHkgZW1wdHlBbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKFwiPGVtcHR5PlwiLCBbXSwgMCk7XG5cblx0LyoqIFRoZSBBbmltYXRpb25TdGF0ZURhdGEgdG8gbG9vayB1cCBtaXggZHVyYXRpb25zLiAqL1xuXHRkYXRhOiBBbmltYXRpb25TdGF0ZURhdGE7XG5cblx0LyoqIFRoZSBsaXN0IG9mIHRyYWNrcyB0aGF0IGhhdmUgaGFkIGFuaW1hdGlvbnMuIE1heSBjb250YWluIG51bGwgZW50cmllcyBmb3IgdHJhY2tzIHRoYXQgY3VycmVudGx5IGhhdmUgbm8gYW5pbWF0aW9uLiAqL1xuXHRyZWFkb25seSB0cmFja3MgPSBbXSBhcyAoVHJhY2tFbnRyeSB8IG51bGwpW107XG5cblx0LyoqIE11bHRpcGxpZXIgZm9yIHRoZSBkZWx0YSB0aW1lIHdoZW4gdGhlIGFuaW1hdGlvbiBzdGF0ZSBpcyB1cGRhdGVkLCBjYXVzaW5nIHRpbWUgZm9yIGFsbCBhbmltYXRpb25zIGFuZCBtaXhlcyB0byBwbGF5IHNsb3dlclxuXHQgKiBvciBmYXN0ZXIuIERlZmF1bHRzIHRvIDEuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVHJhY2tFbnRyeS50aW1lU2NhbGV9IHRvIGFmZmVjdCBhIHNpbmdsZSBhbmltYXRpb24uICovXG5cdHRpbWVTY2FsZSA9IDE7XG5cdHVua2V5ZWRTdGF0ZSA9IDA7XG5cblx0cmVhZG9ubHkgZXZlbnRzID0gW10gYXMgRXZlbnRbXTtcblx0cmVhZG9ubHkgbGlzdGVuZXJzID0gW10gYXMgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lcltdO1xuXHRxdWV1ZSA9IG5ldyBFdmVudFF1ZXVlKHRoaXMpO1xuXHRwcm9wZXJ0eUlkcyA9IG5ldyBTdHJpbmdTZXQoKTtcblx0YW5pbWF0aW9uc0NoYW5nZWQgPSBmYWxzZTtcblxuXHR0cmFja0VudHJ5UG9vbCA9IG5ldyBQb29sPFRyYWNrRW50cnk+KCgpID0+IG5ldyBUcmFja0VudHJ5KCkpO1xuXG5cdGNvbnN0cnVjdG9yIChkYXRhOiBBbmltYXRpb25TdGF0ZURhdGEpIHtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHR9XG5cblx0LyoqIEluY3JlbWVudHMgZWFjaCB0cmFjayBlbnRyeSB7QGxpbmsgVHJhY2tFbnRyeS50cmFja1RpbWV9LCBzZXR0aW5nIHF1ZXVlZCBhbmltYXRpb25zIGFzIGN1cnJlbnQgaWYgbmVlZGVkLiAqL1xuXHR1cGRhdGUgKGRlbHRhOiBudW1iZXIpIHtcblx0XHRkZWx0YSAqPSB0aGlzLnRpbWVTY2FsZTtcblx0XHRjb25zdCB0cmFja3MgPSB0aGlzLnRyYWNrcztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGN1cnJlbnQgPSB0cmFja3NbaV07XG5cdFx0XHRpZiAoIWN1cnJlbnQpIGNvbnRpbnVlO1xuXG5cdFx0XHRjdXJyZW50LmFuaW1hdGlvbkxhc3QgPSBjdXJyZW50Lm5leHRBbmltYXRpb25MYXN0O1xuXHRcdFx0Y3VycmVudC50cmFja0xhc3QgPSBjdXJyZW50Lm5leHRUcmFja0xhc3Q7XG5cblx0XHRcdGxldCBjdXJyZW50RGVsdGEgPSBkZWx0YSAqIGN1cnJlbnQudGltZVNjYWxlO1xuXG5cdFx0XHRpZiAoY3VycmVudC5kZWxheSA+IDApIHtcblx0XHRcdFx0Y3VycmVudC5kZWxheSAtPSBjdXJyZW50RGVsdGE7XG5cdFx0XHRcdGlmIChjdXJyZW50LmRlbGF5ID4gMCkgY29udGludWU7XG5cdFx0XHRcdGN1cnJlbnREZWx0YSA9IC1jdXJyZW50LmRlbGF5O1xuXHRcdFx0XHRjdXJyZW50LmRlbGF5ID0gMDtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG5leHQgPSBjdXJyZW50Lm5leHQ7XG5cdFx0XHRpZiAobmV4dCkge1xuXHRcdFx0XHQvLyBXaGVuIHRoZSBuZXh0IGVudHJ5J3MgZGVsYXkgaXMgcGFzc2VkLCBjaGFuZ2UgdG8gdGhlIG5leHQgZW50cnksIHByZXNlcnZpbmcgbGVmdG92ZXIgdGltZS5cblx0XHRcdFx0Y29uc3QgbmV4dFRpbWUgPSBjdXJyZW50LnRyYWNrTGFzdCAtIG5leHQuZGVsYXk7XG5cdFx0XHRcdGlmIChuZXh0VGltZSA+PSAwKSB7XG5cdFx0XHRcdFx0bmV4dC5kZWxheSA9IDA7XG5cdFx0XHRcdFx0bmV4dC50cmFja1RpbWUgKz0gY3VycmVudC50aW1lU2NhbGUgPT09IDAgPyAwIDogKG5leHRUaW1lIC8gY3VycmVudC50aW1lU2NhbGUgKyBkZWx0YSkgKiBuZXh0LnRpbWVTY2FsZTtcblx0XHRcdFx0XHRjdXJyZW50LnRyYWNrVGltZSArPSBjdXJyZW50RGVsdGE7XG5cdFx0XHRcdFx0dGhpcy5zZXRUcmFjayhpLCBuZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR3aGlsZSAobmV4dC5taXhpbmdGcm9tKSB7XG5cdFx0XHRcdFx0XHRuZXh0Lm1peFRpbWUgKz0gZGVsdGE7XG5cdFx0XHRcdFx0XHRuZXh0ID0gbmV4dC5taXhpbmdGcm9tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChjdXJyZW50LnRyYWNrTGFzdCA+PSBjdXJyZW50LnRyYWNrRW5kICYmICFjdXJyZW50Lm1peGluZ0Zyb20pIHtcblx0XHRcdFx0dHJhY2tzW2ldID0gbnVsbDtcblx0XHRcdFx0dGhpcy5xdWV1ZS5lbmQoY3VycmVudCk7XG5cdFx0XHRcdHRoaXMuY2xlYXJOZXh0KGN1cnJlbnQpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50Lm1peGluZ0Zyb20gJiYgdGhpcy51cGRhdGVNaXhpbmdGcm9tKGN1cnJlbnQsIGRlbHRhKSkge1xuXHRcdFx0XHQvLyBFbmQgbWl4aW5nIGZyb20gZW50cmllcyBvbmNlIGFsbCBoYXZlIGNvbXBsZXRlZC5cblx0XHRcdFx0bGV0IGZyb206IFRyYWNrRW50cnkgfCBudWxsID0gY3VycmVudC5taXhpbmdGcm9tO1xuXHRcdFx0XHRjdXJyZW50Lm1peGluZ0Zyb20gPSBudWxsO1xuXHRcdFx0XHRpZiAoZnJvbSkgZnJvbS5taXhpbmdUbyA9IG51bGw7XG5cdFx0XHRcdHdoaWxlIChmcm9tKSB7XG5cdFx0XHRcdFx0dGhpcy5xdWV1ZS5lbmQoZnJvbSk7XG5cdFx0XHRcdFx0ZnJvbSA9IGZyb20ubWl4aW5nRnJvbTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50LnRyYWNrVGltZSArPSBjdXJyZW50RGVsdGE7XG5cdFx0fVxuXG5cdFx0dGhpcy5xdWV1ZS5kcmFpbigpO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSB3aGVuIGFsbCBtaXhpbmcgZnJvbSBlbnRyaWVzIGFyZSBjb21wbGV0ZS4gKi9cblx0dXBkYXRlTWl4aW5nRnJvbSAodG86IFRyYWNrRW50cnksIGRlbHRhOiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRjb25zdCBmcm9tID0gdG8ubWl4aW5nRnJvbTtcblx0XHRpZiAoIWZyb20pIHJldHVybiB0cnVlO1xuXG5cdFx0Y29uc3QgZmluaXNoZWQgPSB0aGlzLnVwZGF0ZU1peGluZ0Zyb20oZnJvbSwgZGVsdGEpO1xuXG5cdFx0ZnJvbS5hbmltYXRpb25MYXN0ID0gZnJvbS5uZXh0QW5pbWF0aW9uTGFzdDtcblx0XHRmcm9tLnRyYWNrTGFzdCA9IGZyb20ubmV4dFRyYWNrTGFzdDtcblxuXHRcdC8vIFRoZSBmcm9tIGVudHJ5IHdhcyBhcHBsaWVkIGF0IGxlYXN0IG9uY2UgYW5kIHRoZSBtaXggaXMgY29tcGxldGUuXG5cdFx0aWYgKHRvLm5leHRUcmFja0xhc3QgIT09IC0xICYmIHRvLm1peFRpbWUgPj0gdG8ubWl4RHVyYXRpb24pIHtcblx0XHRcdC8vIE1peGluZyBpcyBjb21wbGV0ZSBmb3IgYWxsIGVudHJpZXMgYmVmb3JlIHRoZSBmcm9tIGVudHJ5IG9yIHRoZSBtaXggaXMgaW5zdGFudGFuZW91cy5cblx0XHRcdGlmIChmcm9tLnRvdGFsQWxwaGEgPT09IDAgfHwgdG8ubWl4RHVyYXRpb24gPT09IDApIHtcblx0XHRcdFx0dG8ubWl4aW5nRnJvbSA9IGZyb20ubWl4aW5nRnJvbTtcblx0XHRcdFx0aWYgKGZyb20ubWl4aW5nRnJvbSAhPSBudWxsKSBmcm9tLm1peGluZ0Zyb20ubWl4aW5nVG8gPSB0bztcblx0XHRcdFx0aWYgKGZyb20udG90YWxBbHBoYSA9PT0gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IG5leHQgPSB0bzsgbmV4dC5taXhpbmdUbyAhPSBudWxsOyBuZXh0ID0gbmV4dC5taXhpbmdUbylcblx0XHRcdFx0XHRcdG5leHQua2VlcEhvbGQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMucXVldWUuZW5kKGZyb20pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZpbmlzaGVkO1xuXHRcdH1cblxuXHRcdGZyb20udHJhY2tUaW1lICs9IGRlbHRhICogZnJvbS50aW1lU2NhbGU7XG5cdFx0dG8ubWl4VGltZSArPSBkZWx0YTtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKiogUG9zZXMgdGhlIHNrZWxldG9uIHVzaW5nIHRoZSB0cmFjayBlbnRyeSBhbmltYXRpb25zLiBUaGUgYW5pbWF0aW9uIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLCBzbyBjYW4gYmUgYXBwbGllZCB0byBtdWx0aXBsZVxuXHQgKiBza2VsZXRvbnMgdG8gcG9zZSB0aGVtIGlkZW50aWNhbGx5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGFueSBhbmltYXRpb25zIHdlcmUgYXBwbGllZC4gKi9cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbik6IGJvb2xlYW4ge1xuXHRcdGlmICghc2tlbGV0b24pIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRpZiAodGhpcy5hbmltYXRpb25zQ2hhbmdlZCkgdGhpcy5fYW5pbWF0aW9uc0NoYW5nZWQoKTtcblxuXHRcdGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuXHRcdGNvbnN0IHRyYWNrcyA9IHRoaXMudHJhY2tzO1xuXHRcdGxldCBhcHBsaWVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGN1cnJlbnQgPSB0cmFja3NbaV07XG5cdFx0XHRpZiAoIWN1cnJlbnQgfHwgY3VycmVudC5kZWxheSA+IDApIGNvbnRpbnVlO1xuXHRcdFx0YXBwbGllZCA9IHRydWU7XG5cblx0XHRcdC8vIEFwcGx5IG1peGluZyBmcm9tIGVudHJpZXMgZmlyc3QuXG5cdFx0XHRsZXQgYWxwaGEgPSBjdXJyZW50LmFscGhhO1xuXHRcdFx0aWYgKGN1cnJlbnQubWl4aW5nRnJvbSlcblx0XHRcdFx0YWxwaGEgKj0gdGhpcy5hcHBseU1peGluZ0Zyb20oY3VycmVudCwgc2tlbGV0b24pO1xuXHRcdFx0ZWxzZSBpZiAoY3VycmVudC50cmFja1RpbWUgPj0gY3VycmVudC50cmFja0VuZCAmJiAhY3VycmVudC5uZXh0KVxuXHRcdFx0XHRhbHBoYSA9IDA7XG5cblx0XHRcdC8vIEFwcGx5IGN1cnJlbnQgZW50cnkuXG5cdFx0XHRsZXQgYW5pbWF0aW9uTGFzdCA9IGN1cnJlbnQuYW5pbWF0aW9uTGFzdCwgYW5pbWF0aW9uVGltZSA9IGN1cnJlbnQuZ2V0QW5pbWF0aW9uVGltZSgpLCBhcHBseVRpbWUgPSBhbmltYXRpb25UaW1lO1xuXHRcdFx0bGV0IGFwcGx5RXZlbnRzOiBFdmVudFtdIHwgbnVsbCA9IGV2ZW50cztcblx0XHRcdGlmIChjdXJyZW50LnJldmVyc2UpIHtcblx0XHRcdFx0YXBwbHlUaW1lID0gY3VycmVudC5hbmltYXRpb24hLmR1cmF0aW9uIC0gYXBwbHlUaW1lO1xuXHRcdFx0XHRhcHBseUV2ZW50cyA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0aW1lbGluZXMgPSBjdXJyZW50LmFuaW1hdGlvbiEudGltZWxpbmVzO1xuXHRcdFx0Y29uc3QgdGltZWxpbmVDb3VudCA9IHRpbWVsaW5lcy5sZW5ndGg7XG5cdFx0XHRpZiAoKGkgPT09IDAgJiYgYWxwaGEgPT09IDEpKSB7XG5cdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCB0aW1lbGluZUNvdW50OyBpaSsrKSB7XG5cdFx0XHRcdFx0Ly8gRml4ZXMgaXNzdWUgIzMwMiBvbiBJT1M5IHdoZXJlIG1peCwgYmxlbmQgc29tZXRpbWVzIGJlY2FtZSB1bmRlZmluZWQgYW5kIGNhdXNlZCBhc3NldHNcblx0XHRcdFx0XHQvLyB0byBzb21ldGltZXMgc3RvcCByZW5kZXJpbmcgd2hlbiB1c2luZyBjb2xvciBjb3JyZWN0aW9uLCBhcyB0aGVpciBSR0JBIHZhbHVlcyBiZWNvbWUgTmFOLlxuXHRcdFx0XHRcdC8vIChodHRwczovL2dpdGh1Yi5jb20vcGl4aWpzL3BpeGktc3BpbmUvaXNzdWVzLzMwMilcblx0XHRcdFx0XHRVdGlscy53ZWJraXQ2MDJCdWdmaXhIZWxwZXIoYWxwaGEpO1xuXHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gdGltZWxpbmVzW2lpXTtcblx0XHRcdFx0XHRpZiAodGltZWxpbmUgaW5zdGFuY2VvZiBBdHRhY2htZW50VGltZWxpbmUpXG5cdFx0XHRcdFx0XHR0aGlzLmFwcGx5QXR0YWNobWVudFRpbWVsaW5lKHRpbWVsaW5lLCBza2VsZXRvbiwgYXBwbHlUaW1lLCB0cnVlLCB0cnVlKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aW1lbGluZS5hcHBseShza2VsZXRvbiwgYW5pbWF0aW9uTGFzdCwgYXBwbHlUaW1lLCBhcHBseUV2ZW50cywgYWxwaGEsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB0aW1lbGluZU1vZGUgPSBjdXJyZW50LnRpbWVsaW5lTW9kZTtcblx0XHRcdFx0Y29uc3QgcmV0YWluQXR0YWNobWVudHMgPSBhbHBoYSA+PSBjdXJyZW50LmFscGhhQXR0YWNobWVudFRocmVzaG9sZDtcblx0XHRcdFx0Y29uc3QgYWRkID0gY3VycmVudC5hZGRpdGl2ZSwgc2hvcnRlc3RSb3RhdGlvbiA9IGFkZCB8fCBjdXJyZW50LnNob3J0ZXN0Um90YXRpb247XG5cdFx0XHRcdGNvbnN0IGZpcnN0RnJhbWUgPSAhc2hvcnRlc3RSb3RhdGlvbiAmJiBjdXJyZW50LnRpbWVsaW5lc1JvdGF0aW9uLmxlbmd0aCAhPT0gdGltZWxpbmVDb3VudCA8PCAxO1xuXHRcdFx0XHRpZiAoZmlyc3RGcmFtZSkgY3VycmVudC50aW1lbGluZXNSb3RhdGlvbi5sZW5ndGggPSB0aW1lbGluZUNvdW50IDw8IDE7XG5cblx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHRpbWVsaW5lQ291bnQ7IGlpKyspIHtcblx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IHRpbWVsaW5lc1tpaV07XG5cdFx0XHRcdFx0Y29uc3QgZnJvbVNldHVwID0gKHRpbWVsaW5lTW9kZVtpaV0gJiBGSVJTVCkgIT09IDA7XG5cdFx0XHRcdFx0aWYgKCFzaG9ydGVzdFJvdGF0aW9uICYmIHRpbWVsaW5lIGluc3RhbmNlb2YgUm90YXRlVGltZWxpbmUpIHtcblx0XHRcdFx0XHRcdHRoaXMuYXBwbHlSb3RhdGVUaW1lbGluZSh0aW1lbGluZSwgc2tlbGV0b24sIGFwcGx5VGltZSwgYWxwaGEsIGZyb21TZXR1cCwgY3VycmVudC50aW1lbGluZXNSb3RhdGlvbiwgaWkgPDwgMSwgZmlyc3RGcmFtZSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZSBpbnN0YW5jZW9mIEF0dGFjaG1lbnRUaW1lbGluZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5hcHBseUF0dGFjaG1lbnRUaW1lbGluZSh0aW1lbGluZSwgc2tlbGV0b24sIGFwcGx5VGltZSwgZnJvbVNldHVwLCByZXRhaW5BdHRhY2htZW50cyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgZml4ZXMgdGhlIFdlYktpdCA2MDIgc3BlY2lmaWMgaXNzdWUgZGVzY3JpYmVkIGF0IGh0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vZm9ydW0vZC8xMDEwOS1pb3MtMTAtZGlzYXBwZWFyaW5nLWdyYXBoaWNzXG5cdFx0XHRcdFx0XHRVdGlscy53ZWJraXQ2MDJCdWdmaXhIZWxwZXIoYWxwaGEpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmUuYXBwbHkoc2tlbGV0b24sIGFuaW1hdGlvbkxhc3QsIGFwcGx5VGltZSwgYXBwbHlFdmVudHMsIGFscGhhLCBmcm9tU2V0dXAsIGFkZCwgZmFsc2UsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50LnJldmVyc2UpIHRoaXMuZXZlbnRzUmV2ZXJzZShjdXJyZW50LCBhbmltYXRpb25MYXN0LCBhbmltYXRpb25UaW1lKTtcblx0XHRcdHRoaXMucXVldWVFdmVudHMoY3VycmVudCwgYW5pbWF0aW9uVGltZSk7XG5cdFx0XHRldmVudHMubGVuZ3RoID0gMDtcblx0XHRcdGN1cnJlbnQubmV4dEFuaW1hdGlvbkxhc3QgPSBhbmltYXRpb25UaW1lO1xuXHRcdFx0Y3VycmVudC5uZXh0VHJhY2tMYXN0ID0gY3VycmVudC50cmFja1RpbWU7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHNsb3QgYXR0YWNobWVudHMgdG8gdGhlIHNldHVwIHBvc2UgaWYgdGhleSB3ZXJlIHNldCB0ZW1wb3JhcmlseSB0byBhcHBseSBkZWZvcm0gdGltZWxpbmVzLlxuXHRcdGNvbnN0IHNldHVwU3RhdGUgPSB0aGlzLnVua2V5ZWRTdGF0ZSArIFNFVFVQO1xuXHRcdGNvbnN0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBza2VsZXRvbi5zbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IHNsb3QgPSBzbG90c1tpXTtcblx0XHRcdGlmIChzbG90LmF0dGFjaG1lbnRTdGF0ZSA9PT0gc2V0dXBTdGF0ZSkge1xuXHRcdFx0XHRjb25zdCBhdHRhY2htZW50TmFtZSA9IHNsb3QuZGF0YS5hdHRhY2htZW50TmFtZTtcblx0XHRcdFx0c2xvdC5wb3NlLnNldEF0dGFjaG1lbnQoIWF0dGFjaG1lbnROYW1lID8gbnVsbCA6IHNrZWxldG9uLmdldEF0dGFjaG1lbnQoc2xvdC5kYXRhLmluZGV4LCBhdHRhY2htZW50TmFtZSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLnVua2V5ZWRTdGF0ZSArPSAyOyAvLyBSZXNldC5cblxuXHRcdHRoaXMucXVldWUuZHJhaW4oKTtcblx0XHRyZXR1cm4gYXBwbGllZDtcblx0fVxuXG5cdGFwcGx5TWl4aW5nRnJvbSAodG86IFRyYWNrRW50cnksIHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdGNvbnN0IGZyb20gPSB0by5taXhpbmdGcm9tITtcblx0XHRjb25zdCBmcm9tTWl4ID0gZnJvbS5taXhpbmdGcm9tICE9PSBudWxsID8gdGhpcy5hcHBseU1peGluZ0Zyb20oZnJvbSwgc2tlbGV0b24pIDogMTtcblx0XHRjb25zdCBtaXggPSB0by5taXgoKTtcblxuXHRcdGNvbnN0IGEgPSBmcm9tLmFscGhhICogZnJvbU1peCwga2VlcCA9IDEgLSBtaXggKiB0by5hbHBoYTtcblx0XHRjb25zdCBhbHBoYU1peCA9IGEgKiAoMSAtIG1peCksIGFscGhhSG9sZCA9IGtlZXAgPiAwID8gYWxwaGFNaXggLyBrZWVwIDogYTtcblxuXHRcdGNvbnN0IHRpbWVsaW5lcyA9IGZyb20uYW5pbWF0aW9uIS50aW1lbGluZXM7XG5cdFx0Y29uc3QgdGltZWxpbmVDb3VudCA9IHRpbWVsaW5lcy5sZW5ndGg7XG5cdFx0Y29uc3QgdGltZWxpbmVNb2RlID0gZnJvbS50aW1lbGluZU1vZGU7XG5cdFx0Y29uc3QgdGltZWxpbmVIb2xkTWl4ID0gZnJvbS50aW1lbGluZUhvbGRNaXg7XG5cblx0XHRjb25zdCByZXRhaW5BdHRhY2htZW50cyA9IG1peCA8IGZyb20ubWl4QXR0YWNobWVudFRocmVzaG9sZCwgZHJhd09yZGVyID0gbWl4IDwgZnJvbS5taXhEcmF3T3JkZXJUaHJlc2hvbGQ7XG5cdFx0Y29uc3QgYWRkID0gZnJvbS5hZGRpdGl2ZSwgc2hvcnRlc3RSb3RhdGlvbiA9IGFkZCB8fCBmcm9tLnNob3J0ZXN0Um90YXRpb247XG5cdFx0Y29uc3QgZmlyc3RGcmFtZSA9ICFzaG9ydGVzdFJvdGF0aW9uICYmIGZyb20udGltZWxpbmVzUm90YXRpb24ubGVuZ3RoICE9PSB0aW1lbGluZUNvdW50IDw8IDE7XG5cdFx0aWYgKGZpcnN0RnJhbWUpIGZyb20udGltZWxpbmVzUm90YXRpb24ubGVuZ3RoID0gdGltZWxpbmVDb3VudCA8PCAxO1xuXHRcdGNvbnN0IHRpbWVsaW5lc1JvdGF0aW9uID0gZnJvbS50aW1lbGluZXNSb3RhdGlvbjtcblxuXHRcdGxldCBhbmltYXRpb25MYXN0ID0gZnJvbS5hbmltYXRpb25MYXN0LCBhbmltYXRpb25UaW1lID0gZnJvbS5nZXRBbmltYXRpb25UaW1lKCksIGFwcGx5VGltZSA9IGFuaW1hdGlvblRpbWU7XG5cdFx0bGV0IGV2ZW50cyA9IG51bGw7XG5cdFx0aWYgKGZyb20ucmV2ZXJzZSlcblx0XHRcdGFwcGx5VGltZSA9IGZyb20uYW5pbWF0aW9uIS5kdXJhdGlvbiAtIGFwcGx5VGltZTtcblx0XHRlbHNlIGlmIChtaXggPCBmcm9tLmV2ZW50VGhyZXNob2xkKSAvL1xuXHRcdFx0ZXZlbnRzID0gdGhpcy5ldmVudHM7XG5cblx0XHRmcm9tLnRvdGFsQWxwaGEgPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aW1lbGluZUNvdW50OyBpKyspIHtcblx0XHRcdGNvbnN0IHRpbWVsaW5lID0gdGltZWxpbmVzW2ldO1xuXHRcdFx0Y29uc3QgbW9kZSA9IHRpbWVsaW5lTW9kZVtpXTtcblx0XHRcdGNvbnN0IGZyb21TZXR1cCA9IChtb2RlICYgRklSU1QpICE9PSAwO1xuXHRcdFx0bGV0IGFscGhhID0gMDtcblx0XHRcdGlmICgobW9kZSAmIEhPTEQpICE9PSAwKSB7XG5cdFx0XHRcdGNvbnN0IGhvbGRNaXggPSB0aW1lbGluZUhvbGRNaXhbaV07XG5cdFx0XHRcdGFscGhhID0gaG9sZE1peCA9PSBudWxsID8gYWxwaGFIb2xkIDogYWxwaGFIb2xkICogKDEgLSBob2xkTWl4Lm1peCgpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghZHJhd09yZGVyICYmIHRpbWVsaW5lIGluc3RhbmNlb2YgRHJhd09yZGVyVGltZWxpbmUgJiYgIWZyb21TZXR1cCkgY29udGludWU7XG5cdFx0XHRcdGFscGhhID0gYWxwaGFNaXg7XG5cdFx0XHR9XG5cdFx0XHRmcm9tLnRvdGFsQWxwaGEgKz0gYWxwaGE7XG5cdFx0XHRpZiAoIXNob3J0ZXN0Um90YXRpb24gJiYgdGltZWxpbmUgaW5zdGFuY2VvZiBSb3RhdGVUaW1lbGluZSkge1xuXHRcdFx0XHR0aGlzLmFwcGx5Um90YXRlVGltZWxpbmUodGltZWxpbmUsIHNrZWxldG9uLCBhcHBseVRpbWUsIGFscGhhLCBmcm9tU2V0dXAsIHRpbWVsaW5lc1JvdGF0aW9uLCBpIDw8IDEsIGZpcnN0RnJhbWUpO1xuXHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZSBpbnN0YW5jZW9mIEF0dGFjaG1lbnRUaW1lbGluZSlcblx0XHRcdFx0dGhpcy5hcHBseUF0dGFjaG1lbnRUaW1lbGluZSh0aW1lbGluZSwgc2tlbGV0b24sIGFwcGx5VGltZSwgZnJvbVNldHVwLFxuXHRcdFx0XHRcdHJldGFpbkF0dGFjaG1lbnRzICYmIGFscGhhID49IGZyb20uYWxwaGFBdHRhY2htZW50VGhyZXNob2xkKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvdXQgPSAhZHJhd09yZGVyIHx8ICEodGltZWxpbmUgaW5zdGFuY2VvZiBEcmF3T3JkZXJUaW1lbGluZSkgfHwgIWZyb21TZXR1cDtcblx0XHRcdFx0dGltZWxpbmUuYXBwbHkoc2tlbGV0b24sIGFuaW1hdGlvbkxhc3QsIGFwcGx5VGltZSwgZXZlbnRzLCBhbHBoYSwgZnJvbVNldHVwLCBhZGQsIG91dCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChmcm9tLnJldmVyc2UgJiYgbWl4IDwgZnJvbS5ldmVudFRocmVzaG9sZCkgdGhpcy5ldmVudHNSZXZlcnNlKGZyb20sIGFuaW1hdGlvbkxhc3QsIGFuaW1hdGlvblRpbWUpO1xuXHRcdGlmICh0by5taXhEdXJhdGlvbiA+IDApIHRoaXMucXVldWVFdmVudHMoZnJvbSwgYW5pbWF0aW9uVGltZSk7XG5cdFx0dGhpcy5ldmVudHMubGVuZ3RoID0gMDtcblxuXHRcdGZyb20ubmV4dEFuaW1hdGlvbkxhc3QgPSBhbmltYXRpb25UaW1lO1xuXHRcdGZyb20ubmV4dFRyYWNrTGFzdCA9IGZyb20udHJhY2tUaW1lO1xuXHRcdHJldHVybiBtaXg7XG5cdH1cblxuXHQvKiogQXBwbGllcyB0aGUgYXR0YWNobWVudCB0aW1lbGluZSBhbmQgc2V0cyB7QGxpbmsgU2xvdC5hdHRhY2htZW50U3RhdGV9LlxuXHQgKiBAcGFyYW0gcmV0YWluIFRydWUgaWYgdGhlIGF0dGFjaG1lbnQgcmVtYWlucyBhZnRlciBhcHBseSwgZmFsc2UgaWYgdGVtcG9yYXJ5IGZvciBkZWZvcm0gdGltZWxpbmVzLiAqL1xuXHRhcHBseUF0dGFjaG1lbnRUaW1lbGluZSAodGltZWxpbmU6IEF0dGFjaG1lbnRUaW1lbGluZSwgc2tlbGV0b246IFNrZWxldG9uLCB0aW1lOiBudW1iZXIsIGZyb21TZXR1cDogYm9vbGVhbiwgcmV0YWluOiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uLnNsb3RzW3RpbWVsaW5lLnNsb3RJbmRleF07XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cdFx0aWYgKCFyZXRhaW4gJiYgc2xvdC5hdHRhY2htZW50U3RhdGUgPT09IHRoaXMudW5rZXllZFN0YXRlICsgUkVUQUlOKSByZXR1cm47XG5cblx0XHRsZXQgc2V0dXAgPSB0aW1lIDwgdGltZWxpbmUuZnJhbWVzWzBdO1xuXHRcdGxldCBuYW1lID0gbnVsbDtcblx0XHRpZiAoIXNldHVwKSB7XG5cdFx0XHRuYW1lID0gdGltZWxpbmUuYXR0YWNobWVudE5hbWVzW1RpbWVsaW5lLnNlYXJjaCh0aW1lbGluZS5mcmFtZXMsIHRpbWUpXTtcblx0XHRcdHNldHVwID0gIXJldGFpbiAmJiBuYW1lID09IG51bGw7XG5cdFx0fVxuXHRcdGlmIChzZXR1cCkge1xuXHRcdFx0aWYgKCFmcm9tU2V0dXApIHJldHVybjtcblx0XHRcdG5hbWUgPSBzbG90LmRhdGEuYXR0YWNobWVudE5hbWU7XG5cdFx0fVxuXHRcdHNsb3QucG9zZS5zZXRBdHRhY2htZW50KG5hbWUgPT0gbnVsbCA/IG51bGwgOiBza2VsZXRvbi5nZXRBdHRhY2htZW50KHNsb3QuZGF0YS5pbmRleCwgbmFtZSkpO1xuXHRcdGlmIChyZXRhaW4pXG5cdFx0XHRzbG90LmF0dGFjaG1lbnRTdGF0ZSA9IHRoaXMudW5rZXllZFN0YXRlICsgUkVUQUlOO1xuXHRcdGVsc2UgaWYgKCFzZXR1cCkgLy9cblx0XHRcdHNsb3QuYXR0YWNobWVudFN0YXRlID0gdGhpcy51bmtleWVkU3RhdGUgKyBTRVRVUDtcblx0fVxuXG5cdC8qKiBBcHBsaWVzIHRoZSByb3RhdGUgdGltZWxpbmUsIG1peGluZyB3aXRoIHRoZSBjdXJyZW50IHBvc2Ugd2hpbGUga2VlcGluZyB0aGUgc2FtZSByb3RhdGlvbiBkaXJlY3Rpb24gY2hvc2VuIGFzIHRoZSBzaG9ydGVzdFxuXHQgKiB0aGUgZmlyc3QgdGltZSB0aGUgbWl4aW5nIHdhcyBhcHBsaWVkLiAqL1xuXHRhcHBseVJvdGF0ZVRpbWVsaW5lICh0aW1lbGluZTogUm90YXRlVGltZWxpbmUsIHNrZWxldG9uOiBTa2VsZXRvbiwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tU2V0dXA6IGJvb2xlYW4sXG5cdFx0dGltZWxpbmVzUm90YXRpb246IEFycmF5PG51bWJlcj4sIGk6IG51bWJlciwgZmlyc3RGcmFtZTogYm9vbGVhbikge1xuXG5cdFx0aWYgKGZpcnN0RnJhbWUpIHRpbWVsaW5lc1JvdGF0aW9uW2ldID0gMDtcblxuXHRcdGlmIChhbHBoYSA9PT0gMSkge1xuXHRcdFx0dGltZWxpbmUuYXBwbHkoc2tlbGV0b24sIDAsIHRpbWUsIG51bGwsIDEsIGZyb21TZXR1cCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RpbWVsaW5lLmJvbmVJbmRleF07XG5cdFx0aWYgKCFib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBib25lLnBvc2UsIHNldHVwID0gYm9uZS5kYXRhLnNldHVwUG9zZTtcblx0XHRjb25zdCBmcmFtZXMgPSB0aW1lbGluZS5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHsgLy8gVGltZSBpcyBiZWZvcmUgZmlyc3QgZnJhbWUuXG5cdFx0XHRpZiAoZnJvbVNldHVwKSBwb3NlLnJvdGF0aW9uID0gc2V0dXAucm90YXRpb247XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHIxID0gZnJvbVNldHVwID8gc2V0dXAucm90YXRpb24gOiBwb3NlLnJvdGF0aW9uO1xuXHRcdGNvbnN0IHIyID0gc2V0dXAucm90YXRpb24gKyB0aW1lbGluZS5nZXRDdXJ2ZVZhbHVlKHRpbWUpO1xuXG5cdFx0Ly8gTWl4IGJldHdlZW4gcm90YXRpb25zIHVzaW5nIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHNob3J0ZXN0IHJvdXRlIG9uIHRoZSBmaXJzdCBmcmFtZSB3aGlsZSBkZXRlY3RpbmcgY3Jvc3Nlcy5cblx0XHRsZXQgdG90YWwgPSAwLCBkaWZmID0gcjIgLSByMTtcblx0XHRkaWZmIC09IE1hdGguY2VpbChkaWZmIC8gMzYwIC0gMC41KSAqIDM2MDtcblx0XHRpZiAoZGlmZiA9PT0gMCkge1xuXHRcdFx0dG90YWwgPSB0aW1lbGluZXNSb3RhdGlvbltpXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGV0IGxhc3RUb3RhbCA9IDAsIGxhc3REaWZmID0gMDtcblx0XHRcdGlmIChmaXJzdEZyYW1lKSB7XG5cdFx0XHRcdGxhc3RUb3RhbCA9IDA7XG5cdFx0XHRcdGxhc3REaWZmID0gZGlmZjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxhc3RUb3RhbCA9IHRpbWVsaW5lc1JvdGF0aW9uW2ldO1xuXHRcdFx0XHRsYXN0RGlmZiA9IHRpbWVsaW5lc1JvdGF0aW9uW2kgKyAxXTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGxvb3BzID0gbGFzdFRvdGFsIC0gbGFzdFRvdGFsICUgMzYwO1xuXHRcdFx0dG90YWwgPSBkaWZmICsgbG9vcHM7XG5cdFx0XHRsZXQgY3VycmVudCA9IGRpZmYgPj0gMCwgZGlyID0gbGFzdFRvdGFsID49IDA7XG5cdFx0XHRpZiAoTWF0aC5hYnMobGFzdERpZmYpIDw9IDkwICYmIE1hdGhVdGlscy5zaWdudW0obGFzdERpZmYpICE9PSBNYXRoVXRpbHMuc2lnbnVtKGRpZmYpKSB7XG5cdFx0XHRcdGlmIChNYXRoLmFicyhsYXN0VG90YWwgLSBsb29wcykgPiAxODApIHtcblx0XHRcdFx0XHR0b3RhbCArPSAzNjAgKiBNYXRoVXRpbHMuc2lnbnVtKGxhc3RUb3RhbCk7XG5cdFx0XHRcdFx0ZGlyID0gY3VycmVudDtcblx0XHRcdFx0fSBlbHNlIGlmIChsb29wcyAhPT0gMClcblx0XHRcdFx0XHR0b3RhbCAtPSAzNjAgKiBNYXRoVXRpbHMuc2lnbnVtKGxhc3RUb3RhbCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRkaXIgPSBjdXJyZW50O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRpciAhPT0gY3VycmVudCkgdG90YWwgKz0gMzYwICogTWF0aFV0aWxzLnNpZ251bShsYXN0VG90YWwpO1xuXHRcdFx0dGltZWxpbmVzUm90YXRpb25baV0gPSB0b3RhbDtcblx0XHR9XG5cdFx0dGltZWxpbmVzUm90YXRpb25baSArIDFdID0gZGlmZjtcblx0XHRwb3NlLnJvdGF0aW9uID0gcjEgKyB0b3RhbCAqIGFscGhhO1xuXHR9XG5cblx0cXVldWVFdmVudHMgKGVudHJ5OiBUcmFja0VudHJ5LCBhbmltYXRpb25UaW1lOiBudW1iZXIpIHtcblx0XHRjb25zdCBhbmltYXRpb25TdGFydCA9IGVudHJ5LmFuaW1hdGlvblN0YXJ0LCBhbmltYXRpb25FbmQgPSBlbnRyeS5hbmltYXRpb25FbmQsIGR1cmF0aW9uID0gYW5pbWF0aW9uRW5kIC0gYW5pbWF0aW9uU3RhcnQ7XG5cdFx0Y29uc3QgcmV2ZXJzZSA9IGVudHJ5LnJldmVyc2U7XG5cdFx0bGV0IHNwbGl0ID0gZW50cnkudHJhY2tMYXN0ICUgZHVyYXRpb247XG5cdFx0aWYgKHJldmVyc2UpIHNwbGl0ID0gZHVyYXRpb24gLSBzcGxpdDtcblxuXHRcdC8vIFF1ZXVlIGV2ZW50cyBiZWZvcmUgY29tcGxldGUuXG5cdFx0Y29uc3QgZXZlbnRzID0gdGhpcy5ldmVudHM7XG5cdFx0bGV0IGkgPSAwLCBuID0gZXZlbnRzLmxlbmd0aDtcblx0XHRmb3IgKDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgZXZlbnQgPSBldmVudHNbaV07XG5cdFx0XHRpZiAoKGV2ZW50LnRpbWUgPCBzcGxpdCkgIT09IHJldmVyc2UpIGJyZWFrOyAvLyBqYXZhOiBpZiAoZXZlbnQudGltZSA8IHNwbGl0IF4gcmV2ZXJzZSkgYnJlYWs7XG5cdFx0XHRpZiAoZXZlbnQudGltZSA+PSBhbmltYXRpb25TdGFydCAmJiBldmVudC50aW1lIDw9IGFuaW1hdGlvbkVuZCkgdGhpcy5xdWV1ZS5ldmVudChlbnRyeSwgZXZlbnQpO1xuXHRcdH1cblxuXHRcdC8vIFF1ZXVlIGNvbXBsZXRlIGlmIGNvbXBsZXRlZCBhIGxvb3AgaXRlcmF0aW9uIG9yIHRoZSBhbmltYXRpb24uXG5cdFx0bGV0IGNvbXBsZXRlID0gZmFsc2U7XG5cdFx0aWYgKGVudHJ5Lmxvb3ApIHtcblx0XHRcdGlmIChkdXJhdGlvbiA9PT0gMClcblx0XHRcdFx0Y29tcGxldGUgPSB0cnVlO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGN5Y2xlcyA9IE1hdGguZmxvb3IoZW50cnkudHJhY2tUaW1lIC8gZHVyYXRpb24pO1xuXHRcdFx0XHRjb21wbGV0ZSA9IGN5Y2xlcyA+IDAgJiYgY3ljbGVzID4gTWF0aC5mbG9vcihlbnRyeS50cmFja0xhc3QgLyBkdXJhdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlXG5cdFx0XHRjb21wbGV0ZSA9IGFuaW1hdGlvblRpbWUgPj0gYW5pbWF0aW9uRW5kICYmIGVudHJ5LmFuaW1hdGlvbkxhc3QgPCBhbmltYXRpb25FbmQ7XG5cdFx0aWYgKGNvbXBsZXRlKSB0aGlzLnF1ZXVlLmNvbXBsZXRlKGVudHJ5KTtcblxuXHRcdC8vIFF1ZXVlIGV2ZW50cyBhZnRlciBjb21wbGV0ZS5cblx0XHRmb3IgKDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgZXZlbnQgPSBldmVudHNbaV07XG5cdFx0XHRpZiAoZXZlbnQudGltZSA+PSBhbmltYXRpb25TdGFydCAmJiBldmVudC50aW1lIDw9IGFuaW1hdGlvbkVuZCkgdGhpcy5xdWV1ZS5ldmVudChlbnRyeSwgZXZlbnQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZXZlbnRzUmV2ZXJzZSAoZW50cnk6IFRyYWNrRW50cnksIGFuaW1hdGlvbkxhc3Q6IG51bWJlciwgYW5pbWF0aW9uVGltZTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSBlbnRyeS5hbmltYXRpb24hLmR1cmF0aW9uLCBmcm9tID0gZHVyYXRpb24gLSBhbmltYXRpb25MYXN0LCB0byA9IGR1cmF0aW9uIC0gYW5pbWF0aW9uVGltZTtcblx0XHRjb25zdCB0aW1lbGluZXMgPSBlbnRyeS5hbmltYXRpb24hLnRpbWVsaW5lcztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGVudHJ5LmFuaW1hdGlvbiEudGltZWxpbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgZXZlbnRUaW1lbGluZSA9IHRpbWVsaW5lc1tpXTtcblx0XHRcdGlmICghKGV2ZW50VGltZWxpbmUgaW5zdGFuY2VvZiBFdmVudFRpbWVsaW5lKSkgY29udGludWU7XG5cdFx0XHRjb25zdCB0aW1lbGluZUV2ZW50cyA9IGV2ZW50VGltZWxpbmUuZXZlbnRzO1xuXHRcdFx0Y29uc3QgZnJhbWVzID0gZXZlbnRUaW1lbGluZS5mcmFtZXM7XG5cdFx0XHRjb25zdCBmcmFtZUNvdW50ID0gZnJhbWVzLmxlbmd0aDtcblx0XHRcdGlmIChmcm9tID49IHRvKSB7IC8vIGZyb20gLT4gdG9cblx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGZyYW1lQ291bnQ7IGlpKyspIHtcblx0XHRcdFx0XHRpZiAoZnJhbWVzW2lpXSA8IHRvKSBjb250aW51ZTtcblx0XHRcdFx0XHRpZiAoZnJhbWVzW2lpXSA+PSBmcm9tKSBicmVhaztcblx0XHRcdFx0XHR0aGlzLmV2ZW50cy5wdXNoKHRpbWVsaW5lRXZlbnRzW2lpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBmcmFtZUNvdW50OyBpaSsrKSB7IC8vIGZyb20gLT4gMFxuXHRcdFx0XHRcdGlmIChmcmFtZXNbaWldID49IGZyb20pIGJyZWFrO1xuXHRcdFx0XHRcdHRoaXMuZXZlbnRzLnB1c2godGltZWxpbmVFdmVudHNbaWldKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgaWkgPSAwOyAvLyBlbmQgLT4gdG9cblx0XHRcdFx0Zm9yICg7IGlpIDwgZnJhbWVDb3VudDsgaWkrKylcblx0XHRcdFx0XHRpZiAoZnJhbWVzW2lpXSA+PSB0bykgYnJlYWs7XG5cdFx0XHRcdGZvciAoOyBpaSA8IGZyYW1lQ291bnQ7IGlpKyspXG5cdFx0XHRcdFx0dGhpcy5ldmVudHMucHVzaCh0aW1lbGluZUV2ZW50c1tpaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBSZW1vdmVzIGFsbCBhbmltYXRpb25zIGZyb20gYWxsIHRyYWNrcywgbGVhdmluZyBza2VsZXRvbnMgaW4gdGhlaXIgY3VycmVudCBwb3NlLlxuXHQgKlxuXHQgKiBVc3VhbGx5IHlvdSB3YW50IHRvIHVzZSB7QGxpbmsgc2V0RW1wdHlBbmltYXRpb25zfSB0byBtaXggdGhlIHNrZWxldG9ucyBiYWNrIHRvIHRoZSBzZXR1cCBwb3NlLCByYXRoZXIgdGhhbiBsZWF2aW5nXG5cdCAqIHRoZW0gaW4gdGhlaXIgY3VycmVudCBwb3NlLiAqL1xuXHRjbGVhclRyYWNrcyAoKSB7XG5cdFx0Y29uc3Qgb2xkRHJhaW5EaXNhYmxlZCA9IHRoaXMucXVldWUuZHJhaW5EaXNhYmxlZDtcblx0XHR0aGlzLnF1ZXVlLmRyYWluRGlzYWJsZWQgPSB0cnVlO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy50cmFja3MubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0dGhpcy5jbGVhclRyYWNrKGkpO1xuXHRcdHRoaXMudHJhY2tzLmxlbmd0aCA9IDA7XG5cdFx0dGhpcy5xdWV1ZS5kcmFpbkRpc2FibGVkID0gb2xkRHJhaW5EaXNhYmxlZDtcblx0XHR0aGlzLnF1ZXVlLmRyYWluKCk7XG5cdH1cblxuXHQvKiogUmVtb3ZlcyBhbGwgYW5pbWF0aW9ucyBmcm9tIHRoZSB0cmFjaywgbGVhdmluZyBza2VsZXRvbnMgaW4gdGhlaXIgY3VycmVudCBwb3NlLlxuXHQgKlxuXHQgKiBVc3VhbGx5IHlvdSB3YW50IHRvIHVzZSB7QGxpbmsgc2V0RW1wdHlBbmltYXRpb259IHRvIG1peCB0aGUgc2tlbGV0b25zIGJhY2sgdG8gdGhlIHNldHVwIHBvc2UsIHJhdGhlciB0aGFuXG5cdCAqIGxlYXZpbmcgdGhlbSBpbiB0aGVpciBjdXJyZW50IHBvc2UuICovXG5cdGNsZWFyVHJhY2sgKHRyYWNrSW5kZXg6IG51bWJlcikge1xuXHRcdGlmICh0cmFja0luZGV4IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwidHJhY2tJbmRleCBtdXN0IGJlID49IDAuXCIpO1xuXHRcdGlmICh0cmFja0luZGV4ID49IHRoaXMudHJhY2tzLmxlbmd0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGN1cnJlbnQgPSB0aGlzLnRyYWNrc1t0cmFja0luZGV4XTtcblx0XHRpZiAoIWN1cnJlbnQpIHJldHVybjtcblxuXHRcdHRoaXMucXVldWUuZW5kKGN1cnJlbnQpO1xuXG5cdFx0dGhpcy5jbGVhck5leHQoY3VycmVudCk7XG5cblx0XHRsZXQgZW50cnkgPSBjdXJyZW50O1xuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHRjb25zdCBmcm9tID0gZW50cnkubWl4aW5nRnJvbTtcblx0XHRcdGlmICghZnJvbSkgYnJlYWs7XG5cdFx0XHR0aGlzLnF1ZXVlLmVuZChmcm9tKTtcblx0XHRcdGVudHJ5Lm1peGluZ0Zyb20gPSBudWxsO1xuXHRcdFx0ZW50cnkubWl4aW5nVG8gPSBudWxsO1xuXHRcdFx0ZW50cnkgPSBmcm9tO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhY2tzW2N1cnJlbnQudHJhY2tJbmRleF0gPSBudWxsO1xuXG5cdFx0dGhpcy5xdWV1ZS5kcmFpbigpO1xuXHR9XG5cblx0c2V0VHJhY2sgKGluZGV4OiBudW1iZXIsIGN1cnJlbnQ6IFRyYWNrRW50cnksIGludGVycnVwdDogYm9vbGVhbikge1xuXHRcdGNvbnN0IGZyb20gPSB0aGlzLmV4cGFuZFRvSW5kZXgoaW5kZXgpO1xuXHRcdHRoaXMudHJhY2tzW2luZGV4XSA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudC5wcmV2aW91cyA9IG51bGw7XG5cblx0XHRpZiAoZnJvbSkge1xuXHRcdFx0ZnJvbS5uZXh0ID0gbnVsbDtcblx0XHRcdGlmIChpbnRlcnJ1cHQpIHRoaXMucXVldWUuaW50ZXJydXB0KGZyb20pO1xuXHRcdFx0Y3VycmVudC5taXhpbmdGcm9tID0gZnJvbTtcblx0XHRcdGZyb20ubWl4aW5nVG8gPSBjdXJyZW50O1xuXHRcdFx0Y3VycmVudC5taXhUaW1lID0gMDtcblxuXHRcdFx0ZnJvbS50aW1lbGluZXNSb3RhdGlvbi5sZW5ndGggPSAwOyAvLyBSZXNldCByb3RhdGlvbiBmb3IgbWl4aW5nIG91dCwgaW4gY2FzZSBlbnRyeSB3YXMgbWl4ZWQgaW4uXG5cdFx0fVxuXG5cdFx0dGhpcy5xdWV1ZS5zdGFydChjdXJyZW50KTtcblx0fVxuXG5cdC8qKiBTZXRzIGFuIGFuaW1hdGlvbiBieSBuYW1lLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIHNldEFuaW1hdGlvbn0uICovXG5cdHNldEFuaW1hdGlvbiAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb25OYW1lOiBzdHJpbmcsIGxvb3A/OiBib29sZWFuKTogVHJhY2tFbnRyeTtcblxuXHQvKiogU2V0cyB0aGUgY3VycmVudCBhbmltYXRpb24gZm9yIGEgdHJhY2ssIGRpc2NhcmRpbmcgYW55IHF1ZXVlZCBhbmltYXRpb25zLlxuXHQgKlxuXHQgKiBJZiB0aGUgZm9ybWVybHkgY3VycmVudCB0cmFjayBlbnRyeSBpcyBmb3IgdGhlIHNhbWUgYW5pbWF0aW9uIGFuZCB3YXMgbmV2ZXIgYXBwbGllZCB0byBhIHNrZWxldG9uLCBpdCBpcyByZXBsYWNlZCAobm90IG1peGVkXG5cdCAqIGZyb20pLlxuXHQgKiBAcGFyYW0gbG9vcCBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgcmVwZWF0LiBJZiBmYWxzZSBpdCB3aWxsIG5vdCwgaW5zdGVhZCBpdHMgbGFzdCBmcmFtZSBpcyBhcHBsaWVkIGlmIHBsYXllZCBiZXlvbmQgaXRzXG5cdCAqICAgICAgICAgICBkdXJhdGlvbi4gSW4gZWl0aGVyIGNhc2Uge0BsaW5rIFRyYWNrRW50cnkudHJhY2tFbmR9IGRldGVybWluZXMgd2hlbiB0aGUgdHJhY2sgaXMgY2xlYXJlZC5cblx0ICogQHJldHVybiBBIHRyYWNrIGVudHJ5IHRvIGFsbG93IGZ1cnRoZXIgY3VzdG9taXphdGlvbiBvZiBhbmltYXRpb24gcGxheWJhY2suIFJlZmVyZW5jZXMgdG8gdGhlIHRyYWNrIGVudHJ5IG11c3Qgbm90IGJlIGtlcHRcblx0ICogICAgICAgICBhZnRlciB0aGUge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuZGlzcG9zZX0gZXZlbnQgb2NjdXJzLiAqL1xuXHRzZXRBbmltYXRpb24gKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uOiBBbmltYXRpb24sIGxvb3A/OiBib29sZWFuKTogVHJhY2tFbnRyeTtcblxuXHRzZXRBbmltYXRpb24gKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uTmFtZU9yQW5pbWF0aW9uOiBzdHJpbmcgfCBBbmltYXRpb24sIGxvb3AgPSBmYWxzZSk6IFRyYWNrRW50cnkge1xuXHRcdGlmICh0eXBlb2YgYW5pbWF0aW9uTmFtZU9yQW5pbWF0aW9uID09PSBcInN0cmluZ1wiKVxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0QW5pbWF0aW9uMSh0cmFja0luZGV4LCBhbmltYXRpb25OYW1lT3JBbmltYXRpb24sIGxvb3ApO1xuXHRcdHJldHVybiB0aGlzLnNldEFuaW1hdGlvbjIodHJhY2tJbmRleCwgYW5pbWF0aW9uTmFtZU9yQW5pbWF0aW9uLCBsb29wKTtcblx0fVxuXG5cdHByaXZhdGUgc2V0QW5pbWF0aW9uMSAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb25OYW1lOiBzdHJpbmcsIGxvb3A6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuZGF0YS5za2VsZXRvbkRhdGEuZmluZEFuaW1hdGlvbihhbmltYXRpb25OYW1lKTtcblx0XHRpZiAoIWFuaW1hdGlvbikgdGhyb3cgbmV3IEVycm9yKGBBbmltYXRpb24gbm90IGZvdW5kOiAke2FuaW1hdGlvbk5hbWV9YCk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0QW5pbWF0aW9uMih0cmFja0luZGV4LCBhbmltYXRpb24sIGxvb3ApO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGZvciBhIHRyYWNrLCBkaXNjYXJkaW5nIGFueSBxdWV1ZWQgYW5pbWF0aW9ucy5cblx0ICpcblx0ICogSWYgdGhlIGZvcm1lcmx5IGN1cnJlbnQgdHJhY2sgZW50cnkgaXMgZm9yIHRoZSBzYW1lIGFuaW1hdGlvbiBhbmQgd2FzIG5ldmVyIGFwcGxpZWQgdG8gYSBza2VsZXRvbiwgaXQgaXMgcmVwbGFjZWQgKG5vdCBtaXhlZFxuXHQgKiBmcm9tKS5cblx0ICogQHBhcmFtIGxvb3AgSWYgdHJ1ZSwgdGhlIGFuaW1hdGlvbiB3aWxsIHJlcGVhdC4gSWYgZmFsc2UgaXQgd2lsbCBub3QsIGluc3RlYWQgaXRzIGxhc3QgZnJhbWUgaXMgYXBwbGllZCBpZiBwbGF5ZWQgYmV5b25kIGl0c1xuXHQgKiAgICAgICAgICAgZHVyYXRpb24uIEluIGVpdGhlciBjYXNlIHtAbGluayBUcmFja0VudHJ5LmdldFRyYWNrRW5kfSBkZXRlcm1pbmVzIHdoZW4gdGhlIHRyYWNrIGlzIGNsZWFyZWQuXG5cdCAqIEByZXR1cm4gQSB0cmFjayBlbnRyeSB0byBhbGxvdyBmdXJ0aGVyIGN1c3RvbWl6YXRpb24gb2YgYW5pbWF0aW9uIHBsYXliYWNrLiBSZWZlcmVuY2VzIHRvIHRoZSB0cmFjayBlbnRyeSBtdXN0IG5vdCBiZSBrZXB0XG5cdCAqICAgICAgICAgYWZ0ZXIgdGhlIHtAbGluayBBbmltYXRpb25TdGF0ZUxpc3RlbmVyLmRpc3Bvc2V9IGV2ZW50IG9jY3Vycy4gKi9cblx0cHJpdmF0ZSBzZXRBbmltYXRpb24yICh0cmFja0luZGV4OiBudW1iZXIsIGFuaW1hdGlvbjogQW5pbWF0aW9uLCBsb29wOiBib29sZWFuID0gZmFsc2UpIHtcblx0XHRpZiAodHJhY2tJbmRleCA8IDApIHRocm93IG5ldyBFcnJvcihcInRyYWNrSW5kZXggbXVzdCBiZSA+PSAwLlwiKTtcblx0XHRpZiAoIWFuaW1hdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiYW5pbWF0aW9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRsZXQgaW50ZXJydXB0ID0gdHJ1ZTtcblx0XHRsZXQgY3VycmVudCA9IHRoaXMuZXhwYW5kVG9JbmRleCh0cmFja0luZGV4KTtcblx0XHRpZiAoY3VycmVudCkge1xuXHRcdFx0aWYgKGN1cnJlbnQubmV4dFRyYWNrTGFzdCA9PT0gLTEgJiYgY3VycmVudC5hbmltYXRpb24gPT09IGFuaW1hdGlvbikge1xuXHRcdFx0XHQvLyBEb24ndCBtaXggZnJvbSBhbiBlbnRyeSB0aGF0IHdhcyBuZXZlciBhcHBsaWVkLlxuXHRcdFx0XHR0aGlzLnRyYWNrc1t0cmFja0luZGV4XSA9IGN1cnJlbnQubWl4aW5nRnJvbTtcblx0XHRcdFx0dGhpcy5xdWV1ZS5pbnRlcnJ1cHQoY3VycmVudCk7XG5cdFx0XHRcdHRoaXMucXVldWUuZW5kKGN1cnJlbnQpO1xuXHRcdFx0XHR0aGlzLmNsZWFyTmV4dChjdXJyZW50KTtcblx0XHRcdFx0Y3VycmVudCA9IGN1cnJlbnQubWl4aW5nRnJvbTtcblx0XHRcdFx0aW50ZXJydXB0ID0gZmFsc2U7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0dGhpcy5jbGVhck5leHQoY3VycmVudCk7XG5cdFx0fVxuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy50cmFja0VudHJ5KHRyYWNrSW5kZXgsIGFuaW1hdGlvbiwgbG9vcCwgY3VycmVudCk7XG5cdFx0dGhpcy5zZXRUcmFjayh0cmFja0luZGV4LCBlbnRyeSwgaW50ZXJydXB0KTtcblx0XHR0aGlzLnF1ZXVlLmRyYWluKCk7XG5cdFx0cmV0dXJuIGVudHJ5O1xuXHR9XG5cblx0LyoqIFF1ZXVlcyBhbiBhbmltYXRpb24gYnkgbmFtZS5cblx0ICpcblx0ICogU2VlIHtAbGluayBhZGRBbmltYXRpb259LiAqL1xuXHRhZGRBbmltYXRpb24gKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uTmFtZTogc3RyaW5nLCBsb29wPzogYm9vbGVhbiwgZGVsYXk/OiBudW1iZXIpOiBUcmFja0VudHJ5O1xuXG5cdC8qKiBBZGRzIGFuIGFuaW1hdGlvbiB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgb3IgbGFzdCBxdWV1ZWQgYW5pbWF0aW9uIGZvciBhIHRyYWNrLiBJZiB0aGUgdHJhY2sgaGFzIG5vIGVudHJpZXMsIHRoaXMgaXNcblx0ICogZXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBzZXRBbmltYXRpb259LlxuXHQgKiBAcGFyYW0gZGVsYXkgSWYgPiAwLCBzZXRzIHtAbGluayBUcmFja0VudHJ5LmRlbGF5fS4gSWYgPD0gMCwgdGhlIGRlbGF5IHNldCBpcyB0aGUgZHVyYXRpb24gb2YgdGhlIHByZXZpb3VzIHRyYWNrIGVudHJ5XG5cdCAqICAgICAgICAgICBtaW51cyBhbnkgbWl4IGR1cmF0aW9uIChmcm9tIHtAbGluayBkYXRhfSkgcGx1cyB0aGUgc3BlY2lmaWVkIGBkZWxheWAgKGllIHRoZSBtaXggZW5kcyBhdCAod2hlblxuXHQgKiAgICAgICAgICAgYGRlbGF5YCA9IDApIG9yIGJlZm9yZSAod2hlbiBgZGVsYXlgIDwgMCkgdGhlIHByZXZpb3VzIHRyYWNrIGVudHJ5IGR1cmF0aW9uKS4gSWYgdGhlXG5cdCAqICAgICAgICAgICBwcmV2aW91cyBlbnRyeSBpcyBsb29waW5nLCBpdHMgbmV4dCBsb29wIGNvbXBsZXRpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGl0cyBkdXJhdGlvbi5cblx0ICogQHJldHVybiBBIHRyYWNrIGVudHJ5IHRvIGFsbG93IGZ1cnRoZXIgY3VzdG9taXphdGlvbiBvZiBhbmltYXRpb24gcGxheWJhY2suIFJlZmVyZW5jZXMgdG8gdGhlIHRyYWNrIGVudHJ5IG11c3Qgbm90IGJlIGtlcHRcblx0ICogICAgICAgICBhZnRlciB0aGUge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuZGlzcG9zZX0gZXZlbnQgb2NjdXJzLiAqL1xuXHRhZGRBbmltYXRpb24gKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uOiBBbmltYXRpb24sIGxvb3A/OiBib29sZWFuLCBkZWxheT86IG51bWJlcik6IFRyYWNrRW50cnk7XG5cblx0YWRkQW5pbWF0aW9uICh0cmFja0luZGV4OiBudW1iZXIsIGFuaW1hdGlvbk5hbWVPckFuaW1hdGlvbjogc3RyaW5nIHwgQW5pbWF0aW9uLCBsb29wID0gZmFsc2UsIGRlbGF5OiBudW1iZXIgPSAwKTogVHJhY2tFbnRyeSB7XG5cdFx0aWYgKHR5cGVvZiBhbmltYXRpb25OYW1lT3JBbmltYXRpb24gPT09IFwic3RyaW5nXCIpXG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRBbmltYXRpb24xKHRyYWNrSW5kZXgsIGFuaW1hdGlvbk5hbWVPckFuaW1hdGlvbiwgbG9vcCwgZGVsYXkpO1xuXHRcdHJldHVybiB0aGlzLmFkZEFuaW1hdGlvbjIodHJhY2tJbmRleCwgYW5pbWF0aW9uTmFtZU9yQW5pbWF0aW9uLCBsb29wLCBkZWxheSk7XG5cdH1cblxuXHRwcml2YXRlIGFkZEFuaW1hdGlvbjEgKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uTmFtZTogc3RyaW5nLCBsb29wOiBib29sZWFuID0gZmFsc2UsIGRlbGF5OiBudW1iZXIgPSAwKSB7XG5cdFx0Y29uc3QgYW5pbWF0aW9uID0gdGhpcy5kYXRhLnNrZWxldG9uRGF0YS5maW5kQW5pbWF0aW9uKGFuaW1hdGlvbk5hbWUpO1xuXHRcdGlmICghYW5pbWF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYEFuaW1hdGlvbiBub3QgZm91bmQ6ICR7YW5pbWF0aW9uTmFtZX1gKTtcblx0XHRyZXR1cm4gdGhpcy5hZGRBbmltYXRpb24yKHRyYWNrSW5kZXgsIGFuaW1hdGlvbiwgbG9vcCwgZGVsYXkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRBbmltYXRpb24yICh0cmFja0luZGV4OiBudW1iZXIsIGFuaW1hdGlvbjogQW5pbWF0aW9uLCBsb29wOiBib29sZWFuID0gZmFsc2UsIGRlbGF5OiBudW1iZXIgPSAwKSB7XG5cdFx0aWYgKHRyYWNrSW5kZXggPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFja0luZGV4IG11c3QgYmUgPj0gMC5cIik7XG5cdFx0aWYgKCFhbmltYXRpb24pIHRocm93IG5ldyBFcnJvcihcImFuaW1hdGlvbiBjYW5ub3QgYmUgbnVsbC5cIik7XG5cblx0XHRsZXQgbGFzdCA9IHRoaXMuZXhwYW5kVG9JbmRleCh0cmFja0luZGV4KTtcblx0XHRpZiAobGFzdCkge1xuXHRcdFx0d2hpbGUgKGxhc3QubmV4dClcblx0XHRcdFx0bGFzdCA9IGxhc3QubmV4dDtcblx0XHR9XG5cblx0XHRjb25zdCBlbnRyeSA9IHRoaXMudHJhY2tFbnRyeSh0cmFja0luZGV4LCBhbmltYXRpb24sIGxvb3AsIGxhc3QpO1xuXG5cdFx0aWYgKCFsYXN0KSB7XG5cdFx0XHR0aGlzLnNldFRyYWNrKHRyYWNrSW5kZXgsIGVudHJ5LCB0cnVlKTtcblx0XHRcdHRoaXMucXVldWUuZHJhaW4oKTtcblx0XHRcdGlmIChkZWxheSA8IDApIGRlbGF5ID0gMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGFzdC5uZXh0ID0gZW50cnk7XG5cdFx0XHRlbnRyeS5wcmV2aW91cyA9IGxhc3Q7XG5cdFx0XHRpZiAoZGVsYXkgPD0gMCkgZGVsYXkgPSBNYXRoLm1heChkZWxheSArIGxhc3QuZ2V0VHJhY2tDb21wbGV0ZSgpIC0gZW50cnkubWl4RHVyYXRpb24sIDApO1xuXHRcdH1cblxuXHRcdGVudHJ5LmRlbGF5ID0gZGVsYXk7XG5cdFx0cmV0dXJuIGVudHJ5O1xuXHR9XG5cblx0LyoqIFNldHMgYW4gZW1wdHkgYW5pbWF0aW9uIGZvciBhIHRyYWNrLCBkaXNjYXJkaW5nIGFueSBxdWV1ZWQgYW5pbWF0aW9ucywgYW5kIHNldHMgdGhlIHRyYWNrIGVudHJ5J3Ncblx0ICoge0BsaW5rIFRyYWNrRW50cnkubWl4ZHVyYXRpb259LiBBbiBlbXB0eSBhbmltYXRpb24gaGFzIG5vIHRpbWVsaW5lcyBhbmQgc2VydmVzIGFzIGEgcGxhY2Vob2xkZXIgZm9yIG1peGluZyBpbiBvciBvdXQuXG5cdCAqXG5cdCAqIE1peGluZyBvdXQgaXMgZG9uZSBieSBzZXR0aW5nIGFuIGVtcHR5IGFuaW1hdGlvbiB3aXRoIGEgbWl4IGR1cmF0aW9uIHVzaW5nIGVpdGhlciB7QGxpbmsgc2V0RW1wdHlBbmltYXRpb259LFxuXHQgKiB7QGxpbmsgc2V0RW1wdHlBbmltYXRpb25zfSwgb3Ige0BsaW5rIGFkZEVtcHR5QW5pbWF0aW9ufS4gTWl4aW5nIHRvIGFuIGVtcHR5IGFuaW1hdGlvbiBjYXVzZXNcblx0ICogdGhlIHByZXZpb3VzIGFuaW1hdGlvbiB0byBiZSBhcHBsaWVkIGxlc3MgYW5kIGxlc3Mgb3ZlciB0aGUgbWl4IGR1cmF0aW9uLiBQcm9wZXJ0aWVzIGtleWVkIGluIHRoZSBwcmV2aW91cyBhbmltYXRpb25cblx0ICogdHJhbnNpdGlvbiB0byB0aGUgdmFsdWUgZnJvbSBsb3dlciB0cmFja3Mgb3IgdG8gdGhlIHNldHVwIHBvc2UgdmFsdWUgaWYgbm8gbG93ZXIgdHJhY2tzIGtleSB0aGUgcHJvcGVydHkuIEEgbWl4IGR1cmF0aW9uIG9mXG5cdCAqIDAgc3RpbGwgbmVlZHMgdG8gYmUgYXBwbGllZCBvbmUgbW9yZSB0aW1lIHRvIG1peCBvdXQsIHNvIHRoZSBwcm9wZXJ0aWVzIGl0IHdhcyBhbmltYXRpbmcgYXJlIHJldmVydGVkLlxuXHQgKlxuXHQgKiBNaXhpbmcgaW4gaXMgZG9uZSBieSBmaXJzdCBzZXR0aW5nIGFuIGVtcHR5IGFuaW1hdGlvbiwgdGhlbiBhZGRpbmcgYW4gYW5pbWF0aW9uIHVzaW5nXG5cdCAqIHtAbGluayBhZGRBbmltYXRpb259IHdpdGggdGhlIGRlc2lyZWQgZGVsYXkgKGFuIGVtcHR5IGFuaW1hdGlvbiBoYXMgYSBkdXJhdGlvbiBvZiAwKSBhbmQgb25cblx0ICogdGhlIHJldHVybmVkIHRyYWNrIGVudHJ5LCBzZXQgdGhlIHtAbGluayBUcmFja0VudHJ5LnNldE1peER1cmF0aW9ufS4gTWl4aW5nIGZyb20gYW4gZW1wdHkgYW5pbWF0aW9uIGNhdXNlcyB0aGUgbmV3XG5cdCAqIGFuaW1hdGlvbiB0byBiZSBhcHBsaWVkIG1vcmUgYW5kIG1vcmUgb3ZlciB0aGUgbWl4IGR1cmF0aW9uLiBQcm9wZXJ0aWVzIGtleWVkIGluIHRoZSBuZXcgYW5pbWF0aW9uIHRyYW5zaXRpb24gZnJvbSB0aGUgdmFsdWVcblx0ICogZnJvbSBsb3dlciB0cmFja3Mgb3IgZnJvbSB0aGUgc2V0dXAgcG9zZSB2YWx1ZSBpZiBubyBsb3dlciB0cmFja3Mga2V5IHRoZSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUga2V5ZWQgaW4gdGhlIG5ldyBhbmltYXRpb24uXG5cdCAqXG5cdCAqIFNlZSA8YSBocmVmPSdodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWFwcGx5aW5nLWFuaW1hdGlvbnMjRW1wdHktYW5pbWF0aW9ucyc+RW1wdHkgYW5pbWF0aW9uczwvYT4gaW4gdGhlIFNwaW5lXG5cdCAqIFJ1bnRpbWVzIEd1aWRlLiAqL1xuXHRzZXRFbXB0eUFuaW1hdGlvbiAodHJhY2tJbmRleDogbnVtYmVyLCBtaXhEdXJhdGlvbjogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy5zZXRBbmltYXRpb24odHJhY2tJbmRleCwgQW5pbWF0aW9uU3RhdGUuZW1wdHlBbmltYXRpb24sIGZhbHNlKTtcblx0XHRlbnRyeS5taXhEdXJhdGlvbiA9IG1peER1cmF0aW9uO1xuXHRcdGVudHJ5LnRyYWNrRW5kID0gbWl4RHVyYXRpb247XG5cdFx0cmV0dXJuIGVudHJ5O1xuXHR9XG5cblx0LyoqIEFkZHMgYW4gZW1wdHkgYW5pbWF0aW9uIHRvIGJlIHBsYXllZCBhZnRlciB0aGUgY3VycmVudCBvciBsYXN0IHF1ZXVlZCBhbmltYXRpb24gZm9yIGEgdHJhY2ssIGFuZCBzZXRzIHRoZSB0cmFjayBlbnRyeSdzXG5cdCAqIHtAbGluayBUcmFja0VudHJ5Lm1peER1cmF0aW9ufS4gSWYgdGhlIHRyYWNrIGhhcyBubyBlbnRyaWVzLCBpdCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmdcblx0ICoge0BsaW5rIHNldEVtcHR5QW5pbWF0aW9ufS5cblx0ICpcblx0ICogU2VlIHtAbGluayBzZXRFbXB0eUFuaW1hdGlvbn0gYW5kXG5cdCAqIDxhIGhyZWY9J2h0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtYXBwbHlpbmctYW5pbWF0aW9ucyNFbXB0eS1hbmltYXRpb25zJz5FbXB0eSBhbmltYXRpb25zPC9hPiBpbiB0aGUgU3BpbmUgUnVudGltZXNcblx0ICogR3VpZGUuXG5cdCAqIEBwYXJhbSBkZWxheSBJZiA+IDAsIHNldHMge0BsaW5rIFRyYWNrRW50cnkuZGVsYXl9LiBJZiA8PSAwLCB0aGUgZGVsYXkgc2V0IGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnkgbWludXNcblx0ICogICAgICAgICAgIGFueSBtaXggZHVyYXRpb24gcGx1cyB0aGUgc3BlY2lmaWVkIGBkZWxheWAgKGllIHRoZSBtaXggZW5kcyBhdCAod2hlbiBgZGVsYXlgID0gMCkgb3IgYmVmb3JlXG5cdCAqICAgICAgICAgICAod2hlbiBgZGVsYXlgIDwgMCkgdGhlIHByZXZpb3VzIHRyYWNrIGVudHJ5IGR1cmF0aW9uKS4gSWYgdGhlIHByZXZpb3VzIGVudHJ5IGlzIGxvb3BpbmcsIGl0cyBuZXh0IGxvb3Bcblx0ICogICAgICAgICAgIGNvbXBsZXRpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGl0cyBkdXJhdGlvbi5cblx0ICogQHJldHVybiBBIHRyYWNrIGVudHJ5IHRvIGFsbG93IGZ1cnRoZXIgY3VzdG9taXphdGlvbiBvZiBhbmltYXRpb24gcGxheWJhY2suIFJlZmVyZW5jZXMgdG8gdGhlIHRyYWNrIGVudHJ5IG11c3Qgbm90IGJlIGtlcHRcblx0ICogICAgICAgICBhZnRlciB0aGUge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuZGlzcG9zZX0gZXZlbnQgb2NjdXJzLiAqL1xuXHRhZGRFbXB0eUFuaW1hdGlvbiAodHJhY2tJbmRleDogbnVtYmVyLCBtaXhEdXJhdGlvbjogbnVtYmVyID0gMCwgZGVsYXk6IG51bWJlciA9IDApIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuYWRkQW5pbWF0aW9uKHRyYWNrSW5kZXgsIEFuaW1hdGlvblN0YXRlLmVtcHR5QW5pbWF0aW9uLCBmYWxzZSwgZGVsYXkpO1xuXHRcdGlmIChkZWxheSA8PSAwKSBlbnRyeS5kZWxheSA9IE1hdGgubWF4KGVudHJ5LmRlbGF5ICsgZW50cnkubWl4RHVyYXRpb24gLSBtaXhEdXJhdGlvbiwgMCk7XG5cdFx0ZW50cnkubWl4RHVyYXRpb24gPSBtaXhEdXJhdGlvbjtcblx0XHRlbnRyeS50cmFja0VuZCA9IG1peER1cmF0aW9uO1xuXHRcdHJldHVybiBlbnRyeTtcblx0fVxuXG5cdC8qKiBTZXRzIGFuIGVtcHR5IGFuaW1hdGlvbiBmb3IgZXZlcnkgdHJhY2ssIGRpc2NhcmRpbmcgYW55IHF1ZXVlZCBhbmltYXRpb25zLCBhbmQgbWl4ZXMgdG8gaXQgb3ZlciB0aGUgc3BlY2lmaWVkIG1peCBkdXJhdGlvbi5cblx0ICpcblx0ICogU2VlIDxhIGhyZWY9J2h0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtYXBwbHlpbmctYW5pbWF0aW9ucyNFbXB0eS1hbmltYXRpb25zJz5FbXB0eSBhbmltYXRpb25zPC9hPiBpbiB0aGUgU3BpbmVcblx0ICogUnVudGltZXMgR3VpZGUuICovXG5cdHNldEVtcHR5QW5pbWF0aW9ucyAobWl4RHVyYXRpb246IG51bWJlciA9IDApIHtcblx0XHRjb25zdCBvbGREcmFpbkRpc2FibGVkID0gdGhpcy5xdWV1ZS5kcmFpbkRpc2FibGVkO1xuXHRcdHRoaXMucXVldWUuZHJhaW5EaXNhYmxlZCA9IHRydWU7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGN1cnJlbnQgPSB0aGlzLnRyYWNrc1tpXTtcblx0XHRcdGlmIChjdXJyZW50KSB0aGlzLnNldEVtcHR5QW5pbWF0aW9uKGN1cnJlbnQudHJhY2tJbmRleCwgbWl4RHVyYXRpb24pO1xuXHRcdH1cblx0XHR0aGlzLnF1ZXVlLmRyYWluRGlzYWJsZWQgPSBvbGREcmFpbkRpc2FibGVkO1xuXHRcdHRoaXMucXVldWUuZHJhaW4oKTtcblx0fVxuXG5cdGV4cGFuZFRvSW5kZXggKGluZGV4OiBudW1iZXIpIHtcblx0XHRpZiAoaW5kZXggPCB0aGlzLnRyYWNrcy5sZW5ndGgpIHJldHVybiB0aGlzLnRyYWNrc1tpbmRleF07XG5cdFx0VXRpbHMuZW5zdXJlQXJyYXlDYXBhY2l0eSh0aGlzLnRyYWNrcywgaW5kZXggKyAxLCBudWxsKTtcblx0XHR0aGlzLnRyYWNrcy5sZW5ndGggPSBpbmRleCArIDE7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogQHBhcmFtIGxhc3QgTWF5IGJlIG51bGwuICovXG5cdHRyYWNrRW50cnkgKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uOiBBbmltYXRpb24sIGxvb3A6IGJvb2xlYW4sIGxhc3Q6IFRyYWNrRW50cnkgfCBudWxsKSB7XG5cdFx0Y29uc3QgZW50cnkgPSB0aGlzLnRyYWNrRW50cnlQb29sLm9idGFpbigpO1xuXHRcdGVudHJ5LnJlc2V0KCk7XG5cdFx0ZW50cnkudHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7XG5cdFx0ZW50cnkuYW5pbWF0aW9uID0gYW5pbWF0aW9uO1xuXHRcdGVudHJ5Lmxvb3AgPSBsb29wO1xuXG5cdFx0ZW50cnkuYWRkaXRpdmUgPSBmYWxzZTtcblx0XHRlbnRyeS5yZXZlcnNlID0gZmFsc2U7XG5cdFx0ZW50cnkuc2hvcnRlc3RSb3RhdGlvbiA9IGZhbHNlO1xuXG5cdFx0ZW50cnkuZXZlbnRUaHJlc2hvbGQgPSAwO1xuXHRcdGVudHJ5LmFscGhhQXR0YWNobWVudFRocmVzaG9sZCA9IDA7XG5cdFx0ZW50cnkubWl4QXR0YWNobWVudFRocmVzaG9sZCA9IDA7XG5cdFx0ZW50cnkubWl4RHJhd09yZGVyVGhyZXNob2xkID0gMDtcblxuXHRcdGVudHJ5LmFuaW1hdGlvblN0YXJ0ID0gMDtcblx0XHRlbnRyeS5hbmltYXRpb25FbmQgPSBhbmltYXRpb24uZHVyYXRpb247XG5cdFx0ZW50cnkuYW5pbWF0aW9uTGFzdCA9IC0xO1xuXHRcdGVudHJ5Lm5leHRBbmltYXRpb25MYXN0ID0gLTE7XG5cblx0XHRlbnRyeS5kZWxheSA9IDA7XG5cdFx0ZW50cnkudHJhY2tUaW1lID0gMDtcblx0XHRlbnRyeS50cmFja0xhc3QgPSAtMTtcblx0XHRlbnRyeS5uZXh0VHJhY2tMYXN0ID0gLTE7XG5cdFx0ZW50cnkudHJhY2tFbmQgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXHRcdGVudHJ5LnRpbWVTY2FsZSA9IDE7XG5cblx0XHRlbnRyeS5hbHBoYSA9IDE7XG5cdFx0ZW50cnkubWl4VGltZSA9IDA7XG5cdFx0ZW50cnkubWl4RHVyYXRpb24gPSAhbGFzdCA/IDAgOiB0aGlzLmRhdGEuZ2V0TWl4KGxhc3QuYW5pbWF0aW9uISwgYW5pbWF0aW9uKTtcblx0XHRlbnRyeS50b3RhbEFscGhhID0gMDtcblx0XHRlbnRyeS5rZWVwSG9sZCA9IGZhbHNlO1xuXHRcdHJldHVybiBlbnRyeTtcblx0fVxuXG5cdC8qKiBSZW1vdmVzIHtAbGluayBUcmFja0VudHJ5Lm5leHR9IGFuZCBhbGwgZW50cmllcyBhZnRlciBpdCBmb3IgdGhlIHNwZWNpZmllZCBlbnRyeS4gKi9cblx0Y2xlYXJOZXh0IChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHRcdGxldCBuZXh0ID0gZW50cnkubmV4dDtcblx0XHR3aGlsZSAobmV4dCkge1xuXHRcdFx0dGhpcy5xdWV1ZS5kaXNwb3NlKG5leHQpO1xuXHRcdFx0bmV4dCA9IG5leHQubmV4dDtcblx0XHR9XG5cdFx0ZW50cnkubmV4dCA9IG51bGw7XG5cdH1cblxuXHRfYW5pbWF0aW9uc0NoYW5nZWQgKCkge1xuXHRcdHRoaXMuYW5pbWF0aW9uc0NoYW5nZWQgPSBmYWxzZTtcblxuXHRcdGNvbnN0IHRyYWNrcyA9IHRoaXMudHJhY2tzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0bGV0IGVudHJ5ID0gdHJhY2tzW2ldO1xuXHRcdFx0aWYgKCFlbnRyeSkgY29udGludWU7XG5cdFx0XHR3aGlsZSAoZW50cnkubWl4aW5nRnJvbSlcblx0XHRcdFx0ZW50cnkgPSBlbnRyeS5taXhpbmdGcm9tO1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLmNvbXB1dGVIb2xkKGVudHJ5KTtcblx0XHRcdFx0ZW50cnkgPSBlbnRyeS5taXhpbmdUbztcblx0XHRcdH0gd2hpbGUgKGVudHJ5KTtcblx0XHR9XG5cdFx0dGhpcy5wcm9wZXJ0eUlkcy5jbGVhcigpO1xuXHR9XG5cblx0Y29tcHV0ZUhvbGQgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdFx0Y29uc3QgdGltZWxpbmVzID0gZW50cnkuYW5pbWF0aW9uIS50aW1lbGluZXM7XG5cdFx0Y29uc3QgdGltZWxpbmVzQ291bnQgPSBlbnRyeS5hbmltYXRpb24hLnRpbWVsaW5lcy5sZW5ndGg7XG5cdFx0Y29uc3QgdGltZWxpbmVNb2RlID0gZW50cnkudGltZWxpbmVNb2RlO1xuXHRcdHRpbWVsaW5lTW9kZS5sZW5ndGggPSB0aW1lbGluZXNDb3VudDtcblx0XHRjb25zdCB0aW1lbGluZUhvbGRNaXggPSBlbnRyeS50aW1lbGluZUhvbGRNaXg7XG5cdFx0dGltZWxpbmVIb2xkTWl4Lmxlbmd0aCA9IDA7XG5cdFx0Y29uc3QgcHJvcGVydHlJZHMgPSB0aGlzLnByb3BlcnR5SWRzO1xuXHRcdGNvbnN0IGFkZCA9IGVudHJ5LmFkZGl0aXZlLCBrZWVwSG9sZCA9IGVudHJ5LmtlZXBIb2xkO1xuXHRcdGNvbnN0IHRvID0gZW50cnkubWl4aW5nVG87XG5cblx0XHRvdXRlcjpcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVsaW5lc0NvdW50OyBpKyspIHtcblx0XHRcdGNvbnN0IHRpbWVsaW5lID0gdGltZWxpbmVzW2ldO1xuXHRcdFx0Y29uc3QgaWRzID0gdGltZWxpbmUucHJvcGVydHlJZHM7XG5cdFx0XHRjb25zdCBmaXJzdCA9IHByb3BlcnR5SWRzLmFkZEFsbChpZHMpXG5cdFx0XHRcdCYmICEodGltZWxpbmUgaW5zdGFuY2VvZiBEcmF3T3JkZXJGb2xkZXJUaW1lbGluZSAmJiBwcm9wZXJ0eUlkcy5jb250YWlucyhEcmF3T3JkZXJUaW1lbGluZS5wcm9wZXJ0eUlEKSk7XG5cblx0XHRcdGlmIChhZGQgJiYgdGltZWxpbmUuYWRkaXRpdmUpIHtcblx0XHRcdFx0dGltZWxpbmVNb2RlW2ldID0gZmlyc3QgPyBGSVJTVCA6IFNVQlNFUVVFTlQ7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBmcm9tID0gZW50cnkubWl4aW5nRnJvbTsgZnJvbSAhPSBudWxsOyBmcm9tID0gZnJvbS5taXhpbmdGcm9tKSB7XG5cdFx0XHRcdGlmIChmcm9tLmFuaW1hdGlvbiEuaGFzVGltZWxpbmUoaWRzKSkge1xuXHRcdFx0XHRcdC8vIEFuIGVhcmxpZXIgZW50cnkgb24gdGhpcyB0cmFjayBrZXlzIHRoaXMgcHJvcGVydHksIGlzb2xhdGluZyBpdCBmcm9tIGxvd2VyIHRyYWNrcy5cblx0XHRcdFx0XHR0aW1lbGluZU1vZGVbaV0gPSBTVUJTRVFVRU5UO1xuXHRcdFx0XHRcdGNvbnRpbnVlIG91dGVyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvbGQgaWYgdGhlIG5leHQgZW50cnkgd2lsbCBvdmVyd3JpdGUgdGhpcyBwcm9wZXJ0eS5cblx0XHRcdGxldCBtb2RlOiBudW1iZXI7XG5cdFx0XHRpZiAodG8gPT09IG51bGwgfHwgdGltZWxpbmUuaW5zdGFudCB8fCAodG8uYWRkaXRpdmUgJiYgdGltZWxpbmUuYWRkaXRpdmUpIHx8ICF0by5hbmltYXRpb24/Lmhhc1RpbWVsaW5lKGlkcykpXG5cdFx0XHRcdG1vZGUgPSBmaXJzdCA/IEZJUlNUIDogU1VCU0VRVUVOVDtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtb2RlID0gZmlyc3QgPyBIT0xEX0ZJUlNUIDogSE9MRDtcblx0XHRcdFx0Ly8gRmluZCBuZXh0IGVudHJ5IHRoYXQgZG9lc24ndCBvdmVyd3JpdGUgdGhpcyBwcm9wZXJ0eS4gSXRzIG1peCBmYWRlcyBvdXQgdGhlIGhvbGQsIGluc3RlYWQgb2YgaXQgZW5kaW5nIGFicnVwdGx5LlxuXHRcdFx0XHRmb3IgKGxldCBuZXh0ID0gdG8ubWl4aW5nVG87IG5leHQgIT0gbnVsbDsgbmV4dCA9IG5leHQubWl4aW5nVG8pIHtcblx0XHRcdFx0XHRpZiAoKG5leHQuYWRkaXRpdmUgJiYgdGltZWxpbmUuYWRkaXRpdmUpIHx8ICFuZXh0LmFuaW1hdGlvbj8uaGFzVGltZWxpbmUoaWRzKSkge1xuXHRcdFx0XHRcdFx0aWYgKG5leHQubWl4RHVyYXRpb24gPiAwKSB0aW1lbGluZUhvbGRNaXhbaV0gPSBuZXh0O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoa2VlcEhvbGQpIG1vZGUgPSAobW9kZSAmIH5IT0xEKSB8ICh0aW1lbGluZU1vZGVbaV0gJiBIT0xEKTtcblx0XHRcdHRpbWVsaW5lTW9kZVtpXSA9IG1vZGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIHRyYWNrIGVudHJ5IGZvciB0aGUgYW5pbWF0aW9uIGN1cnJlbnRseSBwbGF5aW5nIG9uIHRoZSB0cmFjaywgb3IgbnVsbCBpZiBubyBhbmltYXRpb24gaXMgY3VycmVudGx5IHBsYXlpbmcuICovXG5cdGdldFRyYWNrICh0cmFja0luZGV4OiBudW1iZXIpIHtcblx0XHRpZiAodHJhY2tJbmRleCA8IDApIHRocm93IG5ldyBFcnJvcihcInRyYWNrSW5kZXggbXVzdCBiZSA+PSAwLlwiKTtcblx0XHRpZiAodHJhY2tJbmRleCA+PSB0aGlzLnRyYWNrcy5sZW5ndGgpIHJldHVybiBudWxsO1xuXHRcdHJldHVybiB0aGlzLnRyYWNrc1t0cmFja0luZGV4XTtcblx0fVxuXG5cblx0LyoqIEFkZHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyBmb3IgYWxsIHRyYWNrIGVudHJpZXMuICovXG5cdGFkZExpc3RlbmVyIChsaXN0ZW5lcjogQW5pbWF0aW9uU3RhdGVMaXN0ZW5lcikge1xuXHRcdGlmICghbGlzdGVuZXIpIHRocm93IG5ldyBFcnJvcihcImxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0fVxuXG5cdC8qKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBhZGRlZCB3aXRoIHtAbGluayBhZGRMaXN0ZW5lcn0uICovXG5cdHJlbW92ZUxpc3RlbmVyIChsaXN0ZW5lcjogQW5pbWF0aW9uU3RhdGVMaXN0ZW5lcikge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG5cdFx0aWYgKGluZGV4ID49IDApIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG5cdH1cblxuXHQvKiogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGFkZGVkIHdpdGgge0BsaW5rIGFkZExpc3RlbmVyfS4gKi9cblx0Y2xlYXJMaXN0ZW5lcnMgKCkge1xuXHRcdHRoaXMubGlzdGVuZXJzLmxlbmd0aCA9IDA7XG5cdH1cblxuXHQvKiogRGlzY2FyZHMgYWxsIGxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBkZWxpdmVyZWQuIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byBjYWxsIGZyb20gYW5cblx0ICoge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXJ9IHdoZW4gaXQgaXMga25vd24gdGhhdCBmdXJ0aGVyIG5vdGlmaWNhdGlvbnMgdGhhdCBtYXkgaGF2ZSBiZWVuIGFscmVhZHkgcXVldWVkIGZvciBkZWxpdmVyeVxuXHQgKiBhcmUgbm90IHdhbnRlZCBiZWNhdXNlIG5ldyBhbmltYXRpb25zIGFyZSBiZWluZyBzZXQuICovXG5cdGNsZWFyTGlzdGVuZXJOb3RpZmljYXRpb25zICgpIHtcblx0XHR0aGlzLnF1ZXVlLmNsZWFyKCk7XG5cdH1cbn1cblxuLyoqIFN0b3JlcyBzZXR0aW5ncyBhbmQgb3RoZXIgc3RhdGUgZm9yIHRoZSBwbGF5YmFjayBvZiBhbiBhbmltYXRpb24gb24gYW4ge0BsaW5rIEFuaW1hdGlvblN0YXRlfSB0cmFjay5cbiAqXG4gKiBSZWZlcmVuY2VzIHRvIGEgdHJhY2sgZW50cnkgbXVzdCBub3QgYmUga2VwdCBhZnRlciB0aGUge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuZGlzcG9zZX0gZXZlbnQgb2NjdXJzLiAqL1xuZXhwb3J0IGNsYXNzIFRyYWNrRW50cnkge1xuXHQvKiogVGhlIGFuaW1hdGlvbiB0byBhcHBseSBmb3IgdGhpcyB0cmFjayBlbnRyeS4gKi9cblx0YW5pbWF0aW9uOiBBbmltYXRpb24gfCBudWxsID0gbnVsbDtcblxuXHRwcmV2aW91czogVHJhY2tFbnRyeSB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgYW5pbWF0aW9uIHF1ZXVlZCB0byBzdGFydCBhZnRlciB0aGlzIGFuaW1hdGlvbiwgb3IgbnVsbC4gYG5leHRgIG1ha2VzIHVwIGEgbGlua2VkIGxpc3QuICovXG5cdG5leHQ6IFRyYWNrRW50cnkgfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIHRyYWNrIGVudHJ5IGZvciB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIHdoZW4gbWl4aW5nIHRvIHRoaXMgYW5pbWF0aW9uLCBvciBudWxsIGlmIG5vIG1peGluZyBpcyBjdXJyZW50bHkgb2NjdXJyaW5nLlxuXHQgKiBXaGVuIG1peGluZyBmcm9tIG11bHRpcGxlIGFuaW1hdGlvbnMsIGBtaXhpbmdGcm9tYCBtYWtlcyB1cCBhIGRvdWJseSBsaW5rZWQgbGlzdC4gKi9cblx0bWl4aW5nRnJvbTogVHJhY2tFbnRyeSB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgdHJhY2sgZW50cnkgZm9yIHRoZSBuZXh0IGFuaW1hdGlvbiB3aGVuIG1peGluZyBmcm9tIHRoaXMgYW5pbWF0aW9uLCBvciBudWxsIGlmIG5vIG1peGluZyBpcyBjdXJyZW50bHkgb2NjdXJyaW5nLlxuXHQgKiBXaGVuIG1peGluZyB0byBtdWx0aXBsZSBhbmltYXRpb25zLCBgbWl4aW5nVG9gIG1ha2VzIHVwIGEgZG91Ymx5IGxpbmtlZCBsaXN0LiAqL1xuXHRtaXhpbmdUbzogVHJhY2tFbnRyeSB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgbGlzdGVuZXIgZm9yIGV2ZW50cyBnZW5lcmF0ZWQgYnkgdGhpcyB0cmFjayBlbnRyeSwgb3IgbnVsbC5cblx0ICpcblx0ICogQSB0cmFjayBlbnRyeSByZXR1cm5lZCBmcm9tIHtAbGluayBBbmltYXRpb25TdGF0ZS5zZXRBbmltYXRpb259IGlzIGFscmVhZHkgdGhlIGN1cnJlbnQgYW5pbWF0aW9uXG5cdCAqIGZvciB0aGUgdHJhY2ssIHNvIHRoZSBjYWxsYmFjayBmb3IgbGlzdGVuZXIge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuc3RhcnR9IHdpbGwgbm90IGJlIGNhbGxlZC4gKi9cblx0bGlzdGVuZXI6IEFuaW1hdGlvblN0YXRlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIGluZGV4IG9mIHRoZSB0cmFjayB3aGVyZSB0aGlzIHRyYWNrIGVudHJ5IGlzIGVpdGhlciBjdXJyZW50IG9yIHF1ZXVlZC5cblx0ICpcblx0ICogU2VlIHtAbGluayBBbmltYXRpb25TdGF0ZS5nZXRUcmFja30uICovXG5cdHRyYWNrSW5kZXggPSAwO1xuXG5cdC8qKiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgcmVwZWF0LiBJZiBmYWxzZSBpdCB3aWxsIG5vdCwgaW5zdGVhZCBpdHMgbGFzdCBmcmFtZSBpcyBhcHBsaWVkIGlmIHBsYXllZCBiZXlvbmQgaXRzXG5cdCAqIGR1cmF0aW9uLiAqL1xuXHRsb29wID0gZmFsc2U7XG5cblx0LyoqIFdoZW4gdHJ1ZSwgdGltZWxpbmVzIGluIHRoaXMgYW5pbWF0aW9uIHRoYXQgc3VwcG9ydCBhZGRpdGl2ZSBoYXZlIHRoZWlyIHZhbHVlcyBhZGRlZCB0byB0aGUgc2V0dXAgb3IgY3VycmVudCBwb3NlIHZhbHVlc1xuXHQgKiBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLiBBZGRpdGl2ZSBjYW4gYmUgc2V0IGZvciBhIG5ldyB0cmFjayBlbnRyeSBvbmx5IGJlZm9yZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYXBwbHl9XG5cdCAqIGlzIG5leHQgY2FsbGVkLiAqL1xuXHRhZGRpdGl2ZSA9IGZhbHNlO1xuXG5cdC8qKiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgYmUgYXBwbGllZCBpbiByZXZlcnNlLiAqL1xuXHRyZXZlcnNlID0gZmFsc2U7XG5cblx0LyoqIElmIHRydWUsIG1peGluZyByb3RhdGlvbiBiZXR3ZWVuIHRyYWNrcyBhbHdheXMgdXNlcyB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZGlyZWN0aW9uLiBJZiB0aGUgcm90YXRpb24gaXMgYW5pbWF0ZWQsIHRoZVxuXHQgKiBzaG9ydGVzdCByb3RhdGlvbiBkaXJlY3Rpb24gbWF5IGNoYW5nZSBkdXJpbmcgdGhlIG1peC5cblx0ICpcblx0ICogSWYgZmFsc2UsIHRoZSBzaG9ydGVzdCByb3RhdGlvbiBkaXJlY3Rpb24gaXMgcmVtZW1iZXJlZCB3aGVuIHRoZSBtaXggc3RhcnRzIGFuZCB0aGUgc2FtZSBkaXJlY3Rpb24gaXMgdXNlZCBmb3IgdGhlIHJlc3Rcblx0ICogb2YgdGhlIG1peC4gRGVmYXVsdHMgdG8gZmFsc2UuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgcmVzZXRSb3RhdGlvbkRpcmVjdGlvbnN9LiAqL1xuXHRzaG9ydGVzdFJvdGF0aW9uID0gZmFsc2U7XG5cblx0a2VlcEhvbGQgPSBmYWxzZTtcblxuXHQvKiogV2hlbiB0aGUgaW50ZXJwb2xhdGVkIG1peCBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiB0aGUgYGV2ZW50VGhyZXNob2xkYCAsIGV2ZW50IHRpbWVsaW5lcyBhcmUgYXBwbGllZCB3aGlsZVxuXHQgKiB0aGlzIGFuaW1hdGlvbiBpcyBiZWluZyBtaXhlZCBvdXQuIERlZmF1bHRzIHRvIDAsIHNvIGV2ZW50IHRpbWVsaW5lcyBhcmUgbm90IGFwcGxpZWQgd2hpbGUgdGhpcyBhbmltYXRpb24gaXMgYmVpbmcgbWl4ZWRcblx0ICogb3V0LiAqL1xuXHRldmVudFRocmVzaG9sZCA9IDA7XG5cblx0LyoqIFdoZW4gdGhlIGludGVycG9sYXRlZCBtaXggcGVyY2VudGFnZSBpcyBsZXNzIHRoYW4gdGhlIGBtaXhBdHRhY2htZW50VGhyZXNob2xkYCwgYXR0YWNobWVudCB0aW1lbGluZXMgYXJlXG5cdCAqIGFwcGxpZWQgd2hpbGUgdGhpcyBhbmltYXRpb24gaXMgYmVpbmcgbWl4ZWQgb3V0LiBEZWZhdWx0cyB0byAwLCBzbyBhdHRhY2htZW50IHRpbWVsaW5lcyBhcmUgbm90IGFwcGxpZWQgd2hpbGUgdGhpc1xuXHQgKiBhbmltYXRpb24gaXMgYmVpbmcgbWl4ZWQgb3V0LiAqL1xuXHRtaXhBdHRhY2htZW50VGhyZXNob2xkID0gMDtcblxuXHQvKiogV2hlbiB0aGUgY29tcHV0ZWQgYWxwaGEgaXMgZ3JlYXRlciB0aGFuIGBhbHBoYUF0dGFjaG1lbnRUaHJlc2hvbGRgLCBhdHRhY2htZW50IHRpbWVsaW5lcyBhcmUgYXBwbGllZC4gVGhlXG5cdCAqIGNvbXB1dGVkIGFscGhhIGluY2x1ZGVzIHtAbGluayBhbHBoYX0gYW5kIHRoZSBpbnRlcnBvbGF0ZWQgbWl4IHBlcmNlbnRhZ2UuIERlZmF1bHRzIHRvIDAsIHNvIGF0dGFjaG1lbnQgdGltZWxpbmVzIGFyZVxuXHQgKiBhbHdheXMgYXBwbGllZC4gKi9cblx0YWxwaGFBdHRhY2htZW50VGhyZXNob2xkID0gMDtcblxuXHQvKiogV2hlbiB0aGUgaW50ZXJwb2xhdGVkIG1peCBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiB0aGUgYG1peEF0dGFjaG1lbnRUaHJlc2hvbGRgLCBhdHRhY2htZW50IHRpbWVsaW5lcyBhcmVcblx0ICogYXBwbGllZCB3aGlsZSB0aGlzIGFuaW1hdGlvbiBpcyBiZWluZyBtaXhlZCBvdXQuIERlZmF1bHRzIHRvIDAsIHNvIGF0dGFjaG1lbnQgdGltZWxpbmVzIGFyZSBub3QgYXBwbGllZCB3aGlsZSB0aGlzXG5cdCAqIGFuaW1hdGlvbiBpcyBiZWluZyBtaXhlZCBvdXQuICovXG5cdG1peERyYXdPcmRlclRocmVzaG9sZCA9IDA7XG5cblx0LyoqIFRoZSB0aW1lIGluIHNlY29uZHMgZm9yIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGlzIGFuaW1hdGlvbiwgYm90aCBpbml0aWFsbHkgYW5kIGFmdGVyIGxvb3BpbmcuIERlZmF1bHRzIHRvIDAuXG5cdCAqXG5cdCAqIFdoZW4gc2V0dGluZyBgYW5pbWF0aW9uU3RhcnRgIHRpbWUsIHtAbGluayBhbmltYXRpb25MYXN0fSBjYW4gYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIHRvIGF2b2lkIGZpcmluZyBldmVudHNcblx0ICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGFuaW1hdGlvbi4gKi9cblx0YW5pbWF0aW9uU3RhcnQgPSAwO1xuXG5cdC8qKiBUaGUgdGltZSBpbiBzZWNvbmRzIGZvciB0aGUgbGFzdCBmcmFtZSBvZiB0aGlzIGFuaW1hdGlvbi4gUGFzdCB0aGlzIHRpbWUsIG5vbi1sb29waW5nIGFuaW1hdGlvbnMgaG9sZCB0aGUgcG9zZSBhdCB0aGlzXG5cdCAqIHRpbWUgd2hpbGUgbG9vcGluZyBhbmltYXRpb25zIHdpbGwgbG9vcCBiYWNrIHRvIHtAbGluayBhbmltYXRpb25TdGFydH0uIERlZmF1bHRzIHRvIHRoZSB7QGxpbmsgQW5pbWF0aW9uLmR1cmF0aW9ufS4gKi9cblx0YW5pbWF0aW9uRW5kID0gMDtcblxuXG5cdC8qKiBUaGUgdGltZSBpbiBzZWNvbmRzIHRoaXMgYW5pbWF0aW9uIHdhcyBsYXN0IGFwcGxpZWQuIFNvbWUgdGltZWxpbmVzIHVzZSB0aGlzIGZvciBvbmUtdGltZSB0cmlnZ2Vycy4gRm9yIGV4YW1wbGUsIHdoZW5cblx0ICogdGhpcyBhbmltYXRpb24gaXMgYXBwbGllZCwgZXZlbnQgdGltZWxpbmVzIHdpbGwgZmlyZSBhbGwgZXZlbnRzIGJldHdlZW4gdGhlIGBhbmltYXRpb25MYXN0YCB0aW1lIChleGNsdXNpdmUpXG5cdCAqIGFuZCBgYW5pbWF0aW9uVGltZWAgKGluY2x1c2l2ZSkuIERlZmF1bHRzIHRvIC0xIHRvIGVuc3VyZSB0cmlnZ2VycyBvbiBmcmFtZSAwIGhhcHBlbiB0aGUgZmlyc3QgdGltZSB0aGlzXG5cdCAqIGFuaW1hdGlvbiBpcyBhcHBsaWVkLiAqL1xuXHRhbmltYXRpb25MYXN0ID0gMDtcblxuXHRuZXh0QW5pbWF0aW9uTGFzdCA9IDA7XG5cblx0LyoqIFNlY29uZHMgdG8gcG9zdHBvbmUgcGxheWluZyB0aGUgYW5pbWF0aW9uLiBNdXN0IGJlID49IDAuIFdoZW4gdGhpcyB0cmFjayBlbnRyeSBpcyB0aGUgY3VycmVudCB0cmFjayBlbnRyeSxcblx0ICogYGRlbGF5YCBwb3N0cG9uZXMgaW5jcmVtZW50aW5nIHRoZSB7QGxpbmsgdHJhY2tUaW1lfS4gV2hlbiB0aGlzIHRyYWNrIGVudHJ5IGlzIHF1ZXVlZCwgYGRlbGF5YCBpc1xuXHQgKiB0aGUgdGltZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIHRvIHdoZW4gdGhpcyB0cmFjayBlbnRyeSB3aWxsIGJlY29tZSB0aGUgY3VycmVudCB0cmFjayBlbnRyeSAoaWUgd2hlblxuXHQgKiB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnkge0BsaW5rIHRyYWNrVGltZX0gPj0gdGhpcyB0cmFjayBlbnRyeSdzIGBkZWxheWApLlxuXHQgKlxuXHQgKiB7QGxpbmsgdGltZVNjYWxlfSBhZmZlY3RzIHRoZSBkZWxheS5cblx0ICpcblx0ICogV2hlbiBwYXNzaW5nIGBkZWxheWAgPD0gMCB0byB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkQW5pbWF0aW9ufSB0aGlzXG5cdCAqIGBkZWxheWAgaXMgc2V0IHVzaW5nIGEgbWl4IGR1cmF0aW9uIGZyb20ge0BsaW5rIEFuaW1hdGlvblN0YXRlRGF0YX0uIFRvIGNoYW5nZSB0aGUge0BsaW5rIG1peER1cmF0aW9ufVxuXHQgKiBhZnRlcndhcmQsIHVzZSB7QGxpbmsgc2V0TWl4RHVyYXRpb259IHNvIHRoaXMgYGRlbGF5YCBpcyBhZGp1c3RlZC4gKi9cblx0ZGVsYXkgPSAwO1xuXG5cdC8qKiBUaGUgdGltZSBpbiBzZWNvbmRzIHRoaXMgdHJhY2sgZW50cnkgaGFzIGJlZW4gdGhlIGN1cnJlbnQgdHJhY2sgZW50cnksIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlYXNpbmcgZm9yZXZlci4gQ29tcGFyZSB0b1xuXHQgKiB7QGxpbmsgZ2V0QW5pbWF0aW9uVGltZX0sIHdoaWNoIGlzIGFsd2F5cyBiZXR3ZWVuIHtAbGluayBhbmltYXRpb25TdGFydH0gYW5kIHtAbGluayBhbmltYXRpb25FbmR9LlxuXHQgKlxuXHQgKiBUaGUgdHJhY2sgdGltZSBjYW4gYmUgc2V0IHRvIHN0YXJ0IHRoZSBhbmltYXRpb24gYXQgYSB0aW1lIG90aGVyIHRoYW4gMCwgd2l0aG91dCBhZmZlY3RpbmcgbG9vcGluZy4gV2hlbiBkb2luZyBzbyxcblx0ICoge0BsaW5rIGFuaW1hdGlvbkxhc3R9IGNhbiBiZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgdG8gYXZvaWQgZmlyaW5nIGV2ZW50cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uLlxuXHQgKlxuXHQgKiBUbyBzZXQgdGhlIHRpbWUgYW4gYW5pbWF0aW9uIHN0YXJ0cyBhbmQgbG9vcHMsIHVzZSB7QGxpbmsgYW5pbWF0aW9uU3RhcnR9IGFuZCB7QGxpbmsgYW5pbWF0aW9uRW5kfS4gKi9cblx0dHJhY2tUaW1lID0gMDtcblxuXHR0cmFja0xhc3QgPSAwOyBuZXh0VHJhY2tMYXN0ID0gMDtcblxuXHQvKiogVGhlIHRyYWNrIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHRoaXMgYW5pbWF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmFjay4gRGVmYXVsdHMgdG8gdGhlIGhpZ2hlc3QgcG9zc2libGUgZmxvYXRcblx0ICogdmFsdWUsIG1lYW5pbmcgdGhlIGFuaW1hdGlvbiB3aWxsIGJlIGFwcGxpZWQgdW50aWwgYSBuZXcgYW5pbWF0aW9uIGlzIHNldCBvciB0aGUgdHJhY2sgaXMgY2xlYXJlZC4gSWYgdGhlIHRyYWNrIGVuZCB0aW1lXG5cdCAqIGlzIHJlYWNoZWQsIG5vIG90aGVyIGFuaW1hdGlvbnMgYXJlIHF1ZXVlZCBmb3IgcGxheWJhY2ssIGFuZCBtaXhpbmcgZnJvbSBhbnkgcHJldmlvdXMgYW5pbWF0aW9ucyBpcyBjb21wbGV0ZSwgdGhlbiB0aGVcblx0ICogcHJvcGVydGllcyBrZXllZCBieSB0aGUgYW5pbWF0aW9uIGFyZSBzZXQgdG8gdGhlIHNldHVwIHBvc2UgYW5kIHRoZSB0cmFjayBpcyBjbGVhcmVkLlxuXHQgKlxuXHQgKiBVc3VhbGx5IHlvdSB3YW50IHRvIHVzZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkRW1wdHlBbmltYXRpb259IHJhdGhlciB0aGFuIGhhdmUgdGhlIGFuaW1hdGlvblxuXHQgKiBhYnJ1cHRseSBjZWFzZSBiZWluZyBhcHBsaWVkLCBsZWF2aW5nIHRoZSBjdXJyZW50IHBvc2UuICovXG5cdHRyYWNrRW5kID0gMDtcblxuXHQvKiogTXVsdGlwbGllciBmb3IgdGhlIGRlbHRhIHRpbWUgd2hlbiB0aGlzIHRyYWNrIGVudHJ5IGlzIHVwZGF0ZWQsIGNhdXNpbmcgdGltZSBmb3IgdGhpcyBhbmltYXRpb24gdG8gcGFzcyBzbG93ZXIgb3Jcblx0ICogZmFzdGVyLiBEZWZhdWx0cyB0byAxLlxuXHQgKlxuXHQgKiBWYWx1ZXMgPCAwIGFyZSBub3Qgc3VwcG9ydGVkLiBUbyBwbGF5IGFuIGFuaW1hdGlvbiBpbiByZXZlcnNlLCB1c2Uge0BsaW5rIHJldmVyc2V9LlxuXHQgKlxuXHQgKiB7QGxpbmsgbWl4VGltZX0gaXMgbm90IGFmZmVjdGVkIGJ5IHRyYWNrIGVudHJ5IHRpbWUgc2NhbGUsIHNvIHtAbGluayBtaXhEdXJhdGlvbn0gbWF5IG5lZWQgdG8gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlXG5cdCAqIGFuaW1hdGlvbiBzcGVlZC5cblx0ICpcblx0ICogV2hlbiB1c2luZyB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkQW5pbWF0aW9ufSB3aXRoIGEgYGRlbGF5YCA8PSAwLCB0aGVcblx0ICoge0BsaW5rIGRlbGF5fSBpcyBzZXQgdXNpbmcgdGhlIG1peCBkdXJhdGlvbiBmcm9tIHtAbGluayBBbmltYXRpb25TdGF0ZS5kYXRhfSwgYXNzdW1pbmcgdGltZSBzY2FsZSB0byBiZSAxLiBJZiB0aGUgdGltZVxuXHQgKiBzY2FsZSBpcyBub3QgMSwgdGhlIGRlbGF5IG1heSBuZWVkIHRvIGJlIGFkanVzdGVkLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIEFuaW1hdGlvblN0YXRlLnRpbWVTY2FsZX0gdG8gYWZmZWN0IGFsbCBhbmltYXRpb25zLiAqL1xuXHR0aW1lU2NhbGUgPSAwO1xuXG5cdC8qKiBWYWx1ZXMgPCAxIG1peCB0aGlzIGFuaW1hdGlvbiB3aXRoIHRoZSBza2VsZXRvbidzIGN1cnJlbnQgcG9zZSAoZWl0aGVyIHRoZSBzZXR1cCBwb3NlIG9yIHRoZSBwb3NlIGZyb20gbG93ZXIgdHJhY2tzKS5cblx0ICogRGVmYXVsdHMgdG8gMSwgd2hpY2ggb3ZlcndyaXRlcyB0aGUgc2tlbGV0b24ncyBjdXJyZW50IHBvc2Ugd2l0aCB0aGlzIGFuaW1hdGlvbi5cblx0ICpcblx0ICogQWxwaGEgc2hvdWxkIGJlIDEgb24gdHJhY2sgMC5cblx0ICpcblx0ICogU2VlIHtAbGluayBnZXRBbHBoYUF0dGFjaG1lbnRUaHJlc2hvbGR9LiAqL1xuXHRhbHBoYSA9IDA7XG5cblx0LyoqIFNlY29uZHMgZWxhcHNlZCBmcm9tIDAgdG8gdGhlIHtAbGluayBtaXhEdXJhdGlvbn0gd2hlbiBtaXhpbmcgZnJvbSB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIHRvIHRoaXMgYW5pbWF0aW9uLiBNYXlcblx0ICogYmUgc2xpZ2h0bHkgbW9yZSB0aGFuIGBtaXhEdXJhdGlvbmAgd2hlbiB0aGUgbWl4IGlzIGNvbXBsZXRlLiAqL1xuXHRtaXhUaW1lID0gMDtcblxuXHQvKiogU2Vjb25kcyBmb3IgbWl4aW5nIGZyb20gdGhlIHByZXZpb3VzIGFuaW1hdGlvbiB0byB0aGlzIGFuaW1hdGlvbi4gRGVmYXVsdHMgdG8gdGhlIHZhbHVlIHByb3ZpZGVkIGJ5XG5cdCAqIHtAbGluayBBbmltYXRpb25TdGF0ZURhdGEuZ2V0TWl4fSBiYXNlZCBvbiB0aGUgYW5pbWF0aW9uIGJlZm9yZSB0aGlzIGFuaW1hdGlvbiAoaWYgYW55KS5cblx0ICpcblx0ICogQSBtaXggZHVyYXRpb24gb2YgMCBzdGlsbCBuZWVkcyB0byBiZSBhcHBsaWVkIG9uZSBtb3JlIHRpbWUgdG8gbWl4IG91dCwgc28gdGhlIHRoZSBwcm9wZXJ0aWVzIGl0IHdhcyBhbmltYXRpbmcgYXJlXG5cdCAqIHJldmVydGVkLiBBIG1peCBkdXJhdGlvbiBvZiAwIGNhbiBiZSBzZXQgYXQgYW55IHRpbWUgdG8gZW5kIHRoZSBtaXggb24gdGhlIG5leHRcblx0ICoge0BsaW5rIEFuaW1hdGlvblN0YXRlLnVwZGF0ZSB8IHVwZGF0ZX0uXG5cdCAqXG5cdCAqIFRoZSBgbWl4RHVyYXRpb25gIGNhbiBiZSBzZXQgbWFudWFsbHkgcmF0aGVyIHRoYW4gdXNlIHRoZSB2YWx1ZSBmcm9tXG5cdCAqIHtAbGluayBBbmltYXRpb25TdGF0ZURhdGEuZ2V0TWl4fS4gSW4gdGhhdCBjYXNlLCB0aGUgYG1peER1cmF0aW9uYCBjYW4gYmUgc2V0IGZvciBhIG5ld1xuXHQgKiB0cmFjayBlbnRyeSBvbmx5IGJlZm9yZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGUudXBkYXRlfSBpcyBuZXh0IGNhbGxlZC5cblx0ICpcblx0ICogV2hlbiB1c2luZyB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkQW5pbWF0aW9ufSB3aXRoIGEgYGRlbGF5YCA8PSAwLCB0aGVcblx0ICoge0BsaW5rIGdldERlbGF5fSBpcyBzZXQgdXNpbmcgdGhlIG1peCBkdXJhdGlvbiBmcm9tIHtAbGluayBBbmltYXRpb25TdGF0ZS5kYXRhfS4gSWYgYG1peER1cmF0aW9uYCBpcyBzZXRcblx0ICogYWZ0ZXJ3YXJkLCB0aGUgZGVsYXkgbmVlZHMgdG8gYmUgYWRqdXN0ZWQ6XG5cdCAqXG5cdCAqIDxwcmU+XG5cdCAqIGVudHJ5Lm1peER1cmF0aW9uID0gMC4yNTs8YnI+XG5cdCAqIGVudHJ5LmRlbGF5ID0gZW50cnkucHJldmlvdXMuZ2V0VHJhY2tDb21wbGV0ZSgpIC0gZW50cnkubWl4RHVyYXRpb24gKyAwO1xuXHQgKiA8L3ByZT5cblx0ICpcblx0ICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBzZXRNaXhEdXJhdGlvbn0gdG8gc2V0IGJvdGggdGhlIG1peCBkdXJhdGlvbiBhbmQgcmVjb21wdXRlIHRoZSBkZWxheTo8YnI+XG5cdCAqXG5cdCAqIDxwcmU+XG5cdCAgZW50cnkuc2V0TWl4RHVyYXRpb24oMC4yNWYsIDApOyAvLyBtaXhEdXJhdGlvbiwgZGVsYXlcblx0ICogPC9wcmU+XG5cdCAqL1xuXHRtaXhEdXJhdGlvbiA9IDA7XG5cblx0dG90YWxBbHBoYSA9IDA7XG5cblx0bWl4SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRpb24ubGluZWFyO1xuXG5cdC8qKiBTZXRzIGJvdGgge0BsaW5rIGdldE1peER1cmF0aW9ufSBhbmQge0BsaW5rIGdldERlbGF5fS5cblx0ICogQHBhcmFtIGRlbGF5IElmID4gMCwgc2V0cyB7QGxpbmsgZ2V0RGVsYXl9LiBJZiA8PSAwLCB0aGUgZGVsYXkgc2V0IGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnkgbWludXNcblx0ICogICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbWl4IGR1cmF0aW9uIHBsdXMgdGhlIHNwZWNpZmllZCBgZGVsYXlgIChpZSB0aGUgbWl4IGVuZHMgYXQgKHdoZW4gYGRlbGF5YCA9XG5cdCAqICAgICAgICAgICAwKSBvciBiZWZvcmUgKHdoZW4gYGRlbGF5YCA8IDApIHRoZSBwcmV2aW91cyB0cmFjayBlbnRyeSBkdXJhdGlvbikuIElmIHRoZSBwcmV2aW91cyBlbnRyeSBpc1xuXHQgKiAgICAgICAgICAgbG9vcGluZywgaXRzIG5leHQgbG9vcCBjb21wbGV0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBpdHMgZHVyYXRpb24uICovXG5cdHNldE1peER1cmF0aW9uIChtaXhEdXJhdGlvbjogbnVtYmVyLCBkZWxheT86IG51bWJlcikge1xuXHRcdHRoaXMubWl4RHVyYXRpb24gPSBtaXhEdXJhdGlvbjtcblx0XHRpZiAoZGVsYXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGRlbGF5IDw9IDApIGRlbGF5ID0gdGhpcy5wcmV2aW91cyA9PSBudWxsID8gMCA6IE1hdGgubWF4KGRlbGF5ICsgdGhpcy5wcmV2aW91cy5nZXRUcmFja0NvbXBsZXRlKCkgLSBtaXhEdXJhdGlvbiwgMCk7XG5cdFx0XHR0aGlzLmRlbGF5ID0gZGVsYXk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFRoZSBpbnRlcnBvbGF0aW9uIHRvIGFwcGx5IHRvIHRoZSBtaXggcGVyY2VudGFnZSAoe0BsaW5rIG1peFRpbWV9IC8ge0BsaW5rIG1peER1cmF0aW9ufSkgd2hlbiBtaXhpbmcgZnJvbSB0aGUgcHJldmlvdXNcblx0ICogYW5pbWF0aW9uIHRvIHRoaXMgYW5pbWF0aW9uLiBEZWZhdWx0cyB0byBsaW5lYXIuICovXG5cdHNldE1peEludGVycG9sYXRpb24gKG1peEludGVycG9sYXRpb246IEludGVycG9sYXRpb24pIHtcblx0XHRpZiAoIW1peEludGVycG9sYXRpb24pIHRocm93IG5ldyBFcnJvcihcIm1peEludGVycG9sYXRpb24gY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdHRoaXMubWl4SW50ZXJwb2xhdGlvbiA9IG1peEludGVycG9sYXRpb247XG5cdH1cblxuXHRtaXggKCk6IG51bWJlciB7XG5cdFx0aWYgKHRoaXMubWl4RHVyYXRpb24gPT09IDApIHJldHVybiAxO1xuXHRcdGxldCBtaXggPSB0aGlzLm1peFRpbWUgLyB0aGlzLm1peER1cmF0aW9uO1xuXHRcdGlmIChtaXggPj0gMSkgcmV0dXJuIDE7XG5cdFx0aWYgKHRoaXMubWl4SW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5saW5lYXIpIHJldHVybiBtaXg7XG5cdFx0bWl4ID0gdGhpcy5taXhJbnRlcnBvbGF0aW9uLmFwcGx5KG1peCk7XG5cdFx0aWYgKG1peCA8IDApIHJldHVybiAwO1xuXHRcdGlmIChtaXggPiAxKSByZXR1cm4gMTtcblx0XHRyZXR1cm4gbWl4O1xuXHR9XG5cblx0LyoqIEZvciBlYWNoIHRpbWVsaW5lOlxuXHQgKiAtIEJpdCAwLCBGSVJTVDogMCA9IG1peCBmcm9tIGN1cnJlbnQgcG9zZSwgMSA9IG1peCBmcm9tIHNldHVwIHBvc2UuIFRpbWVsaW5lIGlzIGZpcnN0IHRvIHNldCB0aGUgcHJvcGVydHkuXG5cdCAqIC0gQml0IDEsIEhPTEQ6IDAgPSBtaXggb3V0IHVzaW5nIGFscGhhTWl4LCAxID0gYXBwbHkgZnVsbCBhbHBoYSB0byBwcmV2ZW50IGRpcHBpbmcuIFRpbWVsaW5lIGlzIGZpcnN0IG9uIGl0cyB0cmFjayB0b1xuXHQgKiBzZXQgdGhlIHByb3BlcnR5IGFuZCB0aGUgbmV4dCBlbnRyeSAobWl4aW5nVG8pIGFsc28gc2V0cyBpdC4gV2hlbiBoZWxkLCB0aW1lbGluZUhvbGRNaXgncyBtaXggY29udHJvbHMgaG93IHRoZSBob2xkIGZhZGVzXG5cdCAqIG91dCAoZm9yIDMrIGVudHJ5IGNoYWlucyB3aGVyZSB0aGUgY2hhaW4gZXZlbnR1YWxseSBzdG9wcyBzZXR0aW5nIHRoZSBwcm9wZXJ0eSkuICovXG5cdHRpbWVsaW5lTW9kZSA9IFtdIGFzIG51bWJlcltdO1xuXHR0aW1lbGluZUhvbGRNaXggPSBbXSBhcyBUcmFja0VudHJ5W107XG5cdHRpbWVsaW5lc1JvdGF0aW9uID0gW10gYXMgbnVtYmVyW107XG5cblx0cmVzZXQgKCkge1xuXHRcdHRoaXMubmV4dCA9IG51bGw7XG5cdFx0dGhpcy5wcmV2aW91cyA9IG51bGw7XG5cdFx0dGhpcy5taXhpbmdGcm9tID0gbnVsbDtcblx0XHR0aGlzLm1peGluZ1RvID0gbnVsbDtcblx0XHR0aGlzLm1peEludGVycG9sYXRpb24gPSBJbnRlcnBvbGF0aW9uLmxpbmVhcjtcblx0XHR0aGlzLmFuaW1hdGlvbiA9IG51bGw7XG5cdFx0dGhpcy5saXN0ZW5lciA9IG51bGw7XG5cdFx0dGhpcy50aW1lbGluZU1vZGUubGVuZ3RoID0gMDtcblx0XHR0aGlzLnRpbWVsaW5lSG9sZE1peC5sZW5ndGggPSAwO1xuXHRcdHRoaXMudGltZWxpbmVzUm90YXRpb24ubGVuZ3RoID0gMDtcblx0fVxuXG5cdC8qKiBVc2VzIHtAbGluayB0cmFja1RpbWV9IHRvIGNvbXB1dGUgdGhlIGBhbmltYXRpb25UaW1lYCwgd2hpY2ggaXMgYWx3YXlzIGJldHdlZW4ge0BsaW5rIGFuaW1hdGlvblN0YXJ0fSBhbmRcblx0ICoge0BsaW5rIGFuaW1hdGlvbkVuZH0uIFdoZW4gYHRyYWNrVGltZWAgaXMgMCwgYGFuaW1hdGlvblRpbWVgIGlzIGVxdWFsIHRvIHRoZVxuXHQgKiBgYW5pbWF0aW9uU3RhcnRgIHRpbWUuICovXG5cdGdldEFuaW1hdGlvblRpbWUgKCkge1xuXHRcdGlmICghdGhpcy5sb29wKSByZXR1cm4gTWF0aC5taW4odGhpcy50cmFja1RpbWUgKyB0aGlzLmFuaW1hdGlvblN0YXJ0LCB0aGlzLmFuaW1hdGlvbkVuZCk7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0aGlzLmFuaW1hdGlvbkVuZCAtIHRoaXMuYW5pbWF0aW9uU3RhcnQ7XG5cdFx0aWYgKGR1cmF0aW9uID09PSAwKSByZXR1cm4gdGhpcy5hbmltYXRpb25TdGFydDtcblx0XHRyZXR1cm4gKHRoaXMudHJhY2tUaW1lICUgZHVyYXRpb24pICsgdGhpcy5hbmltYXRpb25TdGFydDtcblx0fVxuXG5cdHNldEFuaW1hdGlvbkxhc3QgKGFuaW1hdGlvbkxhc3Q6IG51bWJlcikge1xuXHRcdHRoaXMuYW5pbWF0aW9uTGFzdCA9IGFuaW1hdGlvbkxhc3Q7XG5cdFx0dGhpcy5uZXh0QW5pbWF0aW9uTGFzdCA9IGFuaW1hdGlvbkxhc3Q7XG5cdH1cblxuXHQvKiogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBsb29wIGhhcyBiZWVuIGNvbXBsZXRlZC5cblx0ICpcblx0ICogU2VlIHtAbGluayBBbmltYXRpb25TdGF0ZUxpc3RlbmVyLmNvbXBsZXRlfS4gKi9cblx0aXNDb21wbGV0ZSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJhY2tUaW1lID49IHRoaXMuYW5pbWF0aW9uRW5kIC0gdGhpcy5hbmltYXRpb25TdGFydDtcblx0fVxuXG5cdC8qKiBXaGVuIHtAbGluayBzaG9ydGVzdFJvdGF0aW9ufSBpcyBmYWxzZSwgdGhpcyBjbGVhcnMgdGhlIGRpcmVjdGlvbnMgZm9yIG1peGluZyB0aGlzIGVudHJ5J3Mgcm90YXRpb24uIFRoaXMgY2FuIGJlIHVzZWZ1bFxuXHQgKiB0byBhdm9pZCBib25lcyByb3RhdGluZyB0aGUgbG9uZyB3YXkgYXJvdW5kIHdoZW4gdXNpbmcge0BsaW5rIGdldEFscGhhfSBhbmQgc3RhcnRpbmcgYW5pbWF0aW9ucyBvbiBvdGhlciB0cmFja3MuXG5cdCAqXG5cdCAqIE1peGluZyBpbnZvbHZlcyBmaW5kaW5nIGEgcm90YXRpb24gYmV0d2VlbiB0d28gb3RoZXJzLiBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIHNvbHV0aW9uczogdGhlIHNob3J0IG9yIHRoZSBsb25nIHdheVxuXHQgKiBhcm91bmQuIFdoZW4gdGhlIHR3byByb3RhdGlvbnMgY2hhbmdlIG92ZXIgdGltZSwgd2hpY2ggZGlyZWN0aW9uIGlzIHRoZSBzaG9ydCBvciBsb25nIHdheSBjYW4gYWxzbyBjaGFuZ2UuIElmIHRoZSBzaG9ydFxuXHQgKiB3YXkgd2FzIGFsd2F5cyBjaG9zZW4sIGJvbmVzIGZsaXAgdG8gdGhlIG90aGVyIHNpZGUgd2hlbiB0aGF0IGRpcmVjdGlvbiBiZWNhbWUgdGhlIGxvbmcgd2F5LiBUcmFja0VudHJ5IGNob29zZXMgdGhlIHNob3J0XG5cdCAqIHdheSB0aGUgZmlyc3QgdGltZSBpdCBpcyBhcHBsaWVkIGFuZCByZW1lbWJlcnMgdGhhdCBkaXJlY3Rpb24uIFJlc2V0dGluZyB0aGF0IGRpcmVjdGlvbiBtYWtlcyBpdCBjaG9vc2UgYSBuZXcgc2hvcnQgd2F5XG5cdCAqIG9uIHRoZSBuZXh0IGFwcGx5LiAqL1xuXHRyZXNldFJvdGF0aW9uRGlyZWN0aW9ucyAoKSB7XG5cdFx0dGhpcy50aW1lbGluZXNSb3RhdGlvbi5sZW5ndGggPSAwO1xuXHR9XG5cblx0LyoqIElmIHRoaXMgdHJhY2sgZW50cnkgaXMgbm9uLWxvb3BpbmcsIHRoaXMgaXMgdGhlIHRyYWNrIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHtAbGluayBhbmltYXRpb25FbmR9IGlzIHJlYWNoZWQsIG9yIHRoZVxuXHQgKiBjdXJyZW50IHtAbGluayB0cmFja1RpbWV9IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZC5cblx0ICpcblx0ICogSWYgdGhpcyB0cmFjayBlbnRyeSBpcyBsb29waW5nLCB0aGlzIGlzIHRoZSB0cmFjayB0aW1lIHdoZW4gdGhpcyBhbmltYXRpb24gd2lsbCByZWFjaCBpdHMgbmV4dCB7QGxpbmsgYW5pbWF0aW9uRW5kfSAodGhlXG5cdCAqIG5leHQgbG9vcCBjb21wbGV0aW9uKS4gKi9cblx0Z2V0VHJhY2tDb21wbGV0ZSAoKSB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0aGlzLmFuaW1hdGlvbkVuZCAtIHRoaXMuYW5pbWF0aW9uU3RhcnQ7XG5cdFx0aWYgKGR1cmF0aW9uICE9PSAwKSB7XG5cdFx0XHRpZiAodGhpcy5sb29wKSByZXR1cm4gZHVyYXRpb24gKiAoMSArICgodGhpcy50cmFja1RpbWUgLyBkdXJhdGlvbikgfCAwKSk7IC8vIENvbXBsZXRpb24gb2YgbmV4dCBsb29wLlxuXHRcdFx0aWYgKHRoaXMudHJhY2tUaW1lIDwgZHVyYXRpb24pIHJldHVybiBkdXJhdGlvbjsgLy8gQmVmb3JlIGR1cmF0aW9uLlxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy50cmFja1RpbWU7IC8vIE5leHQgdXBkYXRlLlxuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyYWNrIGVudHJ5IGhhcyBiZWVuIGFwcGxpZWQgYXQgbGVhc3Qgb25jZS5cblx0ICpcblx0ICogU2VlIHtAbGluayBBbmltYXRpb25TdGF0ZS5hcHBseX0uICovXG5cdHdhc0FwcGxpZWQgKCkge1xuXHRcdHJldHVybiB0aGlzLm5leHRUcmFja0xhc3QgIT09IC0xO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHtAbGluayBuZXh0fSB0cmFjayBlbnRyeSBhbmQgaXQgd2lsbCBiZWNvbWUgdGhlIGN1cnJlbnQgdHJhY2sgZW50cnkgZHVyaW5nIHRoZSBuZXh0XG5cdCAqIHtAbGluayBBbmltYXRpb25TdGF0ZS51cGRhdGV9LiAqL1xuXHRpc05leHRSZWFkeSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMubmV4dCAhPSBudWxsICYmIHRoaXMubmV4dFRyYWNrTGFzdCAtIHRoaXMubmV4dC5kZWxheSA+PSAwO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudFF1ZXVlIHtcblx0b2JqZWN0czogQXJyYXk8RXZlbnRUeXBlIHwgVHJhY2tFbnRyeSB8IEV2ZW50PiA9IFtdO1xuXHRkcmFpbkRpc2FibGVkID0gZmFsc2U7XG5cdGFuaW1TdGF0ZTogQW5pbWF0aW9uU3RhdGU7XG5cblx0Y29uc3RydWN0b3IgKGFuaW1TdGF0ZTogQW5pbWF0aW9uU3RhdGUpIHtcblx0XHR0aGlzLmFuaW1TdGF0ZSA9IGFuaW1TdGF0ZTtcblx0fVxuXG5cdHN0YXJ0IChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKEV2ZW50VHlwZS5zdGFydCk7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goZW50cnkpO1xuXHRcdHRoaXMuYW5pbVN0YXRlLmFuaW1hdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcblx0fVxuXG5cdGludGVycnVwdCAoZW50cnk6IFRyYWNrRW50cnkpIHtcblx0XHR0aGlzLm9iamVjdHMucHVzaChFdmVudFR5cGUuaW50ZXJydXB0KTtcblx0XHR0aGlzLm9iamVjdHMucHVzaChlbnRyeSk7XG5cdH1cblxuXHRlbmQgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goRXZlbnRUeXBlLmVuZCk7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goZW50cnkpO1xuXHRcdHRoaXMuYW5pbVN0YXRlLmFuaW1hdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcblx0fVxuXG5cdGRpc3Bvc2UgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goRXZlbnRUeXBlLmRpc3Bvc2UpO1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKGVudHJ5KTtcblx0fVxuXG5cdGNvbXBsZXRlIChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKEV2ZW50VHlwZS5jb21wbGV0ZSk7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goZW50cnkpO1xuXHR9XG5cblx0ZXZlbnQgKGVudHJ5OiBUcmFja0VudHJ5LCBldmVudDogRXZlbnQpIHtcblx0XHR0aGlzLm9iamVjdHMucHVzaChFdmVudFR5cGUuZXZlbnQpO1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKGVudHJ5KTtcblx0XHR0aGlzLm9iamVjdHMucHVzaChldmVudCk7XG5cdH1cblxuXHRkcmFpbiAoKSB7XG5cdFx0aWYgKHRoaXMuZHJhaW5EaXNhYmxlZCkgcmV0dXJuOyAvLyBOb3QgcmVlbnRyYW50LlxuXHRcdHRoaXMuZHJhaW5EaXNhYmxlZCA9IHRydWU7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub2JqZWN0cy5sZW5ndGg7IGkgKz0gMikge1xuXHRcdFx0Y29uc3Qgb2JqZWN0cyA9IHRoaXMub2JqZWN0cztcblx0XHRcdGNvbnN0IHR5cGUgPSBvYmplY3RzW2ldIGFzIEV2ZW50VHlwZTtcblx0XHRcdGNvbnN0IGVudHJ5ID0gb2JqZWN0c1tpICsgMV0gYXMgVHJhY2tFbnRyeTtcblx0XHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuYW5pbVN0YXRlLmxpc3RlbmVycy5zbGljZSgpO1xuXHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRcdGNhc2UgRXZlbnRUeXBlLnN0YXJ0OlxuXHRcdFx0XHRcdGlmIChlbnRyeS5saXN0ZW5lcj8uc3RhcnQpIGVudHJ5Lmxpc3RlbmVyLnN0YXJ0KGVudHJ5KTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaWldO1xuXHRcdFx0XHRcdFx0aWYgKGxpc3RlbmVyLnN0YXJ0KSBsaXN0ZW5lci5zdGFydChlbnRyeSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIEV2ZW50VHlwZS5pbnRlcnJ1cHQ6XG5cdFx0XHRcdFx0aWYgKGVudHJ5Lmxpc3RlbmVyPy5pbnRlcnJ1cHQpIGVudHJ5Lmxpc3RlbmVyLmludGVycnVwdChlbnRyeSk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGxpc3RlbmVycy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzW2lpXTtcblx0XHRcdFx0XHRcdGlmIChsaXN0ZW5lci5pbnRlcnJ1cHQpIGxpc3RlbmVyLmludGVycnVwdChlbnRyeSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6IHJlZmVyZW5jZSBydW50aW1lIGRvZXMgZmFsbCB0aHJvdWdoXG5cdFx0XHRcdGNhc2UgRXZlbnRUeXBlLmVuZDpcblx0XHRcdFx0XHRpZiAoZW50cnkubGlzdGVuZXI/LmVuZCkgZW50cnkubGlzdGVuZXIuZW5kKGVudHJ5KTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaWldO1xuXHRcdFx0XHRcdFx0aWYgKGxpc3RlbmVyLmVuZCkgbGlzdGVuZXIuZW5kKGVudHJ5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdC8vIEZhbGwgdGhyb3VnaC5cblx0XHRcdFx0Y2FzZSBFdmVudFR5cGUuZGlzcG9zZTpcblx0XHRcdFx0XHRpZiAoZW50cnkubGlzdGVuZXI/LmRpc3Bvc2UpIGVudHJ5Lmxpc3RlbmVyLmRpc3Bvc2UoZW50cnkpO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpaV07XG5cdFx0XHRcdFx0XHRpZiAobGlzdGVuZXIuZGlzcG9zZSkgbGlzdGVuZXIuZGlzcG9zZShlbnRyeSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuYW5pbVN0YXRlLnRyYWNrRW50cnlQb29sLmZyZWUoZW50cnkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIEV2ZW50VHlwZS5jb21wbGV0ZTpcblx0XHRcdFx0XHRpZiAoZW50cnkubGlzdGVuZXI/LmNvbXBsZXRlKSBlbnRyeS5saXN0ZW5lci5jb21wbGV0ZShlbnRyeSk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGxpc3RlbmVycy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzW2lpXTtcblx0XHRcdFx0XHRcdGlmIChsaXN0ZW5lci5jb21wbGV0ZSkgbGlzdGVuZXIuY29tcGxldGUoZW50cnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBFdmVudFR5cGUuZXZlbnQ6IHtcblx0XHRcdFx0XHRjb25zdCBldmVudCA9IG9iamVjdHNbaSsrICsgMl0gYXMgRXZlbnQ7XG5cdFx0XHRcdFx0aWYgKGVudHJ5Lmxpc3RlbmVyPy5ldmVudCkgZW50cnkubGlzdGVuZXIuZXZlbnQoZW50cnksIGV2ZW50KTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaWldO1xuXHRcdFx0XHRcdFx0aWYgKGxpc3RlbmVyLmV2ZW50KSBsaXN0ZW5lci5ldmVudChlbnRyeSwgZXZlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmNsZWFyKCk7XG5cblx0XHR0aGlzLmRyYWluRGlzYWJsZWQgPSBmYWxzZTtcblx0fVxuXG5cdGNsZWFyICgpIHtcblx0XHR0aGlzLm9iamVjdHMubGVuZ3RoID0gMDtcblx0fVxufVxuXG5leHBvcnQgZW51bSBFdmVudFR5cGUge1xuXHRzdGFydCwgaW50ZXJydXB0LCBlbmQsIGRpc3Bvc2UsIGNvbXBsZXRlLCBldmVudFxufVxuXG4vKiogVGhlIGludGVyZmFjZSB0byBpbXBsZW1lbnQgZm9yIHJlY2VpdmluZyBUcmFja0VudHJ5IGV2ZW50cy4gSXQgaXMgYWx3YXlzIHNhZmUgdG8gY2FsbCBBbmltYXRpb25TdGF0ZSBtZXRob2RzIHdoZW4gcmVjZWl2aW5nXG4gKiBldmVudHMuXG4gKlxuICogVHJhY2tFbnRyeSBldmVudHMgYXJlIGNvbGxlY3RlZCBkdXJpbmcge0BsaW5rIEFuaW1hdGlvblN0YXRlLnVwZGF0ZX0gYW5kIHtAbGluayBBbmltYXRpb25TdGF0ZS5hcHBseX0gYW5kXG4gKiBmaXJlZCBvbmx5IGFmdGVyIHRob3NlIG1ldGhvZHMgYXJlIGZpbmlzaGVkLlxuICpcbiAqIFNlZSB7QGxpbmsgVHJhY2tFbnRyeS5saXN0ZW5lcn0gYW5kXG4gKiB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkTGlzdGVuZXJ9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25TdGF0ZUxpc3RlbmVyIHtcblx0LyoqIEludm9rZWQgd2hlbiB0aGlzIGVudHJ5IGhhcyBiZWVuIHNldCBhcyB0aGUgY3VycmVudCBlbnRyeS4ge0BsaW5rIGVuZH0gd2lsbCBvY2N1ciB3aGVuIHRoaXMgZW50cnkgd2lsbCBub1xuXHQgKiBsb25nZXIgYmUgYXBwbGllZC5cblx0ICpcblx0ICogV2hlbiB0aGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBjYWxsaW5nIHtAbGluayBBbmltYXRpb25TdGF0ZS5zZXRBbmltYXRpb259LCB0YWtlIGNhcmUgbm90IHRvXG5cdCAqIGNhbGwge0BsaW5rIEFuaW1hdGlvblN0YXRlLnVwZGF0ZX0gdW50aWwgYWZ0ZXIgdGhlIFRyYWNrRW50cnkgaGFzIGJlZW4gY29uZmlndXJlZC4gKi9cblx0c3RhcnQ/OiAoZW50cnk6IFRyYWNrRW50cnkpID0+IHZvaWQ7XG5cblx0LyoqIEludm9rZWQgd2hlbiBhbm90aGVyIGVudHJ5IGhhcyByZXBsYWNlZCB0aGlzIGVudHJ5IGFzIHRoZSBjdXJyZW50IGVudHJ5LiBUaGlzIGVudHJ5IG1heSBjb250aW51ZSBiZWluZyBhcHBsaWVkIGZvclxuXHQgKiBtaXhpbmcuICovXG5cdGludGVycnVwdD86IChlbnRyeTogVHJhY2tFbnRyeSkgPT4gdm9pZDtcblxuXHQvKiogSW52b2tlZCB3aGVuIHRoaXMgZW50cnkgd2lsbCBuZXZlciBiZSBhcHBsaWVkIGFnYWluLiBUaGlzIG9ubHkgb2NjdXJzIGlmIHRoaXMgZW50cnkgaGFzIHByZXZpb3VzbHkgYmVlbiBzZXQgYXMgdGhlXG5cdCAqIGN1cnJlbnQgZW50cnkgKHtAbGluayBzdGFydH0gd2FzIGludm9rZWQpLiAqL1xuXHRlbmQ/OiAoZW50cnk6IFRyYWNrRW50cnkpID0+IHZvaWQ7XG5cblx0LyoqIEludm9rZWQgd2hlbiB0aGlzIGVudHJ5IHdpbGwgYmUgZGlzcG9zZWQuIFRoaXMgbWF5IG9jY3VyIHdpdGhvdXQgdGhlIGVudHJ5IGV2ZXIgYmVpbmcgc2V0IGFzIHRoZSBjdXJyZW50IGVudHJ5LlxuXHQgKiBSZWZlcmVuY2VzIHRvIHRoZSBlbnRyeSBzaG91bGQgbm90IGJlIGtlcHQgYWZ0ZXIgZGlzcG9zZSBpcyBjYWxsZWQsIGFzIGl0IG1heSBiZSBkZXN0cm95ZWQgb3IgcmV1c2VkLiAqL1xuXHRkaXNwb3NlPzogKGVudHJ5OiBUcmFja0VudHJ5KSA9PiB2b2lkO1xuXG5cdC8qKiBJbnZva2VkIGV2ZXJ5IHRpbWUgdGhpcyBlbnRyeSdzIGFuaW1hdGlvbiBjb21wbGV0ZXMgYSBsb29wLiBUaGlzIG1heSBvY2N1ciBkdXJpbmcgbWl4aW5nIChhZnRlclxuXHQgKiB7QGxpbmsgaW50ZXJydXB0fSkuXG5cdCAqXG5cdCAqIElmIHRoaXMgZW50cnkncyB7QGxpbmsgVHJhY2tFbnRyeS5taXhpbmdUb30gaXMgbm90IG51bGwsIHRoaXMgZW50cnkgaXMgbWl4aW5nIG91dCAoaXQgaXMgbm90IHRoZSBjdXJyZW50IGVudHJ5KS5cblx0ICpcblx0ICogQmVjYXVzZSB0aGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBhdCB0aGUgZW5kIG9mIHtAbGluayBBbmltYXRpb25TdGF0ZS5hcHBseX0sIGFueSBhbmltYXRpb25zIHNldCBpbiByZXNwb25zZSB0b1xuXHQgKiB0aGUgZXZlbnQgd29uJ3QgYmUgYXBwbGllZCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRoZSBBbmltYXRpb25TdGF0ZSBpcyBhcHBsaWVkLiAqL1xuXHRjb21wbGV0ZT86IChlbnRyeTogVHJhY2tFbnRyeSkgPT4gdm9pZDtcblxuXHQvKiogSW52b2tlZCB3aGVuIHRoaXMgZW50cnkncyBhbmltYXRpb24gdHJpZ2dlcnMgYW4gZXZlbnQuICovXG5cdGV2ZW50PzogKGVudHJ5OiBUcmFja0VudHJ5LCBldmVudDogRXZlbnQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBbmltYXRpb25TdGF0ZUFkYXB0ZXIgaW1wbGVtZW50cyBBbmltYXRpb25TdGF0ZUxpc3RlbmVyIHtcblx0c3RhcnQgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdH1cblxuXHRpbnRlcnJ1cHQgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdH1cblxuXHRlbmQgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdH1cblxuXHRkaXNwb3NlIChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHR9XG5cblx0Y29tcGxldGUgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdH1cblxuXHRldmVudCAoZW50cnk6IFRyYWNrRW50cnksIGV2ZW50OiBFdmVudCkge1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBTVUJTRVFVRU5UID0gMDtcbmV4cG9ydCBjb25zdCBGSVJTVCA9IDE7XG5leHBvcnQgY29uc3QgSE9MRCA9IDI7XG5leHBvcnQgY29uc3QgSE9MRF9GSVJTVCA9IDM7XG5cbmV4cG9ydCBjb25zdCBTRVRVUCA9IDE7XG5leHBvcnQgY29uc3QgUkVUQUlOID0gMjtcbiJdfQ==
1205
+ export const FIRST = 2;
1206
+ export const MODE = 3;
1207
+ export const HOLD = 4;
1208
+ export const ATTACH_SETUP = 1;
1209
+ export const ATTACH_RETAIN = 2;
1210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uU3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQW5pbWF0aW9uU3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLDZHQUE2RztBQUU3RyxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzdKLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHbkU7OztzSUFHc0k7QUFDdEksTUFBTSxPQUFPLGNBQWM7SUFDMUIsTUFBTSxDQUFVLGNBQWMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWpFLHVEQUF1RDtJQUN2RCxJQUFJLENBQXFCO0lBRXpCLHlIQUF5SDtJQUNoSCxNQUFNLEdBQUcsRUFBMkIsQ0FBQztJQUU5Qzs7O3dFQUdvRTtJQUNwRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUVSLE1BQU0sR0FBRyxFQUFhLENBQUM7SUFDdkIsU0FBUyxHQUFHLEVBQThCLENBQUM7SUFDcEQsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUM1QyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFFMUIsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFhLEdBQUcsRUFBRSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQztJQUU5RCxZQUFhLElBQXdCO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2xC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QUFHLFNBQVMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFFLEtBQWlCO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQsU0FBUyxDQUFFLEtBQWlCO1FBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsR0FBRyxDQUFFLEtBQWlCO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQsT0FBTyxDQUFFLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsUUFBUSxDQUFFLEtBQWlCO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFFLEtBQWlCLEVBQUUsS0FBWTtRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLElB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QUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWUgZXhwZWN0cyBzb21lIG51bGxhYmxlIHRvIG5vdCBiZSBudWxsICovXG5cbmltcG9ydCB7IEFuaW1hdGlvbiwgQXR0YWNobWVudFRpbWVsaW5lLCBEcmF3T3JkZXJGb2xkZXJUaW1lbGluZSwgRHJhd09yZGVyVGltZWxpbmUsIEV2ZW50VGltZWxpbmUsIE1peEZyb20sIFJvdGF0ZVRpbWVsaW5lLCBUaW1lbGluZSB9IGZyb20gXCIuL0FuaW1hdGlvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBbmltYXRpb25TdGF0ZURhdGEgfSBmcm9tIFwiLi9BbmltYXRpb25TdGF0ZURhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tIFwiLi9FdmVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3QgfSBmcm9tIFwiLi9TbG90LmpzXCI7XG5pbXBvcnQgeyBJbnRlcnBvbGF0aW9uLCBNYXRoVXRpbHMsIFBvb2wsIFV0aWxzIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuXG4vKiogQXBwbGllcyBhbmltYXRpb25zIG92ZXIgdGltZSwgcXVldWVzIGFuaW1hdGlvbnMgZm9yIGxhdGVyIHBsYXliYWNrLCBtaXhlcyAoY3Jvc3NmYWRpbmcpIGJldHdlZW4gYW5pbWF0aW9ucywgYW5kIGFwcGxpZXNcbiAqIG11bHRpcGxlIGFuaW1hdGlvbnMgb24gdG9wIG9mIGVhY2ggb3RoZXIgKGxheWVyaW5nKS5cbiAqXG4gKiBTZWUgW0FwcGx5aW5nIEFuaW1hdGlvbnNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1hcHBseWluZy1hbmltYXRpb25zI0FuaW1hdGlvblN0YXRlLUFQSSkgaW4gdGhlIFNwaW5lIFJ1bnRpbWVzIEd1aWRlLiAqL1xuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblN0YXRlIHtcblx0c3RhdGljIHJlYWRvbmx5IGVtcHR5QW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbihcIjxlbXB0eT5cIiwgW10sIDApO1xuXG5cdC8qKiBUaGUgQW5pbWF0aW9uU3RhdGVEYXRhIHRvIGxvb2sgdXAgbWl4IGR1cmF0aW9ucy4gKi9cblx0ZGF0YTogQW5pbWF0aW9uU3RhdGVEYXRhO1xuXG5cdC8qKiBUaGUgbGlzdCBvZiB0cmFja3MgdGhhdCBoYXZlIGhhZCBhbmltYXRpb25zLiBNYXkgY29udGFpbiBudWxsIGVudHJpZXMgZm9yIHRyYWNrcyB0aGF0IGN1cnJlbnRseSBoYXZlIG5vIGFuaW1hdGlvbi4gKi9cblx0cmVhZG9ubHkgdHJhY2tzID0gW10gYXMgKFRyYWNrRW50cnkgfCBudWxsKVtdO1xuXG5cdC8qKiBNdWx0aXBsaWVyIGZvciB0aGUgZGVsdGEgdGltZSB3aGVuIHRoZSBhbmltYXRpb24gc3RhdGUgaXMgdXBkYXRlZCwgY2F1c2luZyB0aW1lIGZvciBhbGwgYW5pbWF0aW9ucyBhbmQgbWl4ZXMgdG8gcGxheSBzbG93ZXJcblx0ICogb3IgZmFzdGVyLiBEZWZhdWx0cyB0byAxLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFRyYWNrRW50cnkudGltZVNjYWxlfSB0byBhZmZlY3QgYSBzaW5nbGUgYW5pbWF0aW9uLiAqL1xuXHR0aW1lU2NhbGUgPSAxO1xuXHR1bmtleWVkU3RhdGUgPSAwO1xuXG5cdHJlYWRvbmx5IGV2ZW50cyA9IFtdIGFzIEV2ZW50W107XG5cdHJlYWRvbmx5IGxpc3RlbmVycyA9IFtdIGFzIEFuaW1hdGlvblN0YXRlTGlzdGVuZXJbXTtcblx0cXVldWUgPSBuZXcgRXZlbnRRdWV1ZSh0aGlzKTtcblx0cHJvcGVydHlJZHMgPSBuZXcgTWFwPHN0cmluZywgVHJhY2tFbnRyeT4oKTtcblx0YW5pbWF0aW9uc0NoYW5nZWQgPSBmYWxzZTtcblxuXHR0cmFja0VudHJ5UG9vbCA9IG5ldyBQb29sPFRyYWNrRW50cnk+KCgpID0+IG5ldyBUcmFja0VudHJ5KCkpO1xuXG5cdGNvbnN0cnVjdG9yIChkYXRhOiBBbmltYXRpb25TdGF0ZURhdGEpIHtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHR9XG5cblx0LyoqIEluY3JlbWVudHMgZWFjaCB0cmFjayBlbnRyeSB7QGxpbmsgVHJhY2tFbnRyeS50cmFja1RpbWV9LCBzZXR0aW5nIHF1ZXVlZCBhbmltYXRpb25zIGFzIGN1cnJlbnQgaWYgbmVlZGVkLiAqL1xuXHR1cGRhdGUgKGRlbHRhOiBudW1iZXIpIHtcblx0XHRkZWx0YSAqPSB0aGlzLnRpbWVTY2FsZTtcblx0XHRjb25zdCB0cmFja3MgPSB0aGlzLnRyYWNrcztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGN1cnJlbnQgPSB0cmFja3NbaV07XG5cdFx0XHRpZiAoIWN1cnJlbnQpIGNvbnRpbnVlO1xuXG5cdFx0XHRjdXJyZW50LmFuaW1hdGlvbkxhc3QgPSBjdXJyZW50Lm5leHRBbmltYXRpb25MYXN0O1xuXHRcdFx0Y3VycmVudC50cmFja0xhc3QgPSBjdXJyZW50Lm5leHRUcmFja0xhc3Q7XG5cblx0XHRcdGxldCBjdXJyZW50RGVsdGEgPSBkZWx0YSAqIGN1cnJlbnQudGltZVNjYWxlO1xuXG5cdFx0XHRpZiAoY3VycmVudC5kZWxheSA+IDApIHtcblx0XHRcdFx0Y3VycmVudC5kZWxheSAtPSBjdXJyZW50RGVsdGE7XG5cdFx0XHRcdGlmIChjdXJyZW50LmRlbGF5ID4gMCkgY29udGludWU7XG5cdFx0XHRcdGN1cnJlbnREZWx0YSA9IC1jdXJyZW50LmRlbGF5O1xuXHRcdFx0XHRjdXJyZW50LmRlbGF5ID0gMDtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG5leHQgPSBjdXJyZW50Lm5leHQ7XG5cdFx0XHRpZiAobmV4dCkge1xuXHRcdFx0XHQvLyBXaGVuIHRoZSBuZXh0IGVudHJ5J3MgZGVsYXkgaXMgcGFzc2VkLCBjaGFuZ2UgdG8gdGhlIG5leHQgZW50cnksIHByZXNlcnZpbmcgbGVmdG92ZXIgdGltZS5cblx0XHRcdFx0Y29uc3QgbmV4dFRpbWUgPSBjdXJyZW50LnRyYWNrTGFzdCAtIG5leHQuZGVsYXk7XG5cdFx0XHRcdGlmIChuZXh0VGltZSA+PSAwKSB7XG5cdFx0XHRcdFx0bmV4dC5kZWxheSA9IDA7XG5cdFx0XHRcdFx0bmV4dC50cmFja1RpbWUgKz0gY3VycmVudC50aW1lU2NhbGUgPT09IDAgPyAwIDogKG5leHRUaW1lIC8gY3VycmVudC50aW1lU2NhbGUgKyBkZWx0YSkgKiBuZXh0LnRpbWVTY2FsZTtcblx0XHRcdFx0XHRjdXJyZW50LnRyYWNrVGltZSArPSBjdXJyZW50RGVsdGE7XG5cdFx0XHRcdFx0dGhpcy5zZXRUcmFjayhpLCBuZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR3aGlsZSAobmV4dC5taXhpbmdGcm9tKSB7XG5cdFx0XHRcdFx0XHRuZXh0Lm1peFRpbWUgKz0gZGVsdGE7XG5cdFx0XHRcdFx0XHRuZXh0ID0gbmV4dC5taXhpbmdGcm9tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChjdXJyZW50LnRyYWNrTGFzdCA+PSBjdXJyZW50LnRyYWNrRW5kICYmICFjdXJyZW50Lm1peGluZ0Zyb20pIHtcblx0XHRcdFx0dHJhY2tzW2ldID0gbnVsbDtcblx0XHRcdFx0dGhpcy5xdWV1ZS5lbmQoY3VycmVudCk7XG5cdFx0XHRcdHRoaXMuY2xlYXJOZXh0KGN1cnJlbnQpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50Lm1peGluZ0Zyb20gJiYgdGhpcy51cGRhdGVNaXhpbmdGcm9tKGN1cnJlbnQsIGRlbHRhKSkge1xuXHRcdFx0XHQvLyBFbmQgbWl4aW5nIGZyb20gZW50cmllcyBvbmNlIGFsbCBoYXZlIGNvbXBsZXRlZC5cblx0XHRcdFx0bGV0IGZyb206IFRyYWNrRW50cnkgfCBudWxsID0gY3VycmVudC5taXhpbmdGcm9tO1xuXHRcdFx0XHRjdXJyZW50Lm1peGluZ0Zyb20gPSBudWxsO1xuXHRcdFx0XHRpZiAoZnJvbSkgZnJvbS5taXhpbmdUbyA9IG51bGw7XG5cdFx0XHRcdHdoaWxlIChmcm9tKSB7XG5cdFx0XHRcdFx0dGhpcy5xdWV1ZS5lbmQoZnJvbSk7XG5cdFx0XHRcdFx0ZnJvbSA9IGZyb20ubWl4aW5nRnJvbTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50LnRyYWNrVGltZSArPSBjdXJyZW50RGVsdGE7XG5cdFx0fVxuXG5cdFx0dGhpcy5xdWV1ZS5kcmFpbigpO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSB3aGVuIGFsbCBtaXhpbmcgZnJvbSBlbnRyaWVzIGFyZSBjb21wbGV0ZS4gKi9cblx0dXBkYXRlTWl4aW5nRnJvbSAodG86IFRyYWNrRW50cnksIGRlbHRhOiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRjb25zdCBmcm9tID0gdG8ubWl4aW5nRnJvbTtcblx0XHRpZiAoIWZyb20pIHJldHVybiB0cnVlO1xuXG5cdFx0Y29uc3QgZmluaXNoZWQgPSB0aGlzLnVwZGF0ZU1peGluZ0Zyb20oZnJvbSwgZGVsdGEpO1xuXG5cdFx0ZnJvbS5hbmltYXRpb25MYXN0ID0gZnJvbS5uZXh0QW5pbWF0aW9uTGFzdDtcblx0XHRmcm9tLnRyYWNrTGFzdCA9IGZyb20ubmV4dFRyYWNrTGFzdDtcblxuXHRcdC8vIFRoZSBmcm9tIGVudHJ5IHdhcyBhcHBsaWVkIGF0IGxlYXN0IG9uY2UgYW5kIHRoZSBtaXggaXMgY29tcGxldGUuXG5cdFx0aWYgKHRvLm5leHRUcmFja0xhc3QgIT09IC0xICYmIHRvLm1peFRpbWUgPj0gdG8ubWl4RHVyYXRpb24pIHtcblx0XHRcdC8vIE1peGluZyBpcyBjb21wbGV0ZSBmb3IgYWxsIGVudHJpZXMgYmVmb3JlIHRoZSBmcm9tIGVudHJ5IG9yIHRoZSBtaXggaXMgaW5zdGFudGFuZW91cy5cblx0XHRcdGlmIChmcm9tLnRvdGFsQWxwaGEgPT09IDAgfHwgdG8ubWl4RHVyYXRpb24gPT09IDApIHtcblx0XHRcdFx0dG8ubWl4aW5nRnJvbSA9IGZyb20ubWl4aW5nRnJvbTtcblx0XHRcdFx0aWYgKGZyb20ubWl4aW5nRnJvbSAhPSBudWxsKSBmcm9tLm1peGluZ0Zyb20ubWl4aW5nVG8gPSB0bztcblx0XHRcdFx0aWYgKGZyb20udG90YWxBbHBoYSA9PT0gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IG5leHQgPSB0bzsgbmV4dC5taXhpbmdUbyAhPSBudWxsOyBuZXh0ID0gbmV4dC5taXhpbmdUbylcblx0XHRcdFx0XHRcdG5leHQua2VlcEhvbGQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMucXVldWUuZW5kKGZyb20pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZpbmlzaGVkO1xuXHRcdH1cblxuXHRcdGZyb20udHJhY2tUaW1lICs9IGRlbHRhICogZnJvbS50aW1lU2NhbGU7XG5cdFx0dG8ubWl4VGltZSArPSBkZWx0YTtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKiogUG9zZXMgdGhlIHNrZWxldG9uIHVzaW5nIHRoZSB0cmFjayBlbnRyeSBhbmltYXRpb25zLiBUaGUgYW5pbWF0aW9uIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLCBzbyBjYW4gYmUgYXBwbGllZCB0byBtdWx0aXBsZVxuXHQgKiBza2VsZXRvbnMgdG8gcG9zZSB0aGVtIGlkZW50aWNhbGx5LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGFueSBhbmltYXRpb25zIHdlcmUgYXBwbGllZC4gKi9cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbik6IGJvb2xlYW4ge1xuXHRcdGlmICghc2tlbGV0b24pIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRpZiAodGhpcy5hbmltYXRpb25zQ2hhbmdlZCkgdGhpcy5fYW5pbWF0aW9uc0NoYW5nZWQoKTtcblxuXHRcdGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuXHRcdGNvbnN0IHRyYWNrcyA9IHRoaXMudHJhY2tzO1xuXHRcdGxldCBhcHBsaWVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGN1cnJlbnQgPSB0cmFja3NbaV07XG5cdFx0XHRpZiAoIWN1cnJlbnQgfHwgY3VycmVudC5kZWxheSA+IDApIGNvbnRpbnVlO1xuXHRcdFx0YXBwbGllZCA9IHRydWU7XG5cblx0XHRcdC8vIEFwcGx5IG1peGluZyBmcm9tIGVudHJpZXMgZmlyc3QuXG5cdFx0XHRsZXQgYWxwaGEgPSBjdXJyZW50LmFscGhhO1xuXHRcdFx0aWYgKGN1cnJlbnQubWl4aW5nRnJvbSlcblx0XHRcdFx0YWxwaGEgKj0gdGhpcy5hcHBseU1peGluZ0Zyb20oY3VycmVudCwgc2tlbGV0b24pO1xuXHRcdFx0ZWxzZSBpZiAoY3VycmVudC50cmFja1RpbWUgPj0gY3VycmVudC50cmFja0VuZCAmJiAhY3VycmVudC5uZXh0KVxuXHRcdFx0XHRhbHBoYSA9IDA7XG5cblx0XHRcdC8vIEFwcGx5IGN1cnJlbnQgZW50cnkuXG5cdFx0XHRsZXQgYW5pbWF0aW9uTGFzdCA9IGN1cnJlbnQuYW5pbWF0aW9uTGFzdCwgYW5pbWF0aW9uVGltZSA9IGN1cnJlbnQuZ2V0QW5pbWF0aW9uVGltZSgpLCBhcHBseVRpbWUgPSBhbmltYXRpb25UaW1lO1xuXHRcdFx0bGV0IGFwcGx5RXZlbnRzOiBFdmVudFtdIHwgbnVsbCA9IGV2ZW50cztcblx0XHRcdGlmIChjdXJyZW50LnJldmVyc2UpIHtcblx0XHRcdFx0YXBwbHlUaW1lID0gY3VycmVudC5hbmltYXRpb24hLmR1cmF0aW9uIC0gYXBwbHlUaW1lO1xuXHRcdFx0XHRhcHBseUV2ZW50cyA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0aW1lbGluZXMgPSBjdXJyZW50LmFuaW1hdGlvbiEudGltZWxpbmVzO1xuXHRcdFx0Y29uc3QgdGltZWxpbmVDb3VudCA9IHRpbWVsaW5lcy5sZW5ndGg7XG5cdFx0XHRpZiAoKGkgPT09IDAgJiYgYWxwaGEgPT09IDEpKSB7XG5cdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCB0aW1lbGluZUNvdW50OyBpaSsrKSB7XG5cdFx0XHRcdFx0Ly8gRml4ZXMgaXNzdWUgIzMwMiBvbiBJT1M5IHdoZXJlIG1peCwgYmxlbmQgc29tZXRpbWVzIGJlY2FtZSB1bmRlZmluZWQgYW5kIGNhdXNlZCBhc3NldHNcblx0XHRcdFx0XHQvLyB0byBzb21ldGltZXMgc3RvcCByZW5kZXJpbmcgd2hlbiB1c2luZyBjb2xvciBjb3JyZWN0aW9uLCBhcyB0aGVpciBSR0JBIHZhbHVlcyBiZWNvbWUgTmFOLlxuXHRcdFx0XHRcdC8vIChodHRwczovL2dpdGh1Yi5jb20vcGl4aWpzL3BpeGktc3BpbmUvaXNzdWVzLzMwMilcblx0XHRcdFx0XHRVdGlscy53ZWJraXQ2MDJCdWdmaXhIZWxwZXIoYWxwaGEpO1xuXHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gdGltZWxpbmVzW2lpXTtcblx0XHRcdFx0XHRpZiAodGltZWxpbmUgaW5zdGFuY2VvZiBBdHRhY2htZW50VGltZWxpbmUpXG5cdFx0XHRcdFx0XHR0aGlzLmFwcGx5QXR0YWNobWVudFRpbWVsaW5lKHRpbWVsaW5lLCBza2VsZXRvbiwgYXBwbHlUaW1lLCBNaXhGcm9tLnNldHVwLCB0cnVlKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aW1lbGluZS5hcHBseShza2VsZXRvbiwgYW5pbWF0aW9uTGFzdCwgYXBwbHlUaW1lLCBhcHBseUV2ZW50cywgYWxwaGEsIE1peEZyb20uc2V0dXAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB0aW1lbGluZU1vZGUgPSBjdXJyZW50LnRpbWVsaW5lTW9kZTtcblx0XHRcdFx0Y29uc3QgcmV0YWluQXR0YWNobWVudHMgPSBhbHBoYSA+PSBjdXJyZW50LmFscGhhQXR0YWNobWVudFRocmVzaG9sZDtcblx0XHRcdFx0Y29uc3QgYWRkID0gY3VycmVudC5hZGRpdGl2ZSwgc2hvcnRlc3RSb3RhdGlvbiA9IGFkZCB8fCBjdXJyZW50LnNob3J0ZXN0Um90YXRpb247XG5cdFx0XHRcdGNvbnN0IGZpcnN0RnJhbWUgPSAhc2hvcnRlc3RSb3RhdGlvbiAmJiBjdXJyZW50LnRpbWVsaW5lc1JvdGF0aW9uLmxlbmd0aCAhPT0gdGltZWxpbmVDb3VudCA8PCAxO1xuXHRcdFx0XHRpZiAoZmlyc3RGcmFtZSkgY3VycmVudC50aW1lbGluZXNSb3RhdGlvbi5sZW5ndGggPSB0aW1lbGluZUNvdW50IDw8IDE7XG5cblx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHRpbWVsaW5lQ291bnQ7IGlpKyspIHtcblx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IHRpbWVsaW5lc1tpaV07XG5cdFx0XHRcdFx0Y29uc3QgZnJvbSA9IHRpbWVsaW5lTW9kZVtpaV0gJiBNT0RFO1xuXHRcdFx0XHRcdGlmICghc2hvcnRlc3RSb3RhdGlvbiAmJiB0aW1lbGluZSBpbnN0YW5jZW9mIFJvdGF0ZVRpbWVsaW5lKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmFwcGx5Um90YXRlVGltZWxpbmUodGltZWxpbmUsIHNrZWxldG9uLCBhcHBseVRpbWUsIGFscGhhLCBmcm9tLCBjdXJyZW50LnRpbWVsaW5lc1JvdGF0aW9uLCBpaSA8PCAxLCBmaXJzdEZyYW1lKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWVsaW5lIGluc3RhbmNlb2YgQXR0YWNobWVudFRpbWVsaW5lKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmFwcGx5QXR0YWNobWVudFRpbWVsaW5lKHRpbWVsaW5lLCBza2VsZXRvbiwgYXBwbHlUaW1lLCBmcm9tLCByZXRhaW5BdHRhY2htZW50cyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoaXMgZml4ZXMgdGhlIFdlYktpdCA2MDIgc3BlY2lmaWMgaXNzdWUgZGVzY3JpYmVkIGF0IGh0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vZm9ydW0vZC8xMDEwOS1pb3MtMTAtZGlzYXBwZWFyaW5nLWdyYXBoaWNzXG5cdFx0XHRcdFx0XHRVdGlscy53ZWJraXQ2MDJCdWdmaXhIZWxwZXIoYWxwaGEpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmUuYXBwbHkoc2tlbGV0b24sIGFuaW1hdGlvbkxhc3QsIGFwcGx5VGltZSwgYXBwbHlFdmVudHMsIGFscGhhLCBmcm9tLCBhZGQsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoY3VycmVudC5yZXZlcnNlKSB0aGlzLmV2ZW50c1JldmVyc2UoY3VycmVudCwgYW5pbWF0aW9uTGFzdCwgYW5pbWF0aW9uVGltZSk7XG5cdFx0XHR0aGlzLnF1ZXVlRXZlbnRzKGN1cnJlbnQsIGFuaW1hdGlvblRpbWUpO1xuXHRcdFx0ZXZlbnRzLmxlbmd0aCA9IDA7XG5cdFx0XHRjdXJyZW50Lm5leHRBbmltYXRpb25MYXN0ID0gYW5pbWF0aW9uVGltZTtcblx0XHRcdGN1cnJlbnQubmV4dFRyYWNrTGFzdCA9IGN1cnJlbnQudHJhY2tUaW1lO1xuXHRcdH1cblxuXHRcdC8vIFNldCBzbG90IGF0dGFjaG1lbnRzIHRvIHRoZSBzZXR1cCBwb3NlIGlmIHRoZXkgd2VyZSBzZXQgdGVtcG9yYXJpbHkgdG8gYXBwbHkgZGVmb3JtIHRpbWVsaW5lcy5cblx0XHRjb25zdCBzZXR1cFN0YXRlID0gdGhpcy51bmtleWVkU3RhdGUgKyBBVFRBQ0hfU0VUVVA7XG5cdFx0Y29uc3Qgc2xvdHMgPSBza2VsZXRvbi5zbG90cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNrZWxldG9uLnNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IHNsb3RzW2ldO1xuXHRcdFx0aWYgKHNsb3QuYXR0YWNobWVudFN0YXRlID09PSBzZXR1cFN0YXRlKSB7XG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnROYW1lID0gc2xvdC5kYXRhLmF0dGFjaG1lbnROYW1lO1xuXHRcdFx0XHRzbG90LnBvc2Uuc2V0QXR0YWNobWVudCghYXR0YWNobWVudE5hbWUgPyBudWxsIDogc2tlbGV0b24uZ2V0QXR0YWNobWVudChzbG90LmRhdGEuaW5kZXgsIGF0dGFjaG1lbnROYW1lKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMudW5rZXllZFN0YXRlICs9IDI7IC8vIFJlc2V0LlxuXG5cdFx0dGhpcy5xdWV1ZS5kcmFpbigpO1xuXHRcdHJldHVybiBhcHBsaWVkO1xuXHR9XG5cblx0YXBwbHlNaXhpbmdGcm9tICh0bzogVHJhY2tFbnRyeSwgc2tlbGV0b246IFNrZWxldG9uKSB7XG5cdFx0Y29uc3QgZnJvbSA9IHRvLm1peGluZ0Zyb20hO1xuXHRcdGNvbnN0IGZyb21NaXggPSBmcm9tLm1peGluZ0Zyb20gIT09IG51bGwgPyB0aGlzLmFwcGx5TWl4aW5nRnJvbShmcm9tLCBza2VsZXRvbikgOiAxO1xuXHRcdGNvbnN0IG1peCA9IHRvLm1peCgpO1xuXG5cdFx0Y29uc3QgYSA9IGZyb20uYWxwaGEgKiBmcm9tTWl4LCBrZWVwID0gMSAtIG1peCAqIHRvLmFscGhhO1xuXHRcdGNvbnN0IGFscGhhTWl4ID0gYSAqICgxIC0gbWl4KSwgYWxwaGFIb2xkID0ga2VlcCA+IDAgPyBhbHBoYU1peCAvIGtlZXAgOiBhO1xuXG5cdFx0Y29uc3QgdGltZWxpbmVzID0gZnJvbS5hbmltYXRpb24hLnRpbWVsaW5lcztcblx0XHRjb25zdCB0aW1lbGluZUNvdW50ID0gdGltZWxpbmVzLmxlbmd0aDtcblx0XHRjb25zdCB0aW1lbGluZU1vZGUgPSBmcm9tLnRpbWVsaW5lTW9kZTtcblx0XHRjb25zdCB0aW1lbGluZUhvbGRNaXggPSBmcm9tLnRpbWVsaW5lSG9sZE1peDtcblxuXHRcdGNvbnN0IHJldGFpbkF0dGFjaG1lbnRzID0gbWl4IDwgZnJvbS5taXhBdHRhY2htZW50VGhyZXNob2xkLCBkcmF3T3JkZXIgPSBtaXggPCBmcm9tLm1peERyYXdPcmRlclRocmVzaG9sZDtcblx0XHRjb25zdCBhZGQgPSBmcm9tLmFkZGl0aXZlLCBzaG9ydGVzdFJvdGF0aW9uID0gYWRkIHx8IGZyb20uc2hvcnRlc3RSb3RhdGlvbjtcblx0XHRjb25zdCBmaXJzdEZyYW1lID0gIXNob3J0ZXN0Um90YXRpb24gJiYgZnJvbS50aW1lbGluZXNSb3RhdGlvbi5sZW5ndGggIT09IHRpbWVsaW5lQ291bnQgPDwgMTtcblx0XHRpZiAoZmlyc3RGcmFtZSkgZnJvbS50aW1lbGluZXNSb3RhdGlvbi5sZW5ndGggPSB0aW1lbGluZUNvdW50IDw8IDE7XG5cdFx0Y29uc3QgdGltZWxpbmVzUm90YXRpb24gPSBmcm9tLnRpbWVsaW5lc1JvdGF0aW9uO1xuXG5cdFx0bGV0IGFuaW1hdGlvbkxhc3QgPSBmcm9tLmFuaW1hdGlvbkxhc3QsIGFuaW1hdGlvblRpbWUgPSBmcm9tLmdldEFuaW1hdGlvblRpbWUoKSwgYXBwbHlUaW1lID0gYW5pbWF0aW9uVGltZTtcblx0XHRsZXQgZXZlbnRzID0gbnVsbDtcblx0XHRpZiAoZnJvbS5yZXZlcnNlKVxuXHRcdFx0YXBwbHlUaW1lID0gZnJvbS5hbmltYXRpb24hLmR1cmF0aW9uIC0gYXBwbHlUaW1lO1xuXHRcdGVsc2UgaWYgKG1peCA8IGZyb20uZXZlbnRUaHJlc2hvbGQpIC8vXG5cdFx0XHRldmVudHMgPSB0aGlzLmV2ZW50cztcblxuXHRcdGZyb20udG90YWxBbHBoYSA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVsaW5lQ291bnQ7IGkrKykge1xuXHRcdFx0Y29uc3QgdGltZWxpbmUgPSB0aW1lbGluZXNbaV07XG5cdFx0XHRjb25zdCBtb2RlID0gdGltZWxpbmVNb2RlW2ldO1xuXHRcdFx0Y29uc3QgbWl4RnJvbSA9IG1vZGUgJiBNT0RFO1xuXHRcdFx0bGV0IGFscGhhID0gMDtcblx0XHRcdGlmICgobW9kZSAmIEhPTEQpICE9PSAwKSB7XG5cdFx0XHRcdGNvbnN0IGhvbGRNaXggPSB0aW1lbGluZUhvbGRNaXhbaV07XG5cdFx0XHRcdGFscGhhID0gaG9sZE1peCA9PSBudWxsID8gYWxwaGFIb2xkIDogYWxwaGFIb2xkICogKDEgLSBob2xkTWl4Lm1peCgpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghZHJhd09yZGVyICYmIHRpbWVsaW5lIGluc3RhbmNlb2YgRHJhd09yZGVyVGltZWxpbmUgJiYgbWl4RnJvbSA9PT0gTWl4RnJvbS5jdXJyZW50KSBjb250aW51ZTtcblx0XHRcdFx0YWxwaGEgPSBhbHBoYU1peDtcblx0XHRcdH1cblx0XHRcdGZyb20udG90YWxBbHBoYSArPSBhbHBoYTtcblx0XHRcdGlmICghc2hvcnRlc3RSb3RhdGlvbiAmJiB0aW1lbGluZSBpbnN0YW5jZW9mIFJvdGF0ZVRpbWVsaW5lKSB7XG5cdFx0XHRcdHRoaXMuYXBwbHlSb3RhdGVUaW1lbGluZSh0aW1lbGluZSwgc2tlbGV0b24sIGFwcGx5VGltZSwgYWxwaGEsIG1peEZyb20sIHRpbWVsaW5lc1JvdGF0aW9uLCBpIDw8IDEsIGZpcnN0RnJhbWUpO1xuXHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZSBpbnN0YW5jZW9mIEF0dGFjaG1lbnRUaW1lbGluZSlcblx0XHRcdFx0dGhpcy5hcHBseUF0dGFjaG1lbnRUaW1lbGluZSh0aW1lbGluZSwgc2tlbGV0b24sIGFwcGx5VGltZSwgbWl4RnJvbSxcblx0XHRcdFx0XHRyZXRhaW5BdHRhY2htZW50cyAmJiBhbHBoYSA+PSBmcm9tLmFscGhhQXR0YWNobWVudFRocmVzaG9sZCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb3V0ID0gIWRyYXdPcmRlciB8fCAhKHRpbWVsaW5lIGluc3RhbmNlb2YgRHJhd09yZGVyVGltZWxpbmUpIHx8IG1peEZyb20gPT09IE1peEZyb20uY3VycmVudDtcblx0XHRcdFx0dGltZWxpbmUuYXBwbHkoc2tlbGV0b24sIGFuaW1hdGlvbkxhc3QsIGFwcGx5VGltZSwgZXZlbnRzLCBhbHBoYSwgbWl4RnJvbSwgYWRkLCBvdXQsIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZnJvbS5yZXZlcnNlICYmIG1peCA8IGZyb20uZXZlbnRUaHJlc2hvbGQpIHRoaXMuZXZlbnRzUmV2ZXJzZShmcm9tLCBhbmltYXRpb25MYXN0LCBhbmltYXRpb25UaW1lKTtcblx0XHRpZiAodG8ubWl4RHVyYXRpb24gPiAwKSB0aGlzLnF1ZXVlRXZlbnRzKGZyb20sIGFuaW1hdGlvblRpbWUpO1xuXHRcdHRoaXMuZXZlbnRzLmxlbmd0aCA9IDA7XG5cblx0XHRmcm9tLm5leHRBbmltYXRpb25MYXN0ID0gYW5pbWF0aW9uVGltZTtcblx0XHRmcm9tLm5leHRUcmFja0xhc3QgPSBmcm9tLnRyYWNrVGltZTtcblx0XHRyZXR1cm4gbWl4O1xuXHR9XG5cblx0LyoqIEFwcGxpZXMgdGhlIGF0dGFjaG1lbnQgdGltZWxpbmUgYW5kIHNldHMge0BsaW5rIFNsb3QuYXR0YWNobWVudFN0YXRlfS5cblx0ICogQHBhcmFtIHJldGFpbiBUcnVlIGlmIHRoZSBhdHRhY2htZW50IHJlbWFpbnMgYWZ0ZXIgYXBwbHksIGZhbHNlIGlmIHRlbXBvcmFyeSBmb3IgZGVmb3JtIHRpbWVsaW5lcy4gKi9cblx0YXBwbHlBdHRhY2htZW50VGltZWxpbmUgKHRpbWVsaW5lOiBBdHRhY2htZW50VGltZWxpbmUsIHNrZWxldG9uOiBTa2VsZXRvbiwgdGltZTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLCByZXRhaW46IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzbG90ID0gc2tlbGV0b24uc2xvdHNbdGltZWxpbmUuc2xvdEluZGV4XTtcblx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIHJldHVybjtcblx0XHRpZiAoIXJldGFpbiAmJiBzbG90LmF0dGFjaG1lbnRTdGF0ZSA9PT0gdGhpcy51bmtleWVkU3RhdGUgKyBBVFRBQ0hfUkVUQUlOKSByZXR1cm47XG5cblx0XHRsZXQgc2V0dXAgPSB0aW1lIDwgdGltZWxpbmUuZnJhbWVzWzBdO1xuXHRcdGxldCBuYW1lID0gbnVsbDtcblx0XHRpZiAoIXNldHVwKSB7XG5cdFx0XHRuYW1lID0gdGltZWxpbmUuYXR0YWNobWVudE5hbWVzW1RpbWVsaW5lLnNlYXJjaCh0aW1lbGluZS5mcmFtZXMsIHRpbWUpXTtcblx0XHRcdHNldHVwID0gIXJldGFpbiAmJiBuYW1lID09IG51bGw7XG5cdFx0fVxuXHRcdGlmIChzZXR1cCkge1xuXHRcdFx0aWYgKGZyb20gPT09IE1peEZyb20uY3VycmVudCkgcmV0dXJuO1xuXHRcdFx0bmFtZSA9IHNsb3QuZGF0YS5hdHRhY2htZW50TmFtZTtcblx0XHR9XG5cdFx0c2xvdC5wb3NlLnNldEF0dGFjaG1lbnQobmFtZSA9PSBudWxsID8gbnVsbCA6IHNrZWxldG9uLmdldEF0dGFjaG1lbnQoc2xvdC5kYXRhLmluZGV4LCBuYW1lKSk7XG5cdFx0aWYgKHJldGFpbilcblx0XHRcdHNsb3QuYXR0YWNobWVudFN0YXRlID0gdGhpcy51bmtleWVkU3RhdGUgKyBBVFRBQ0hfUkVUQUlOO1xuXHRcdGVsc2UgaWYgKCFzZXR1cCkgLy9cblx0XHRcdHNsb3QuYXR0YWNobWVudFN0YXRlID0gdGhpcy51bmtleWVkU3RhdGUgKyBBVFRBQ0hfU0VUVVA7XG5cdH1cblxuXHQvKiogQXBwbGllcyB0aGUgcm90YXRlIHRpbWVsaW5lLCBtaXhpbmcgd2l0aCB0aGUgY3VycmVudCBwb3NlIHdoaWxlIGtlZXBpbmcgdGhlIHNhbWUgcm90YXRpb24gZGlyZWN0aW9uIGNob3NlbiBhcyB0aGUgc2hvcnRlc3Rcblx0ICogdGhlIGZpcnN0IHRpbWUgdGhlIG1peGluZyB3YXMgYXBwbGllZC4gKi9cblx0YXBwbHlSb3RhdGVUaW1lbGluZSAodGltZWxpbmU6IFJvdGF0ZVRpbWVsaW5lLCBza2VsZXRvbjogU2tlbGV0b24sIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHR0aW1lbGluZXNSb3RhdGlvbjogQXJyYXk8bnVtYmVyPiwgaTogbnVtYmVyLCBmaXJzdEZyYW1lOiBib29sZWFuKSB7XG5cblx0XHRpZiAoZmlyc3RGcmFtZSkgdGltZWxpbmVzUm90YXRpb25baV0gPSAwO1xuXG5cdFx0aWYgKGFscGhhID09PSAxKSB7XG5cdFx0XHR0aW1lbGluZS5hcHBseShza2VsZXRvbiwgMCwgdGltZSwgbnVsbCwgMSwgZnJvbSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RpbWVsaW5lLmJvbmVJbmRleF07XG5cdFx0aWYgKCFib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBib25lLnBvc2UsIHNldHVwID0gYm9uZS5kYXRhLnNldHVwUG9zZTtcblx0XHRjb25zdCBmcmFtZXMgPSB0aW1lbGluZS5mcmFtZXM7XG5cdFx0bGV0IHIxOiBudW1iZXIsIHIyOiBudW1iZXI7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdHN3aXRjaCAoZnJvbSkge1xuXHRcdFx0XHRjYXNlIE1peEZyb20uc2V0dXA6IHtcblx0XHRcdFx0XHRwb3NlLnJvdGF0aW9uID0gc2V0dXAucm90YXRpb247XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5jdXJyZW50OiB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyMSA9IHBvc2Uucm90YXRpb247XG5cdFx0XHRyMiA9IHNldHVwLnJvdGF0aW9uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyMSA9IGZyb20gPT09IE1peEZyb20uc2V0dXAgPyBzZXR1cC5yb3RhdGlvbiA6IHBvc2Uucm90YXRpb247XG5cdFx0XHRyMiA9IHNldHVwLnJvdGF0aW9uICsgdGltZWxpbmUuZ2V0Q3VydmVWYWx1ZSh0aW1lKTtcblx0XHR9XG5cblx0XHQvLyBNaXggYmV0d2VlbiByb3RhdGlvbnMgdXNpbmcgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc2hvcnRlc3Qgcm91dGUgb24gdGhlIGZpcnN0IGZyYW1lIHdoaWxlIGRldGVjdGluZyBjcm9zc2VzLlxuXHRcdGxldCB0b3RhbCA9IDAsIGRpZmYgPSByMiAtIHIxO1xuXHRcdGRpZmYgLT0gTWF0aC5jZWlsKGRpZmYgLyAzNjAgLSAwLjUpICogMzYwO1xuXHRcdGlmIChkaWZmID09PSAwKSB7XG5cdFx0XHR0b3RhbCA9IHRpbWVsaW5lc1JvdGF0aW9uW2ldO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgbGFzdFRvdGFsID0gMCwgbGFzdERpZmYgPSAwO1xuXHRcdFx0aWYgKGZpcnN0RnJhbWUpIHtcblx0XHRcdFx0bGFzdFRvdGFsID0gMDtcblx0XHRcdFx0bGFzdERpZmYgPSBkaWZmO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGFzdFRvdGFsID0gdGltZWxpbmVzUm90YXRpb25baV07XG5cdFx0XHRcdGxhc3REaWZmID0gdGltZWxpbmVzUm90YXRpb25baSArIDFdO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbG9vcHMgPSBsYXN0VG90YWwgLSBsYXN0VG90YWwgJSAzNjA7XG5cdFx0XHR0b3RhbCA9IGRpZmYgKyBsb29wcztcblx0XHRcdGxldCBjdXJyZW50ID0gZGlmZiA+PSAwLCBkaXIgPSBsYXN0VG90YWwgPj0gMDtcblx0XHRcdGlmIChNYXRoLmFicyhsYXN0RGlmZikgPD0gOTAgJiYgTWF0aFV0aWxzLnNpZ251bShsYXN0RGlmZikgIT09IE1hdGhVdGlscy5zaWdudW0oZGlmZikpIHtcblx0XHRcdFx0aWYgKE1hdGguYWJzKGxhc3RUb3RhbCAtIGxvb3BzKSA+IDE4MCkge1xuXHRcdFx0XHRcdHRvdGFsICs9IDM2MCAqIE1hdGhVdGlscy5zaWdudW0obGFzdFRvdGFsKTtcblx0XHRcdFx0XHRkaXIgPSBjdXJyZW50O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGxvb3BzICE9PSAwKVxuXHRcdFx0XHRcdHRvdGFsIC09IDM2MCAqIE1hdGhVdGlscy5zaWdudW0obGFzdFRvdGFsKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGRpciA9IGN1cnJlbnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZGlyICE9PSBjdXJyZW50KSB0b3RhbCArPSAzNjAgKiBNYXRoVXRpbHMuc2lnbnVtKGxhc3RUb3RhbCk7XG5cdFx0XHR0aW1lbGluZXNSb3RhdGlvbltpXSA9IHRvdGFsO1xuXHRcdH1cblx0XHR0aW1lbGluZXNSb3RhdGlvbltpICsgMV0gPSBkaWZmO1xuXHRcdHBvc2Uucm90YXRpb24gPSByMSArIHRvdGFsICogYWxwaGE7XG5cdH1cblxuXHRxdWV1ZUV2ZW50cyAoZW50cnk6IFRyYWNrRW50cnksIGFuaW1hdGlvblRpbWU6IG51bWJlcikge1xuXHRcdGNvbnN0IGFuaW1hdGlvblN0YXJ0ID0gZW50cnkuYW5pbWF0aW9uU3RhcnQsIGFuaW1hdGlvbkVuZCA9IGVudHJ5LmFuaW1hdGlvbkVuZCwgZHVyYXRpb24gPSBhbmltYXRpb25FbmQgLSBhbmltYXRpb25TdGFydDtcblx0XHRjb25zdCByZXZlcnNlID0gZW50cnkucmV2ZXJzZTtcblx0XHRsZXQgc3BsaXQgPSBlbnRyeS50cmFja0xhc3QgJSBkdXJhdGlvbjtcblx0XHRpZiAocmV2ZXJzZSkgc3BsaXQgPSBkdXJhdGlvbiAtIHNwbGl0O1xuXG5cdFx0Ly8gUXVldWUgZXZlbnRzIGJlZm9yZSBjb21wbGV0ZS5cblx0XHRjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cztcblx0XHRsZXQgaSA9IDAsIG4gPSBldmVudHMubGVuZ3RoO1xuXHRcdGZvciAoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBldmVudCA9IGV2ZW50c1tpXTtcblx0XHRcdGlmICgoZXZlbnQudGltZSA8IHNwbGl0KSAhPT0gcmV2ZXJzZSkgYnJlYWs7IC8vIGphdmE6IGlmIChldmVudC50aW1lIDwgc3BsaXQgXiByZXZlcnNlKSBicmVhaztcblx0XHRcdGlmIChldmVudC50aW1lID49IGFuaW1hdGlvblN0YXJ0ICYmIGV2ZW50LnRpbWUgPD0gYW5pbWF0aW9uRW5kKSB0aGlzLnF1ZXVlLmV2ZW50KGVudHJ5LCBldmVudCk7XG5cdFx0fVxuXG5cdFx0Ly8gUXVldWUgY29tcGxldGUgaWYgY29tcGxldGVkIGEgbG9vcCBpdGVyYXRpb24gb3IgdGhlIGFuaW1hdGlvbi5cblx0XHRsZXQgY29tcGxldGUgPSBmYWxzZTtcblx0XHRpZiAoZW50cnkubG9vcCkge1xuXHRcdFx0aWYgKGR1cmF0aW9uID09PSAwKVxuXHRcdFx0XHRjb21wbGV0ZSA9IHRydWU7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3QgY3ljbGVzID0gTWF0aC5mbG9vcihlbnRyeS50cmFja1RpbWUgLyBkdXJhdGlvbik7XG5cdFx0XHRcdGNvbXBsZXRlID0gY3ljbGVzID4gMCAmJiBjeWNsZXMgPiBNYXRoLmZsb29yKGVudHJ5LnRyYWNrTGFzdCAvIGR1cmF0aW9uKTtcblx0XHRcdH1cblx0XHR9IGVsc2Vcblx0XHRcdGNvbXBsZXRlID0gYW5pbWF0aW9uVGltZSA+PSBhbmltYXRpb25FbmQgJiYgZW50cnkuYW5pbWF0aW9uTGFzdCA8IGFuaW1hdGlvbkVuZDtcblx0XHRpZiAoY29tcGxldGUpIHRoaXMucXVldWUuY29tcGxldGUoZW50cnkpO1xuXG5cdFx0Ly8gUXVldWUgZXZlbnRzIGFmdGVyIGNvbXBsZXRlLlxuXHRcdGZvciAoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBldmVudCA9IGV2ZW50c1tpXTtcblx0XHRcdGlmIChldmVudC50aW1lID49IGFuaW1hdGlvblN0YXJ0ICYmIGV2ZW50LnRpbWUgPD0gYW5pbWF0aW9uRW5kKSB0aGlzLnF1ZXVlLmV2ZW50KGVudHJ5LCBldmVudCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBldmVudHNSZXZlcnNlIChlbnRyeTogVHJhY2tFbnRyeSwgYW5pbWF0aW9uTGFzdDogbnVtYmVyLCBhbmltYXRpb25UaW1lOiBudW1iZXIpIHtcblx0XHRjb25zdCBkdXJhdGlvbiA9IGVudHJ5LmFuaW1hdGlvbiEuZHVyYXRpb24sIGZyb20gPSBkdXJhdGlvbiAtIGFuaW1hdGlvbkxhc3QsIHRvID0gZHVyYXRpb24gLSBhbmltYXRpb25UaW1lO1xuXHRcdGNvbnN0IHRpbWVsaW5lcyA9IGVudHJ5LmFuaW1hdGlvbiEudGltZWxpbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gZW50cnkuYW5pbWF0aW9uIS50aW1lbGluZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBldmVudFRpbWVsaW5lID0gdGltZWxpbmVzW2ldO1xuXHRcdFx0aWYgKCEoZXZlbnRUaW1lbGluZSBpbnN0YW5jZW9mIEV2ZW50VGltZWxpbmUpKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHRpbWVsaW5lRXZlbnRzID0gZXZlbnRUaW1lbGluZS5ldmVudHM7XG5cdFx0XHRjb25zdCBmcmFtZXMgPSBldmVudFRpbWVsaW5lLmZyYW1lcztcblx0XHRcdGNvbnN0IGZyYW1lQ291bnQgPSBmcmFtZXMubGVuZ3RoO1xuXHRcdFx0aWYgKGZyb20gPj0gdG8pIHsgLy8gZnJvbSAtPiB0b1xuXHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgZnJhbWVDb3VudDsgaWkrKykge1xuXHRcdFx0XHRcdGlmIChmcmFtZXNbaWldIDwgdG8pIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmIChmcmFtZXNbaWldID49IGZyb20pIGJyZWFrO1xuXHRcdFx0XHRcdHRoaXMuZXZlbnRzLnB1c2godGltZWxpbmVFdmVudHNbaWldKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGZyYW1lQ291bnQ7IGlpKyspIHsgLy8gZnJvbSAtPiAwXG5cdFx0XHRcdFx0aWYgKGZyYW1lc1tpaV0gPj0gZnJvbSkgYnJlYWs7XG5cdFx0XHRcdFx0dGhpcy5ldmVudHMucHVzaCh0aW1lbGluZUV2ZW50c1tpaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCBpaSA9IDA7IC8vIGVuZCAtPiB0b1xuXHRcdFx0XHRmb3IgKDsgaWkgPCBmcmFtZUNvdW50OyBpaSsrKVxuXHRcdFx0XHRcdGlmIChmcmFtZXNbaWldID49IHRvKSBicmVhaztcblx0XHRcdFx0Zm9yICg7IGlpIDwgZnJhbWVDb3VudDsgaWkrKylcblx0XHRcdFx0XHR0aGlzLmV2ZW50cy5wdXNoKHRpbWVsaW5lRXZlbnRzW2lpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJlbW92ZXMgYWxsIGFuaW1hdGlvbnMgZnJvbSBhbGwgdHJhY2tzLCBsZWF2aW5nIHNrZWxldG9ucyBpbiB0aGVpciBjdXJyZW50IHBvc2UuXG5cdCAqXG5cdCAqIFVzdWFsbHkgeW91IHdhbnQgdG8gdXNlIHtAbGluayBzZXRFbXB0eUFuaW1hdGlvbnN9IHRvIG1peCB0aGUgc2tlbGV0b25zIGJhY2sgdG8gdGhlIHNldHVwIHBvc2UsIHJhdGhlciB0aGFuIGxlYXZpbmdcblx0ICogdGhlbSBpbiB0aGVpciBjdXJyZW50IHBvc2UuICovXG5cdGNsZWFyVHJhY2tzICgpIHtcblx0XHRjb25zdCBvbGREcmFpbkRpc2FibGVkID0gdGhpcy5xdWV1ZS5kcmFpbkRpc2FibGVkO1xuXHRcdHRoaXMucXVldWUuZHJhaW5EaXNhYmxlZCA9IHRydWU7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHR0aGlzLmNsZWFyVHJhY2soaSk7XG5cdFx0dGhpcy50cmFja3MubGVuZ3RoID0gMDtcblx0XHR0aGlzLnF1ZXVlLmRyYWluRGlzYWJsZWQgPSBvbGREcmFpbkRpc2FibGVkO1xuXHRcdHRoaXMucXVldWUuZHJhaW4oKTtcblx0fVxuXG5cdC8qKiBSZW1vdmVzIGFsbCBhbmltYXRpb25zIGZyb20gdGhlIHRyYWNrLCBsZWF2aW5nIHNrZWxldG9ucyBpbiB0aGVpciBjdXJyZW50IHBvc2UuXG5cdCAqXG5cdCAqIFVzdWFsbHkgeW91IHdhbnQgdG8gdXNlIHtAbGluayBzZXRFbXB0eUFuaW1hdGlvbn0gdG8gbWl4IHRoZSBza2VsZXRvbnMgYmFjayB0byB0aGUgc2V0dXAgcG9zZSwgcmF0aGVyIHRoYW5cblx0ICogbGVhdmluZyB0aGVtIGluIHRoZWlyIGN1cnJlbnQgcG9zZS4gKi9cblx0Y2xlYXJUcmFjayAodHJhY2tJbmRleDogbnVtYmVyKSB7XG5cdFx0aWYgKHRyYWNrSW5kZXggPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFja0luZGV4IG11c3QgYmUgPj0gMC5cIik7XG5cdFx0aWYgKHRyYWNrSW5kZXggPj0gdGhpcy50cmFja3MubGVuZ3RoKSByZXR1cm47XG5cdFx0Y29uc3QgY3VycmVudCA9IHRoaXMudHJhY2tzW3RyYWNrSW5kZXhdO1xuXHRcdGlmICghY3VycmVudCkgcmV0dXJuO1xuXG5cdFx0dGhpcy5xdWV1ZS5lbmQoY3VycmVudCk7XG5cblx0XHR0aGlzLmNsZWFyTmV4dChjdXJyZW50KTtcblxuXHRcdGxldCBlbnRyeSA9IGN1cnJlbnQ7XG5cdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdGNvbnN0IGZyb20gPSBlbnRyeS5taXhpbmdGcm9tO1xuXHRcdFx0aWYgKCFmcm9tKSBicmVhaztcblx0XHRcdHRoaXMucXVldWUuZW5kKGZyb20pO1xuXHRcdFx0ZW50cnkubWl4aW5nRnJvbSA9IG51bGw7XG5cdFx0XHRlbnRyeS5taXhpbmdUbyA9IG51bGw7XG5cdFx0XHRlbnRyeSA9IGZyb207XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFja3NbY3VycmVudC50cmFja0luZGV4XSA9IG51bGw7XG5cblx0XHR0aGlzLnF1ZXVlLmRyYWluKCk7XG5cdH1cblxuXHRzZXRUcmFjayAoaW5kZXg6IG51bWJlciwgY3VycmVudDogVHJhY2tFbnRyeSwgaW50ZXJydXB0OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgZnJvbSA9IHRoaXMuZXhwYW5kVG9JbmRleChpbmRleCk7XG5cdFx0dGhpcy50cmFja3NbaW5kZXhdID0gY3VycmVudDtcblx0XHRjdXJyZW50LnByZXZpb3VzID0gbnVsbDtcblxuXHRcdGlmIChmcm9tKSB7XG5cdFx0XHRmcm9tLm5leHQgPSBudWxsO1xuXHRcdFx0aWYgKGludGVycnVwdCkgdGhpcy5xdWV1ZS5pbnRlcnJ1cHQoZnJvbSk7XG5cdFx0XHRjdXJyZW50Lm1peGluZ0Zyb20gPSBmcm9tO1xuXHRcdFx0ZnJvbS5taXhpbmdUbyA9IGN1cnJlbnQ7XG5cdFx0XHRjdXJyZW50Lm1peFRpbWUgPSAwO1xuXG5cdFx0XHRmcm9tLnRpbWVsaW5lc1JvdGF0aW9uLmxlbmd0aCA9IDA7IC8vIFJlc2V0IHJvdGF0aW9uIGZvciBtaXhpbmcgb3V0LCBpbiBjYXNlIGVudHJ5IHdhcyBtaXhlZCBpbi5cblx0XHR9XG5cblx0XHR0aGlzLnF1ZXVlLnN0YXJ0KGN1cnJlbnQpO1xuXHR9XG5cblx0LyoqIFNldHMgYW4gYW5pbWF0aW9uIGJ5IG5hbWUuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgc2V0QW5pbWF0aW9ufS4gKi9cblx0c2V0QW5pbWF0aW9uICh0cmFja0luZGV4OiBudW1iZXIsIGFuaW1hdGlvbk5hbWU6IHN0cmluZywgbG9vcD86IGJvb2xlYW4pOiBUcmFja0VudHJ5O1xuXG5cdC8qKiBTZXRzIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBmb3IgYSB0cmFjaywgZGlzY2FyZGluZyBhbnkgcXVldWVkIGFuaW1hdGlvbnMuXG5cdCAqXG5cdCAqIElmIHRoZSBmb3JtZXJseSBjdXJyZW50IHRyYWNrIGVudHJ5IGlzIGZvciB0aGUgc2FtZSBhbmltYXRpb24gYW5kIHdhcyBuZXZlciBhcHBsaWVkIHRvIGEgc2tlbGV0b24sIGl0IGlzIHJlcGxhY2VkIChub3QgbWl4ZWRcblx0ICogZnJvbSkuXG5cdCAqIEBwYXJhbSBsb29wIElmIHRydWUsIHRoZSBhbmltYXRpb24gd2lsbCByZXBlYXQuIElmIGZhbHNlIGl0IHdpbGwgbm90LCBpbnN0ZWFkIGl0cyBsYXN0IGZyYW1lIGlzIGFwcGxpZWQgaWYgcGxheWVkIGJleW9uZCBpdHNcblx0ICogICAgICAgICAgIGR1cmF0aW9uLiBJbiBlaXRoZXIgY2FzZSB7QGxpbmsgVHJhY2tFbnRyeS50cmFja0VuZH0gZGV0ZXJtaW5lcyB3aGVuIHRoZSB0cmFjayBpcyBjbGVhcmVkLlxuXHQgKiBAcmV0dXJuIEEgdHJhY2sgZW50cnkgdG8gYWxsb3cgZnVydGhlciBjdXN0b21pemF0aW9uIG9mIGFuaW1hdGlvbiBwbGF5YmFjay4gUmVmZXJlbmNlcyB0byB0aGUgdHJhY2sgZW50cnkgbXVzdCBub3QgYmUga2VwdFxuXHQgKiAgICAgICAgIGFmdGVyIHRoZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lci5kaXNwb3NlfSBldmVudCBvY2N1cnMuICovXG5cdHNldEFuaW1hdGlvbiAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb246IEFuaW1hdGlvbiwgbG9vcD86IGJvb2xlYW4pOiBUcmFja0VudHJ5O1xuXG5cdHNldEFuaW1hdGlvbiAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb25OYW1lT3JBbmltYXRpb246IHN0cmluZyB8IEFuaW1hdGlvbiwgbG9vcCA9IGZhbHNlKTogVHJhY2tFbnRyeSB7XG5cdFx0aWYgKHR5cGVvZiBhbmltYXRpb25OYW1lT3JBbmltYXRpb24gPT09IFwic3RyaW5nXCIpXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRBbmltYXRpb24xKHRyYWNrSW5kZXgsIGFuaW1hdGlvbk5hbWVPckFuaW1hdGlvbiwgbG9vcCk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0QW5pbWF0aW9uMih0cmFja0luZGV4LCBhbmltYXRpb25OYW1lT3JBbmltYXRpb24sIGxvb3ApO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRBbmltYXRpb24xICh0cmFja0luZGV4OiBudW1iZXIsIGFuaW1hdGlvbk5hbWU6IHN0cmluZywgbG9vcDogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgYW5pbWF0aW9uID0gdGhpcy5kYXRhLnNrZWxldG9uRGF0YS5maW5kQW5pbWF0aW9uKGFuaW1hdGlvbk5hbWUpO1xuXHRcdGlmICghYW5pbWF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYEFuaW1hdGlvbiBub3QgZm91bmQ6ICR7YW5pbWF0aW9uTmFtZX1gKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRBbmltYXRpb24yKHRyYWNrSW5kZXgsIGFuaW1hdGlvbiwgbG9vcCk7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgY3VycmVudCBhbmltYXRpb24gZm9yIGEgdHJhY2ssIGRpc2NhcmRpbmcgYW55IHF1ZXVlZCBhbmltYXRpb25zLlxuXHQgKlxuXHQgKiBJZiB0aGUgZm9ybWVybHkgY3VycmVudCB0cmFjayBlbnRyeSBpcyBmb3IgdGhlIHNhbWUgYW5pbWF0aW9uIGFuZCB3YXMgbmV2ZXIgYXBwbGllZCB0byBhIHNrZWxldG9uLCBpdCBpcyByZXBsYWNlZCAobm90IG1peGVkXG5cdCAqIGZyb20pLlxuXHQgKiBAcGFyYW0gbG9vcCBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgcmVwZWF0LiBJZiBmYWxzZSBpdCB3aWxsIG5vdCwgaW5zdGVhZCBpdHMgbGFzdCBmcmFtZSBpcyBhcHBsaWVkIGlmIHBsYXllZCBiZXlvbmQgaXRzXG5cdCAqICAgICAgICAgICBkdXJhdGlvbi4gSW4gZWl0aGVyIGNhc2Uge0BsaW5rIFRyYWNrRW50cnkuZ2V0VHJhY2tFbmR9IGRldGVybWluZXMgd2hlbiB0aGUgdHJhY2sgaXMgY2xlYXJlZC5cblx0ICogQHJldHVybiBBIHRyYWNrIGVudHJ5IHRvIGFsbG93IGZ1cnRoZXIgY3VzdG9taXphdGlvbiBvZiBhbmltYXRpb24gcGxheWJhY2suIFJlZmVyZW5jZXMgdG8gdGhlIHRyYWNrIGVudHJ5IG11c3Qgbm90IGJlIGtlcHRcblx0ICogICAgICAgICBhZnRlciB0aGUge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuZGlzcG9zZX0gZXZlbnQgb2NjdXJzLiAqL1xuXHRwcml2YXRlIHNldEFuaW1hdGlvbjIgKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uOiBBbmltYXRpb24sIGxvb3A6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGlmICh0cmFja0luZGV4IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwidHJhY2tJbmRleCBtdXN0IGJlID49IDAuXCIpO1xuXHRcdGlmICghYW5pbWF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJhbmltYXRpb24gY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGxldCBpbnRlcnJ1cHQgPSB0cnVlO1xuXHRcdGxldCBjdXJyZW50ID0gdGhpcy5leHBhbmRUb0luZGV4KHRyYWNrSW5kZXgpO1xuXHRcdGlmIChjdXJyZW50KSB7XG5cdFx0XHRpZiAoY3VycmVudC5uZXh0VHJhY2tMYXN0ID09PSAtMSAmJiBjdXJyZW50LmFuaW1hdGlvbiA9PT0gYW5pbWF0aW9uKSB7XG5cdFx0XHRcdC8vIERvbid0IG1peCBmcm9tIGFuIGVudHJ5IHRoYXQgd2FzIG5ldmVyIGFwcGxpZWQuXG5cdFx0XHRcdHRoaXMudHJhY2tzW3RyYWNrSW5kZXhdID0gY3VycmVudC5taXhpbmdGcm9tO1xuXHRcdFx0XHR0aGlzLnF1ZXVlLmludGVycnVwdChjdXJyZW50KTtcblx0XHRcdFx0dGhpcy5xdWV1ZS5lbmQoY3VycmVudCk7XG5cdFx0XHRcdHRoaXMuY2xlYXJOZXh0KGN1cnJlbnQpO1xuXHRcdFx0XHRjdXJyZW50ID0gY3VycmVudC5taXhpbmdGcm9tO1xuXHRcdFx0XHRpbnRlcnJ1cHQgPSBmYWxzZTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0XHR0aGlzLmNsZWFyTmV4dChjdXJyZW50KTtcblx0XHR9XG5cdFx0Y29uc3QgZW50cnkgPSB0aGlzLnRyYWNrRW50cnkodHJhY2tJbmRleCwgYW5pbWF0aW9uLCBsb29wLCBjdXJyZW50KTtcblx0XHR0aGlzLnNldFRyYWNrKHRyYWNrSW5kZXgsIGVudHJ5LCBpbnRlcnJ1cHQpO1xuXHRcdHRoaXMucXVldWUuZHJhaW4oKTtcblx0XHRyZXR1cm4gZW50cnk7XG5cdH1cblxuXHQvKiogUXVldWVzIGFuIGFuaW1hdGlvbiBieSBuYW1lLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIGFkZEFuaW1hdGlvbn0uICovXG5cdGFkZEFuaW1hdGlvbiAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb25OYW1lOiBzdHJpbmcsIGxvb3A/OiBib29sZWFuLCBkZWxheT86IG51bWJlcik6IFRyYWNrRW50cnk7XG5cblx0LyoqIEFkZHMgYW4gYW5pbWF0aW9uIHRvIGJlIHBsYXllZCBhZnRlciB0aGUgY3VycmVudCBvciBsYXN0IHF1ZXVlZCBhbmltYXRpb24gZm9yIGEgdHJhY2suIElmIHRoZSB0cmFjayBoYXMgbm8gZW50cmllcywgdGhpcyBpc1xuXHQgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIHNldEFuaW1hdGlvbn0uXG5cdCAqIEBwYXJhbSBkZWxheSBJZiA+IDAsIHNldHMge0BsaW5rIFRyYWNrRW50cnkuZGVsYXl9LiBJZiA8PSAwLCB0aGUgZGVsYXkgc2V0IGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnlcblx0ICogICAgICAgICAgIG1pbnVzIGFueSBtaXggZHVyYXRpb24gKGZyb20ge0BsaW5rIGRhdGF9KSBwbHVzIHRoZSBzcGVjaWZpZWQgYGRlbGF5YCAoaWUgdGhlIG1peCBlbmRzIGF0ICh3aGVuXG5cdCAqICAgICAgICAgICBgZGVsYXlgID0gMCkgb3IgYmVmb3JlICh3aGVuIGBkZWxheWAgPCAwKSB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnkgZHVyYXRpb24pLiBJZiB0aGVcblx0ICogICAgICAgICAgIHByZXZpb3VzIGVudHJ5IGlzIGxvb3BpbmcsIGl0cyBuZXh0IGxvb3AgY29tcGxldGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgaXRzIGR1cmF0aW9uLlxuXHQgKiBAcmV0dXJuIEEgdHJhY2sgZW50cnkgdG8gYWxsb3cgZnVydGhlciBjdXN0b21pemF0aW9uIG9mIGFuaW1hdGlvbiBwbGF5YmFjay4gUmVmZXJlbmNlcyB0byB0aGUgdHJhY2sgZW50cnkgbXVzdCBub3QgYmUga2VwdFxuXHQgKiAgICAgICAgIGFmdGVyIHRoZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lci5kaXNwb3NlfSBldmVudCBvY2N1cnMuICovXG5cdGFkZEFuaW1hdGlvbiAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb246IEFuaW1hdGlvbiwgbG9vcD86IGJvb2xlYW4sIGRlbGF5PzogbnVtYmVyKTogVHJhY2tFbnRyeTtcblxuXHRhZGRBbmltYXRpb24gKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uTmFtZU9yQW5pbWF0aW9uOiBzdHJpbmcgfCBBbmltYXRpb24sIGxvb3AgPSBmYWxzZSwgZGVsYXk6IG51bWJlciA9IDApOiBUcmFja0VudHJ5IHtcblx0XHRpZiAodHlwZW9mIGFuaW1hdGlvbk5hbWVPckFuaW1hdGlvbiA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHJldHVybiB0aGlzLmFkZEFuaW1hdGlvbjEodHJhY2tJbmRleCwgYW5pbWF0aW9uTmFtZU9yQW5pbWF0aW9uLCBsb29wLCBkZWxheSk7XG5cdFx0cmV0dXJuIHRoaXMuYWRkQW5pbWF0aW9uMih0cmFja0luZGV4LCBhbmltYXRpb25OYW1lT3JBbmltYXRpb24sIGxvb3AsIGRlbGF5KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkQW5pbWF0aW9uMSAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb25OYW1lOiBzdHJpbmcsIGxvb3A6IGJvb2xlYW4gPSBmYWxzZSwgZGVsYXk6IG51bWJlciA9IDApIHtcblx0XHRjb25zdCBhbmltYXRpb24gPSB0aGlzLmRhdGEuc2tlbGV0b25EYXRhLmZpbmRBbmltYXRpb24oYW5pbWF0aW9uTmFtZSk7XG5cdFx0aWYgKCFhbmltYXRpb24pIHRocm93IG5ldyBFcnJvcihgQW5pbWF0aW9uIG5vdCBmb3VuZDogJHthbmltYXRpb25OYW1lfWApO1xuXHRcdHJldHVybiB0aGlzLmFkZEFuaW1hdGlvbjIodHJhY2tJbmRleCwgYW5pbWF0aW9uLCBsb29wLCBkZWxheSk7XG5cdH1cblxuXHRwcml2YXRlIGFkZEFuaW1hdGlvbjIgKHRyYWNrSW5kZXg6IG51bWJlciwgYW5pbWF0aW9uOiBBbmltYXRpb24sIGxvb3A6IGJvb2xlYW4gPSBmYWxzZSwgZGVsYXk6IG51bWJlciA9IDApIHtcblx0XHRpZiAodHJhY2tJbmRleCA8IDApIHRocm93IG5ldyBFcnJvcihcInRyYWNrSW5kZXggbXVzdCBiZSA+PSAwLlwiKTtcblx0XHRpZiAoIWFuaW1hdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiYW5pbWF0aW9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblxuXHRcdGxldCBsYXN0ID0gdGhpcy5leHBhbmRUb0luZGV4KHRyYWNrSW5kZXgpO1xuXHRcdGlmIChsYXN0KSB7XG5cdFx0XHR3aGlsZSAobGFzdC5uZXh0KVxuXHRcdFx0XHRsYXN0ID0gbGFzdC5uZXh0O1xuXHRcdH1cblxuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy50cmFja0VudHJ5KHRyYWNrSW5kZXgsIGFuaW1hdGlvbiwgbG9vcCwgbGFzdCk7XG5cblx0XHRpZiAoIWxhc3QpIHtcblx0XHRcdHRoaXMuc2V0VHJhY2sodHJhY2tJbmRleCwgZW50cnksIHRydWUpO1xuXHRcdFx0dGhpcy5xdWV1ZS5kcmFpbigpO1xuXHRcdFx0aWYgKGRlbGF5IDwgMCkgZGVsYXkgPSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsYXN0Lm5leHQgPSBlbnRyeTtcblx0XHRcdGVudHJ5LnByZXZpb3VzID0gbGFzdDtcblx0XHRcdGlmIChkZWxheSA8PSAwKSBkZWxheSA9IE1hdGgubWF4KGRlbGF5ICsgbGFzdC5nZXRUcmFja0NvbXBsZXRlKCkgLSBlbnRyeS5taXhEdXJhdGlvbiwgMCk7XG5cdFx0fVxuXG5cdFx0ZW50cnkuZGVsYXkgPSBkZWxheTtcblx0XHRyZXR1cm4gZW50cnk7XG5cdH1cblxuXHQvKiogU2V0cyBhbiBlbXB0eSBhbmltYXRpb24gZm9yIGEgdHJhY2ssIGRpc2NhcmRpbmcgYW55IHF1ZXVlZCBhbmltYXRpb25zLCBhbmQgc2V0cyB0aGUgdHJhY2sgZW50cnknc1xuXHQgKiB7QGxpbmsgVHJhY2tFbnRyeS5taXhkdXJhdGlvbn0uIEFuIGVtcHR5IGFuaW1hdGlvbiBoYXMgbm8gdGltZWxpbmVzIGFuZCBzZXJ2ZXMgYXMgYSBwbGFjZWhvbGRlciBmb3IgbWl4aW5nIGluIG9yIG91dC5cblx0ICpcblx0ICogTWl4aW5nIG91dCBpcyBkb25lIGJ5IHNldHRpbmcgYW4gZW1wdHkgYW5pbWF0aW9uIHdpdGggYSBtaXggZHVyYXRpb24gdXNpbmcgZWl0aGVyIHtAbGluayBzZXRFbXB0eUFuaW1hdGlvbn0sXG5cdCAqIHtAbGluayBzZXRFbXB0eUFuaW1hdGlvbnN9LCBvciB7QGxpbmsgYWRkRW1wdHlBbmltYXRpb259LiBNaXhpbmcgdG8gYW4gZW1wdHkgYW5pbWF0aW9uIGNhdXNlc1xuXHQgKiB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIHRvIGJlIGFwcGxpZWQgbGVzcyBhbmQgbGVzcyBvdmVyIHRoZSBtaXggZHVyYXRpb24uIFByb3BlcnRpZXMga2V5ZWQgaW4gdGhlIHByZXZpb3VzIGFuaW1hdGlvblxuXHQgKiB0cmFuc2l0aW9uIHRvIHRoZSB2YWx1ZSBmcm9tIGxvd2VyIHRyYWNrcyBvciB0byB0aGUgc2V0dXAgcG9zZSB2YWx1ZSBpZiBubyBsb3dlciB0cmFja3Mga2V5IHRoZSBwcm9wZXJ0eS4gQSBtaXggZHVyYXRpb24gb2Zcblx0ICogMCBzdGlsbCBuZWVkcyB0byBiZSBhcHBsaWVkIG9uZSBtb3JlIHRpbWUgdG8gbWl4IG91dCwgc28gdGhlIHByb3BlcnRpZXMgaXQgd2FzIGFuaW1hdGluZyBhcmUgcmV2ZXJ0ZWQuXG5cdCAqXG5cdCAqIE1peGluZyBpbiBpcyBkb25lIGJ5IGZpcnN0IHNldHRpbmcgYW4gZW1wdHkgYW5pbWF0aW9uLCB0aGVuIGFkZGluZyBhbiBhbmltYXRpb24gdXNpbmdcblx0ICoge0BsaW5rIGFkZEFuaW1hdGlvbn0gd2l0aCB0aGUgZGVzaXJlZCBkZWxheSAoYW4gZW1wdHkgYW5pbWF0aW9uIGhhcyBhIGR1cmF0aW9uIG9mIDApIGFuZCBvblxuXHQgKiB0aGUgcmV0dXJuZWQgdHJhY2sgZW50cnksIHNldCB0aGUge0BsaW5rIFRyYWNrRW50cnkuc2V0TWl4RHVyYXRpb259LiBNaXhpbmcgZnJvbSBhbiBlbXB0eSBhbmltYXRpb24gY2F1c2VzIHRoZSBuZXdcblx0ICogYW5pbWF0aW9uIHRvIGJlIGFwcGxpZWQgbW9yZSBhbmQgbW9yZSBvdmVyIHRoZSBtaXggZHVyYXRpb24uIFByb3BlcnRpZXMga2V5ZWQgaW4gdGhlIG5ldyBhbmltYXRpb24gdHJhbnNpdGlvbiBmcm9tIHRoZSB2YWx1ZVxuXHQgKiBmcm9tIGxvd2VyIHRyYWNrcyBvciBmcm9tIHRoZSBzZXR1cCBwb3NlIHZhbHVlIGlmIG5vIGxvd2VyIHRyYWNrcyBrZXkgdGhlIHByb3BlcnR5IHRvIHRoZSB2YWx1ZSBrZXllZCBpbiB0aGUgbmV3IGFuaW1hdGlvbi5cblx0ICpcblx0ICogU2VlIDxhIGhyZWY9J2h0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtYXBwbHlpbmctYW5pbWF0aW9ucyNFbXB0eS1hbmltYXRpb25zJz5FbXB0eSBhbmltYXRpb25zPC9hPiBpbiB0aGUgU3BpbmVcblx0ICogUnVudGltZXMgR3VpZGUuICovXG5cdHNldEVtcHR5QW5pbWF0aW9uICh0cmFja0luZGV4OiBudW1iZXIsIG1peER1cmF0aW9uOiBudW1iZXIgPSAwKSB7XG5cdFx0Y29uc3QgZW50cnkgPSB0aGlzLnNldEFuaW1hdGlvbih0cmFja0luZGV4LCBBbmltYXRpb25TdGF0ZS5lbXB0eUFuaW1hdGlvbiwgZmFsc2UpO1xuXHRcdGVudHJ5Lm1peER1cmF0aW9uID0gbWl4RHVyYXRpb247XG5cdFx0ZW50cnkudHJhY2tFbmQgPSBtaXhEdXJhdGlvbjtcblx0XHRyZXR1cm4gZW50cnk7XG5cdH1cblxuXHQvKiogQWRkcyBhbiBlbXB0eSBhbmltYXRpb24gdG8gYmUgcGxheWVkIGFmdGVyIHRoZSBjdXJyZW50IG9yIGxhc3QgcXVldWVkIGFuaW1hdGlvbiBmb3IgYSB0cmFjaywgYW5kIHNldHMgdGhlIHRyYWNrIGVudHJ5J3Ncblx0ICoge0BsaW5rIFRyYWNrRW50cnkubWl4RHVyYXRpb259LiBJZiB0aGUgdHJhY2sgaGFzIG5vIGVudHJpZXMsIGl0IGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZ1xuXHQgKiB7QGxpbmsgc2V0RW1wdHlBbmltYXRpb259LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIHNldEVtcHR5QW5pbWF0aW9ufSBhbmRcblx0ICogPGEgaHJlZj0naHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1hcHBseWluZy1hbmltYXRpb25zI0VtcHR5LWFuaW1hdGlvbnMnPkVtcHR5IGFuaW1hdGlvbnM8L2E+IGluIHRoZSBTcGluZSBSdW50aW1lc1xuXHQgKiBHdWlkZS5cblx0ICogQHBhcmFtIGRlbGF5IElmID4gMCwgc2V0cyB7QGxpbmsgVHJhY2tFbnRyeS5kZWxheX0uIElmIDw9IDAsIHRoZSBkZWxheSBzZXQgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcmV2aW91cyB0cmFjayBlbnRyeSBtaW51c1xuXHQgKiAgICAgICAgICAgYW55IG1peCBkdXJhdGlvbiBwbHVzIHRoZSBzcGVjaWZpZWQgYGRlbGF5YCAoaWUgdGhlIG1peCBlbmRzIGF0ICh3aGVuIGBkZWxheWAgPSAwKSBvciBiZWZvcmVcblx0ICogICAgICAgICAgICh3aGVuIGBkZWxheWAgPCAwKSB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnkgZHVyYXRpb24pLiBJZiB0aGUgcHJldmlvdXMgZW50cnkgaXMgbG9vcGluZywgaXRzIG5leHQgbG9vcFxuXHQgKiAgICAgICAgICAgY29tcGxldGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgaXRzIGR1cmF0aW9uLlxuXHQgKiBAcmV0dXJuIEEgdHJhY2sgZW50cnkgdG8gYWxsb3cgZnVydGhlciBjdXN0b21pemF0aW9uIG9mIGFuaW1hdGlvbiBwbGF5YmFjay4gUmVmZXJlbmNlcyB0byB0aGUgdHJhY2sgZW50cnkgbXVzdCBub3QgYmUga2VwdFxuXHQgKiAgICAgICAgIGFmdGVyIHRoZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lci5kaXNwb3NlfSBldmVudCBvY2N1cnMuICovXG5cdGFkZEVtcHR5QW5pbWF0aW9uICh0cmFja0luZGV4OiBudW1iZXIsIG1peER1cmF0aW9uOiBudW1iZXIgPSAwLCBkZWxheTogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy5hZGRBbmltYXRpb24odHJhY2tJbmRleCwgQW5pbWF0aW9uU3RhdGUuZW1wdHlBbmltYXRpb24sIGZhbHNlLCBkZWxheSk7XG5cdFx0aWYgKGRlbGF5IDw9IDApIGVudHJ5LmRlbGF5ID0gTWF0aC5tYXgoZW50cnkuZGVsYXkgKyBlbnRyeS5taXhEdXJhdGlvbiAtIG1peER1cmF0aW9uLCAwKTtcblx0XHRlbnRyeS5taXhEdXJhdGlvbiA9IG1peER1cmF0aW9uO1xuXHRcdGVudHJ5LnRyYWNrRW5kID0gbWl4RHVyYXRpb247XG5cdFx0cmV0dXJuIGVudHJ5O1xuXHR9XG5cblx0LyoqIFNldHMgYW4gZW1wdHkgYW5pbWF0aW9uIGZvciBldmVyeSB0cmFjaywgZGlzY2FyZGluZyBhbnkgcXVldWVkIGFuaW1hdGlvbnMsIGFuZCBtaXhlcyB0byBpdCBvdmVyIHRoZSBzcGVjaWZpZWQgbWl4IGR1cmF0aW9uLlxuXHQgKlxuXHQgKiBTZWUgPGEgaHJlZj0naHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1hcHBseWluZy1hbmltYXRpb25zI0VtcHR5LWFuaW1hdGlvbnMnPkVtcHR5IGFuaW1hdGlvbnM8L2E+IGluIHRoZSBTcGluZVxuXHQgKiBSdW50aW1lcyBHdWlkZS4gKi9cblx0c2V0RW1wdHlBbmltYXRpb25zIChtaXhEdXJhdGlvbjogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IG9sZERyYWluRGlzYWJsZWQgPSB0aGlzLnF1ZXVlLmRyYWluRGlzYWJsZWQ7XG5cdFx0dGhpcy5xdWV1ZS5kcmFpbkRpc2FibGVkID0gdHJ1ZTtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRoaXMudHJhY2tzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgY3VycmVudCA9IHRoaXMudHJhY2tzW2ldO1xuXHRcdFx0aWYgKGN1cnJlbnQpIHRoaXMuc2V0RW1wdHlBbmltYXRpb24oY3VycmVudC50cmFja0luZGV4LCBtaXhEdXJhdGlvbik7XG5cdFx0fVxuXHRcdHRoaXMucXVldWUuZHJhaW5EaXNhYmxlZCA9IG9sZERyYWluRGlzYWJsZWQ7XG5cdFx0dGhpcy5xdWV1ZS5kcmFpbigpO1xuXHR9XG5cblx0ZXhwYW5kVG9JbmRleCAoaW5kZXg6IG51bWJlcikge1xuXHRcdGlmIChpbmRleCA8IHRoaXMudHJhY2tzLmxlbmd0aCkgcmV0dXJuIHRoaXMudHJhY2tzW2luZGV4XTtcblx0XHRVdGlscy5lbnN1cmVBcnJheUNhcGFjaXR5KHRoaXMudHJhY2tzLCBpbmRleCArIDEsIG51bGwpO1xuXHRcdHRoaXMudHJhY2tzLmxlbmd0aCA9IGluZGV4ICsgMTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKiBAcGFyYW0gbGFzdCBNYXkgYmUgbnVsbC4gKi9cblx0dHJhY2tFbnRyeSAodHJhY2tJbmRleDogbnVtYmVyLCBhbmltYXRpb246IEFuaW1hdGlvbiwgbG9vcDogYm9vbGVhbiwgbGFzdDogVHJhY2tFbnRyeSB8IG51bGwpIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMudHJhY2tFbnRyeVBvb2wub2J0YWluKCk7XG5cdFx0ZW50cnkucmVzZXQoKTtcblx0XHRlbnRyeS50cmFja0luZGV4ID0gdHJhY2tJbmRleDtcblx0XHRlbnRyeS5hbmltYXRpb24gPSBhbmltYXRpb247XG5cdFx0ZW50cnkubG9vcCA9IGxvb3A7XG5cblx0XHRlbnRyeS5hZGRpdGl2ZSA9IGZhbHNlO1xuXHRcdGVudHJ5LnJldmVyc2UgPSBmYWxzZTtcblx0XHRlbnRyeS5zaG9ydGVzdFJvdGF0aW9uID0gZmFsc2U7XG5cblx0XHRlbnRyeS5ldmVudFRocmVzaG9sZCA9IDA7XG5cdFx0ZW50cnkuYWxwaGFBdHRhY2htZW50VGhyZXNob2xkID0gMDtcblx0XHRlbnRyeS5taXhBdHRhY2htZW50VGhyZXNob2xkID0gMDtcblx0XHRlbnRyeS5taXhEcmF3T3JkZXJUaHJlc2hvbGQgPSAwO1xuXG5cdFx0ZW50cnkuYW5pbWF0aW9uU3RhcnQgPSAwO1xuXHRcdGVudHJ5LmFuaW1hdGlvbkVuZCA9IGFuaW1hdGlvbi5kdXJhdGlvbjtcblx0XHRlbnRyeS5hbmltYXRpb25MYXN0ID0gLTE7XG5cdFx0ZW50cnkubmV4dEFuaW1hdGlvbkxhc3QgPSAtMTtcblxuXHRcdGVudHJ5LmRlbGF5ID0gMDtcblx0XHRlbnRyeS50cmFja1RpbWUgPSAwO1xuXHRcdGVudHJ5LnRyYWNrTGFzdCA9IC0xO1xuXHRcdGVudHJ5Lm5leHRUcmFja0xhc3QgPSAtMTtcblx0XHRlbnRyeS50cmFja0VuZCA9IE51bWJlci5NQVhfVkFMVUU7XG5cdFx0ZW50cnkudGltZVNjYWxlID0gMTtcblxuXHRcdGVudHJ5LmFscGhhID0gMTtcblx0XHRlbnRyeS5taXhUaW1lID0gMDtcblx0XHRlbnRyeS5taXhEdXJhdGlvbiA9ICFsYXN0ID8gMCA6IHRoaXMuZGF0YS5nZXRNaXgobGFzdC5hbmltYXRpb24hLCBhbmltYXRpb24pO1xuXHRcdGVudHJ5LnRvdGFsQWxwaGEgPSAwO1xuXHRcdGVudHJ5LmtlZXBIb2xkID0gZmFsc2U7XG5cdFx0cmV0dXJuIGVudHJ5O1xuXHR9XG5cblx0LyoqIFJlbW92ZXMge0BsaW5rIFRyYWNrRW50cnkubmV4dH0gYW5kIGFsbCBlbnRyaWVzIGFmdGVyIGl0IGZvciB0aGUgc3BlY2lmaWVkIGVudHJ5LiAqL1xuXHRjbGVhck5leHQgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdFx0bGV0IG5leHQgPSBlbnRyeS5uZXh0O1xuXHRcdHdoaWxlIChuZXh0KSB7XG5cdFx0XHR0aGlzLnF1ZXVlLmRpc3Bvc2UobmV4dCk7XG5cdFx0XHRuZXh0ID0gbmV4dC5uZXh0O1xuXHRcdH1cblx0XHRlbnRyeS5uZXh0ID0gbnVsbDtcblx0fVxuXG5cdF9hbmltYXRpb25zQ2hhbmdlZCAoKSB7XG5cdFx0dGhpcy5hbmltYXRpb25zQ2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0Y29uc3QgdHJhY2tzID0gdGhpcy50cmFja3M7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCB0cmFjayA9IHRyYWNrc1tpXTtcblx0XHRcdGlmICghdHJhY2spIGNvbnRpbnVlO1xuXHRcdFx0bGV0IGVudHJ5OiBUcmFja0VudHJ5IHwgbnVsbCA9IHRyYWNrO1xuXHRcdFx0d2hpbGUgKGVudHJ5Lm1peGluZ0Zyb20pXG5cdFx0XHRcdGVudHJ5ID0gZW50cnkubWl4aW5nRnJvbTtcblx0XHRcdGRvIHtcblx0XHRcdFx0dGhpcy5jb21wdXRlSG9sZChlbnRyeSwgdHJhY2spO1xuXHRcdFx0XHRlbnRyeSA9IGVudHJ5Lm1peGluZ1RvO1xuXHRcdFx0fSB3aGlsZSAoZW50cnkpO1xuXHRcdH1cblx0XHR0aGlzLnByb3BlcnR5SWRzLmNsZWFyKCk7XG5cdH1cblxuXHRjb21wdXRlSG9sZCAoZW50cnk6IFRyYWNrRW50cnksIHRyYWNrOiBUcmFja0VudHJ5KSB7XG5cdFx0Y29uc3QgdGltZWxpbmVzID0gZW50cnkuYW5pbWF0aW9uIS50aW1lbGluZXM7XG5cdFx0Y29uc3QgdGltZWxpbmVzQ291bnQgPSBlbnRyeS5hbmltYXRpb24hLnRpbWVsaW5lcy5sZW5ndGg7XG5cdFx0Y29uc3QgdGltZWxpbmVNb2RlID0gZW50cnkudGltZWxpbmVNb2RlO1xuXHRcdHRpbWVsaW5lTW9kZS5sZW5ndGggPSB0aW1lbGluZXNDb3VudDtcblx0XHRjb25zdCB0aW1lbGluZUhvbGRNaXggPSBlbnRyeS50aW1lbGluZUhvbGRNaXg7XG5cdFx0dGltZWxpbmVIb2xkTWl4Lmxlbmd0aCA9IDA7XG5cdFx0Y29uc3QgYWRkID0gZW50cnkuYWRkaXRpdmUsIGtlZXBIb2xkID0gZW50cnkua2VlcEhvbGQ7XG5cdFx0Y29uc3QgdG8gPSBlbnRyeS5taXhpbmdUbztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGltZWxpbmVzQ291bnQ7IGkrKykge1xuXHRcdFx0Y29uc3QgdGltZWxpbmUgPSB0aW1lbGluZXNbaV07XG5cdFx0XHRjb25zdCBpZHMgPSB0aW1lbGluZS5wcm9wZXJ0eUlkcztcblx0XHRcdGNvbnN0IGZyb20gPSB0aGlzLmZyb20odHJhY2ssIHRpbWVsaW5lLCBpZHMpO1xuXG5cdFx0XHRpZiAoYWRkICYmIHRpbWVsaW5lLmFkZGl0aXZlKSB7XG5cdFx0XHRcdHRpbWVsaW5lTW9kZVtpXSA9IGZyb207XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb2xkIGlmIHRoZSBuZXh0IGVudHJ5IHdpbGwgb3ZlcndyaXRlIHRoaXMgcHJvcGVydHkuXG5cdFx0XHRsZXQgbW9kZTogbnVtYmVyO1xuXHRcdFx0aWYgKHRvID09PSBudWxsIHx8IHRpbWVsaW5lLmluc3RhbnQgfHwgKHRvLmFkZGl0aXZlICYmIHRpbWVsaW5lLmFkZGl0aXZlKSB8fCAhdG8uYW5pbWF0aW9uPy5oYXNUaW1lbGluZShpZHMpKVxuXHRcdFx0XHRtb2RlID0gZnJvbTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtb2RlID0gZnJvbSB8IEhPTEQ7XG5cdFx0XHRcdC8vIEZpbmQgbmV4dCBlbnRyeSB0aGF0IGRvZXNuJ3Qgb3ZlcndyaXRlIHRoaXMgcHJvcGVydHkuIEl0cyBtaXggZmFkZXMgb3V0IHRoZSBob2xkLCBpbnN0ZWFkIG9mIGl0IGVuZGluZyBhYnJ1cHRseS5cblx0XHRcdFx0Zm9yIChsZXQgbmV4dCA9IHRvLm1peGluZ1RvOyBuZXh0ICE9IG51bGw7IG5leHQgPSBuZXh0Lm1peGluZ1RvKSB7XG5cdFx0XHRcdFx0aWYgKChuZXh0LmFkZGl0aXZlICYmIHRpbWVsaW5lLmFkZGl0aXZlKSB8fCAhbmV4dC5hbmltYXRpb24/Lmhhc1RpbWVsaW5lKGlkcykpIHtcblx0XHRcdFx0XHRcdGlmIChuZXh0Lm1peER1cmF0aW9uID4gMCkgdGltZWxpbmVIb2xkTWl4W2ldID0gbmV4dDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGtlZXBIb2xkKSBtb2RlID0gKG1vZGUgJiB+SE9MRCkgfCAodGltZWxpbmVNb2RlW2ldICYgSE9MRCk7XG5cdFx0XHR0aW1lbGluZU1vZGVbaV0gPSBtb2RlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZnJvbSAodHJhY2s6IFRyYWNrRW50cnksIHRpbWVsaW5lOiBUaW1lbGluZSwgaWRzOiBzdHJpbmdbXSk6IG51bWJlciB7XG5cdFx0Y29uc3QgcHJvcGVydHlJZHMgPSB0aGlzLnByb3BlcnR5SWRzO1xuXHRcdGxldCBmcm9tID0gU0VUVVA7XG5cdFx0Ly8gUmVmZXJlbmNlIHJ1bnRpbWUgdXNlcyBMb25nTWFwLnB1dE1pc3NpbmcuIE1hcCBoYXMgbm8gZXF1aXZhbGVudCwgc28gZ2V0L3NldCBwcmVzZXJ2ZXMgdGhvc2Ugc2VtYW50aWNzIGhlcmUuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBpZHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBvd25lciA9IHByb3BlcnR5SWRzLmdldChpZHNbaV0pO1xuXHRcdFx0aWYgKG93bmVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cHJvcGVydHlJZHMuc2V0KGlkc1tpXSwgdHJhY2spO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG93bmVyICE9PSB0cmFjaykge1xuXHRcdFx0XHRcdHdoaWxlICgrK2kgPCBuKVxuXHRcdFx0XHRcdFx0aWYgKCFwcm9wZXJ0eUlkcy5oYXMoaWRzW2ldKSkgcHJvcGVydHlJZHMuc2V0KGlkc1tpXSwgdHJhY2spO1xuXHRcdFx0XHRcdHJldHVybiBDVVJSRU5UO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZyb20gPSBGSVJTVDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRpbWVsaW5lIGluc3RhbmNlb2YgRHJhd09yZGVyRm9sZGVyVGltZWxpbmUpIHtcblx0XHRcdGNvbnN0IGZpcnN0ID0gcHJvcGVydHlJZHMuZ2V0KERyYXdPcmRlclRpbWVsaW5lLnByb3BlcnR5SUQpO1xuXHRcdFx0aWYgKGZpcnN0ICE9IG51bGwpIHJldHVybiBmaXJzdCAhPT0gdHJhY2sgPyBDVVJSRU5UIDogRklSU1Q7XG5cdFx0fVxuXHRcdHJldHVybiBmcm9tO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIHRyYWNrIGVudHJ5IGZvciB0aGUgYW5pbWF0aW9uIGN1cnJlbnRseSBwbGF5aW5nIG9uIHRoZSB0cmFjaywgb3IgbnVsbCBpZiBubyBhbmltYXRpb24gaXMgY3VycmVudGx5IHBsYXlpbmcuICovXG5cdGdldFRyYWNrICh0cmFja0luZGV4OiBudW1iZXIpIHtcblx0XHRpZiAodHJhY2tJbmRleCA8IDApIHRocm93IG5ldyBFcnJvcihcInRyYWNrSW5kZXggbXVzdCBiZSA+PSAwLlwiKTtcblx0XHRpZiAodHJhY2tJbmRleCA+PSB0aGlzLnRyYWNrcy5sZW5ndGgpIHJldHVybiBudWxsO1xuXHRcdHJldHVybiB0aGlzLnRyYWNrc1t0cmFja0luZGV4XTtcblx0fVxuXG5cblx0LyoqIEFkZHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyBmb3IgYWxsIHRyYWNrIGVudHJpZXMuICovXG5cdGFkZExpc3RlbmVyIChsaXN0ZW5lcjogQW5pbWF0aW9uU3RhdGVMaXN0ZW5lcikge1xuXHRcdGlmICghbGlzdGVuZXIpIHRocm93IG5ldyBFcnJvcihcImxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0fVxuXG5cdC8qKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBhZGRlZCB3aXRoIHtAbGluayBhZGRMaXN0ZW5lcn0uICovXG5cdHJlbW92ZUxpc3RlbmVyIChsaXN0ZW5lcjogQW5pbWF0aW9uU3RhdGVMaXN0ZW5lcikge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG5cdFx0aWYgKGluZGV4ID49IDApIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG5cdH1cblxuXHQvKiogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGFkZGVkIHdpdGgge0BsaW5rIGFkZExpc3RlbmVyfS4gKi9cblx0Y2xlYXJMaXN0ZW5lcnMgKCkge1xuXHRcdHRoaXMubGlzdGVuZXJzLmxlbmd0aCA9IDA7XG5cdH1cblxuXHQvKiogRGlzY2FyZHMgYWxsIGxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBkZWxpdmVyZWQuIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byBjYWxsIGZyb20gYW5cblx0ICoge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXJ9IHdoZW4gaXQgaXMga25vd24gdGhhdCBmdXJ0aGVyIG5vdGlmaWNhdGlvbnMgdGhhdCBtYXkgaGF2ZSBiZWVuIGFscmVhZHkgcXVldWVkIGZvciBkZWxpdmVyeVxuXHQgKiBhcmUgbm90IHdhbnRlZCBiZWNhdXNlIG5ldyBhbmltYXRpb25zIGFyZSBiZWluZyBzZXQuICovXG5cdGNsZWFyTGlzdGVuZXJOb3RpZmljYXRpb25zICgpIHtcblx0XHR0aGlzLnF1ZXVlLmNsZWFyKCk7XG5cdH1cbn1cblxuLyoqIFN0b3JlcyBzZXR0aW5ncyBhbmQgb3RoZXIgc3RhdGUgZm9yIHRoZSBwbGF5YmFjayBvZiBhbiBhbmltYXRpb24gb24gYW4ge0BsaW5rIEFuaW1hdGlvblN0YXRlfSB0cmFjay5cbiAqXG4gKiBSZWZlcmVuY2VzIHRvIGEgdHJhY2sgZW50cnkgbXVzdCBub3QgYmUga2VwdCBhZnRlciB0aGUge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuZGlzcG9zZX0gZXZlbnQgb2NjdXJzLiAqL1xuZXhwb3J0IGNsYXNzIFRyYWNrRW50cnkge1xuXHQvKiogVGhlIGFuaW1hdGlvbiB0byBhcHBseSBmb3IgdGhpcyB0cmFjayBlbnRyeS4gKi9cblx0YW5pbWF0aW9uOiBBbmltYXRpb24gfCBudWxsID0gbnVsbDtcblxuXHRwcmV2aW91czogVHJhY2tFbnRyeSB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgYW5pbWF0aW9uIHF1ZXVlZCB0byBzdGFydCBhZnRlciB0aGlzIGFuaW1hdGlvbiwgb3IgbnVsbC4gYG5leHRgIG1ha2VzIHVwIGEgbGlua2VkIGxpc3QuICovXG5cdG5leHQ6IFRyYWNrRW50cnkgfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIHRyYWNrIGVudHJ5IGZvciB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIHdoZW4gbWl4aW5nIHRvIHRoaXMgYW5pbWF0aW9uLCBvciBudWxsIGlmIG5vIG1peGluZyBpcyBjdXJyZW50bHkgb2NjdXJyaW5nLlxuXHQgKiBXaGVuIG1peGluZyBmcm9tIG11bHRpcGxlIGFuaW1hdGlvbnMsIGBtaXhpbmdGcm9tYCBtYWtlcyB1cCBhIGRvdWJseSBsaW5rZWQgbGlzdC4gKi9cblx0bWl4aW5nRnJvbTogVHJhY2tFbnRyeSB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgdHJhY2sgZW50cnkgZm9yIHRoZSBuZXh0IGFuaW1hdGlvbiB3aGVuIG1peGluZyBmcm9tIHRoaXMgYW5pbWF0aW9uLCBvciBudWxsIGlmIG5vIG1peGluZyBpcyBjdXJyZW50bHkgb2NjdXJyaW5nLlxuXHQgKiBXaGVuIG1peGluZyB0byBtdWx0aXBsZSBhbmltYXRpb25zLCBgbWl4aW5nVG9gIG1ha2VzIHVwIGEgZG91Ymx5IGxpbmtlZCBsaXN0LiAqL1xuXHRtaXhpbmdUbzogVHJhY2tFbnRyeSB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgbGlzdGVuZXIgZm9yIGV2ZW50cyBnZW5lcmF0ZWQgYnkgdGhpcyB0cmFjayBlbnRyeSwgb3IgbnVsbC5cblx0ICpcblx0ICogQSB0cmFjayBlbnRyeSByZXR1cm5lZCBmcm9tIHtAbGluayBBbmltYXRpb25TdGF0ZS5zZXRBbmltYXRpb259IGlzIGFscmVhZHkgdGhlIGN1cnJlbnQgYW5pbWF0aW9uXG5cdCAqIGZvciB0aGUgdHJhY2ssIHNvIHRoZSBjYWxsYmFjayBmb3IgbGlzdGVuZXIge0BsaW5rIEFuaW1hdGlvblN0YXRlTGlzdGVuZXIuc3RhcnR9IHdpbGwgbm90IGJlIGNhbGxlZC4gKi9cblx0bGlzdGVuZXI6IEFuaW1hdGlvblN0YXRlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIGluZGV4IG9mIHRoZSB0cmFjayB3aGVyZSB0aGlzIHRyYWNrIGVudHJ5IGlzIGVpdGhlciBjdXJyZW50IG9yIHF1ZXVlZC5cblx0ICpcblx0ICogU2VlIHtAbGluayBBbmltYXRpb25TdGF0ZS5nZXRUcmFja30uICovXG5cdHRyYWNrSW5kZXggPSAwO1xuXG5cdC8qKiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgcmVwZWF0LiBJZiBmYWxzZSBpdCB3aWxsIG5vdCwgaW5zdGVhZCBpdHMgbGFzdCBmcmFtZSBpcyBhcHBsaWVkIGlmIHBsYXllZCBiZXlvbmQgaXRzXG5cdCAqIGR1cmF0aW9uLiAqL1xuXHRsb29wID0gZmFsc2U7XG5cblx0LyoqIFdoZW4gdHJ1ZSwgdGltZWxpbmVzIGluIHRoaXMgYW5pbWF0aW9uIHRoYXQgc3VwcG9ydCBhZGRpdGl2ZSBoYXZlIHRoZWlyIHZhbHVlcyBhZGRlZCB0byB0aGUgc2V0dXAgb3IgY3VycmVudCBwb3NlIHZhbHVlc1xuXHQgKiBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLiBBZGRpdGl2ZSBjYW4gYmUgc2V0IGZvciBhIG5ldyB0cmFjayBlbnRyeSBvbmx5IGJlZm9yZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYXBwbHl9XG5cdCAqIGlzIG5leHQgY2FsbGVkLiAqL1xuXHRhZGRpdGl2ZSA9IGZhbHNlO1xuXG5cdC8qKiBJZiB0cnVlLCB0aGUgYW5pbWF0aW9uIHdpbGwgYmUgYXBwbGllZCBpbiByZXZlcnNlLiAqL1xuXHRyZXZlcnNlID0gZmFsc2U7XG5cblx0LyoqIElmIHRydWUsIG1peGluZyByb3RhdGlvbiBiZXR3ZWVuIHRyYWNrcyBhbHdheXMgdXNlcyB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZGlyZWN0aW9uLiBJZiB0aGUgcm90YXRpb24gaXMgYW5pbWF0ZWQsIHRoZVxuXHQgKiBzaG9ydGVzdCByb3RhdGlvbiBkaXJlY3Rpb24gbWF5IGNoYW5nZSBkdXJpbmcgdGhlIG1peC5cblx0ICpcblx0ICogSWYgZmFsc2UsIHRoZSBzaG9ydGVzdCByb3RhdGlvbiBkaXJlY3Rpb24gaXMgcmVtZW1iZXJlZCB3aGVuIHRoZSBtaXggc3RhcnRzIGFuZCB0aGUgc2FtZSBkaXJlY3Rpb24gaXMgdXNlZCBmb3IgdGhlIHJlc3Rcblx0ICogb2YgdGhlIG1peC4gRGVmYXVsdHMgdG8gZmFsc2UuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgcmVzZXRSb3RhdGlvbkRpcmVjdGlvbnN9LiAqL1xuXHRzaG9ydGVzdFJvdGF0aW9uID0gZmFsc2U7XG5cblx0a2VlcEhvbGQgPSBmYWxzZTtcblxuXHQvKiogV2hlbiB0aGUgaW50ZXJwb2xhdGVkIG1peCBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiB0aGUgYGV2ZW50VGhyZXNob2xkYCAsIGV2ZW50IHRpbWVsaW5lcyBhcmUgYXBwbGllZCB3aGlsZVxuXHQgKiB0aGlzIGFuaW1hdGlvbiBpcyBiZWluZyBtaXhlZCBvdXQuIERlZmF1bHRzIHRvIDAsIHNvIGV2ZW50IHRpbWVsaW5lcyBhcmUgbm90IGFwcGxpZWQgd2hpbGUgdGhpcyBhbmltYXRpb24gaXMgYmVpbmcgbWl4ZWRcblx0ICogb3V0LiAqL1xuXHRldmVudFRocmVzaG9sZCA9IDA7XG5cblx0LyoqIFdoZW4gdGhlIGludGVycG9sYXRlZCBtaXggcGVyY2VudGFnZSBpcyBsZXNzIHRoYW4gdGhlIGBtaXhBdHRhY2htZW50VGhyZXNob2xkYCwgYXR0YWNobWVudCB0aW1lbGluZXMgYXJlXG5cdCAqIGFwcGxpZWQgd2hpbGUgdGhpcyBhbmltYXRpb24gaXMgYmVpbmcgbWl4ZWQgb3V0LiBEZWZhdWx0cyB0byAwLCBzbyBhdHRhY2htZW50IHRpbWVsaW5lcyBhcmUgbm90IGFwcGxpZWQgd2hpbGUgdGhpc1xuXHQgKiBhbmltYXRpb24gaXMgYmVpbmcgbWl4ZWQgb3V0LiAqL1xuXHRtaXhBdHRhY2htZW50VGhyZXNob2xkID0gMDtcblxuXHQvKiogV2hlbiB0aGUgY29tcHV0ZWQgYWxwaGEgaXMgZ3JlYXRlciB0aGFuIGBhbHBoYUF0dGFjaG1lbnRUaHJlc2hvbGRgLCBhdHRhY2htZW50IHRpbWVsaW5lcyBhcmUgYXBwbGllZC4gVGhlXG5cdCAqIGNvbXB1dGVkIGFscGhhIGluY2x1ZGVzIHtAbGluayBhbHBoYX0gYW5kIHRoZSBpbnRlcnBvbGF0ZWQgbWl4IHBlcmNlbnRhZ2UuIERlZmF1bHRzIHRvIDAsIHNvIGF0dGFjaG1lbnQgdGltZWxpbmVzIGFyZVxuXHQgKiBhbHdheXMgYXBwbGllZC4gKi9cblx0YWxwaGFBdHRhY2htZW50VGhyZXNob2xkID0gMDtcblxuXHQvKiogV2hlbiB0aGUgaW50ZXJwb2xhdGVkIG1peCBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiB0aGUgYG1peEF0dGFjaG1lbnRUaHJlc2hvbGRgLCBhdHRhY2htZW50IHRpbWVsaW5lcyBhcmVcblx0ICogYXBwbGllZCB3aGlsZSB0aGlzIGFuaW1hdGlvbiBpcyBiZWluZyBtaXhlZCBvdXQuIERlZmF1bHRzIHRvIDAsIHNvIGF0dGFjaG1lbnQgdGltZWxpbmVzIGFyZSBub3QgYXBwbGllZCB3aGlsZSB0aGlzXG5cdCAqIGFuaW1hdGlvbiBpcyBiZWluZyBtaXhlZCBvdXQuICovXG5cdG1peERyYXdPcmRlclRocmVzaG9sZCA9IDA7XG5cblx0LyoqIFRoZSB0aW1lIGluIHNlY29uZHMgZm9yIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGlzIGFuaW1hdGlvbiwgYm90aCBpbml0aWFsbHkgYW5kIGFmdGVyIGxvb3BpbmcuIERlZmF1bHRzIHRvIDAuXG5cdCAqXG5cdCAqIFdoZW4gc2V0dGluZyBgYW5pbWF0aW9uU3RhcnRgIHRpbWUsIHtAbGluayBhbmltYXRpb25MYXN0fSBjYW4gYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIHRvIGF2b2lkIGZpcmluZyBldmVudHNcblx0ICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGFuaW1hdGlvbi4gKi9cblx0YW5pbWF0aW9uU3RhcnQgPSAwO1xuXG5cdC8qKiBUaGUgdGltZSBpbiBzZWNvbmRzIGZvciB0aGUgbGFzdCBmcmFtZSBvZiB0aGlzIGFuaW1hdGlvbi4gUGFzdCB0aGlzIHRpbWUsIG5vbi1sb29waW5nIGFuaW1hdGlvbnMgaG9sZCB0aGUgcG9zZSBhdCB0aGlzXG5cdCAqIHRpbWUgd2hpbGUgbG9vcGluZyBhbmltYXRpb25zIHdpbGwgbG9vcCBiYWNrIHRvIHtAbGluayBhbmltYXRpb25TdGFydH0uIERlZmF1bHRzIHRvIHRoZSB7QGxpbmsgQW5pbWF0aW9uLmR1cmF0aW9ufS4gKi9cblx0YW5pbWF0aW9uRW5kID0gMDtcblxuXG5cdC8qKiBUaGUgdGltZSBpbiBzZWNvbmRzIHRoaXMgYW5pbWF0aW9uIHdhcyBsYXN0IGFwcGxpZWQuIFNvbWUgdGltZWxpbmVzIHVzZSB0aGlzIGZvciBvbmUtdGltZSB0cmlnZ2Vycy4gRm9yIGV4YW1wbGUsIHdoZW5cblx0ICogdGhpcyBhbmltYXRpb24gaXMgYXBwbGllZCwgZXZlbnQgdGltZWxpbmVzIHdpbGwgZmlyZSBhbGwgZXZlbnRzIGJldHdlZW4gdGhlIGBhbmltYXRpb25MYXN0YCB0aW1lIChleGNsdXNpdmUpXG5cdCAqIGFuZCBgYW5pbWF0aW9uVGltZWAgKGluY2x1c2l2ZSkuIERlZmF1bHRzIHRvIC0xIHRvIGVuc3VyZSB0cmlnZ2VycyBvbiBmcmFtZSAwIGhhcHBlbiB0aGUgZmlyc3QgdGltZSB0aGlzXG5cdCAqIGFuaW1hdGlvbiBpcyBhcHBsaWVkLiAqL1xuXHRhbmltYXRpb25MYXN0ID0gMDtcblxuXHRuZXh0QW5pbWF0aW9uTGFzdCA9IDA7XG5cblx0LyoqIFNlY29uZHMgdG8gcG9zdHBvbmUgcGxheWluZyB0aGUgYW5pbWF0aW9uLiBNdXN0IGJlID49IDAuIFdoZW4gdGhpcyB0cmFjayBlbnRyeSBpcyB0aGUgY3VycmVudCB0cmFjayBlbnRyeSxcblx0ICogYGRlbGF5YCBwb3N0cG9uZXMgaW5jcmVtZW50aW5nIHRoZSB7QGxpbmsgdHJhY2tUaW1lfS4gV2hlbiB0aGlzIHRyYWNrIGVudHJ5IGlzIHF1ZXVlZCwgYGRlbGF5YCBpc1xuXHQgKiB0aGUgdGltZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIHRvIHdoZW4gdGhpcyB0cmFjayBlbnRyeSB3aWxsIGJlY29tZSB0aGUgY3VycmVudCB0cmFjayBlbnRyeSAoaWUgd2hlblxuXHQgKiB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnkge0BsaW5rIHRyYWNrVGltZX0gPj0gdGhpcyB0cmFjayBlbnRyeSdzIGBkZWxheWApLlxuXHQgKlxuXHQgKiB7QGxpbmsgdGltZVNjYWxlfSBhZmZlY3RzIHRoZSBkZWxheS5cblx0ICpcblx0ICogV2hlbiBwYXNzaW5nIGBkZWxheWAgPD0gMCB0byB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkQW5pbWF0aW9ufSB0aGlzXG5cdCAqIGBkZWxheWAgaXMgc2V0IHVzaW5nIGEgbWl4IGR1cmF0aW9uIGZyb20ge0BsaW5rIEFuaW1hdGlvblN0YXRlRGF0YX0uIFRvIGNoYW5nZSB0aGUge0BsaW5rIG1peER1cmF0aW9ufVxuXHQgKiBhZnRlcndhcmQsIHVzZSB7QGxpbmsgc2V0TWl4RHVyYXRpb259IHNvIHRoaXMgYGRlbGF5YCBpcyBhZGp1c3RlZC4gKi9cblx0ZGVsYXkgPSAwO1xuXG5cdC8qKiBUaGUgdGltZSBpbiBzZWNvbmRzIHRoaXMgdHJhY2sgZW50cnkgaGFzIGJlZW4gdGhlIGN1cnJlbnQgdHJhY2sgZW50cnksIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlYXNpbmcgZm9yZXZlci4gQ29tcGFyZSB0b1xuXHQgKiB7QGxpbmsgZ2V0QW5pbWF0aW9uVGltZX0sIHdoaWNoIGlzIGFsd2F5cyBiZXR3ZWVuIHtAbGluayBhbmltYXRpb25TdGFydH0gYW5kIHtAbGluayBhbmltYXRpb25FbmR9LlxuXHQgKlxuXHQgKiBUaGUgdHJhY2sgdGltZSBjYW4gYmUgc2V0IHRvIHN0YXJ0IHRoZSBhbmltYXRpb24gYXQgYSB0aW1lIG90aGVyIHRoYW4gMCwgd2l0aG91dCBhZmZlY3RpbmcgbG9vcGluZy4gV2hlbiBkb2luZyBzbyxcblx0ICoge0BsaW5rIGFuaW1hdGlvbkxhc3R9IGNhbiBiZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgdG8gYXZvaWQgZmlyaW5nIGV2ZW50cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uLlxuXHQgKlxuXHQgKiBUbyBzZXQgdGhlIHRpbWUgYW4gYW5pbWF0aW9uIHN0YXJ0cyBhbmQgbG9vcHMsIHVzZSB7QGxpbmsgYW5pbWF0aW9uU3RhcnR9IGFuZCB7QGxpbmsgYW5pbWF0aW9uRW5kfS4gKi9cblx0dHJhY2tUaW1lID0gMDtcblxuXHR0cmFja0xhc3QgPSAwOyBuZXh0VHJhY2tMYXN0ID0gMDtcblxuXHQvKiogVGhlIHRyYWNrIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHRoaXMgYW5pbWF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmFjay4gRGVmYXVsdHMgdG8gdGhlIGhpZ2hlc3QgcG9zc2libGUgZmxvYXRcblx0ICogdmFsdWUsIG1lYW5pbmcgdGhlIGFuaW1hdGlvbiB3aWxsIGJlIGFwcGxpZWQgdW50aWwgYSBuZXcgYW5pbWF0aW9uIGlzIHNldCBvciB0aGUgdHJhY2sgaXMgY2xlYXJlZC4gSWYgdGhlIHRyYWNrIGVuZCB0aW1lXG5cdCAqIGlzIHJlYWNoZWQsIG5vIG90aGVyIGFuaW1hdGlvbnMgYXJlIHF1ZXVlZCBmb3IgcGxheWJhY2ssIGFuZCBtaXhpbmcgZnJvbSBhbnkgcHJldmlvdXMgYW5pbWF0aW9ucyBpcyBjb21wbGV0ZSwgdGhlbiB0aGVcblx0ICogcHJvcGVydGllcyBrZXllZCBieSB0aGUgYW5pbWF0aW9uIGFyZSBzZXQgdG8gdGhlIHNldHVwIHBvc2UgYW5kIHRoZSB0cmFjayBpcyBjbGVhcmVkLlxuXHQgKlxuXHQgKiBVc3VhbGx5IHlvdSB3YW50IHRvIHVzZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkRW1wdHlBbmltYXRpb259IHJhdGhlciB0aGFuIGhhdmUgdGhlIGFuaW1hdGlvblxuXHQgKiBhYnJ1cHRseSBjZWFzZSBiZWluZyBhcHBsaWVkLCBsZWF2aW5nIHRoZSBjdXJyZW50IHBvc2UuICovXG5cdHRyYWNrRW5kID0gMDtcblxuXHQvKiogTXVsdGlwbGllciBmb3IgdGhlIGRlbHRhIHRpbWUgd2hlbiB0aGlzIHRyYWNrIGVudHJ5IGlzIHVwZGF0ZWQsIGNhdXNpbmcgdGltZSBmb3IgdGhpcyBhbmltYXRpb24gdG8gcGFzcyBzbG93ZXIgb3Jcblx0ICogZmFzdGVyLiBEZWZhdWx0cyB0byAxLlxuXHQgKlxuXHQgKiBWYWx1ZXMgPCAwIGFyZSBub3Qgc3VwcG9ydGVkLiBUbyBwbGF5IGFuIGFuaW1hdGlvbiBpbiByZXZlcnNlLCB1c2Uge0BsaW5rIHJldmVyc2V9LlxuXHQgKlxuXHQgKiB7QGxpbmsgbWl4VGltZX0gaXMgbm90IGFmZmVjdGVkIGJ5IHRyYWNrIGVudHJ5IHRpbWUgc2NhbGUsIHNvIHtAbGluayBtaXhEdXJhdGlvbn0gbWF5IG5lZWQgdG8gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlXG5cdCAqIGFuaW1hdGlvbiBzcGVlZC5cblx0ICpcblx0ICogV2hlbiB1c2luZyB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkQW5pbWF0aW9ufSB3aXRoIGEgYGRlbGF5YCA8PSAwLCB0aGVcblx0ICoge0BsaW5rIGRlbGF5fSBpcyBzZXQgdXNpbmcgdGhlIG1peCBkdXJhdGlvbiBmcm9tIHtAbGluayBBbmltYXRpb25TdGF0ZS5kYXRhfSwgYXNzdW1pbmcgdGltZSBzY2FsZSB0byBiZSAxLiBJZiB0aGUgdGltZVxuXHQgKiBzY2FsZSBpcyBub3QgMSwgdGhlIGRlbGF5IG1heSBuZWVkIHRvIGJlIGFkanVzdGVkLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIEFuaW1hdGlvblN0YXRlLnRpbWVTY2FsZX0gdG8gYWZmZWN0IGFsbCBhbmltYXRpb25zLiAqL1xuXHR0aW1lU2NhbGUgPSAwO1xuXG5cdC8qKiBWYWx1ZXMgPCAxIG1peCB0aGlzIGFuaW1hdGlvbiB3aXRoIHRoZSBza2VsZXRvbidzIGN1cnJlbnQgcG9zZSAoZWl0aGVyIHRoZSBzZXR1cCBwb3NlIG9yIHRoZSBwb3NlIGZyb20gbG93ZXIgdHJhY2tzKS5cblx0ICogRGVmYXVsdHMgdG8gMSwgd2hpY2ggb3ZlcndyaXRlcyB0aGUgc2tlbGV0b24ncyBjdXJyZW50IHBvc2Ugd2l0aCB0aGlzIGFuaW1hdGlvbi5cblx0ICpcblx0ICogQWxwaGEgc2hvdWxkIGJlIDEgb24gdHJhY2sgMC5cblx0ICpcblx0ICogU2VlIHtAbGluayBnZXRBbHBoYUF0dGFjaG1lbnRUaHJlc2hvbGR9LiAqL1xuXHRhbHBoYSA9IDA7XG5cblx0LyoqIFNlY29uZHMgZWxhcHNlZCBmcm9tIDAgdG8gdGhlIHtAbGluayBtaXhEdXJhdGlvbn0gd2hlbiBtaXhpbmcgZnJvbSB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIHRvIHRoaXMgYW5pbWF0aW9uLiBNYXlcblx0ICogYmUgc2xpZ2h0bHkgbW9yZSB0aGFuIGBtaXhEdXJhdGlvbmAgd2hlbiB0aGUgbWl4IGlzIGNvbXBsZXRlLiAqL1xuXHRtaXhUaW1lID0gMDtcblxuXHQvKiogU2Vjb25kcyBmb3IgbWl4aW5nIGZyb20gdGhlIHByZXZpb3VzIGFuaW1hdGlvbiB0byB0aGlzIGFuaW1hdGlvbi4gRGVmYXVsdHMgdG8gdGhlIHZhbHVlIHByb3ZpZGVkIGJ5XG5cdCAqIHtAbGluayBBbmltYXRpb25TdGF0ZURhdGEuZ2V0TWl4fSBiYXNlZCBvbiB0aGUgYW5pbWF0aW9uIGJlZm9yZSB0aGlzIGFuaW1hdGlvbiAoaWYgYW55KS5cblx0ICpcblx0ICogQSBtaXggZHVyYXRpb24gb2YgMCBzdGlsbCBuZWVkcyB0byBiZSBhcHBsaWVkIG9uZSBtb3JlIHRpbWUgdG8gbWl4IG91dCwgc28gdGhlIHRoZSBwcm9wZXJ0aWVzIGl0IHdhcyBhbmltYXRpbmcgYXJlXG5cdCAqIHJldmVydGVkLiBBIG1peCBkdXJhdGlvbiBvZiAwIGNhbiBiZSBzZXQgYXQgYW55IHRpbWUgdG8gZW5kIHRoZSBtaXggb24gdGhlIG5leHRcblx0ICoge0BsaW5rIEFuaW1hdGlvblN0YXRlLnVwZGF0ZSB8IHVwZGF0ZX0uXG5cdCAqXG5cdCAqIFRoZSBgbWl4RHVyYXRpb25gIGNhbiBiZSBzZXQgbWFudWFsbHkgcmF0aGVyIHRoYW4gdXNlIHRoZSB2YWx1ZSBmcm9tXG5cdCAqIHtAbGluayBBbmltYXRpb25TdGF0ZURhdGEuZ2V0TWl4fS4gSW4gdGhhdCBjYXNlLCB0aGUgYG1peER1cmF0aW9uYCBjYW4gYmUgc2V0IGZvciBhIG5ld1xuXHQgKiB0cmFjayBlbnRyeSBvbmx5IGJlZm9yZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGUudXBkYXRlfSBpcyBuZXh0IGNhbGxlZC5cblx0ICpcblx0ICogV2hlbiB1c2luZyB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYWRkQW5pbWF0aW9ufSB3aXRoIGEgYGRlbGF5YCA8PSAwLCB0aGVcblx0ICoge0BsaW5rIGdldERlbGF5fSBpcyBzZXQgdXNpbmcgdGhlIG1peCBkdXJhdGlvbiBmcm9tIHtAbGluayBBbmltYXRpb25TdGF0ZS5kYXRhfS4gSWYgYG1peER1cmF0aW9uYCBpcyBzZXRcblx0ICogYWZ0ZXJ3YXJkLCB0aGUgZGVsYXkgbmVlZHMgdG8gYmUgYWRqdXN0ZWQ6XG5cdCAqXG5cdCAqIDxwcmU+XG5cdCAqIGVudHJ5Lm1peER1cmF0aW9uID0gMC4yNTs8YnI+XG5cdCAqIGVudHJ5LmRlbGF5ID0gZW50cnkucHJldmlvdXMuZ2V0VHJhY2tDb21wbGV0ZSgpIC0gZW50cnkubWl4RHVyYXRpb24gKyAwO1xuXHQgKiA8L3ByZT5cblx0ICpcblx0ICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBzZXRNaXhEdXJhdGlvbn0gdG8gc2V0IGJvdGggdGhlIG1peCBkdXJhdGlvbiBhbmQgcmVjb21wdXRlIHRoZSBkZWxheTo8YnI+XG5cdCAqXG5cdCAqIDxwcmU+XG5cdCAgZW50cnkuc2V0TWl4RHVyYXRpb24oMC4yNWYsIDApOyAvLyBtaXhEdXJhdGlvbiwgZGVsYXlcblx0ICogPC9wcmU+XG5cdCAqL1xuXHRtaXhEdXJhdGlvbiA9IDA7XG5cblx0dG90YWxBbHBoYSA9IDA7XG5cblx0bWl4SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRpb24ubGluZWFyO1xuXG5cdC8qKiBTZXRzIGJvdGgge0BsaW5rIGdldE1peER1cmF0aW9ufSBhbmQge0BsaW5rIGdldERlbGF5fS5cblx0ICogQHBhcmFtIGRlbGF5IElmID4gMCwgc2V0cyB7QGxpbmsgZ2V0RGVsYXl9LiBJZiA8PSAwLCB0aGUgZGVsYXkgc2V0IGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJldmlvdXMgdHJhY2sgZW50cnkgbWludXNcblx0ICogICAgICAgICAgIHRoZSBzcGVjaWZpZWQgbWl4IGR1cmF0aW9uIHBsdXMgdGhlIHNwZWNpZmllZCBgZGVsYXlgIChpZSB0aGUgbWl4IGVuZHMgYXQgKHdoZW4gYGRlbGF5YCA9XG5cdCAqICAgICAgICAgICAwKSBvciBiZWZvcmUgKHdoZW4gYGRlbGF5YCA8IDApIHRoZSBwcmV2aW91cyB0cmFjayBlbnRyeSBkdXJhdGlvbikuIElmIHRoZSBwcmV2aW91cyBlbnRyeSBpc1xuXHQgKiAgICAgICAgICAgbG9vcGluZywgaXRzIG5leHQgbG9vcCBjb21wbGV0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBpdHMgZHVyYXRpb24uICovXG5cdHNldE1peER1cmF0aW9uIChtaXhEdXJhdGlvbjogbnVtYmVyLCBkZWxheT86IG51bWJlcikge1xuXHRcdHRoaXMubWl4RHVyYXRpb24gPSBtaXhEdXJhdGlvbjtcblx0XHRpZiAoZGVsYXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGRlbGF5IDw9IDApIGRlbGF5ID0gdGhpcy5wcmV2aW91cyA9PSBudWxsID8gMCA6IE1hdGgubWF4KGRlbGF5ICsgdGhpcy5wcmV2aW91cy5nZXRUcmFja0NvbXBsZXRlKCkgLSBtaXhEdXJhdGlvbiwgMCk7XG5cdFx0XHR0aGlzLmRlbGF5ID0gZGVsYXk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFRoZSBpbnRlcnBvbGF0aW9uIHRvIGFwcGx5IHRvIHRoZSBtaXggcGVyY2VudGFnZSAoe0BsaW5rIG1peFRpbWV9IC8ge0BsaW5rIG1peER1cmF0aW9ufSkgd2hlbiBtaXhpbmcgZnJvbSB0aGUgcHJldmlvdXNcblx0ICogYW5pbWF0aW9uIHRvIHRoaXMgYW5pbWF0aW9uLiBEZWZhdWx0cyB0byBsaW5lYXIuICovXG5cdHNldE1peEludGVycG9sYXRpb24gKG1peEludGVycG9sYXRpb246IEludGVycG9sYXRpb24pIHtcblx0XHRpZiAoIW1peEludGVycG9sYXRpb24pIHRocm93IG5ldyBFcnJvcihcIm1peEludGVycG9sYXRpb24gY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdHRoaXMubWl4SW50ZXJwb2xhdGlvbiA9IG1peEludGVycG9sYXRpb247XG5cdH1cblxuXHRtaXggKCk6IG51bWJlciB7XG5cdFx0aWYgKHRoaXMubWl4RHVyYXRpb24gPT09IDApIHJldHVybiAxO1xuXHRcdGxldCBtaXggPSB0aGlzLm1peFRpbWUgLyB0aGlzLm1peER1cmF0aW9uO1xuXHRcdGlmIChtaXggPj0gMSkgcmV0dXJuIDE7XG5cdFx0aWYgKHRoaXMubWl4SW50ZXJwb2xhdGlvbiA9PT0gSW50ZXJwb2xhdGlvbi5saW5lYXIpIHJldHVybiBtaXg7XG5cdFx0bWl4ID0gdGhpcy5taXhJbnRlcnBvbGF0aW9uLmFwcGx5KG1peCk7XG5cdFx0aWYgKG1peCA8IDApIHJldHVybiAwO1xuXHRcdGlmIChtaXggPiAxKSByZXR1cm4gMTtcblx0XHRyZXR1cm4gbWl4O1xuXHR9XG5cblx0LyoqIEZvciBlYWNoIHRpbWVsaW5lOlxuXHQgKiAtIEJpdHMgMC0xOiBNaXhGcm9tLlxuXHQgKiAtIEJpdCAyLCBIT0xEOiAwID0gbWl4IG91dCB1c2luZyBhbHBoYU1peCwgMSA9IGFwcGx5IGZ1bGwgYWxwaGEgdG8gcHJldmVudCBkaXBwaW5nLiBUaW1lbGluZSBpcyBmaXJzdCBvbiBpdHMgdHJhY2sgdG9cblx0ICogc2V0IHRoZSBwcm9wZXJ0eSBhbmQgdGhlIG5leHQgZW50cnkgKG1peGluZ1RvKSBhbHNvIHNldHMgaXQuIFdoZW4gaGVsZCwgdGltZWxpbmVIb2xkTWl4J3MgbWl4IGNvbnRyb2xzIGhvdyB0aGUgaG9sZCBmYWRlc1xuXHQgKiBvdXQgKGZvciAzKyBlbnRyeSBjaGFpbnMgd2hlcmUgdGhlIGNoYWluIGV2ZW50dWFsbHkgc3RvcHMgc2V0dGluZyB0aGUgcHJvcGVydHkpLiAqL1xuXHR0aW1lbGluZU1vZGUgPSBbXSBhcyBudW1iZXJbXTtcblx0dGltZWxpbmVIb2xkTWl4ID0gW10gYXMgVHJhY2tFbnRyeVtdO1xuXHR0aW1lbGluZXNSb3RhdGlvbiA9IFtdIGFzIG51bWJlcltdO1xuXG5cdHJlc2V0ICgpIHtcblx0XHR0aGlzLm5leHQgPSBudWxsO1xuXHRcdHRoaXMucHJldmlvdXMgPSBudWxsO1xuXHRcdHRoaXMubWl4aW5nRnJvbSA9IG51bGw7XG5cdFx0dGhpcy5taXhpbmdUbyA9IG51bGw7XG5cdFx0dGhpcy5taXhJbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGlvbi5saW5lYXI7XG5cdFx0dGhpcy5hbmltYXRpb24gPSBudWxsO1xuXHRcdHRoaXMubGlzdGVuZXIgPSBudWxsO1xuXHRcdHRoaXMudGltZWxpbmVNb2RlLmxlbmd0aCA9IDA7XG5cdFx0dGhpcy50aW1lbGluZUhvbGRNaXgubGVuZ3RoID0gMDtcblx0XHR0aGlzLnRpbWVsaW5lc1JvdGF0aW9uLmxlbmd0aCA9IDA7XG5cdH1cblxuXHQvKiogVXNlcyB7QGxpbmsgdHJhY2tUaW1lfSB0byBjb21wdXRlIHRoZSBgYW5pbWF0aW9uVGltZWAsIHdoaWNoIGlzIGFsd2F5cyBiZXR3ZWVuIHtAbGluayBhbmltYXRpb25TdGFydH0gYW5kXG5cdCAqIHtAbGluayBhbmltYXRpb25FbmR9LiBXaGVuIGB0cmFja1RpbWVgIGlzIDAsIGBhbmltYXRpb25UaW1lYCBpcyBlcXVhbCB0byB0aGVcblx0ICogYGFuaW1hdGlvblN0YXJ0YCB0aW1lLiAqL1xuXHRnZXRBbmltYXRpb25UaW1lICgpIHtcblx0XHRpZiAoIXRoaXMubG9vcCkgcmV0dXJuIE1hdGgubWluKHRoaXMudHJhY2tUaW1lICsgdGhpcy5hbmltYXRpb25TdGFydCwgdGhpcy5hbmltYXRpb25FbmQpO1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdGhpcy5hbmltYXRpb25FbmQgLSB0aGlzLmFuaW1hdGlvblN0YXJ0O1xuXHRcdGlmIChkdXJhdGlvbiA9PT0gMCkgcmV0dXJuIHRoaXMuYW5pbWF0aW9uU3RhcnQ7XG5cdFx0cmV0dXJuICh0aGlzLnRyYWNrVGltZSAlIGR1cmF0aW9uKSArIHRoaXMuYW5pbWF0aW9uU3RhcnQ7XG5cdH1cblxuXHRzZXRBbmltYXRpb25MYXN0IChhbmltYXRpb25MYXN0OiBudW1iZXIpIHtcblx0XHR0aGlzLmFuaW1hdGlvbkxhc3QgPSBhbmltYXRpb25MYXN0O1xuXHRcdHRoaXMubmV4dEFuaW1hdGlvbkxhc3QgPSBhbmltYXRpb25MYXN0O1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgbG9vcCBoYXMgYmVlbiBjb21wbGV0ZWQuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lci5jb21wbGV0ZX0uICovXG5cdGlzQ29tcGxldGUgKCkge1xuXHRcdHJldHVybiB0aGlzLnRyYWNrVGltZSA+PSB0aGlzLmFuaW1hdGlvbkVuZCAtIHRoaXMuYW5pbWF0aW9uU3RhcnQ7XG5cdH1cblxuXHQvKiogV2hlbiB7QGxpbmsgc2hvcnRlc3RSb3RhdGlvbn0gaXMgZmFsc2UsIHRoaXMgY2xlYXJzIHRoZSBkaXJlY3Rpb25zIGZvciBtaXhpbmcgdGhpcyBlbnRyeSdzIHJvdGF0aW9uLiBUaGlzIGNhbiBiZSB1c2VmdWxcblx0ICogdG8gYXZvaWQgYm9uZXMgcm90YXRpbmcgdGhlIGxvbmcgd2F5IGFyb3VuZCB3aGVuIHVzaW5nIHtAbGluayBnZXRBbHBoYX0gYW5kIHN0YXJ0aW5nIGFuaW1hdGlvbnMgb24gb3RoZXIgdHJhY2tzLlxuXHQgKlxuXHQgKiBNaXhpbmcgaW52b2x2ZXMgZmluZGluZyBhIHJvdGF0aW9uIGJldHdlZW4gdHdvIG90aGVycy4gVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBzb2x1dGlvbnM6IHRoZSBzaG9ydCBvciB0aGUgbG9uZyB3YXlcblx0ICogYXJvdW5kLiBXaGVuIHRoZSB0d28gcm90YXRpb25zIGNoYW5nZSBvdmVyIHRpbWUsIHdoaWNoIGRpcmVjdGlvbiBpcyB0aGUgc2hvcnQgb3IgbG9uZyB3YXkgY2FuIGFsc28gY2hhbmdlLiBJZiB0aGUgc2hvcnRcblx0ICogd2F5IHdhcyBhbHdheXMgY2hvc2VuLCBib25lcyBmbGlwIHRvIHRoZSBvdGhlciBzaWRlIHdoZW4gdGhhdCBkaXJlY3Rpb24gYmVjYW1lIHRoZSBsb25nIHdheS4gVHJhY2tFbnRyeSBjaG9vc2VzIHRoZSBzaG9ydFxuXHQgKiB3YXkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgYXBwbGllZCBhbmQgcmVtZW1iZXJzIHRoYXQgZGlyZWN0aW9uLiBSZXNldHRpbmcgdGhhdCBkaXJlY3Rpb24gbWFrZXMgaXQgY2hvb3NlIGEgbmV3IHNob3J0IHdheVxuXHQgKiBvbiB0aGUgbmV4dCBhcHBseS4gKi9cblx0cmVzZXRSb3RhdGlvbkRpcmVjdGlvbnMgKCkge1xuXHRcdHRoaXMudGltZWxpbmVzUm90YXRpb24ubGVuZ3RoID0gMDtcblx0fVxuXG5cdC8qKiBJZiB0aGlzIHRyYWNrIGVudHJ5IGlzIG5vbi1sb29waW5nLCB0aGlzIGlzIHRoZSB0cmFjayB0aW1lIGluIHNlY29uZHMgd2hlbiB7QGxpbmsgYW5pbWF0aW9uRW5kfSBpcyByZWFjaGVkLCBvciB0aGVcblx0ICogY3VycmVudCB7QGxpbmsgdHJhY2tUaW1lfSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlYWNoZWQuXG5cdCAqXG5cdCAqIElmIHRoaXMgdHJhY2sgZW50cnkgaXMgbG9vcGluZywgdGhpcyBpcyB0aGUgdHJhY2sgdGltZSB3aGVuIHRoaXMgYW5pbWF0aW9uIHdpbGwgcmVhY2ggaXRzIG5leHQge0BsaW5rIGFuaW1hdGlvbkVuZH0gKHRoZVxuXHQgKiBuZXh0IGxvb3AgY29tcGxldGlvbikuICovXG5cdGdldFRyYWNrQ29tcGxldGUgKCkge1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdGhpcy5hbmltYXRpb25FbmQgLSB0aGlzLmFuaW1hdGlvblN0YXJ0O1xuXHRcdGlmIChkdXJhdGlvbiAhPT0gMCkge1xuXHRcdFx0aWYgKHRoaXMubG9vcCkgcmV0dXJuIGR1cmF0aW9uICogKDEgKyAoKHRoaXMudHJhY2tUaW1lIC8gZHVyYXRpb24pIHwgMCkpOyAvLyBDb21wbGV0aW9uIG9mIG5leHQgbG9vcC5cblx0XHRcdGlmICh0aGlzLnRyYWNrVGltZSA8IGR1cmF0aW9uKSByZXR1cm4gZHVyYXRpb247IC8vIEJlZm9yZSBkdXJhdGlvbi5cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudHJhY2tUaW1lOyAvLyBOZXh0IHVwZGF0ZS5cblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFjayBlbnRyeSBoYXMgYmVlbiBhcHBsaWVkIGF0IGxlYXN0IG9uY2UuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYXBwbHl9LiAqL1xuXHR3YXNBcHBsaWVkICgpIHtcblx0XHRyZXR1cm4gdGhpcy5uZXh0VHJhY2tMYXN0ICE9PSAtMTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSB7QGxpbmsgbmV4dH0gdHJhY2sgZW50cnkgYW5kIGl0IHdpbGwgYmVjb21lIHRoZSBjdXJyZW50IHRyYWNrIGVudHJ5IGR1cmluZyB0aGUgbmV4dFxuXHQgKiB7QGxpbmsgQW5pbWF0aW9uU3RhdGUudXBkYXRlfS4gKi9cblx0aXNOZXh0UmVhZHkgKCkge1xuXHRcdHJldHVybiB0aGlzLm5leHQgIT0gbnVsbCAmJiB0aGlzLm5leHRUcmFja0xhc3QgLSB0aGlzLm5leHQuZGVsYXkgPj0gMDtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRRdWV1ZSB7XG5cdG9iamVjdHM6IEFycmF5PEV2ZW50VHlwZSB8IFRyYWNrRW50cnkgfCBFdmVudD4gPSBbXTtcblx0ZHJhaW5EaXNhYmxlZCA9IGZhbHNlO1xuXHRhbmltU3RhdGU6IEFuaW1hdGlvblN0YXRlO1xuXG5cdGNvbnN0cnVjdG9yIChhbmltU3RhdGU6IEFuaW1hdGlvblN0YXRlKSB7XG5cdFx0dGhpcy5hbmltU3RhdGUgPSBhbmltU3RhdGU7XG5cdH1cblxuXHRzdGFydCAoZW50cnk6IFRyYWNrRW50cnkpIHtcblx0XHR0aGlzLm9iamVjdHMucHVzaChFdmVudFR5cGUuc3RhcnQpO1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKGVudHJ5KTtcblx0XHR0aGlzLmFuaW1TdGF0ZS5hbmltYXRpb25zQ2hhbmdlZCA9IHRydWU7XG5cdH1cblxuXHRpbnRlcnJ1cHQgKGVudHJ5OiBUcmFja0VudHJ5KSB7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goRXZlbnRUeXBlLmludGVycnVwdCk7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goZW50cnkpO1xuXHR9XG5cblx0ZW5kIChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKEV2ZW50VHlwZS5lbmQpO1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKGVudHJ5KTtcblx0XHR0aGlzLmFuaW1TdGF0ZS5hbmltYXRpb25zQ2hhbmdlZCA9IHRydWU7XG5cdH1cblxuXHRkaXNwb3NlIChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKEV2ZW50VHlwZS5kaXNwb3NlKTtcblx0XHR0aGlzLm9iamVjdHMucHVzaChlbnRyeSk7XG5cdH1cblxuXHRjb21wbGV0ZSAoZW50cnk6IFRyYWNrRW50cnkpIHtcblx0XHR0aGlzLm9iamVjdHMucHVzaChFdmVudFR5cGUuY29tcGxldGUpO1xuXHRcdHRoaXMub2JqZWN0cy5wdXNoKGVudHJ5KTtcblx0fVxuXG5cdGV2ZW50IChlbnRyeTogVHJhY2tFbnRyeSwgZXZlbnQ6IEV2ZW50KSB7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goRXZlbnRUeXBlLmV2ZW50KTtcblx0XHR0aGlzLm9iamVjdHMucHVzaChlbnRyeSk7XG5cdFx0dGhpcy5vYmplY3RzLnB1c2goZXZlbnQpO1xuXHR9XG5cblx0ZHJhaW4gKCkge1xuXHRcdGlmICh0aGlzLmRyYWluRGlzYWJsZWQpIHJldHVybjsgLy8gTm90IHJlZW50cmFudC5cblx0XHR0aGlzLmRyYWluRGlzYWJsZWQgPSB0cnVlO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9iamVjdHMubGVuZ3RoOyBpICs9IDIpIHtcblx0XHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLm9iamVjdHM7XG5cdFx0XHRjb25zdCB0eXBlID0gb2JqZWN0c1tpXSBhcyBFdmVudFR5cGU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IG9iamVjdHNbaSArIDFdIGFzIFRyYWNrRW50cnk7XG5cdFx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmFuaW1TdGF0ZS5saXN0ZW5lcnMuc2xpY2UoKTtcblx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRjYXNlIEV2ZW50VHlwZS5zdGFydDpcblx0XHRcdFx0XHRpZiAoZW50cnkubGlzdGVuZXI/LnN0YXJ0KSBlbnRyeS5saXN0ZW5lci5zdGFydChlbnRyeSk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGxpc3RlbmVycy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzW2lpXTtcblx0XHRcdFx0XHRcdGlmIChsaXN0ZW5lci5zdGFydCkgbGlzdGVuZXIuc3RhcnQoZW50cnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBFdmVudFR5cGUuaW50ZXJydXB0OlxuXHRcdFx0XHRcdGlmIChlbnRyeS5saXN0ZW5lcj8uaW50ZXJydXB0KSBlbnRyeS5saXN0ZW5lci5pbnRlcnJ1cHQoZW50cnkpO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpaV07XG5cdFx0XHRcdFx0XHRpZiAobGlzdGVuZXIuaW50ZXJydXB0KSBsaXN0ZW5lci5pbnRlcnJ1cHQoZW50cnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOiByZWZlcmVuY2UgcnVudGltZSBkb2VzIGZhbGwgdGhyb3VnaFxuXHRcdFx0XHRjYXNlIEV2ZW50VHlwZS5lbmQ6XG5cdFx0XHRcdFx0aWYgKGVudHJ5Lmxpc3RlbmVyPy5lbmQpIGVudHJ5Lmxpc3RlbmVyLmVuZChlbnRyeSk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGxpc3RlbmVycy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzW2lpXTtcblx0XHRcdFx0XHRcdGlmIChsaXN0ZW5lci5lbmQpIGxpc3RlbmVyLmVuZChlbnRyeSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQvLyBGYWxsIHRocm91Z2guXG5cdFx0XHRcdGNhc2UgRXZlbnRUeXBlLmRpc3Bvc2U6XG5cdFx0XHRcdFx0aWYgKGVudHJ5Lmxpc3RlbmVyPy5kaXNwb3NlKSBlbnRyeS5saXN0ZW5lci5kaXNwb3NlKGVudHJ5KTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaWldO1xuXHRcdFx0XHRcdFx0aWYgKGxpc3RlbmVyLmRpc3Bvc2UpIGxpc3RlbmVyLmRpc3Bvc2UoZW50cnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLmFuaW1TdGF0ZS50cmFja0VudHJ5UG9vbC5mcmVlKGVudHJ5KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBFdmVudFR5cGUuY29tcGxldGU6XG5cdFx0XHRcdFx0aWYgKGVudHJ5Lmxpc3RlbmVyPy5jb21wbGV0ZSkgZW50cnkubGlzdGVuZXIuY29tcGxldGUoZW50cnkpO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpaV07XG5cdFx0XHRcdFx0XHRpZiAobGlzdGVuZXIuY29tcGxldGUpIGxpc3RlbmVyLmNvbXBsZXRlKGVudHJ5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgRXZlbnRUeXBlLmV2ZW50OiB7XG5cdFx0XHRcdFx0Y29uc3QgZXZlbnQgPSBvYmplY3RzW2krKyArIDJdIGFzIEV2ZW50O1xuXHRcdFx0XHRcdGlmIChlbnRyeS5saXN0ZW5lcj8uZXZlbnQpIGVudHJ5Lmxpc3RlbmVyLmV2ZW50KGVudHJ5LCBldmVudCk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGxpc3RlbmVycy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RlbmVyID0gbGlzdGVuZXJzW2lpXTtcblx0XHRcdFx0XHRcdGlmIChsaXN0ZW5lci5ldmVudCkgbGlzdGVuZXIuZXZlbnQoZW50cnksIGV2ZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5jbGVhcigpO1xuXG5cdFx0dGhpcy5kcmFpbkRpc2FibGVkID0gZmFsc2U7XG5cdH1cblxuXHRjbGVhciAoKSB7XG5cdFx0dGhpcy5vYmplY3RzLmxlbmd0aCA9IDA7XG5cdH1cbn1cblxuZXhwb3J0IGVudW0gRXZlbnRUeXBlIHtcblx0c3RhcnQsIGludGVycnVwdCwgZW5kLCBkaXNwb3NlLCBjb21wbGV0ZSwgZXZlbnRcbn1cblxuLyoqIFRoZSBpbnRlcmZhY2UgdG8gaW1wbGVtZW50IGZvciByZWNlaXZpbmcgVHJhY2tFbnRyeSBldmVudHMuIEl0IGlzIGFsd2F5cyBzYWZlIHRvIGNhbGwgQW5pbWF0aW9uU3RhdGUgbWV0aG9kcyB3aGVuIHJlY2VpdmluZ1xuICogZXZlbnRzLlxuICpcbiAqIFRyYWNrRW50cnkgZXZlbnRzIGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHtAbGluayBBbmltYXRpb25TdGF0ZS51cGRhdGV9IGFuZCB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYXBwbHl9IGFuZFxuICogZmlyZWQgb25seSBhZnRlciB0aG9zZSBtZXRob2RzIGFyZSBmaW5pc2hlZC5cbiAqXG4gKiBTZWUge0BsaW5rIFRyYWNrRW50cnkubGlzdGVuZXJ9IGFuZFxuICoge0BsaW5rIEFuaW1hdGlvblN0YXRlLmFkZExpc3RlbmVyfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lciB7XG5cdC8qKiBJbnZva2VkIHdoZW4gdGhpcyBlbnRyeSBoYXMgYmVlbiBzZXQgYXMgdGhlIGN1cnJlbnQgZW50cnkuIHtAbGluayBlbmR9IHdpbGwgb2NjdXIgd2hlbiB0aGlzIGVudHJ5IHdpbGwgbm9cblx0ICogbG9uZ2VyIGJlIGFwcGxpZWQuXG5cdCAqXG5cdCAqIFdoZW4gdGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgY2FsbGluZyB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuc2V0QW5pbWF0aW9ufSwgdGFrZSBjYXJlIG5vdCB0b1xuXHQgKiBjYWxsIHtAbGluayBBbmltYXRpb25TdGF0ZS51cGRhdGV9IHVudGlsIGFmdGVyIHRoZSBUcmFja0VudHJ5IGhhcyBiZWVuIGNvbmZpZ3VyZWQuICovXG5cdHN0YXJ0PzogKGVudHJ5OiBUcmFja0VudHJ5KSA9PiB2b2lkO1xuXG5cdC8qKiBJbnZva2VkIHdoZW4gYW5vdGhlciBlbnRyeSBoYXMgcmVwbGFjZWQgdGhpcyBlbnRyeSBhcyB0aGUgY3VycmVudCBlbnRyeS4gVGhpcyBlbnRyeSBtYXkgY29udGludWUgYmVpbmcgYXBwbGllZCBmb3Jcblx0ICogbWl4aW5nLiAqL1xuXHRpbnRlcnJ1cHQ/OiAoZW50cnk6IFRyYWNrRW50cnkpID0+IHZvaWQ7XG5cblx0LyoqIEludm9rZWQgd2hlbiB0aGlzIGVudHJ5IHdpbGwgbmV2ZXIgYmUgYXBwbGllZCBhZ2Fpbi4gVGhpcyBvbmx5IG9jY3VycyBpZiB0aGlzIGVudHJ5IGhhcyBwcmV2aW91c2x5IGJlZW4gc2V0IGFzIHRoZVxuXHQgKiBjdXJyZW50IGVudHJ5ICh7QGxpbmsgc3RhcnR9IHdhcyBpbnZva2VkKS4gKi9cblx0ZW5kPzogKGVudHJ5OiBUcmFja0VudHJ5KSA9PiB2b2lkO1xuXG5cdC8qKiBJbnZva2VkIHdoZW4gdGhpcyBlbnRyeSB3aWxsIGJlIGRpc3Bvc2VkLiBUaGlzIG1heSBvY2N1ciB3aXRob3V0IHRoZSBlbnRyeSBldmVyIGJlaW5nIHNldCBhcyB0aGUgY3VycmVudCBlbnRyeS5cblx0ICogUmVmZXJlbmNlcyB0byB0aGUgZW50cnkgc2hvdWxkIG5vdCBiZSBrZXB0IGFmdGVyIGRpc3Bvc2UgaXMgY2FsbGVkLCBhcyBpdCBtYXkgYmUgZGVzdHJveWVkIG9yIHJldXNlZC4gKi9cblx0ZGlzcG9zZT86IChlbnRyeTogVHJhY2tFbnRyeSkgPT4gdm9pZDtcblxuXHQvKiogSW52b2tlZCBldmVyeSB0aW1lIHRoaXMgZW50cnkncyBhbmltYXRpb24gY29tcGxldGVzIGEgbG9vcC4gVGhpcyBtYXkgb2NjdXIgZHVyaW5nIG1peGluZyAoYWZ0ZXJcblx0ICoge0BsaW5rIGludGVycnVwdH0pLlxuXHQgKlxuXHQgKiBJZiB0aGlzIGVudHJ5J3Mge0BsaW5rIFRyYWNrRW50cnkubWl4aW5nVG99IGlzIG5vdCBudWxsLCB0aGlzIGVudHJ5IGlzIG1peGluZyBvdXQgKGl0IGlzIG5vdCB0aGUgY3VycmVudCBlbnRyeSkuXG5cdCAqXG5cdCAqIEJlY2F1c2UgdGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYXQgdGhlIGVuZCBvZiB7QGxpbmsgQW5pbWF0aW9uU3RhdGUuYXBwbHl9LCBhbnkgYW5pbWF0aW9ucyBzZXQgaW4gcmVzcG9uc2UgdG9cblx0ICogdGhlIGV2ZW50IHdvbid0IGJlIGFwcGxpZWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgQW5pbWF0aW9uU3RhdGUgaXMgYXBwbGllZC4gKi9cblx0Y29tcGxldGU/OiAoZW50cnk6IFRyYWNrRW50cnkpID0+IHZvaWQ7XG5cblx0LyoqIEludm9rZWQgd2hlbiB0aGlzIGVudHJ5J3MgYW5pbWF0aW9uIHRyaWdnZXJzIGFuIGV2ZW50LiAqL1xuXHRldmVudD86IChlbnRyeTogVHJhY2tFbnRyeSwgZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQW5pbWF0aW9uU3RhdGVBZGFwdGVyIGltcGxlbWVudHMgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lciB7XG5cdHN0YXJ0IChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHR9XG5cblx0aW50ZXJydXB0IChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHR9XG5cblx0ZW5kIChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHR9XG5cblx0ZGlzcG9zZSAoZW50cnk6IFRyYWNrRW50cnkpIHtcblx0fVxuXG5cdGNvbXBsZXRlIChlbnRyeTogVHJhY2tFbnRyeSkge1xuXHR9XG5cblx0ZXZlbnQgKGVudHJ5OiBUcmFja0VudHJ5LCBldmVudDogRXZlbnQpIHtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgQ1VSUkVOVCA9IDA7XG5leHBvcnQgY29uc3QgU0VUVVAgPSAxO1xuZXhwb3J0IGNvbnN0IEZJUlNUID0gMjtcbmV4cG9ydCBjb25zdCBNT0RFID0gMztcbmV4cG9ydCBjb25zdCBIT0xEID0gNDtcblxuZXhwb3J0IGNvbnN0IEFUVEFDSF9TRVRVUCA9IDE7XG5leHBvcnQgY29uc3QgQVRUQUNIX1JFVEFJTiA9IDI7XG4iXX0=