@magic-xpa/gui 4.702.0-dev472.353 → 4.800.0-dev000.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/bundles/magic-xpa-gui.umd.js +1100 -7518
  2. package/bundles/magic-xpa-gui.umd.js.map +1 -1
  3. package/bundles/magic-xpa-gui.umd.min.js +2 -2
  4. package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
  5. package/esm2015/index.js +1 -1
  6. package/esm2015/magic-xpa-gui.js +1 -4
  7. package/esm2015/src/Commands.js +11 -114
  8. package/esm2015/src/Events.js +1 -517
  9. package/esm2015/src/EventsProcessor.js +1 -51
  10. package/esm2015/src/FocusManager.js +1 -13
  11. package/esm2015/src/GuiConstants.js +2 -11
  12. package/esm2015/src/GuiEnums.js +127 -130
  13. package/esm2015/src/GuiEnvironment.js +1 -1
  14. package/esm2015/src/IFlowMonitorQueue.js +1 -1
  15. package/esm2015/src/Manager.js +10 -148
  16. package/esm2015/src/UIBridge.js +1 -6
  17. package/esm2015/src/env/IEnvironment.js +1 -1
  18. package/esm2015/src/gui/ControlBase.js +1 -1
  19. package/esm2015/src/gui/GuiMgControl.js +1 -94
  20. package/esm2015/src/gui/GuiMgForm.js +1 -1
  21. package/esm2015/src/gui/KeyboardItem.js +5 -46
  22. package/esm2015/src/gui/LastFocusedVal.js +1 -5
  23. package/esm2015/src/gui/MgValue.js +1 -1
  24. package/esm2015/src/gui/PropParentInterface.js +1 -1
  25. package/esm2015/src/gui/low/DialogHandler.js +1 -10
  26. package/esm2015/src/gui/low/GuiCommand.js +1 -12
  27. package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
  28. package/esm2015/src/gui/low/GuiInteractive.js +8 -465
  29. package/esm2015/src/gui/low/Style.js +1 -9
  30. package/esm2015/src/management/RuntimeContextBase.js +11 -14
  31. package/esm2015/src/management/data/BlobType.js +0 -0
  32. package/esm2015/src/management/data/DcValues.js +8 -67
  33. package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
  34. package/esm2015/src/management/data/FieldDef.js +1 -95
  35. package/esm2015/src/management/data/FieldsTable.js +2 -28
  36. package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
  37. package/esm2015/src/management/data/GuiFieldBase.js +4 -39
  38. package/esm2015/src/management/data/IRecord.js +1 -1
  39. package/esm2015/src/management/data/IReferencedObject.js +1 -8
  40. package/esm2015/src/management/data/NUM_TYPE.js +14 -485
  41. package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
  42. package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
  43. package/esm2015/src/management/data/RecordUtils.js +6 -112
  44. package/esm2015/src/management/data/VectorType.js +17 -252
  45. package/esm2015/src/management/data/VectorTypeBase.js +1 -35
  46. package/esm2015/src/management/events/IActionManager.js +1 -1
  47. package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
  48. package/esm2015/src/management/exp/ExpressionInterface.js +5 -3
  49. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
  50. package/esm2015/src/management/gui/ControlTable.js +18 -72
  51. package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
  52. package/esm2015/src/management/gui/FieldValidator.js +58 -339
  53. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
  54. package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
  55. package/esm2015/src/management/gui/HebrewDate.js +3 -140
  56. package/esm2015/src/management/gui/Helps.js +2 -48
  57. package/esm2015/src/management/gui/MgControlBase.js +160 -874
  58. package/esm2015/src/management/gui/MgFormBase.js +68 -407
  59. package/esm2015/src/management/gui/PIC.js +58 -285
  60. package/esm2015/src/management/gui/PropDefaults.js +13 -48
  61. package/esm2015/src/management/gui/PropInterface.js +3 -4
  62. package/esm2015/src/management/gui/PropTable.js +72 -183
  63. package/esm2015/src/management/gui/Property.js +40 -373
  64. package/esm2015/src/management/gui/ValidationDetails.js +10 -52
  65. package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
  66. package/esm2015/src/management/gui/WrongFormatException.js +1 -15
  67. package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
  68. package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
  69. package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
  70. package/esm2015/src/management/tasks/ITask.js +1 -1
  71. package/esm2015/src/management/tasks/MgTimer.js +1 -16
  72. package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
  73. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
  74. package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
  75. package/esm2015/src/util/MemoryUtil.js +1 -41
  76. package/esm2015/src/util/ObjectReference.js +1 -8
  77. package/esm2015/src/util/ProcessLauncher.js +3 -21
  78. package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
  79. package/fesm2015/magic-xpa-gui.js +881 -7051
  80. package/fesm2015/magic-xpa-gui.js.map +1 -1
  81. package/magic-xpa-gui.d.ts +0 -3
  82. package/package.json +2 -2
  83. package/src/Commands.d.ts +2 -0
  84. package/src/Events.d.ts +0 -2
  85. package/src/GuiEnums.d.ts +127 -129
  86. package/src/env/IEnvironment.d.ts +3 -0
  87. package/src/gui/GuiMgControl.d.ts +1 -0
  88. package/src/gui/PropParentInterface.d.ts +1 -1
  89. package/src/gui/low/GuiInteractive.d.ts +3 -1
  90. package/src/gui/low/Style.d.ts +0 -3
  91. package/src/management/RuntimeContextBase.d.ts +2 -0
  92. package/src/management/data/GuiDataViewBase.d.ts +4 -4
  93. package/src/management/data/IRecord.d.ts +1 -1
  94. package/src/management/exp/ExpressionInterface.d.ts +4 -0
  95. package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
  96. package/src/management/gui/ControlTable.d.ts +1 -1
  97. package/src/management/gui/DisplayConvertor.d.ts +1 -1
  98. package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
  99. package/src/management/gui/MgControlBase.d.ts +8 -7
  100. package/src/management/gui/MgFormBase.d.ts +6 -6
  101. package/src/management/gui/PIC.d.ts +1 -0
  102. package/src/management/gui/PropInterface.d.ts +3 -4
  103. package/src/management/gui/PropTable.d.ts +4 -5
  104. package/src/management/gui/Property.d.ts +1 -1
  105. package/src/management/tasks/GuiTaskBase.d.ts +8 -14
  106. package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
@@ -8,6 +8,7 @@ import { NUM_TYPE } from '../data/NUM_TYPE';
8
8
  import { HebrewDate } from './HebrewDate';
9
9
  import { BlobType } from '../data/BlobType';
10
10
  import { GuiEnvironment } from '../../GuiEnvironment';
11
+ import { PropInterface } from "./PropInterface";
11
12
  export class FieldValidator {
12
13
  constructor() {
13
14
  this._newvalue = null;
@@ -23,16 +24,12 @@ export class FieldValidator {
23
24
  this._environment = GuiEnvironment.Environment;
24
25
  this._decimal = (this._environment.GetDecimal() || "");
25
26
  }
26
- /// <summary> the main method of this class</summary>
27
- /// <param name="valDet">a ValidationDetails object to use when validating</param>
28
27
  checkVal(valDet) {
29
28
  this._newvalue = (this._oldvalue = (this._pictureReal = (this._pictureEnable = null)));
30
29
  this.init(valDet);
31
30
  valDet.setValidationFailed(false);
32
31
  let ctrl = valDet.getControl();
33
- // TODO - uncomment this line when 'PROP_TYPE_MODIFY_IN_QUERY' is supported for other controls
34
- // let modInQueuy: boolean = await ctrl.checkPropWithLine(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false, ctrl.getDisplayLine(false));
35
- let modInQueuy = ctrl.Type === MgControlType.CTRL_TYPE_TAB;
32
+ let modInQueuy = ctrl.isRepeatable() ? false : ctrl.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false, ctrl.getDisplayLine(false));
36
33
  let useNative = ctrl.isModifiable();
37
34
  if (ctrl.getForm().getTask().getMode() === 'E' && !modInQueuy) {
38
35
  valDet.setValue(this._oldvalue);
@@ -59,7 +56,6 @@ export class FieldValidator {
59
56
  valDet.setValue(this._newvalue);
60
57
  return valDet;
61
58
  }
62
- // space|nothing was inserted -> use default value
63
59
  if (ctrl.DataType !== StorageAttribute.ALPHA && ctrl.DataType !== StorageAttribute.UNICODE && ctrl.DataType !== StorageAttribute.BLOB) {
64
60
  if ((typeof this._newvalue === 'string' && this._newvalue.trim().length === 0) || (ctrl.DataType === StorageAttribute.DATE && (ctrl.isDateZero(this._newvalue) || this.isNullDisplayVal()))) {
65
61
  let field = ctrl.getField();
@@ -91,7 +87,7 @@ export class FieldValidator {
91
87
  valDet.setValue(this.checkAlphaField());
92
88
  break;
93
89
  case StorageAttribute.NUMERIC:
94
- this._pictureReal = valDet.getPictureReal(); // only numeric type need another picture format
90
+ this._pictureReal = valDet.getPictureReal();
95
91
  this._pictureEnable = valDet.getPictureEnable();
96
92
  this.checkNumericPicture();
97
93
  valDet.setValue(this.checkNumericField());
@@ -106,7 +102,6 @@ export class FieldValidator {
106
102
  valDet.setValue(this.checkTimeField());
107
103
  break;
108
104
  case StorageAttribute.BLOB:
109
- // there is no real picture to BLOB, do nothing
110
105
  case StorageAttribute.BLOB_VECTOR:
111
106
  valDet.setValue(this._newvalue);
112
107
  break;
@@ -118,7 +113,6 @@ export class FieldValidator {
118
113
  }
119
114
  catch (goBack) {
120
115
  if (goBack instanceof WrongFormatException) {
121
- // need change to old value, set focus back and write Error Message
122
116
  valDet.setValue(this._oldvalue);
123
117
  this.setValidationFailed(true);
124
118
  if (goBack.getType() !== MsgInterface.STR_RNG_TXT) {
@@ -132,13 +126,6 @@ export class FieldValidator {
132
126
  }
133
127
  return valDet;
134
128
  }
135
- /// <summary>Check & validate Alpha field by his old/new value and 2 pictures:
136
- /// Real and Enable
137
- /// 1.check if newvalue complete with pictures, otherwise return oldvalue
138
- /// 2.check if newvalue complete with range
139
- /// 2.1 complete value, if possible, otherwise return oldvalue
140
- /// </summary>
141
- /// <returns> String - new value of validated field</returns>
142
129
  checkAlphaField() {
143
130
  let control = this._valDet.getControl();
144
131
  let IsAttrAlpha = this._valDet.getType() === StorageAttribute.ALPHA;
@@ -184,12 +171,12 @@ export class FieldValidator {
184
171
  currPicture = currPicture + 2;
185
172
  }
186
173
  else {
187
- stringBuilder.Append(' ') /*' '*/;
174
+ stringBuilder.Append(' ');
188
175
  currPicture = currPicture + 1;
189
176
  }
190
177
  }
191
178
  else {
192
- stringBuilder.Append(' ') /*' '*/;
179
+ stringBuilder.Append(' ');
193
180
  currPicture = currPicture + 1;
194
181
  }
195
182
  }
@@ -212,7 +199,7 @@ export class FieldValidator {
212
199
  }
213
200
  }
214
201
  else {
215
- stringBuilder.Append(' ') /*' '*/;
202
+ stringBuilder.Append(' ');
216
203
  currPicture = currPicture + 1;
217
204
  if (this._valDet.getControl() !== null) {
218
205
  let type = control.Type;
@@ -230,9 +217,6 @@ export class FieldValidator {
230
217
  }
231
218
  return this._newvalue;
232
219
  }
233
- /// <summary>check if char in Alpha compleate with Directive Character for the letter</summary>
234
- /// <param name="index">of directive in string to check</param>
235
- /// <returns> true if complete, false otherwise</returns>
236
220
  isPossibleAlphaLetter(indexInput, indexPicture) {
237
221
  let result;
238
222
  switch (this._picture.charCodeAt(indexPicture)) {
@@ -265,9 +249,6 @@ export class FieldValidator {
265
249
  return false;
266
250
  }
267
251
  }
268
- /// <summary>if new value wasn't finished and stay unwritable peaces of the Real picture - add it
269
- /// to the end of the newvalue
270
- /// </summary>
271
252
  fillAllAlpha() {
272
253
  let stringBuilder = new StringBuilder(this._picture.length);
273
254
  stringBuilder.Append(this._newvalue);
@@ -286,7 +267,7 @@ export class FieldValidator {
286
267
  else {
287
268
  for (let i = this._newvalue.length - 1; i < this._picture.length && i >= 0; i++) {
288
269
  if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(i))) {
289
- stringBuilder.Append(' ') /*' '*/;
270
+ stringBuilder.Append(' ');
290
271
  }
291
272
  else {
292
273
  stringBuilder.Append(this._picture.charAt(i));
@@ -296,8 +277,6 @@ export class FieldValidator {
296
277
  }
297
278
  return stringBuilder.ToString();
298
279
  }
299
- /// <summary>Comparative newvalue with possible Range in ContinuousRangeValues/DiscreteRangeValues</summary>
300
- /// <returns> newvalue if it possible, oldvalue otherwise</returns>
301
280
  fillAlphaByRange(ContinuousRangeValues, DiscreteRangeValues) {
302
281
  let tmpBuffer = DisplayConvertor.Instance.fillAlphaByDiscreteRangeValues(DiscreteRangeValues, this._newvalue);
303
282
  if (tmpBuffer !== null) {
@@ -311,24 +290,14 @@ export class FieldValidator {
311
290
  this.printMessage(MsgInterface.STR_RNG_TXT, true);
312
291
  return this._oldvalue;
313
292
  }
314
- /// <summary>Try to complete the newvalue by Range</summary>
315
- /// <returns> completed value if it possible, otherwise oldvalue</returns>
316
293
  CompleteAlphaByRange(DiscreteRangeValues) {
317
294
  let tmpNewValue = DisplayConvertor.Instance.completeAlphaByRange(DiscreteRangeValues, this._newvalue);
318
295
  if (tmpNewValue !== null) {
319
296
  return tmpNewValue;
320
297
  }
321
- // focus back
322
298
  this.printMessage(MsgInterface.STR_RNG_TXT, true);
323
299
  return this._oldvalue;
324
300
  }
325
- /// <summary>check & validate Logical field by his old/new value and 2 pictures:
326
- /// Real and Enable
327
- /// 1.check if newvalue complete with pictures, otherwise return oldvalue
328
- /// 2.check if newvalue complete with range
329
- /// 2.1 complete value, if possible, otherwise return oldvalue
330
- /// </summary>
331
- /// <returns> String - new value of validated field</returns>
332
301
  checkLogicalField() {
333
302
  if (this._newvalue.length === 0 && this._valDet.getContinuousRangeValues() === null && this._valDet.getDiscreteRangeValues() === null) {
334
303
  throw new WrongFormatException(MsgInterface.STR_RNG_TXT);
@@ -337,17 +306,8 @@ export class FieldValidator {
337
306
  this._newvalue = this.fillAlphaByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues());
338
307
  }
339
308
  this.setValidationFailed(false);
340
- // todo : need to check what is to handle for checking ranges
341
309
  return this._newvalue;
342
310
  }
343
- /// <summary>**************************Numeric*********************************</summary>
344
- /// <summary>check & validate Numeric field by his old/new value and 2 pictures:
345
- /// Real and Enable
346
- /// 1.check if newvalue complete with pictures, otherwise return oldvalue
347
- /// 2.check if newvalue complete with range
348
- /// 2.1 complete value, if possible, otherwise return oldvalue
349
- /// </summary>
350
- /// <returns> String - new value of validated field</returns>
351
311
  checkNumericField() {
352
312
  let evaluated;
353
313
  if (typeof this._newvalue === 'string') {
@@ -360,7 +320,6 @@ export class FieldValidator {
360
320
  let evaluatedLeft;
361
321
  let evaluatedRight;
362
322
  this.setValidationFailed(false);
363
- // check if the format of newvalue matches the numeric mask.
364
323
  if (!this.checkNumericInDecFormat())
365
324
  throw new WrongFormatException(MsgInterface.EDT_ERR_STR_1);
366
325
  if (delimeterPictIndex !== -1 && delimeterRealIndex !== -1) {
@@ -374,7 +333,7 @@ export class FieldValidator {
374
333
  evaluatedRight = this.checkNumericRight(delimeterPictIndex, delimeterPictIndex - 1);
375
334
  evaluated = evaluatedLeft + this._decimal + evaluatedRight;
376
335
  }
377
- else { // delimeterPictIndex == -1 && delimeterRealIndex != -1
336
+ else {
378
337
  if (delimeterPictIndex === -1 && delimeterRealIndex === -1) {
379
338
  evaluated = this.checkNumericRight(-1, -1);
380
339
  evaluatedLeft = evaluated;
@@ -392,11 +351,10 @@ export class FieldValidator {
392
351
  }
393
352
  }
394
353
  if ((evaluatedRight.length === 0 && evaluatedLeft.length === 0) || (evaluated.length === 0 && this._newvalue.length > 0)) {
395
- // space|nothing was inserted -> use default value
396
354
  let ctrl;
397
355
  ctrl = this._valDet.getControl();
398
356
  let field = ctrl.getField();
399
- let defValue = field.getDefaultValue(); // inner value inserted
357
+ let defValue = field.getDefaultValue();
400
358
  let dispDefValue = null;
401
359
  if (field.isNullDefault()) {
402
360
  this._valDet.setNull(true);
@@ -405,16 +363,12 @@ export class FieldValidator {
405
363
  if (dispDefValue == null)
406
364
  dispDefValue = DisplayConvertor.Instance.mg2disp(defValue, this._valDet.getRange(), this._valDet.getPIC(), true, field.getTask().getCompIdx(), false);
407
365
  }
408
- // check if the digit before the delimiter do not exceed the pic wholes.
409
366
  let wholeDigitdiff = this.digitsBeforeDelimeter(evaluated, 0, this._decimal) - this._valDet.getPIC().getWholes();
410
- // if they do, check if the exceeding chars are the pad chars. if so, there is no error.
411
367
  if (wholeDigitdiff > 0) {
412
368
  let padCharOnly = false;
413
- // is there a pad, check it. no pad is a certain error.
414
369
  if (this._valDet.getIsPadFill()) {
415
370
  padCharOnly = true;
416
371
  for (let i = 0; i < wholeDigitdiff && padCharOnly; i++)
417
- // if the char is not the pad, then this is an error.
418
372
  if (evaluated[i] !== this._valDet.getPadFillChar())
419
373
  padCharOnly = false;
420
374
  }
@@ -424,33 +378,22 @@ export class FieldValidator {
424
378
  if (this._valDet.getIsNegative() && (this._newvalue.trim().startsWith("-") || (this._valDet.getNegativeSignPref().length !== 0 && this._newvalue.trim().startsWith(this._valDet.getNegativeSignPref())))) {
425
379
  evaluated = "-" + evaluated;
426
380
  }
427
- // from this point have evaluated string - the value (without mask) of the control
428
- // needed to be inserted to the picture
429
381
  evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, "", this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
430
382
  evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
431
- // in order check if user has entered a blank value , trim and then check it's length.
432
383
  let tempDispVal = StrUtil.ltrim(evaluated);
433
384
  if (tempDispVal.length === 0 && this._valDet.getPIC().zeroFill() && this._valDet.getPIC().getZeroPad() === ' ')
434
385
  evaluated = "0";
435
386
  }
436
387
  else {
437
- // from this point have evaluated string - the value (without mask) of the control
438
- // needed to be inserted to the picture
439
388
  evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, "", this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
440
389
  evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
441
390
  }
442
- // Insert the number to range
443
391
  if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null) {
444
392
  this._newvalue = evaluated;
445
393
  evaluated = this.fillNumericByRange();
446
394
  }
447
395
  return evaluated;
448
396
  }
449
- /// <summary>Check validity of numerical picture from found 'delimeter' to left.
450
- /// <-.
451
- /// </summary>
452
- /// <param name="delimeterPictIndex">found delimeter in the picture</param>
453
- /// <param name="delimeterRealIndex">found delimeter in the inserted by user new value</param>
454
397
  checkNumericLeft(delimeterPictIndex, delimeterRealIndex) {
455
398
  let buffer = new StringBuilder();
456
399
  let RealIndex = delimeterRealIndex - 1;
@@ -471,7 +414,6 @@ export class FieldValidator {
471
414
  RealIndex = tmpstorage;
472
415
  buffer.Append(this._pictureReal[PictIndex]);
473
416
  }
474
- // can insert only number
475
417
  else {
476
418
  for (; RealIndex >= 0; RealIndex--) {
477
419
  if (UtilStrByteMode.isDigit(this._newvalue[RealIndex])) {
@@ -483,23 +425,16 @@ export class FieldValidator {
483
425
  }
484
426
  }
485
427
  if (RealIndex < 0 && PictIndex >= 0)
486
- // try to add unwritable
487
428
  for (; PictIndex >= 0; PictIndex--) {
488
429
  if (this._pictureEnable[PictIndex] === '1')
489
430
  buffer.Append(this._pictureReal[PictIndex]);
490
431
  else {
491
- // only from left need PadFill
492
432
  if (this._valDet.getIsPadFill())
493
433
  buffer.Append(this._valDet.getPadFillChar());
494
434
  }
495
435
  }
496
436
  return StrUtil.ReverseString(buffer).ToString();
497
437
  }
498
- /// <summary>Check validity of numerical picture from found 'delimeter' to right.
499
- /// .->
500
- /// </summary>
501
- /// <param name="delimeterPictIndex">found delimeter in the picture</param>
502
- /// <param name="delimeterRealIndex">found delimeter in the inserted by user new value</param>
503
438
  checkNumericRight(delimeterPictIndex, delimeterRealIndex) {
504
439
  let buffer = new StringBuilder();
505
440
  let RealIndex = delimeterRealIndex + 1;
@@ -511,10 +446,8 @@ export class FieldValidator {
511
446
  RealIndex = PictIndex;
512
447
  buffer.Append(this._pictureReal[PictIndex]);
513
448
  }
514
- // can insert only number
515
449
  else {
516
450
  for (; RealIndex < this._newvalue.length; RealIndex++) {
517
- // Append the digit of actual input data. If it is mask char, skip it.
518
451
  if (UtilStrByteMode.isDigit(this._newvalue[RealIndex]) && !pic.picIsMask(RealIndex)) {
519
452
  buffer.Append(this._newvalue[RealIndex]);
520
453
  RealIndex++;
@@ -523,27 +456,21 @@ export class FieldValidator {
523
456
  }
524
457
  }
525
458
  }
526
- // if right part has any input data, then only append unwritable chars
527
459
  if (buffer.Length > 0) {
528
460
  if (RealIndex >= this._newvalue.length && PictIndex < this._pictureReal.length)
529
- // try to add unwritable
530
461
  for (; PictIndex < this._pictureReal.length; PictIndex++) {
531
462
  if (this._pictureEnable[PictIndex] === '1')
532
463
  buffer.Append(this._pictureReal[PictIndex]);
533
- // else Do nothing
534
464
  }
535
465
  }
536
466
  return buffer.ToString();
537
467
  }
538
- /// <summary>BUG: 442788
539
- /// Changing decimal separator in thew pictureReal to value got from Environment
540
- /// </summary>
541
468
  checkNumericPicture() {
542
469
  let indexOfDec;
543
470
  let lastDec;
544
471
  let maxLength;
545
472
  let currIndx;
546
- let POINT_DEC = "."; // used in PICTURE for decimal separator
473
+ let POINT_DEC = ".";
547
474
  let pic = this._valDet.getPIC();
548
475
  if (this._pictureReal == null || this._pictureEnable == null || pic.getAttr() !== StorageAttribute.NUMERIC || !pic.withDecimal())
549
476
  return;
@@ -553,25 +480,17 @@ export class FieldValidator {
553
480
  while (currIndx < lastDec) {
554
481
  indexOfDec = this._pictureEnable.indexOf("1", currIndx);
555
482
  if (indexOfDec === -1)
556
- // not found
557
483
  return;
558
484
  else {
559
- if (indexOfDec === this._pictureReal.indexOf(POINT_DEC, currIndx))
560
- // it's real decimal point and not \. into the picture
561
- {
485
+ if (indexOfDec === this._pictureReal.indexOf(POINT_DEC, currIndx)) {
562
486
  let first;
563
487
  let second;
564
488
  first = second = "";
565
- if (indexOfDec === 0)
566
- // the point on the first place .###
567
- {
489
+ if (indexOfDec === 0) {
568
490
  if (indexOfDec + 1 < maxLength)
569
- // only 1 .
570
491
  second = this._pictureReal.substr(indexOfDec + 1);
571
492
  }
572
- else if (indexOfDec === maxLength)
573
- // the point on the last place ###.
574
- {
493
+ else if (indexOfDec === maxLength) {
575
494
  first = this._pictureReal.substr(0, indexOfDec);
576
495
  }
577
496
  else {
@@ -587,8 +506,6 @@ export class FieldValidator {
587
506
  }
588
507
  }
589
508
  }
590
- /// <summary> Compare newvalue with the range</summary>
591
- /// <returns> newvalue if it's in the range, oldvalue otherwise</returns>
592
509
  fillNumericByRange() {
593
510
  let controlPic = this._valDet.getControl().getPIC();
594
511
  let continuousRangeValues = this._valDet.getContinuousRangeValues();
@@ -609,7 +526,6 @@ export class FieldValidator {
609
526
  }
610
527
  }
611
528
  catch (ex_CC) {
612
- // skip non-numeric range values
613
529
  }
614
530
  }
615
531
  }
@@ -625,23 +541,17 @@ export class FieldValidator {
625
541
  }
626
542
  }
627
543
  catch (ex_15B) {
628
- // skip non-numeric range values
629
544
  }
630
545
  }
631
546
  }
632
547
  throw new WrongFormatException();
633
548
  }
634
- /// <summary> returns a numeric value extracted from the beginning of a string
635
- /// on failure returns NEGATIVE_INFINITY
636
- /// </summary>
637
- /// <param name="val">the string to parse</param>
638
549
  getDoubleVal(val) {
639
550
  let dotFound = false;
640
551
  let minusFound = false;
641
552
  let digitFound = false;
642
553
  let endOfNum = false;
643
554
  let i = 0;
644
- // find the delemeting non numeric character
645
555
  for (i = 0; i < val.length && !endOfNum; i++) {
646
556
  let c = val[i];
647
557
  if (c >= '0' && c <= '9')
@@ -676,8 +586,6 @@ export class FieldValidator {
676
586
  }
677
587
  return -Infinity;
678
588
  }
679
- /// <summary>set Numeric value Without Picture, filter input from user</summary>
680
- /// <returns> the pure number, without picture mask</returns>
681
589
  setNumericValueWithoutPicture(val) {
682
590
  let checkedStr = new StringBuilder(val.length);
683
591
  let isFirstDecimal = false;
@@ -699,8 +607,6 @@ export class FieldValidator {
699
607
  }
700
608
  return checkedStr.ToString();
701
609
  }
702
- /// <summary> check if newvalue format matches the numeric pic format.</summary>
703
- /// <returns></returns>
704
610
  checkNumericInDecFormat() {
705
611
  let pic = this._valDet.getPIC();
706
612
  let i;
@@ -708,55 +614,36 @@ export class FieldValidator {
708
614
  let Whole;
709
615
  let DecPos;
710
616
  let decimalChar = this._environment.GetDecimal();
711
- // Count number of digits and position of decimal point
712
617
  Dec = 0;
713
618
  Whole = 0;
714
619
  DecPos = -1;
715
620
  for (i = 0; i < this._newvalue.length; i++)
716
621
  if (pic.isNumeric(i))
717
622
  if (UtilStrByteMode.isDigit(this._newvalue[i]))
718
- // when dec pos not found, count wholes, if found, count dec.
719
623
  if (DecPos >= 0)
720
624
  Dec++;
721
625
  else
722
626
  Whole++;
723
627
  else if (this._newvalue[i] === decimalChar)
724
628
  DecPos = i;
725
- // did we exceed the mask ?
726
629
  if (pic.getWholes() < Whole || pic.getDec() < Dec)
727
630
  return false;
728
631
  else
729
632
  return true;
730
633
  }
731
- /// <summary>check & validate Date field by his old/new value and 2 pictures:
732
- /// Real and Enable
733
- /// 1.check if newvalue complete with pictures, otherwise return oldvalue
734
- /// 2.check if newvalue complete with range
735
- /// 2.1 complete value, if possible, otherwise return oldvalue
736
- /// </summary>
737
- /// <returns> new value of validated field</returns>
738
634
  checkDateField() {
739
635
  let newDate = (this._newvalue == null ? null : new Date(this._newvalue));
740
636
  this.setValidationFailed(false);
741
637
  if (this._valDet.getControl().isDateZero(this._newvalue)) {
742
- // get default value of the field
743
638
  let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
744
639
  newDate = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
745
640
  }
746
641
  else {
747
- // range date
748
642
  if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
749
643
  newDate = this.fillDateByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
750
644
  }
751
645
  return newDate;
752
646
  }
753
- /// <summary>Add found in newvalue numbers(2 or 3 letters) to buffer and return
754
- /// last found number index
755
- /// </summary>
756
- /// <param name="currValue">in newvalue</param>
757
- /// <param name="buffer"></param>
758
- /// <param name="type">- which type of positional directive, for checking validity</param>
759
- /// <returns> currValue in newvalue</returns>
760
647
  add2Date(currValue, buffer, type) {
761
648
  let start = currValue;
762
649
  let currAdd = new StringBuilder(this._newvalue.length);
@@ -777,16 +664,16 @@ export class FieldValidator {
777
664
  case PICInterface.PIC_W:
778
665
  letters = 1;
779
666
  break;
780
- case PICInterface.PIC_YJ: // JPN: Japanese date picture support
667
+ case PICInterface.PIC_YJ:
781
668
  letters = 2;
782
- type = PICInterface.PIC_YY; // PIC_YJ will be handled as PIC_YY in this method.
669
+ type = PICInterface.PIC_YY;
783
670
  break;
784
671
  }
785
672
  while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(start)))
786
- start++; // find first digit
673
+ start++;
787
674
  if (start === this._newvalue.length && (this._newvalue.length === 0 || this._newvalue === "0")) {
788
675
  for (let nul = 0; nul < letters; nul = nul + 1) {
789
- buffer.Append('0') /*'0'*/;
676
+ buffer.Append('0');
790
677
  }
791
678
  return currValue;
792
679
  }
@@ -804,28 +691,19 @@ export class FieldValidator {
804
691
  currAdd.Append('0');
805
692
  }
806
693
  let add = NNumber.Parse(currAdd.ToString());
807
- // boundary conditions cases:
808
694
  if ((add < 1 && type !== PICInterface.PIC_YYYY && type !== PICInterface.PIC_YY) ||
809
695
  (add > 31 && (type === PICInterface.PIC_DD || type === PICInterface.PIC_DDDD)) ||
810
696
  (add > 12 && type === PICInterface.PIC_MMD) || (add > 7 && type === PICInterface.PIC_W)) {
811
697
  throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
812
698
  }
813
- // than picture is YYYY and inserted 0-2 numbers, use CENTURE value, otherwise add zeros before the year
814
699
  if (type === PICInterface.PIC_YYYY && this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx()) > 999 && currAdd.Length < 3)
815
700
  currAdd = this.checkCentury(add);
816
701
  for (let j = 0; j < letters - currAdd.Length; j = j + 1) {
817
- buffer.Append('0') /*'0'*/;
702
+ buffer.Append('0');
818
703
  }
819
704
  buffer.Append(currAdd.ToString());
820
705
  return i;
821
706
  }
822
- /// <summary>Add found in newvalue letters to buffer and return
823
- /// last found number index
824
- /// </summary>
825
- /// <param name="currValue">in newvalue</param>
826
- /// <param name="letters">amount of letters to insert to buffer</param>
827
- /// <param name="buffer"></param>
828
- /// <returns> currValue in newvalue</returns>
829
707
  addM2Date(currValue, letters, buffer, type) {
830
708
  let array;
831
709
  let result;
@@ -849,7 +727,7 @@ export class FieldValidator {
849
727
  }
850
728
  }
851
729
  else {
852
- if (type === PICInterface.PIC_BB) { // JPN: Japanese date picture support
730
+ if (type === PICInterface.PIC_BB) {
853
731
  array = UtilDateJpn.getArrayDow();
854
732
  }
855
733
  else {
@@ -877,20 +755,17 @@ export class FieldValidator {
877
755
  else {
878
756
  buffer.Append(array[max].trim());
879
757
  for (let i = letters - array[max].trim().length; i > 0; i = i - 1) {
880
- buffer.Append(' ') /*' '*/;
758
+ buffer.Append(' ');
881
759
  }
882
760
  }
883
761
  return currValue + letters;
884
762
  }
885
- /// <summary>get end index of every numeric block in the mask from mask[currValue]</summary>
886
- /// <returns> end of numeric block in newValue</returns>
887
763
  getEndOfNumericBlock(currValue) {
888
764
  while (currValue < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(currValue))) {
889
765
  currValue = currValue + 1;
890
766
  }
891
767
  return currValue;
892
768
  }
893
- /// <summary>added suffix to relevant number of the day</summary>
894
769
  addDateSuffix(last) {
895
770
  let thenumber = NNumber.Parse(last);
896
771
  if (thenumber === 1 || thenumber === 21 || thenumber === 31)
@@ -901,22 +776,15 @@ export class FieldValidator {
901
776
  return "rd";
902
777
  return "th";
903
778
  }
904
- /// <summary>get size of block letters of type 'type', which start at 'start'</summary>
905
779
  getSizeOfBlock(start, type) {
906
780
  let letters = start + 1;
907
781
  while (letters < this._picture.length && this._picture.charCodeAt(letters) === type)
908
782
  letters++;
909
783
  return letters - start;
910
784
  }
911
- /// <summary>get String part/full name of month/day of week</summary>
912
- /// <param name="month">part/full name of month/day of week</param>
913
- /// <param name="max">of possible letters in month/day of week, size of block in picture of the control</param>
914
- /// <param name="type:">PIC_ week|month</param>
915
- /// <returns> number of month 1-12, or day of week 1-7</returns>
916
785
  getMonthOrWeek(month_str, letters, type) {
917
786
  let array;
918
787
  if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
919
- // Month
920
788
  if (this.hebrew)
921
789
  array = HebrewDate.GetLocalMonths();
922
790
  else {
@@ -924,9 +792,7 @@ export class FieldValidator {
924
792
  array = DateUtil.getLocalMonths(monthStr.toString());
925
793
  }
926
794
  }
927
- else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W)
928
- // Week
929
- {
795
+ else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W) {
930
796
  if (this.hebrew)
931
797
  array = HebrewDate.GetLocalDows();
932
798
  else {
@@ -934,22 +800,17 @@ export class FieldValidator {
934
800
  array = DateUtil.getLocalDays(dayStr.toString());
935
801
  }
936
802
  }
937
- else if (type === PICInterface.PIC_BB)
938
- // JPN: Japanese date picture support
939
- {
803
+ else if (type === PICInterface.PIC_BB) {
940
804
  array = UtilDateJpn.getArrayDow();
941
805
  }
942
806
  else {
943
- return 1; // only week or month possible -> diffault 1.
807
+ return 1;
944
808
  }
945
809
  if (letters > month_str.length)
946
- // cut letter if it's end of string
947
810
  letters = month_str.length;
948
811
  if (this.hebrew) {
949
812
  let hstr = NString.TrimStart(month_str).substr(0, letters).trim();
950
- for (let i = 1; i < array.length; i++)
951
- // start checking from 1st member, because 0 = ""
952
- {
813
+ for (let i = 1; i < array.length; i++) {
953
814
  if (array[i].trim() === hstr) {
954
815
  if (i === 14)
955
816
  i = 6;
@@ -959,7 +820,6 @@ export class FieldValidator {
959
820
  return 0;
960
821
  }
961
822
  try {
962
- // the number inserted and not string -> find mounth/day of week by number 1-12|1-7
963
823
  let str = month_str.substr(0, letters).trim();
964
824
  let numBuffer = new StringBuilder(str.length);
965
825
  for (let i = 0; i < str.length; i++) {
@@ -976,22 +836,17 @@ export class FieldValidator {
976
836
  return 12;
977
837
  }
978
838
  else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W || type === PICInterface.PIC_BB) {
979
- // JPN: Japanese date picture support
980
839
  if (theNumber > 7)
981
840
  return 7;
982
841
  }
983
842
  return theNumber;
984
843
  }
985
844
  catch (ex_21A) {
986
- // doNothing_StringInserted
987
845
  }
988
- // inserted string - name of month|day of week ->try identyfy it
989
846
  let found = new Array(array.length);
990
847
  let from;
991
- let max = -1; // number of found month/day of week
992
- for (let tmp = 1; tmp < array.length; tmp++)
993
- // start checking from 1st member, because 0 = ""
994
- {
848
+ let max = -1;
849
+ for (let tmp = 1; tmp < array.length; tmp++) {
995
850
  found[tmp] = 0;
996
851
  from = 0;
997
852
  for (let i = 0; i < array[tmp].length && from < month_str.length && i < letters; i++, from++) {
@@ -1000,9 +855,7 @@ export class FieldValidator {
1000
855
  else
1001
856
  break;
1002
857
  }
1003
- if (from === letters || from === array[tmp].length)
1004
- // all letters found
1005
- {
858
+ if (from === letters || from === array[tmp].length) {
1006
859
  max = tmp;
1007
860
  break;
1008
861
  }
@@ -1011,8 +864,6 @@ export class FieldValidator {
1011
864
  max = this.findMax(found);
1012
865
  return max;
1013
866
  }
1014
- /// <summary>is numeric data allowed in date
1015
- /// return true if it is allowed, otherwise false</summary>
1016
867
  isNumberAllowedInDate() {
1017
868
  for (let i = 0; i < this._picture.length; i++) {
1018
869
  if (this.isDatePositionalNumericDirective(this._picture[i]))
@@ -1020,8 +871,6 @@ export class FieldValidator {
1020
871
  }
1021
872
  return false;
1022
873
  }
1023
- /// <summary>find if all numbers of the new user inserted value are 0
1024
- /// return true if all numbers in the input are 0, otherwise true</summary>
1025
874
  isAllNumbers0() {
1026
875
  let currChr;
1027
876
  for (let i = 0; i < this._newvalue.length; i++) {
@@ -1031,9 +880,6 @@ export class FieldValidator {
1031
880
  }
1032
881
  return true;
1033
882
  }
1034
- /// <summary>check validity of Year for YYYY part of the mask</summary>
1035
- /// <param name="yearIn">inserted by user</param>
1036
- /// <returns> calculated by environment.century right value</returns>
1037
883
  checkCentury(yearIn) {
1038
884
  let outVal;
1039
885
  let start_century = this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx());
@@ -1045,10 +891,6 @@ export class FieldValidator {
1045
891
  outVal = ((++century) * 100 + yearIn);
1046
892
  return new StringBuilder(outVal.toString());
1047
893
  }
1048
- /// <summary>check if the date legal for picture range, used for validation date 0</summary>
1049
- /// <param name="ContinuousRange"></param>
1050
- /// <param name="DiscreteRange"></param>
1051
- /// <param name="date">integer - magic date number of days from 01.01.0000</param>
1052
894
  isDateLegal4Range(ContinuousRange, DiscreteRange, currDate) {
1053
895
  let pic = this._valDet.getPIC();
1054
896
  let i;
@@ -1068,11 +910,8 @@ export class FieldValidator {
1068
910
  return true;
1069
911
  }
1070
912
  }
1071
- // the date is not in the range
1072
- // return false;
1073
913
  throw new WrongFormatException();
1074
914
  }
1075
- /// <summary>check and fill DATE type by range</summary>
1076
915
  fillDateByRange(ContinuousRange, DiscreteRange, buffer) {
1077
916
  let pic = this._valDet.getPIC();
1078
917
  let i;
@@ -1095,12 +934,8 @@ export class FieldValidator {
1095
934
  }
1096
935
  }
1097
936
  }
1098
- // the date is not in the range
1099
937
  throw new WrongFormatException();
1100
938
  }
1101
- /// <summary>check if day suitable (not bigger than max) for Year and Month</summary>
1102
- /// <param name="date">user inserted string</param>
1103
- /// <param name="isDoy">is picture of needed day is DDD - day of year</param>
1104
939
  checkDay(date, isDoy) {
1105
940
  let day = this.getDateElement(date, DateElement.DAY);
1106
941
  if (day < 29 && !isDoy)
@@ -1112,22 +947,18 @@ export class FieldValidator {
1112
947
  if (this._environment.GetDateMode(this._valDet.getControl().getForm().getTask().getCompIdx()) === 'B')
1113
948
  year -= PICInterface.DATE_BUDDHIST_GAP;
1114
949
  let month = this.getDateElement(date, DateElement.MONTH);
1115
- // if day not consistained to year & month - change day
1116
950
  let dayMax = this.getMaxDayInMonth(year, month);
1117
951
  if (day > dayMax) {
1118
952
  throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
1119
953
  }
1120
954
  }
1121
955
  else {
1122
- // if month not consistained to day(DDD) - change month
1123
956
  let monthReal = this.getMonthByDay(year, day);
1124
957
  if (monthReal < 1 || monthReal > 12)
1125
958
  throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
1126
959
  }
1127
960
  return new StringBuilder(date);
1128
961
  }
1129
- /// <summary>check if day of week suitable (right) for Year, Month and Day</summary>
1130
- /// <param name="date">user inserted string</param>
1131
962
  checkWeek(date) {
1132
963
  let dow = this.getDateElement(date, DateElement.DOW);
1133
964
  let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
@@ -1138,17 +969,12 @@ export class FieldValidator {
1138
969
  date = this.changeDow(date, dowReal);
1139
970
  return new StringBuilder(date);
1140
971
  }
1141
- // JPN: Japanese date picture support
1142
- /// <summary>check if the combination of Japanese era and year is valid.</summary>
1143
- /// <param name="strDate">user inserted string</param>
1144
- /// <returns> date string of properly Japanese era</returns>
1145
972
  checkJpnEraYear(strDate) {
1146
973
  let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
1147
974
  let dateMagic = DisplayConvertor.Instance.a_2_date(strDate, this._picture, this._valDet.getControl().getForm().getTask().getCompIdx());
1148
975
  DisplayConvertor.Instance.date_break_datemode(breakParams, dateMagic, true, this._valDet.getControl().getForm().getTask().getCompIdx());
1149
976
  let intYearAD = breakParams.year;
1150
977
  let intDoy = breakParams.doy;
1151
- // get the name and a year of the era
1152
978
  let strEraAlpha;
1153
979
  let strEraKanji;
1154
980
  strEraAlpha = UtilDateJpn.getInstance().date_jpn_yr_2_a(intYearAD, intDoy, false);
@@ -1162,10 +988,6 @@ export class FieldValidator {
1162
988
  strYearJpnEra.Append("0");
1163
989
  }
1164
990
  strYearJpnEra.Append(num.toString());
1165
- // build a properly year of the era
1166
- // A DBCS character in "str" consumes two characters in "mask".
1167
- // If "str" contains DBCS, the position of "mask" has to skip next index.
1168
- // This variable indicates the number of skipped indexes.
1169
991
  let intPicIdxOfs = 0;
1170
992
  for (let intCnt = 0; intCnt + intPicIdxOfs < this._picture.length; intCnt++) {
1171
993
  switch (this._picture.charCodeAt(intCnt + intPicIdxOfs)) {
@@ -1174,20 +996,19 @@ export class FieldValidator {
1174
996
  break;
1175
997
  case (PICInterface.PIC_JY2):
1176
998
  strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 1);
1177
- intPicIdxOfs++; // PIC_JY2 consumes 2 characters of picture (1 more than strDate)
999
+ intPicIdxOfs++;
1178
1000
  break;
1179
1001
  case (PICInterface.PIC_JY4):
1180
1002
  strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 2);
1181
- intCnt++; // PIC_JY4 consumes 2 characters of strDate
1182
- intPicIdxOfs += 2; // PIC_JY4 consumes 4 characters of picture (2 more than strDate)
1003
+ intCnt++;
1004
+ intPicIdxOfs += 2;
1183
1005
  break;
1184
1006
  case (PICInterface.PIC_YJ):
1185
1007
  strDate = UtilStrByteMode.repC(strDate, strYearJpnEra.toString(), intCnt + 1, 2);
1186
- intCnt++; // PIC_YJ consumes 2 characters of strDate
1008
+ intCnt++;
1187
1009
  break;
1188
1010
  default:
1189
1011
  if (intCnt < strDate.length) {
1190
- // if "strDate" contains DBCS, the next index of "picture" has to be skipped.
1191
1012
  if (UtilStrByteMode.isHalfWidth(strDate[intCnt]) === false && UtilStrByteMode.isHalfWidth(this._picture[intCnt + intPicIdxOfs]) === true)
1192
1013
  intPicIdxOfs++;
1193
1014
  }
@@ -1196,10 +1017,6 @@ export class FieldValidator {
1196
1017
  }
1197
1018
  return new StringBuilder(strDate);
1198
1019
  }
1199
- /// <summary>get max number of day in month</summary>
1200
- /// <param name="year"></param>
1201
- /// <param name="month"></param>
1202
- /// <returns> max days [28-31] number</returns>
1203
1020
  getMaxDayInMonth(year, month) {
1204
1021
  let array = [
1205
1022
  0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
@@ -1209,10 +1026,6 @@ export class FieldValidator {
1209
1026
  return array[month] + 1;
1210
1027
  return array[month];
1211
1028
  }
1212
- /// <summary>get month for day, than day have mask DDD</summary>
1213
- /// <param name="year"></param>
1214
- /// <param name="day">[0-365]</param>
1215
- /// <returns> number of month</returns>
1216
1029
  getMonthByDay(year, day) {
1217
1030
  let i;
1218
1031
  let LeapYear;
@@ -1222,36 +1035,27 @@ export class FieldValidator {
1222
1035
  if (PICInterface.date_day_tab[i] >= day)
1223
1036
  return i;
1224
1037
  }
1225
- // is Leap Year
1226
1038
  else {
1227
1039
  if (i < 3) {
1228
1040
  if (PICInterface.date_day_tab[i] >= day)
1229
1041
  return i;
1230
1042
  }
1231
- // add 1 day after second month
1232
1043
  else {
1233
1044
  if (PICInterface.date_day_tab[i] + 1 >= day)
1234
1045
  return i;
1235
1046
  }
1236
1047
  }
1237
- } // for loop
1238
- return i; // the function cann't came to the statement anytime
1048
+ }
1049
+ return i;
1239
1050
  }
1240
- /// </summary>get Year|Month|Day|Dow of date
1241
- /// <param name="date">date</param>
1242
- /// <param name="element">required date element (year/month/day/dow) </param>
1243
- /// <returns>Year|Month|Day|Dow of date</returns>
1244
1051
  getDateElement(date, element) {
1245
1052
  let buffer = null;
1246
1053
  let letters = 0;
1247
1054
  let exitLoop = false;
1248
- let picWeekType = PICInterface.PIC_WWW; // JPN: Japanese date picture support
1249
- let isJpnEraYear = false; // JPN: Japanese date picture support
1055
+ let picWeekType = PICInterface.PIC_WWW;
1056
+ let isJpnEraYear = false;
1250
1057
  let era_year = 0;
1251
- // A DBCS character in "date" consumes two characters in "picture".
1252
- // If "date" contains DBCS, the position of "picture" has to skip next index.
1253
- // This variable indicates the number of skipped indexes.
1254
- let intPicIdxOfs = 0; // JPN: Japanese date picture support
1058
+ let intPicIdxOfs = 0;
1255
1059
  let minLen = 0;
1256
1060
  if (UtilStrByteMode.isLocaleDefLangJPN())
1257
1061
  minLen = UtilStrByteMode.getMinLenPicture(date, this._picture);
@@ -1278,7 +1082,7 @@ export class FieldValidator {
1278
1082
  break;
1279
1083
  case PICInterface.PIC_DDDD:
1280
1084
  if (element === DateElement.DAY) {
1281
- buffer = date.substr(i, 2); // not +4 need not suffix of 'nd', 'rd', 'st'
1085
+ buffer = date.substr(i, 2);
1282
1086
  exitLoop = true;
1283
1087
  }
1284
1088
  i += 3;
@@ -1291,7 +1095,6 @@ export class FieldValidator {
1291
1095
  i++;
1292
1096
  break;
1293
1097
  case PICInterface.PIC_MMM:
1294
- // get size of PIC_MMM block
1295
1098
  letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_MMM);
1296
1099
  if (element === DateElement.MONTH) {
1297
1100
  buffer = date.substr(i, letters);
@@ -1334,13 +1137,11 @@ export class FieldValidator {
1334
1137
  case PICInterface.PIC_HYYYYY:
1335
1138
  case PICInterface.PIC_HL:
1336
1139
  case PICInterface.PIC_HDD:
1337
- // not implemented for hebrew yet
1338
1140
  break;
1339
- case PICInterface.PIC_BB: // JPN: Japanese date picture support
1141
+ case PICInterface.PIC_BB:
1340
1142
  letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
1341
1143
  if (i + Math.floor(letters / 2) < date.length) {
1342
1144
  buffer = date.substr(i, Math.floor(letters / 2));
1343
- // if date contains DBCS, some indexes of picture have to be skipped.
1344
1145
  intPicIdxOfs += letters - buffer.length;
1345
1146
  }
1346
1147
  if (element === DateElement.DOW) {
@@ -1352,28 +1153,28 @@ export class FieldValidator {
1352
1153
  }
1353
1154
  i += letters - 1;
1354
1155
  break;
1355
- case PICInterface.PIC_JY1: // JPN: Japanese date picture support
1156
+ case PICInterface.PIC_JY1:
1356
1157
  isJpnEraYear = true;
1357
1158
  break;
1358
- case PICInterface.PIC_JY2: // JPN: Japanese date picture support
1159
+ case PICInterface.PIC_JY2:
1359
1160
  isJpnEraYear = true;
1360
1161
  intPicIdxOfs++;
1361
1162
  break;
1362
- case PICInterface.PIC_JY4: // JPN: Japanese date picture support
1163
+ case PICInterface.PIC_JY4:
1363
1164
  isJpnEraYear = true;
1364
1165
  intPicIdxOfs += 2;
1365
1166
  i++;
1366
1167
  break;
1367
- case PICInterface.PIC_YJ: // JPN: Japanese date picture support
1168
+ case PICInterface.PIC_YJ:
1368
1169
  if (element === DateElement.YEAR) {
1369
1170
  buffer = date.substr(i, 2);
1370
1171
  exitLoop = true;
1371
1172
  }
1372
1173
  i++;
1373
1174
  break;
1374
- } // switch of positional directives
1375
- } // if of positional directives
1376
- } // for loop in picture
1175
+ }
1176
+ }
1177
+ }
1377
1178
  if (buffer == null) {
1378
1179
  if (element === DateElement.YEAR)
1379
1180
  return DateTime.Now.Year;
@@ -1381,9 +1182,7 @@ export class FieldValidator {
1381
1182
  return 1;
1382
1183
  }
1383
1184
  buffer = buffer.trim();
1384
- if (letters > 0)
1385
- // it's PIC_WWW or PIC_MMM
1386
- {
1185
+ if (letters > 0) {
1387
1186
  if (element === DateElement.MONTH)
1388
1187
  letters = this.getMonthOrWeek(buffer.toString(), letters, PICInterface.PIC_MMM);
1389
1188
  else if (element === DateElement.DOW)
@@ -1398,7 +1197,6 @@ export class FieldValidator {
1398
1197
  letters = NNumber.Parse(buffer.toString());
1399
1198
  }
1400
1199
  if (element === DateElement.YEAR && isJpnEraYear) {
1401
- // get the start year of the era
1402
1200
  era_year = UtilDateJpn.getInstance().getStartYearOfEra(date, this._picture);
1403
1201
  if (era_year === 0)
1404
1202
  return 0;
@@ -1406,19 +1204,13 @@ export class FieldValidator {
1406
1204
  }
1407
1205
  return letters;
1408
1206
  }
1409
- /// <summary>change day number in date field to dayMax</summary>
1410
- /// <param name="date">to change day into</param>
1411
- /// <param name="dayMax">the new day value</param>
1412
1207
  changeDow(date, dow) {
1413
1208
  let isDate = false;
1414
1209
  let letters;
1415
1210
  let startPart;
1416
1211
  let finishPart;
1417
1212
  let number1;
1418
- number1 = "" + dow; // " "
1419
- // A DBCS character in "date" consumes two characters in "picture".
1420
- // If "date" contains DBCS, the position of "picture" has to skip next index.
1421
- // This variable indicates the number of skipped indexes. (JPN: DBCS support)
1213
+ number1 = "" + dow;
1422
1214
  let intPicIdxOfs = 0;
1423
1215
  for (let i = 0; i + intPicIdxOfs < this._picture.length && !isDate; i++) {
1424
1216
  if (this.isDataPositionalDirective(this._picture[i + intPicIdxOfs])) {
@@ -1444,12 +1236,10 @@ export class FieldValidator {
1444
1236
  date = startPart + number1 + finishPart;
1445
1237
  isDate = true;
1446
1238
  break;
1447
- case PICInterface.PIC_BB: // JPN: Japanese date picture support
1239
+ case PICInterface.PIC_BB:
1448
1240
  letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
1449
- // "letters" means a number of characters in "picture"
1450
1241
  startPart = date.substr(0, i);
1451
1242
  finishPart = date.substr(i + Math.floor(letters / 2));
1452
- // "letters / 2" means a number of characters in "date"
1453
1243
  number1 = UtilDateJpn.getStrDow(dow);
1454
1244
  if (UtilStrByteMode.lenB(number1) > letters)
1455
1245
  number1 = UtilStrByteMode.leftB(number1, letters);
@@ -1460,68 +1250,40 @@ export class FieldValidator {
1460
1250
  isDate = true;
1461
1251
  break;
1462
1252
  default:
1463
- if (UtilStrByteMode.isLocaleDefLangDBCS())
1464
- // JPN: DBCS support
1465
- {
1253
+ if (UtilStrByteMode.isLocaleDefLangDBCS()) {
1466
1254
  if (i < date.length) {
1467
- // if "date" contains DBCS, the next index of "picture" has to be skipped.
1468
1255
  if (UtilStrByteMode.isHalfWidth(date[i]) === false && UtilStrByteMode.isHalfWidth(this._picture[i + intPicIdxOfs]) === true)
1469
1256
  intPicIdxOfs++;
1470
1257
  }
1471
1258
  }
1472
1259
  break;
1473
- } // switch
1474
- } // if of positional directives
1260
+ }
1261
+ }
1475
1262
  }
1476
1263
  return date;
1477
1264
  }
1478
- /// <summary>check & validate Time field by his old/new value and 2 pictures:
1479
- /// Real and Enable
1480
- /// 1.check if newvalue complete with pictures, otherwise return oldvalue
1481
- /// 2.check if newvalue complete with range
1482
- /// 2.1 complete value, if possible, otherwise return oldvalue
1483
- /// </summary>
1484
- /// <returns> String - new value of validated field</returns>
1485
1265
  checkTimeField() {
1486
1266
  let newTime = new Date(this._newvalue);
1487
1267
  this.setValidationFailed(false);
1488
1268
  if (this._valDet.getControl().isDateZero(this._newvalue)) {
1489
- // get default value of the field
1490
1269
  let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
1491
1270
  newTime = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
1492
1271
  }
1493
1272
  else {
1494
- // range of the time
1495
1273
  if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
1496
1274
  newTime = this.fillTimeByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
1497
1275
  }
1498
1276
  return newTime;
1499
1277
  }
1500
- /// <summary>Add found in newvalue numbers(2(or 1) letters) to buffer and return
1501
- /// last found number index
1502
- /// </summary>
1503
- /// <param name="currValue">in newvalue</param>
1504
- /// <param name="buffer">/// </param>
1505
- /// <param name="type">which type of positional directive, for checking validity</param>
1506
- /// <returns> currValue in newvalue</returns>
1507
1278
  add2Time(currValue, buffer, type) {
1508
1279
  let start = currValue;
1509
1280
  let i;
1510
1281
  let STR_00 = "00";
1511
1282
  let currAdd = new StringBuilder();
1512
1283
  while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue[start])) {
1513
- start++; // find first digit
1514
- // non-digits were found in input string
1515
- // we do not throw STR_ERR_TIME exception to prevent input digits lost
1516
- // on non-digits place STR_00 will be added
1517
- // Since Mask Editing . This error is irrelevant. Time now, always contains non digits like : and might contain ' ' for unfilled chars.
1518
- // This is a valid case and we do not want an error popping about it.
1519
- // guiManager.writeToMessagePane(valDet.getControl().getForm().getTask(), ClientManager.Instance.getMessageString(STR_ERR_TIME), StatusBarMessageType.SB_RUNTIME_MSG);
1520
- // setValidationFailed(true);
1521
- }
1522
- if (start === this._newvalue.length)
1523
- // not found more digits
1524
- {
1284
+ start++;
1285
+ }
1286
+ if (start === this._newvalue.length) {
1525
1287
  buffer.Append(STR_00.toString());
1526
1288
  return currValue;
1527
1289
  }
@@ -1529,22 +1291,15 @@ export class FieldValidator {
1529
1291
  if (UtilStrByteMode.isDigit(this._newvalue[i]))
1530
1292
  currAdd.Append(this._newvalue[i]);
1531
1293
  else {
1532
- currAdd.Insert(0, '0'); // only 1 digit found
1294
+ currAdd.Insert(0, '0');
1533
1295
  break;
1534
1296
  }
1535
1297
  }
1536
1298
  if (i === this._newvalue.length && i === start + 1)
1537
1299
  currAdd.Insert(0, '0');
1538
- // only 1 digit found
1539
1300
  else if (i === this._newvalue.length && i === start)
1540
1301
  currAdd.Append(STR_00.toString());
1541
1302
  let add = NNumber.Parse(currAdd.ToString());
1542
- /*if (add < 0)
1543
- currAdd=new StringBuffer("00");
1544
- else if (add > 59 && type==PIC_MMT)
1545
- currAdd=new StringBuffer("59");
1546
- else if (add > 59 && type==PIC_SS)
1547
- currAdd=new StringBuffer("59");*/
1548
1303
  if (add < 0 || (add > 59 && type === PICInterface.PIC_MMT) || (add > 59 && type === PICInterface.PIC_SS))
1549
1304
  throw new WrongFormatException(MsgInterface.STR_ERR_TIME);
1550
1305
  else if (type === PICInterface.PIC_HH) {
@@ -1572,7 +1327,6 @@ export class FieldValidator {
1572
1327
  buffer.Append(currAdd.ToString());
1573
1328
  return i;
1574
1329
  }
1575
- /// <summary>Append PM or AM to time</summary>
1576
1330
  addPM2Time(currValue, buffer) {
1577
1331
  let i;
1578
1332
  if ((i = this._newvalue.toUpperCase().indexOf("AM", currValue)) !== -1) {
@@ -1593,8 +1347,6 @@ export class FieldValidator {
1593
1347
  }
1594
1348
  return currValue;
1595
1349
  }
1596
- /// <summary>Check if where is 'PM' positional directive in the Time Picture</summary>
1597
- /// <returns> true - there is PM, else false</returns>
1598
1350
  getIsPM() {
1599
1351
  for (let curr = 0; curr < this._picture.length; curr++) {
1600
1352
  if (this._picture.charCodeAt(curr) === PICInterface.PIC_PM)
@@ -1622,16 +1374,8 @@ export class FieldValidator {
1622
1374
  return new Date(buffer);
1623
1375
  }
1624
1376
  }
1625
- // the time is not in the range
1626
1377
  throw new WrongFormatException();
1627
1378
  }
1628
- /// <summary>*************************************************************
1629
- /// SERVICE functions
1630
- /// ***************************************************************
1631
- /// </summary>
1632
- /// <summary> print ERROR prompt message about range to status bar</summary>
1633
- /// <param name="msgId">of error Message</param>
1634
- /// <param name="setValidationFaild">validation failed</param>
1635
1379
  printMessage(msgId, setValidationFaild) {
1636
1380
  let message = new StringBuilder("");
1637
1381
  let ctrlType;
@@ -1658,13 +1402,8 @@ export class FieldValidator {
1658
1402
  }
1659
1403
  }
1660
1404
  if (setValidationFaild)
1661
- // from this point the focus send back to control and setValidationFailed(true) can not set it to true
1662
1405
  this.setValidationFailed(true);
1663
1406
  }
1664
- /// <summary>Change inside 'newvalue' substring on position 'index' to string 'to'</summary>
1665
- /// <param name="newvalue">to change inside</param>
1666
- /// <param name="to">string to change by him</param>
1667
- /// <param name="index">the substring to change on the position</param>
1668
1407
  changeStringInside(to, index) {
1669
1408
  this._newvalue = this._newvalue.substr(0, index) + to + this._newvalue.substr(index + to.length);
1670
1409
  }
@@ -1688,7 +1427,6 @@ export class FieldValidator {
1688
1427
  this._picture = this._picture.substr(0, pIC.getMaskSize());
1689
1428
  }
1690
1429
  }
1691
- /// <summary>Return index of Max member in array</summary>
1692
1430
  findMax(array) {
1693
1431
  let index = 0;
1694
1432
  let max = array[index];
@@ -1700,43 +1438,32 @@ export class FieldValidator {
1700
1438
  }
1701
1439
  return index;
1702
1440
  }
1703
- /// <summary>is checked char Data Positional Directive</summary>
1704
1441
  isDataPositionalDirective(toCheck) {
1705
1442
  let ascii = toCheck.charCodeAt(0);
1706
1443
  return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_MMM
1707
1444
  || ascii === PICInterface.PIC_DD || ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W
1708
1445
  || ascii === PICInterface.PIC_WWW || ascii === PICInterface.PIC_HYYYYY || ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ
1709
- || ascii === PICInterface.PIC_JY1 || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB); // JPN: Japanese date picture support
1446
+ || ascii === PICInterface.PIC_JY1 || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
1710
1447
  }
1711
- /// <summary>check if Numeric Data Positional Directive exists</summary>
1712
1448
  isDatePositionalNumericDirective(toCheck) {
1713
1449
  let ascii = toCheck.charCodeAt(0);
1714
1450
  return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_DD
1715
1451
  || ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W || ascii === PICInterface.PIC_HYYYYY
1716
1452
  || ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ || ascii === PICInterface.PIC_JY1
1717
- || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB); // JPN: Japanese date picture support
1453
+ || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
1718
1454
  }
1719
- /// <summary>is checked char Numeric Positional Directive</summary>
1720
1455
  isNumericPositionalDirective(toCheck) {
1721
1456
  let ascii = toCheck.charCodeAt(0);
1722
1457
  return (ascii === PICInterface.PIC_N);
1723
1458
  }
1724
- /// <summary>is checked char Logic Positional Directive</summary>
1725
1459
  isLogicPositionalDirective(toCheck) {
1726
1460
  let ascii = toCheck.charCodeAt(0);
1727
1461
  return (ascii === PICInterface.PIC_X);
1728
1462
  }
1729
- /// <summary>Find if the letter at index is Positional Date Directive</summary>
1730
- /// <param name="char">to check in picture</param>
1731
- /// <returns> true if Positional Date Directive; false otherwise</returns>
1732
1463
  isTimePositionalDirective(toCheck) {
1733
1464
  let ascii = toCheck.charCodeAt(0);
1734
1465
  return (ascii === PICInterface.PIC_HH || ascii === PICInterface.PIC_MMT || ascii === PICInterface.PIC_SS || ascii === PICInterface.PIC_PM || ascii === PICInterface.PIC_MS);
1735
1466
  }
1736
- /// <summary>is checked string Positional Directive of any type</summary>
1737
- /// <param name="full/part">of picture
1738
- /// </param>
1739
- /// <returns> index of directive position or -1 if not found</returns>
1740
1467
  indexOfPositionalNonDirective(str) {
1741
1468
  let tmp;
1742
1469
  for (let i = 0; i < str.length; i++) {
@@ -1748,18 +1475,12 @@ export class FieldValidator {
1748
1475
  }
1749
1476
  return -1;
1750
1477
  }
1751
- /// <summary> set the "validation failed" flag</summary>
1752
- /// <param name="val">value to use</param>
1753
1478
  setValidationFailed(val) {
1754
1479
  if (this._valDet.ValidationFailed)
1755
1480
  return;
1756
1481
  else
1757
1482
  this._valDet.setValidationFailed(val);
1758
1483
  }
1759
- /// <summary> Count digits in string before delimeter</summary>
1760
- /// <param name="inputString">- string to look into for delimeter</param>
1761
- /// <param name="searchStart">- initial index position for search in inputString</param>
1762
- /// <param name="delimeter">we are looking for</param>
1763
1484
  digitsBeforeDelimeter(inputString, searchStart, delimeter) {
1764
1485
  let counter = 0;
1765
1486
  let searchEndPos = inputString.indexOf(delimeter, searchStart);
@@ -1770,8 +1491,6 @@ export class FieldValidator {
1770
1491
  counter++;
1771
1492
  return counter;
1772
1493
  }
1773
- /// <summary> by Ctrl+U (Set to Null), null display value is set to ctrl. In this case we need following checking , in order to set field to null.</summary>
1774
- /// <param name="val">- entered value to value to check</param>
1775
1494
  isNullDisplayVal() {
1776
1495
  let isNullDisplayVal = false;
1777
1496
  let field = this._valDet.getControl().getField();
@@ -1785,4 +1504,4 @@ export class FieldValidator {
1785
1504
  return isNullDisplayVal;
1786
1505
  }
1787
1506
  }
1788
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0ZpZWxkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUVULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQW1CLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkUsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsZUFBZSxFQUNoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHdEQsTUFBTSxPQUFPLGNBQWM7SUFZekI7UUFYUSxjQUFTLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLGNBQVMsR0FBUSxJQUFJLENBQUM7UUFDdEIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFDNUIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFDOUIsWUFBTyxHQUFzQixJQUFJLENBQUM7UUFD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QUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU87ZUFDdkksS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLO2VBQ2xJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsVUFBVSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTTtlQUN2SyxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUNBQXFDO0lBRWxMLENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsZ0NBQWdDLENBQUMsT0FBZTtRQUN0RCxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdEksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxVQUFVO2VBQ3RJLEtBQUssS0FBSyxZQUFZLENB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LEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLEVBQUUsQ0FBQztRQUVaLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCw0SkFBNEo7SUFDNUosK0RBQStEO0lBQ3ZELGdCQUFnQjtRQUN0QixJQUFJLGdCQUFnQixHQUFZLEtBQUssQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBaUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUvRCxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLG1CQUFtQixFQUFFLEVBQ3BEO1lBQ0UsSUFBSSxZQUFZLEdBQVEsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQy9DLElBQUksWUFBWSxLQUFLLElBQUk7Z0JBQ3ZCLGdCQUFnQixHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Z0JBRWhFLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNoRDtRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBEYXRlVGltZSxcclxuICBFeGNlcHRpb24sXHJcbiAgTGlzdCxcclxuICBOQ2hhcixcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgTnVtYmVyRm9ybWF0SW5mbyxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRGV0YWlscyB9IGZyb20gJy4vVmFsaWRhdGlvbkRldGFpbHMnO1xyXG5pbXBvcnQgeyBJRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnYvSUVudmlyb25tZW50JztcclxuaW1wb3J0IHsgTWdDb250cm9sQmFzZSB9IGZyb20gJy4vTWdDb250cm9sQmFzZSc7XHJcbmltcG9ydCB7IEd1aUZpZWxkQmFzZSB9IGZyb20gJy4uL2RhdGEvR3VpRmllbGRCYXNlJztcclxuaW1wb3J0IHsgRGF0ZUJyZWFrUGFyYW1zLCBEaXNwbGF5Q29udmVydG9yIH0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHtcclxuICBEYXRlVXRpbCxcclxuICBIVE1MXzJfU1RSLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTXNnSW50ZXJmYWNlLFxyXG4gIFBJQ0ludGVyZmFjZSxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbERhdGVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IEV2ZW50cyB9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7IFdyb25nRm9ybWF0RXhjZXB0aW9uIH0gZnJvbSAnLi9Xcm9uZ0Zvcm1hdEV4Y2VwdGlvbic7XHJcbmltcG9ydCB7IFBJQyB9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHsgRGF0ZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7IE5VTV9UWVBFIH0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7IEhlYnJld0RhdGUgfSBmcm9tICcuL0hlYnJld0RhdGUnO1xyXG5pbXBvcnQgeyBCbG9iVHlwZSB9IGZyb20gJy4uL2RhdGEvQmxvYlR5cGUnO1xyXG5pbXBvcnQgeyBHdWlFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL0d1aUVudmlyb25tZW50JztcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRmllbGRWYWxpZGF0b3Ige1xyXG4gIHByaXZhdGUgX25ld3ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX29sZHZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY3R1cmVSZWFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY3R1cmVFbmFibGU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdmFsRGV0OiBWYWxpZGF0aW9uRGV0YWlscyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaXNQbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3BpY3R1cmU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBoZWJyZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kZWNpbWFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2Vudmlyb25tZW50OiBJRW52aXJvbm1lbnQgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2Vudmlyb25tZW50ID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLl9kZWNpbWFsID0gKHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKSB8fCBcIlwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdGhlIG1haW4gbWV0aG9kIG9mIHRoaXMgY2xhc3M8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsRGV0XCI+YSBWYWxpZGF0aW9uRGV0YWlscyBvYmplY3QgdG8gdXNlIHdoZW4gdmFsaWRhdGluZzwvcGFyYW0+XHJcbiAgY2hlY2tWYWwodmFsRGV0OiBWYWxpZGF0aW9uRGV0YWlscyk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIHRoaXMuX25ld3ZhbHVlID0gKHRoaXMuX29sZHZhbHVlID0gKHRoaXMuX3BpY3R1cmVSZWFsID0gKHRoaXMuX3BpY3R1cmVFbmFibGUgPSBudWxsKSkpO1xyXG4gICAgdGhpcy5pbml0KHZhbERldCk7XHJcbiAgICB2YWxEZXQuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHZhbERldC5nZXRDb250cm9sKCk7XHJcbiAgICAvLyBUT0RPIC0gdW5jb21tZW50IHRoaXMgbGluZSB3aGVuICdQUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZJyBpcyBzdXBwb3J0ZWQgZm9yIG90aGVyIGNvbnRyb2xzXHJcbiAgICAvLyBsZXQgbW9kSW5RdWV1eTogYm9vbGVhbiA9IGF3YWl0IGN0cmwuY2hlY2tQcm9wV2l0aExpbmUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZLCBmYWxzZSwgY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSkpO1xyXG4gICAgbGV0IG1vZEluUXVldXk6IGJvb2xlYW4gPSBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQjtcclxuICAgIGxldCB1c2VOYXRpdmU6IGJvb2xlYW4gPSBjdHJsLmlzTW9kaWZpYWJsZSgpO1xyXG5cclxuICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSAnRScgJiYgIW1vZEluUXVldXkpIHtcclxuICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuX29sZHZhbHVlKTtcclxuICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCIHx8IGN0cmwuaXNTZWxlY3Rpb25DdHJsKCkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCkge1xyXG4gICAgICAgICAgdmFsRGV0LnNldE51bGwoY3RybC5pc051bGxWYWx1ZSh0aGlzLl9uZXd2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fbmV3dmFsdWUgIT09IG51bGwgJiYgY3RybC5pc1NlbGVjdGlvbkN0cmwoKSkge1xyXG4gICAgICAgICAgbGV0IGlkeDogbnVtYmVyID0gTk51bWJlci5QYXJzZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgICAgICBpZiAoY3RybC5pc0Nob2ljZU51bGwoaWR4KSkge1xyXG4gICAgICAgICAgICB2YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4XzExMSkge1xyXG4gICAgICAgIGlmIChleF8xMTEgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXhfMTExO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgIHJldHVybiB2YWxEZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc3BhY2V8bm90aGluZyB3YXMgaW5zZXJ0ZWQgIC0+IHVzZSBkZWZhdWx0IHZhbHVlXHJcbiAgICBpZiAoY3RybC5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSAmJiBjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgJiYgY3RybC5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgICBpZiAoKHR5cGVvZiB0aGlzLl9uZXd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5fbmV3dmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgfHwgKGN0cmwuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSAmJiAoY3RybC5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSB8fCB0aGlzLmlzTnVsbERpc3BsYXlWYWwoKSkpKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWVsZDogR3VpRmllbGRCYXNlID0gY3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgbGV0IHRleHQ6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGxEZWZhdWx0KCkpIHtcclxuICAgICAgICAgICAgICB2YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgICAgICB0ZXh0ID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgICAgICAgICBpZiAoTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQpICYmIGN0cmwuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSkge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZhdWx0VmFsdWUsIHZhbERldC5nZXRSYW5nZSgpLCB2YWxEZXQuZ2V0UElDKCksIHVzZU5hdGl2ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHRleHQgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdFZhbHVlLCB2YWxEZXQuZ2V0UmFuZ2UoKSwgdmFsRGV0LmdldFBJQygpLCB1c2VOYXRpdmUsIGZpZWxkLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKCFmaWVsZC5pc051bGxEZWZhdWx0KCkgJiYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9PSBudWxsKSkpXHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0ZXh0O1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGV4dCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgIH1cclxuXHJcblxyXG4gICAgaWYgKCh0eXBlb2YgdGhpcy5fbmV3dmFsdWUgPT09ICdzdHJpbmcnICYmICEoU3RyVXRpbC5ydHJpbSh0aGlzLl9uZXd2YWx1ZSkgPT09IFN0clV0aWwucnRyaW0odGhpcy5fb2xkdmFsdWUpKSkgfHwgY3RybC5Nb2RpZmllZEJ5VXNlcilcclxuICAgIHtcclxuICAgICAgdHJ5XHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKHZhbERldC5nZXRUeXBlKCkpXHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja0FscGhhRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgICB0aGlzLl9waWN0dXJlUmVhbCA9IHZhbERldC5nZXRQaWN0dXJlUmVhbCgpOyAvLyBvbmx5IG51bWVyaWMgdHlwZSBuZWVkIGFub3RoZXIgcGljdHVyZSBmb3JtYXRcclxuICAgICAgICAgICAgdGhpcy5fcGljdHVyZUVuYWJsZSA9IHZhbERldC5nZXRQaWN0dXJlRW5hYmxlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tOdW1lcmljUGljdHVyZSgpO1xyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja051bWVyaWNGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrTG9naWNhbEZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuY2hlY2tEYXRlRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja1RpbWVGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgICAvLyB0aGVyZSBpcyBubyByZWFsIHBpY3R1cmUgdG8gQkxPQiwgZG8gbm90aGluZ1xyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTpcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiRmllbGRWYWxpZGF0b3IuY2hlY2tWYWw6IFR5cGUgb2YgdGhlIGZpZWxkIFwiICsgdmFsRGV0LmdldFR5cGUoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZ29CYWNrKSB7XHJcbiAgICAgICAgaWYgKGdvQmFjayBpbnN0YW5jZW9mIFdyb25nRm9ybWF0RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAvLyBuZWVkIGNoYW5nZSB0byBvbGQgdmFsdWUsIHNldCBmb2N1cyBiYWNrIGFuZCB3cml0ZSBFcnJvciBNZXNzYWdlXHJcbiAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fb2xkdmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgICAgICAgaWYgKGdvQmFjay5nZXRUeXBlKCkgIT09IE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCkge1xyXG4gICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShnb0JhY2suZ2V0VHlwZSgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxEZXQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrICYgdmFsaWRhdGUgQWxwaGEgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0FscGhhRmllbGQoKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCk7XHJcblxyXG4gICAgbGV0IElzQXR0ckFscGhhOiBib29sZWFuID0gdGhpcy5fdmFsRGV0LmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTtcclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCAmJiB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSXNBdHRyQWxwaGEgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICBsZXQgcGljTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIodGhpcy5fcGljdHVyZSk7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUubGVuQih0aGlzLl9uZXd2YWx1ZSkgPiBwaWNMZW5CKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fbmV3dmFsdWUsIHBpY0xlbkIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA+IHRoaXMuX3BpY3R1cmUubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgdGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgY3VyclBpY3R1cmU6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXIgPSBjdXJyUGljdHVyZSA9IDA7XHJcblxyXG4gICAgZm9yIChjdXJyUGljdHVyZSA9IGkgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmIGN1cnJQaWN0dXJlIDwgdGhpcy5fcGljdHVyZS5sZW5ndGg7ICkge1xyXG4gICAgICBpZiAoIURpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSAmJiB0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkgPT09IHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSkge1xyXG4gICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSk7XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSAhPT0gdGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSB7XHJcbiAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpO1xyXG4gICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSAmJiB0aGlzLmlzUG9zc2libGVBbHBoYUxldHRlcihpLCBjdXJyUGljdHVyZSkpIHtcclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgc3RyVmFsOiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoaSwgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clZhbCkgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChJc0F0dHJBbHBoYSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY3VyclBpY3R1cmUgKyAxIDwgdGhpcy5fcGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSArIDEpKSAmJiB0aGlzLmlzUG9zc2libGVBbHBoYUxldHRlcihpLCBjdXJyUGljdHVyZSArIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHR5cGU6IE1nQ29udHJvbFR5cGUgPSBjb250cm9sLlR5cGU7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfTlVNLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9uZXd2YWx1ZSA9IHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTtcclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT09IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuZmlsbEFscGhhQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICB0aGlzLl9uZXd2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBjaGFyIGluIEFscGhhIGNvbXBsZWF0ZSB3aXRoIERpcmVjdGl2ZSBDaGFyYWN0ZXIgZm9yIHRoZSBsZXR0ZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5kZXhcIj5vZiBkaXJlY3RpdmUgaW4gc3RyaW5nIHRvIGNoZWNrPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgY29tcGxldGUsIGZhbHNlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGlzUG9zc2libGVBbHBoYUxldHRlcihpbmRleElucHV0OiBudW1iZXIsIGluZGV4UGljdHVyZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaW5kZXhQaWN0dXJlKSkge1xyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0o6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19HOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfUzpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1Q6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVTpcclxuICAgICAgICBsZXQgdXBwZXI6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHVwcGVyICE9PSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSlcclxuICAgICAgICAgIHRoaXMuY2hhbmdlU3RyaW5nSW5zaWRlKFwiXCIgKyB1cHBlciwgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTDpcclxuICAgICAgICBsZXQgbG93ZXI6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGxvd2VyICE9PSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSlcclxuICAgICAgICAgIHRoaXMuY2hhbmdlU3RyaW5nSW5zaWRlKFwiXCIgKyBsb3dlciwgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTjpcclxuICAgICAgICBsZXQgbnVtYmVyMTogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF07XHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KG51bWJlcjEpIHx8IE5DaGFyLklzV2hpdGVTcGFjZShudW1iZXIxKSB8fCBVdGlsU3RyQnl0ZU1vZGUuYXNOdW1lcmljKG51bWJlcjEpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2coXCJCYWQgQWxwaGEgdmFsdWUuIFNob3VsZCBiZSBudW1iZXIgb25seSBvbiBwbGFjZSBOdW0uIFwiICsgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFcnJvclRvTG9nKFwiRmllbGRWYWxpZGF0b3IuaXNQb3NzaWJsZUFscGhhTGV0dGVyOiBpbGxlZ2FsIENoYXIgRGlyZWN0aXZlOiBcIiArIHRoaXMuX3BpY3R1cmUuaW5kZXhPZihTdHJpbmcuZnJvbUNoYXJDb2RlKGluZGV4UGljdHVyZSkpICsgXCIgZm9yIFwiICsgdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0pO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pZiBuZXcgdmFsdWUgd2Fzbid0IGZpbmlzaGVkIGFuZCBzdGF5IHVud3JpdGFibGUgcGVhY2VzIG9mIHRoZSBSZWFsIHBpY3R1cmUgLSBhZGQgaXRcclxuICAvLy8gdG8gdGhlIGVuZCBvZiB0aGUgbmV3dmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbEFsbEFscGhhKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX3BpY3R1cmUubGVuZ3RoKTtcclxuICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlKTtcclxuXHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiB0aGlzLl92YWxEZXQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSB7XHJcbiAgICAgIGxldCBpbnROZXd2YWx1ZUxlbkI6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgbGV0IHN0ckJ1aWVkUGljdHVyZTogc3RyaW5nID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRoaXMuX3BpY3R1cmUsIGludE5ld3ZhbHVlTGVuQik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHN0ckJ1aWVkUGljdHVyZS5sZW5ndGg7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpKSB7XHJcbiAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggLSAxOyBpIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgaSA+PSAwOyBpKyspIHtcclxuICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChpKSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNvbXBhcmF0aXZlIG5ld3ZhbHVlIHdpdGggcG9zc2libGUgUmFuZ2UgaW4gQ29udGludW91c1JhbmdlVmFsdWVzL0Rpc2NyZXRlUmFuZ2VWYWx1ZXM8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXd2YWx1ZSBpZiBpdCBwb3NzaWJsZSwgb2xkdmFsdWUgb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbEFscGhhQnlSYW5nZShDb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+KTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgdG1wQnVmZmVyOiBzdHJpbmcgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZpbGxBbHBoYUJ5RGlzY3JldGVSYW5nZVZhbHVlcyhEaXNjcmV0ZVJhbmdlVmFsdWVzLCB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICBpZiAodG1wQnVmZmVyICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0bXBCdWZmZXI7XHJcbiAgICB9XHJcblxyXG4gICAgdG1wQnVmZmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5maWxsQWxwaGFCeUNvbnRpbnVvdXNSYW5nZVZhbHVlcyhDb250aW51b3VzUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiB0bXBCdWZmZXI7XHJcblxyXG4gICAgICBpZiAoRGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gdGhpcy5Db21wbGV0ZUFscGhhQnlSYW5nZShEaXNjcmV0ZVJhbmdlVmFsdWVzKTtcclxuXHJcblxyXG4gICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5UcnkgdG8gY29tcGxldGUgdGhlIG5ld3ZhbHVlIGJ5IFJhbmdlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gY29tcGxldGVkIHZhbHVlIGlmIGl0IHBvc3NpYmxlLCBvdGhlcndpc2Ugb2xkdmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBDb21wbGV0ZUFscGhhQnlSYW5nZShEaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4pOiBzdHJpbmcge1xyXG4gICAgbGV0IHRtcE5ld1ZhbHVlOiBzdHJpbmcgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmNvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBOZXdWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdG1wTmV3VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9jdXMgYmFja1xyXG4gICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBMb2dpY2FsIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tMb2dpY2FsRmllbGQoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgPT09IG51bGwgJiYgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9PSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLmZpbGxBbHBoYUJ5UmFuZ2UodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpLCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG5cclxuICAvLyB0b2RvIDogbmVlZCB0byBjaGVjayB3aGF0IGlzIHRvIGhhbmRsZSBmb3IgY2hlY2tpbmcgcmFuZ2VzXHJcbiAgICByZXR1cm4gdGhpcy5fbmV3dmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KioqKioqKioqKioqKioqKioqKioqKioqKipOdW1lcmljKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBOdW1lcmljIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljRmllbGQoKTogYW55IHtcclxuXHJcbiAgICBsZXQgZXZhbHVhdGVkOiBhbnk7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuX25ld3ZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIjBcIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyID0gdGhpcy5fbmV3dmFsdWUuaW5kZXhPZih0aGlzLl9kZWNpbWFsKTtcclxuICAgICAgbGV0IGRlbGltZXRlclBpY3RJbmRleDogbnVtYmVyID0gdGhpcy5fcGljdHVyZVJlYWwuaW5kZXhPZih0aGlzLl9kZWNpbWFsKTtcclxuXHJcbiAgICAgIGV2YWx1YXRlZCA9IFwiXCI7XHJcbiAgICAgIGxldCBldmFsdWF0ZWRMZWZ0OiBzdHJpbmc7XHJcbiAgICAgIGxldCBldmFsdWF0ZWRSaWdodDogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgZm9ybWF0IG9mIG5ld3ZhbHVlIG1hdGNoZXMgdGhlIG51bWVyaWMgbWFzay5cclxuICAgICAgaWYgKCF0aGlzLmNoZWNrTnVtZXJpY0luRGVjRm9ybWF0KCkpXHJcbiAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKTtcclxuXHJcbiAgICAgIGlmIChkZWxpbWV0ZXJQaWN0SW5kZXggIT09IC0xICYmIGRlbGltZXRlclJlYWxJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gdGhpcy5jaGVja051bWVyaWNMZWZ0KGRlbGltZXRlclBpY3RJbmRleCwgZGVsaW1ldGVyUmVhbEluZGV4KTtcclxuICAgICAgICBldmFsdWF0ZWRSaWdodCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJSZWFsSW5kZXgpO1xyXG4gICAgICAgIGV2YWx1YXRlZCA9IGV2YWx1YXRlZExlZnQgKyB0aGlzLl9kZWNpbWFsICsgZXZhbHVhdGVkUmlnaHQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGRlbGltZXRlclBpY3RJbmRleCAhPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IHRoaXMuY2hlY2tOdW1lcmljTGVmdChkZWxpbWV0ZXJQaWN0SW5kZXgsIE1hdGgubWluKGRlbGltZXRlclBpY3RJbmRleCwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICBldmFsdWF0ZWRSaWdodCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJQaWN0SW5kZXggLSAxKTtcclxuICAgICAgICAgIGV2YWx1YXRlZCA9IGV2YWx1YXRlZExlZnQgKyB0aGlzLl9kZWNpbWFsICsgZXZhbHVhdGVkUmlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgeyAvLyBkZWxpbWV0ZXJQaWN0SW5kZXggPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ICE9IC0xXHJcbiAgICAgICAgICBpZiAoZGVsaW1ldGVyUGljdEluZGV4ID09PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoLTEsIC0xKTtcclxuICAgICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IGV2YWx1YXRlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZGVsaW1ldGVyUmVhbEluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fbmV3dmFsdWUuc3Vic3RyKDAsIGRlbGltZXRlclJlYWxJbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBldmFsdWF0ZWQgPSB0aGlzLmNoZWNrTnVtZXJpY1JpZ2h0KC0xLCAtMSk7XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZExlZnQgPSBldmFsdWF0ZWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoKGV2YWx1YXRlZFJpZ2h0Lmxlbmd0aCA9PT0gMCAmJiBldmFsdWF0ZWRMZWZ0Lmxlbmd0aCA9PT0gMCkgfHwgKGV2YWx1YXRlZC5sZW5ndGggPT09IDAgJiYgdGhpcy5fbmV3dmFsdWUubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAvLyBzcGFjZXxub3RoaW5nIHdhcyBpbnNlcnRlZCAgLT4gdXNlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZTtcclxuICAgICAgICBjdHJsID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKTtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgbGV0IGRlZlZhbHVlOiBzdHJpbmcgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTsgLy8gaW5uZXIgdmFsdWUgaW5zZXJ0ZWRcclxuICAgICAgICBsZXQgZGlzcERlZlZhbHVlOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZmllbGQuaXNOdWxsRGVmYXVsdCgpKSB7XHJcbiAgICAgICAgICB0aGlzLl92YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgIGRpc3BEZWZWYWx1ZSA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwRGVmVmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgIGRpc3BEZWZWYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZWYWx1ZSwgdGhpcy5fdmFsRGV0LmdldFJhbmdlKCksIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgZGVsaW1pdGVyIGRvIG5vdCBleGNlZWQgdGhlIHBpYyB3aG9sZXMuXHJcbiAgICAgIGxldCB3aG9sZURpZ2l0ZGlmZjogbnVtYmVyID0gdGhpcy5kaWdpdHNCZWZvcmVEZWxpbWV0ZXIoZXZhbHVhdGVkLCAwLCB0aGlzLl9kZWNpbWFsKSAtIHRoaXMuX3ZhbERldC5nZXRQSUMoKS5nZXRXaG9sZXMoKTtcclxuICAgICAgLy8gaWYgdGhleSBkbywgY2hlY2sgaWYgdGhlIGV4Y2VlZGluZyBjaGFycyBhcmUgdGhlIHBhZCBjaGFycy4gaWYgc28sIHRoZXJlIGlzIG5vIGVycm9yLlxyXG4gICAgICBpZiAod2hvbGVEaWdpdGRpZmYgPiAwKSB7XHJcbiAgICAgICAgbGV0IHBhZENoYXJPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgLy8gaXMgdGhlcmUgYSBwYWQsIGNoZWNrIGl0LiBubyBwYWQgaXMgYSBjZXJ0YWluIGVycm9yLlxyXG4gICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNQYWRGaWxsKCkpIHtcclxuICAgICAgICAgIHBhZENoYXJPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB3aG9sZURpZ2l0ZGlmZiAmJiBwYWRDaGFyT25seTsgaSsrKVxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgY2hhciBpcyBub3QgdGhlIHBhZCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLlxyXG4gICAgICAgICAgICBpZiAoZXZhbHVhdGVkW2ldICE9PSB0aGlzLl92YWxEZXQuZ2V0UGFkRmlsbENoYXIoKSlcclxuICAgICAgICAgICAgICBwYWRDaGFyT25seSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwYWRDaGFyT25seSlcclxuICAgICAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuRURUX0VSUl9TVFJfMSk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldElzTmVnYXRpdmUoKSAmJiAodGhpcy5fbmV3dmFsdWUudHJpbSgpLnN0YXJ0c1dpdGgoXCItXCIpIHx8ICh0aGlzLl92YWxEZXQuZ2V0TmVnYXRpdmVTaWduUHJlZigpLmxlbmd0aCAhPT0gMCAmJiB0aGlzLl9uZXd2YWx1ZS50cmltKCkuc3RhcnRzV2l0aCh0aGlzLl92YWxEZXQuZ2V0TmVnYXRpdmVTaWduUHJlZigpKSkpKSB7XHJcbiAgICAgICAgZXZhbHVhdGVkID0gXCItXCIgKyBldmFsdWF0ZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGZyb20gdGhpcyBwb2ludCBoYXZlIGV2YWx1YXRlZCBzdHJpbmcgLSB0aGUgdmFsdWUgKHdpdGhvdXQgbWFzaykgb2YgdGhlIGNvbnRyb2xcclxuICAgICAgLy8gbmVlZGVkIHRvIGJlIGluc2VydGVkIHRvIHRoZSBwaWN0dXJlXHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0aGlzLl9uZXd2YWx1ZSwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChldmFsdWF0ZWQsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBpbiBvcmRlciBjaGVjayBpZiB1c2VyIGhhcyBlbnRlcmVkIGEgYmxhbmsgdmFsdWUgLCB0cmltIGFuZCB0aGVuIGNoZWNrIGl0J3MgbGVuZ3RoLlxyXG4gICAgICBsZXQgdGVtcERpc3BWYWw6IHN0cmluZyA9IFN0clV0aWwubHRyaW0oZXZhbHVhdGVkKTtcclxuICAgICAgaWYgKHRlbXBEaXNwVmFsLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl92YWxEZXQuZ2V0UElDKCkuemVyb0ZpbGwoKSAmJiB0aGlzLl92YWxEZXQuZ2V0UElDKCkuZ2V0WmVyb1BhZCgpID09PSAnICcpXHJcbiAgICAgICAgZXZhbHVhdGVkID0gXCIwXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcbiAgICAgIC8vIGZyb20gdGhpcyBwb2ludCBoYXZlIGV2YWx1YXRlZCBzdHJpbmcgLSB0aGUgdmFsdWUgKHdpdGhvdXQgbWFzaykgb2YgdGhlIGNvbnRyb2xcclxuICAgICAgLy8gbmVlZGVkIHRvIGJlIGluc2VydGVkIHRvIHRoZSBwaWN0dXJlXHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0aGlzLl9uZXd2YWx1ZSwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChldmFsdWF0ZWQsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgdHJ1ZSk7XHJcblxyXG4gICAgfVxyXG4gICAgLy8gSW5zZXJ0IHRoZSBudW1iZXIgdG8gcmFuZ2VcclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gZXZhbHVhdGVkO1xyXG4gICAgICBldmFsdWF0ZWQgPSB0aGlzLmZpbGxOdW1lcmljQnlSYW5nZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV2YWx1YXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5DaGVjayB2YWxpZGl0eSBvZiBudW1lcmljYWwgcGljdHVyZSBmcm9tIGZvdW5kICdkZWxpbWV0ZXInIHRvIGxlZnQuXHJcbiAgLy8vIDwtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1ldGVyUGljdEluZGV4XCI+Zm91bmQgZGVsaW1ldGVyIGluIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJSZWFsSW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIGluc2VydGVkIGJ5IHVzZXIgbmV3IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY0xlZnQoZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIsIGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IFJlYWxJbmRleDogbnVtYmVyID0gZGVsaW1ldGVyUmVhbEluZGV4IC0gMTtcclxuICAgIGxldCBQaWN0SW5kZXg6IG51bWJlcjtcclxuICAgIGxldCBpc0ZvdW5kOiBib29sZWFuO1xyXG5cclxuICAgIGZvciAoUGljdEluZGV4ID0gZGVsaW1ldGVyUGljdEluZGV4IC0gMTsgUGljdEluZGV4ID49IDAgJiYgUmVhbEluZGV4ID49IDA7IFBpY3RJbmRleC0tKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgdG1wc3RvcmFnZTogbnVtYmVyID0gUmVhbEluZGV4O1xyXG4gICAgICAgIGlzRm91bmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZm9yICg7IFJlYWxJbmRleCA+PSAwOyBSZWFsSW5kZXgtLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSA9PT0gdGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaXNGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIFJlYWxJbmRleC0tO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXNGb3VuZClcclxuICAgICAgICAgIFJlYWxJbmRleCA9IHRtcHN0b3JhZ2U7XHJcblxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY2FuIGluc2VydCBvbmx5IG51bWJlclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4ID49IDA7IFJlYWxJbmRleC0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKTtcclxuICAgICAgICAgICAgUmVhbEluZGV4LS07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChSZWFsSW5kZXggPCAwICYmIFBpY3RJbmRleCA+PSAwKVxyXG4gICAgLy8gdHJ5IHRvIGFkZCB1bndyaXRhYmxlXHJcbiAgICAgIGZvciAoOyBQaWN0SW5kZXggPj0gMDsgUGljdEluZGV4LS0pXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBvbmx5IGZyb20gbGVmdCBuZWVkIFBhZEZpbGxcclxuICAgICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNQYWRGaWxsKCkpXHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fdmFsRGV0LmdldFBhZEZpbGxDaGFyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIHJldHVybiBTdHJVdGlsLlJldmVyc2VTdHJpbmcoYnVmZmVyKS5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIHZhbGlkaXR5IG9mIG51bWVyaWNhbCBwaWN0dXJlIGZyb20gZm91bmQgJ2RlbGltZXRlcicgdG8gcmlnaHQuXHJcbiAgLy8vIC4tPlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1ldGVyUGljdEluZGV4XCI+Zm91bmQgZGVsaW1ldGVyIGluIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJSZWFsSW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIGluc2VydGVkIGJ5IHVzZXIgbmV3IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY1JpZ2h0KGRlbGltZXRlclBpY3RJbmRleDogbnVtYmVyLCBkZWxpbWV0ZXJSZWFsSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBSZWFsSW5kZXg6IG51bWJlciA9IGRlbGltZXRlclJlYWxJbmRleCArIDE7XHJcbiAgICBsZXQgUGljdEluZGV4OiBudW1iZXI7XHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcblxyXG4gICAgZm9yIChQaWN0SW5kZXggPSBkZWxpbWV0ZXJQaWN0SW5kZXggKyAxOyBQaWN0SW5kZXggPCB0aGlzLl9waWN0dXJlRW5hYmxlLmxlbmd0aCAmJiBSZWFsSW5kZXggPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IFBpY3RJbmRleCsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoUmVhbEluZGV4IDwgUGljdEluZGV4KVxyXG4gICAgICAgICAgUmVhbEluZGV4ID0gUGljdEluZGV4O1xyXG5cclxuICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNhbiBpbnNlcnQgb25seSBudW1iZXJcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgZm9yICg7IFJlYWxJbmRleCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgUmVhbEluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBkaWdpdCBvZiBhY3R1YWwgaW5wdXQgZGF0YS4gSWYgaXQgaXMgbWFzayBjaGFyLCBza2lwIGl0LlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pICYmICFwaWMucGljSXNNYXNrKFJlYWxJbmRleCkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSk7XHJcbiAgICAgICAgICAgIFJlYWxJbmRleCsrO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiByaWdodCBwYXJ0IGhhcyBhbnkgaW5wdXQgZGF0YSwgdGhlbiBvbmx5IGFwcGVuZCB1bndyaXRhYmxlIGNoYXJzXHJcbiAgICBpZiAoYnVmZmVyLkxlbmd0aCA+IDApXHJcbiAgICB7XHJcbiAgICAgIGlmIChSZWFsSW5kZXggPj0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmIFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aClcclxuICAgICAgLy8gdHJ5IHRvIGFkZCB1bndyaXRhYmxlXHJcbiAgICAgICAgZm9yICg7IFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aDsgUGljdEluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3BpY3R1cmVFbmFibGVbUGljdEluZGV4XSA9PT0gJzEnKVxyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICAgICAgLy8gZWxzZSBEbyBub3RoaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkJVRzogNDQyNzg4XHJcbiAgLy8vIENoYW5naW5nIGRlY2ltYWwgc2VwYXJhdG9yIGluIHRoZXcgcGljdHVyZVJlYWwgdG8gdmFsdWUgZ290IGZyb20gRW52aXJvbm1lbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljUGljdHVyZSgpOiB2b2lkIHtcclxuICAgIGxldCBpbmRleE9mRGVjOiBudW1iZXI7XHJcbiAgICBsZXQgbGFzdERlYzogbnVtYmVyO1xyXG4gICAgbGV0IG1heExlbmd0aDogbnVtYmVyO1xyXG4gICAgbGV0IGN1cnJJbmR4OiBudW1iZXI7XHJcbiAgICBsZXQgUE9JTlRfREVDOiBzdHJpbmcgPSBcIi5cIjsgLy8gdXNlZCBpbiBQSUNUVVJFIGZvciBkZWNpbWFsIHNlcGFyYXRvclxyXG5cclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fcGljdHVyZVJlYWwgPT0gbnVsbCB8fCB0aGlzLl9waWN0dXJlRW5hYmxlID09IG51bGwgfHwgcGljLmdldEF0dHIoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8ICFwaWMud2l0aERlY2ltYWwoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxhc3REZWMgPSB0aGlzLl9waWN0dXJlUmVhbC5sYXN0SW5kZXhPZihQT0lOVF9ERUMpO1xyXG4gICAgbWF4TGVuZ3RoID0gdGhpcy5fcGljdHVyZUVuYWJsZS5sZW5ndGg7XHJcbiAgICBjdXJySW5keCA9IDA7XHJcbiAgICB3aGlsZSAoY3VyckluZHggPCBsYXN0RGVjKVxyXG4gICAge1xyXG4gICAgICBpbmRleE9mRGVjID0gdGhpcy5fcGljdHVyZUVuYWJsZS5pbmRleE9mKFwiMVwiLCBjdXJySW5keCk7XHJcblxyXG4gICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gLTEpXHJcbiAgICAgIC8vIG5vdCBmb3VuZFxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGluZGV4T2ZEZWMgPT09IHRoaXMuX3BpY3R1cmVSZWFsLmluZGV4T2YoIFBPSU5UX0RFQywgY3VyckluZHgpKVxyXG4gICAgICAgIC8vIGl0J3MgcmVhbCBkZWNpbWFsIHBvaW50IGFuZCBub3QgXFwuIGludG8gdGhlIHBpY3R1cmVcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgZmlyc3Q6IHN0cmluZztcclxuICAgICAgICAgIGxldCBzZWNvbmQ6IHN0cmluZztcclxuXHJcbiAgICAgICAgICBmaXJzdCA9IHNlY29uZCA9IFwiXCI7XHJcbiAgICAgICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gMClcclxuICAgICAgICAgIC8vIHRoZSBwb2ludCBvbiB0aGUgZmlyc3QgcGxhY2UgLiMjI1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhPZkRlYyArIDEgPCBtYXhMZW5ndGgpXHJcbiAgICAgICAgICAgIC8vIG9ubHkgMSAuXHJcbiAgICAgICAgICAgICAgc2Vjb25kID0gdGhpcy5fcGljdHVyZVJlYWwuc3Vic3RyKGluZGV4T2ZEZWMgKyAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGluZGV4T2ZEZWMgPT09IG1heExlbmd0aClcclxuICAgICAgICAgIC8vIHRoZSBwb2ludCBvbiB0aGUgbGFzdCBwbGFjZSAjIyMuXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpcnN0ID0gdGhpcy5fcGljdHVyZVJlYWwuc3Vic3RyKDAgLCBpbmRleE9mRGVjKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmlyc3QgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoMCAsIGluZGV4T2ZEZWMpO1xyXG4gICAgICAgICAgICBzZWNvbmQgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoaW5kZXhPZkRlYyArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fcGljdHVyZVJlYWwgPSBmaXJzdCArIHRoaXMuX2RlY2ltYWwgKyBzZWNvbmQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGN1cnJJbmR4ID0gKytpbmRleE9mRGVjO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wYXJlIG5ld3ZhbHVlIHdpdGggdGhlIHJhbmdlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3dmFsdWUgaWYgaXQncyBpbiB0aGUgcmFuZ2UsIG9sZHZhbHVlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxOdW1lcmljQnlSYW5nZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbnRyb2xQaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0UElDKCk7XHJcbiAgICBsZXQgY29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCk7XHJcbiAgICBsZXQgZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+ID0gdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKTtcclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgbGV0IGNoZWNrZWRTdHI6IHN0cmluZyA9IHRoaXMuc2V0TnVtZXJpY1ZhbHVlV2l0aG91dFBpY3R1cmUodGhpcy5fbmV3dmFsdWUudG9TdHJpbmcoKSk7XHJcblxyXG5cclxuICAgIGlmIChjaGVja2VkU3RyLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fb2xkdmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgICAgbGV0IGNoZWNrZWROdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKHRoaXMuX25ld3ZhbHVlLnRvU3RyaW5nKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0UElDKCksIDApO1xyXG5cclxuICAgICAgaWYgKGRpc2NyZXRlUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGlzY3JldGVSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IHJhbmdlSXRlbVZhbHVlMTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKSwgY29udHJvbFBpYywgMCk7XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKE5VTV9UWVBFLm51bV9jbXAoY2hlY2tlZE51bSwgcmFuZ2VJdGVtVmFsdWUxKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGV4X0NDKSB7XHJcbiAgICAgICAgICAgIC8vIHNraXAgbm9uLW51bWVyaWMgcmFuZ2UgdmFsdWVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNvbnRpbnVvdXNSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICAgIGxldCByYW5nZUl0ZW1WYWx1ZTE6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VJdGVtVmFsdWUyOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG5cclxuICAgICAgICAgIHJhbmdlSXRlbVZhbHVlMS5udW1fNF9hX3N0ZChjb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSsrKSk7XHJcbiAgICAgICAgICByYW5nZUl0ZW1WYWx1ZTIubnVtXzRfYV9zdGQoY29udGludW91c1JhbmdlVmFsdWVzLmdldF9JdGVtKGkpKTtcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoTlVNX1RZUEUubnVtX2NtcChjaGVja2VkTnVtLCByYW5nZUl0ZW1WYWx1ZTEpICE9PSAtMSAmJiBOVU1fVFlQRS5udW1fY21wKHJhbmdlSXRlbVZhbHVlMiwgY2hlY2tlZE51bSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXhfMTVCKSB7XHJcbiAgICAgICAgICAgIC8vIHNraXAgbm9uLW51bWVyaWMgcmFuZ2UgdmFsdWVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIGEgbnVtZXJpYyB2YWx1ZSBleHRyYWN0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEgc3RyaW5nXHJcbiAgLy8vIG9uIGZhaWx1cmUgcmV0dXJucyBORUdBVElWRV9JTkZJTklUWVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+dGhlIHN0cmluZyB0byBwYXJzZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXREb3VibGVWYWwodmFsOiBzdHJpbmcpOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBkb3RGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1pbnVzRm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBkaWdpdEZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZW5kT2ZOdW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIGZpbmQgdGhlIGRlbGVtZXRpbmcgbm9uIG51bWVyaWMgY2hhcmFjdGVyXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsLmxlbmd0aCAmJiAhZW5kT2ZOdW07IGkrKylcclxuICAgIHtcclxuICAgICAgbGV0IGM6IHN0cmluZyA9IHZhbFtpXTtcclxuICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKVxyXG4gICAgICAgIGRpZ2l0Rm91bmQgPSB0cnVlO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKGMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSAnLSc6XHJcbiAgICAgICAgICAgIGlmIChkaWdpdEZvdW5kIHx8IGRvdEZvdW5kIHx8IG1pbnVzRm91bmQpXHJcbiAgICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBtaW51c0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAnLic6XHJcbiAgICAgICAgICAgIGlmIChkb3RGb3VuZCB8fCBtaW51c0ZvdW5kICYmICFkaWdpdEZvdW5kKVxyXG4gICAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgZG90Rm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlICcgJzpcclxuICAgICAgICAgICAgaWYgKGRpZ2l0Rm91bmQgfHwgZG90Rm91bmQgfHwgbWludXNGb3VuZClcclxuICAgICAgICAgICAgICBlbmRPZk51bSA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVuZE9mTnVtKSB7XHJcbiAgICAgIGkgPSBpIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaSA+IDApIHtcclxuICAgICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodmFsLnN1YnN0cigwLCBpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC1JbmZpbml0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZXQgTnVtZXJpYyB2YWx1ZSBXaXRob3V0IFBpY3R1cmUsIGZpbHRlciBpbnB1dCBmcm9tIHVzZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcHVyZSBudW1iZXIsIHdpdGhvdXQgcGljdHVyZSBtYXNrPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2V0TnVtZXJpY1ZhbHVlV2l0aG91dFBpY3R1cmUodmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNoZWNrZWRTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih2YWwubGVuZ3RoKTtcclxuICAgIGxldCBpc0ZpcnN0RGVjaW1hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJDaGFyOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aCAmJiBpIDwgdmFsLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBjdXJyQ2hhciA9IHZhbFtpXTtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaGFyKSlcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChjdXJyQ2hhcik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnJDaGFyID09PSB0aGlzLl9lbnZpcm9ubWVudC5HZXREZWNpbWFsKCkgJiYgIWlzRmlyc3REZWNpbWFsKVxyXG4gICAgICB7XHJcbiAgICAgICAgY2hlY2tlZFN0ci5BcHBlbmQoTlN0cmluZy5Ub0NoYXJBcnJheShOdW1iZXJGb3JtYXRJbmZvLk51bWJlckRlY2ltYWxTZXBhcmF0b3IpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlzRmlyc3REZWNpbWFsID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjdXJyQ2hhciA9PT0gJy0nICYmIHRoaXMuX3ZhbERldC5nZXRJc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgY2hlY2tlZFN0ci5BcHBlbmQoTlN0cmluZy5Ub0NoYXJBcnJheShOdW1iZXJGb3JtYXRJbmZvLk5lZ2F0aXZlU2lnbikudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hlY2tlZFN0ci5Ub1N0cmluZygpLmxlbmd0aCA9PT0gMClcclxuICAgIHtcclxuICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfTlVNLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGVja2VkU3RyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGNoZWNrIGlmIG5ld3ZhbHVlIGZvcm1hdCBtYXRjaGVzIHRoZSBudW1lcmljIHBpYyBmb3JtYXQuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNJbkRlY0Zvcm1hdCgpOiBib29sZWFuIHtcclxuXHJcblxyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBEZWM6IG51bWJlcjtcclxuICAgIGxldCBXaG9sZTogbnVtYmVyO1xyXG4gICAgbGV0IERlY1BvczogbnVtYmVyO1xyXG4gICAgbGV0IGRlY2ltYWxDaGFyOiBzdHJpbmcgPSB0aGlzLl9lbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcblxyXG4gICAgLy8gQ291bnQgbnVtYmVyIG9mIGRpZ2l0cyBhbmQgcG9zaXRpb24gb2YgZGVjaW1hbCBwb2ludFxyXG5cclxuICAgIERlYyA9IDA7XHJcbiAgICBXaG9sZSA9IDA7XHJcbiAgICBEZWNQb3MgPSAtMTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgIGlmIChwaWMuaXNOdW1lcmljKGkpKVxyXG4gICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtpXSkpXHJcbiAgICAgICAgLy8gd2hlbiBkZWMgcG9zIG5vdCBmb3VuZCwgY291bnQgd2hvbGVzLCBpZiBmb3VuZCwgY291bnQgZGVjLlxyXG4gICAgICAgICAgaWYgKERlY1BvcyA+PSAwKVxyXG4gICAgICAgICAgICBEZWMrKztcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgV2hvbGUrKztcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9uZXd2YWx1ZVtpXSA9PT0gZGVjaW1hbENoYXIpXHJcbiAgICAgICAgICBEZWNQb3MgPSBpO1xyXG5cclxuICAgIC8vIGRpZCB3ZSBleGNlZWQgdGhlIG1hc2sgP1xyXG4gICAgaWYgKHBpYy5nZXRXaG9sZXMoKSA8IFdob2xlIHx8IHBpYy5nZXREZWMoKSA8IERlYylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIERhdGUgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0RhdGVGaWVsZCgpOiBEYXRlIHtcclxuXHJcbiAgICBsZXQgbmV3RGF0ZTogRGF0ZSA9ICh0aGlzLl9uZXd2YWx1ZSA9PSBudWxsID8gbnVsbCA6IG5ldyBEYXRlKHRoaXMuX25ld3ZhbHVlKSk7XHJcbiAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSkge1xyXG4gICAgICAvLyBnZXQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgICAgbGV0IGRlZmF1bHRNZ1ZhbHVlOiBzdHJpbmcgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCkuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcblxyXG4gICAgICBuZXdEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRNZ1ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgLy8gcmFuZ2UgZGF0ZVxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPSBudWxsKVxyXG4gICAgICAgIG5ld0RhdGUgPSB0aGlzLmZpbGxEYXRlQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCksIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdEYXRlO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbnVtYmVycygyIG9yIDMgbGV0dGVycykgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj4tIHdoaWNoIHR5cGUgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmUsIGZvciBjaGVja2luZyB2YWxpZGl0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjdXJyVmFsdWUgaW4gbmV3dmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhZGQyRGF0ZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBjdXJyVmFsdWU7XHJcbiAgICBsZXQgY3VyckFkZDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCk7XHJcbiAgICBsZXQgbGV0dGVyczogbnVtYmVyID0gMDtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpXHJcbiAgICB7XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ERDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REREQ6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICBsZXR0ZXJzID0gMjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREQ6XHJcbiAgICAgICAgbGV0dGVycyA9IDM7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICBsZXR0ZXJzID0gNDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XOlxyXG4gICAgICAgIGxldHRlcnMgPSAxO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lKOiAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgIGxldHRlcnMgPSAyO1xyXG4gICAgICAgIHR5cGUgPSBQSUNJbnRlcmZhY2UuUElDX1lZOyAvLyBQSUNfWUogd2lsbCBiZSBoYW5kbGVkIGFzIFBJQ19ZWSBpbiB0aGlzIG1ldGhvZC5cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAoc3RhcnQgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChzdGFydCkpKVxyXG4gICAgICBzdGFydCsrOyAvLyBmaW5kIGZpcnN0IGRpZ2l0XHJcblxyXG5cclxuICAgIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDAgfHwgdGhpcy5fbmV3dmFsdWUgPT09IFwiMFwiKSkge1xyXG4gICAgICBmb3IgKGxldCBudWw6IG51bWJlciA9IDA7IG51bCA8IGxldHRlcnM7IG51bCA9IG51bCArIDEpIHtcclxuICAgICAgICBidWZmZXIuQXBwZW5kKCcwJykvKicwJyovO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fbmV3dmFsdWUgKyBcIjBcIjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGxldHRlcnMgJiYgaSA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpKVxyXG4gICAgICAgIGN1cnJBZGQuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3VyckFkZC5MZW5ndGggPT09IDApIHtcclxuICAgICAgY3VyckFkZC5BcHBlbmQoJzAnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYWRkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLy8gYm91bmRhcnkgY29uZGl0aW9ucyBjYXNlczpcclxuICAgIGlmICgoYWRkIDwgMSAmJiB0eXBlICE9PSBQSUNJbnRlcmZhY2UuUElDX1lZWVkgJiYgdHlwZSAhPT0gUElDSW50ZXJmYWNlLlBJQ19ZWSkgfHxcclxuICAgICAgIChhZGQgPiAzMSAmJiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERCB8fCB0eXBlID09PSAgUElDSW50ZXJmYWNlLlBJQ19EREREKSkgfHxcclxuICAgICAgKGFkZCA+IDEyICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB8fCAoYWRkID4gNyAmJiB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cpKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGFuIHBpY3R1cmUgaXMgWVlZWSBhbmQgaW5zZXJ0ZWQgMC0yIG51bWJlcnMsIHVzZSBDRU5UVVJFIHZhbHVlLCBvdGhlcndpc2UgYWRkIHplcm9zIGJlZm9yZSB0aGUgeWVhclxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSAmJiB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpID4gOTk5ICYmIGN1cnJBZGQuTGVuZ3RoIDwgMylcclxuICAgICAgY3VyckFkZCA9IHRoaXMuY2hlY2tDZW50dXJ5KGFkZCk7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGxldHRlcnMgLSBjdXJyQWRkLkxlbmd0aDsgaiA9IGogKyAxKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoJzAnKS8qJzAnKi87XHJcbiAgICB9XHJcbiAgICBidWZmZXIuQXBwZW5kKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcbiAgICByZXR1cm4gIGk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+QWRkIGZvdW5kIGluIG5ld3ZhbHVlIGxldHRlcnMgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZXR0ZXJzXCI+YW1vdW50IG9mIGxldHRlcnMgdG8gaW5zZXJ0IHRvIGJ1ZmZlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnVmZmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZE0yRGF0ZShjdXJyVmFsdWU6IG51bWJlciwgbGV0dGVyczogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYXJyYXk6IHN0cmluZ1tdO1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NTSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NRCkge1xyXG4gICAgICBpZiAodGhpcy5oZWJyZXcpIHtcclxuICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgIGFycmF5ID0gRGF0ZVV0aWwuZ2V0TG9jYWxNb250aHMobWVzc2FnZVN0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KSB7XHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGRheVN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLkRBWVNfUFRSKTtcclxuICAgICAgICAgIGFycmF5ID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKSB7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGFycmF5ID0gVXRpbERhdGVKcG4uZ2V0QXJyYXlEb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTIgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPCBjdXJyVmFsdWUgKyBsZXR0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoY3VyclZhbHVlLCBsZXR0ZXJzKTtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0ZXh0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJWYWx1ZSArIHRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gY3VyclZhbHVlICsgbGV0dGVycztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoIDwgY3VyclZhbHVlKSB7XHJcbiAgICAgIGN1cnJWYWx1ZSA9IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDtcclxuICAgIH1cclxuICAgIGxldCBtYXg6IG51bWJlciA9IHRoaXMuZ2V0TW9udGhPcldlZWsodGhpcy5fbmV3dmFsdWUuc3Vic3RyKGN1cnJWYWx1ZSksIGxldHRlcnMsIHR5cGUpO1xyXG5cclxuICAgIGlmIChhcnJheVttYXhdLnRyaW0oKS5sZW5ndGggPj0gbGV0dGVycykge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKGFycmF5W21heF0udHJpbSgpLnN1YnN0cigwLCBsZXR0ZXJzKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZChhcnJheVttYXhdLnRyaW0oKSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGxldHRlcnMgLSBhcnJheVttYXhdLnRyaW0oKS5sZW5ndGg7IGkgPiAwOyBpID0gaSAtIDEpIHtcclxuICAgICAgICBidWZmZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlICsgbGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgZW5kIGluZGV4IG9mIGV2ZXJ5IG51bWVyaWMgYmxvY2sgaW4gdGhlIG1hc2sgZnJvbSBtYXNrW2N1cnJWYWx1ZV08L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBlbmQgb2YgbnVtZXJpYyBibG9jayBpbiBuZXdWYWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEVuZE9mTnVtZXJpY0Jsb2NrKGN1cnJWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHdoaWxlIChjdXJyVmFsdWUgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChjdXJyVmFsdWUpKSkge1xyXG4gICAgICBjdXJyVmFsdWUgPSBjdXJyVmFsdWUgKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5hZGRlZCBzdWZmaXggdG8gcmVsZXZhbnQgbnVtYmVyIG9mIHRoZSBkYXk8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGREYXRlU3VmZml4KGxhc3Q6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGhlbnVtYmVyOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGxhc3QpO1xyXG4gICAgaWYgKHRoZW51bWJlciA9PT0gMSB8fCB0aGVudW1iZXIgPT09IDIxIHx8IHRoZW51bWJlciA9PT0gMzEpXHJcbiAgICAgIHJldHVybiBcInN0XCI7XHJcbiAgICBlbHNlIGlmICh0aGVudW1iZXIgPT09IDIgfHwgdGhlbnVtYmVyID09PSAyMilcclxuICAgICAgcmV0dXJuIFwibmRcIjtcclxuICAgIGVsc2UgaWYgKHRoZW51bWJlciA9PT0gMyB8fCB0aGVudW1iZXIgPT09IDIzKVxyXG4gICAgICByZXR1cm4gXCJyZFwiO1xyXG4gICAgcmV0dXJuIFwidGhcIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgc2l6ZSBvZiBibG9jayBsZXR0ZXJzIG9mIHR5cGUgJ3R5cGUnLCB3aGljaCBzdGFydCBhdCAnc3RhcnQnPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0U2l6ZU9mQmxvY2soc3RhcnQ6IG51bWJlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSBzdGFydCArIDE7XHJcbiAgICB3aGlsZSAobGV0dGVycyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoICYmIHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChsZXR0ZXJzKSA9PT0gdHlwZSlcclxuICAgIGxldHRlcnMrKztcclxuICAgIHJldHVybiBsZXR0ZXJzIC0gc3RhcnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Z2V0IFN0cmluZyBwYXJ0L2Z1bGwgbmFtZSBvZiBtb250aC9kYXkgb2Ygd2Vlazwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb250aFwiPnBhcnQvZnVsbCBuYW1lIG9mIG1vbnRoL2RheSBvZiB3ZWVrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYXhcIj5vZiBwb3NzaWJsZSBsZXR0ZXJzIGluIG1vbnRoL2RheSBvZiB3ZWVrLCBzaXplIG9mIGJsb2NrIGluIHBpY3R1cmUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGU6XCI+UElDXyAgd2Vla3xtb250aDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgbW9udGggMS0xMiwgb3IgZGF5IG9mIHdlZWsgMS03PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TW9udGhPcldlZWsobW9udGhfc3RyOiBzdHJpbmcsIGxldHRlcnM6IG51bWJlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW107XHJcblxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB7XHJcbiAgICAgIC8vIE1vbnRoXHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgYXJyYXkgPSBIZWJyZXdEYXRlLkdldExvY2FsTW9udGhzKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBtb250aFN0cjogU3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aFN0ci50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfV1dXIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfVylcclxuICAgICAgLy8gV2Vla1xyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgYXJyYXkgPSBIZWJyZXdEYXRlLkdldExvY2FsRG93cygpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBTdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbERheXMoZGF5U3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKVxyXG4gICAgICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgIHtcclxuICAgICAgICBhcnJheSA9IFV0aWxEYXRlSnBuLmdldEFycmF5RG93KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgd2VlayBvciBtb250aCBwb3NzaWJsZSAtPiBkaWZmYXVsdCAxLlxyXG4gICAgICB9XHJcblxyXG4gICAgaWYgKGxldHRlcnMgPiBtb250aF9zdHIubGVuZ3RoKVxyXG4gICAgLy8gY3V0IGxldHRlciBpZiBpdCdzICBlbmQgb2Ygc3RyaW5nXHJcbiAgICAgIGxldHRlcnMgPSBtb250aF9zdHIubGVuZ3RoO1xyXG5cclxuICAgIGlmICh0aGlzLmhlYnJldylcclxuICAgIHtcclxuICAgICAgbGV0IGhzdHI6IHN0cmluZyA9IE5TdHJpbmcuVHJpbVN0YXJ0KG1vbnRoX3N0cikuc3Vic3RyKDAsIGxldHRlcnMpLnRyaW0oKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcclxuICAgICAgLy8gc3RhcnQgY2hlY2tpbmcgZnJvbSAxc3QgbWVtYmVyLCBiZWNhdXNlIDAgPSBcIlwiXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoYXJyYXlbaV0udHJpbSgpID09PSBoc3RyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChpID09PSAxNClcclxuICAgICAgICAgICAgaSA9IDY7XHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyB0aGUgbnVtYmVyIGluc2VydGVkIGFuZCBub3Qgc3RyaW5nIC0+IGZpbmQgbW91bnRoL2RheSBvZiB3ZWVrIGJ5IG51bWJlciAxLTEyfDEtN1xyXG5cclxuICAgICAgICBsZXQgc3RyOiBzdHJpbmcgPSBtb250aF9zdHIuc3Vic3RyKDAsIGxldHRlcnMpLnRyaW0oKTtcclxuICAgICAgICBsZXQgbnVtQnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltpXSkpXHJcbiAgICAgICAgICAgIG51bUJ1ZmZlci5BcHBlbmQoc3RyW2ldKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGhlTnVtYmVyOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKG51bUJ1ZmZlci5Ub1N0cmluZygpKTtcclxuICAgICAgICBpZiAodGhlTnVtYmVyIDwgMSlcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NTSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhlTnVtYmVyID4gMTIpXHJcbiAgICAgICAgICAgIHJldHVybiAxMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgaWYgKHRoZU51bWJlciA+IDcpXHJcbiAgICAgICAgICAgIHJldHVybiA3O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhlTnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgIGNhdGNoIChleF8yMUEpIHtcclxuICAgICAgICAgIC8vIGRvTm90aGluZ19TdHJpbmdJbnNlcnRlZFxyXG4gICAgICB9XHJcblxyXG4gICAgLy8gaW5zZXJ0ZWQgc3RyaW5nIC0gbmFtZSBvZiBtb250aHxkYXkgb2Ygd2VlayAtPnRyeSBpZGVudHlmeSBpdFxyXG4gICAgbGV0IGZvdW5kOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGFycmF5Lmxlbmd0aCk7XHJcbiAgICBsZXQgZnJvbTogbnVtYmVyO1xyXG4gICAgbGV0IG1heDogbnVtYmVyID0gLTE7IC8vIG51bWJlciBvZiBmb3VuZCBtb250aC9kYXkgb2Ygd2Vla1xyXG5cclxuXHJcbiAgICBmb3IgKGxldCB0bXA6IG51bWJlciA9IDE7IHRtcCA8IGFycmF5Lmxlbmd0aDsgdG1wKyspXHJcbiAgICAvLyBzdGFydCBjaGVja2luZyBmcm9tIDFzdCBtZW1iZXIsIGJlY2F1c2UgMCA9IFwiXCJcclxuICAgIHtcclxuICAgICAgZm91bmRbdG1wXSA9IDA7XHJcbiAgICAgIGZyb20gPSAwO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXlbdG1wXS5sZW5ndGggJiYgZnJvbSA8IG1vbnRoX3N0ci5sZW5ndGggJiYgaSA8IGxldHRlcnM7IGkrKywgZnJvbSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGFycmF5W3RtcF0udG9Mb3dlckNhc2UoKVtpXSA9PT0gbW9udGhfc3RyLnRvTG93ZXJDYXNlKClbZnJvbV0pXHJcbiAgICAgICAgICBmb3VuZFt0bXBdKys7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmcm9tID09PSBsZXR0ZXJzIHx8IGZyb20gPT09IGFycmF5W3RtcF0ubGVuZ3RoKVxyXG4gICAgICAvLyBhbGwgbGV0dGVycyBmb3VuZFxyXG4gICAgICB7XHJcbiAgICAgICAgbWF4ID0gdG1wO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1heCA9PT0gLTEpXHJcbiAgICAgIG1heCA9IHRoaXMuZmluZE1heChmb3VuZCk7XHJcbiAgICByZXR1cm4gbWF4O1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBudW1lcmljIGRhdGEgYWxsb3dlZCBpbiBkYXRlXHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGl0IGlzIGFsbG93ZWQsIG90aGVyd2lzZSBmYWxzZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzTnVtYmVyQWxsb3dlZEluRGF0ZSgpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGVQb3NpdGlvbmFsTnVtZXJpY0RpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2ldKSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5maW5kIGlmIGFsbCBudW1iZXJzIG9mIHRoZSBuZXcgdXNlciBpbnNlcnRlZCB2YWx1ZSBhcmUgMFxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBpZiBhbGwgbnVtYmVycyBpbiB0aGUgaW5wdXQgYXJlIDAsIG90aGVyd2lzZSB0cnVlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNBbGxOdW1iZXJzMCgpOiBib29sZWFuIHtcclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9uZXd2YWx1ZVtpXTtcclxuXHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChjdXJyQ2hyKSAmJiBjdXJyQ2hyICE9PSAnMCcpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIHZhbGlkaXR5IG9mIFllYXIgZm9yIFlZWVkgcGFydCBvZiB0aGUgbWFzazwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFySW5cIj5pbnNlcnRlZCBieSB1c2VyPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGNhbGN1bGF0ZWQgYnkgZW52aXJvbm1lbnQuY2VudHVyeSByaWdodCB2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrQ2VudHVyeSh5ZWFySW46IG51bWJlcik6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IG91dFZhbDogbnVtYmVyO1xyXG4gICAgbGV0IHN0YXJ0X2NlbnR1cnk6IG51bWJlciA9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICBsZXQgY2VudHVyeTogbnVtYmVyID0gTWF0aC5mbG9vcihzdGFydF9jZW50dXJ5IC8gMTAwKTtcclxuICAgIGxldCB5ZWFyczogbnVtYmVyID0gc3RhcnRfY2VudHVyeSAlIDEwMDtcclxuICAgIGlmICh5ZWFySW4gPj0geWVhcnMgJiYgeWVhckluICE9PSAwKVxyXG4gICAgICBvdXRWYWwgPSAoY2VudHVyeSAqIDEwMCArIHllYXJJbik7XHJcbiAgICBlbHNlXHJcbiAgICAgIG91dFZhbCA9ICgoKytjZW50dXJ5KSAqIDEwMCArIHllYXJJbik7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKG91dFZhbC50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiB0aGUgZGF0ZSBsZWdhbCBmb3IgcGljdHVyZSByYW5nZSwgdXNlZCBmb3IgdmFsaWRhdGlvbiBkYXRlIDA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQ29udGludW91c1JhbmdlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJEaXNjcmV0ZVJhbmdlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+aW50ZWdlciAtIG1hZ2ljIGRhdGUgbnVtYmVyIG9mIGRheXMgZnJvbSAwMS4wMS4wMDAwPC9wYXJhbT5cclxuICBwcml2YXRlIGlzRGF0ZUxlZ2FsNFJhbmdlKENvbnRpbnVvdXNSYW5nZTogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlOiBMaXN0PHN0cmluZz4sIGN1cnJEYXRlOiBudW1iZXIpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGRvd25EYXRlOiBudW1iZXI7XHJcbiAgICBsZXQgdG9wRGF0ZTogbnVtYmVyO1xyXG5cclxuICAgIGlmIChDb250aW51b3VzUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBkb3duRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICB0b3BEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID49IGRvd25EYXRlICYmIGN1cnJEYXRlIDw9IHRvcERhdGUpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSBkYXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIC8vIHJldHVybiBmYWxzZTtcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGFuZCBmaWxsIERBVEUgdHlwZSBieSByYW5nZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxEYXRlQnlSYW5nZShDb250aW51b3VzUmFuZ2U6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZTogTGlzdDxzdHJpbmc+LCBidWZmZXI6IERhdGUpOiBEYXRlIHtcclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZG93bkRhdGU6IG51bWJlcjtcclxuICAgIGxldCB0b3BEYXRlOiBudW1iZXI7XHJcblxyXG4gICAgbGV0IGN1cnJEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlTnVtYmVyKGJ1ZmZlciwgcGljLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZSAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBDb250aW51b3VzUmFuZ2UubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgZG93bkRhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgdG9wRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbSgrK2kpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIGlmIChjdXJyRGF0ZSA+PSBkb3duRGF0ZSAmJiBjdXJyRGF0ZSA8PSB0b3BEYXRlKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoRGlzY3JldGVSYW5nZSAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSBkYXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBkYXkgc3VpdGFibGUgKG5vdCBiaWdnZXIgdGhhbiBtYXgpIGZvciBZZWFyIGFuZCBNb250aDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dXNlciBpbnNlcnRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzRG95XCI+aXMgcGljdHVyZSBvZiBuZWVkZWQgZGF5IGlzIERERCAtIGRheSBvZiB5ZWFyPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrRGF5KGRhdGU6IHN0cmluZywgaXNEb3k6IGJvb2xlYW4pOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSB0aGlzLmdldERhdGVFbGVtZW50KGRhdGUsIERhdGVFbGVtZW50LkRBWSk7XHJcbiAgICBpZiAoZGF5IDwgMjkgJiYgIWlzRG95KVxyXG4gICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZGF0ZSk7XHJcblxyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuWUVBUik7XHJcblxyXG4gICAgaWYgKCFpc0RveSlcclxuICAgIHtcclxuICAgICAgaWYgKHllYXIudG9TdHJpbmcoKS5sZW5ndGggPCAzKVxyXG4gICAgICAgIHllYXIgPSBOTnVtYmVyLlBhcnNlKHRoaXMuY2hlY2tDZW50dXJ5KHllYXIpLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpID09PSAnQicpXHJcbiAgICAgICAgeWVhciAtPSBQSUNJbnRlcmZhY2UuREFURV9CVURESElTVF9HQVA7XHJcblxyXG4gICAgICBsZXQgbW9udGg6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuTU9OVEgpO1xyXG5cclxuICAgICAgLy8gaWYgZGF5IG5vdCBjb25zaXN0YWluZWQgdG8geWVhciAmIG1vbnRoIC0gY2hhbmdlIGRheVxyXG4gICAgICBsZXQgZGF5TWF4OiBudW1iZXIgPSB0aGlzLmdldE1heERheUluTW9udGgoeWVhciwgbW9udGgpO1xyXG4gICAgICBpZiAoZGF5ID4gZGF5TWF4KVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIC8vIGlmIG1vbnRoIG5vdCBjb25zaXN0YWluZWQgdG8gZGF5KERERCkgLSBjaGFuZ2UgbW9udGhcclxuICAgICAgbGV0IG1vbnRoUmVhbDogbnVtYmVyID0gdGhpcy5nZXRNb250aEJ5RGF5KHllYXIsIGRheSk7XHJcblxyXG4gICAgICBpZiAobW9udGhSZWFsIDwgMSB8fCBtb250aFJlYWwgPiAxMilcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGRheSBvZiB3ZWVrIHN1aXRhYmxlIChyaWdodCkgZm9yIFllYXIsIE1vbnRoIGFuZCBEYXk8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0ZVwiPnVzZXIgaW5zZXJ0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrV2VlayhkYXRlOiBzdHJpbmcpOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgZG93OiBudW1iZXIgPSB0aGlzLmdldERhdGVFbGVtZW50KGRhdGUsIERhdGVFbGVtZW50LkRPVyk7XHJcblxyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXMgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmdldE5ld0RhdGVCcmVha1BhcmFtcygpO1xyXG5cclxuICAgIGxldCBkYXRlTWFnaWM6IG51bWJlciA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGUoZGF0ZSwgdGhpcy5fcGljdHVyZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kYXRlX2JyZWFrX2RhdGVtb2RlKGJyZWFrUGFyYW1zLCBkYXRlTWFnaWMsIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIGxldCBkb3dSZWFsOiBudW1iZXIgPSBicmVha1BhcmFtcy5kb3c7XHJcbiAgICBpZiAoZG93UmVhbCAhPT0gZG93UmVhbClcclxuICAgICAgZGF0ZSA9IHRoaXMuY2hhbmdlRG93KGRhdGUsIGRvd1JlYWwpO1xyXG5cclxuICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihkYXRlKTtcclxuICB9XHJcblxyXG5cclxuICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIHRoZSBjb21iaW5hdGlvbiBvZiBKYXBhbmVzZSBlcmEgYW5kIHllYXIgaXMgdmFsaWQuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0ckRhdGVcIj51c2VyIGluc2VydGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBkYXRlIHN0cmluZyBvZiBwcm9wZXJseSBKYXBhbmVzZSBlcmE8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0pwbkVyYVllYXIoc3RyRGF0ZTogc3RyaW5nKTogU3RyaW5nQnVpbGRlciB7XHJcblxyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXMgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmdldE5ld0RhdGVCcmVha1BhcmFtcygpO1xyXG4gICAgbGV0IGRhdGVNYWdpYzogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZShzdHJEYXRlLCB0aGlzLl9waWN0dXJlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGVNYWdpYywgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgbGV0IGludFllYXJBRDogbnVtYmVyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIGxldCBpbnREb3k6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRveTtcclxuXHJcbiAgICAvLyBnZXQgdGhlIG5hbWUgYW5kIGEgeWVhciBvZiB0aGUgZXJhXHJcbiAgICBsZXQgc3RyRXJhQWxwaGE6IHN0cmluZztcclxuICAgIGxldCBzdHJFcmFLYW5qaTogc3RyaW5nO1xyXG5cclxuICAgIHN0ckVyYUFscGhhID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoaW50WWVhckFELCBpbnREb3ksIGZhbHNlKTtcclxuICAgIHN0ckVyYUthbmppID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoaW50WWVhckFELCBpbnREb3ksIHRydWUpO1xyXG5cclxuICAgIGxldCBzdHJZZWFySnBuRXJhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBudW06IG51bWJlciA9IFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feWVhcl9vZnMoaW50WWVhckFELCBpbnREb3kpO1xyXG4gICAgaWYgKG51bSA8PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuICAgIGlmIChudW0gPD0gOSkge1xyXG4gICAgICBzdHJZZWFySnBuRXJhLkFwcGVuZChcIjBcIik7XHJcbiAgICB9XHJcbiAgICBzdHJZZWFySnBuRXJhLkFwcGVuZChudW0udG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLy8gYnVpbGQgYSBwcm9wZXJseSB5ZWFyIG9mIHRoZSBlcmFcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwic3RyXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJtYXNrXCIuXHJcbiAgICAvLyBJZiBcInN0clwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcIm1hc2tcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgLy8gVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBza2lwcGVkIGluZGV4ZXMuXHJcbiAgICBsZXQgaW50UGljSWR4T2ZzOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaW50Q250OiBudW1iZXIgPSAwOyBpbnRDbnQgKyBpbnRQaWNJZHhPZnMgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaW50Q250KyspXHJcbiAgICB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGludENudCArIGludFBpY0lkeE9mcykpXHJcbiAgICAgIHtcclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0pZMSk6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyRXJhQWxwaGEsIGludENudCArIDEsIDEpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlkyKTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFLYW5qaSwgaW50Q250ICsgMSwgMSk7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMrKzsgLy8gUElDX0pZMiBjb25zdW1lcyAyIGNoYXJhY3RlcnMgb2YgcGljdHVyZSAoMSBtb3JlIHRoYW4gc3RyRGF0ZSlcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0pZNCk6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyRXJhS2FuamksIGludENudCArIDEsIDIpO1xyXG4gICAgICAgICAgaW50Q250Kys7IC8vIFBJQ19KWTQgY29uc3VtZXMgMiBjaGFyYWN0ZXJzIG9mIHN0ckRhdGVcclxuICAgICAgICAgIGludFBpY0lkeE9mcyArPSAyOyAvLyBQSUNfSlk0IGNvbnN1bWVzIDQgY2hhcmFjdGVycyBvZiBwaWN0dXJlICgyIG1vcmUgdGhhbiBzdHJEYXRlKVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfWUopOlxyXG4gICAgICAgICAgc3RyRGF0ZSA9IFV0aWxTdHJCeXRlTW9kZS5yZXBDKHN0ckRhdGUsIHN0clllYXJKcG5FcmEudG9TdHJpbmcoKSwgaW50Q250ICsgMSwgMik7XHJcbiAgICAgICAgICBpbnRDbnQrKzsgLy8gUElDX1lKIGNvbnN1bWVzIDIgY2hhcmFjdGVycyBvZiBzdHJEYXRlXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChpbnRDbnQgPCBzdHJEYXRlLmxlbmd0aClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gaWYgXCJzdHJEYXRlXCIgY29udGFpbnMgREJDUywgdGhlIG5leHQgaW5kZXggb2YgXCJwaWN0dXJlXCIgaGFzIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoc3RyRGF0ZVtpbnRDbnRdKSA9PT0gZmFsc2UgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHRoaXMuX3BpY3R1cmVbaW50Q250ICsgaW50UGljSWR4T2ZzXSkgPT09IHRydWUpXHJcbiAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihzdHJEYXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgbWF4IG51bWJlciBvZiBkYXkgaW4gbW9udGg8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwieWVhclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9udGhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbWF4IGRheXMgWzI4LTMxXSBudW1iZXI8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRNYXhEYXlJbk1vbnRoKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYXJyYXk6IG51bWJlcltdID0gW1xyXG4gICAgICAwLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXHJcbiAgICBdO1xyXG4gICAgbGV0IGxlYXB5ZWFyOiBib29sZWFuID0geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XHJcblxyXG4gICAgaWYgKGxlYXB5ZWFyICYmIG1vbnRoID09PSAyKVxyXG4gICAgICByZXR1cm4gYXJyYXlbbW9udGhdICsgMTtcclxuXHJcbiAgICAgcmV0dXJuIGFycmF5W21vbnRoXTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgbW9udGggZm9yIGRheSwgdGhhbiBkYXkgaGF2ZSBtYXNrIERERDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXlcIj5bMC0zNjVdPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG51bWJlciBvZiBtb250aDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE1vbnRoQnlEYXkoeWVhcjogbnVtYmVyLCBkYXk6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IExlYXBZZWFyOiBib29sZWFuO1xyXG5cclxuICAgIExlYXBZZWFyID0gKHllYXIgJSA0ID09PSAwKSAmJiAoKHllYXIgJSAxMDAgIT09IDApIHx8ICh5ZWFyICUgNDAwID09PSAwKSk7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWIubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICghTGVhcFllYXIpXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYltpXSA+PSBkYXkpXHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgICAvLyBpcyBMZWFwIFllYXJcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGkgPCAzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW2ldID49IGRheSlcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFkZCAxIGRheSBhZnRlciBzZWNvbmQgbW9udGhcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbaV0gKyAxID49IGRheSlcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IC8vIGZvciBsb29wXHJcbiAgICByZXR1cm4gaTsgLy8gdGhlIGZ1bmN0aW9uIGNhbm4ndCBjYW1lIHRvIHRoZSBzdGF0ZW1lbnQgYW55dGltZVxyXG4gIH1cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5nZXQgWWVhcnxNb250aHxEYXl8RG93IG9mIGRhdGVcclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+ZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZWxlbWVudFwiPnJlcXVpcmVkIGRhdGUgZWxlbWVudCAoeWVhci9tb250aC9kYXkvZG93KSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5ZZWFyfE1vbnRofERheXxEb3cgb2YgZGF0ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldERhdGVFbGVtZW50KGRhdGU6IHN0cmluZywgZWxlbWVudDogRGF0ZUVsZW1lbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV4aXRMb29wOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcGljV2Vla1R5cGU6IG51bWJlciA9IFBJQ0ludGVyZmFjZS5QSUNfV1dXOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICBsZXQgaXNKcG5FcmFZZWFyOiBib29sZWFuID0gZmFsc2U7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIGxldCBlcmFfeWVhcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwiZGF0ZVwiIGNvbnN1bWVzIHR3byBjaGFyYWN0ZXJzIGluIFwicGljdHVyZVwiLlxyXG4gICAgLy8gSWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwicGljdHVyZVwiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy5cclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuXHJcbiAgICBsZXQgbWluTGVuOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpXHJcbiAgICAgIG1pbkxlbiA9IFV0aWxTdHJCeXRlTW9kZS5nZXRNaW5MZW5QaWN0dXJlKGRhdGUsIHRoaXMuX3BpY3R1cmUpO1xyXG4gICAgZWxzZVxyXG4gICAgICBtaW5MZW4gPSBNYXRoLm1pbihkYXRlLmxlbmd0aCwgdGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgKyBpbnRQaWNJZHhPZnMgPCBtaW5MZW4gJiYgIWV4aXRMb29wOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZVtpICsgaW50UGljSWR4T2ZzXSkpXHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChpICsgaW50UGljSWR4T2ZzKSlcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREQ6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuREFZKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCAzKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpOyAvLyBub3QgKzQgbmVlZCBub3Qgc3VmZml4IG9mICduZCcsICdyZCcsICdzdCdcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuTU9OVEgpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NTTpcclxuICAgICAgICAgIC8vIGdldCBzaXplIG9mIFBJQ19NTU0gYmxvY2tcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfTU1NKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5NT05USClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgbGV0dGVycyk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgbGV0dGVycyA9IDA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LllFQVIpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZWVk6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgNCk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDEpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfV1dXKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIGxldHRlcnMpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSBsZXR0ZXJzIC0gMTtcclxuICAgICAgICAgIGxldHRlcnMgPSAwO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IREQ6XHJcbiAgICAgICAgICAvLyBub3QgaW1wbGVtZW50ZWQgZm9yIGhlYnJldyB5ZXRcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX0JCKTtcclxuXHJcbiAgICAgICAgICBpZiAoaSArIE1hdGguZmxvb3IobGV0dGVycyAvIDIpIDwgZGF0ZS5sZW5ndGgpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIE1hdGguZmxvb3IobGV0dGVycyAvIDIpKTtcclxuICAgICAgICAgICAgLy8gaWYgZGF0ZSBjb250YWlucyBEQkNTLCBzb21lIGluZGV4ZXMgb2YgcGljdHVyZSBoYXZlIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgIGludFBpY0lkeE9mcyArPSBsZXR0ZXJzIC0gYnVmZmVyLmxlbmd0aDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuRE9XKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIHBpY1dlZWtUeXBlID0gUElDSW50ZXJmYWNlLlBJQ19CQjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTE6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpc0pwbkVyYVllYXIgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpc0pwbkVyYVllYXIgPSB0cnVlO1xyXG4gICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZNDogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMgKz0gMjtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gLy8gc3dpdGNoIG9mIHBvc2l0aW9uYWwgZGlyZWN0aXZlc1xyXG4gICAgICAgIH0gLy8gaWYgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICB9IC8vIGZvciBsb29wIGluIHBpY3R1cmVcclxuXHJcbiAgICBpZiAoYnVmZmVyID09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgIHJldHVybiBEYXRlVGltZS5Ob3cuWWVhcjtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlciA9IGJ1ZmZlci50cmltKCk7XHJcblxyXG4gICAgaWYgKGxldHRlcnMgPiAwKVxyXG4gICAgLy8gaXQncyBQSUNfV1dXIG9yIFBJQ19NTU1cclxuICAgIHtcclxuICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50Lk1PTlRIKVxyXG4gICAgICAgIGxldHRlcnMgPSB0aGlzLmdldE1vbnRoT3JXZWVrKGJ1ZmZlci50b1N0cmluZygpLCBsZXR0ZXJzLCBQSUNJbnRlcmZhY2UuUElDX01NTSk7XHJcbiAgICAgIGVsc2UgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRNb250aE9yV2VlayhidWZmZXIudG9TdHJpbmcoKSwgbGV0dGVycywgcGljV2Vla1R5cGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICB3aGlsZSAoYnVmZmVyLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIjBcIikgfHwgYnVmZmVyLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIiBcIikpXHJcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnRvU3RyaW5nKCkuc3Vic3RyKDEpO1xyXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICBsZXR0ZXJzID0gMDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxldHRlcnMgPSBOTnVtYmVyLlBhcnNlKGJ1ZmZlci50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUiAmJiBpc0pwbkVyYVllYXIpXHJcbiAgICB7XHJcbiAgICAgIC8vIGdldCB0aGUgc3RhcnQgeWVhciBvZiB0aGUgZXJhXHJcbiAgICAgIGVyYV95ZWFyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5nZXRTdGFydFllYXJPZkVyYShkYXRlLCB0aGlzLl9waWN0dXJlKTtcclxuICAgICAgaWYgKGVyYV95ZWFyID09PSAwKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBsZXR0ZXJzICs9IGVyYV95ZWFyIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGFuZ2UgZGF5IG51bWJlciBpbiBkYXRlIGZpZWxkIHRvIGRheU1heDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dG8gY2hhbmdlIGRheSBpbnRvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXlNYXhcIj50aGUgbmV3IGRheSB2YWx1ZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjaGFuZ2VEb3coZGF0ZTogc3RyaW5nLCBkb3c6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgaXNEYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbGV0dGVyczogbnVtYmVyO1xyXG4gICAgbGV0IHN0YXJ0UGFydDogc3RyaW5nO1xyXG4gICAgbGV0IGZpbmlzaFBhcnQ6IHN0cmluZztcclxuICAgIGxldCBudW1iZXIxOiBzdHJpbmc7XHJcblxyXG4gICAgbnVtYmVyMSA9IFwiXCIgKyBkb3c7IC8vIFwiIFwiXHJcblxyXG4gICAgLy8gQSBEQkNTIGNoYXJhY3RlciBpbiBcImRhdGVcIiBjb25zdW1lcyB0d28gY2hhcmFjdGVycyBpbiBcInBpY3R1cmVcIi5cclxuICAgIC8vIElmIFwiZGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcInBpY3R1cmVcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgLy8gVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBza2lwcGVkIGluZGV4ZXMuIChKUE46IERCQ1Mgc3VwcG9ydClcclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSArIGludFBpY0lkeE9mcyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoICYmICFpc0RhdGU7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgMSk7XHJcbiAgICAgICAgICBkYXRlID0gc3RhcnRQYXJ0ICsgbnVtYmVyMSArIGZpbmlzaFBhcnQ7XHJcbiAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XV1c6XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX1dXVyk7XHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgbGV0dGVycyk7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgbGV0IGRheU5hbWVzOiBzdHJpbmdbXSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIpO1xyXG4gICAgICAgICAgbnVtYmVyMSA9IGRheU5hbWVzW2Rvd107XHJcblxyXG4gICAgICAgICAgaWYgKG51bWJlcjEubGVuZ3RoID4gbGV0dGVycylcclxuICAgICAgICAgICAgbnVtYmVyMSA9IG51bWJlcjEuc3Vic3RyKDAsIGxldHRlcnMpO1xyXG4gICAgICAgICAgZWxzZSBpZiAobnVtYmVyMS5sZW5ndGggPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICB3aGlsZSAobnVtYmVyMS5sZW5ndGggPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICAgIG51bWJlcjEgPSBudW1iZXIxICsgJyAnO1xyXG4gICAgICAgICAgZGF0ZSA9IHN0YXJ0UGFydCArIG51bWJlcjEgKyBmaW5pc2hQYXJ0O1xyXG4gICAgICAgICAgaXNEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX0JCKTtcclxuICAgICAgICAgIC8vIFwibGV0dGVyc1wiIG1lYW5zIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCJcclxuXHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikpO1xyXG4gICAgICAgICAgLy8gXCJsZXR0ZXJzIC8gMlwiIG1lYW5zIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gXCJkYXRlXCJcclxuXHJcbiAgICAgICAgICBudW1iZXIxID0gVXRpbERhdGVKcG4uZ2V0U3RyRG93KGRvdyk7XHJcblxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpID4gbGV0dGVycylcclxuICAgICAgICAgICAgbnVtYmVyMSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihudW1iZXIxLCBsZXR0ZXJzKTtcclxuICAgICAgICAgIGVsc2UgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpIDwgbGV0dGVycylcclxuICAgICAgICAgICAgd2hpbGUgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpIDwgbGV0dGVycylcclxuICAgICAgICAgICAgICBudW1iZXIxID0gbnVtYmVyMSArICcgJztcclxuICAgICAgICAgIGRhdGUgPSBzdGFydFBhcnQgKyBudW1iZXIxICsgZmluaXNoUGFydDtcclxuICAgICAgICAgIGlzRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKVxyXG4gICAgICAgICAgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGkgPCBkYXRlLmxlbmd0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC8vIGlmIFwiZGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBuZXh0IGluZGV4IG9mIFwicGljdHVyZVwiIGhhcyB0byBiZSBza2lwcGVkLlxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoZGF0ZVtpXSkgPT09IGZhbHNlICYmIFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aCh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgIGludFBpY0lkeE9mcysrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfSAvLyBzd2l0Y2hcclxuICAgICAgICB9IC8vIGlmIG9mIHBvc2l0aW9uYWwgZGlyZWN0aXZlc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBUaW1lIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tUaW1lRmllbGQoKTogRGF0ZSB7XHJcbiAgICBsZXQgbmV3VGltZTogRGF0ZSA9IG5ldyBEYXRlICh0aGlzLl9uZXd2YWx1ZSk7XHJcblxyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuaXNEYXRlWmVybyh0aGlzLl9uZXd2YWx1ZSkpIHtcclxuICAgICAgLy8gZ2V0IGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgICAgIGxldCBkZWZhdWx0TWdWYWx1ZTogc3RyaW5nID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGaWVsZCgpLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICBuZXdUaW1lID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRNZ1ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gcmFuZ2Ugb2YgdGhlIHRpbWVcclxuICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT0gbnVsbClcclxuICAgICAgICBuZXdUaW1lID0gdGhpcy5maWxsVGltZUJ5UmFuZ2UodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpLCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpLCB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3VGltZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbnVtYmVycygyKG9yIDEpIGxldHRlcnMpIHRvIGJ1ZmZlciBhbmQgcmV0dXJuXHJcbiAgLy8vIGxhc3QgZm91bmQgbnVtYmVyIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyVmFsdWVcIj5pbiBuZXd2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnVmZmVyXCI+Ly8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPndoaWNoIHR5cGUgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmUsIGZvciBjaGVja2luZyB2YWxpZGl0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjdXJyVmFsdWUgaW4gbmV3dmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhZGQyVGltZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBjdXJyVmFsdWU7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IFNUUl8wMDogU3RyaW5nID0gXCIwMFwiO1xyXG4gICAgbGV0ICBjdXJyQWRkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICB3aGlsZSAoc3RhcnQgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW3N0YXJ0XSkpXHJcbiAgICB7XHJcbiAgICAgIHN0YXJ0Kys7IC8vIGZpbmQgZmlyc3QgZGlnaXRcclxuICAgICAgLy8gbm9uLWRpZ2l0cyB3ZXJlIGZvdW5kIGluIGlucHV0IHN0cmluZ1xyXG4gICAgICAvLyB3ZSBkbyBub3QgdGhyb3cgU1RSX0VSUl9USU1FIGV4Y2VwdGlvbiB0byBwcmV2ZW50IGlucHV0IGRpZ2l0cyBsb3N0XHJcbiAgICAgIC8vIG9uIG5vbi1kaWdpdHMgcGxhY2UgU1RSXzAwIHdpbGwgYmUgYWRkZWRcclxuICAgICAgLy8gU2luY2UgTWFzayBFZGl0aW5nIC4gVGhpcyBlcnJvciBpcyBpcnJlbGV2YW50LiBUaW1lIG5vdywgYWx3YXlzIGNvbnRhaW5zIG5vbiBkaWdpdHMgbGlrZSA6IGFuZCBtaWdodCBjb250YWluICcgJyBmb3IgdW5maWxsZWQgY2hhcnMuXHJcbiAgICAgIC8vIFRoaXMgaXMgYSB2YWxpZCBjYXNlIGFuZCB3ZSBkbyBub3Qgd2FudCBhbiBlcnJvciBwb3BwaW5nIGFib3V0IGl0LlxyXG4gICAgICAvLyAgZ3VpTWFuYWdlci53cml0ZVRvTWVzc2FnZVBhbmUodmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLCBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldE1lc3NhZ2VTdHJpbmcoU1RSX0VSUl9USU1FKSwgU3RhdHVzQmFyTWVzc2FnZVR5cGUuU0JfUlVOVElNRV9NU0cpO1xyXG4gICAgICAvLyAgc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhcnQgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aClcclxuICAgIC8vIG5vdCBmb3VuZCBtb3JlIGRpZ2l0c1xyXG4gICAge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKFNUUl8wMC50b1N0cmluZygpKTtcclxuICAgICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgMiAmJiBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtpXSkpXHJcbiAgICAgICAgY3VyckFkZC5BcHBlbmQodGhpcy5fbmV3dmFsdWVbaV0pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBjdXJyQWRkLkluc2VydCgwLCAnMCcpOyAvLyBvbmx5IDEgZGlnaXQgZm91bmRcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgaSA9PT0gc3RhcnQgKyAxKVxyXG4gICAgICBjdXJyQWRkLkluc2VydCgwLCAnMCcpO1xyXG4gICAgLy8gb25seSAxIGRpZ2l0IGZvdW5kXHJcbiAgICBlbHNlIGlmIChpID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgaSA9PT0gc3RhcnQpXHJcbiAgICAgIGN1cnJBZGQuQXBwZW5kKFNUUl8wMC50b1N0cmluZygpKTtcclxuXHJcbiAgICBsZXQgYWRkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLyppZiAoYWRkIDwgMClcclxuICAgIGN1cnJBZGQ9bmV3IFN0cmluZ0J1ZmZlcihcIjAwXCIpO1xyXG4gICAgZWxzZSBpZiAoYWRkID4gNTkgJiYgdHlwZT09UElDX01NVClcclxuICAgIGN1cnJBZGQ9bmV3IFN0cmluZ0J1ZmZlcihcIjU5XCIpO1xyXG4gICAgZWxzZSBpZiAoYWRkID4gNTkgJiYgdHlwZT09UElDX1NTKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiNTlcIik7Ki9cclxuICAgIGlmIChhZGQgPCAwIHx8IChhZGQgPiA1OSAmJiB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NVCkgfHwgKGFkZCA+IDU5ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfU1MpKVxyXG4gICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfVElNRSk7XHJcbiAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0hIKVxyXG4gICAge1xyXG4gICAgICBsZXQgUE06IGJvb2xlYW4gPSB0aGlzLmdldElzUE0oKTtcclxuICAgICAgbGV0IG5ld1N0cjogU3RyaW5nID0gbnVsbDtcclxuICAgICAgbGV0IGRpZjogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKChhZGQgPj0gMTIgfHwgYWRkID09PSAwKSAmJiBQTSlcclxuICAgICAge1xyXG4gICAgICAgIGxldCBhZGRUbXA6IG51bWJlciA9IGFkZCAlIDI0O1xyXG5cclxuICAgICAgICB0aGlzLl9pc1BtID0gKGFkZFRtcCA+PSAxMiAmJiBhZGRUbXAgPCAyNCk7XHJcblxyXG4gICAgICAgIGlmIChhZGRUbXAgPiAxMilcclxuICAgICAgICAgIGRpZiA9IGFkZFRtcCAtIDEyO1xyXG4gICAgICAgIGVsc2UgaWYgKGFkZFRtcCA9PT0gMClcclxuICAgICAgICAgIGRpZiA9IDEyO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGRpZiA9IGFkZFRtcDtcclxuXHJcbiAgICAgICAgbmV3U3RyID0gKChkaWYgPiA5ID8gXCJcIiA6IFwiMFwiKSArIGRpZik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoYWRkID4gOTkgJiYgIVBNKVxyXG4gICAgICAgIG5ld1N0ciA9IFwiOTlcIjtcclxuXHJcbiAgICAgIGlmIChuZXdTdHIgIT0gbnVsbClcclxuICAgICAge1xyXG4gICAgICAgIGN1cnJBZGQuUmVtb3ZlKDAsIGN1cnJBZGQuTGVuZ3RoKTtcclxuICAgICAgICBjdXJyQWRkLkFwcGVuZChuZXdTdHIudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBidWZmZXIuQXBwZW5kKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BcHBlbmQgUE0gb3IgQU0gdG8gdGltZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZFBNMlRpbWUoY3VyclZhbHVlOiBudW1iZXIsIGJ1ZmZlcjogU3RyaW5nQnVpbGRlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIGlmICgoaSA9IHRoaXMuX25ld3ZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkFNXCIsIGN1cnJWYWx1ZSkpICE9PSAtMSlcclxuICAgIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZChcImFtXCIpO1xyXG4gICAgICByZXR1cm4gaSArIDI7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIGlmICgoaSA9IHRoaXMuX25ld3ZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIlBNXCIsIGN1cnJWYWx1ZSkpICE9PSAtMSlcclxuICAgICAge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJwbVwiKTtcclxuICAgICAgICByZXR1cm4gaSArIDI7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5faXNQbSlcclxuICAgICAge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJwbVwiKTtcclxuICAgICAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiYW1cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIGlmIHdoZXJlIGlzICdQTScgcG9zaXRpb25hbCBkaXJlY3RpdmUgaW4gdGhlIFRpbWUgUGljdHVyZTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgLSB0aGVyZSBpcyBQTSwgZWxzZSBmYWxzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldElzUE0oKTogYm9vbGVhbiB7XHJcblxyXG4gICAgZm9yIChsZXQgY3VycjogbnVtYmVyID0gMDsgY3VyciA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBjdXJyKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoY3VycikgPT09IFBJQ0ludGVyZmFjZS5QSUNfUE0pXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWxsVGltZUJ5UmFuZ2UoQ29udGludW91c1JhbmdlOiBMaXN0PHN0cmluZz4sIERpc2NyZXRlUmFuZ2U6IExpc3Q8c3RyaW5nPiwgYnVmZmVyOiBEYXRlKTogRGF0ZSB7XHJcbiAgICBsZXQgIHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0ICBjdXJyVGltZTogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5mcm9tTmF0aXZlVGltZVRvTWdUaW1lTnVtYmVyKGJ1ZmZlciwgcGljKTtcclxuICAgIGxldCBkb3duVGltZTogbnVtYmVyLCB0b3BUaW1lOiBudW1iZXI7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBpZiAoQ29udGludW91c1JhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBDb250aW51b3VzUmFuZ2UubGVuZ3RoIC0gMTsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgZG93blRpbWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl90aW1lKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBmYWxzZSk7XHJcbiAgICAgICAgdG9wVGltZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX3RpbWUoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgZmFsc2UpO1xyXG4gICAgICAgIGlmIChjdXJyVGltZSA+PSBkb3duVGltZSAmJiBjdXJyVGltZSA8PSB0b3BUaW1lKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoRGlzY3JldGVSYW5nZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgRGlzY3JldGVSYW5nZS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGlmIChjdXJyVGltZSA9PT0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfdGltZShEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIGZhbHNlKSlcclxuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShidWZmZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB0aGUgdGltZSBpcyBub3QgaW4gdGhlIHJhbmdlXHJcbiAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8vIFNFUlZJQ0UgZnVuY3Rpb25zXHJcbiAgLy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcHJpbnQgRVJST1IgcHJvbXB0IG1lc3NhZ2UgYWJvdXQgcmFuZ2UgdG8gc3RhdHVzIGJhcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dJZFwiPm9mIGVycm9yIE1lc3NhZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNldFZhbGlkYXRpb25GYWlsZFwiPnZhbGlkYXRpb24gZmFpbGVkPC9wYXJhbT5cclxuICBwcml2YXRlIHByaW50TWVzc2FnZShtc2dJZDogc3RyaW5nLCBzZXRWYWxpZGF0aW9uRmFpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBtZXNzYWdlOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoXCJcIik7XHJcbiAgICBsZXQgY3RybFR5cGU6IE1nQ29udHJvbFR5cGU7XHJcblxyXG4gICAgaWYgKG1zZ0lkID09PSBNc2dJbnRlcmZhY2UuRURUX0VSUl9TVFJfMSlcclxuICAgIHtcclxuICAgICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgICBsZXQgdG9rZW46IHN0cmluZyA9IFwiJWRcIjtcclxuICAgICAgbGV0IG1lc3NhZ2VTdHJpbmc6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKG1zZ0lkKTtcclxuICAgICAgbWVzc2FnZVN0cmluZyA9IFN0clV0aWwucmVwbGFjZVN0cmluZ1Rva2VucyhtZXNzYWdlU3RyaW5nLCB0b2tlbiwgMSwgcGljLmdldFdob2xlcygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICBtZXNzYWdlU3RyaW5nID0gU3RyVXRpbC5yZXBsYWNlU3RyaW5nVG9rZW5zKG1lc3NhZ2VTdHJpbmcsIHRva2VuLCAxLCBwaWMuZ2V0RGVjKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKG1lc3NhZ2VTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhtc2dJZCkpO1xyXG4gICAgICBpZiAobXNnSWQgPT09IE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCAmJiB0aGlzLl92YWxEZXQuZ2V0UmFuZ2UoKSAhPSBudWxsKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0aGlzLl92YWxEZXQuZ2V0UmFuZ2UoKSwgSFRNTF8yX1NUUikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGN0cmxUeXBlID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5UeXBlO1xyXG4gICAgICBpZiAoY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiAmJiBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gJiYgIXRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuaXNTZWxlY3Rpb25DdHJsKCkpXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgbXNnU3RyaW5nOiBzdHJpbmcgPSBtZXNzYWdlLlRvU3RyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLldyaXRlVG9NZXNzYWdlUGFuZShTdHJVdGlsLm1ha2VQcmludGFibGUyKG1zZ1N0cmluZyksIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLkVycm9yT2NjdXJlZCA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkobXNnU3RyaW5nKTtcclxuICAgICAgICB0aGlzLl92YWxEZXQuRXJyb3JNZXNzYWdlID0gbWVzc2FnZS5Ub1N0cmluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc2V0VmFsaWRhdGlvbkZhaWxkKVxyXG4gICAgLy8gZnJvbSB0aGlzIHBvaW50IHRoZSBmb2N1cyBzZW5kIGJhY2sgdG8gY29udHJvbCBhbmQgc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKSBjYW4gbm90IHNldCBpdCB0byB0cnVlXHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5DaGFuZ2UgaW5zaWRlICduZXd2YWx1ZScgc3Vic3RyaW5nIG9uIHBvc2l0aW9uICdpbmRleCcgdG8gc3RyaW5nICd0byc8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3dmFsdWVcIj50byBjaGFuZ2UgaW5zaWRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0b1wiPnN0cmluZyB0byBjaGFuZ2UgYnkgaGltPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbmRleFwiPnRoZSBzdWJzdHJpbmcgdG8gY2hhbmdlIG9uIHRoZSBwb3NpdGlvbjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjaGFuZ2VTdHJpbmdJbnNpZGUodG86IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgaW5kZXgpICsgdG8gKyAgdGhpcy5fbmV3dmFsdWUuc3Vic3RyKGluZGV4ICsgdG8ubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCh2YWxpZGF0aW9uRGV0YWlsczogVmFsaWRhdGlvbkRldGFpbHMpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZhbERldCA9IHZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgdGhpcy5fdmFsRGV0LnNldE51bGwoZmFsc2UpO1xyXG4gICAgdGhpcy5faXNQbSA9IGZhbHNlO1xyXG4gICAgbGV0IHBJQzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgdGhpcy5fb2xkdmFsdWUgPSB0aGlzLl92YWxEZXQuZ2V0T2xkVmFsdWUoKTtcclxuICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fdmFsRGV0LmdldERpc3BWYWx1ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAocElDID09IG51bGwgIHx8IHBJQy5nZXRBdHRyKCkgIT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKVxyXG4gICAgICAgIHRoaXMuX25ld3ZhbHVlID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fb2xkdmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fb2xkdmFsdWUgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKHBJQyA9PT0gbnVsbCB8fCBwSUMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgcElDLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikpIHtcclxuICAgICAgdGhpcy5fcGljdHVyZSA9IHBJQy5nZXRNYXNrKCk7XHJcbiAgICAgIHRoaXMuaGVicmV3ID0gcElDLmlzSGVicmV3KCk7XHJcbiAgICAgIHRoaXMuX3BpY3R1cmUgPSB0aGlzLl9waWN0dXJlLnN1YnN0cigwLCBwSUMuZ2V0TWFza1NpemUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+UmV0dXJuIGluZGV4IG9mIE1heCBtZW1iZXIgaW4gYXJyYXk8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaW5kTWF4KGFycmF5OiBudW1iZXJbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWF4OiBudW1iZXIgPSBhcnJheVtpbmRleF07XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmIChhcnJheVtpXSA+IG1heClcclxuICAgICAge1xyXG4gICAgICAgIG1heCA9IGFycmF5W2ldO1xyXG4gICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBjaGFyIERhdGEgUG9zaXRpb25hbCBEaXJlY3RpdmU8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0RhdGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lZWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01NTVxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfRERERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IWVlZWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEwgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lKXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTIgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlk0IHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBOdW1lcmljIERhdGEgUG9zaXRpb25hbCBEaXJlY3RpdmUgZXhpc3RzPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNEYXRlUG9zaXRpb25hbE51bWVyaWNEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfRERcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfREREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0REREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfVyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IWVlZWVlcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEwgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lKIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMVxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTIgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlk0IHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIGNoYXIgTnVtZXJpYyBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzTnVtZXJpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTik7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBMb2dpYyBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzTG9naWNQb3NpdGlvbmFsRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1gpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5GaW5kIGlmIHRoZSBsZXR0ZXIgYXQgaW5kZXggaXMgUG9zaXRpb25hbCBEYXRlIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjaGFyXCI+dG8gY2hlY2sgaW4gcGljdHVyZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIFBvc2l0aW9uYWwgRGF0ZSBEaXJlY3RpdmU7IGZhbHNlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGlzVGltZVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEggfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1UIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1NTIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1BNIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01TKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBzdHJpbmcgUG9zaXRpb25hbCBEaXJlY3RpdmUgb2YgYW55IHR5cGU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZnVsbC9wYXJ0XCI+b2YgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaW5kZXggb2YgZGlyZWN0aXZlIHBvc2l0aW9uIG9yIC0xIGlmIG5vdCBmb3VuZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGluZGV4T2ZQb3NpdGlvbmFsTm9uRGlyZWN0aXZlKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXA6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICB0bXAgPSBzdHJbaV07XHJcbiAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkgfHwgdGhpcy5pc0RhdGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkgfHwgdGhpcy5pc051bWVyaWNQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcClcclxuICAgICAgICB8fCB0aGlzLmlzTG9naWNQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkgfHwgdGhpcy5pc1RpbWVQb3NpdGlvbmFsRGlyZWN0aXZlKHRtcCkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIHJldHVybiBpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIFwidmFsaWRhdGlvbiBmYWlsZWRcIiBmbGFnPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPnZhbHVlIHRvIHVzZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uRmFpbGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5WYWxpZGF0aW9uRmFpbGVkKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX3ZhbERldC5zZXRWYWxpZGF0aW9uRmFpbGVkKHZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvdW50IGRpZ2l0cyBpbiBzdHJpbmcgYmVmb3JlIGRlbGltZXRlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbnB1dFN0cmluZ1wiPi0gc3RyaW5nIHRvIGxvb2sgaW50byBmb3IgZGVsaW1ldGVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZWFyY2hTdGFydFwiPi0gaW5pdGlhbCBpbmRleCBwb3NpdGlvbiBmb3Igc2VhcmNoIGluIGlucHV0U3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJcIj53ZSBhcmUgbG9va2luZyBmb3I8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGlnaXRzQmVmb3JlRGVsaW1ldGVyKGlucHV0U3RyaW5nOiBzdHJpbmcsIHNlYXJjaFN0YXJ0OiBudW1iZXIsIGRlbGltZXRlcjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBjb3VudGVyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlYXJjaEVuZFBvczogbnVtYmVyID0gaW5wdXRTdHJpbmcuaW5kZXhPZihkZWxpbWV0ZXIsIHNlYXJjaFN0YXJ0KTtcclxuXHJcbiAgICBpZiAoc2VhcmNoRW5kUG9zIDwgMClcclxuICAgICAgc2VhcmNoRW5kUG9zID0gaW5wdXRTdHJpbmcubGVuZ3RoO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHNlYXJjaFN0YXJ0OyBpIDwgc2VhcmNoRW5kUG9zOyBpKyspXHJcbiAgICBpZiAoTkNoYXIuSXNEaWdpdChpbnB1dFN0cmluZ1tpXSkpXHJcbiAgICAgIGNvdW50ZXIrKztcclxuXHJcbiAgICByZXR1cm4gY291bnRlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gYnkgQ3RybCtVIChTZXQgdG8gTnVsbCksIG51bGwgZGlzcGxheSB2YWx1ZSBpcyBzZXQgdG8gY3RybC4gSW4gdGhpcyBjYXNlIHdlIG5lZWQgZm9sbG93aW5nIGNoZWNraW5nICwgaW4gb3JkZXIgdG8gc2V0IGZpZWxkIHRvIG51bGwuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPi0gZW50ZXJlZCB2YWx1ZSB0byB2YWx1ZSB0byBjaGVjazwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpc051bGxEaXNwbGF5VmFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzTnVsbERpc3BsYXlWYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBmaWVsZDogR3VpRmllbGRCYXNlID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGaWVsZCgpO1xyXG5cclxuICAgIGlmIChmaWVsZC5OdWxsQWxsb3dlZCAmJiBmaWVsZC5oYXNOdWxsRGlzcGxheVZhbHVlKCkpXHJcbiAgICB7XHJcbiAgICAgIGxldCBkaXNwRGVmVmFsdWU6IGFueSA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgIGlmIChkaXNwRGVmVmFsdWUgIT09IG51bGwpXHJcbiAgICAgICAgaXNOdWxsRGlzcGxheVZhbCA9IChkaXNwRGVmVmFsdWUudG9TdHJpbmcoKSA9PT0gdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgaXNOdWxsRGlzcGxheVZhbCA9ICh0aGlzLl9uZXd2YWx1ZSA9PT0gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzTnVsbERpc3BsYXlWYWw7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0ZpZWxkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUVULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQW1CLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkUsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsZUFBZSxFQUNoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxjQUFjO0lBWXpCO1FBWFEsY0FBUyxHQUFRLElBQUksQ0FBQztRQUN0QixjQUFTLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLG1CQUFj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QWU7UUFDL0MsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPO2VBQ3ZJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSztlQUNsSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdkssS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1SSxDQUFDO0lBR08sZ0NBQWdDLENBQUMsT0FBZTtRQUN0RCxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdEksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxL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dEMsSUFBSSxLQUFLLEdBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0QsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUNwRDtZQUNFLElBQUksWUFBWSxHQUFRLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFlBQVksS0FBSyxJQUFJO2dCQUN2QixnQkFBZ0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O2dCQUVoRSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGF0ZVRpbWUsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIExpc3QsXHJcbiAgTkNoYXIsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIE51bWJlckZvcm1hdEluZm8sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkRldGFpbHMgfSBmcm9tICcuL1ZhbGlkYXRpb25EZXRhaWxzJztcclxuaW1wb3J0IHsgSUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52L0lFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IE1nQ29udHJvbEJhc2UgfSBmcm9tICcuL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQgeyBHdWlGaWVsZEJhc2UgfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcbmltcG9ydCB7IERhdGVCcmVha1BhcmFtcywgRGlzcGxheUNvbnZlcnRvciB9IGZyb20gJy4vRGlzcGxheUNvbnZlcnRvcic7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZVV0aWwsXHJcbiAgSFRNTF8yX1NUUixcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQSUNJbnRlcmZhY2UsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxEYXRlSnBuLFxyXG4gIFV0aWxTdHJCeXRlTW9kZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbiB9IGZyb20gJy4vV3JvbmdGb3JtYXRFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBQSUMgfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7IERhdGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBIZWJyZXdEYXRlIH0gZnJvbSAnLi9IZWJyZXdEYXRlJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSBcIi4vUHJvcEludGVyZmFjZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWVsZFZhbGlkYXRvciB7XHJcbiAgcHJpdmF0ZSBfbmV3dmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb2xkdmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZVJlYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZUVuYWJsZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF92YWxEZXQ6IFZhbGlkYXRpb25EZXRhaWxzID0gbnVsbDtcclxuICBwcml2YXRlIF9pc1BtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcGljdHVyZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIGhlYnJldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2RlY2ltYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZW52aXJvbm1lbnQ6IElFbnZpcm9ubWVudCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fZW52aXJvbm1lbnQgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudDtcclxuICAgIHRoaXMuX2RlY2ltYWwgPSAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGVjaW1hbCgpIHx8IFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB0aGUgbWFpbiBtZXRob2Qgb2YgdGhpcyBjbGFzczwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxEZXRcIj5hIFZhbGlkYXRpb25EZXRhaWxzIG9iamVjdCB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nPC9wYXJhbT5cclxuICBjaGVja1ZhbCh2YWxEZXQ6IFZhbGlkYXRpb25EZXRhaWxzKTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSAodGhpcy5fb2xkdmFsdWUgPSAodGhpcy5fcGljdHVyZVJlYWwgPSAodGhpcy5fcGljdHVyZUVuYWJsZSA9IG51bGwpKSk7XHJcbiAgICB0aGlzLmluaXQodmFsRGV0KTtcclxuICAgIHZhbERldC5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdmFsRGV0LmdldENvbnRyb2woKTtcclxuICAgIC8vIFRPRE8gLSB1bmNvbW1lbnQgdGhpcyBsaW5lIHdoZW4gJ1BST1BfVFlQRV9NT0RJRllfSU5fUVVFUlknIGlzIHN1cHBvcnRlZCBmb3Igb3RoZXIgY29udHJvbHNcclxuICAgIGxldCBtb2RJblF1ZXV5OiBib29sZWFuID1cclxuICAgICAgY3RybC5pc1JlcGVhdGFibGUoKT8gZmFsc2UgOiAgY3RybC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIGZhbHNlLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSk7XHJcblxyXG4gICAgbGV0IHVzZU5hdGl2ZTogYm9vbGVhbiA9IGN0cmwuaXNNb2RpZmlhYmxlKCk7XHJcblxyXG4gICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRNb2RlKCkgPT09ICdFJyAmJiAhbW9kSW5RdWV1eSkge1xyXG4gICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fb2xkdmFsdWUpO1xyXG4gICAgICByZXR1cm4gdmFsRGV0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgfHwgY3RybC5pc1NlbGVjdGlvbkN0cmwoKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKSB7XHJcbiAgICAgICAgICB2YWxEZXQuc2V0TnVsbChjdHJsLmlzTnVsbFZhbHVlKHRoaXMuX25ld3ZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZSAhPT0gbnVsbCAmJiBjdHJsLmlzU2VsZWN0aW9uQ3RybCgpKSB7XHJcbiAgICAgICAgICBsZXQgaWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlTnVsbChpZHgpKSB7XHJcbiAgICAgICAgICAgIHZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXhfMTExKSB7XHJcbiAgICAgICAgaWYgKGV4XzExMSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleF8xMTE7XHJcbiAgICAgIH1cclxuICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzcGFjZXxub3RoaW5nIHdhcyBpbnNlcnRlZCAgLT4gdXNlIGRlZmF1bHQgdmFsdWVcclxuICAgIGlmIChjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIGN0cmwuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSAmJiBjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgICAgIGlmICgodHlwZW9mIHRoaXMuX25ld3ZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLl9uZXd2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwKSB8fCAoY3RybC5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFICYmIChjdHJsLmlzRGF0ZVplcm8odGhpcy5fbmV3dmFsdWUpIHx8IHRoaXMuaXNOdWxsRGlzcGxheVZhbCgpKSkpIHtcclxuICAgICAgICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWU6IHN0cmluZyA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgICAgICBsZXQgdGV4dDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGZpZWxkLmlzTnVsbERlZmF1bHQoKSkge1xyXG4gICAgICAgICAgICAgIHZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgICAgIHRleHQgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgIGlmIChOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dCkgJiYgY3RybC5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRWYWx1ZSwgdmFsRGV0LmdldFJhbmdlKCksIHZhbERldC5nZXRQSUMoKSwgdXNlTmF0aXZlLCBmaWVsZC5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgdGV4dCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZhdWx0VmFsdWUsIHZhbERldC5nZXRSYW5nZSgpLCB2YWxEZXQuZ2V0UElDKCksIHVzZU5hdGl2ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgoIWZpZWxkLmlzTnVsbERlZmF1bHQoKSAmJiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9PSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT09IG51bGwpKSlcclxuICAgICAgICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRleHQ7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0ZXh0KTtcclxuICAgICAgICAgICAgICByZXR1cm4gdmFsRGV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgfVxyXG5cclxuXHJcbiAgICBpZiAoKHR5cGVvZiB0aGlzLl9uZXd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIShTdHJVdGlsLnJ0cmltKHRoaXMuX25ld3ZhbHVlKSA9PT0gU3RyVXRpbC5ydHJpbSh0aGlzLl9vbGR2YWx1ZSkpKSB8fCBjdHJsLk1vZGlmaWVkQnlVc2VyKVxyXG4gICAge1xyXG4gICAgICB0cnlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodmFsRGV0LmdldFR5cGUoKSlcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrQWxwaGFGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAgIHRoaXMuX3BpY3R1cmVSZWFsID0gdmFsRGV0LmdldFBpY3R1cmVSZWFsKCk7IC8vIG9ubHkgbnVtZXJpYyB0eXBlIG5lZWQgYW5vdGhlciBwaWN0dXJlIGZvcm1hdFxyXG4gICAgICAgICAgICB0aGlzLl9waWN0dXJlRW5hYmxlID0gdmFsRGV0LmdldFBpY3R1cmVFbmFibGUoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja051bWVyaWNQaWN0dXJlKCk7XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrTnVtZXJpY0ZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuY2hlY2tMb2dpY2FsRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja0RhdGVGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrVGltZUZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHJlYWwgcGljdHVyZSB0byBCTE9CLCBkbyBub3RoaW5nXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OT05FOlxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJGaWVsZFZhbGlkYXRvci5jaGVja1ZhbDogVHlwZSBvZiB0aGUgZmllbGQgXCIgKyB2YWxEZXQuZ2V0VHlwZSgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChnb0JhY2spIHtcclxuICAgICAgICBpZiAoZ29CYWNrIGluc3RhbmNlb2YgV3JvbmdGb3JtYXRFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIG5lZWQgY2hhbmdlIHRvIG9sZCB2YWx1ZSwgc2V0IGZvY3VzIGJhY2sgYW5kIHdyaXRlIEVycm9yIE1lc3NhZ2VcclxuICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9vbGR2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQodHJ1ZSk7XHJcbiAgICAgICAgICBpZiAoZ29CYWNrLmdldFR5cGUoKSAhPT0gTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJpbnRNZXNzYWdlKGdvQmFjay5nZXRUeXBlKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbERldDtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgJiB2YWxpZGF0ZSBBbHBoYSBmaWVsZCBieSBoaXMgb2xkL25ldyB2YWx1ZSBhbmQgMiBwaWN0dXJlczpcclxuICAvLy8gUmVhbCBhbmQgRW5hYmxlXHJcbiAgLy8vIDEuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCBwaWN0dXJlcywgb3RoZXJ3aXNlIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyAyLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcmFuZ2VcclxuICAvLy8gMi4xIGNvbXBsZXRlIHZhbHVlLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlICByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gU3RyaW5nIC0gbmV3IHZhbHVlIG9mIHZhbGlkYXRlZCBmaWVsZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrQWxwaGFGaWVsZCgpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKTtcclxuXHJcbiAgICBsZXQgSXNBdHRyQWxwaGE6IGJvb2xlYW4gPSB0aGlzLl92YWxEZXQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpID09PSBudWxsICYmIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChJc0F0dHJBbHBoYSAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKSB7XHJcbiAgICAgIGxldCBwaWNMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQih0aGlzLl9waWN0dXJlKTtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRoaXMuX25ld3ZhbHVlKSA+IHBpY0xlbkIpIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0aGlzLl9uZXd2YWx1ZSwgcGljTGVuQik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID4gdGhpcy5fcGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cigwLCB0aGlzLl9waWN0dXJlLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBjdXJyUGljdHVyZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGN1cnJQaWN0dXJlID0gMDtcclxuXHJcbiAgICBmb3IgKGN1cnJQaWN0dXJlID0gaSA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgY3VyclBpY3R1cmUgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgKSB7XHJcbiAgICAgIGlmICghRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSA9PT0gdGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSB7XHJcbiAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKTtcclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSkgJiYgdGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpICE9PSB0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSk7XHJcbiAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuaXNQb3NzaWJsZUFscGhhTGV0dGVyKGksIGN1cnJQaWN0dXJlKSkge1xyXG4gICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdHJWYWw6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cihpLCAxKTtcclxuICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIoc3RyVmFsKSA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgaWYgKElzQXR0ckFscGhhKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjdXJyUGljdHVyZSArIDEgPCB0aGlzLl9waWN0dXJlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlICsgMSkpICYmIHRoaXMuaXNQb3NzaWJsZUFscGhhTGV0dGVyKGksIGN1cnJQaWN0dXJlICsgMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgIGkgPSBpICsgMTtcclxuICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBsZXQgdHlwZTogTWdDb250cm9sVHlwZSA9IGNvbnRyb2wuVHlwZTtcclxuICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9OVU0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX25ld3ZhbHVlID0gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5maWxsQWxwaGFCeVJhbmdlKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIHRoaXMuX25ld3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGNoYXIgaW4gQWxwaGEgY29tcGxlYXRlIHdpdGggRGlyZWN0aXZlIENoYXJhY3RlciBmb3IgdGhlIGxldHRlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbmRleFwiPm9mIGRpcmVjdGl2ZSBpbiBzdHJpbmcgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBjb21wbGV0ZSwgZmFsc2Ugb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNQb3NzaWJsZUFscGhhTGV0dGVyKGluZGV4SW5wdXQ6IG51bWJlciwgaW5kZXhQaWN0dXJlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChpbmRleFBpY3R1cmUpKSB7XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19YOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSjpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0c6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19TOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVDpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19VOlxyXG4gICAgICAgIGxldCB1cHBlcjogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0udG9VcHBlckNhc2UoKTtcclxuICAgICAgICBpZiAodXBwZXIgIT09IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdKVxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdHJpbmdJbnNpZGUoXCJcIiArIHVwcGVyLCBpbmRleElucHV0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19MOlxyXG4gICAgICAgIGxldCBsb3dlcjogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAobG93ZXIgIT09IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdKVxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VTdHJpbmdJbnNpZGUoXCJcIiArIGxvd2VyLCBpbmRleElucHV0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19OOlxyXG4gICAgICAgIGxldCBudW1iZXIxOiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XTtcclxuICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQobnVtYmVyMSkgfHwgTkNoYXIuSXNXaGl0ZVNwYWNlKG51bWJlcjEpIHx8IFV0aWxTdHJCeXRlTW9kZS5hc051bWVyaWMobnVtYmVyMSkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXJyb3JUb0xvZyhcIkJhZCBBbHBoYSB2YWx1ZS4gU2hvdWxkIGJlIG51bWJlciBvbmx5IG9uIHBsYWNlIE51bS4gXCIgKyBpbmRleElucHV0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2coXCJGaWVsZFZhbGlkYXRvci5pc1Bvc3NpYmxlQWxwaGFMZXR0ZXI6IGlsbGVnYWwgQ2hhciBEaXJlY3RpdmU6IFwiICsgdGhpcy5fcGljdHVyZS5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUoaW5kZXhQaWN0dXJlKSkgKyBcIiBmb3IgXCIgKyB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlmIG5ldyB2YWx1ZSB3YXNuJ3QgZmluaXNoZWQgYW5kIHN0YXkgdW53cml0YWJsZSBwZWFjZXMgb2YgdGhlIFJlYWwgcGljdHVyZSAtIGFkZCBpdFxyXG4gIC8vLyB0byB0aGUgZW5kIG9mIHRoZSBuZXd2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsQWxsQWxwaGEoKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG4gICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUpO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIHRoaXMuX3ZhbERldC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEpIHtcclxuICAgICAgbGV0IGludE5ld3ZhbHVlTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIodGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICBsZXQgc3RyQnVpZWRQaWN0dXJlOiBzdHJpbmcgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fcGljdHVyZSwgaW50TmV3dmFsdWVMZW5CKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gc3RyQnVpZWRQaWN0dXJlLmxlbmd0aDsgaSA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChpKSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAtIDE7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aCAmJiBpID49IDA7IGkrKykge1xyXG4gICAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLmlzQWxwaGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKSkge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q29tcGFyYXRpdmUgbmV3dmFsdWUgd2l0aCBwb3NzaWJsZSBSYW5nZSBpbiBDb250aW51b3VzUmFuZ2VWYWx1ZXMvRGlzY3JldGVSYW5nZVZhbHVlczwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IG5ld3ZhbHVlIGlmIGl0IHBvc3NpYmxlLCBvbGR2YWx1ZSBvdGhlcndpc2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmaWxsQWxwaGFCeVJhbmdlKENvbnRpbnVvdXNSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4pOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB0bXBCdWZmZXI6IHN0cmluZyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZmlsbEFscGhhQnlEaXNjcmV0ZVJhbmdlVmFsdWVzKERpc2NyZXRlUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICB0bXBCdWZmZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZpbGxBbHBoYUJ5Q29udGludW91c1JhbmdlVmFsdWVzKENvbnRpbnVvdXNSYW5nZVZhbHVlcywgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgaWYgKHRtcEJ1ZmZlciAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuXHJcbiAgICAgIGlmIChEaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiB0aGlzLkNvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXMpO1xyXG5cclxuXHJcbiAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX29sZHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlRyeSB0byBjb21wbGV0ZSB0aGUgbmV3dmFsdWUgYnkgUmFuZ2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBjb21wbGV0ZWQgdmFsdWUgaWYgaXQgcG9zc2libGUsIG90aGVyd2lzZSBvbGR2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIENvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICBsZXQgdG1wTmV3VmFsdWU6IHN0cmluZyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuY29tcGxldGVBbHBoYUJ5UmFuZ2UoRGlzY3JldGVSYW5nZVZhbHVlcywgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgaWYgKHRtcE5ld1ZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0bXBOZXdWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb2N1cyBiYWNrXHJcbiAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX29sZHZhbHVlO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIExvZ2ljYWwgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0xvZ2ljYWxGaWVsZCgpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCAmJiB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT09IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuZmlsbEFscGhhQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gIC8vIHRvZG8gOiBuZWVkIHRvIGNoZWNrIHdoYXQgaXMgdG8gaGFuZGxlIGZvciBjaGVja2luZyByYW5nZXNcclxuICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4qKioqKioqKioqKioqKioqKioqKioqKioqKk51bWVyaWMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIE51bWVyaWMgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNGaWVsZCgpOiBhbnkge1xyXG5cclxuICAgIGxldCBldmFsdWF0ZWQ6IGFueTtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5fbmV3dmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFwiMFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGVsaW1ldGVyUmVhbEluZGV4OiBudW1iZXIgPSB0aGlzLl9uZXd2YWx1ZS5pbmRleE9mKHRoaXMuX2RlY2ltYWwpO1xyXG4gICAgICBsZXQgZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIgPSB0aGlzLl9waWN0dXJlUmVhbC5pbmRleE9mKHRoaXMuX2RlY2ltYWwpO1xyXG5cclxuICAgICAgZXZhbHVhdGVkID0gXCJcIjtcclxuICAgICAgbGV0IGV2YWx1YXRlZExlZnQ6IHN0cmluZztcclxuICAgICAgbGV0IGV2YWx1YXRlZFJpZ2h0OiBzdHJpbmc7XHJcblxyXG5cclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBmb3JtYXQgb2YgbmV3dmFsdWUgbWF0Y2hlcyB0aGUgbnVtZXJpYyBtYXNrLlxyXG4gICAgICBpZiAoIXRoaXMuY2hlY2tOdW1lcmljSW5EZWNGb3JtYXQoKSlcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLkVEVF9FUlJfU1RSXzEpO1xyXG5cclxuICAgICAgaWYgKGRlbGltZXRlclBpY3RJbmRleCAhPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGV2YWx1YXRlZExlZnQgPSB0aGlzLmNoZWNrTnVtZXJpY0xlZnQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJSZWFsSW5kZXgpO1xyXG4gICAgICAgIGV2YWx1YXRlZFJpZ2h0ID0gdGhpcy5jaGVja051bWVyaWNSaWdodChkZWxpbWV0ZXJQaWN0SW5kZXgsIGRlbGltZXRlclJlYWxJbmRleCk7XHJcbiAgICAgICAgZXZhbHVhdGVkID0gZXZhbHVhdGVkTGVmdCArIHRoaXMuX2RlY2ltYWwgKyBldmFsdWF0ZWRSaWdodDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoZGVsaW1ldGVyUGljdEluZGV4ICE9PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gdGhpcy5jaGVja051bWVyaWNMZWZ0KGRlbGltZXRlclBpY3RJbmRleCwgTWF0aC5taW4oZGVsaW1ldGVyUGljdEluZGV4LCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGgpKTtcclxuICAgICAgICAgIGV2YWx1YXRlZFJpZ2h0ID0gdGhpcy5jaGVja051bWVyaWNSaWdodChkZWxpbWV0ZXJQaWN0SW5kZXgsIGRlbGltZXRlclBpY3RJbmRleCAtIDEpO1xyXG4gICAgICAgICAgZXZhbHVhdGVkID0gZXZhbHVhdGVkTGVmdCArIHRoaXMuX2RlY2ltYWwgKyBldmFsdWF0ZWRSaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7IC8vIGRlbGltZXRlclBpY3RJbmRleCA9PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggIT0gLTFcclxuICAgICAgICAgIGlmIChkZWxpbWV0ZXJQaWN0SW5kZXggPT09IC0xICYmIGRlbGltZXRlclJlYWxJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5jaGVja051bWVyaWNSaWdodCgtMSwgLTEpO1xyXG4gICAgICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gZXZhbHVhdGVkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkZWxpbWV0ZXJSZWFsSW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgZGVsaW1ldGVyUmVhbEluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoLTEsIC0xKTtcclxuICAgICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IGV2YWx1YXRlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgoZXZhbHVhdGVkUmlnaHQubGVuZ3RoID09PSAwICYmIGV2YWx1YXRlZExlZnQubGVuZ3RoID09PSAwKSB8fCAoZXZhbHVhdGVkLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgIC8vIHNwYWNlfG5vdGhpbmcgd2FzIGluc2VydGVkICAtPiB1c2UgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlO1xyXG4gICAgICAgIGN0cmwgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEd1aUZpZWxkQmFzZSA9IGN0cmwuZ2V0RmllbGQoKTtcclxuICAgICAgICBsZXQgZGVmVmFsdWU6IHN0cmluZyA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOyAvLyBpbm5lciB2YWx1ZSBpbnNlcnRlZFxyXG4gICAgICAgIGxldCBkaXNwRGVmVmFsdWU6IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5pc051bGxEZWZhdWx0KCkpIHtcclxuICAgICAgICAgIHRoaXMuX3ZhbERldC5zZXROdWxsKHRydWUpO1xyXG4gICAgICAgICAgZGlzcERlZlZhbHVlID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3BEZWZWYWx1ZSA9PSBudWxsKVxyXG4gICAgICAgICAgZGlzcERlZlZhbHVlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZlZhbHVlLCB0aGlzLl92YWxEZXQuZ2V0UmFuZ2UoKSwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCBmaWVsZC5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgZGlnaXQgYmVmb3JlIHRoZSBkZWxpbWl0ZXIgZG8gbm90IGV4Y2VlZCB0aGUgcGljIHdob2xlcy5cclxuICAgICAgbGV0IHdob2xlRGlnaXRkaWZmOiBudW1iZXIgPSB0aGlzLmRpZ2l0c0JlZm9yZURlbGltZXRlcihldmFsdWF0ZWQsIDAsIHRoaXMuX2RlY2ltYWwpIC0gdGhpcy5fdmFsRGV0LmdldFBJQygpLmdldFdob2xlcygpO1xyXG4gICAgICAvLyBpZiB0aGV5IGRvLCBjaGVjayBpZiB0aGUgZXhjZWVkaW5nIGNoYXJzIGFyZSB0aGUgcGFkIGNoYXJzLiBpZiBzbywgdGhlcmUgaXMgbm8gZXJyb3IuXHJcbiAgICAgIGlmICh3aG9sZURpZ2l0ZGlmZiA+IDApIHtcclxuICAgICAgICBsZXQgcGFkQ2hhck9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAvLyBpcyB0aGVyZSBhIHBhZCwgY2hlY2sgaXQuIG5vIHBhZCBpcyBhIGNlcnRhaW4gZXJyb3IuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRJc1BhZEZpbGwoKSkge1xyXG4gICAgICAgICAgcGFkQ2hhck9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHdob2xlRGlnaXRkaWZmICYmIHBhZENoYXJPbmx5OyBpKyspXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjaGFyIGlzIG5vdCB0aGUgcGFkLCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IuXHJcbiAgICAgICAgICAgIGlmIChldmFsdWF0ZWRbaV0gIT09IHRoaXMuX3ZhbERldC5nZXRQYWRGaWxsQ2hhcigpKVxyXG4gICAgICAgICAgICAgIHBhZENoYXJPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBhZENoYXJPbmx5KVxyXG4gICAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNOZWdhdGl2ZSgpICYmICh0aGlzLl9uZXd2YWx1ZS50cmltKCkuc3RhcnRzV2l0aChcIi1cIikgfHwgKHRoaXMuX3ZhbERldC5nZXROZWdhdGl2ZVNpZ25QcmVmKCkubGVuZ3RoICE9PSAwICYmIHRoaXMuX25ld3ZhbHVlLnRyaW0oKS5zdGFydHNXaXRoKHRoaXMuX3ZhbERldC5nZXROZWdhdGl2ZVNpZ25QcmVmKCkpKSkpIHtcclxuICAgICAgICBldmFsdWF0ZWQgPSBcIi1cIiArIGV2YWx1YXRlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZnJvbSB0aGlzIHBvaW50IGhhdmUgZXZhbHVhdGVkIHN0cmluZyAtIHRoZSB2YWx1ZSAod2l0aG91dCBtYXNrKSBvZiB0aGUgY29udHJvbFxyXG4gICAgICAvLyBuZWVkZWQgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIHBpY3R1cmVcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRoaXMuX25ld3ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGV2YWx1YXRlZCwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCB0cnVlKTtcclxuXHJcbiAgICAgIC8vIGluIG9yZGVyIGNoZWNrIGlmIHVzZXIgaGFzIGVudGVyZWQgYSBibGFuayB2YWx1ZSAsIHRyaW0gYW5kIHRoZW4gY2hlY2sgaXQncyBsZW5ndGguXHJcbiAgICAgIGxldCB0ZW1wRGlzcFZhbDogc3RyaW5nID0gU3RyVXRpbC5sdHJpbShldmFsdWF0ZWQpO1xyXG4gICAgICBpZiAodGVtcERpc3BWYWwubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRQSUMoKS56ZXJvRmlsbCgpICYmIHRoaXMuX3ZhbERldC5nZXRQSUMoKS5nZXRaZXJvUGFkKCkgPT09ICcgJylcclxuICAgICAgICBldmFsdWF0ZWQgPSBcIjBcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gZnJvbSB0aGlzIHBvaW50IGhhdmUgZXZhbHVhdGVkIHN0cmluZyAtIHRoZSB2YWx1ZSAod2l0aG91dCBtYXNrKSBvZiB0aGUgY29udHJvbFxyXG4gICAgICAvLyBuZWVkZWQgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIHBpY3R1cmVcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRoaXMuX25ld3ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgZXZhbHVhdGVkID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGV2YWx1YXRlZCwgXCJcIiwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCB0cnVlKTtcclxuXHJcbiAgICB9XHJcbiAgICAvLyBJbnNlcnQgdGhlIG51bWJlciB0byByYW5nZVxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSBldmFsdWF0ZWQ7XHJcbiAgICAgIGV2YWx1YXRlZCA9IHRoaXMuZmlsbE51bWVyaWNCeVJhbmdlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXZhbHVhdGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIHZhbGlkaXR5IG9mIG51bWVyaWNhbCBwaWN0dXJlIGZyb20gZm91bmQgJ2RlbGltZXRlcicgdG8gbGVmdC5cclxuICAvLy8gPC0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJQaWN0SW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIHBpY3R1cmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclJlYWxJbmRleFwiPmZvdW5kIGRlbGltZXRlciBpbiB0aGUgaW5zZXJ0ZWQgYnkgdXNlciBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljTGVmdChkZWxpbWV0ZXJQaWN0SW5kZXg6IG51bWJlciwgZGVsaW1ldGVyUmVhbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgUmVhbEluZGV4OiBudW1iZXIgPSBkZWxpbWV0ZXJSZWFsSW5kZXggLSAxO1xyXG4gICAgbGV0IFBpY3RJbmRleDogbnVtYmVyO1xyXG4gICAgbGV0IGlzRm91bmQ6IGJvb2xlYW47XHJcblxyXG4gICAgZm9yIChQaWN0SW5kZXggPSBkZWxpbWV0ZXJQaWN0SW5kZXggLSAxOyBQaWN0SW5kZXggPj0gMCAmJiBSZWFsSW5kZXggPj0gMDsgUGljdEluZGV4LS0pXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAge1xyXG4gICAgICAgIGxldCB0bXBzdG9yYWdlOiBudW1iZXIgPSBSZWFsSW5kZXg7XHJcbiAgICAgICAgaXNGb3VuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4ID49IDA7IFJlYWxJbmRleC0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9waWN0dXJlUmVhbFtQaWN0SW5kZXhdID09PSB0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpc0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgUmVhbEluZGV4LS07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpc0ZvdW5kKVxyXG4gICAgICAgICAgUmVhbEluZGV4ID0gdG1wc3RvcmFnZTtcclxuXHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9waWN0dXJlUmVhbFtQaWN0SW5kZXhdKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjYW4gaW5zZXJ0IG9ubHkgbnVtYmVyXHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIGZvciAoOyBSZWFsSW5kZXggPj0gMDsgUmVhbEluZGV4LS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pO1xyXG4gICAgICAgICAgICBSZWFsSW5kZXgtLTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFJlYWxJbmRleCA8IDAgJiYgUGljdEluZGV4ID49IDApXHJcbiAgICAvLyB0cnkgdG8gYWRkIHVud3JpdGFibGVcclxuICAgICAgZm9yICg7IFBpY3RJbmRleCA+PSAwOyBQaWN0SW5kZXgtLSlcclxuICAgICAge1xyXG4gICAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC8vIG9ubHkgZnJvbSBsZWZ0IG5lZWQgUGFkRmlsbFxyXG4gICAgICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRJc1BhZEZpbGwoKSlcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl92YWxEZXQuZ2V0UGFkRmlsbENoYXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgcmV0dXJuIFN0clV0aWwuUmV2ZXJzZVN0cmluZyhidWZmZXIpLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgdmFsaWRpdHkgb2YgbnVtZXJpY2FsIHBpY3R1cmUgZnJvbSBmb3VuZCAnZGVsaW1ldGVyJyB0byByaWdodC5cclxuICAvLy8gLi0+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJQaWN0SW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIHBpY3R1cmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclJlYWxJbmRleFwiPmZvdW5kIGRlbGltZXRlciBpbiB0aGUgaW5zZXJ0ZWQgYnkgdXNlciBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIsIGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IFJlYWxJbmRleDogbnVtYmVyID0gZGVsaW1ldGVyUmVhbEluZGV4ICsgMTtcclxuICAgIGxldCBQaWN0SW5kZXg6IG51bWJlcjtcclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuXHJcbiAgICBmb3IgKFBpY3RJbmRleCA9IGRlbGltZXRlclBpY3RJbmRleCArIDE7IFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVFbmFibGUubGVuZ3RoICYmIFJlYWxJbmRleCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgUGljdEluZGV4KyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlRW5hYmxlW1BpY3RJbmRleF0gPT09ICcxJylcclxuICAgICAge1xyXG4gICAgICAgIGlmIChSZWFsSW5kZXggPCBQaWN0SW5kZXgpXHJcbiAgICAgICAgICBSZWFsSW5kZXggPSBQaWN0SW5kZXg7XHJcblxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY2FuIGluc2VydCBvbmx5IG51bWJlclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4IDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBSZWFsSW5kZXgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIGRpZ2l0IG9mIGFjdHVhbCBpbnB1dCBkYXRhLiBJZiBpdCBpcyBtYXNrIGNoYXIsIHNraXAgaXQuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSkgJiYgIXBpYy5waWNJc01hc2soUmVhbEluZGV4KSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKTtcclxuICAgICAgICAgICAgUmVhbEluZGV4Kys7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHJpZ2h0IHBhcnQgaGFzIGFueSBpbnB1dCBkYXRhLCB0aGVuIG9ubHkgYXBwZW5kIHVud3JpdGFibGUgY2hhcnNcclxuICAgIGlmIChidWZmZXIuTGVuZ3RoID4gMClcclxuICAgIHtcclxuICAgICAgaWYgKFJlYWxJbmRleCA+PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgUGljdEluZGV4IDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoKVxyXG4gICAgICAvLyB0cnkgdG8gYWRkIHVud3JpdGFibGVcclxuICAgICAgICBmb3IgKDsgUGljdEluZGV4IDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoOyBQaWN0SW5kZXgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgICAgICAvLyBlbHNlIERvIG5vdGhpbmdcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+QlVHOiA0NDI3ODhcclxuICAvLy8gQ2hhbmdpbmcgZGVjaW1hbCBzZXBhcmF0b3IgaW4gdGhldyBwaWN0dXJlUmVhbCB0byB2YWx1ZSBnb3QgZnJvbSBFbnZpcm9ubWVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNQaWN0dXJlKCk6IHZvaWQge1xyXG4gICAgbGV0IGluZGV4T2ZEZWM6IG51bWJlcjtcclxuICAgIGxldCBsYXN0RGVjOiBudW1iZXI7XHJcbiAgICBsZXQgbWF4TGVuZ3RoOiBudW1iZXI7XHJcbiAgICBsZXQgY3VyckluZHg6IG51bWJlcjtcclxuICAgIGxldCBQT0lOVF9ERUM6IHN0cmluZyA9IFwiLlwiOyAvLyB1c2VkIGluIFBJQ1RVUkUgZm9yIGRlY2ltYWwgc2VwYXJhdG9yXHJcblxyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG5cclxuICAgIGlmICh0aGlzLl9waWN0dXJlUmVhbCA9PSBudWxsIHx8IHRoaXMuX3BpY3R1cmVFbmFibGUgPT0gbnVsbCB8fCBwaWMuZ2V0QXR0cigpICE9PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgIXBpYy53aXRoRGVjaW1hbCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGFzdERlYyA9IHRoaXMuX3BpY3R1cmVSZWFsLmxhc3RJbmRleE9mKFBPSU5UX0RFQyk7XHJcbiAgICBtYXhMZW5ndGggPSB0aGlzLl9waWN0dXJlRW5hYmxlLmxlbmd0aDtcclxuICAgIGN1cnJJbmR4ID0gMDtcclxuICAgIHdoaWxlIChjdXJySW5keCA8IGxhc3REZWMpXHJcbiAgICB7XHJcbiAgICAgIGluZGV4T2ZEZWMgPSB0aGlzLl9waWN0dXJlRW5hYmxlLmluZGV4T2YoXCIxXCIsIGN1cnJJbmR4KTtcclxuXHJcbiAgICAgIGlmIChpbmRleE9mRGVjID09PSAtMSlcclxuICAgICAgLy8gbm90IGZvdW5kXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gdGhpcy5fcGljdHVyZVJlYWwuaW5kZXhPZiggUE9JTlRfREVDLCBjdXJySW5keCkpXHJcbiAgICAgICAgLy8gaXQncyByZWFsIGRlY2ltYWwgcG9pbnQgYW5kIG5vdCBcXC4gaW50byB0aGUgcGljdHVyZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBmaXJzdDogc3RyaW5nO1xyXG4gICAgICAgICAgbGV0IHNlY29uZDogc3RyaW5nO1xyXG5cclxuICAgICAgICAgIGZpcnN0ID0gc2Vjb25kID0gXCJcIjtcclxuICAgICAgICAgIGlmIChpbmRleE9mRGVjID09PSAwKVxyXG4gICAgICAgICAgLy8gdGhlIHBvaW50IG9uIHRoZSBmaXJzdCBwbGFjZSAuIyMjXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChpbmRleE9mRGVjICsgMSA8IG1heExlbmd0aClcclxuICAgICAgICAgICAgLy8gb25seSAxIC5cclxuICAgICAgICAgICAgICBzZWNvbmQgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoaW5kZXhPZkRlYyArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoaW5kZXhPZkRlYyA9PT0gbWF4TGVuZ3RoKVxyXG4gICAgICAgICAgLy8gdGhlIHBvaW50IG9uIHRoZSBsYXN0IHBsYWNlICMjIy5cclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmlyc3QgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoMCAsIGluZGV4T2ZEZWMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaXJzdCA9IHRoaXMuX3BpY3R1cmVSZWFsLnN1YnN0cigwICwgaW5kZXhPZkRlYyk7XHJcbiAgICAgICAgICAgIHNlY29uZCA9IHRoaXMuX3BpY3R1cmVSZWFsLnN1YnN0cihpbmRleE9mRGVjICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9waWN0dXJlUmVhbCA9IGZpcnN0ICsgdGhpcy5fZGVjaW1hbCArIHNlY29uZDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY3VyckluZHggPSArK2luZGV4T2ZEZWM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvbXBhcmUgbmV3dmFsdWUgd2l0aCB0aGUgcmFuZ2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXd2YWx1ZSBpZiBpdCdzIGluIHRoZSByYW5nZSwgb2xkdmFsdWUgb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbE51bWVyaWNCeVJhbmdlKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29udHJvbFBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRQSUMoKTtcclxuICAgIGxldCBjb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKTtcclxuICAgIGxldCBkaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpO1xyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBsZXQgY2hlY2tlZFN0cjogc3RyaW5nID0gdGhpcy5zZXROdW1lcmljVmFsdWVXaXRob3V0UGljdHVyZSh0aGlzLl9uZXd2YWx1ZS50b1N0cmluZygpKTtcclxuXHJcblxyXG4gICAgaWYgKGNoZWNrZWRTdHIubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMucHJpbnRNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCwgdHJ1ZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgICBsZXQgY2hlY2tlZE51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUodGhpcy5fbmV3dmFsdWUudG9TdHJpbmcoKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRQSUMoKSwgMCk7XHJcblxyXG4gICAgICBpZiAoZGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkaXNjcmV0ZVJhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VJdGVtVmFsdWUxOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpLCBjb250cm9sUGljLCAwKTtcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoTlVNX1RZUEUubnVtX2NtcChjaGVja2VkTnVtLCByYW5nZUl0ZW1WYWx1ZTEpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXhfQ0MpIHtcclxuICAgICAgICAgICAgLy8gc2tpcCBub24tbnVtZXJpYyByYW5nZSB2YWx1ZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb250aW51b3VzUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29udGludW91c1JhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAgICAgbGV0IHJhbmdlSXRlbVZhbHVlMTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgICAgICAgIGxldCByYW5nZUl0ZW1WYWx1ZTI6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcblxyXG4gICAgICAgICAgcmFuZ2VJdGVtVmFsdWUxLm51bV80X2Ffc3RkKGNvbnRpbnVvdXNSYW5nZVZhbHVlcy5nZXRfSXRlbShpKyspKTtcclxuICAgICAgICAgIHJhbmdlSXRlbVZhbHVlMi5udW1fNF9hX3N0ZChjb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSkpO1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChOVU1fVFlQRS5udW1fY21wKGNoZWNrZWROdW0sIHJhbmdlSXRlbVZhbHVlMSkgIT09IC0xICYmIE5VTV9UWVBFLm51bV9jbXAocmFuZ2VJdGVtVmFsdWUyLCBjaGVja2VkTnVtKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV3dmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChleF8xNUIpIHtcclxuICAgICAgICAgICAgLy8gc2tpcCBub24tbnVtZXJpYyByYW5nZSB2YWx1ZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybnMgYSBudW1lcmljIHZhbHVlIGV4dHJhY3RlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmdcclxuICAvLy8gb24gZmFpbHVyZSByZXR1cm5zIE5FR0FUSVZFX0lORklOSVRZXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj50aGUgc3RyaW5nIHRvIHBhcnNlPC9wYXJhbT5cclxuICBwcml2YXRlIGdldERvdWJsZVZhbCh2YWw6IHN0cmluZyk6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGRvdEZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWludXNGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGRpZ2l0Rm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRPZk51bTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gZmluZCB0aGUgZGVsZW1ldGluZyBub24gbnVtZXJpYyBjaGFyYWN0ZXJcclxuICAgIGZvciAoaSA9IDA7IGkgPCB2YWwubGVuZ3RoICYmICFlbmRPZk51bTsgaSsrKVxyXG4gICAge1xyXG4gICAgICBsZXQgYzogc3RyaW5nID0gdmFsW2ldO1xyXG4gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpXHJcbiAgICAgICAgZGlnaXRGb3VuZCA9IHRydWU7XHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAoYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXNlICctJzpcclxuICAgICAgICAgICAgaWYgKGRpZ2l0Rm91bmQgfHwgZG90Rm91bmQgfHwgbWludXNGb3VuZClcclxuICAgICAgICAgICAgICBlbmRPZk51bSA9IHRydWU7XHJcbiAgICAgICAgICAgIG1pbnVzRm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlICcuJzpcclxuICAgICAgICAgICAgaWYgKGRvdEZvdW5kIHx8IG1pbnVzRm91bmQgJiYgIWRpZ2l0Rm91bmQpXHJcbiAgICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBkb3RGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICBpZiAoZGlnaXRGb3VuZCB8fCBkb3RGb3VuZCB8fCBtaW51c0ZvdW5kKVxyXG4gICAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kT2ZOdW0pIHtcclxuICAgICAgaSA9IGkgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID4gMCkge1xyXG4gICAgICByZXR1cm4gTk51bWJlci5QYXJzZSh2YWwuc3Vic3RyKDAsIGkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLUluZmluaXR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNldCBOdW1lcmljIHZhbHVlIFdpdGhvdXQgUGljdHVyZSwgZmlsdGVyIGlucHV0IGZyb20gdXNlcjwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBwdXJlIG51bWJlciwgd2l0aG91dCBwaWN0dXJlIG1hc2s8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzZXROdW1lcmljVmFsdWVXaXRob3V0UGljdHVyZSh2YWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY2hlY2tlZFN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHZhbC5sZW5ndGgpO1xyXG4gICAgbGV0IGlzRmlyc3REZWNpbWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3VyckNoYXI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcGljdHVyZVJlYWwubGVuZ3RoICYmIGkgPCB2YWwubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGN1cnJDaGFyID0gdmFsW2ldO1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoY3VyckNoYXIpKVxyXG4gICAgICAgIGNoZWNrZWRTdHIuQXBwZW5kKGN1cnJDaGFyKTtcclxuICAgICAgZWxzZSBpZiAoY3VyckNoYXIgPT09IHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKSAmJiAhaXNGaXJzdERlY2ltYWwpXHJcbiAgICAgIHtcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChOU3RyaW5nLlRvQ2hhckFycmF5KE51bWJlckZvcm1hdEluZm8uTnVtYmVyRGVjaW1hbFNlcGFyYXRvcikudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaXNGaXJzdERlY2ltYWwgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnJDaGFyID09PSAnLScgJiYgdGhpcy5fdmFsRGV0LmdldElzTmVnYXRpdmUoKSlcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChOU3RyaW5nLlRvQ2hhckFycmF5KE51bWJlckZvcm1hdEluZm8uTmVnYXRpdmVTaWduKS50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIGlmIChjaGVja2VkU3RyLlRvU3RyaW5nKCkubGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9OVU0sIGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoZWNrZWRTdHIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2sgaWYgbmV3dmFsdWUgZm9ybWF0IG1hdGNoZXMgdGhlIG51bWVyaWMgcGljIGZvcm1hdC48L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY0luRGVjRm9ybWF0KCk6IGJvb2xlYW4ge1xyXG5cclxuXHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IERlYzogbnVtYmVyO1xyXG4gICAgbGV0IFdob2xlOiBudW1iZXI7XHJcbiAgICBsZXQgRGVjUG9zOiBudW1iZXI7XHJcbiAgICBsZXQgZGVjaW1hbENoYXI6IHN0cmluZyA9IHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuXHJcbiAgICAvLyBDb3VudCBudW1iZXIgb2YgZGlnaXRzIGFuZCBwb3NpdGlvbiBvZiBkZWNpbWFsIHBvaW50XHJcblxyXG4gICAgRGVjID0gMDtcclxuICAgIFdob2xlID0gMDtcclxuICAgIERlY1BvcyA9IC0xO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgaWYgKHBpYy5pc051bWVyaWMoaSkpXHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW2ldKSlcclxuICAgICAgICAvLyB3aGVuIGRlYyBwb3Mgbm90IGZvdW5kLCBjb3VudCB3aG9sZXMsIGlmIGZvdW5kLCBjb3VudCBkZWMuXHJcbiAgICAgICAgICBpZiAoRGVjUG9zID49IDApXHJcbiAgICAgICAgICAgIERlYysrO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBXaG9sZSsrO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX25ld3ZhbHVlW2ldID09PSBkZWNpbWFsQ2hhcilcclxuICAgICAgICAgIERlY1BvcyA9IGk7XHJcblxyXG4gICAgLy8gZGlkIHdlIGV4Y2VlZCB0aGUgbWFzayA/XHJcbiAgICBpZiAocGljLmdldFdob2xlcygpIDwgV2hvbGUgfHwgcGljLmdldERlYygpIDwgRGVjKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrICYgdmFsaWRhdGUgRGF0ZSBmaWVsZCBieSBoaXMgb2xkL25ldyB2YWx1ZSBhbmQgMiBwaWN0dXJlczpcclxuICAvLy8gUmVhbCBhbmQgRW5hYmxlXHJcbiAgLy8vIDEuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCBwaWN0dXJlcywgb3RoZXJ3aXNlIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyAyLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcmFuZ2VcclxuICAvLy8gMi4xIGNvbXBsZXRlIHZhbHVlLCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlICByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3IHZhbHVlIG9mIHZhbGlkYXRlZCBmaWVsZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrRGF0ZUZpZWxkKCk6IERhdGUge1xyXG5cclxuICAgIGxldCBuZXdEYXRlOiBEYXRlID0gKHRoaXMuX25ld3ZhbHVlID09IG51bGwgPyBudWxsIDogbmV3IERhdGUodGhpcy5fbmV3dmFsdWUpKTtcclxuICAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmlzRGF0ZVplcm8odGhpcy5fbmV3dmFsdWUpKSB7XHJcbiAgICAgIC8vIGdldCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmaWVsZFxyXG4gICAgICBsZXQgZGVmYXVsdE1nVmFsdWU6IHN0cmluZyA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0RmllbGQoKS5nZXREZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICAgIG5ld0RhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdE1nVmFsdWUsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAvLyByYW5nZSBkYXRlXHJcbiAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9IG51bGwpXHJcbiAgICAgICAgbmV3RGF0ZSA9IHRoaXMuZmlsbERhdGVCeVJhbmdlKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSwgdGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0RhdGU7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFkZCBmb3VuZCBpbiBuZXd2YWx1ZSBudW1iZXJzKDIgb3IgMyBsZXR0ZXJzKSB0byBidWZmZXIgYW5kIHJldHVyblxyXG4gIC8vLyBsYXN0IGZvdW5kIG51bWJlciBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclZhbHVlXCI+aW4gbmV3dmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJ1ZmZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPi0gd2hpY2ggdHlwZSBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZSwgZm9yIGNoZWNraW5nIHZhbGlkaXR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZDJEYXRlKGN1cnJWYWx1ZTogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGN1cnJWYWx1ZTtcclxuICAgIGxldCBjdXJyQWRkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5fbmV3dmFsdWUubGVuZ3RoKTtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSlcclxuICAgIHtcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZOlxyXG4gICAgICAgIGxldHRlcnMgPSAyO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICBsZXR0ZXJzID0gMztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWVlZOlxyXG4gICAgICAgIGxldHRlcnMgPSA0O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgbGV0dGVycyA9IDE7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgbGV0dGVycyA9IDI7XHJcbiAgICAgICAgdHlwZSA9IFBJQ0ludGVyZmFjZS5QSUNfWVk7IC8vIFBJQ19ZSiB3aWxsIGJlIGhhbmRsZWQgYXMgUElDX1lZIGluIHRoaXMgbWV0aG9kLlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChzdGFydCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWUuY2hhckF0KHN0YXJ0KSkpXHJcbiAgICAgIHN0YXJ0Kys7IC8vIGZpbmQgZmlyc3QgZGlnaXRcclxuXHJcblxyXG4gICAgaWYgKHN0YXJ0ID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9uZXd2YWx1ZSA9PT0gXCIwXCIpKSB7XHJcbiAgICAgIGZvciAobGV0IG51bDogbnVtYmVyID0gMDsgbnVsIDwgbGV0dGVyczsgbnVsID0gbnVsICsgMSkge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoJzAnKS8qJzAnKi87XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHN0YXJ0ID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZSArIFwiMFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGV0dGVycyAmJiBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSkpXHJcbiAgICAgICAgY3VyckFkZC5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyQWRkLkxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjdXJyQWRkLkFwcGVuZCgnMCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhZGQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAvLyBib3VuZGFyeSBjb25kaXRpb25zIGNhc2VzOlxyXG4gICAgaWYgKChhZGQgPCAxICYmIHR5cGUgIT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSAmJiB0eXBlICE9PSBQSUNJbnRlcmZhY2UuUElDX1lZKSB8fFxyXG4gICAgICAgKGFkZCA+IDMxICYmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0REIHx8IHR5cGUgPT09ICBQSUNJbnRlcmZhY2UuUElDX0REREQpKSB8fFxyXG4gICAgICAoYWRkID4gMTIgJiYgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQpIHx8IChhZGQgPiA3ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfVykpIHtcclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoYW4gcGljdHVyZSBpcyBZWVlZIGFuZCBpbnNlcnRlZCAwLTIgbnVtYmVycywgdXNlIENFTlRVUkUgdmFsdWUsIG90aGVyd2lzZSBhZGQgemVyb3MgYmVmb3JlIHRoZSB5ZWFyXHJcbiAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZICYmIHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkgPiA5OTkgJiYgY3VyckFkZC5MZW5ndGggPCAzKVxyXG4gICAgICBjdXJyQWRkID0gdGhpcy5jaGVja0NlbnR1cnkoYWRkKTtcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbGV0dGVycyAtIGN1cnJBZGQuTGVuZ3RoOyBqID0gaiArIDEpIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZCgnMCcpLyonMCcqLztcclxuICAgIH1cclxuICAgIGJ1ZmZlci5BcHBlbmQoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuICAgIHJldHVybiAgaTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbGV0dGVycyB0byBidWZmZXIgYW5kIHJldHVyblxyXG4gIC8vLyBsYXN0IGZvdW5kIG51bWJlciBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclZhbHVlXCI+aW4gbmV3dmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxldHRlcnNcIj5hbW91bnQgb2YgbGV0dGVycyB0byBpbnNlcnQgdG8gYnVmZmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY3VyclZhbHVlIGluIG5ld3ZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYWRkTTJEYXRlKGN1cnJWYWx1ZTogbnVtYmVyLCBsZXR0ZXJzOiBudW1iZXIsIGJ1ZmZlcjogU3RyaW5nQnVpbGRlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW107XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB7XHJcbiAgICAgIGlmICh0aGlzLmhlYnJldykge1xyXG4gICAgICAgIGFycmF5ID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBtZXNzYWdlU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuTU9OVEhTX1BUUik7XHJcbiAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtZXNzYWdlU3RyaW5nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cpIHtcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpIHtcclxuICAgICAgICAgIGFycmF5ID0gSGVicmV3RGF0ZS5HZXRMb2NhbERvd3MoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbERheXMoZGF5U3RyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpIHsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgYXJyYXkgPSBVdGlsRGF0ZUpwbi5nZXRBcnJheURvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA8IGN1cnJWYWx1ZSArIGxldHRlcnMpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cihjdXJyVmFsdWUsIGxldHRlcnMpO1xyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRleHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gY3VyclZhbHVlICsgdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXJyVmFsdWUgKyBsZXR0ZXJzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPCBjdXJyVmFsdWUpIHtcclxuICAgICAgY3VyclZhbHVlID0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IG1heDogbnVtYmVyID0gdGhpcy5nZXRNb250aE9yV2Vlayh0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoY3VyclZhbHVlKSwgbGV0dGVycywgdHlwZSk7XHJcblxyXG4gICAgaWYgKGFycmF5W21heF0udHJpbSgpLmxlbmd0aCA+PSBsZXR0ZXJzKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoYXJyYXlbbWF4XS50cmltKCkuc3Vic3RyKDAsIGxldHRlcnMpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKGFycmF5W21heF0udHJpbSgpKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gbGV0dGVycyAtIGFycmF5W21heF0udHJpbSgpLmxlbmd0aDsgaSA+IDA7IGkgPSBpIC0gMSkge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyVmFsdWUgKyBsZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBlbmQgaW5kZXggb2YgZXZlcnkgbnVtZXJpYyBibG9jayBpbiB0aGUgbWFzayBmcm9tIG1hc2tbY3VyclZhbHVlXTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGVuZCBvZiBudW1lcmljIGJsb2NrIGluIG5ld1ZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RW5kT2ZOdW1lcmljQmxvY2soY3VyclZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgd2hpbGUgKGN1cnJWYWx1ZSA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGN1cnJWYWx1ZSkpKSB7XHJcbiAgICAgIGN1cnJWYWx1ZSA9IGN1cnJWYWx1ZSArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmFkZGVkIHN1ZmZpeCB0byByZWxldmFudCBudW1iZXIgb2YgdGhlIGRheTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZERhdGVTdWZmaXgobGFzdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB0aGVudW1iZXI6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UobGFzdCk7XHJcbiAgICBpZiAodGhlbnVtYmVyID09PSAxIHx8IHRoZW51bWJlciA9PT0gMjEgfHwgdGhlbnVtYmVyID09PSAzMSlcclxuICAgICAgcmV0dXJuIFwic3RcIjtcclxuICAgIGVsc2UgaWYgKHRoZW51bWJlciA9PT0gMiB8fCB0aGVudW1iZXIgPT09IDIyKVxyXG4gICAgICByZXR1cm4gXCJuZFwiO1xyXG4gICAgZWxzZSBpZiAodGhlbnVtYmVyID09PSAzIHx8IHRoZW51bWJlciA9PT0gMjMpXHJcbiAgICAgIHJldHVybiBcInJkXCI7XHJcbiAgICByZXR1cm4gXCJ0aFwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBzaXplIG9mIGJsb2NrIGxldHRlcnMgb2YgdHlwZSAndHlwZScsIHdoaWNoIHN0YXJ0IGF0ICdzdGFydCc8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRTaXplT2ZCbG9jayhzdGFydDogbnVtYmVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGxldHRlcnM6IG51bWJlciA9IHN0YXJ0ICsgMTtcclxuICAgIHdoaWxlIChsZXR0ZXJzIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgdGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGxldHRlcnMpID09PSB0eXBlKVxyXG4gICAgbGV0dGVycysrO1xyXG4gICAgcmV0dXJuIGxldHRlcnMgLSBzdGFydDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgU3RyaW5nIHBhcnQvZnVsbCBuYW1lIG9mIG1vbnRoL2RheSBvZiB3ZWVrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vbnRoXCI+cGFydC9mdWxsIG5hbWUgb2YgbW9udGgvZGF5IG9mIHdlZWs8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFwiPm9mIHBvc3NpYmxlIGxldHRlcnMgaW4gbW9udGgvZGF5IG9mIHdlZWssIHNpemUgb2YgYmxvY2sgaW4gcGljdHVyZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZTpcIj5QSUNfICB3ZWVrfG1vbnRoPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG51bWJlciBvZiBtb250aCAxLTEyLCBvciBkYXkgb2Ygd2VlayAxLTc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRNb250aE9yV2Vlayhtb250aF9zdHI6IHN0cmluZywgbGV0dGVyczogbnVtYmVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXTtcclxuXHJcbiAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTU0gfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQpIHtcclxuICAgICAgLy8gTW9udGhcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IG1vbnRoU3RyOiBTdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuTU9OVEhTX1BUUik7XHJcbiAgICAgICAgICBhcnJheSA9IERhdGVVdGlsLmdldExvY2FsTW9udGhzKG1vbnRoU3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XKVxyXG4gICAgICAvLyBXZWVrXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5oZWJyZXcpXHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBkYXlTdHI6IFN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5EQVlTX1BUUik7XHJcbiAgICAgICAgICBhcnJheSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpXHJcbiAgICAgIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAge1xyXG4gICAgICAgIGFycmF5ID0gVXRpbERhdGVKcG4uZ2V0QXJyYXlEb3coKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICByZXR1cm4gMTsgLy8gb25seSB3ZWVrIG9yIG1vbnRoIHBvc3NpYmxlIC0+IGRpZmZhdWx0IDEuXHJcbiAgICAgIH1cclxuXHJcbiAgICBpZiAobGV0dGVycyA+IG1vbnRoX3N0ci5sZW5ndGgpXHJcbiAgICAvLyBjdXQgbGV0dGVyIGlmIGl0J3MgIGVuZCBvZiBzdHJpbmdcclxuICAgICAgbGV0dGVycyA9IG1vbnRoX3N0ci5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAge1xyXG4gICAgICBsZXQgaHN0cjogc3RyaW5nID0gTlN0cmluZy5UcmltU3RhcnQobW9udGhfc3RyKS5zdWJzdHIoMCwgbGV0dGVycykudHJpbSgpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAvLyBzdGFydCBjaGVja2luZyBmcm9tIDFzdCBtZW1iZXIsIGJlY2F1c2UgMCA9IFwiXCJcclxuICAgICAge1xyXG4gICAgICAgIGlmIChhcnJheVtpXS50cmltKCkgPT09IGhzdHIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKGkgPT09IDE0KVxyXG4gICAgICAgICAgICBpID0gNjtcclxuICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIHRoZSBudW1iZXIgaW5zZXJ0ZWQgYW5kIG5vdCBzdHJpbmcgLT4gZmluZCBtb3VudGgvZGF5IG9mIHdlZWsgYnkgbnVtYmVyIDEtMTJ8MS03XHJcblxyXG4gICAgICAgIGxldCBzdHI6IHN0cmluZyA9IG1vbnRoX3N0ci5zdWJzdHIoMCwgbGV0dGVycykudHJpbSgpO1xyXG4gICAgICAgIGxldCBudW1CdWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW2ldKSlcclxuICAgICAgICAgICAgbnVtQnVmZmVyLkFwcGVuZChzdHJbaV0pO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0aGVOdW1iZXI6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UobnVtQnVmZmVyLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlmICh0aGVOdW1iZXIgPCAxKVxyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmICh0aGVOdW1iZXIgPiAxMilcclxuICAgICAgICAgICAgcmV0dXJuIDEyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1dXVyB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19CQilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpZiAodGhlTnVtYmVyID4gNylcclxuICAgICAgICAgICAgcmV0dXJuIDc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGVOdW1iZXI7XHJcbiAgICAgICAgfVxyXG4gICAgY2F0Y2ggKGV4XzIxQSkge1xyXG4gICAgICAgICAgLy8gZG9Ob3RoaW5nX1N0cmluZ0luc2VydGVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAvLyBpbnNlcnRlZCBzdHJpbmcgLSBuYW1lIG9mIG1vbnRofGRheSBvZiB3ZWVrIC0+dHJ5IGlkZW50eWZ5IGl0XHJcbiAgICBsZXQgZm91bmQ6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oYXJyYXkubGVuZ3RoKTtcclxuICAgIGxldCBmcm9tOiBudW1iZXI7XHJcbiAgICBsZXQgbWF4OiBudW1iZXIgPSAtMTsgLy8gbnVtYmVyIG9mIGZvdW5kIG1vbnRoL2RheSBvZiB3ZWVrXHJcblxyXG5cclxuICAgIGZvciAobGV0IHRtcDogbnVtYmVyID0gMTsgdG1wIDwgYXJyYXkubGVuZ3RoOyB0bXArKylcclxuICAgIC8vIHN0YXJ0IGNoZWNraW5nIGZyb20gMXN0IG1lbWJlciwgYmVjYXVzZSAwID0gXCJcIlxyXG4gICAge1xyXG4gICAgICBmb3VuZFt0bXBdID0gMDtcclxuICAgICAgZnJvbSA9IDA7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheVt0bXBdLmxlbmd0aCAmJiBmcm9tIDwgbW9udGhfc3RyLmxlbmd0aCAmJiBpIDwgbGV0dGVyczsgaSsrLCBmcm9tKyspXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoYXJyYXlbdG1wXS50b0xvd2VyQ2FzZSgpW2ldID09PSBtb250aF9zdHIudG9Mb3dlckNhc2UoKVtmcm9tXSlcclxuICAgICAgICAgIGZvdW5kW3RtcF0rKztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGZyb20gPT09IGxldHRlcnMgfHwgZnJvbSA9PT0gYXJyYXlbdG1wXS5sZW5ndGgpXHJcbiAgICAgIC8vIGFsbCBsZXR0ZXJzIGZvdW5kXHJcbiAgICAgIHtcclxuICAgICAgICBtYXggPSB0bXA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF4ID09PSAtMSlcclxuICAgICAgbWF4ID0gdGhpcy5maW5kTWF4KGZvdW5kKTtcclxuICAgIHJldHVybiBtYXg7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIG51bWVyaWMgZGF0YSBhbGxvd2VkIGluIGRhdGVcclxuICAvLy8gcmV0dXJuIHRydWUgaWYgaXQgaXMgYWxsb3dlZCwgb3RoZXJ3aXNlIGZhbHNlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNOdW1iZXJBbGxvd2VkSW5EYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0ZVBvc2l0aW9uYWxOdW1lcmljRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmVbaV0pKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmZpbmQgaWYgYWxsIG51bWJlcnMgb2YgdGhlIG5ldyB1c2VyIGluc2VydGVkIHZhbHVlIGFyZSAwXHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGFsbCBudW1iZXJzIGluIHRoZSBpbnB1dCBhcmUgMCwgb3RoZXJ3aXNlIHRydWU8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0FsbE51bWJlcnMwKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGN1cnJDaHI6IHN0cmluZztcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgY3VyckNociA9IHRoaXMuX25ld3ZhbHVlW2ldO1xyXG5cclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaHIpICYmIGN1cnJDaHIgIT09ICcwJylcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgdmFsaWRpdHkgb2YgWWVhciBmb3IgWVlZWSBwYXJ0IG9mIHRoZSBtYXNrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInllYXJJblwiPmluc2VydGVkIGJ5IHVzZXI8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY2FsY3VsYXRlZCBieSBlbnZpcm9ubWVudC5jZW50dXJ5IHJpZ2h0IHZhbHVlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tDZW50dXJ5KHllYXJJbjogbnVtYmVyKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICBsZXQgb3V0VmFsOiBudW1iZXI7XHJcbiAgICBsZXQgc3RhcnRfY2VudHVyeTogbnVtYmVyID0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeSh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgIGxldCBjZW50dXJ5OiBudW1iZXIgPSBNYXRoLmZsb29yKHN0YXJ0X2NlbnR1cnkgLyAxMDApO1xyXG4gICAgbGV0IHllYXJzOiBudW1iZXIgPSBzdGFydF9jZW50dXJ5ICUgMTAwO1xyXG4gICAgaWYgKHllYXJJbiA+PSB5ZWFycyAmJiB5ZWFySW4gIT09IDApXHJcbiAgICAgIG91dFZhbCA9IChjZW50dXJ5ICogMTAwICsgeWVhckluKTtcclxuICAgIGVsc2VcclxuICAgICAgb3V0VmFsID0gKCgrK2NlbnR1cnkpICogMTAwICsgeWVhckluKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIob3V0VmFsLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIHRoZSBkYXRlIGxlZ2FsIGZvciBwaWN0dXJlIHJhbmdlLCB1c2VkIGZvciB2YWxpZGF0aW9uIGRhdGUgMDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJDb250aW51b3VzUmFuZ2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkRpc2NyZXRlUmFuZ2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj5pbnRlZ2VyIC0gbWFnaWMgZGF0ZSBudW1iZXIgb2YgZGF5cyBmcm9tIDAxLjAxLjAwMDA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaXNEYXRlTGVnYWw0UmFuZ2UoQ29udGludW91c1JhbmdlOiBMaXN0PHN0cmluZz4sIERpc2NyZXRlUmFuZ2U6IExpc3Q8c3RyaW5nPiwgY3VyckRhdGU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZG93bkRhdGU6IG51bWJlcjtcclxuICAgIGxldCB0b3BEYXRlOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgQ29udGludW91c1JhbmdlLmxlbmd0aCAtIDE7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGRvd25EYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIHRvcERhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oKytpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPj0gZG93bkRhdGUgJiYgY3VyckRhdGUgPD0gdG9wRGF0ZSlcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKERpc2NyZXRlUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IERpc2NyZXRlUmFuZ2UubGVuZ3RoOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPT09IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdGhlIGRhdGUgaXMgbm90IGluIHRoZSByYW5nZVxyXG4gICAgLy8gcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgYW5kIGZpbGwgREFURSB0eXBlIGJ5IHJhbmdlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbERhdGVCeVJhbmdlKENvbnRpbnVvdXNSYW5nZTogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlOiBMaXN0PHN0cmluZz4sIGJ1ZmZlcjogRGF0ZSk6IERhdGUge1xyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBkb3duRGF0ZTogbnVtYmVyO1xyXG4gICAgbGV0IHRvcERhdGU6IG51bWJlcjtcclxuXHJcbiAgICBsZXQgY3VyckRhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZyb21OYXRpdmVEYXRlVG9NZ0RhdGVOdW1iZXIoYnVmZmVyLCBwaWMsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBpZiAoQ29udGludW91c1JhbmdlICE9IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICBkb3duRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICB0b3BEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID49IGRvd25EYXRlICYmIGN1cnJEYXRlIDw9IHRvcERhdGUpXHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IERpc2NyZXRlUmFuZ2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY3VyckRhdGUgPT09IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShidWZmZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdGhlIGRhdGUgaXMgbm90IGluIHRoZSByYW5nZVxyXG4gICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGRheSBzdWl0YWJsZSAobm90IGJpZ2dlciB0aGFuIG1heCkgZm9yIFllYXIgYW5kIE1vbnRoPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj51c2VyIGluc2VydGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNEb3lcIj5pcyBwaWN0dXJlIG9mIG5lZWRlZCBkYXkgaXMgREREIC0gZGF5IG9mIHllYXI8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tEYXkoZGF0ZTogc3RyaW5nLCBpc0RveTogYm9vbGVhbik6IFN0cmluZ0J1aWxkZXIge1xyXG5cclxuICAgIGxldCBkYXk6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuREFZKTtcclxuICAgIGlmIChkYXkgPCAyOSAmJiAhaXNEb3kpXHJcbiAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihkYXRlKTtcclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gdGhpcy5nZXREYXRlRWxlbWVudChkYXRlLCBEYXRlRWxlbWVudC5ZRUFSKTtcclxuXHJcbiAgICBpZiAoIWlzRG95KVxyXG4gICAge1xyXG4gICAgICBpZiAoeWVhci50b1N0cmluZygpLmxlbmd0aCA8IDMpXHJcbiAgICAgICAgeWVhciA9IE5OdW1iZXIuUGFyc2UodGhpcy5jaGVja0NlbnR1cnkoeWVhcikuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSkgPT09ICdCJylcclxuICAgICAgICB5ZWFyIC09IFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuXHJcbiAgICAgIGxldCBtb250aDogbnVtYmVyID0gdGhpcy5nZXREYXRlRWxlbWVudChkYXRlLCBEYXRlRWxlbWVudC5NT05USCk7XHJcblxyXG4gICAgICAvLyBpZiBkYXkgbm90IGNvbnNpc3RhaW5lZCB0byB5ZWFyICYgbW9udGggLSBjaGFuZ2UgZGF5XHJcbiAgICAgIGxldCBkYXlNYXg6IG51bWJlciA9IHRoaXMuZ2V0TWF4RGF5SW5Nb250aCh5ZWFyLCBtb250aCk7XHJcbiAgICAgIGlmIChkYXkgPiBkYXlNYXgpXHJcbiAgICAgIHtcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgLy8gaWYgbW9udGggbm90IGNvbnNpc3RhaW5lZCB0byBkYXkoREREKSAtIGNoYW5nZSBtb250aFxyXG4gICAgICBsZXQgbW9udGhSZWFsOiBudW1iZXIgPSB0aGlzLmdldE1vbnRoQnlEYXkoeWVhciwgZGF5KTtcclxuXHJcbiAgICAgIGlmIChtb250aFJlYWwgPCAxIHx8IG1vbnRoUmVhbCA+IDEyKVxyXG4gICAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgaWYgZGF5IG9mIHdlZWsgc3VpdGFibGUgKHJpZ2h0KSBmb3IgWWVhciwgTW9udGggYW5kIERheTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dXNlciBpbnNlcnRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hlY2tXZWVrKGRhdGU6IHN0cmluZyk6IFN0cmluZ0J1aWxkZXIge1xyXG5cclxuICAgIGxldCBkb3c6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuRE9XKTtcclxuXHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZ2V0TmV3RGF0ZUJyZWFrUGFyYW1zKCk7XHJcblxyXG4gICAgbGV0IGRhdGVNYWdpYzogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZShkYXRlLCB0aGlzLl9waWN0dXJlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGVNYWdpYywgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgbGV0IGRvd1JlYWw6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRvdztcclxuICAgIGlmIChkb3dSZWFsICE9PSBkb3dSZWFsKVxyXG4gICAgICBkYXRlID0gdGhpcy5jaGFuZ2VEb3coZGF0ZSwgZG93UmVhbCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGRhdGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgaWYgdGhlIGNvbWJpbmF0aW9uIG9mIEphcGFuZXNlIGVyYSBhbmQgeWVhciBpcyB2YWxpZC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyRGF0ZVwiPnVzZXIgaW5zZXJ0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGRhdGUgc3RyaW5nIG9mIHByb3Blcmx5IEphcGFuZXNlIGVyYTwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrSnBuRXJhWWVhcihzdHJEYXRlOiBzdHJpbmcpOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcyA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZ2V0TmV3RGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICBsZXQgZGF0ZU1hZ2ljOiBudW1iZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlKHN0ckRhdGUsIHRoaXMuX3BpY3R1cmUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGF0ZV9icmVha19kYXRlbW9kZShicmVha1BhcmFtcywgZGF0ZU1hZ2ljLCB0cnVlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBsZXQgaW50WWVhckFEOiBudW1iZXIgPSBicmVha1BhcmFtcy55ZWFyO1xyXG4gICAgbGV0IGludERveTogbnVtYmVyID0gYnJlYWtQYXJhbXMuZG95O1xyXG5cclxuICAgIC8vIGdldCB0aGUgbmFtZSBhbmQgYSB5ZWFyIG9mIHRoZSBlcmFcclxuICAgIGxldCBzdHJFcmFBbHBoYTogc3RyaW5nO1xyXG4gICAgbGV0IHN0ckVyYUthbmppOiBzdHJpbmc7XHJcblxyXG4gICAgc3RyRXJhQWxwaGEgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYShpbnRZZWFyQUQsIGludERveSwgZmFsc2UpO1xyXG4gICAgc3RyRXJhS2FuamkgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYShpbnRZZWFyQUQsIGludERveSwgdHJ1ZSk7XHJcblxyXG4gICAgbGV0IHN0clllYXJKcG5FcmE6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IG51bTogbnVtYmVyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95ZWFyX29mcyhpbnRZZWFyQUQsIGludERveSk7XHJcbiAgICBpZiAobnVtIDw9IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgfVxyXG4gICAgaWYgKG51bSA8PSA5KSB7XHJcbiAgICAgIHN0clllYXJKcG5FcmEuQXBwZW5kKFwiMFwiKTtcclxuICAgIH1cclxuICAgIHN0clllYXJKcG5FcmEuQXBwZW5kKG51bS50b1N0cmluZygpKTtcclxuXHJcbiAgICAvLyBidWlsZCBhIHByb3Blcmx5IHllYXIgb2YgdGhlIGVyYVxyXG5cclxuICAgIC8vIEEgREJDUyBjaGFyYWN0ZXIgaW4gXCJzdHJcIiBjb25zdW1lcyB0d28gY2hhcmFjdGVycyBpbiBcIm1hc2tcIi5cclxuICAgIC8vIElmIFwic3RyXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwibWFza1wiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy5cclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpbnRDbnQ6IG51bWJlciA9IDA7IGludENudCArIGludFBpY0lkeE9mcyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBpbnRDbnQrKylcclxuICAgIHtcclxuICAgICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaW50Q250ICsgaW50UGljSWR4T2ZzKSlcclxuICAgICAge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlkxKTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFBbHBoYSwgaW50Q250ICsgMSwgMSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19KWTIpOlxyXG4gICAgICAgICAgc3RyRGF0ZSA9IFV0aWxTdHJCeXRlTW9kZS5yZXBDKHN0ckRhdGUsIHN0ckVyYUthbmppLCBpbnRDbnQgKyAxLCAxKTtcclxuICAgICAgICAgIGludFBpY0lkeE9mcysrOyAvLyBQSUNfSlkyIGNvbnN1bWVzIDIgY2hhcmFjdGVycyBvZiBwaWN0dXJlICgxIG1vcmUgdGhhbiBzdHJEYXRlKVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlk0KTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFLYW5qaSwgaW50Q250ICsgMSwgMik7XHJcbiAgICAgICAgICBpbnRDbnQrKzsgLy8gUElDX0pZNCBjb25zdW1lcyAyIGNoYXJhY3RlcnMgb2Ygc3RyRGF0ZVxyXG4gICAgICAgICAgaW50UGljSWR4T2ZzICs9IDI7IC8vIFBJQ19KWTQgY29uc3VtZXMgNCBjaGFyYWN0ZXJzIG9mIHBpY3R1cmUgKDIgbW9yZSB0aGFuIHN0ckRhdGUpXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ZSik6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyWWVhckpwbkVyYS50b1N0cmluZygpLCBpbnRDbnQgKyAxLCAyKTtcclxuICAgICAgICAgIGludENudCsrOyAvLyBQSUNfWUogY29uc3VtZXMgMiBjaGFyYWN0ZXJzIG9mIHN0ckRhdGVcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKGludENudCA8IHN0ckRhdGUubGVuZ3RoKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBpZiBcInN0ckRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgbmV4dCBpbmRleCBvZiBcInBpY3R1cmVcIiBoYXMgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChzdHJEYXRlW2ludENudF0pID09PSBmYWxzZSAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgodGhpcy5fcGljdHVyZVtpbnRDbnQgKyBpbnRQaWNJZHhPZnNdKSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKHN0ckRhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBtYXggbnVtYmVyIG9mIGRheSBpbiBtb250aDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb250aFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBtYXggZGF5cyBbMjgtMzFdIG51bWJlcjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE1heERheUluTW9udGgoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogbnVtYmVyW10gPSBbXHJcbiAgICAgIDAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFcclxuICAgIF07XHJcbiAgICBsZXQgbGVhcHllYXI6IGJvb2xlYW4gPSB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcclxuXHJcbiAgICBpZiAobGVhcHllYXIgJiYgbW9udGggPT09IDIpXHJcbiAgICAgIHJldHVybiBhcnJheVttb250aF0gKyAxO1xyXG5cclxuICAgICByZXR1cm4gYXJyYXlbbW9udGhdO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBtb250aCBmb3IgZGF5LCB0aGFuIGRheSBoYXZlIG1hc2sgREREPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInllYXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRheVwiPlswLTM2NV08L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVtYmVyIG9mIG1vbnRoPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TW9udGhCeURheSh5ZWFyOiBudW1iZXIsIGRheTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgTGVhcFllYXI6IGJvb2xlYW47XHJcblxyXG4gICAgTGVhcFllYXIgPSAoeWVhciAlIDQgPT09IDApICYmICgoeWVhciAlIDEwMCAhPT0gMCkgfHwgKHllYXIgJSA0MDAgPT09IDApKTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYi5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKCFMZWFwWWVhcilcclxuICAgICAge1xyXG4gICAgICAgIGlmIChQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW2ldID49IGRheSlcclxuICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlzIExlYXAgWWVhclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoaSA8IDMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbaV0gPj0gZGF5KVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYWRkIDEgZGF5IGFmdGVyIHNlY29uZCBtb250aFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYltpXSArIDEgPj0gZGF5KVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gLy8gZm9yIGxvb3BcclxuICAgIHJldHVybiBpOyAvLyB0aGUgZnVuY3Rpb24gY2Fubid0IGNhbWUgdG8gdGhlIHN0YXRlbWVudCBhbnl0aW1lXHJcbiAgfVxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PmdldCBZZWFyfE1vbnRofERheXxEb3cgb2YgZGF0ZVxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj5kYXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbGVtZW50XCI+cmVxdWlyZWQgZGF0ZSBlbGVtZW50ICh5ZWFyL21vbnRoL2RheS9kb3cpIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlllYXJ8TW9udGh8RGF5fERvdyBvZiBkYXRlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RGF0ZUVsZW1lbnQoZGF0ZTogc3RyaW5nLCBlbGVtZW50OiBEYXRlRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGxldHRlcnM6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXhpdExvb3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwaWNXZWVrVHlwZTogbnVtYmVyID0gUElDSW50ZXJmYWNlLlBJQ19XV1c7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIGxldCBpc0pwbkVyYVllYXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgbGV0IGVyYV95ZWFyOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIEEgREJDUyBjaGFyYWN0ZXIgaW4gXCJkYXRlXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCIuXHJcbiAgICAvLyBJZiBcImRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgcG9zaXRpb24gb2YgXCJwaWN0dXJlXCIgaGFzIHRvIHNraXAgbmV4dCBpbmRleC5cclxuICAgIC8vIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc2tpcHBlZCBpbmRleGVzLlxyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDsgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG5cclxuICAgIGxldCBtaW5MZW46IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSlcclxuICAgICAgbWluTGVuID0gVXRpbFN0ckJ5dGVNb2RlLmdldE1pbkxlblBpY3R1cmUoZGF0ZSwgdGhpcy5fcGljdHVyZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIG1pbkxlbiA9IE1hdGgubWluKGRhdGUubGVuZ3RoLCB0aGlzLl9waWN0dXJlLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSArIGludFBpY0lkeE9mcyA8IG1pbkxlbiAmJiAhZXhpdExvb3A7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRBWSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDMpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREREOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRBWSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7IC8vIG5vdCArNCBuZWVkIG5vdCBzdWZmaXggb2YgJ25kJywgJ3JkJywgJ3N0J1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5NT05USClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgLy8gZ2V0IHNpemUgb2YgUElDX01NTSBibG9ja1xyXG4gICAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0U2l6ZU9mQmxvY2soaSArIGludFBpY0lkeE9mcywgUElDSW50ZXJmYWNlLlBJQ19NTU0pO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50Lk1PTlRIKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCBsZXR0ZXJzKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gbGV0dGVycyAtIDE7XHJcbiAgICAgICAgICBsZXR0ZXJzID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVk6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCA0KTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMSk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfV1dXOlxyXG4gICAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0U2l6ZU9mQmxvY2soaSArIGludFBpY0lkeE9mcywgUElDSW50ZXJmYWNlLlBJQ19XV1cpO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgbGV0dGVycyk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgbGV0dGVycyA9IDA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWTpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEw6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hERDpcclxuICAgICAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBmb3IgaGVicmV3IHlldFxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfQkIpO1xyXG5cclxuICAgICAgICAgIGlmIChpICsgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikgPCBkYXRlLmxlbmd0aClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikpO1xyXG4gICAgICAgICAgICAvLyBpZiBkYXRlIGNvbnRhaW5zIERCQ1MsIHNvbWUgaW5kZXhlcyBvZiBwaWN0dXJlIGhhdmUgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaW50UGljSWR4T2ZzICs9IGxldHRlcnMgLSBidWZmZXIubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgcGljV2Vla1R5cGUgPSBQSUNJbnRlcmZhY2UuUElDX0JCO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGkgKz0gbGV0dGVycyAtIDE7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMTogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlk0OiAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgaXNKcG5FcmFZZWFyID0gdHJ1ZTtcclxuICAgICAgICAgIGludFBpY0lkeE9mcyArPSAyO1xyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZSjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCAyKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSAvLyBzd2l0Y2ggb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICAgICAgfSAvLyBpZiBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZXNcclxuICAgIH0gLy8gZm9yIGxvb3AgaW4gcGljdHVyZVxyXG5cclxuICAgIGlmIChidWZmZXIgPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LllFQVIpXHJcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLk5vdy5ZZWFyO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgYnVmZmVyID0gYnVmZmVyLnRyaW0oKTtcclxuXHJcbiAgICBpZiAobGV0dGVycyA+IDApXHJcbiAgICAvLyBpdCdzIFBJQ19XV1cgb3IgUElDX01NTVxyXG4gICAge1xyXG4gICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuTU9OVEgpXHJcbiAgICAgICAgbGV0dGVycyA9IHRoaXMuZ2V0TW9udGhPcldlZWsoYnVmZmVyLnRvU3RyaW5nKCksIGxldHRlcnMsIFBJQ0ludGVyZmFjZS5QSUNfTU1NKTtcclxuICAgICAgZWxzZSBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuRE9XKVxyXG4gICAgICAgIGxldHRlcnMgPSB0aGlzLmdldE1vbnRoT3JXZWVrKGJ1ZmZlci50b1N0cmluZygpLCBsZXR0ZXJzLCBwaWNXZWVrVHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHdoaWxlIChidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiMFwiKSB8fCBidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiIFwiKSlcclxuICAgICAgICBidWZmZXIgPSBidWZmZXIudG9TdHJpbmcoKS5zdWJzdHIoMSk7XHJcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIGxldHRlcnMgPSAwO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbGV0dGVycyA9IE5OdW1iZXIuUGFyc2UoYnVmZmVyLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSICYmIGlzSnBuRXJhWWVhcilcclxuICAgIHtcclxuICAgICAgLy8gZ2V0IHRoZSBzdGFydCB5ZWFyIG9mIHRoZSBlcmFcclxuICAgICAgZXJhX3llYXIgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmdldFN0YXJ0WWVhck9mRXJhKGRhdGUsIHRoaXMuX3BpY3R1cmUpO1xyXG4gICAgICBpZiAoZXJhX3llYXIgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIGxldHRlcnMgKz0gZXJhX3llYXIgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoYW5nZSBkYXkgbnVtYmVyIGluIGRhdGUgZmllbGQgdG8gZGF5TWF4PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGVcIj50byBjaGFuZ2UgZGF5IGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRheU1heFwiPnRoZSBuZXcgZGF5IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoYW5nZURvdyhkYXRlOiBzdHJpbmcsIGRvdzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBpc0RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXI7XHJcbiAgICBsZXQgc3RhcnRQYXJ0OiBzdHJpbmc7XHJcbiAgICBsZXQgZmluaXNoUGFydDogc3RyaW5nO1xyXG4gICAgbGV0IG51bWJlcjE6IHN0cmluZztcclxuXHJcbiAgICBudW1iZXIxID0gXCJcIiArIGRvdzsgLy8gXCIgXCJcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwiZGF0ZVwiIGNvbnN1bWVzIHR3byBjaGFyYWN0ZXJzIGluIFwicGljdHVyZVwiLlxyXG4gICAgLy8gSWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwicGljdHVyZVwiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy4gKEpQTjogREJDUyBzdXBwb3J0KVxyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpICsgaW50UGljSWR4T2ZzIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgIWlzRGF0ZTsgaSsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGFQb3NpdGlvbmFsRGlyZWN0aXZlKHRoaXMuX3BpY3R1cmVbaSArIGludFBpY0lkeE9mc10pKVxyXG4gICAgICB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaSArIGludFBpY0lkeE9mcykpXHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyAxKTtcclxuICAgICAgICAgIGRhdGUgPSBzdGFydFBhcnQgKyBudW1iZXIxICsgZmluaXNoUGFydDtcclxuICAgICAgICAgIGlzRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfV1dXKTtcclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyBsZXR0ZXJzKTtcclxuICAgICAgICAgIGxldCBkYXlTdHI6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5EQVlTX1BUUik7XHJcbiAgICAgICAgICBsZXQgZGF5TmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgICBudW1iZXIxID0gZGF5TmFtZXNbZG93XTtcclxuXHJcbiAgICAgICAgICBpZiAobnVtYmVyMS5sZW5ndGggPiBsZXR0ZXJzKVxyXG4gICAgICAgICAgICBudW1iZXIxID0gbnVtYmVyMS5zdWJzdHIoMCwgbGV0dGVycyk7XHJcbiAgICAgICAgICBlbHNlIGlmIChudW1iZXIxLmxlbmd0aCA8IGxldHRlcnMpXHJcbiAgICAgICAgICAgIHdoaWxlIChudW1iZXIxLmxlbmd0aCA8IGxldHRlcnMpXHJcbiAgICAgICAgICAgICAgbnVtYmVyMSA9IG51bWJlcjEgKyAnICc7XHJcbiAgICAgICAgICBkYXRlID0gc3RhcnRQYXJ0ICsgbnVtYmVyMSArIGZpbmlzaFBhcnQ7XHJcbiAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfQkIpO1xyXG4gICAgICAgICAgLy8gXCJsZXR0ZXJzXCIgbWVhbnMgYSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBcInBpY3R1cmVcIlxyXG5cclxuICAgICAgICAgIHN0YXJ0UGFydCA9IGRhdGUuc3Vic3RyKDAsIGkpO1xyXG4gICAgICAgICAgZmluaXNoUGFydCA9IGRhdGUuc3Vic3RyKGkgKyBNYXRoLmZsb29yKGxldHRlcnMgLyAyKSk7XHJcbiAgICAgICAgICAvLyBcImxldHRlcnMgLyAyXCIgbWVhbnMgYSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBcImRhdGVcIlxyXG5cclxuICAgICAgICAgIG51bWJlcjEgPSBVdGlsRGF0ZUpwbi5nZXRTdHJEb3coZG93KTtcclxuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPiBsZXR0ZXJzKVxyXG4gICAgICAgICAgICBudW1iZXIxID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKG51bWJlcjEsIGxldHRlcnMpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICB3aGlsZSAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIobnVtYmVyMSkgPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICAgIG51bWJlcjEgPSBudW1iZXIxICsgJyAnO1xyXG4gICAgICAgICAgZGF0ZSA9IHN0YXJ0UGFydCArIG51bWJlcjEgKyBmaW5pc2hQYXJ0O1xyXG4gICAgICAgICAgaXNEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpXHJcbiAgICAgICAgICAvLyBKUE46IERCQ1Mgc3VwcG9ydFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaSA8IGRhdGUubGVuZ3RoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIG5leHQgaW5kZXggb2YgXCJwaWN0dXJlXCIgaGFzIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChkYXRlW2ldKSA9PT0gZmFsc2UgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHRoaXMuX3BpY3R1cmVbaSArIGludFBpY0lkeE9mc10pID09PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9IC8vIHN3aXRjaFxyXG4gICAgICAgIH0gLy8gaWYgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIFRpbWUgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja1RpbWVGaWVsZCgpOiBEYXRlIHtcclxuICAgIGxldCBuZXdUaW1lOiBEYXRlID0gbmV3IERhdGUgKHRoaXMuX25ld3ZhbHVlKTtcclxuXHJcblxyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSkge1xyXG4gICAgICAvLyBnZXQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgICAgbGV0IGRlZmF1bHRNZ1ZhbHVlOiBzdHJpbmcgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCkuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIG5ld1RpbWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdE1nVmFsdWUsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG4gICAgICAvLyByYW5nZSBvZiB0aGUgdGltZVxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPSBudWxsKVxyXG4gICAgICAgIG5ld1RpbWUgPSB0aGlzLmZpbGxUaW1lQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCksIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdUaW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFkZCBmb3VuZCBpbiBuZXd2YWx1ZSBudW1iZXJzKDIob3IgMSkgbGV0dGVycykgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj4vLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+d2hpY2ggdHlwZSBvZiBwb3NpdGlvbmFsIGRpcmVjdGl2ZSwgZm9yIGNoZWNraW5nIHZhbGlkaXR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZDJUaW1lKGN1cnJWYWx1ZTogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGN1cnJWYWx1ZTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgU1RSXzAwOiBTdHJpbmcgPSBcIjAwXCI7XHJcbiAgICBsZXQgIGN1cnJBZGQ6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIHdoaWxlIChzdGFydCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQodGhpcy5fbmV3dmFsdWVbc3RhcnRdKSlcclxuICAgIHtcclxuICAgICAgc3RhcnQrKzsgLy8gZmluZCBmaXJzdCBkaWdpdFxyXG4gICAgICAvLyBub24tZGlnaXRzIHdlcmUgZm91bmQgaW4gaW5wdXQgc3RyaW5nXHJcbiAgICAgIC8vIHdlIGRvIG5vdCB0aHJvdyBTVFJfRVJSX1RJTUUgZXhjZXB0aW9uIHRvIHByZXZlbnQgaW5wdXQgZGlnaXRzIGxvc3RcclxuICAgICAgLy8gb24gbm9uLWRpZ2l0cyBwbGFjZSBTVFJfMDAgd2lsbCBiZSBhZGRlZFxyXG4gICAgICAvLyBTaW5jZSBNYXNrIEVkaXRpbmcgLiBUaGlzIGVycm9yIGlzIGlycmVsZXZhbnQuIFRpbWUgbm93LCBhbHdheXMgY29udGFpbnMgbm9uIGRpZ2l0cyBsaWtlIDogYW5kIG1pZ2h0IGNvbnRhaW4gJyAnIGZvciB1bmZpbGxlZCBjaGFycy5cclxuICAgICAgLy8gVGhpcyBpcyBhIHZhbGlkIGNhc2UgYW5kIHdlIGRvIG5vdCB3YW50IGFuIGVycm9yIHBvcHBpbmcgYWJvdXQgaXQuXHJcbiAgICAgIC8vICBndWlNYW5hZ2VyLndyaXRlVG9NZXNzYWdlUGFuZSh2YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCksIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TWVzc2FnZVN0cmluZyhTVFJfRVJSX1RJTUUpLCBTdGF0dXNCYXJNZXNzYWdlVHlwZS5TQl9SVU5USU1FX01TRyk7XHJcbiAgICAgIC8vICBzZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoKVxyXG4gICAgLy8gbm90IGZvdW5kIG1vcmUgZGlnaXRzXHJcbiAgICB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoU1RSXzAwLnRvU3RyaW5nKCkpO1xyXG4gICAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyAyICYmIGkgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW2ldKSlcclxuICAgICAgICBjdXJyQWRkLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtpXSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAge1xyXG4gICAgICAgIGN1cnJBZGQuSW5zZXJ0KDAsICcwJyk7IC8vIG9ubHkgMSBkaWdpdCBmb3VuZFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGkgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiBpID09PSBzdGFydCArIDEpXHJcbiAgICAgIGN1cnJBZGQuSW5zZXJ0KDAsICcwJyk7XHJcbiAgICAvLyBvbmx5IDEgZGlnaXQgZm91bmRcclxuICAgIGVsc2UgaWYgKGkgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aCAmJiBpID09PSBzdGFydClcclxuICAgICAgY3VyckFkZC5BcHBlbmQoU1RSXzAwLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgIGxldCBhZGQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAvKmlmIChhZGQgPCAwKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiMDBcIik7XHJcbiAgICBlbHNlIGlmIChhZGQgPiA1OSAmJiB0eXBlPT1QSUNfTU1UKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiNTlcIik7XHJcbiAgICBlbHNlIGlmIChhZGQgPiA1OSAmJiB0eXBlPT1QSUNfU1MpXHJcbiAgICBjdXJyQWRkPW5ldyBTdHJpbmdCdWZmZXIoXCI1OVwiKTsqL1xyXG4gICAgaWYgKGFkZCA8IDAgfHwgKGFkZCA+IDU5ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1UKSB8fCAoYWRkID4gNTkgJiYgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19TUykpXHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9USU1FKTtcclxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfSEgpXHJcbiAgICB7XHJcbiAgICAgIGxldCBQTTogYm9vbGVhbiA9IHRoaXMuZ2V0SXNQTSgpO1xyXG4gICAgICBsZXQgbmV3U3RyOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgICBsZXQgZGlmOiBudW1iZXI7XHJcblxyXG4gICAgICBpZiAoKGFkZCA+PSAxMiB8fCBhZGQgPT09IDApICYmIFBNKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IGFkZFRtcDogbnVtYmVyID0gYWRkICUgMjQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzUG0gPSAoYWRkVG1wID49IDEyICYmIGFkZFRtcCA8IDI0KTtcclxuXHJcbiAgICAgICAgaWYgKGFkZFRtcCA+IDEyKVxyXG4gICAgICAgICAgZGlmID0gYWRkVG1wIC0gMTI7XHJcbiAgICAgICAgZWxzZSBpZiAoYWRkVG1wID09PSAwKVxyXG4gICAgICAgICAgZGlmID0gMTI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZGlmID0gYWRkVG1wO1xyXG5cclxuICAgICAgICBuZXdTdHIgPSAoKGRpZiA+IDkgPyBcIlwiIDogXCIwXCIpICsgZGlmKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhZGQgPiA5OSAmJiAhUE0pXHJcbiAgICAgICAgbmV3U3RyID0gXCI5OVwiO1xyXG5cclxuICAgICAgaWYgKG5ld1N0ciAhPSBudWxsKVxyXG4gICAgICB7XHJcbiAgICAgICAgY3VyckFkZC5SZW1vdmUoMCwgY3VyckFkZC5MZW5ndGgpO1xyXG4gICAgICAgIGN1cnJBZGQuQXBwZW5kKG5ld1N0ci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlci5BcHBlbmQoY3VyckFkZC5Ub1N0cmluZygpKTtcclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkFwcGVuZCBQTSBvciBBTSB0byB0aW1lPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYWRkUE0yVGltZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKChpID0gdGhpcy5fbmV3dmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiQU1cIiwgY3VyclZhbHVlKSkgIT09IC0xKVxyXG4gICAge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKFwiYW1cIik7XHJcbiAgICAgIHJldHVybiBpICsgMjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgaWYgKChpID0gdGhpcy5fbmV3dmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiUE1cIiwgY3VyclZhbHVlKSkgIT09IC0xKVxyXG4gICAgICB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcInBtXCIpO1xyXG4gICAgICAgIHJldHVybiBpICsgMjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLl9pc1BtKVxyXG4gICAgICB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcInBtXCIpO1xyXG4gICAgICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJhbVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hlY2sgaWYgd2hlcmUgaXMgJ1BNJyBwb3NpdGlvbmFsIGRpcmVjdGl2ZSBpbiB0aGUgVGltZSBQaWN0dXJlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSAtIHRoZXJlIGlzIFBNLCBlbHNlIGZhbHNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0SXNQTSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBmb3IgKGxldCBjdXJyOiBudW1iZXIgPSAwOyBjdXJyIDwgdGhpcy5fcGljdHVyZS5sZW5ndGg7IGN1cnIrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChjdXJyKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19QTSlcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxUaW1lQnlSYW5nZShDb250aW51b3VzUmFuZ2U6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZTogTGlzdDxzdHJpbmc+LCBidWZmZXI6IERhdGUpOiBEYXRlIHtcclxuICAgIGxldCAgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgIGN1cnJUaW1lOiBudW1iZXIgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZyb21OYXRpdmVUaW1lVG9NZ1RpbWVOdW1iZXIoYnVmZmVyLCBwaWMpO1xyXG4gICAgbGV0IGRvd25UaW1lOiBudW1iZXIsIHRvcFRpbWU6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgIGlmIChDb250aW51b3VzUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBkb3duVGltZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX3RpbWUoQ29udGludW91c1JhbmdlLmdldF9JdGVtKGkpLCBwaWMsIGZhbHNlKTtcclxuICAgICAgICB0b3BUaW1lID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfdGltZShDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oKytpKSwgcGljLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGN1cnJUaW1lID49IGRvd25UaW1lICYmIGN1cnJUaW1lIDw9IHRvcFRpbWUpXHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGN1cnJUaW1lID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl90aW1lKERpc2NyZXRlUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgZmFsc2UpKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSB0aW1lIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLy8gU0VSVklDRSBmdW5jdGlvbnNcclxuICAvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwcmludCBFUlJPUiBwcm9tcHQgbWVzc2FnZSBhYm91dCByYW5nZSB0byBzdGF0dXMgYmFyPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ0lkXCI+b2YgZXJyb3IgTWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2V0VmFsaWRhdGlvbkZhaWxkXCI+dmFsaWRhdGlvbiBmYWlsZWQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgcHJpbnRNZXNzYWdlKG1zZ0lkOiBzdHJpbmcsIHNldFZhbGlkYXRpb25GYWlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihcIlwiKTtcclxuICAgIGxldCBjdHJsVHlwZTogTWdDb250cm9sVHlwZTtcclxuXHJcbiAgICBpZiAobXNnSWQgPT09IE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKVxyXG4gICAge1xyXG4gICAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICAgIGxldCB0b2tlbjogc3RyaW5nID0gXCIlZFwiO1xyXG4gICAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcobXNnSWQpO1xyXG4gICAgICBtZXNzYWdlU3RyaW5nID0gU3RyVXRpbC5yZXBsYWNlU3RyaW5nVG9rZW5zKG1lc3NhZ2VTdHJpbmcsIHRva2VuLCAxLCBwaWMuZ2V0V2hvbGVzKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIG1lc3NhZ2VTdHJpbmcgPSBTdHJVdGlsLnJlcGxhY2VTdHJpbmdUb2tlbnMobWVzc2FnZVN0cmluZywgdG9rZW4sIDEsIHBpYy5nZXREZWMoKS50b1N0cmluZygpKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQobWVzc2FnZVN0cmluZyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKG1zZ0lkKSk7XHJcbiAgICAgIGlmIChtc2dJZCA9PT0gTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUICYmIHRoaXMuX3ZhbERldC5nZXRSYW5nZSgpICE9IG51bGwpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHRoaXMuX3ZhbERldC5nZXRSYW5nZSgpLCBIVE1MXzJfU1RSKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgY3RybFR5cGUgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLlR5cGU7XHJcbiAgICAgIGlmIChjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmIGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyAmJiAhdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc1NlbGVjdGlvbkN0cmwoKSlcclxuICAgICAge1xyXG4gICAgICAgIGxldCBtc2dTdHJpbmc6IHN0cmluZyA9IG1lc3NhZ2UuVG9TdHJpbmcoKTtcclxuICAgICAgICB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuV3JpdGVUb01lc3NhZ2VQYW5lKFN0clV0aWwubWFrZVByaW50YWJsZTIobXNnU3RyaW5nKSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuRXJyb3JPY2N1cmVkID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShtc2dTdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuX3ZhbERldC5FcnJvck1lc3NhZ2UgPSBtZXNzYWdlLlRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChzZXRWYWxpZGF0aW9uRmFpbGQpXHJcbiAgICAvLyBmcm9tIHRoaXMgcG9pbnQgdGhlIGZvY3VzIHNlbmQgYmFjayB0byBjb250cm9sIGFuZCBzZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpIGNhbiBub3Qgc2V0IGl0IHRvIHRydWVcclxuICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoYW5nZSBpbnNpZGUgJ25ld3ZhbHVlJyBzdWJzdHJpbmcgb24gcG9zaXRpb24gJ2luZGV4JyB0byBzdHJpbmcgJ3RvJzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXd2YWx1ZVwiPnRvIGNoYW5nZSBpbnNpZGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRvXCI+c3RyaW5nIHRvIGNoYW5nZSBieSBoaW08L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluZGV4XCI+dGhlIHN1YnN0cmluZyB0byBjaGFuZ2Ugb24gdGhlIHBvc2l0aW9uPC9wYXJhbT5cclxuICBwcml2YXRlIGNoYW5nZVN0cmluZ0luc2lkZSh0bzogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuX25ld3ZhbHVlLnN1YnN0cigwLCBpbmRleCkgKyB0byArICB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoaW5kZXggKyB0by5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0KHZhbGlkYXRpb25EZXRhaWxzOiBWYWxpZGF0aW9uRGV0YWlscyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFsRGV0ID0gdmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICB0aGlzLl92YWxEZXQuc2V0TnVsbChmYWxzZSk7XHJcbiAgICB0aGlzLl9pc1BtID0gZmFsc2U7XHJcbiAgICBsZXQgcElDOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICB0aGlzLl9vbGR2YWx1ZSA9IHRoaXMuX3ZhbERldC5nZXRPbGRWYWx1ZSgpO1xyXG4gICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl92YWxEZXQuZ2V0RGlzcFZhbHVlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX25ld3ZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIGlmIChwSUMgPT0gbnVsbCAgfHwgcElDLmdldEF0dHIoKSAhPSBTdG9yYWdlQXR0cmlidXRlLkRBVEUpXHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9vbGR2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9vbGR2YWx1ZSA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEocElDID09PSBudWxsIHx8IHBJQy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCBwSUMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSkge1xyXG4gICAgICB0aGlzLl9waWN0dXJlID0gcElDLmdldE1hc2soKTtcclxuICAgICAgdGhpcy5oZWJyZXcgPSBwSUMuaXNIZWJyZXcoKTtcclxuICAgICAgdGhpcy5fcGljdHVyZSA9IHRoaXMuX3BpY3R1cmUuc3Vic3RyKDAsIHBJQy5nZXRNYXNrU2l6ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5SZXR1cm4gaW5kZXggb2YgTWF4IG1lbWJlciBpbiBhcnJheTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbmRNYXgoYXJyYXk6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtYXg6IG51bWJlciA9IGFycmF5W2luZGV4XTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKGFycmF5W2ldID4gbWF4KVxyXG4gICAgICB7XHJcbiAgICAgICAgbWF4ID0gYXJyYXlbaV07XHJcbiAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIGNoYXIgRGF0YSBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTUQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0REIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0RERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1dcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfV1dXIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ITCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWUpcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIE51bWVyaWMgRGF0YSBQb3NpdGlvbmFsIERpcmVjdGl2ZSBleGlzdHM8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0RhdGVQb3NpdGlvbmFsTnVtZXJpY0RpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01NRCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERFxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfRERERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWVxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ITCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWUogfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBOdW1lcmljIFBvc2l0aW9uYWwgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNOdW1lcmljUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19OKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBjaGFyIExvZ2ljIFBvc2l0aW9uYWwgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNMb2dpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkZpbmQgaWYgdGhlIGxldHRlciBhdCBpbmRleCBpcyBQb3NpdGlvbmFsIERhdGUgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNoYXJcIj50byBjaGVjayBpbiBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgUG9zaXRpb25hbCBEYXRlIERpcmVjdGl2ZTsgZmFsc2Ugb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNUaW1lUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ISCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTVQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfU1MgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfUE0gfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTVMpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIHN0cmluZyBQb3NpdGlvbmFsIERpcmVjdGl2ZSBvZiBhbnkgdHlwZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmdWxsL3BhcnRcIj5vZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbmRleCBvZiBkaXJlY3RpdmUgcG9zaXRpb24gb3IgLTEgaWYgbm90IGZvdW5kPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5kZXhPZlBvc2l0aW9uYWxOb25EaXJlY3RpdmUoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcDogc3RyaW5nO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIHRtcCA9IHN0cltpXTtcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzTnVtZXJpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG1wKVxyXG4gICAgICAgIHx8IHRoaXMuaXNMb2dpY1Bvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSB8fCB0aGlzLmlzVGltZVBvc2l0aW9uYWxEaXJlY3RpdmUodG1wKSlcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgcmV0dXJuIGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNldCB0aGUgXCJ2YWxpZGF0aW9uIGZhaWxlZFwiIGZsYWc8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+dmFsdWUgdG8gdXNlPC9wYXJhbT5cclxuICBwcml2YXRlIHNldFZhbGlkYXRpb25GYWlsZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LlZhbGlkYXRpb25GYWlsZWQpXHJcbiAgICAgIHJldHVybjtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fdmFsRGV0LnNldFZhbGlkYXRpb25GYWlsZWQodmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ291bnQgZGlnaXRzIGluIHN0cmluZyBiZWZvcmUgZGVsaW1ldGVyPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlucHV0U3RyaW5nXCI+LSBzdHJpbmcgdG8gbG9vayBpbnRvIGZvciBkZWxpbWV0ZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlYXJjaFN0YXJ0XCI+LSBpbml0aWFsIGluZGV4IHBvc2l0aW9uIGZvciBzZWFyY2ggaW4gaW5wdXRTdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltZXRlclwiPndlIGFyZSBsb29raW5nIGZvcjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBkaWdpdHNCZWZvcmVEZWxpbWV0ZXIoaW5wdXRTdHJpbmc6IHN0cmluZywgc2VhcmNoU3RhcnQ6IG51bWJlciwgZGVsaW1ldGVyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvdW50ZXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgc2VhcmNoRW5kUG9zOiBudW1iZXIgPSBpbnB1dFN0cmluZy5pbmRleE9mKGRlbGltZXRlciwgc2VhcmNoU3RhcnQpO1xyXG5cclxuICAgIGlmIChzZWFyY2hFbmRQb3MgPCAwKVxyXG4gICAgICBzZWFyY2hFbmRQb3MgPSBpbnB1dFN0cmluZy5sZW5ndGg7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gc2VhcmNoU3RhcnQ7IGkgPCBzZWFyY2hFbmRQb3M7IGkrKylcclxuICAgIGlmIChOQ2hhci5Jc0RpZ2l0KGlucHV0U3RyaW5nW2ldKSlcclxuICAgICAgY291bnRlcisrO1xyXG5cclxuICAgIHJldHVybiBjb3VudGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBieSBDdHJsK1UgKFNldCB0byBOdWxsKSwgbnVsbCBkaXNwbGF5IHZhbHVlIGlzIHNldCB0byBjdHJsLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCBmb2xsb3dpbmcgY2hlY2tpbmcgLCBpbiBvcmRlciB0byBzZXQgZmllbGQgdG8gbnVsbC48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+LSBlbnRlcmVkIHZhbHVlIHRvIHZhbHVlIHRvIGNoZWNrPC9wYXJhbT5cclxuICBwcml2YXRlIGlzTnVsbERpc3BsYXlWYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNOdWxsRGlzcGxheVZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCk7XHJcblxyXG4gICAgaWYgKGZpZWxkLk51bGxBbGxvd2VkICYmIGZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSlcclxuICAgIHtcclxuICAgICAgbGV0IGRpc3BEZWZWYWx1ZTogYW55ID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgaWYgKGRpc3BEZWZWYWx1ZSAhPT0gbnVsbClcclxuICAgICAgICBpc051bGxEaXNwbGF5VmFsID0gKGRpc3BEZWZWYWx1ZS50b1N0cmluZygpID09PSB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpc051bGxEaXNwbGF5VmFsID0gKHRoaXMuX25ld3ZhbHVlID09PSBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNOdWxsRGlzcGxheVZhbDtcclxuICB9XHJcbn1cclxuIl19