@magic-xpa/gui 4.800.0-dev480.13 → 4.800.0-dev480.133

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 (103) hide show
  1. package/bundles/magic-xpa-gui.umd.js +1057 -7516
  2. package/bundles/magic-xpa-gui.umd.js.map +1 -1
  3. package/bundles/magic-xpa-gui.umd.min.js +1 -1
  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 +7 -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 +2 -465
  29. package/esm2015/src/gui/low/Style.js +1 -9
  30. package/esm2015/src/management/RuntimeContextBase.js +9 -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 +4 -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 +56 -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 +1 -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 +859 -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 +1 -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/Style.d.ts +0 -3
  90. package/src/management/data/GuiDataViewBase.d.ts +4 -4
  91. package/src/management/data/IRecord.d.ts +1 -1
  92. package/src/management/exp/ExpressionInterface.d.ts +3 -0
  93. package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
  94. package/src/management/gui/ControlTable.d.ts +1 -1
  95. package/src/management/gui/DisplayConvertor.d.ts +1 -1
  96. package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
  97. package/src/management/gui/MgControlBase.d.ts +8 -7
  98. package/src/management/gui/MgFormBase.d.ts +6 -6
  99. package/src/management/gui/PIC.d.ts +1 -0
  100. package/src/management/gui/PropInterface.d.ts +3 -4
  101. package/src/management/gui/PropTable.d.ts +4 -5
  102. package/src/management/gui/Property.d.ts +1 -1
  103. package/src/management/tasks/GuiTaskBase.d.ts +8 -14
@@ -1,83 +1,43 @@
1
1
  import { Debug, NString, StringBuilder } from "@magic-xpa/mscorelib";
2
2
  import { OSEnvironment } from "@magic-xpa/utils";
3
- /// <summary>events raised by MgGui.dll and handled by MgxpaRIA.exe or MgxpaRuntime.exe.
4
- /// Important note: these events are NOT related the events handling of Magic (RC or RTE) -
5
- /// the events exposed from this class contain functionality that the current assembly (MgGui.dll)
6
- /// requires from either MgxpaRIA.exe or MgxpaRuntime.exe.
7
- /// This class contains only the definitions of all delegates and events.
8
- /// Class 'EventsProcessor' contains handlers for events that can be served locally (by MgGui.dll),
9
- /// and registered external handlers (in MgxpaRIA.exe or MgxpaRuntime.exe) for events that can't be served locally.
10
- /// </summary>
11
3
  export class Events {
12
4
  constructor() {
13
5
  }
14
- /// <summary> invokes the focus event</summary>
15
- /// <param name="ctrl"></param>
16
- /// <param name="line"></param>
17
- /// <param name="isProduceClick"></param>
18
6
  static OnFocus(ctrl, line, isProduceClick, onMultiMark) {
19
7
  Debug.Assert(Events.FocusEvent !== null);
20
8
  Events.FocusEvent(ctrl, line, isProduceClick, onMultiMark);
21
9
  }
22
- /// <summary> invokes the focus event</summary>
23
- /// <param name="ctrl receiving lostFocus"></param>
24
10
  static OnFocusOnNonMagicControl(ctrl) {
25
11
  Debug.Assert(Events.FocusOnNonMagicControlEvent !== null);
26
12
  Events.FocusOnNonMagicControlEvent(ctrl);
27
13
  }
28
- /// <summary> invokes the MouseDown Event</summary>
29
- /// <param name="guiMgForm"></param>
30
- /// <param name="guiMgCtrl"></param>
31
- /// <param name="dotNetArgs"></param>
32
- /// <param name="leftClickWasPressed"></param>
33
- /// <param name="line"></param>
34
- /// <param name="onMultiMark">indicates that Multi Mark continues</param>
35
14
  static OnMouseDown(guiMgForm, guiMgCtrl, dotNetArgs, leftClickWasPressed, line, onMultiMark, canProduceClick) {
36
15
  Debug.Assert(Events.MouseDownEvent !== null);
37
16
  Events.MouseDownEvent(guiMgForm, guiMgCtrl, dotNetArgs, leftClickWasPressed, line, onMultiMark, canProduceClick);
38
17
  }
39
- /// <summary> invokes the VisibilityChanged Event</summary>
40
- /// <param name="ctrl">control whose visibility is changed</param>
41
18
  static OnNonParkableLastParkedCtrl(ctrl) {
42
19
  if (Events.NonParkableLastParkedCtrlEvent !== null) {
43
20
  Events.NonParkableLastParkedCtrlEvent(ctrl);
44
21
  }
45
22
  }
46
- /// <summary> invokes the TableReorder Event</summary>
47
- /// <param name="ctrl"></param>
48
- /// <param name="tabOrderList"></param>
49
23
  static OnTableReorder(ctrl, tabOrderList) {
50
24
  if (Events.TableReorderEvent !== null) {
51
25
  Events.TableReorderEvent(ctrl, tabOrderList);
52
26
  }
53
27
  }
54
- /// <summary> invokes the MouseUp Event</summary>
55
- /// <param name="ctrl"></param>
56
- /// <param name="line"></param>
57
28
  static OnMouseUp(ctrl, line) {
58
29
  if (Events.MouseUpEvent !== null) {
59
30
  Events.MouseUpEvent(ctrl, line);
60
31
  }
61
32
  }
62
- /// <summary> invokes the ComboDroppingDown Event</summary>
63
- /// <param name="ctrl"></param>
64
- /// <param name="line"></param>
65
33
  static OnComboDroppingDown(ctrl, line) {
66
34
  Debug.Assert(Events.ComboDroppingDownEvent !== null);
67
35
  Events.ComboDroppingDownEvent(ctrl, line);
68
36
  }
69
- /// <summary> invokes the Selection Event</summary>
70
- /// <param name="val"></param>
71
- /// <param name="ctrl"></param>
72
- /// <param name="line"></param>
73
- /// <param name="produceClick"></param>
74
37
  static OnSelection(val, ctrl, line, produceClick) {
75
38
  Debug.Assert(Events.SelectionEvent !== null);
76
39
  Events.SelectionEvent(val, ctrl, line, produceClick);
77
40
  }
78
- /// <summary> invokes the DblClick Event</summary>
79
- /// <param name="ctrl"></param>
80
- /// <param name="line"></param>
81
41
  static OnDblClick(ctrl, line) {
82
42
  Debug.Assert(Events.DblClickEvent !== null);
83
43
  Events.DblClickEvent(ctrl, line);
@@ -106,68 +66,42 @@ export class Events {
106
66
  Debug.Assert(Events.KeyDownEvent !== null);
107
67
  return Events.KeyDownEvent(form, ctrl, modifier, keyCode, 0, 0, null, false, suggestedValue, comboIsDropDown, handled);
108
68
  }
109
- /// <summary> invokes the Close Event</summary>
110
- /// <param name="form"></param>
111
- /// <returns>true if event is CLR handled(closing of the form will be the responsibility of the CLR and no commands will be put
112
- /// in to close the form) else false.</returns>
113
69
  static OnFormClose(form) {
114
70
  Debug.Assert(Events.CloseFormEvent !== null);
115
71
  return Events.CloseFormEvent(form);
116
72
  }
117
- /// <summary> invokes the Dispose Event</summary>
118
- /// <param name="form"></param>
119
73
  static OnDispose(form) {
120
74
  Debug.Assert(Events.DisposeEvent !== null);
121
75
  Events.DisposeEvent(form);
122
76
  }
123
- /// <summary> invokes the Timer Event</summary>
124
- /// <param name="mgTimer"></param>
125
77
  static OnTimer(mgTimer) {
126
78
  Debug.Assert(Events.TimerEvent !== null);
127
79
  Events.TimerEvent(mgTimer);
128
80
  }
129
- /// <summary> invokes the Resize Event</summary>
130
- /// <param name="ctrl"></param>
131
- /// <param name="newRowsInPage"></param>
132
81
  static OnTableResize(ctrl, newRowsInPage) {
133
82
  if (Events.TableResizeEvent !== null) {
134
83
  Events.TableResizeEvent(ctrl, newRowsInPage);
135
84
  }
136
85
  }
137
- /// <summary> invokes the GetRowsData Event</summary>
138
- /// <param name="ctrl"></param>
139
- /// <param name="desiredTopIndex"></param>
140
- /// <param name="sendAll"></param>
141
- /// <param name="lastFocusedVal"></param>
142
86
  static OnGetRowsData(ctrl, desiredTopIndex, sendAll, lastFocusedVal) {
143
87
  if (Events.GetRowsDataEvent !== null) {
144
88
  Events.GetRowsDataEvent(ctrl, desiredTopIndex, sendAll, lastFocusedVal);
145
89
  }
146
90
  }
147
- /// <summary> invokes the ColumnClick Event</summary>
148
- /// <param name="columnCtrl"></param>
149
- /// <param name="direction"></param>
150
- /// <param name="columnHeader"></param>
151
91
  static OnColumnClick(columnCtrl, direction, columnHeader) {
152
92
  Debug.Assert(Events.ColumnClickEvent !== null);
153
93
  Events.ColumnClickEvent(columnCtrl, direction, columnHeader);
154
94
  }
155
- /// <summary>invokes refreshTables delegate</summary>
156
95
  static RefreshTables() {
157
96
  if (Events.RefreshTablesEvent !== null) {
158
97
  Events.RefreshTablesEvent();
159
98
  }
160
99
  }
161
- /// <summary>OnHelpClose</summary>
162
- /// <param name="activeForm"></param>
163
100
  static OnCloseHelp(activeForm) {
164
101
  if (Events.HelpCloseEvent !== null) {
165
102
  Events.HelpCloseEvent(activeForm);
166
103
  }
167
104
  }
168
- /// <summary>
169
- /// returns TRUE, if Batch task is running in MAIN context.
170
- /// </summary>
171
105
  static IsBatchRunningInMainContext() {
172
106
  let retValue = false;
173
107
  if (Events.IsBatchRunningInMainContextEvent !== null) {
@@ -175,39 +109,20 @@ export class Events {
175
109
  }
176
110
  return retValue;
177
111
  }
178
- /// <summary>MLS translation</summary>
179
- /// <param name="fromString">source string</param>
180
- /// <returns>translated string</returns>
181
112
  static Translate(fromString) {
182
113
  Debug.Assert(Events.TranslateEvent !== null);
183
114
  return (fromString !== null && fromString.length > 0) ? Events.TranslateEvent(fromString) : fromString;
184
115
  }
185
- /// <summary>
186
- /// Creates Print Preview Form
187
- /// </summary>
188
- /// <param name="contextId">context id</param>
189
- /// <param name="ioPtr">pointer to current IORT object</param>
190
- /// <param name="copies">number of copies</param>
191
- /// <param name="enablePDlg">indicates whether to enable Print dialog</param>
192
- /// <param name="hWnd">Handle of Print Preview Form</param>
193
116
  static OnPrintPreviewStart(contextID, ioPtr, copies, enablePDlg, hWnd) {
194
117
  if (Events.PrintPreviewStartEvent !== null) {
195
118
  Events.PrintPreviewStartEvent(contextID, ioPtr, copies, enablePDlg, hWnd);
196
119
  }
197
120
  }
198
- /// <summary>
199
- /// Set cursor to Print Preview form
200
- /// </summary>
201
- /// <param name="prnPrevData">print preview data</param>
202
121
  static OnPrintPreviewSetCursor(printPreviewData) {
203
122
  if (Events.PrintPreviewSetCursorEvent !== null) {
204
123
  Events.PrintPreviewSetCursorEvent(printPreviewData);
205
124
  }
206
125
  }
207
- ///<summary>
208
- /// Handles Invoke UDP operation from GUI thread
209
- ///</summary>
210
- ///<param name="contextId">Context id</param>
211
126
  static InvokeUDP(contextId) {
212
127
  let ret = 0;
213
128
  if (Events.InvokeUDPEvent !== null) {
@@ -215,44 +130,16 @@ export class Events {
215
130
  }
216
131
  return ret;
217
132
  }
218
- /// <summary>
219
- /// Update Print Preview
220
- /// </summary>
221
- /// <param name="prnPrevData">print preview data</param>
222
133
  static OnPrintPreviewUpdate(prnPrevData) {
223
134
  if (Events.PrintPreviewUpdateEvent !== null) {
224
135
  Events.PrintPreviewUpdateEvent(prnPrevData);
225
136
  }
226
137
  }
227
- /// <summary>
228
- /// Create Rich Edit
229
- /// </summary>
230
- /// <param name="contextId"></param>
231
- /// <param name="ctrlPtr"></param>
232
- /// <param name="prmPtr"></param>
233
- /// <param name="style"></param>
234
- /// <param name="dwExStyle"></param>
235
138
  static OnCreateRichWindow(contextID, ctrlPtr, prmPtr, style, dwExStyle) {
236
139
  if (Events.CreateRichWindowEvent !== null) {
237
140
  Events.CreateRichWindowEvent(contextID, ctrlPtr, prmPtr, style, dwExStyle);
238
141
  }
239
142
  }
240
- ///<summary>
241
- /// Creates a window
242
- ///</summary>
243
- ///<param name="exStyle">!!.</param>
244
- ///<param name="className">!!.</param>
245
- ///<param name="windowName">!!.</param>
246
- ///<param name="style">!!.</param>
247
- ///<param name="x">!!.</param>
248
- ///<param name="y">!!.</param>
249
- ///<param name="width">!!.</param>
250
- ///<param name="height">!!.</param>
251
- ///<param name="hwndParent">!!.</param>
252
- ///<param name="hMenu">!!.</param>
253
- ///<param name="hInstance">!!.</param>
254
- ///<param name="lParam">!!.</param>
255
- ///<returns>handle of window</returns>
256
143
  static OnCreateGuiWindow(exStyle, className, windowName, style, x, y, width, height, hwndParent, hMenu, hInstance, lParam) {
257
144
  let retValue = 0;
258
145
  if (Events.CreateGuiWindowEvent !== null) {
@@ -260,28 +147,16 @@ export class Events {
260
147
  }
261
148
  return retValue;
262
149
  }
263
- /// <summary>
264
- /// Destroys a window
265
- /// </summary>
266
- /// <param name="hWndPtr">handle of window</param>
267
150
  static OnDestroyGuiWindow(hWndPtr) {
268
151
  if (Events.DestroyGuiWindowEvent !== null) {
269
152
  Events.DestroyGuiWindowEvent(hWndPtr);
270
153
  }
271
154
  }
272
- /// <summary>
273
- /// OnClose Print Preview
274
- /// </summary>
275
- /// <param name="hWndPtr">print preview data</param>
276
155
  static OnPrintPreviewClose(printPreviewDataPtr) {
277
156
  if (Events.PrintPreviewCloseEvent !== null) {
278
157
  Events.PrintPreviewCloseEvent(printPreviewDataPtr);
279
158
  }
280
159
  }
281
- /// <summary>
282
- /// Show Print Dialog
283
- /// </summary>
284
- /// <param name="gpd"></param>
285
160
  static OnShowPrintDialog(gpd) {
286
161
  let retValue = 0;
287
162
  if (Events.ShowPrintDialogEvent !== null) {
@@ -289,39 +164,20 @@ export class Events {
289
164
  }
290
165
  return retValue;
291
166
  }
292
- /// <summary> displaySessionStatistics </summary>
293
167
  static DisplaySessionStatistics() {
294
168
  if (Events.DisplaySessionStatisticsEvent !== null) {
295
169
  Events.DisplaySessionStatisticsEvent();
296
170
  }
297
171
  }
298
- /// <summary>
299
- /// returns true for non interactive task for all controls except a button control
300
- /// </summary>
301
- /// <param name="ctrl">clicked control</param>
302
- /// <returns></returns>
303
172
  static ShouldBlockMouseEvents(ctrl) {
304
173
  return Events.ShouldBlockMouseEventsEvent !== null && Events.ShouldBlockMouseEventsEvent(ctrl);
305
174
  }
306
- /// <summary>peekEndOfWork</summary>
307
- /// <returns></returns>
308
175
  static PeekEndOfWork() {
309
176
  return Events.PeekEndOfWorkEvent !== null && Events.PeekEndOfWorkEvent();
310
177
  }
311
- /// <summary>invokes the GetEventTime delegate</summary>
312
- /// <returns></returns>
313
178
  static GetEventTime() {
314
179
  return (Events.GetEventTimeEvent !== null) ? Events.GetEventTimeEvent() : 0;
315
180
  }
316
- /// <summary>
317
- /// invokes the ScrollTable Event
318
- /// </summary>
319
- /// <param name="guiMgObject"></param>
320
- /// <param name="line"></param>
321
- /// <param name="rowsToScroll"></param>
322
- /// <param name="isPageScroll">next/prev page?</param>
323
- /// <param name="isTableScroll">Begin/End Table?</param>
324
- /// <param name="isRaisedByMouseWheel">indicates whether event is raised by mousewheel or not.</param>
325
181
  static OnScrollTable(guiMgObject, line, rowsToScroll, isPageScroll, isTableScroll, isRaisedByMouseWheel) {
326
182
  let handled = false;
327
183
  if (Events.ScrollTableEvent !== null) {
@@ -329,20 +185,10 @@ export class Events {
329
185
  }
330
186
  return handled;
331
187
  }
332
- /// <summary>
333
- /// Gets the user defined Drop formats
334
- /// </summary>
335
- /// <param name="ctrl"></param>
336
- /// <returns></returns>
337
188
  static GetDropUserFormats() {
338
189
  Debug.Assert(Events.GetDropUserFormatsEvent !== null);
339
190
  return Events.GetDropUserFormatsEvent();
340
191
  }
341
- /// <summary>
342
- /// Get the context id from GuiMgForm
343
- /// </summary>
344
- /// <param name="guiMgForm"></param>
345
- /// <returns></returns>
346
192
  static GetContextID(guiMgForm) {
347
193
  let contextID = -1;
348
194
  Debug.Assert(guiMgForm !== null);
@@ -351,55 +197,31 @@ export class Events {
351
197
  }
352
198
  return contextID;
353
199
  }
354
- /// <summary>
355
- /// SetModal event
356
- /// </summary>
357
- /// <param name="currForm"></param>
358
- /// <param name="on"></param>
359
200
  static SetModal(mgForm, on) {
360
201
  if (Events.SetModalEvent !== null) {
361
202
  Events.SetModalEvent(mgForm, on);
362
203
  }
363
204
  }
364
- /// <summary> </summary>
365
- /// <param name="guiMgForm"></param>
366
- /// <returns></returns>
367
205
  static OnShowForm(guiMgForm) {
368
206
  if (Events.ShowFormEvent !== null) {
369
207
  Events.ShowFormEvent(guiMgForm);
370
208
  }
371
209
  }
372
- /// <summary>
373
- /// invokes OnFormActivateEvent
374
- /// </summary>
375
210
  static OnFormActivate(guiMgForm) {
376
211
  if (Events.OnFormActivateEvent !== null) {
377
212
  Events.OnFormActivateEvent(guiMgForm);
378
213
  }
379
214
  }
380
- /// <summary>
381
- /// invokes OnNCActivate
382
- /// </summary>
383
215
  static OnNCActivate(guiMgForm) {
384
216
  if (Events.OnNCActivateEvent !== null) {
385
217
  Events.OnNCActivateEvent(guiMgForm);
386
218
  }
387
219
  }
388
- /// <summary>
389
- /// Handle WM_KEYUP - (required only for ACT_NEXT_RT_WINDOW, ACT_PREV_RT_WINDOW for sorting windowlist
390
- /// when the key associated with the action is released)
391
- /// </summary>
392
- /// <param name="guiMgForm"></param>
393
- /// <param name="keyCode">keycode of a key which is just released</param>
394
220
  static HandleKeyUpMessage(guiMgForm, keyCode) {
395
221
  if (Events.HandleKeyUpMessageEvent !== null) {
396
222
  Events.HandleKeyUpMessageEvent(guiMgForm, keyCode);
397
223
  }
398
224
  }
399
- /// <summary>
400
- /// checks whether we should show Logon window in RTOL format or not.
401
- /// </summary>
402
- /// <returns></returns>
403
225
  static IsLogonRTL() {
404
226
  let isRTL = false;
405
227
  if (Events.OnIsLogonRTLEvent !== null) {
@@ -421,26 +243,14 @@ export class Events {
421
243
  }
422
244
  return isIgnoreButtonFormat;
423
245
  }
424
- /// <summary> invokes the getMainProgram Event </summary>
425
- /// <param name="contextID">active/target context</param>
426
- /// <param name="ctlIdx"></param>
427
- /// <returns></returns>
428
246
  static GetMainProgram(contextID, ctlIdx) {
429
247
  Debug.Assert(Events.GetMainProgramEvent !== null);
430
248
  return Events.GetMainProgramEvent(contextID, ctlIdx);
431
249
  }
432
- /// <summary>
433
- /// Logical name translation
434
- /// </summary>
435
- /// <param name="fromString">source string</param>
436
- /// <returns>translated string</returns>
437
250
  static TranslateLogicalName(fromString) {
438
251
  Debug.Assert(Events.TranslateLogicalNameEvent !== null);
439
252
  return Events.TranslateLogicalNameEvent(fromString);
440
253
  }
441
- /// <summary>invokes getMessageString Event</summary>
442
- /// <param name="msgId"></param>
443
- /// <returns></returns>
444
254
  static GetMessageString(msgId) {
445
255
  Debug.Assert(Events.GetMessageStringEvent !== null);
446
256
  let fromString = Events.GetMessageStringEvent(msgId);
@@ -453,54 +263,25 @@ export class Events {
453
263
  }
454
264
  return text;
455
265
  }
456
- /// <summary>raises CtrlFocusEvent</summary>
457
- /// <returns></returns>
458
266
  static OnCtrlFocus(iTask, ctrl) {
459
267
  if (Events.CtrlFocusEvent !== null) {
460
268
  Events.CtrlFocusEvent(iTask, ctrl);
461
269
  }
462
270
  }
463
- /// <summary>get Current processing task</summary>
464
- /// <returns></returns>
465
- static GetCurrentTask() {
466
- return (Events.GetCurrentTaskEvent !== null) ? Events.GetCurrentTaskEvent() : null;
467
- }
468
- /// <summary>
469
- /// Gets the RuntimeContextBase that belongs to the contextID
470
- /// </summary>
471
- /// <param name="contextID"></param>
472
- /// <returns></returns>
473
271
  static GetRuntimeContext(contextID) {
474
272
  Debug.Assert(Events.GetRuntimeContextEvent !== null);
475
273
  return Events.GetRuntimeContextEvent(contextID);
476
274
  }
477
- /// <summary>
478
- /// Saves the name of the last clicked control.
479
- /// </summary>
480
- /// <param name="guiMgControl">guiMgControl</param>
481
- /// <param name="controlName">Name of the control</param>
482
275
  static SaveLastClickedCtrlName(guiMgControl, controlName) {
483
276
  if (Events.SaveLastClickedCtrlEvent !== null) {
484
277
  Events.SaveLastClickedCtrlEvent(guiMgControl, controlName);
485
278
  }
486
279
  }
487
- /// <summary>
488
- /// Saves the last clicked information. (i.e. Co-ordinates and control name.
489
- /// </summary>
490
- /// <param name="guiMgForm">guiMgForm</param>
491
- /// <param name="controlName">name of the control</param>
492
- /// <param name="x"></param>
493
- /// <param name="y"></param>
494
- /// <param name="offsetX"></param>
495
- /// <param name="offsetY"></param>
496
- /// <param name="lastClickCoordinatesAreInPixels">co-ordinates are in pixel or not.</param>
497
280
  static SaveLastClickInfo(guiMgForm, controlName, x, y, offsetX, offsetY, lastClickCoordinatesAreInPixels) {
498
281
  if (Events.SaveLastClickInfoEvent !== null) {
499
282
  Events.SaveLastClickInfoEvent(guiMgForm, controlName, x, y, offsetX, offsetY, lastClickCoordinatesAreInPixels);
500
283
  }
501
284
  }
502
- /// <summary>write an error message to the internal log file</summary>
503
- /// <param name="msg"></param>
504
285
  static WriteErrorToLog(msg) {
505
286
  Debug.Assert(Events.WriteErrorToLogEvent !== null);
506
287
  Events.WriteErrorToLogEvent(msg);
@@ -535,402 +316,105 @@ export class Events {
535
316
  static WriteWarningToLog_1(ex) {
536
317
  Events.WriteWarningToLog(ex.GetType() + " : " + OSEnvironment.EolSeq + ex.StackTrace + OSEnvironment.EolSeq + ex.Message);
537
318
  }
538
- /// <summary>
539
- ///
540
- /// </summary>
541
- /// <param name="logLevel"></param>
542
- /// <returns></returns>
543
319
  static ShouldLog(logLevel) {
544
320
  Debug.Assert(Events.ShouldLogEvent !== null);
545
321
  return Events.ShouldLogEvent(logLevel);
546
322
  }
547
- /// <summary>write a GUI message to the internal log file</summary>
548
- /// <param name="msg"></param>
549
323
  static WriteGuiToLog(msg) {
550
324
  Debug.Assert(Events.WriteGuiToLogEvent !== null);
551
325
  Events.WriteGuiToLogEvent("GUI: " + msg);
552
326
  }
553
- /// <summary>write a DEV message to the internal log file</summary>
554
- /// <param name="msg"></param>
555
327
  static WriteDevToLog(msg) {
556
328
  Debug.Assert(Events.WriteDevToLogEvent !== null);
557
329
  Events.WriteDevToLogEvent(msg);
558
330
  }
559
- /// <summary>
560
- /// Called when WM_CLEAR message is received
561
- /// </summary>
562
- /// <param name="ctrl"></param>
563
331
  static OnClear(ctrl) {
564
332
  if (Events.ClearEvent !== null) {
565
333
  Events.ClearEvent(ctrl);
566
334
  }
567
335
  }
568
- /// <summary>
569
- /// Called when WM_UNDO message is received
570
- /// </summary>
571
- /// <param name="ctrl"></param>
572
336
  static OnUndo(ctrl) {
573
337
  if (Events.UndoEvent !== null) {
574
338
  Events.UndoEvent(ctrl);
575
339
  }
576
340
  }
577
- /// <summary>
578
- /// Should Enter be added as keyboard event ? This is important mostly in determining if a click event
579
- /// will be raised for a default button or not.
580
- /// Adding Enter as a keyboard event will not raise click on default button.
581
- /// </summary>
582
- /// <returns></returns>
583
341
  static AddEnterAsKeyEvent() {
584
342
  return Events.ShouldAddEnterAsKeyEvent !== null && Events.ShouldAddEnterAsKeyEvent();
585
343
  }
586
- /// <summary>
587
- /// </summary>
588
344
  static ShowSessionStatisticsForm() {
589
345
  if (Events.ShowSessionStatisticsEvent !== null) {
590
346
  Events.ShowSessionStatisticsEvent();
591
347
  }
592
348
  }
593
- /// <summary>
594
- /// Called when WM_COPYDATA message is received
595
- /// </summary>
596
- /// <param name="guiMgForm"></param>
597
- /// <param name="copyData"></param>
598
349
  static OnCopyData(guiMgForm, copyData) {
599
350
  if (Events.CopyDataEvent !== null) {
600
351
  Events.CopyDataEvent(guiMgForm, copyData);
601
352
  }
602
353
  }
603
354
  }
604
- /// <summary> invokes the VisibilityChanged Event</summary>
605
- /// <param name="ctrl">control whose visibility is changed</param>
606
355
  Events.NonParkableLastParkedCtrlEvent = null;
607
- /// <summary>
608
- /// returns TRUE, if Batch task is running in MAIN context.
609
- /// </summary>
610
356
  Events.IsBatchRunningInMainContextEvent = null;
611
- /// <summary>MLS translation</summary>
612
- /// <param name="fromString">source string</param>
613
- /// <returns>translated string</returns>
614
357
  Events.TranslateEvent = null;
615
- /// <summary>
616
- /// Creates Print Preview Form
617
- /// </summary>
618
- /// <param name="contextId">context id</param>
619
- /// <param name="ioPtr">pointer to current IORT object</param>
620
- /// <param name="copies">number of copies</param>
621
- /// <param name="enablePDlg">indicates whether to enable Print dialog</param>
622
- /// <param name="hWnd">Handle of Print Preview Form</param>
623
358
  Events.PrintPreviewStartEvent = null;
624
- /// <summary>
625
- /// Set cursor to Print Preview form
626
- /// </summary>
627
- /// <param name="prnPrevData">print preview data</param>
628
359
  Events.PrintPreviewSetCursorEvent = null;
629
- ///<summary>
630
- /// Handles Invoke UDP operation from GUI thread
631
- ///</summary>
632
- ///<param name="contextId">Context id</param>
633
360
  Events.InvokeUDPEvent = null;
634
- /// <summary>
635
- /// Update Print Preview
636
- /// </summary>
637
- /// <param name="prnPrevData">print preview data</param>
638
361
  Events.PrintPreviewUpdateEvent = null;
639
- /// <summary>
640
- /// Create Rich Edit
641
- /// </summary>
642
- /// <param name="contextId"></param>
643
- /// <param name="ctrlPtr"></param>
644
- /// <param name="prmPtr"></param>
645
- /// <param name="style"></param>
646
- /// <param name="dwExStyle"></param>
647
362
  Events.CreateRichWindowEvent = null;
648
- ///<summary>
649
- /// Creates a window
650
- ///</summary>
651
- ///<param name="exStyle">!!.</param>
652
- ///<param name="className">!!.</param>
653
- ///<param name="windowName">!!.</param>
654
- ///<param name="style">!!.</param>
655
- ///<param name="x">!!.</param>
656
- ///<param name="y">!!.</param>
657
- ///<param name="width">!!.</param>
658
- ///<param name="height">!!.</param>
659
- ///<param name="hwndParent">!!.</param>
660
- ///<param name="hMenu">!!.</param>
661
- ///<param name="hInstance">!!.</param>
662
- ///<param name="lParam">!!.</param>
663
- ///<returns>handle of window</returns>
664
363
  Events.CreateGuiWindowEvent = null;
665
- /// <summary>
666
- /// Destroys a window
667
- /// </summary>
668
- /// <param name="hWndPtr">handle of window</param>
669
364
  Events.DestroyGuiWindowEvent = null;
670
- /// <summary>
671
- /// OnClose Print Preview
672
- /// </summary>
673
- /// <param name="hWndPtr">print preview data</param>
674
365
  Events.PrintPreviewCloseEvent = null;
675
- /// <summary>
676
- /// Show Print Dialog
677
- /// </summary>
678
- /// <param name="gpd"></param>
679
366
  Events.ShowPrintDialogEvent = null;
680
- /// <summary>
681
- /// SetModal event
682
- /// </summary>
683
- /// <param name="currForm"></param>
684
- /// <param name="on"></param>
685
367
  Events.SetModalEvent = null;
686
- /// <summary>raises CtrlFocusEvent</summary>
687
- /// <returns></returns>
688
368
  Events.CtrlFocusEvent = null;
689
- /// <summary>get Current processing task</summary>
690
- /// <returns></returns>
691
- Events.GetCurrentTaskEvent = null;
692
- /// <summary>
693
- /// Gets the RuntimeContextBase that belongs to the contextID
694
- /// </summary>
695
- /// <param name="contextID"></param>
696
- /// <returns></returns>
697
369
  Events.GetRuntimeContextEvent = null;
698
- /// <summary>
699
- /// Saves the name of the last clicked control.
700
- /// </summary>
701
- /// <param name="guiMgControl">guiMgControl</param>
702
- /// <param name="controlName">Name of the control</param>
703
370
  Events.SaveLastClickedCtrlEvent = null;
704
- /// <summary>
705
- /// Saves the last clicked information. (i.e. Co-ordinates and control name.
706
- /// </summary>
707
- /// <param name="guiMgForm">guiMgForm</param>
708
- /// <param name="controlName">name of the control</param>
709
- /// <param name="x"></param>
710
- /// <param name="y"></param>
711
- /// <param name="offsetX"></param>
712
- /// <param name="offsetY"></param>
713
- /// <param name="lastClickCoordinatesAreInPixels">co-ordinates are in pixel or not.</param>
714
371
  Events.SaveLastClickInfoEvent = null;
715
- /// <summary>write an error message to the internal log file</summary>
716
- /// <param name="msg"></param>
717
372
  Events.WriteErrorToLogEvent = null;
718
- /// <summary>Write an internal error to the log. Also prints stack trace along with the message</summary>
719
- /// <param name="msg"></param>
720
373
  Events.WriteExceptionToLogEvent = null;
721
- /// <summary>write a warning message to the internal log file</summary>
722
- /// <param name="msg"></param>
723
374
  Events.WriteWarningToLogEvent = null;
724
- /// <summary>
725
- ///
726
- /// </summary>
727
- /// <param name="logLevel"></param>
728
- /// <returns></returns>
729
375
  Events.ShouldLogEvent = null;
730
- /// <summary>write a GUI message to the internal log file</summary>
731
- /// <param name="msg"></param>
732
376
  Events.WriteGuiToLogEvent = null;
733
- /// <summary>write a DEV message to the internal log file</summary>
734
- /// <param name="msg"></param>
735
377
  Events.WriteDevToLogEvent = null;
736
- /// <summary>
737
- /// Called when WM_CLEAR message is received
738
- /// </summary>
739
- /// <param name="ctrl"></param>
740
378
  Events.ClearEvent = null;
741
- /// <summary>
742
- /// Called when WM_UNDO message is received
743
- /// </summary>
744
- /// <param name="ctrl"></param>
745
379
  Events.UndoEvent = null;
746
- /// <summary>
747
- /// Should Enter be added as keyboard event ? This is important mostly in determining if a click event
748
- /// will be raised for a default button or not.
749
- /// Adding Enter as a keyboard event will not raise click on default button.
750
- /// </summary>
751
- /// <returns></returns>
752
380
  Events.ShouldAddEnterAsKeyEvent = null;
753
- /// <summary>
754
- /// </summary>
755
381
  Events.ShowSessionStatisticsEvent = null;
756
- /// <summary>
757
- /// Called when WM_COPYDATA message is received
758
- /// </summary>
759
- /// <param name="guiMgForm"></param>
760
- /// <param name="copyData"></param>
761
382
  Events.CopyDataEvent = null;
762
- /// <summary> invokes the focus event</summary>
763
- /// <param name="ctrl"></param>
764
- /// <param name="line"></param>
765
- /// <param name="isProduceClick"></param>
766
383
  Events.FocusEvent = null;
767
- /// <summary> invokes the focus out event</summary>
768
- /// <param name="ctrl"></param>
769
384
  Events.FocusOnNonMagicControlEvent = null;
770
- /// <summary> invokes the MouseDown Event</summary>
771
- /// <param name="guiMgForm"></param>
772
- /// <param name="guiMgCtrl"></param>
773
- /// <param name="dotNetArgs"></param>
774
- /// <param name="leftClickWasPressed"></param>
775
- /// <param name="line"></param>
776
- /// <param name="onMultiMark">indicates that Multi Mark continues</param>
777
385
  Events.MouseDownEvent = null;
778
- /// <summary> invokes the TableReorder Event</summary>
779
- /// <param name="ctrl"></param>
780
- /// <param name="tabOrderList"></param>
781
386
  Events.TableReorderEvent = null;
782
- /// <summary> invokes the MouseUp Event</summary>
783
- /// <param name="ctrl"></param>
784
- /// <param name="line"></param>
785
387
  Events.MouseUpEvent = null;
786
- /// <summary> invokes the ComboDroppingDown Event</summary>
787
- /// <param name="ctrl"></param>
788
- /// <param name="line"></param>
789
388
  Events.ComboDroppingDownEvent = null;
790
- /// <summary> invokes the Selection Event</summary>
791
- /// <param name="val"></param>
792
- /// <param name="ctrl"></param>
793
- /// <param name="line"></param>
794
- /// <param name="produceClick"></param>
795
389
  Events.SelectionEvent = null;
796
- /// <summary> invokes the DblClick Event</summary>
797
- /// <param name="ctrl"></param>
798
- /// <param name="line"></param>
799
390
  Events.DblClickEvent = null;
800
- /// <summary> invokes the KeyDown Event</summary>
801
- /// <param name="form"></param>
802
- /// <param name="guiMgCtrl"></param>
803
- /// <param name="modifier"></param>
804
- /// <param name="keyCode"></param>
805
- /// <param name="start"></param>
806
- /// <param name="end"></param>
807
- /// <param name="text"></param>
808
- /// <param name="im"></param>
809
- /// <param name="isActChar"></param>
810
- /// <param name="suggestedValue"></param>
811
- /// <param name="comboIsDropDown"></param>
812
- /// <param name="handled">boolean variable event is handled or not. </param>
813
391
  Events.KeyDownEvent = null;
814
- /// <summary>
815
- /// delegate for the MultiMark hit event
816
- /// </summary>
817
- /// <param name="guiMgCtrl"> control </param>
818
- /// <param name="row"> table row </param>
819
392
  Events.MultimarkHitEvent = null;
820
- /// <summary> invokes the Close Event</summary>
821
- /// <param name="form"></param>
822
- /// <returns>true if event is CLR handled(closing of the form will be the responsibility of the CLR and no commands will be put
823
- /// in to close the form) else false.</returns>
824
393
  Events.CloseFormEvent = null;
825
- /// <summary> invokes the Dispose Event</summary>
826
- /// <param name="form"></param>
827
394
  Events.DisposeEvent = null;
828
- /// <summary> invokes the Timer Event</summary>
829
- /// <param name="mgTimer"></param>
830
395
  Events.TimerEvent = null;
831
- /// <summary> invokes the Resize Event</summary>
832
- /// <param name="ctrl"></param>
833
- /// <param name="newRowsInPage"></param>
834
396
  Events.TableResizeEvent = null;
835
- /// <summary> invokes the GetRowsData Event</summary>
836
- /// <param name="ctrl"></param>
837
- /// <param name="desiredTopIndex"></param>
838
- /// <param name="sendAll"></param>
839
- /// <param name="lastFocusedVal"></param>
840
397
  Events.GetRowsDataEvent = null;
841
- /// <summary> invokes the EnableCutCopy Event</summary>
842
- /// <param name="ctrl"></param>
843
- /// <param name="enable"></param>
844
398
  Events.EnableCutCopyEvent = null;
845
- /// <summary> invokes the EnablePaste Event</summary>
846
- /// <param name="ctrl"></param>
847
- /// <param name="enable"></param>
848
399
  Events.EnablePasteEvent = null;
849
- /// <summary> invokes the ColumnClick Event</summary>
850
- /// <param name="columnCtrl"></param>
851
- /// <param name="direction"></param>
852
- /// <param name="columnHeader"></param>
853
400
  Events.ColumnClickEvent = null;
854
- /// <summary>invokes refreshTables delegate</summary>
855
401
  Events.RefreshTablesEvent = null;
856
- /// <summary>OnHelpClose</summary>
857
- /// <param name="activeForm"></param>
858
402
  Events.HelpCloseEvent = null;
859
- /// <summary> displaySessionStatistics </summary>
860
403
  Events.DisplaySessionStatisticsEvent = null;
861
- /// <summary>
862
- /// returns true for non interactive task for all controls except a button control
863
- /// </summary>
864
- /// <param name="ctrl">clicked control</param>
865
- /// <returns></returns>
866
404
  Events.ShouldBlockMouseEventsEvent = null;
867
- /// <summary>peekEndOfWork</summary>
868
- /// <returns></returns>
869
405
  Events.PeekEndOfWorkEvent = null;
870
- /// <summary>invokes the GetEventTime delegate</summary>
871
- /// <returns></returns>
872
406
  Events.GetEventTimeEvent = null;
873
- /// <summary>
874
- /// invokes the ScrollTable Event
875
- /// </summary>
876
- /// <param name="guiMgObject"></param>
877
- /// <param name="line"></param>
878
- /// <param name="rowsToScroll"></param>
879
- /// <param name="isPageScroll">next/prev page?</param>
880
- /// <param name="isTableScroll">Begin/End Table?</param>
881
- /// <param name="isRaisedByMouseWheel">indicates whether event is raised by mousewheel or not.</param>
882
407
  Events.ScrollTableEvent = null;
883
- /// <summary>
884
- /// Gets the user defined Drop formats
885
- /// </summary>
886
- /// <param name="ctrl"></param>
887
- /// <returns></returns>
888
408
  Events.GetDropUserFormatsEvent = null;
889
- /// <summary>
890
- /// Get the context id from GuiMgForm
891
- /// </summary>
892
- /// <param name="guiMgForm"></param>
893
- /// <returns></returns>
894
409
  Events.GetContextIDEvent = null;
895
- /// <summary> </summary>
896
- /// <param name="guiMgForm"></param>
897
- /// <returns></returns>
898
410
  Events.ShowFormEvent = null;
899
- /// <summary>
900
- /// invokes OnFormActivateEvent
901
- /// </summary>
902
411
  Events.OnFormActivateEvent = null;
903
- /// <summary>
904
- /// invokes OnNCActivate
905
- /// </summary>
906
412
  Events.OnNCActivateEvent = null;
907
- /// <summary>
908
- /// Handle WM_KEYUP - (required only for ACT_NEXT_RT_WINDOW, ACT_PREV_RT_WINDOW for sorting windowlist
909
- /// when the key associated with the action is released)
910
- /// </summary>
911
- /// <param name="guiMgForm"></param>
912
- /// <param name="keyCode">keycode of a key which is just released</param>
913
413
  Events.HandleKeyUpMessageEvent = null;
914
- /// <summary>
915
- /// checks whether we should show Logon window in RTOL format or not.
916
- /// </summary>
917
- /// <returns></returns>
918
414
  Events.OnIsLogonRTLEvent = null;
919
415
  Events.OnIsSpecialEngLogonEvent = null;
920
416
  Events.OnIsSpecialIgnoreButtonFormatEvent = null;
921
- /// <summary> invokes the getMainProgram Event </summary>
922
- /// <param name="contextID">active/target context</param>
923
- /// <param name="ctlIdx"></param>
924
- /// <returns></returns>
925
417
  Events.GetMainProgramEvent = null;
926
- /// <summary>
927
- /// Logical name translation
928
- /// </summary>
929
- /// <param name="fromString">source string</param>
930
- /// <returns>translated string</returns>
931
418
  Events.TranslateLogicalNameEvent = null;
932
- /// <summary>invokes getMessageString Event</summary>
933
- /// <param name="msgId"></param>
934
- /// <returns></returns>
935
419
  Events.GetMessageStringEvent = null;
936
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9FdmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFDLEtBQUssRUFBbUIsT0FBTyxFQUFFLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBSXBGLE9BQU8sRUFBbUIsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHakUsd0ZBQXdGO0FBQ3hGLDJGQUEyRjtBQUMzRixvR0FBb0c7QUFDcEcsNERBQTREO0FBQzVELHlFQUF5RTtBQUN6RSxtR0FBbUc7QUFDbkcscUhBQXFIO0FBQ3JILGNBQWM7QUFDZCxNQUFNLE9BQU8sTUFBTTtJQW9sQ2pCO0lBQ0EsQ0FBQztJQXpyQkQsK0NBQStDO0lBQy9DLCtCQUErQjtJQUMvQiwrQkFBK0I7SUFDL0IseUNBQXlDO0lBQ3pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBa0IsRUFBRSxJQUFZLEVBQUUsY0FBdUIsRUFBRSxXQUFvQjtRQUM1RixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLG1EQUFtRDtJQUNuRCxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBa0I7UUFDaEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMkJBQTJCLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFHRCxtREFBbUQ7SUFDbkQsb0NBQW9DO0lBQ3BDLG9DQUFvQztJQUNwQyxxQ0FBcUM7SUFDckMsOENBQThDO0lBQzlDLCtCQUErQjtJQUMvQix5RUFBeUU7SUFD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dUI7QUFDaEIsMEJBQW1CLEdBQXVELElBQUksQ0FBQztBQUV0RixhQUFhO0FBQ2IsNEJBQTRCO0FBQzVCLGNBQWM7QUFDZCxrREFBa0Q7QUFDbEQsd0NBQXdDO0FBQ2pDLGdDQUF5QixHQUFtQyxJQUFJLENBQUM7QUFFeEUscURBQXFEO0FBQ3JELGdDQUFnQztBQUNoQyx1QkFBdUI7QUFDaEIsNEJBQXFCLEdBQThCLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7R3VpTWdDb250cm9sfSBmcm9tIFwiLi9ndWkvR3VpTWdDb250cm9sXCI7XHJcbmltcG9ydCB7TWdGb3JtQmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC9ndWkvTWdGb3JtQmFzZVwiO1xyXG5pbXBvcnQge0lUYXNrfSBmcm9tIFwiLi9tYW5hZ2VtZW50L3Rhc2tzL0lUYXNrXCI7XHJcbmltcG9ydCB7TWdDb250cm9sQmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZVwiO1xyXG5pbXBvcnQge1J1bnRpbWVDb250ZXh0QmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC9SdW50aW1lQ29udGV4dEJhc2VcIjtcclxuaW1wb3J0IHtHdWlNZ0Zvcm19IGZyb20gXCIuL2d1aS9HdWlNZ0Zvcm1cIjtcclxuaW1wb3J0IHtHdWlUYXNrQmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC90YXNrcy9HdWlUYXNrQmFzZVwiO1xyXG5pbXBvcnQge0RlYnVnLCBFeGNlcHRpb24sIExpc3QsIE5TdHJpbmcsIFN0cmluZ0J1aWxkZXJ9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge01vZGlmaWVyc30gZnJvbSBcIi4vR3VpRW51bXNcIjtcclxuaW1wb3J0IHtNZ1RpbWVyfSBmcm9tIFwiLi9tYW5hZ2VtZW50L3Rhc2tzL01nVGltZXJcIjtcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZFZhbH0gZnJvbSBcIi4vZ3VpL0xhc3RGb2N1c2VkVmFsXCI7XHJcbmltcG9ydCB7TG9nZ2VyX0xvZ0xldmVscywgT1NFbnZpcm9ubWVudH0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHsgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB9IGZyb20gXCIuL21hbmFnZW1lbnQvZ3VpL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXJcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5ldmVudHMgcmFpc2VkIGJ5IE1nR3VpLmRsbCBhbmQgaGFuZGxlZCBieSBNZ3hwYVJJQS5leGUgb3IgTWd4cGFSdW50aW1lLmV4ZS5cclxuLy8vIEltcG9ydGFudCBub3RlOiB0aGVzZSBldmVudHMgYXJlIE5PVCByZWxhdGVkIHRoZSBldmVudHMgaGFuZGxpbmcgb2YgTWFnaWMgKFJDIG9yIFJURSkgLVxyXG4vLy8gICB0aGUgZXZlbnRzIGV4cG9zZWQgZnJvbSB0aGlzIGNsYXNzIGNvbnRhaW4gZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBjdXJyZW50IGFzc2VtYmx5IChNZ0d1aS5kbGwpXHJcbi8vLyAgIHJlcXVpcmVzIGZyb20gZWl0aGVyIE1neHBhUklBLmV4ZSBvciBNZ3hwYVJ1bnRpbWUuZXhlLlxyXG4vLy8gVGhpcyBjbGFzcyBjb250YWlucyBvbmx5IHRoZSBkZWZpbml0aW9ucyBvZiBhbGwgZGVsZWdhdGVzIGFuZCBldmVudHMuXHJcbi8vLyBDbGFzcyAnRXZlbnRzUHJvY2Vzc29yJyBjb250YWlucyBoYW5kbGVycyBmb3IgZXZlbnRzIHRoYXQgY2FuIGJlIHNlcnZlZCBsb2NhbGx5IChieSBNZ0d1aS5kbGwpLFxyXG4vLy8gICBhbmQgcmVnaXN0ZXJlZCBleHRlcm5hbCBoYW5kbGVycyAoaW4gTWd4cGFSSUEuZXhlIG9yIE1neHBhUnVudGltZS5leGUpIGZvciBldmVudHMgdGhhdCBjYW4ndCBiZSBzZXJ2ZWQgbG9jYWxseS5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIEV2ZW50cyB7XHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBWaXNpYmlsaXR5Q2hhbmdlZCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y29udHJvbCB3aG9zZSB2aXNpYmlsaXR5IGlzIGNoYW5nZWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBOb25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsRXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgVFJVRSwgaWYgQmF0Y2ggdGFzayBpcyBydW5uaW5nIGluIE1BSU4gY29udGV4dC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBJc0JhdGNoUnVubmluZ0luTWFpbkNvbnRleHRFdmVudDogKCkgPT4gYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5NTFMgdHJhbnNsYXRpb248L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZnJvbVN0cmluZ1wiPnNvdXJjZSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cmFuc2xhdGVkIHN0cmluZzwvcmV0dXJucz5cclxuICBzdGF0aWMgVHJhbnNsYXRlRXZlbnQ6IChmcm9tU3RyaW5nOiBzdHJpbmcpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBQcmludCBQcmV2aWV3IEZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJZFwiPmNvbnRleHQgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlvUHRyXCI+cG9pbnRlciB0byBjdXJyZW50IElPUlQgb2JqZWN0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb3BpZXNcIj5udW1iZXIgb2YgY29waWVzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmFibGVQRGxnXCI+aW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIFByaW50IGRpYWxvZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaFduZFwiPkhhbmRsZSBvZiBQcmludCBQcmV2aWV3IEZvcm08L3BhcmFtPlxyXG4gIHN0YXRpYyBQcmludFByZXZpZXdTdGFydEV2ZW50OiAoY29udGV4dElEOiBudW1iZXIsIGlvUHRyOiBudW1iZXIsIGNvcGllczogbnVtYmVyLCBlbmFibGVQRGxnOiBib29sZWFuLCBoV25kOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCBjdXJzb3IgdG8gUHJpbnQgUHJldmlldyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm5QcmV2RGF0YVwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIFByaW50UHJldmlld1NldEN1cnNvckV2ZW50OiAocHJpbnRQcmV2aWV3RGF0YTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZXMgSW52b2tlIFVEUCBvcGVyYXRpb24gZnJvbSBHVUkgdGhyZWFkXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+Q29udGV4dCBpZDwvcGFyYW0+XHJcbiAgc3RhdGljIEludm9rZVVEUEV2ZW50OiAoY29udGV4dElkOiBudW1iZXIpID0+IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIFByaW50IFByZXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByblByZXZEYXRhXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgUHJpbnRQcmV2aWV3VXBkYXRlRXZlbnQ6IChwcm5QcmV2RGF0YTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGUgUmljaCBFZGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxQdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBybVB0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3R5bGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR3RXhTdHlsZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIENyZWF0ZVJpY2hXaW5kb3dFdmVudDogKGNvbnRleHRJRDogbnVtYmVyLCBjdHJsUHRyOiBudW1iZXIsIHBybVB0cjogbnVtYmVyLCBzdHlsZTogbnVtYmVyLCBkd0V4U3R5bGU6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyAgQ3JlYXRlcyBhIHdpbmRvd1xyXG4gIC8vLzwvc3VtbWFyeT5cclxuICAvLy88cGFyYW0gbmFtZT1cImV4U3R5bGVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY2xhc3NOYW1lXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cIndpbmRvd05hbWVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwic3R5bGVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwieFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJ5XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cIndpZHRoXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhlaWdodFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJod25kUGFyZW50XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhNZW51XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhJbnN0YW5jZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJsUGFyYW1cIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxyZXR1cm5zPmhhbmRsZSBvZiB3aW5kb3c8L3JldHVybnM+XHJcbiAgc3RhdGljIENyZWF0ZUd1aVdpbmRvd0V2ZW50OiAoZXhTdHlsZTogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZywgd2luZG93TmFtZTogc3RyaW5nLCBzdHlsZTogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGh3bmRQYXJlbnQ6IG51bWJlciwgaE1lbnU6IG51bWJlciwgaEluc3RhbmNlOiBudW1iZXIsIGxQYXJhbTogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIERlc3Ryb3lzIGEgd2luZG93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kUHRyXCI+aGFuZGxlIG9mIHdpbmRvdzwvcGFyYW0+XHJcbiAgc3RhdGljIERlc3Ryb3lHdWlXaW5kb3dFdmVudDogKGhXbmRQdHI6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gT25DbG9zZSBQcmludCBQcmV2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kUHRyXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgUHJpbnRQcmV2aWV3Q2xvc2VFdmVudDogKGhXbmRQdHI6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdyBQcmludCBEaWFsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImdwZFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNob3dQcmludERpYWxvZ0V2ZW50OiAoZ3BkOiBudW1iZXIpID0+IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0TW9kYWwgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvblwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNldE1vZGFsRXZlbnQ6IChtZ0Zvcm06IE1nRm9ybUJhc2UsIG9uOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnJhaXNlcyBDdHJsRm9jdXNFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBDdHJsRm9jdXNFdmVudDogKGlUYXNrOiBJVGFzaywgY3RybDogTWdDb250cm9sQmFzZSkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgQ3VycmVudCBwcm9jZXNzaW5nIHRhc2s8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0Q3VycmVudFRhc2tFdmVudDogKCkgPT4gSVRhc2sgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgdGhlIFJ1bnRpbWVDb250ZXh0QmFzZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIGNvbnRleHRJRFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRSdW50aW1lQ29udGV4dEV2ZW50OiAoY29udGV4dElEOiBzdHJpbmcpID0+IFJ1bnRpbWVDb250ZXh0QmFzZSA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2F2ZXMgdGhlIG5hbWUgb2YgdGhlIGxhc3QgY2xpY2tlZCBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDb250cm9sXCI+Z3VpTWdDb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sTmFtZVwiPk5hbWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHN0YXRpYyBTYXZlTGFzdENsaWNrZWRDdHJsRXZlbnQ6IChndWlNZ0NvbnRyb2w6IEd1aU1nQ29udHJvbCwgY29udHJvbE5hbWU6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2F2ZXMgdGhlIGxhc3QgY2xpY2tlZCBpbmZvcm1hdGlvbi4gKGkuZS4gQ28tb3JkaW5hdGVzIGFuZCBjb250cm9sIG5hbWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj5ndWlNZ0Zvcm08L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xOYW1lXCI+bmFtZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwieFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwieVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2Zmc2V0WFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2Zmc2V0WVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdENsaWNrQ29vcmRpbmF0ZXNBcmVJblBpeGVsc1wiPmNvLW9yZGluYXRlcyBhcmUgaW4gcGl4ZWwgb3Igbm90LjwvcGFyYW0+XHJcbiAgc3RhdGljIFNhdmVMYXN0Q2xpY2tJbmZvRXZlbnQ6IChndWlNZ0Zvcm06IEd1aU1nRm9ybSwgY29udHJvbE5hbWU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCBsYXN0Q2xpY2tDb29yZGluYXRlc0FyZUluUGl4ZWxzOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlRXJyb3JUb0xvZ0V2ZW50OiAobXNnOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+V3JpdGUgYW4gaW50ZXJuYWwgZXJyb3IgdG8gdGhlIGxvZy4gQWxzbyBwcmludHMgc3RhY2sgdHJhY2UgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZUV4Y2VwdGlvblRvTG9nRXZlbnQ6IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+d3JpdGUgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nRXZlbnQ6IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxvZ0xldmVsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRMb2dFdmVudDogKGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGEgR1VJIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlR3VpVG9Mb2dFdmVudDogKG1zZzogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGEgREVWIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlRGV2VG9Mb2dFdmVudDogKG1zZzogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGxlZCB3aGVuIFdNX0NMRUFSIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBDbGVhckV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9VTkRPIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBVbmRvRXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCBFbnRlciBiZSBhZGRlZCBhcyBrZXlib2FyZCBldmVudCA/IFRoaXMgaXMgaW1wb3J0YW50IG1vc3RseSBpbiBkZXRlcm1pbmluZyBpZiBhIGNsaWNrIGV2ZW50XHJcbiAgLy8vIHdpbGwgYmUgcmFpc2VkIGZvciBhIGRlZmF1bHQgYnV0dG9uIG9yIG5vdC5cclxuICAvLy8gQWRkaW5nIEVudGVyIGFzIGEga2V5Ym9hcmQgZXZlbnQgd2lsbCBub3QgcmFpc2UgY2xpY2sgb24gZGVmYXVsdCBidXR0b24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRBZGRFbnRlckFzS2V5RXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgU2hvd1Nlc3Npb25TdGF0aXN0aWNzRXZlbnQ6ICgpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGxlZCB3aGVuIFdNX0NPUFlEQVRBIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29weURhdGFcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBDb3B5RGF0YUV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGNvcHlEYXRhOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIGZvY3VzIGV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzUHJvZHVjZUNsaWNrXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgRm9jdXNFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbiwgb25NdWx0aU1hcms6IGJvb2xlYW4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIGZvY3VzIG91dCBldmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgRm9jdXNPbk5vbk1hZ2ljQ29udHJvbEV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBNb3VzZURvd24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0N0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRvdE5ldEFyZ3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlZnRDbGlja1dhc1ByZXNzZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9uTXVsdGlNYXJrXCI+aW5kaWNhdGVzIHRoYXQgTXVsdGkgTWFyayBjb250aW51ZXM8L3BhcmFtPlxyXG4gIHN0YXRpYyBNb3VzZURvd25FdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBndWlNZ0N0cmw6IEd1aU1nQ29udHJvbCwgZG90TmV0QXJnczogT2JqZWN0W10sIGxlZnRDbGlja1dhc1ByZXNzZWQ6IGJvb2xlYW4sIGxpbmU6IG51bWJlciwgb25NdWx0aU1hcms6IGJvb2xlYW4sIGNhblByb2R1Y2VDbGljazogYm9vbGVhbikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVGFibGVSZW9yZGVyIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhYk9yZGVyTGlzdFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFRhYmxlUmVvcmRlckV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCB0YWJPcmRlckxpc3Q6IExpc3Q8R3VpTWdDb250cm9sPikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgTW91c2VVcCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgTW91c2VVcEV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIENvbWJvRHJvcHBpbmdEb3duIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBDb21ib0Ryb3BwaW5nRG93bkV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIFNlbGVjdGlvbiBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb2R1Y2VDbGlja1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNlbGVjdGlvbkV2ZW50OiAodmFsOiBzdHJpbmcsIGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIERibENsaWNrIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBEYmxDbGlja0V2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIEtleURvd24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RpZmllclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwia2V5Q29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RhcnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVuZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzQWN0Q2hhclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3VnZ2VzdGVkVmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbWJvSXNEcm9wRG93blwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaGFuZGxlZFwiPmJvb2xlYW4gdmFyaWFibGUgZXZlbnQgaXMgaGFuZGxlZCBvciBub3QuIDwvcGFyYW0+XHJcbiAgc3RhdGljIEtleURvd25FdmVudDogKGZvcm06IEd1aU1nRm9ybSwgZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRlbGVnYXRlIGZvciB0aGUgTXVsdGlNYXJrIGhpdCBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+IGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyb3dcIj4gdGFibGUgcm93IDwvcGFyYW0+XHJcbiAgc3RhdGljIE11bHRpbWFya0hpdEV2ZW50OiAoZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIHJvdzogbnVtYmVyLCBtb2RpZmllcjogTW9kaWZpZXJzKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDbG9zZSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBldmVudCBpcyBDTFIgaGFuZGxlZChjbG9zaW5nIG9mIHRoZSBmb3JtIHdpbGwgYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBDTFIgYW5kIG5vIGNvbW1hbmRzIHdpbGwgYmUgcHV0XHJcbiAgLy8vIGluIHRvIGNsb3NlIHRoZSBmb3JtKSBlbHNlIGZhbHNlLjwvcmV0dXJucz5cclxuICBzdGF0aWMgQ2xvc2VGb3JtRXZlbnQ6IChmb3JtOiBHdWlNZ0Zvcm0pID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIERpc3Bvc2UgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIERpc3Bvc2VFdmVudDogKGZvcm06IEd1aU1nRm9ybSkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVGltZXIgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdUaW1lclwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFRpbWVyRXZlbnQ6IChtZ1RpbWVyOiBNZ1RpbWVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgUmVzaXplIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1Jvd3NJblBhZ2VcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBUYWJsZVJlc2l6ZUV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBuZXdSb3dzSW5QYWdlOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIEdldFJvd3NEYXRhIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlc2lyZWRUb3BJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdEZvY3VzZWRWYWxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBHZXRSb3dzRGF0YUV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBFbmFibGVDdXRDb3B5IEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVuYWJsZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIEVuYWJsZUN1dENvcHlFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgZW5hYmxlOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBFbmFibGVQYXN0ZSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmFibGVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBFbmFibGVQYXN0ZUV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBlbmFibGU6IGJvb2xlYW4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIENvbHVtbkNsaWNrIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpcmVjdGlvblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29sdW1uSGVhZGVyXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgQ29sdW1uQ2xpY2tFdmVudDogKGNvbHVtbkN0cmw6IEd1aU1nQ29udHJvbCwgZGlyZWN0aW9uOiBudW1iZXIsIGNvbHVtbkhlYWRlcjogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyByZWZyZXNoVGFibGVzIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBSZWZyZXNoVGFibGVzRXZlbnQ6ICgpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5PbkhlbHBDbG9zZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhY3RpdmVGb3JtXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgSGVscENsb3NlRXZlbnQ6IChhY3RpdmVGb3JtOiBHdWlNZ0Zvcm0pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBkaXNwbGF5U2Vzc2lvblN0YXRpc3RpY3MgPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBEaXNwbGF5U2Vzc2lvblN0YXRpc3RpY3NFdmVudDogKCkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0cnVlIGZvciBub24gaW50ZXJhY3RpdmUgdGFzayBmb3IgYWxsIGNvbnRyb2xzIGV4Y2VwdCBhIGJ1dHRvbiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y2xpY2tlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRCbG9ja01vdXNlRXZlbnRzRXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+cGVla0VuZE9mV29yazwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBQZWVrRW5kT2ZXb3JrRXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyB0aGUgR2V0RXZlbnRUaW1lIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldEV2ZW50VGltZUV2ZW50OiAoKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGludm9rZXMgdGhlIFNjcm9sbFRhYmxlIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ09iamVjdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicm93c1RvU2Nyb2xsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1BhZ2VTY3JvbGxcIj5uZXh0L3ByZXYgcGFnZT88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzVGFibGVTY3JvbGxcIj5CZWdpbi9FbmQgVGFibGU/PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1JhaXNlZEJ5TW91c2VXaGVlbFwiPmluZGljYXRlcyB3aGV0aGVyIGV2ZW50IGlzIHJhaXNlZCBieSBtb3VzZXdoZWVsIG9yIG5vdC48L3BhcmFtPlxyXG4gIHN0YXRpYyBTY3JvbGxUYWJsZUV2ZW50OiAoZ3VpTWdPYmplY3Q6IGFueSwgbGluZTogbnVtYmVyLCByb3dzVG9TY3JvbGw6IG51bWJlciwgaXNQYWdlU2Nyb2xsOiBib29sZWFuLCBpc1RhYmxlU2Nyb2xsOiBib29sZWFuLCBpc1JhaXNlZEJ5TW91c2VXaGVlbDogYm9vbGVhbikgPT4gYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyB0aGUgdXNlciBkZWZpbmVkIERyb3AgZm9ybWF0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0RHJvcFVzZXJGb3JtYXRzRXZlbnQ6ICgpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250ZXh0IGlkIGZyb20gR3VpTWdGb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldENvbnRleHRJREV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pID0+IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvd0Zvcm1FdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnZva2VzIE9uRm9ybUFjdGl2YXRlRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBPbkZvcm1BY3RpdmF0ZUV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGludm9rZXMgT25OQ0FjdGl2YXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgT25OQ0FjdGl2YXRlRXZlbnQ6IChndWlNZ0Zvcm06IEd1aU1nRm9ybSkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZSBXTV9LRVlVUCAtIChyZXF1aXJlZCBvbmx5IGZvciBBQ1RfTkVYVF9SVF9XSU5ET1csIEFDVF9QUkVWX1JUX1dJTkRPVyBmb3Igc29ydGluZyB3aW5kb3dsaXN0XHJcbiAgLy8vIHdoZW4gdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdGlvbiBpcyByZWxlYXNlZClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwia2V5Q29kZVwiPmtleWNvZGUgb2YgYSBrZXkgd2hpY2ggaXMganVzdCByZWxlYXNlZDwvcGFyYW0+XHJcbiAgc3RhdGljIEhhbmRsZUtleVVwTWVzc2FnZUV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGtleUNvZGU6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIHdoZXRoZXIgd2Ugc2hvdWxkIHNob3cgTG9nb24gd2luZG93IGluIFJUT0wgZm9ybWF0IG9yIG5vdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uSXNMb2dvblJUTEV2ZW50OiAoKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcblxyXG4gIHN0YXRpYyBPbklzU3BlY2lhbEVuZ0xvZ29uRXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuXHJcbiAgc3RhdGljIE9uSXNTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0RXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBnZXRNYWluUHJvZ3JhbSBFdmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElEXCI+YWN0aXZlL3RhcmdldCBjb250ZXh0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdGxJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldE1haW5Qcm9ncmFtRXZlbnQ6IChjb250ZXh0SUQ6IG51bWJlciwgY3RsSWR4OiBudW1iZXIpID0+IEd1aVRhc2tCYXNlID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBMb2dpY2FsIG5hbWUgdHJhbnNsYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21TdHJpbmdcIj5zb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJhbnNsYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIFRyYW5zbGF0ZUxvZ2ljYWxOYW1lRXZlbnQ6IChmcm9tU3RyaW5nOiBzdHJpbmcpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pbnZva2VzIGdldE1lc3NhZ2VTdHJpbmcgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldE1lc3NhZ2VTdHJpbmdFdmVudDogKG1zZ0lkOiBzdHJpbmcpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgZm9jdXMgZXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNQcm9kdWNlQ2xpY2tcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkZvY3VzKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbiwgb25NdWx0aU1hcms6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuRm9jdXNFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuRm9jdXNFdmVudChjdHJsLCBsaW5lLCBpc1Byb2R1Y2VDbGljaywgb25NdWx0aU1hcmspO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBmb2N1cyBldmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsIHJlY2VpdmluZyBsb3N0Rm9jdXNcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkZvY3VzT25Ob25NYWdpY0NvbnRyb2woY3RybDogR3VpTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkZvY3VzT25Ob25NYWdpY0NvbnRyb2xFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuRm9jdXNPbk5vbk1hZ2ljQ29udHJvbEV2ZW50KGN0cmwpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgTW91c2VEb3duIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb3ROZXRBcmdzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZWZ0Q2xpY2tXYXNQcmVzc2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbk11bHRpTWFya1wiPmluZGljYXRlcyB0aGF0IE11bHRpIE1hcmsgY29udGludWVzPC9wYXJhbT5cclxuICBzdGF0aWMgT25Nb3VzZURvd24oZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGd1aU1nQ3RybDogR3VpTWdDb250cm9sLCBkb3ROZXRBcmdzOiBhbnlbXSwgbGVmdENsaWNrV2FzUHJlc3NlZDogYm9vbGVhbiwgbGluZTogbnVtYmVyLCBvbk11bHRpTWFyazogYm9vbGVhbiwgY2FuUHJvZHVjZUNsaWNrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLk1vdXNlRG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5Nb3VzZURvd25FdmVudChndWlNZ0Zvcm0sIGd1aU1nQ3RybCwgZG90TmV0QXJncywgbGVmdENsaWNrV2FzUHJlc3NlZCwgbGluZSwgb25NdWx0aU1hcmssIGNhblByb2R1Y2VDbGljayk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBWaXNpYmlsaXR5Q2hhbmdlZCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y29udHJvbCB3aG9zZSB2aXNpYmlsaXR5IGlzIGNoYW5nZWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBPbk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmwoY3RybDogR3VpTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmxFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuTm9uUGFya2FibGVMYXN0UGFya2VkQ3RybEV2ZW50KGN0cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBUYWJsZVJlb3JkZXIgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFiT3JkZXJMaXN0XCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25UYWJsZVJlb3JkZXIoY3RybDogR3VpTWdDb250cm9sLCB0YWJPcmRlckxpc3Q6IExpc3Q8R3VpTWdDb250cm9sPik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5UYWJsZVJlb3JkZXJFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuVGFibGVSZW9yZGVyRXZlbnQoY3RybCwgdGFiT3JkZXJMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgTW91c2VVcCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25Nb3VzZVVwKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLk1vdXNlVXBFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuTW91c2VVcEV2ZW50KGN0cmwsIGxpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDb21ib0Ryb3BwaW5nRG93biBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25Db21ib0Ryb3BwaW5nRG93bihjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Db21ib0Ryb3BwaW5nRG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5Db21ib0Ryb3BwaW5nRG93bkV2ZW50KGN0cmwsIGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBTZWxlY3Rpb24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9kdWNlQ2xpY2tcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPblNlbGVjdGlvbih2YWw6IHN0cmluZywgY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHByb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5TZWxlY3Rpb25FdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuU2VsZWN0aW9uRXZlbnQodmFsLCBjdHJsLCBsaW5lLCBwcm9kdWNlQ2xpY2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBEYmxDbGljayBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25EYmxDbGljayhjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5EYmxDbGlja0V2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5EYmxDbGlja0V2ZW50KGN0cmwsIGxpbmUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgS2V5RG93biBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0N0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGlmaWVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJrZXlDb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdGFydFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5kXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNBY3RDaGFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWdnZXN0ZWRWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29tYm9Jc0Ryb3BEb3duXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoYW5kbGVkXCI+Ym9vbGVhbiB2YXJpYWJsZSBldmVudCBpcyBoYW5kbGVkIG9yIG5vdC4gPC9wYXJhbT5cclxuICBzdGF0aWMgT25LZXlEb3duKGZvcm06IEd1aU1nRm9ybSwgZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHN0YXRpYyBPbktleURvd24oZm9ybTogR3VpTWdGb3JtLCBjdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBoYW5kbGVkOiBib29sZWFuKTogdm9pZDtcclxuICBzdGF0aWMgT25LZXlEb3duKGZvcm06IEd1aU1nRm9ybSwgY3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvbWJvSXNEcm9wRG93bjogYm9vbGVhbiwgaGFuZGxlZDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc3RhdGljIE9uS2V5RG93bihmb3JtOiBHdWlNZ0Zvcm0sIGd1aU1nQ3RybE9yQ3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0T3JTdWdnZXN0ZWRWYWx1ZTogYW55LCBlbmRPckNvbWJvSXNEcm9wRG93bjogYW55LCB0ZXh0T3JIYW5kbGVkOiBhbnksIGlzQWN0Q2hhcj86IGJvb2xlYW4sIHN1Z2dlc3RlZFZhbHVlPzogc3RyaW5nLCBjb21ib0lzRHJvcERvd25PckhhbmRsZWQ/OiBib29sZWFuLCBoYW5kbGVkPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDExKVxyXG4gICAgICBFdmVudHMuT25LZXlEb3duXzAoZm9ybSwgZ3VpTWdDdHJsT3JDdHJsLCBtb2RpZmllciwga2V5Q29kZSwgc3RhcnRPclN1Z2dlc3RlZFZhbHVlLCBlbmRPckNvbWJvSXNEcm9wRG93biwgdGV4dE9ySGFuZGxlZCwgaXNBY3RDaGFyLCBzdWdnZXN0ZWRWYWx1ZSwgY29tYm9Jc0Ryb3BEb3duT3JIYW5kbGVkLCBoYW5kbGVkKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxMClcclxuICAgICAgRXZlbnRzLk9uS2V5RG93bl8xKGZvcm0sIGd1aU1nQ3RybE9yQ3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIHN0YXJ0T3JTdWdnZXN0ZWRWYWx1ZSwgZW5kT3JDb21ib0lzRHJvcERvd24sIHRleHRPckhhbmRsZWQsIGlzQWN0Q2hhciwgc3VnZ2VzdGVkVmFsdWUsIGNvbWJvSXNEcm9wRG93bk9ySGFuZGxlZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIEV2ZW50cy5PbktleURvd25fMihmb3JtLCBndWlNZ0N0cmxPckN0cmwsIG1vZGlmaWVyLCBrZXlDb2RlLCBzdGFydE9yU3VnZ2VzdGVkVmFsdWUsIGVuZE9yQ29tYm9Jc0Ryb3BEb3duLCB0ZXh0T3JIYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE9uS2V5RG93bl8wKGZvcm06IEd1aU1nRm9ybSwgZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuS2V5RG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5LZXlEb3duRXZlbnQoZm9ybSwgZ3VpTWdDdHJsLCBtb2RpZmllciwga2V5Q29kZSwgc3RhcnQsIGVuZCwgdGV4dCwgaXNBY3RDaGFyLCBzdWdnZXN0ZWRWYWx1ZSwgY29tYm9Jc0Ryb3BEb3duLCBoYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBPbk11bHRpTWFya0hpdChjdHJsOiBHdWlNZ0NvbnRyb2wsIHJvdzogbnVtYmVyLCBtb2RpZmllcjogTW9kaWZpZXJzKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLk11bHRpbWFya0hpdEV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5NdWx0aW1hcmtIaXRFdmVudChjdHJsLCByb3csIG1vZGlmaWVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE9uS2V5RG93bl8xKGZvcm06IEd1aU1nRm9ybSwgY3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGlzQWN0Q2hhcjogYm9vbGVhbiwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZywgaGFuZGxlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5LZXlEb3duRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5LZXlEb3duRXZlbnQoZm9ybSwgY3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIHN0YXJ0LCBlbmQsIHRleHQsIGlzQWN0Q2hhciwgc3VnZ2VzdGVkVmFsdWUsIGZhbHNlLCBoYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE9uS2V5RG93bl8yKGZvcm06IEd1aU1nRm9ybSwgY3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvbWJvSXNEcm9wRG93bjogYm9vbGVhbiwgaGFuZGxlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5LZXlEb3duRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5LZXlEb3duRXZlbnQoZm9ybSwgY3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIDAsIDAsIG51bGwsIGZhbHNlLCBzdWdnZXN0ZWRWYWx1ZSwgY29tYm9Jc0Ryb3BEb3duLCBoYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgQ2xvc2UgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgZXZlbnQgaXMgQ0xSIGhhbmRsZWQoY2xvc2luZyBvZiB0aGUgZm9ybSB3aWxsIGJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgQ0xSIGFuZCBubyBjb21tYW5kcyB3aWxsIGJlIHB1dFxyXG4gIC8vLyBpbiB0byBjbG9zZSB0aGUgZm9ybSkgZWxzZSBmYWxzZS48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uRm9ybUNsb3NlKGZvcm06IEd1aU1nRm9ybSk6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5DbG9zZUZvcm1FdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gRXZlbnRzLkNsb3NlRm9ybUV2ZW50KGZvcm0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBEaXNwb3NlIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkRpc3Bvc2UoZm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkRpc3Bvc2VFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuRGlzcG9zZUV2ZW50KGZvcm0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBUaW1lciBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ1RpbWVyXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25UaW1lcihtZ1RpbWVyOiBNZ1RpbWVyKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLlRpbWVyRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLlRpbWVyRXZlbnQobWdUaW1lcik7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgUmVzaXplIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1Jvd3NJblBhZ2VcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPblRhYmxlUmVzaXplKGN0cmw6IEd1aU1nQ29udHJvbCwgbmV3Um93c0luUGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlRhYmxlUmVzaXplRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlRhYmxlUmVzaXplRXZlbnQoY3RybCwgbmV3Um93c0luUGFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIEdldFJvd3NEYXRhIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlc2lyZWRUb3BJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdEZvY3VzZWRWYWxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkdldFJvd3NEYXRhKGN0cmw6IEd1aU1nQ29udHJvbCwgZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4sIGxhc3RGb2N1c2VkVmFsOiBMYXN0Rm9jdXNlZFZhbCk6IHZvaWQge1xyXG4gICAgICBpZiAoRXZlbnRzLkdldFJvd3NEYXRhRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgIEV2ZW50cy5HZXRSb3dzRGF0YUV2ZW50KGN0cmwsIGRlc2lyZWRUb3BJbmRleCwgc2VuZEFsbCwgbGFzdEZvY3VzZWRWYWwpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDb2x1bW5DbGljayBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2x1bW5DdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkaXJlY3Rpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkhlYWRlclwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uQ29sdW1uQ2xpY2soY29sdW1uQ3RybDogR3VpTWdDb250cm9sLCBkaXJlY3Rpb246IG51bWJlciwgY29sdW1uSGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuQ29sdW1uQ2xpY2tFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuQ29sdW1uQ2xpY2tFdmVudChjb2x1bW5DdHJsLCBkaXJlY3Rpb24sIGNvbHVtbkhlYWRlcik7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyByZWZyZXNoVGFibGVzIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBSZWZyZXNoVGFibGVzKCk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5SZWZyZXNoVGFibGVzRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlJlZnJlc2hUYWJsZXNFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5PbkhlbHBDbG9zZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhY3RpdmVGb3JtXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25DbG9zZUhlbHAoYWN0aXZlRm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLkhlbHBDbG9zZUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5IZWxwQ2xvc2VFdmVudChhY3RpdmVGb3JtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgVFJVRSwgaWYgQmF0Y2ggdGFzayBpcyBydW5uaW5nIGluIE1BSU4gY29udGV4dC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBJc0JhdGNoUnVubmluZ0luTWFpbkNvbnRleHQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChFdmVudHMuSXNCYXRjaFJ1bm5pbmdJbk1haW5Db250ZXh0RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgcmV0VmFsdWUgPSBFdmVudHMuSXNCYXRjaFJ1bm5pbmdJbk1haW5Db250ZXh0RXZlbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRWYWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+TUxTIHRyYW5zbGF0aW9uPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21TdHJpbmdcIj5zb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJhbnNsYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIFRyYW5zbGF0ZShmcm9tU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5UcmFuc2xhdGVFdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gKGZyb21TdHJpbmcgIT09IG51bGwgJiYgZnJvbVN0cmluZy5sZW5ndGggPiAwKSA/IEV2ZW50cy5UcmFuc2xhdGVFdmVudChmcm9tU3RyaW5nKSA6IGZyb21TdHJpbmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgUHJpbnQgUHJldmlldyBGb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj5jb250ZXh0IGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpb1B0clwiPnBvaW50ZXIgdG8gY3VycmVudCBJT1JUIG9iamVjdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29waWVzXCI+bnVtYmVyIG9mIGNvcGllczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5hYmxlUERsZ1wiPmluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSBQcmludCBkaWFsb2c8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhXbmRcIj5IYW5kbGUgb2YgUHJpbnQgUHJldmlldyBGb3JtPC9wYXJhbT5cclxuICBzdGF0aWMgT25QcmludFByZXZpZXdTdGFydChjb250ZXh0SUQ6IG51bWJlciwgaW9QdHI6IG51bWJlciwgY29waWVzOiBudW1iZXIsIGVuYWJsZVBEbGc6IGJvb2xlYW4sIGhXbmQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5QcmludFByZXZpZXdTdGFydEV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5QcmludFByZXZpZXdTdGFydEV2ZW50KGNvbnRleHRJRCwgaW9QdHIsIGNvcGllcywgZW5hYmxlUERsZywgaFduZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCBjdXJzb3IgdG8gUHJpbnQgUHJldmlldyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm5QcmV2RGF0YVwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIE9uUHJpbnRQcmV2aWV3U2V0Q3Vyc29yKHByaW50UHJldmlld0RhdGE6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5QcmludFByZXZpZXdTZXRDdXJzb3JFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuUHJpbnRQcmV2aWV3U2V0Q3Vyc29yRXZlbnQocHJpbnRQcmV2aWV3RGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5cclxuICAvLy8gSGFuZGxlcyBJbnZva2UgVURQIG9wZXJhdGlvbiBmcm9tIEdVSSB0aHJlYWRcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj5Db250ZXh0IGlkPC9wYXJhbT5cclxuICBzdGF0aWMgSW52b2tlVURQKGNvbnRleHRJZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXQ6IG51bWJlciA9IDA7XHJcbiAgICBpZiAoRXZlbnRzLkludm9rZVVEUEV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIHJldCA9IEV2ZW50cy5JbnZva2VVRFBFdmVudChjb250ZXh0SWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIFByaW50IFByZXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByblByZXZEYXRhXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgT25QcmludFByZXZpZXdVcGRhdGUocHJuUHJldkRhdGE6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5QcmludFByZXZpZXdVcGRhdGVFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuUHJpbnRQcmV2aWV3VXBkYXRlRXZlbnQocHJuUHJldkRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGUgUmljaCBFZGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxQdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBybVB0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3R5bGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR3RXhTdHlsZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uQ3JlYXRlUmljaFdpbmRvdyhjb250ZXh0SUQ6IG51bWJlciwgY3RybFB0cjogbnVtYmVyLCBwcm1QdHI6IG51bWJlciwgc3R5bGU6IG51bWJlciwgZHdFeFN0eWxlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuQ3JlYXRlUmljaFdpbmRvd0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5DcmVhdGVSaWNoV2luZG93RXZlbnQoY29udGV4dElELCBjdHJsUHRyLCBwcm1QdHIsIHN0eWxlLCBkd0V4U3R5bGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vICBDcmVhdGVzIGEgd2luZG93XHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiZXhTdHlsZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJjbGFzc05hbWVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwid2luZG93TmFtZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJzdHlsZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJ4XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cInlcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwid2lkdGhcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiaGVpZ2h0XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImh3bmRQYXJlbnRcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiaE1lbnVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiaEluc3RhbmNlXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImxQYXJhbVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHJldHVybnM+aGFuZGxlIG9mIHdpbmRvdzwvcmV0dXJucz5cclxuICBzdGF0aWMgT25DcmVhdGVHdWlXaW5kb3coZXhTdHlsZTogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZywgd2luZG93TmFtZTogc3RyaW5nLCBzdHlsZTogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGh3bmRQYXJlbnQ6IG51bWJlciwgaE1lbnU6IG51bWJlciwgaEluc3RhbmNlOiBudW1iZXIsIGxQYXJhbTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRWYWx1ZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChFdmVudHMuQ3JlYXRlR3VpV2luZG93RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgcmV0VmFsdWUgPSBFdmVudHMuQ3JlYXRlR3VpV2luZG93RXZlbnQoZXhTdHlsZSwgY2xhc3NOYW1lLCB3aW5kb3dOYW1lLCBzdHlsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaHduZFBhcmVudCwgaE1lbnUsIGhJbnN0YW5jZSwgbFBhcmFtKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRGVzdHJveXMgYSB3aW5kb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhXbmRQdHJcIj5oYW5kbGUgb2Ygd2luZG93PC9wYXJhbT5cclxuICBzdGF0aWMgT25EZXN0cm95R3VpV2luZG93KGhXbmRQdHI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5EZXN0cm95R3VpV2luZG93RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLkRlc3Ryb3lHdWlXaW5kb3dFdmVudChoV25kUHRyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gT25DbG9zZSBQcmludCBQcmV2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kUHRyXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgT25QcmludFByZXZpZXdDbG9zZShwcmludFByZXZpZXdEYXRhUHRyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuUHJpbnRQcmV2aWV3Q2xvc2VFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuUHJpbnRQcmV2aWV3Q2xvc2VFdmVudChwcmludFByZXZpZXdEYXRhUHRyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdyBQcmludCBEaWFsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImdwZFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uU2hvd1ByaW50RGlhbG9nKGdwZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRWYWx1ZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChFdmVudHMuU2hvd1ByaW50RGlhbG9nRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgcmV0VmFsdWUgPSBFdmVudHMuU2hvd1ByaW50RGlhbG9nRXZlbnQoZ3BkKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZGlzcGxheVNlc3Npb25TdGF0aXN0aWNzIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgRGlzcGxheVNlc3Npb25TdGF0aXN0aWNzKCk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5EaXNwbGF5U2Vzc2lvblN0YXRpc3RpY3NFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuRGlzcGxheVNlc3Npb25TdGF0aXN0aWNzRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0cnVlIGZvciBub24gaW50ZXJhY3RpdmUgdGFzayBmb3IgYWxsIGNvbnRyb2xzIGV4Y2VwdCBhIGJ1dHRvbiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y2xpY2tlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRCbG9ja01vdXNlRXZlbnRzKGN0cmw6IEd1aU1nQ29udHJvbCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEV2ZW50cy5TaG91bGRCbG9ja01vdXNlRXZlbnRzRXZlbnQgIT09IG51bGwgJiYgRXZlbnRzLlNob3VsZEJsb2NrTW91c2VFdmVudHNFdmVudChjdHJsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5wZWVrRW5kT2ZXb3JrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFBlZWtFbmRPZldvcmsoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRXZlbnRzLlBlZWtFbmRPZldvcmtFdmVudCAhPT0gbnVsbCAmJiBFdmVudHMuUGVla0VuZE9mV29ya0V2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyB0aGUgR2V0RXZlbnRUaW1lIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldEV2ZW50VGltZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChFdmVudHMuR2V0RXZlbnRUaW1lRXZlbnQgIT09IG51bGwpID8gRXZlbnRzLkdldEV2ZW50VGltZUV2ZW50KCkgOiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnZva2VzIHRoZSBTY3JvbGxUYWJsZSBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdPYmplY3RcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJvd3NUb1Njcm9sbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNQYWdlU2Nyb2xsXCI+bmV4dC9wcmV2IHBhZ2U/PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1RhYmxlU2Nyb2xsXCI+QmVnaW4vRW5kIFRhYmxlPzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNSYWlzZWRCeU1vdXNlV2hlZWxcIj5pbmRpY2F0ZXMgd2hldGhlciBldmVudCBpcyByYWlzZWQgYnkgbW91c2V3aGVlbCBvciBub3QuPC9wYXJhbT5cclxuICBzdGF0aWMgT25TY3JvbGxUYWJsZShndWlNZ09iamVjdDogYW55LCBsaW5lOiBudW1iZXIsIHJvd3NUb1Njcm9sbDogbnVtYmVyLCBpc1BhZ2VTY3JvbGw6IGJvb2xlYW4sIGlzVGFibGVTY3JvbGw6IGJvb2xlYW4sIGlzUmFpc2VkQnlNb3VzZVdoZWVsOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaGFuZGxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKEV2ZW50cy5TY3JvbGxUYWJsZUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGhhbmRsZWQgPSBFdmVudHMuU2Nyb2xsVGFibGVFdmVudChndWlNZ09iamVjdCwgbGluZSwgcm93c1RvU2Nyb2xsLCBpc1BhZ2VTY3JvbGwsIGlzVGFibGVTY3JvbGwsIGlzUmFpc2VkQnlNb3VzZVdoZWVsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBoYW5kbGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSB1c2VyIGRlZmluZWQgRHJvcCBmb3JtYXRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXREcm9wVXNlckZvcm1hdHMoKTogc3RyaW5nIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0RHJvcFVzZXJGb3JtYXRzRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5HZXREcm9wVXNlckZvcm1hdHNFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbnRleHQgaWQgZnJvbSBHdWlNZ0Zvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0Q29udGV4dElEKGd1aU1nRm9ybTogR3VpTWdGb3JtKTogbnVtYmVyIHtcclxuICAgIGxldCBjb250ZXh0SUQ6IG51bWJlciA9IC0xO1xyXG4gICAgRGVidWcuQXNzZXJ0KGd1aU1nRm9ybSAhPT0gbnVsbCk7XHJcbiAgICBpZiAoRXZlbnRzLkdldENvbnRleHRJREV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnRleHRJRCA9IEV2ZW50cy5HZXRDb250ZXh0SURFdmVudChndWlNZ0Zvcm0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnRleHRJRDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0TW9kYWwgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvblwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNldE1vZGFsKG1nRm9ybTogTWdGb3JtQmFzZSwgb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuU2V0TW9kYWxFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuU2V0TW9kYWxFdmVudChtZ0Zvcm0sIG9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgT25TaG93Rm9ybShndWlNZ0Zvcm06IEd1aU1nRm9ybSk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5TaG93Rm9ybUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5TaG93Rm9ybUV2ZW50KGd1aU1nRm9ybSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGludm9rZXMgT25Gb3JtQWN0aXZhdGVFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIE9uRm9ybUFjdGl2YXRlKGd1aU1nRm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLk9uRm9ybUFjdGl2YXRlRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLk9uRm9ybUFjdGl2YXRlRXZlbnQoZ3VpTWdGb3JtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW52b2tlcyBPbk5DQWN0aXZhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBPbk5DQWN0aXZhdGUoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuT25OQ0FjdGl2YXRlRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLk9uTkNBY3RpdmF0ZUV2ZW50KGd1aU1nRm9ybSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBIYW5kbGUgV01fS0VZVVAgLSAocmVxdWlyZWQgb25seSBmb3IgQUNUX05FWFRfUlRfV0lORE9XLCBBQ1RfUFJFVl9SVF9XSU5ET1cgZm9yIHNvcnRpbmcgd2luZG93bGlzdFxyXG4gIC8vLyB3aGVuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY3Rpb24gaXMgcmVsZWFzZWQpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImtleUNvZGVcIj5rZXljb2RlIG9mIGEga2V5IHdoaWNoIGlzIGp1c3QgcmVsZWFzZWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBIYW5kbGVLZXlVcE1lc3NhZ2UoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGtleUNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5IYW5kbGVLZXlVcE1lc3NhZ2VFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuSGFuZGxlS2V5VXBNZXNzYWdlRXZlbnQoZ3VpTWdGb3JtLCBrZXlDb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIHdoZXRoZXIgd2Ugc2hvdWxkIHNob3cgTG9nb24gd2luZG93IGluIFJUT0wgZm9ybWF0IG9yIG5vdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIElzTG9nb25SVEwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSVEw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChFdmVudHMuT25Jc0xvZ29uUlRMRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgaXNSVEwgPSBFdmVudHMuT25Jc0xvZ29uUlRMRXZlbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc1JUTDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBJc1NwZWNpYWxFbmdMb2dvbigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0VuZ0xvZ29uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoRXZlbnRzLk9uSXNTcGVjaWFsRW5nTG9nb25FdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBpc0VuZ0xvZ29uID0gRXZlbnRzLk9uSXNTcGVjaWFsRW5nTG9nb25FdmVudCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzRW5nTG9nb247XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgSXNTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzSWdub3JlQnV0dG9uRm9ybWF0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoRXZlbnRzLk9uSXNTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgaXNJZ25vcmVCdXR0b25Gb3JtYXQgPSBFdmVudHMuT25Jc1NwZWNpYWxJZ25vcmVCdXR0b25Gb3JtYXRFdmVudCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzSWdub3JlQnV0dG9uRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBnZXRNYWluUHJvZ3JhbSBFdmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElEXCI+YWN0aXZlL3RhcmdldCBjb250ZXh0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdGxJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldE1haW5Qcm9ncmFtKGNvbnRleHRJRDogbnVtYmVyLCBjdGxJZHg6IG51bWJlcik6IEd1aVRhc2tCYXNlIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0TWFpblByb2dyYW1FdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gRXZlbnRzLkdldE1haW5Qcm9ncmFtRXZlbnQoY29udGV4dElELCBjdGxJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBMb2dpY2FsIG5hbWUgdHJhbnNsYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21TdHJpbmdcIj5zb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJhbnNsYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIFRyYW5zbGF0ZUxvZ2ljYWxOYW1lKGZyb21TdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLlRyYW5zbGF0ZUxvZ2ljYWxOYW1lRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZUV2ZW50KGZyb21TdHJpbmcpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pmludm9rZXMgZ2V0TWVzc2FnZVN0cmluZyBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0TWVzc2FnZVN0cmluZyhtc2dJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0TWVzc2FnZVN0cmluZ0V2ZW50ICE9PSBudWxsKTtcclxuICAgIGxldCBmcm9tU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZ0V2ZW50KG1zZ0lkKTtcclxuICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBFdmVudHMuVHJhbnNsYXRlKGZyb21TdHJpbmcpO1xyXG4gICAgaWYgKHRleHQgIT09IG51bGwgJiYgdGV4dC5lbmRzV2l0aChcIjpcIikpIHtcclxuICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlcjtcclxuICAgICAgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIodGV4dCk7XHJcbiAgICAgIHN0ci5JbnNlcnQodGV4dC5sZW5ndGgsIFwiIFwiKTtcclxuICAgICAgdGV4dCA9IHN0ci5Ub1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRleHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+cmFpc2VzIEN0cmxGb2N1c0V2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uQ3RybEZvY3VzKGlUYXNrOiBJVGFzaywgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5DdHJsRm9jdXNFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuQ3RybEZvY3VzRXZlbnQoaVRhc2ssIDxNZ0NvbnRyb2xCYXNlPmN0cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBDdXJyZW50IHByb2Nlc3NpbmcgdGFzazwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRDdXJyZW50VGFzaygpOiBJVGFzayB7XHJcbiAgICByZXR1cm4gKEV2ZW50cy5HZXRDdXJyZW50VGFza0V2ZW50ICE9PSBudWxsKSA/IEV2ZW50cy5HZXRDdXJyZW50VGFza0V2ZW50KCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSBSdW50aW1lQ29udGV4dEJhc2UgdGhhdCBiZWxvbmdzIHRvIHRoZSBjb250ZXh0SURcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0UnVudGltZUNvbnRleHQoY29udGV4dElEOiBzdHJpbmcpOiBSdW50aW1lQ29udGV4dEJhc2Uge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5HZXRSdW50aW1lQ29udGV4dEV2ZW50ICE9PSBudWxsKTtcclxuICAgIHJldHVybiBFdmVudHMuR2V0UnVudGltZUNvbnRleHRFdmVudChjb250ZXh0SUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTYXZlcyB0aGUgbmFtZSBvZiB0aGUgbGFzdCBjbGlja2VkIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj5ndWlNZ0NvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xOYW1lXCI+TmFtZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgc3RhdGljIFNhdmVMYXN0Q2xpY2tlZEN0cmxOYW1lKGd1aU1nQ29udHJvbDogR3VpTWdDb250cm9sLCBjb250cm9sTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlNhdmVMYXN0Q2xpY2tlZEN0cmxFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuU2F2ZUxhc3RDbGlja2VkQ3RybEV2ZW50KGd1aU1nQ29udHJvbCwgY29udHJvbE5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTYXZlcyB0aGUgbGFzdCBjbGlja2VkIGluZm9ybWF0aW9uLiAoaS5lLiBDby1vcmRpbmF0ZXMgYW5kIGNvbnRyb2wgbmFtZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPmd1aU1nRm9ybTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbE5hbWVcIj5uYW1lIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZmZzZXRYXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZmZzZXRZXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0Q2xpY2tDb29yZGluYXRlc0FyZUluUGl4ZWxzXCI+Y28tb3JkaW5hdGVzIGFyZSBpbiBwaXhlbCBvciBub3QuPC9wYXJhbT5cclxuICBzdGF0aWMgU2F2ZUxhc3RDbGlja0luZm8oZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGNvbnRyb2xOYW1lOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlciwgbGFzdENsaWNrQ29vcmRpbmF0ZXNBcmVJblBpeGVsczogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5TYXZlTGFzdENsaWNrSW5mb0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5TYXZlTGFzdENsaWNrSW5mb0V2ZW50KGd1aU1nRm9ybSwgY29udHJvbE5hbWUsIHgsIHksIG9mZnNldFgsIG9mZnNldFksIGxhc3RDbGlja0Nvb3JkaW5hdGVzQXJlSW5QaXhlbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlRXJyb3JUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuV3JpdGVFcnJvclRvTG9nRXZlbnQobXNnKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBXcml0ZUV4Y2VwdGlvblRvTG9nKG1zZzogc3RyaW5nKTogdm9pZDtcclxuICBzdGF0aWMgV3JpdGVFeGNlcHRpb25Ub0xvZyhleDogRXhjZXB0aW9uKTogdm9pZDtcclxuICBzdGF0aWMgV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2dPckV4OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIChtc2dPckV4ID09PSBudWxsIHx8IG1zZ09yRXguY29uc3RydWN0b3IgPT09IFN0cmluZykpIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMChtc2dPckV4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMShtc2dPckV4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMChtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuV3JpdGVFcnJvclRvTG9nRXZlbnQobXNnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMShleDogRXhjZXB0aW9uKTogdm9pZCB7XHJcbiAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfXsyfXszfXs0fVwiLCBbXHJcbiAgICAgIGV4LkdldFR5cGUoKSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LlN0YWNrVHJhY2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5NZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+d3JpdGUgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nKG1zZzogc3RyaW5nKTogdm9pZDtcclxuICBzdGF0aWMgV3JpdGVXYXJuaW5nVG9Mb2coZXg6IEV4Y2VwdGlvbik6IHZvaWQ7XHJcbiAgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nKG1zZ09yRXg6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKG1zZ09yRXggPT09IG51bGwgfHwgbXNnT3JFeC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSkge1xyXG4gICAgICBFdmVudHMuV3JpdGVXYXJuaW5nVG9Mb2dfMChtc2dPckV4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nXzEobXNnT3JFeCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBXcml0ZVdhcm5pbmdUb0xvZ18wKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nRXZlbnQobXNnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nXzEoZXg6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nKGV4LkdldFR5cGUoKSArIFwiIDogXCIgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIGV4LlN0YWNrVHJhY2UgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIGV4Lk1lc3NhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibG9nTGV2ZWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFNob3VsZExvZyhsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyk6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5TaG91bGRMb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gRXZlbnRzLlNob3VsZExvZ0V2ZW50KGxvZ0xldmVsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT53cml0ZSBhIEdVSSBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZUd1aVRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLldyaXRlR3VpVG9Mb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuV3JpdGVHdWlUb0xvZ0V2ZW50KFwiR1VJOiBcIiArIG1zZyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+d3JpdGUgYSBERVYgbWVzc2FnZSB0byB0aGUgaW50ZXJuYWwgbG9nIGZpbGU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgV3JpdGVEZXZUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZURldlRvTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLldyaXRlRGV2VG9Mb2dFdmVudChtc2cpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9DTEVBUiBtZXNzYWdlIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25DbGVhcihjdHJsOiBHdWlNZ0NvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgaWYgKEV2ZW50cy5DbGVhckV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBFdmVudHMuQ2xlYXJFdmVudChjdHJsKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9VTkRPIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPblVuZG8oY3RybDogR3VpTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICAgIGlmIChFdmVudHMuVW5kb0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBFdmVudHMuVW5kb0V2ZW50KGN0cmwpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCBFbnRlciBiZSBhZGRlZCBhcyBrZXlib2FyZCBldmVudCA/IFRoaXMgaXMgaW1wb3J0YW50IG1vc3RseSBpbiBkZXRlcm1pbmluZyBpZiBhIGNsaWNrIGV2ZW50XHJcbiAgLy8vIHdpbGwgYmUgcmFpc2VkIGZvciBhIGRlZmF1bHQgYnV0dG9uIG9yIG5vdC5cclxuICAvLy8gQWRkaW5nIEVudGVyIGFzIGEga2V5Ym9hcmQgZXZlbnQgd2lsbCBub3QgcmFpc2UgY2xpY2sgb24gZGVmYXVsdCBidXR0b24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBBZGRFbnRlckFzS2V5RXZlbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRXZlbnRzLlNob3VsZEFkZEVudGVyQXNLZXlFdmVudCAhPT0gbnVsbCAmJiBFdmVudHMuU2hvdWxkQWRkRW50ZXJBc0tleUV2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgU2hvd1Nlc3Npb25TdGF0aXN0aWNzRm9ybSgpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuU2hvd1Nlc3Npb25TdGF0aXN0aWNzRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlNob3dTZXNzaW9uU3RhdGlzdGljc0V2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGxlZCB3aGVuIFdNX0NPUFlEQVRBIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29weURhdGFcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkNvcHlEYXRhKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBjb3B5RGF0YTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLkNvcHlEYXRhRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLkNvcHlEYXRhRXZlbnQoZ3VpTWdGb3JtLCBjb3B5RGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcbn1cclxuIl19
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9FdmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFDLEtBQUssRUFBbUIsT0FBTyxFQUFFLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBSXBGLE9BQU8sRUFBbUIsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFXakUsTUFBTSxPQUFPLE1BQU07SUEwa0NqQjtJQUNBLENBQUM7SUEvcUJELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBa0IsRUFBRSxJQUFZLEVBQUUsY0FBdUIsRUFBRSxXQUFvQjtRQUM1RixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBSUQsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQWtCO1FBQ2hELEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDJCQUEyQixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBVUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFvQixFQUFFLFNBQXVCLEVBQUUsVUFBaUIsRUFBRSxtQkFBNEIsRUFBRSxJQUFZLEVBQUUsV0FBb0IsRUFBRSxlQUF3QjtRQUM3SyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFLRCxNQUFNLENBQUMsMkJBQTJCLENBQUMsSUFBa0I7UUFDbkQsSUFBSSxNQUFNLENBQUMsOEJBQThCLEtBQUssSUFBSSxFQUFFO1lBQ2xELE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFLRCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQWtCLEVBQUUsWUFBZ0M7UUFDeEUsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEtBQUssSUFBSSxFQUFFO1lBQ3JDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBS0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFrQixFQUFFLElBQVk7UUFDL0MsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRTtZQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFLRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBa0IsRUFBRSxJQUFZO1FBQ3pELEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLHNCQUFzQixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQU9ELE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBVyxFQUFFLElBQWtCLEVBQUUsSUFBWSxFQUFFLFlBQXFCO1FBQ3JGLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFLRCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQWtCLEVBQUUsSUFBWTtRQUNoRCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQW1CRCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQWUsRUFBRSxlQUE2QixFQUFFLFFBQW1CLEVBQUUsT0FBZSxFQUFFLHFCQUEwQixFQUFFLG9CQUF5QixFQUFFLGFBQWtCLEVBQUUsU0FBbUIsRUFBRSxjQUF1QixFQUFFLHdCQUFrQyxFQUFFLE9BQWlCO1FBQ25SLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBRXBMLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFO1lBQzlCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixDQUFDLENBQUM7O1lBRTlLLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzdILENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQWUsRUFBRSxTQUF1QixFQUFFLFFBQW1CLEVBQUUsT0FBZSxFQUFFLEtBQWEsRUFBRSxHQUFXLEVBQUUsSUFBWSxFQUFFLFNBQWtCLEVBQUUsY0FBc0IsRUFBRSxlQUF3QixFQUFFLE9BQWdCO1FBQ3pPLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqSSxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFrQixFQUFFLEdBQVcsRUFBRSxRQUFtQjtRQUN4RSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFlLEVBQUUsSUFBa0IsRUFBRSxRQUFtQixFQUFFLE9BQWUsRUFBRSxLQUFhLEVBQUUsR0FBVyxFQUFFLElBQVksRUFBRSxTQUFrQixFQUFFLGNBQXNCLEVBQUUsT0FBZ0I7UUFDMU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzNDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekgsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBZSxFQUFFLElBQWtCLEVBQUUsUUFBbUIsRUFBRSxPQUFlLEVBQUUsY0FBc0IsRUFBRSxlQUF3QixFQUFFLE9BQWdCO1FBQ3RLLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUMzQyxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pILENBQUM7SUFNRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQWU7UUFDaEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzdDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBSUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFlO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFJRCxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQWdCO1FBQzdCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFPRCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQWtCLEVBQUUsYUFBcUI7UUFDNUQsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQ3BDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBT0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFrQixFQUFFLGVBQXVCLEVBQUUsT0FBZ0IsRUFBRSxjQUE4QjtRQUM5RyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7WUFDbEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQzNFO0lBQ0wsQ0FBQztJQU9ELE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBd0IsRUFBRSxTQUFpQixFQUFFLFlBQW9CO1FBQ3BGLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFNRCxNQUFNLENBQUMsYUFBYTtRQUNsQixJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLEVBQUU7WUFDdEMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBS0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFxQjtRQUN0QyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBTUQsTUFBTSxDQUFDLDJCQUEyQjtRQUNoQyxJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7UUFDOUIsSUFBSSxNQUFNLENBQUMsZ0NBQWdDLEtBQUssSUFBSSxFQUFFO1lBQ3BELFFBQVEsR0FBRyxNQUFNLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztTQUN0RDtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFNRCxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQWtCO1FBQ2pDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDekcsQ0FBQztJQVVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsVUFBbUIsRUFBRSxJQUFZO1FBQzVHLElBQUksTUFBTSxDQUFDLHNCQUFzQixLQUFLLElBQUksRUFBRTtZQUMxQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQU1ELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBd0I7UUFDckQsSUFBSSxNQUFNLENBQUMsMEJBQTBCLEtBQUssSUFBSSxFQUFFO1lBQzlDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3JEO0lBQ0gsQ0FBQztJQU1ELE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBaUI7UUFDaEMsSUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDbEMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDeEM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFNRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsV0FBbUI7UUFDN0MsSUFBSSxNQUFNLENBQUMsdUJBQXVCLEtBQUssSUFBSSxFQUFFO1lBQzNDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFVRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsTUFBYyxFQUFFLEtBQWEsRUFBRSxTQUFpQjtRQUM1RyxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsS0FBSyxJQUFJLEVBQUU7WUFDekMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztTQUM1RTtJQUNILENBQUM7SUFrQkQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQWUsRUFBRSxTQUFpQixFQUFFLFVBQWtCLEVBQUUsS0FBYSxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxVQUFrQixFQUFFLEtBQWEsRUFBRSxTQUFpQixFQUFFLE1BQWM7UUFDdk4sSUFBSSxRQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksTUFBTSxDQUFDLG9CQUFvQixLQUFLLElBQUksRUFBRTtZQUN4QyxRQUFRLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDMUk7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBTUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE9BQWU7UUFDdkMsSUFBSSxNQUFNLENBQUMscUJBQXFCLEtBQUssSUFBSSxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFNRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsbUJBQTJCO1FBQ3BELElBQUksTUFBTSxDQUFDLHNCQUFzQixLQUFLLElBQUksRUFBRTtZQUMxQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUNwRDtJQUNILENBQUM7SUFNRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBVztRQUNsQyxJQUFJLFFBQVEsR0FBVyxDQUFDLENBQUM7UUFDekIsSUFBSSxNQUFNLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQ3hDLFFBQVEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBR0QsTUFBTSxDQUFDLHdCQUF3QjtRQUM3QixJQUFJLE1BQU0sQ0FBQyw2QkFBNkIsS0FBSyxJQUFJLEVBQUU7WUFDakQsTUFBTSxDQUFDLDZCQUE2QixFQUFFLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBT0QsTUFBTSxDQUFDLHNCQUFzQixDQUFDLElBQWtCO1FBQzlDLE9BQU8sTUFBTSxDQUFDLDJCQUEyQixLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUlELE1BQU0sQ0FBQyxhQUFhO1FBQ2xCLE9BQU8sTUFBTSxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBSUQsTUFBTSxDQUFDLFlBQVk7UUFDakIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBV0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFnQixFQUFFLElBQVksRUFBRSxZQUFvQixFQUFFLFlBQXFCLEVBQUUsYUFBc0IsRUFBRSxvQkFBNkI7UUFDckosSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDO1FBQzdCLElBQUksTUFBTSxDQUFDLGdCQUFnQixLQUFLLElBQUksRUFBRTtZQUNwQyxPQUFPLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztTQUN2SDtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFPRCxNQUFNLENBQUMsa0JBQWtCO1FBQ3ZCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLHVCQUF1QixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDMUMsQ0FBQztJQU9ELE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBb0I7UUFDdEMsSUFBSSxTQUFTLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDM0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEtBQUssSUFBSSxFQUFFO1lBQ3JDLFNBQVMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDakQ7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBT0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFrQixFQUFFLEVBQVc7UUFDN0MsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUNqQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7SUFLRCxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQW9CO1FBQ3BDLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDakMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFLRCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQW9CO1FBQ3hDLElBQUksTUFBTSxDQUFDLG1CQUFtQixLQUFLLElBQUksRUFBRTtZQUN2QyxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBS0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFvQjtRQUN0QyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLEVBQUU7WUFDckMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztJQVNELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFvQixFQUFFLE9BQWU7UUFDN0QsSUFBSSxNQUFNLENBQUMsdUJBQXVCLEtBQUssSUFBSSxFQUFFO1lBQzNDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDcEQ7SUFDSCxDQUFDO0lBTUQsTUFBTSxDQUFDLFVBQVU7UUFDZixJQUFJLEtBQUssR0FBWSxLQUFLLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEtBQUssSUFBSSxFQUFFO1lBQ3JDLEtBQUssR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUNwQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxpQkFBaUI7UUFDdEIsSUFBSSxVQUFVLEdBQVksS0FBSyxDQUFDO1FBQ2hDLElBQUksTUFBTSxDQUFDLHdCQUF3QixLQUFLLElBQUksRUFBRTtZQUM1QyxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDaEQ7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLDJCQUEyQjtRQUNoQyxJQUFJLG9CQUFvQixHQUFZLEtBQUssQ0FBQztRQUMxQyxJQUFJLE1BQU0sQ0FBQyxrQ0FBa0MsS0FBSyxJQUFJLEVBQUU7WUFDdEQsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLGtDQUFrQyxFQUFFLENBQUM7U0FDcEU7UUFDRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFNRCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNyRCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQU9ELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxVQUFrQjtRQUM1QyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN4RCxPQUFPLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBS0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQWE7UUFDbkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMscUJBQXFCLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdELElBQUksSUFBSSxHQUFXLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxHQUFrQixDQUFDO1lBQ3ZCLEdBQUcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUlELE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBWSxFQUFFLElBQStCO1FBQzlELElBQUksTUFBTSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDbEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQWlCLElBQUksQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQU9ELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFpQjtRQUN4QyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNyRCxPQUFPLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBT0QsTUFBTSxDQUFDLHVCQUF1QixDQUFDLFlBQTBCLEVBQUUsV0FBbUI7UUFDNUUsSUFBSSxNQUFNLENBQUMsd0JBQXdCLEtBQUssSUFBSSxFQUFFO1lBQzVDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBWUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBQW9CLEVBQUUsV0FBbUIsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLE9BQWUsRUFBRSxPQUFlLEVBQUUsK0JBQXdDO1FBQ2xLLElBQUksTUFBTSxDQUFDLHNCQUFzQixLQUFLLElBQUksRUFBRTtZQUMxQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsK0JBQStCLENBQUMsQ0FBQztTQUNoSDtJQUNILENBQUM7SUFJRCxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQVc7UUFDaEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDbkQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFJRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBWTtRQUNyQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLE1BQU0sQ0FBQyxFQUFFO1lBQ2xGLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxPQUFPO1NBQ1I7UUFDRCxNQUFNLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFXO1FBQzlDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQWE7UUFDaEQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUU7WUFDOUQsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPO1NBQ3BGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQU1ELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFZO1FBQ25DLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLEVBQUU7WUFDbEYsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLE9BQU87U0FDUjtRQUNELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVc7UUFDNUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxNQUFNLENBQUMsbUJBQW1CLENBQUMsRUFBYTtRQUM5QyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQU9ELE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBMEI7UUFDekMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzdDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBSUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFXO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUlELE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBVztRQUM5QixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQU1ELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBa0I7UUFDN0IsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtZQUM1QixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztJQU1ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBa0I7UUFDNUIsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtZQUMzQixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQVFELE1BQU0sQ0FBQyxrQkFBa0I7UUFDdkIsT0FBTyxNQUFNLENBQUMsd0JBQXdCLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3ZGLENBQUM7SUFJRCxNQUFNLENBQUMseUJBQXlCO1FBQzlCLElBQUksTUFBTSxDQUFDLDBCQUEwQixLQUFLLElBQUksRUFBRTtZQUM5QyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUNyQztJQUNILENBQUM7SUFPRCxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQW9CLEVBQUUsUUFBZ0I7UUFDdEQsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUNqQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7O0FBcmtDTSxxQ0FBOEIsR0FBaUMsSUFBSSxDQUFDO0FBS3BFLHVDQUFnQyxHQUFrQixJQUFJLENBQUM7QUFLdkQscUJBQWMsR0FBbUMsSUFBSSxDQUFDO0FBVXRELDZCQUFzQixHQUFrRyxJQUFJLENBQUM7QUFNN0gsaUNBQTBCLEdBQXVDLElBQUksQ0FBQztBQU10RSxxQkFBYyxHQUFrQyxJQUFJLENBQUM7QUFNckQsOEJBQXVCLEdBQWtDLElBQUksQ0FBQztBQVU5RCw0QkFBcUIsR0FBbUcsSUFBSSxDQUFDO0FBa0I3SCwyQkFBb0IsR0FBaU4sSUFBSSxDQUFDO0FBTTFPLDRCQUFxQixHQUE4QixJQUFJLENBQUM7QUFNeEQsNkJBQXNCLEdBQThCLElBQUksQ0FBQztBQU16RCwyQkFBb0IsR0FBNEIsSUFBSSxDQUFDO0FBT3JELG9CQUFhLEdBQThDLElBQUksQ0FBQztBQUloRSxxQkFBYyxHQUFnRCxJQUFJLENBQUM7QUFPbkUsNkJBQXNCLEdBQThDLElBQUksQ0FBQztBQU96RSwrQkFBd0IsR0FBOEQsSUFBSSxDQUFDO0FBWTNGLDZCQUFzQixHQUEwSixJQUFJLENBQUM7QUFJckwsMkJBQW9CLEdBQTBCLElBQUksQ0FBQztBQUluRCwrQkFBd0IsR0FBMEIsSUFBSSxDQUFDO0FBS3ZELDZCQUFzQixHQUEwQixJQUFJLENBQUM7QUFPckQscUJBQWMsR0FBNEMsSUFBSSxDQUFDO0FBSS9ELHlCQUFrQixHQUEwQixJQUFJLENBQUM7QUFJakQseUJBQWtCLEdBQTBCLElBQUksQ0FBQztBQVFqRCxpQkFBVSxHQUFpQyxJQUFJLENBQUM7QUFNaEQsZ0JBQVMsR0FBaUMsSUFBSSxDQUFDO0FBUS9DLCtCQUF3QixHQUFrQixJQUFJLENBQUM7QUFJL0MsaUNBQTBCLEdBQWUsSUFBSSxDQUFDO0FBTzlDLG9CQUFhLEdBQXFELElBQUksQ0FBQztBQU12RSxpQkFBVSxHQUE4RixJQUFJLENBQUM7QUFJN0csa0NBQTJCLEdBQWlDLElBQUksQ0FBQztBQVNqRSxxQkFBYyxHQUE4SyxJQUFJLENBQUM7QUFLak0sd0JBQWlCLEdBQW1FLElBQUksQ0FBQztBQUt6RixtQkFBWSxHQUErQyxJQUFJLENBQUM7QUFLaEUsNkJBQXNCLEdBQStDLElBQUksQ0FBQztBQU8xRSxxQkFBYyxHQUFtRixJQUFJLENBQUM7QUFLdEcsb0JBQWEsR0FBK0MsSUFBSSxDQUFDO0FBZWpFLG1CQUFZLEdBQWtPLElBQUksQ0FBQztBQU9uUCx3QkFBaUIsR0FBd0UsSUFBSSxDQUFDO0FBTTlGLHFCQUFjLEdBQWlDLElBQUksQ0FBQztBQUlwRCxtQkFBWSxHQUE4QixJQUFJLENBQUM7QUFJL0MsaUJBQVUsR0FBK0IsSUFBSSxDQUFDO0FBTTlDLHVCQUFnQixHQUF3RCxJQUFJLENBQUM7QUFPN0UsdUJBQWdCLEdBQTRHLElBQUksQ0FBQztBQUtqSSx5QkFBa0IsR0FBa0QsSUFBSSxDQUFDO0FBS3pFLHVCQUFnQixHQUFrRCxJQUFJLENBQUM7QUFNdkUsdUJBQWdCLEdBQWdGLElBQUksQ0FBQztBQUtyRyx5QkFBa0IsR0FBZSxJQUFJLENBQUM7QUFNdEMscUJBQWMsR0FBb0MsSUFBSSxDQUFDO0FBSXZELG9DQUE2QixHQUFlLElBQUksQ0FBQztBQU9qRCxrQ0FBMkIsR0FBb0MsSUFBSSxDQUFDO0FBSXBFLHlCQUFrQixHQUFrQixJQUFJLENBQUM7QUFJekMsd0JBQWlCLEdBQWlCLElBQUksQ0FBQztBQVd2Qyx1QkFBZ0IsR0FBb0osSUFBSSxDQUFDO0FBT3pLLDhCQUF1QixHQUFpQixJQUFJLENBQUM7QUFPN0Msd0JBQWlCLEdBQXFDLElBQUksQ0FBQztBQUszRCxvQkFBYSxHQUFtQyxJQUFJLENBQUM7QUFLckQsMEJBQW1CLEdBQW1DLElBQUksQ0FBQztBQUszRCx3QkFBaUIsR0FBbUMsSUFBSSxDQUFDO0FBU3pELDhCQUF1QixHQUFvRCxJQUFJLENBQUM7QUFNaEYsd0JBQWlCLEdBQWtCLElBQUksQ0FBQztBQUd4QywrQkFBd0IsR0FBa0IsSUFBSSxDQUFDO0FBRy9DLHlDQUFrQyxHQUFrQixJQUFJLENBQUM7QUFPekQsMEJBQW1CLEdBQXVELElBQUksQ0FBQztBQU8vRSxnQ0FBeUIsR0FBbUMsSUFBSSxDQUFDO0FBS2pFLDRCQUFxQixHQUE4QixJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0d1aU1nQ29udHJvbH0gZnJvbSBcIi4vZ3VpL0d1aU1nQ29udHJvbFwiO1xyXG5pbXBvcnQge01nRm9ybUJhc2V9IGZyb20gXCIuL21hbmFnZW1lbnQvZ3VpL01nRm9ybUJhc2VcIjtcclxuaW1wb3J0IHtJVGFza30gZnJvbSBcIi4vbWFuYWdlbWVudC90YXNrcy9JVGFza1wiO1xyXG5pbXBvcnQge01nQ29udHJvbEJhc2V9IGZyb20gXCIuL21hbmFnZW1lbnQvZ3VpL01nQ29udHJvbEJhc2VcIjtcclxuaW1wb3J0IHtSdW50aW1lQ29udGV4dEJhc2V9IGZyb20gXCIuL21hbmFnZW1lbnQvUnVudGltZUNvbnRleHRCYXNlXCI7XHJcbmltcG9ydCB7R3VpTWdGb3JtfSBmcm9tIFwiLi9ndWkvR3VpTWdGb3JtXCI7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gXCIuL21hbmFnZW1lbnQvdGFza3MvR3VpVGFza0Jhc2VcIjtcclxuaW1wb3J0IHtEZWJ1ZywgRXhjZXB0aW9uLCBMaXN0LCBOU3RyaW5nLCBTdHJpbmdCdWlsZGVyfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtNb2RpZmllcnN9IGZyb20gXCIuL0d1aUVudW1zXCI7XHJcbmltcG9ydCB7TWdUaW1lcn0gZnJvbSBcIi4vbWFuYWdlbWVudC90YXNrcy9NZ1RpbWVyXCI7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRWYWx9IGZyb20gXCIuL2d1aS9MYXN0Rm9jdXNlZFZhbFwiO1xyXG5pbXBvcnQge0xvZ2dlcl9Mb2dMZXZlbHMsIE9TRW52aXJvbm1lbnR9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgfSBmcm9tIFwiLi9tYW5hZ2VtZW50L2d1aS9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+ZXZlbnRzIHJhaXNlZCBieSBNZ0d1aS5kbGwgYW5kIGhhbmRsZWQgYnkgTWd4cGFSSUEuZXhlIG9yIE1neHBhUnVudGltZS5leGUuXHJcbi8vLyBJbXBvcnRhbnQgbm90ZTogdGhlc2UgZXZlbnRzIGFyZSBOT1QgcmVsYXRlZCB0aGUgZXZlbnRzIGhhbmRsaW5nIG9mIE1hZ2ljIChSQyBvciBSVEUpIC1cclxuLy8vICAgdGhlIGV2ZW50cyBleHBvc2VkIGZyb20gdGhpcyBjbGFzcyBjb250YWluIGZ1bmN0aW9uYWxpdHkgdGhhdCB0aGUgY3VycmVudCBhc3NlbWJseSAoTWdHdWkuZGxsKVxyXG4vLy8gICByZXF1aXJlcyBmcm9tIGVpdGhlciBNZ3hwYVJJQS5leGUgb3IgTWd4cGFSdW50aW1lLmV4ZS5cclxuLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgb25seSB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIGRlbGVnYXRlcyBhbmQgZXZlbnRzLlxyXG4vLy8gQ2xhc3MgJ0V2ZW50c1Byb2Nlc3NvcicgY29udGFpbnMgaGFuZGxlcnMgZm9yIGV2ZW50cyB0aGF0IGNhbiBiZSBzZXJ2ZWQgbG9jYWxseSAoYnkgTWdHdWkuZGxsKSxcclxuLy8vICAgYW5kIHJlZ2lzdGVyZWQgZXh0ZXJuYWwgaGFuZGxlcnMgKGluIE1neHBhUklBLmV4ZSBvciBNZ3hwYVJ1bnRpbWUuZXhlKSBmb3IgZXZlbnRzIHRoYXQgY2FuJ3QgYmUgc2VydmVkIGxvY2FsbHkuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudHMge1xyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVmlzaWJpbGl0eUNoYW5nZWQgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPmNvbnRyb2wgd2hvc2UgdmlzaWJpbGl0eSBpcyBjaGFuZ2VkPC9wYXJhbT5cclxuICBzdGF0aWMgTm9uUGFya2FibGVMYXN0UGFya2VkQ3RybEV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIFRSVUUsIGlmIEJhdGNoIHRhc2sgaXMgcnVubmluZyBpbiBNQUlOIGNvbnRleHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgSXNCYXRjaFJ1bm5pbmdJbk1haW5Db250ZXh0RXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+TUxTIHRyYW5zbGF0aW9uPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21TdHJpbmdcIj5zb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJhbnNsYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIFRyYW5zbGF0ZUV2ZW50OiAoZnJvbVN0cmluZzogc3RyaW5nKSA9PiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgUHJpbnQgUHJldmlldyBGb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj5jb250ZXh0IGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpb1B0clwiPnBvaW50ZXIgdG8gY3VycmVudCBJT1JUIG9iamVjdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29waWVzXCI+bnVtYmVyIG9mIGNvcGllczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5hYmxlUERsZ1wiPmluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSBQcmludCBkaWFsb2c8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhXbmRcIj5IYW5kbGUgb2YgUHJpbnQgUHJldmlldyBGb3JtPC9wYXJhbT5cclxuICBzdGF0aWMgUHJpbnRQcmV2aWV3U3RhcnRFdmVudDogKGNvbnRleHRJRDogbnVtYmVyLCBpb1B0cjogbnVtYmVyLCBjb3BpZXM6IG51bWJlciwgZW5hYmxlUERsZzogYm9vbGVhbiwgaFduZDogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgY3Vyc29yIHRvIFByaW50IFByZXZpZXcgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJuUHJldkRhdGFcIj5wcmludCBwcmV2aWV3IGRhdGE8L3BhcmFtPlxyXG4gIHN0YXRpYyBQcmludFByZXZpZXdTZXRDdXJzb3JFdmVudDogKHByaW50UHJldmlld0RhdGE6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyBIYW5kbGVzIEludm9rZSBVRFAgb3BlcmF0aW9uIGZyb20gR1VJIHRocmVhZFxyXG4gIC8vLzwvc3VtbWFyeT5cclxuICAvLy88cGFyYW0gbmFtZT1cImNvbnRleHRJZFwiPkNvbnRleHQgaWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBJbnZva2VVRFBFdmVudDogKGNvbnRleHRJZDogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFVwZGF0ZSBQcmludCBQcmV2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm5QcmV2RGF0YVwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIFByaW50UHJldmlld1VwZGF0ZUV2ZW50OiAocHJuUHJldkRhdGE6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlIFJpY2ggRWRpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsUHRyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm1QdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0eWxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkd0V4U3R5bGVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBDcmVhdGVSaWNoV2luZG93RXZlbnQ6IChjb250ZXh0SUQ6IG51bWJlciwgY3RybFB0cjogbnVtYmVyLCBwcm1QdHI6IG51bWJlciwgc3R5bGU6IG51bWJlciwgZHdFeFN0eWxlOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy88c3VtbWFyeT5cclxuICAvLy8gIENyZWF0ZXMgYSB3aW5kb3dcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJleFN0eWxlXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImNsYXNzTmFtZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJ3aW5kb3dOYW1lXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cInN0eWxlXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cInhcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwieVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJ3aWR0aFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJoZWlnaHRcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiaHduZFBhcmVudFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJoTWVudVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJoSW5zdGFuY2VcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwibFBhcmFtXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cmV0dXJucz5oYW5kbGUgb2Ygd2luZG93PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBDcmVhdGVHdWlXaW5kb3dFdmVudDogKGV4U3R5bGU6IG51bWJlciwgY2xhc3NOYW1lOiBzdHJpbmcsIHdpbmRvd05hbWU6IHN0cmluZywgc3R5bGU6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBod25kUGFyZW50OiBudW1iZXIsIGhNZW51OiBudW1iZXIsIGhJbnN0YW5jZTogbnVtYmVyLCBsUGFyYW06IG51bWJlcikgPT4gbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBEZXN0cm95cyBhIHdpbmRvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaFduZFB0clwiPmhhbmRsZSBvZiB3aW5kb3c8L3BhcmFtPlxyXG4gIHN0YXRpYyBEZXN0cm95R3VpV2luZG93RXZlbnQ6IChoV25kUHRyOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIE9uQ2xvc2UgUHJpbnQgUHJldmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaFduZFB0clwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIFByaW50UHJldmlld0Nsb3NlRXZlbnQ6IChoV25kUHRyOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3cgUHJpbnQgRGlhbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJncGRcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBTaG93UHJpbnREaWFsb2dFdmVudDogKGdwZDogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldE1vZGFsIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25cIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBTZXRNb2RhbEV2ZW50OiAobWdGb3JtOiBNZ0Zvcm1CYXNlLCBvbjogYm9vbGVhbikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5yYWlzZXMgQ3RybEZvY3VzRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgQ3RybEZvY3VzRXZlbnQ6IChpVGFzazogSVRhc2ssIGN0cmw6IE1nQ29udHJvbEJhc2UpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgdGhlIFJ1bnRpbWVDb250ZXh0QmFzZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIGNvbnRleHRJRFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRSdW50aW1lQ29udGV4dEV2ZW50OiAoY29udGV4dElEOiBzdHJpbmcpID0+IFJ1bnRpbWVDb250ZXh0QmFzZSA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2F2ZXMgdGhlIG5hbWUgb2YgdGhlIGxhc3QgY2xpY2tlZCBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDb250cm9sXCI+Z3VpTWdDb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sTmFtZVwiPk5hbWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHN0YXRpYyBTYXZlTGFzdENsaWNrZWRDdHJsRXZlbnQ6IChndWlNZ0NvbnRyb2w6IEd1aU1nQ29udHJvbCwgY29udHJvbE5hbWU6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2F2ZXMgdGhlIGxhc3QgY2xpY2tlZCBpbmZvcm1hdGlvbi4gKGkuZS4gQ28tb3JkaW5hdGVzIGFuZCBjb250cm9sIG5hbWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj5ndWlNZ0Zvcm08L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xOYW1lXCI+bmFtZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwieFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwieVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2Zmc2V0WFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2Zmc2V0WVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdENsaWNrQ29vcmRpbmF0ZXNBcmVJblBpeGVsc1wiPmNvLW9yZGluYXRlcyBhcmUgaW4gcGl4ZWwgb3Igbm90LjwvcGFyYW0+XHJcbiAgc3RhdGljIFNhdmVMYXN0Q2xpY2tJbmZvRXZlbnQ6IChndWlNZ0Zvcm06IEd1aU1nRm9ybSwgY29udHJvbE5hbWU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCBsYXN0Q2xpY2tDb29yZGluYXRlc0FyZUluUGl4ZWxzOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlRXJyb3JUb0xvZ0V2ZW50OiAobXNnOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+V3JpdGUgYW4gaW50ZXJuYWwgZXJyb3IgdG8gdGhlIGxvZy4gQWxzbyBwcmludHMgc3RhY2sgdHJhY2UgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZUV4Y2VwdGlvblRvTG9nRXZlbnQ6IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+d3JpdGUgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nRXZlbnQ6IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxvZ0xldmVsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRMb2dFdmVudDogKGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGEgR1VJIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlR3VpVG9Mb2dFdmVudDogKG1zZzogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGEgREVWIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlRGV2VG9Mb2dFdmVudDogKG1zZzogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGxlZCB3aGVuIFdNX0NMRUFSIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBDbGVhckV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9VTkRPIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBVbmRvRXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCBFbnRlciBiZSBhZGRlZCBhcyBrZXlib2FyZCBldmVudCA/IFRoaXMgaXMgaW1wb3J0YW50IG1vc3RseSBpbiBkZXRlcm1pbmluZyBpZiBhIGNsaWNrIGV2ZW50XHJcbiAgLy8vIHdpbGwgYmUgcmFpc2VkIGZvciBhIGRlZmF1bHQgYnV0dG9uIG9yIG5vdC5cclxuICAvLy8gQWRkaW5nIEVudGVyIGFzIGEga2V5Ym9hcmQgZXZlbnQgd2lsbCBub3QgcmFpc2UgY2xpY2sgb24gZGVmYXVsdCBidXR0b24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRBZGRFbnRlckFzS2V5RXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgU2hvd1Nlc3Npb25TdGF0aXN0aWNzRXZlbnQ6ICgpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGxlZCB3aGVuIFdNX0NPUFlEQVRBIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29weURhdGFcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBDb3B5RGF0YUV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGNvcHlEYXRhOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIGZvY3VzIGV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzUHJvZHVjZUNsaWNrXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgRm9jdXNFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbiwgb25NdWx0aU1hcms6IGJvb2xlYW4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIGZvY3VzIG91dCBldmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgRm9jdXNPbk5vbk1hZ2ljQ29udHJvbEV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBNb3VzZURvd24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0N0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRvdE5ldEFyZ3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlZnRDbGlja1dhc1ByZXNzZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9uTXVsdGlNYXJrXCI+aW5kaWNhdGVzIHRoYXQgTXVsdGkgTWFyayBjb250aW51ZXM8L3BhcmFtPlxyXG4gIHN0YXRpYyBNb3VzZURvd25FdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBndWlNZ0N0cmw6IEd1aU1nQ29udHJvbCwgZG90TmV0QXJnczogT2JqZWN0W10sIGxlZnRDbGlja1dhc1ByZXNzZWQ6IGJvb2xlYW4sIGxpbmU6IG51bWJlciwgb25NdWx0aU1hcms6IGJvb2xlYW4sIGNhblByb2R1Y2VDbGljazogYm9vbGVhbikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVGFibGVSZW9yZGVyIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhYk9yZGVyTGlzdFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFRhYmxlUmVvcmRlckV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCB0YWJPcmRlckxpc3Q6IExpc3Q8R3VpTWdDb250cm9sPikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgTW91c2VVcCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgTW91c2VVcEV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIENvbWJvRHJvcHBpbmdEb3duIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBDb21ib0Ryb3BwaW5nRG93bkV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIFNlbGVjdGlvbiBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb2R1Y2VDbGlja1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNlbGVjdGlvbkV2ZW50OiAodmFsOiBzdHJpbmcsIGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIERibENsaWNrIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBEYmxDbGlja0V2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIEtleURvd24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RpZmllclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwia2V5Q29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RhcnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVuZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzQWN0Q2hhclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3VnZ2VzdGVkVmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbWJvSXNEcm9wRG93blwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaGFuZGxlZFwiPmJvb2xlYW4gdmFyaWFibGUgZXZlbnQgaXMgaGFuZGxlZCBvciBub3QuIDwvcGFyYW0+XHJcbiAgc3RhdGljIEtleURvd25FdmVudDogKGZvcm06IEd1aU1nRm9ybSwgZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRlbGVnYXRlIGZvciB0aGUgTXVsdGlNYXJrIGhpdCBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+IGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyb3dcIj4gdGFibGUgcm93IDwvcGFyYW0+XHJcbiAgc3RhdGljIE11bHRpbWFya0hpdEV2ZW50OiAoZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIHJvdzogbnVtYmVyLCBtb2RpZmllcjogTW9kaWZpZXJzKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDbG9zZSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBldmVudCBpcyBDTFIgaGFuZGxlZChjbG9zaW5nIG9mIHRoZSBmb3JtIHdpbGwgYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBDTFIgYW5kIG5vIGNvbW1hbmRzIHdpbGwgYmUgcHV0XHJcbiAgLy8vIGluIHRvIGNsb3NlIHRoZSBmb3JtKSBlbHNlIGZhbHNlLjwvcmV0dXJucz5cclxuICBzdGF0aWMgQ2xvc2VGb3JtRXZlbnQ6IChmb3JtOiBHdWlNZ0Zvcm0pID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIERpc3Bvc2UgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIERpc3Bvc2VFdmVudDogKGZvcm06IEd1aU1nRm9ybSkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVGltZXIgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdUaW1lclwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFRpbWVyRXZlbnQ6IChtZ1RpbWVyOiBNZ1RpbWVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgUmVzaXplIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1Jvd3NJblBhZ2VcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBUYWJsZVJlc2l6ZUV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBuZXdSb3dzSW5QYWdlOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIEdldFJvd3NEYXRhIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlc2lyZWRUb3BJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdEZvY3VzZWRWYWxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBHZXRSb3dzRGF0YUV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBFbmFibGVDdXRDb3B5IEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVuYWJsZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIEVuYWJsZUN1dENvcHlFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgZW5hYmxlOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBFbmFibGVQYXN0ZSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmFibGVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBFbmFibGVQYXN0ZUV2ZW50OiAoY3RybDogR3VpTWdDb250cm9sLCBlbmFibGU6IGJvb2xlYW4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIENvbHVtbkNsaWNrIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpcmVjdGlvblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29sdW1uSGVhZGVyXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgQ29sdW1uQ2xpY2tFdmVudDogKGNvbHVtbkN0cmw6IEd1aU1nQ29udHJvbCwgZGlyZWN0aW9uOiBudW1iZXIsIGNvbHVtbkhlYWRlcjogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyByZWZyZXNoVGFibGVzIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBSZWZyZXNoVGFibGVzRXZlbnQ6ICgpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5PbkhlbHBDbG9zZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhY3RpdmVGb3JtXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgSGVscENsb3NlRXZlbnQ6IChhY3RpdmVGb3JtOiBHdWlNZ0Zvcm0pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBkaXNwbGF5U2Vzc2lvblN0YXRpc3RpY3MgPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBEaXNwbGF5U2Vzc2lvblN0YXRpc3RpY3NFdmVudDogKCkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0cnVlIGZvciBub24gaW50ZXJhY3RpdmUgdGFzayBmb3IgYWxsIGNvbnRyb2xzIGV4Y2VwdCBhIGJ1dHRvbiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y2xpY2tlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRCbG9ja01vdXNlRXZlbnRzRXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+cGVla0VuZE9mV29yazwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBQZWVrRW5kT2ZXb3JrRXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyB0aGUgR2V0RXZlbnRUaW1lIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldEV2ZW50VGltZUV2ZW50OiAoKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGludm9rZXMgdGhlIFNjcm9sbFRhYmxlIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ09iamVjdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicm93c1RvU2Nyb2xsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1BhZ2VTY3JvbGxcIj5uZXh0L3ByZXYgcGFnZT88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzVGFibGVTY3JvbGxcIj5CZWdpbi9FbmQgVGFibGU/PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1JhaXNlZEJ5TW91c2VXaGVlbFwiPmluZGljYXRlcyB3aGV0aGVyIGV2ZW50IGlzIHJhaXNlZCBieSBtb3VzZXdoZWVsIG9yIG5vdC48L3BhcmFtPlxyXG4gIHN0YXRpYyBTY3JvbGxUYWJsZUV2ZW50OiAoZ3VpTWdPYmplY3Q6IGFueSwgbGluZTogbnVtYmVyLCByb3dzVG9TY3JvbGw6IG51bWJlciwgaXNQYWdlU2Nyb2xsOiBib29sZWFuLCBpc1RhYmxlU2Nyb2xsOiBib29sZWFuLCBpc1JhaXNlZEJ5TW91c2VXaGVlbDogYm9vbGVhbikgPT4gYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyB0aGUgdXNlciBkZWZpbmVkIERyb3AgZm9ybWF0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0RHJvcFVzZXJGb3JtYXRzRXZlbnQ6ICgpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250ZXh0IGlkIGZyb20gR3VpTWdGb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldENvbnRleHRJREV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pID0+IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvd0Zvcm1FdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnZva2VzIE9uRm9ybUFjdGl2YXRlRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBPbkZvcm1BY3RpdmF0ZUV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGludm9rZXMgT25OQ0FjdGl2YXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgT25OQ0FjdGl2YXRlRXZlbnQ6IChndWlNZ0Zvcm06IEd1aU1nRm9ybSkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZSBXTV9LRVlVUCAtIChyZXF1aXJlZCBvbmx5IGZvciBBQ1RfTkVYVF9SVF9XSU5ET1csIEFDVF9QUkVWX1JUX1dJTkRPVyBmb3Igc29ydGluZyB3aW5kb3dsaXN0XHJcbiAgLy8vIHdoZW4gdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdGlvbiBpcyByZWxlYXNlZClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwia2V5Q29kZVwiPmtleWNvZGUgb2YgYSBrZXkgd2hpY2ggaXMganVzdCByZWxlYXNlZDwvcGFyYW0+XHJcbiAgc3RhdGljIEhhbmRsZUtleVVwTWVzc2FnZUV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGtleUNvZGU6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIHdoZXRoZXIgd2Ugc2hvdWxkIHNob3cgTG9nb24gd2luZG93IGluIFJUT0wgZm9ybWF0IG9yIG5vdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uSXNMb2dvblJUTEV2ZW50OiAoKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcblxyXG4gIHN0YXRpYyBPbklzU3BlY2lhbEVuZ0xvZ29uRXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuXHJcbiAgc3RhdGljIE9uSXNTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0RXZlbnQ6ICgpID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBnZXRNYWluUHJvZ3JhbSBFdmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElEXCI+YWN0aXZlL3RhcmdldCBjb250ZXh0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdGxJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldE1haW5Qcm9ncmFtRXZlbnQ6IChjb250ZXh0SUQ6IG51bWJlciwgY3RsSWR4OiBudW1iZXIpID0+IEd1aVRhc2tCYXNlID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBMb2dpY2FsIG5hbWUgdHJhbnNsYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21TdHJpbmdcIj5zb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJhbnNsYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIFRyYW5zbGF0ZUxvZ2ljYWxOYW1lRXZlbnQ6IChmcm9tU3RyaW5nOiBzdHJpbmcpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pbnZva2VzIGdldE1lc3NhZ2VTdHJpbmcgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldE1lc3NhZ2VTdHJpbmdFdmVudDogKG1zZ0lkOiBzdHJpbmcpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgZm9jdXMgZXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNQcm9kdWNlQ2xpY2tcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkZvY3VzKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbiwgb25NdWx0aU1hcms6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuRm9jdXNFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuRm9jdXNFdmVudChjdHJsLCBsaW5lLCBpc1Byb2R1Y2VDbGljaywgb25NdWx0aU1hcmspO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBmb2N1cyBldmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsIHJlY2VpdmluZyBsb3N0Rm9jdXNcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkZvY3VzT25Ob25NYWdpY0NvbnRyb2woY3RybDogR3VpTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkZvY3VzT25Ob25NYWdpY0NvbnRyb2xFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuRm9jdXNPbk5vbk1hZ2ljQ29udHJvbEV2ZW50KGN0cmwpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgTW91c2VEb3duIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb3ROZXRBcmdzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZWZ0Q2xpY2tXYXNQcmVzc2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbk11bHRpTWFya1wiPmluZGljYXRlcyB0aGF0IE11bHRpIE1hcmsgY29udGludWVzPC9wYXJhbT5cclxuICBzdGF0aWMgT25Nb3VzZURvd24oZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGd1aU1nQ3RybDogR3VpTWdDb250cm9sLCBkb3ROZXRBcmdzOiBhbnlbXSwgbGVmdENsaWNrV2FzUHJlc3NlZDogYm9vbGVhbiwgbGluZTogbnVtYmVyLCBvbk11bHRpTWFyazogYm9vbGVhbiwgY2FuUHJvZHVjZUNsaWNrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLk1vdXNlRG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5Nb3VzZURvd25FdmVudChndWlNZ0Zvcm0sIGd1aU1nQ3RybCwgZG90TmV0QXJncywgbGVmdENsaWNrV2FzUHJlc3NlZCwgbGluZSwgb25NdWx0aU1hcmssIGNhblByb2R1Y2VDbGljayk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBWaXNpYmlsaXR5Q2hhbmdlZCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y29udHJvbCB3aG9zZSB2aXNpYmlsaXR5IGlzIGNoYW5nZWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBPbk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmwoY3RybDogR3VpTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmxFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuTm9uUGFya2FibGVMYXN0UGFya2VkQ3RybEV2ZW50KGN0cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBUYWJsZVJlb3JkZXIgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFiT3JkZXJMaXN0XCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25UYWJsZVJlb3JkZXIoY3RybDogR3VpTWdDb250cm9sLCB0YWJPcmRlckxpc3Q6IExpc3Q8R3VpTWdDb250cm9sPik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5UYWJsZVJlb3JkZXJFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuVGFibGVSZW9yZGVyRXZlbnQoY3RybCwgdGFiT3JkZXJMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgTW91c2VVcCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25Nb3VzZVVwKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLk1vdXNlVXBFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuTW91c2VVcEV2ZW50KGN0cmwsIGxpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDb21ib0Ryb3BwaW5nRG93biBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25Db21ib0Ryb3BwaW5nRG93bihjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Db21ib0Ryb3BwaW5nRG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5Db21ib0Ryb3BwaW5nRG93bkV2ZW50KGN0cmwsIGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBTZWxlY3Rpb24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9kdWNlQ2xpY2tcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPblNlbGVjdGlvbih2YWw6IHN0cmluZywgY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHByb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5TZWxlY3Rpb25FdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuU2VsZWN0aW9uRXZlbnQodmFsLCBjdHJsLCBsaW5lLCBwcm9kdWNlQ2xpY2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBEYmxDbGljayBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25EYmxDbGljayhjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5EYmxDbGlja0V2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5EYmxDbGlja0V2ZW50KGN0cmwsIGxpbmUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgS2V5RG93biBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0N0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGlmaWVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJrZXlDb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdGFydFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5kXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNBY3RDaGFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWdnZXN0ZWRWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29tYm9Jc0Ryb3BEb3duXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoYW5kbGVkXCI+Ym9vbGVhbiB2YXJpYWJsZSBldmVudCBpcyBoYW5kbGVkIG9yIG5vdC4gPC9wYXJhbT5cclxuICBzdGF0aWMgT25LZXlEb3duKGZvcm06IEd1aU1nRm9ybSwgZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHN0YXRpYyBPbktleURvd24oZm9ybTogR3VpTWdGb3JtLCBjdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBoYW5kbGVkOiBib29sZWFuKTogdm9pZDtcclxuICBzdGF0aWMgT25LZXlEb3duKGZvcm06IEd1aU1nRm9ybSwgY3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvbWJvSXNEcm9wRG93bjogYm9vbGVhbiwgaGFuZGxlZDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc3RhdGljIE9uS2V5RG93bihmb3JtOiBHdWlNZ0Zvcm0sIGd1aU1nQ3RybE9yQ3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0T3JTdWdnZXN0ZWRWYWx1ZTogYW55LCBlbmRPckNvbWJvSXNEcm9wRG93bjogYW55LCB0ZXh0T3JIYW5kbGVkOiBhbnksIGlzQWN0Q2hhcj86IGJvb2xlYW4sIHN1Z2dlc3RlZFZhbHVlPzogc3RyaW5nLCBjb21ib0lzRHJvcERvd25PckhhbmRsZWQ/OiBib29sZWFuLCBoYW5kbGVkPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDExKVxyXG4gICAgICBFdmVudHMuT25LZXlEb3duXzAoZm9ybSwgZ3VpTWdDdHJsT3JDdHJsLCBtb2RpZmllciwga2V5Q29kZSwgc3RhcnRPclN1Z2dlc3RlZFZhbHVlLCBlbmRPckNvbWJvSXNEcm9wRG93biwgdGV4dE9ySGFuZGxlZCwgaXNBY3RDaGFyLCBzdWdnZXN0ZWRWYWx1ZSwgY29tYm9Jc0Ryb3BEb3duT3JIYW5kbGVkLCBoYW5kbGVkKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxMClcclxuICAgICAgRXZlbnRzLk9uS2V5RG93bl8xKGZvcm0sIGd1aU1nQ3RybE9yQ3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIHN0YXJ0T3JTdWdnZXN0ZWRWYWx1ZSwgZW5kT3JDb21ib0lzRHJvcERvd24sIHRleHRPckhhbmRsZWQsIGlzQWN0Q2hhciwgc3VnZ2VzdGVkVmFsdWUsIGNvbWJvSXNEcm9wRG93bk9ySGFuZGxlZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIEV2ZW50cy5PbktleURvd25fMihmb3JtLCBndWlNZ0N0cmxPckN0cmwsIG1vZGlmaWVyLCBrZXlDb2RlLCBzdGFydE9yU3VnZ2VzdGVkVmFsdWUsIGVuZE9yQ29tYm9Jc0Ryb3BEb3duLCB0ZXh0T3JIYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE9uS2V5RG93bl8wKGZvcm06IEd1aU1nRm9ybSwgZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuS2V5RG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5LZXlEb3duRXZlbnQoZm9ybSwgZ3VpTWdDdHJsLCBtb2RpZmllciwga2V5Q29kZSwgc3RhcnQsIGVuZCwgdGV4dCwgaXNBY3RDaGFyLCBzdWdnZXN0ZWRWYWx1ZSwgY29tYm9Jc0Ryb3BEb3duLCBoYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBPbk11bHRpTWFya0hpdChjdHJsOiBHdWlNZ0NvbnRyb2wsIHJvdzogbnVtYmVyLCBtb2RpZmllcjogTW9kaWZpZXJzKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLk11bHRpbWFya0hpdEV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5NdWx0aW1hcmtIaXRFdmVudChjdHJsLCByb3csIG1vZGlmaWVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE9uS2V5RG93bl8xKGZvcm06IEd1aU1nRm9ybSwgY3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGlzQWN0Q2hhcjogYm9vbGVhbiwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZywgaGFuZGxlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5LZXlEb3duRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5LZXlEb3duRXZlbnQoZm9ybSwgY3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIHN0YXJ0LCBlbmQsIHRleHQsIGlzQWN0Q2hhciwgc3VnZ2VzdGVkVmFsdWUsIGZhbHNlLCBoYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE9uS2V5RG93bl8yKGZvcm06IEd1aU1nRm9ybSwgY3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvbWJvSXNEcm9wRG93bjogYm9vbGVhbiwgaGFuZGxlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5LZXlEb3duRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5LZXlEb3duRXZlbnQoZm9ybSwgY3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIDAsIDAsIG51bGwsIGZhbHNlLCBzdWdnZXN0ZWRWYWx1ZSwgY29tYm9Jc0Ryb3BEb3duLCBoYW5kbGVkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgQ2xvc2UgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgZXZlbnQgaXMgQ0xSIGhhbmRsZWQoY2xvc2luZyBvZiB0aGUgZm9ybSB3aWxsIGJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgQ0xSIGFuZCBubyBjb21tYW5kcyB3aWxsIGJlIHB1dFxyXG4gIC8vLyBpbiB0byBjbG9zZSB0aGUgZm9ybSkgZWxzZSBmYWxzZS48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uRm9ybUNsb3NlKGZvcm06IEd1aU1nRm9ybSk6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5DbG9zZUZvcm1FdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gRXZlbnRzLkNsb3NlRm9ybUV2ZW50KGZvcm0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBEaXNwb3NlIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkRpc3Bvc2UoZm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkRpc3Bvc2VFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuRGlzcG9zZUV2ZW50KGZvcm0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBUaW1lciBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ1RpbWVyXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25UaW1lcihtZ1RpbWVyOiBNZ1RpbWVyKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLlRpbWVyRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLlRpbWVyRXZlbnQobWdUaW1lcik7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgUmVzaXplIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1Jvd3NJblBhZ2VcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPblRhYmxlUmVzaXplKGN0cmw6IEd1aU1nQ29udHJvbCwgbmV3Um93c0luUGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlRhYmxlUmVzaXplRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlRhYmxlUmVzaXplRXZlbnQoY3RybCwgbmV3Um93c0luUGFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIEdldFJvd3NEYXRhIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlc2lyZWRUb3BJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdEZvY3VzZWRWYWxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkdldFJvd3NEYXRhKGN0cmw6IEd1aU1nQ29udHJvbCwgZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4sIGxhc3RGb2N1c2VkVmFsOiBMYXN0Rm9jdXNlZFZhbCk6IHZvaWQge1xyXG4gICAgICBpZiAoRXZlbnRzLkdldFJvd3NEYXRhRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgIEV2ZW50cy5HZXRSb3dzRGF0YUV2ZW50KGN0cmwsIGRlc2lyZWRUb3BJbmRleCwgc2VuZEFsbCwgbGFzdEZvY3VzZWRWYWwpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDb2x1bW5DbGljayBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2x1bW5DdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkaXJlY3Rpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkhlYWRlclwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uQ29sdW1uQ2xpY2soY29sdW1uQ3RybDogR3VpTWdDb250cm9sLCBkaXJlY3Rpb246IG51bWJlciwgY29sdW1uSGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuQ29sdW1uQ2xpY2tFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuQ29sdW1uQ2xpY2tFdmVudChjb2x1bW5DdHJsLCBkaXJlY3Rpb24sIGNvbHVtbkhlYWRlcik7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyByZWZyZXNoVGFibGVzIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBSZWZyZXNoVGFibGVzKCk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5SZWZyZXNoVGFibGVzRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlJlZnJlc2hUYWJsZXNFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5PbkhlbHBDbG9zZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhY3RpdmVGb3JtXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25DbG9zZUhlbHAoYWN0aXZlRm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLkhlbHBDbG9zZUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5IZWxwQ2xvc2VFdmVudChhY3RpdmVGb3JtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgVFJVRSwgaWYgQmF0Y2ggdGFzayBpcyBydW5uaW5nIGluIE1BSU4gY29udGV4dC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBJc0JhdGNoUnVubmluZ0luTWFpbkNvbnRleHQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChFdmVudHMuSXNCYXRjaFJ1bm5pbmdJbk1haW5Db250ZXh0RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgcmV0VmFsdWUgPSBFdmVudHMuSXNCYXRjaFJ1bm5pbmdJbk1haW5Db250ZXh0RXZlbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRWYWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+TUxTIHRyYW5zbGF0aW9uPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21TdHJpbmdcIj5zb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJhbnNsYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIFRyYW5zbGF0ZShmcm9tU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5UcmFuc2xhdGVFdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gKGZyb21TdHJpbmcgIT09IG51bGwgJiYgZnJvbVN0cmluZy5sZW5ndGggPiAwKSA/IEV2ZW50cy5UcmFuc2xhdGVFdmVudChmcm9tU3RyaW5nKSA6IGZyb21TdHJpbmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgUHJpbnQgUHJldmlldyBGb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj5jb250ZXh0IGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpb1B0clwiPnBvaW50ZXIgdG8gY3VycmVudCBJT1JUIG9iamVjdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29waWVzXCI+bnVtYmVyIG9mIGNvcGllczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5hYmxlUERsZ1wiPmluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSBQcmludCBkaWFsb2c8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhXbmRcIj5IYW5kbGUgb2YgUHJpbnQgUHJldmlldyBGb3JtPC9wYXJhbT5cclxuICBzdGF0aWMgT25QcmludFByZXZpZXdTdGFydChjb250ZXh0SUQ6IG51bWJlciwgaW9QdHI6IG51bWJlciwgY29waWVzOiBudW1iZXIsIGVuYWJsZVBEbGc6IGJvb2xlYW4sIGhXbmQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5QcmludFByZXZpZXdTdGFydEV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5QcmludFByZXZpZXdTdGFydEV2ZW50KGNvbnRleHRJRCwgaW9QdHIsIGNvcGllcywgZW5hYmxlUERsZywgaFduZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCBjdXJzb3IgdG8gUHJpbnQgUHJldmlldyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm5QcmV2RGF0YVwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIE9uUHJpbnRQcmV2aWV3U2V0Q3Vyc29yKHByaW50UHJldmlld0RhdGE6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5QcmludFByZXZpZXdTZXRDdXJzb3JFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuUHJpbnRQcmV2aWV3U2V0Q3Vyc29yRXZlbnQocHJpbnRQcmV2aWV3RGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5cclxuICAvLy8gSGFuZGxlcyBJbnZva2UgVURQIG9wZXJhdGlvbiBmcm9tIEdVSSB0aHJlYWRcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj5Db250ZXh0IGlkPC9wYXJhbT5cclxuICBzdGF0aWMgSW52b2tlVURQKGNvbnRleHRJZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXQ6IG51bWJlciA9IDA7XHJcbiAgICBpZiAoRXZlbnRzLkludm9rZVVEUEV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIHJldCA9IEV2ZW50cy5JbnZva2VVRFBFdmVudChjb250ZXh0SWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIFByaW50IFByZXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByblByZXZEYXRhXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgT25QcmludFByZXZpZXdVcGRhdGUocHJuUHJldkRhdGE6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5QcmludFByZXZpZXdVcGRhdGVFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuUHJpbnRQcmV2aWV3VXBkYXRlRXZlbnQocHJuUHJldkRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGUgUmljaCBFZGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxQdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBybVB0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3R5bGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR3RXhTdHlsZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uQ3JlYXRlUmljaFdpbmRvdyhjb250ZXh0SUQ6IG51bWJlciwgY3RybFB0cjogbnVtYmVyLCBwcm1QdHI6IG51bWJlciwgc3R5bGU6IG51bWJlciwgZHdFeFN0eWxlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuQ3JlYXRlUmljaFdpbmRvd0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5DcmVhdGVSaWNoV2luZG93RXZlbnQoY29udGV4dElELCBjdHJsUHRyLCBwcm1QdHIsIHN0eWxlLCBkd0V4U3R5bGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vICBDcmVhdGVzIGEgd2luZG93XHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiZXhTdHlsZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJjbGFzc05hbWVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwid2luZG93TmFtZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJzdHlsZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJ4XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cInlcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwid2lkdGhcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiaGVpZ2h0XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImh3bmRQYXJlbnRcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiaE1lbnVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiaEluc3RhbmNlXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImxQYXJhbVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHJldHVybnM+aGFuZGxlIG9mIHdpbmRvdzwvcmV0dXJucz5cclxuICBzdGF0aWMgT25DcmVhdGVHdWlXaW5kb3coZXhTdHlsZTogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZywgd2luZG93TmFtZTogc3RyaW5nLCBzdHlsZTogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGh3bmRQYXJlbnQ6IG51bWJlciwgaE1lbnU6IG51bWJlciwgaEluc3RhbmNlOiBudW1iZXIsIGxQYXJhbTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRWYWx1ZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChFdmVudHMuQ3JlYXRlR3VpV2luZG93RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgcmV0VmFsdWUgPSBFdmVudHMuQ3JlYXRlR3VpV2luZG93RXZlbnQoZXhTdHlsZSwgY2xhc3NOYW1lLCB3aW5kb3dOYW1lLCBzdHlsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaHduZFBhcmVudCwgaE1lbnUsIGhJbnN0YW5jZSwgbFBhcmFtKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRGVzdHJveXMgYSB3aW5kb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhXbmRQdHJcIj5oYW5kbGUgb2Ygd2luZG93PC9wYXJhbT5cclxuICBzdGF0aWMgT25EZXN0cm95R3VpV2luZG93KGhXbmRQdHI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5EZXN0cm95R3VpV2luZG93RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLkRlc3Ryb3lHdWlXaW5kb3dFdmVudChoV25kUHRyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gT25DbG9zZSBQcmludCBQcmV2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kUHRyXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgT25QcmludFByZXZpZXdDbG9zZShwcmludFByZXZpZXdEYXRhUHRyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuUHJpbnRQcmV2aWV3Q2xvc2VFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuUHJpbnRQcmV2aWV3Q2xvc2VFdmVudChwcmludFByZXZpZXdEYXRhUHRyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdyBQcmludCBEaWFsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImdwZFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uU2hvd1ByaW50RGlhbG9nKGdwZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRWYWx1ZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChFdmVudHMuU2hvd1ByaW50RGlhbG9nRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgcmV0VmFsdWUgPSBFdmVudHMuU2hvd1ByaW50RGlhbG9nRXZlbnQoZ3BkKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZGlzcGxheVNlc3Npb25TdGF0aXN0aWNzIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgRGlzcGxheVNlc3Npb25TdGF0aXN0aWNzKCk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5EaXNwbGF5U2Vzc2lvblN0YXRpc3RpY3NFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuRGlzcGxheVNlc3Npb25TdGF0aXN0aWNzRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0cnVlIGZvciBub24gaW50ZXJhY3RpdmUgdGFzayBmb3IgYWxsIGNvbnRyb2xzIGV4Y2VwdCBhIGJ1dHRvbiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y2xpY2tlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRCbG9ja01vdXNlRXZlbnRzKGN0cmw6IEd1aU1nQ29udHJvbCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEV2ZW50cy5TaG91bGRCbG9ja01vdXNlRXZlbnRzRXZlbnQgIT09IG51bGwgJiYgRXZlbnRzLlNob3VsZEJsb2NrTW91c2VFdmVudHNFdmVudChjdHJsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5wZWVrRW5kT2ZXb3JrPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFBlZWtFbmRPZldvcmsoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRXZlbnRzLlBlZWtFbmRPZldvcmtFdmVudCAhPT0gbnVsbCAmJiBFdmVudHMuUGVla0VuZE9mV29ya0V2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyB0aGUgR2V0RXZlbnRUaW1lIGRlbGVnYXRlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldEV2ZW50VGltZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChFdmVudHMuR2V0RXZlbnRUaW1lRXZlbnQgIT09IG51bGwpID8gRXZlbnRzLkdldEV2ZW50VGltZUV2ZW50KCkgOiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnZva2VzIHRoZSBTY3JvbGxUYWJsZSBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdPYmplY3RcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJvd3NUb1Njcm9sbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNQYWdlU2Nyb2xsXCI+bmV4dC9wcmV2IHBhZ2U/PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1RhYmxlU2Nyb2xsXCI+QmVnaW4vRW5kIFRhYmxlPzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNSYWlzZWRCeU1vdXNlV2hlZWxcIj5pbmRpY2F0ZXMgd2hldGhlciBldmVudCBpcyByYWlzZWQgYnkgbW91c2V3aGVlbCBvciBub3QuPC9wYXJhbT5cclxuICBzdGF0aWMgT25TY3JvbGxUYWJsZShndWlNZ09iamVjdDogYW55LCBsaW5lOiBudW1iZXIsIHJvd3NUb1Njcm9sbDogbnVtYmVyLCBpc1BhZ2VTY3JvbGw6IGJvb2xlYW4sIGlzVGFibGVTY3JvbGw6IGJvb2xlYW4sIGlzUmFpc2VkQnlNb3VzZVdoZWVsOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaGFuZGxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKEV2ZW50cy5TY3JvbGxUYWJsZUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGhhbmRsZWQgPSBFdmVudHMuU2Nyb2xsVGFibGVFdmVudChndWlNZ09iamVjdCwgbGluZSwgcm93c1RvU2Nyb2xsLCBpc1BhZ2VTY3JvbGwsIGlzVGFibGVTY3JvbGwsIGlzUmFpc2VkQnlNb3VzZVdoZWVsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBoYW5kbGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSB1c2VyIGRlZmluZWQgRHJvcCBmb3JtYXRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXREcm9wVXNlckZvcm1hdHMoKTogc3RyaW5nIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0RHJvcFVzZXJGb3JtYXRzRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5HZXREcm9wVXNlckZvcm1hdHNFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbnRleHQgaWQgZnJvbSBHdWlNZ0Zvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0Q29udGV4dElEKGd1aU1nRm9ybTogR3VpTWdGb3JtKTogbnVtYmVyIHtcclxuICAgIGxldCBjb250ZXh0SUQ6IG51bWJlciA9IC0xO1xyXG4gICAgRGVidWcuQXNzZXJ0KGd1aU1nRm9ybSAhPT0gbnVsbCk7XHJcbiAgICBpZiAoRXZlbnRzLkdldENvbnRleHRJREV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnRleHRJRCA9IEV2ZW50cy5HZXRDb250ZXh0SURFdmVudChndWlNZ0Zvcm0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnRleHRJRDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0TW9kYWwgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvblwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNldE1vZGFsKG1nRm9ybTogTWdGb3JtQmFzZSwgb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuU2V0TW9kYWxFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuU2V0TW9kYWxFdmVudChtZ0Zvcm0sIG9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgT25TaG93Rm9ybShndWlNZ0Zvcm06IEd1aU1nRm9ybSk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5TaG93Rm9ybUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5TaG93Rm9ybUV2ZW50KGd1aU1nRm9ybSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGludm9rZXMgT25Gb3JtQWN0aXZhdGVFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIE9uRm9ybUFjdGl2YXRlKGd1aU1nRm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLk9uRm9ybUFjdGl2YXRlRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLk9uRm9ybUFjdGl2YXRlRXZlbnQoZ3VpTWdGb3JtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW52b2tlcyBPbk5DQWN0aXZhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBPbk5DQWN0aXZhdGUoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuT25OQ0FjdGl2YXRlRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLk9uTkNBY3RpdmF0ZUV2ZW50KGd1aU1nRm9ybSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBIYW5kbGUgV01fS0VZVVAgLSAocmVxdWlyZWQgb25seSBmb3IgQUNUX05FWFRfUlRfV0lORE9XLCBBQ1RfUFJFVl9SVF9XSU5ET1cgZm9yIHNvcnRpbmcgd2luZG93bGlzdFxyXG4gIC8vLyB3aGVuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY3Rpb24gaXMgcmVsZWFzZWQpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImtleUNvZGVcIj5rZXljb2RlIG9mIGEga2V5IHdoaWNoIGlzIGp1c3QgcmVsZWFzZWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBIYW5kbGVLZXlVcE1lc3NhZ2UoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGtleUNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5IYW5kbGVLZXlVcE1lc3NhZ2VFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuSGFuZGxlS2V5VXBNZXNzYWdlRXZlbnQoZ3VpTWdGb3JtLCBrZXlDb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIHdoZXRoZXIgd2Ugc2hvdWxkIHNob3cgTG9nb24gd2luZG93IGluIFJUT0wgZm9ybWF0IG9yIG5vdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIElzTG9nb25SVEwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSVEw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChFdmVudHMuT25Jc0xvZ29uUlRMRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgaXNSVEwgPSBFdmVudHMuT25Jc0xvZ29uUlRMRXZlbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc1JUTDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBJc1NwZWNpYWxFbmdMb2dvbigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0VuZ0xvZ29uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoRXZlbnRzLk9uSXNTcGVjaWFsRW5nTG9nb25FdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBpc0VuZ0xvZ29uID0gRXZlbnRzLk9uSXNTcGVjaWFsRW5nTG9nb25FdmVudCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzRW5nTG9nb247XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgSXNTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzSWdub3JlQnV0dG9uRm9ybWF0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoRXZlbnRzLk9uSXNTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0RXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgaXNJZ25vcmVCdXR0b25Gb3JtYXQgPSBFdmVudHMuT25Jc1NwZWNpYWxJZ25vcmVCdXR0b25Gb3JtYXRFdmVudCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzSWdub3JlQnV0dG9uRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBnZXRNYWluUHJvZ3JhbSBFdmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElEXCI+YWN0aXZlL3RhcmdldCBjb250ZXh0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdGxJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldE1haW5Qcm9ncmFtKGNvbnRleHRJRDogbnVtYmVyLCBjdGxJZHg6IG51bWJlcik6IEd1aVRhc2tCYXNlIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0TWFpblByb2dyYW1FdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gRXZlbnRzLkdldE1haW5Qcm9ncmFtRXZlbnQoY29udGV4dElELCBjdGxJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBMb2dpY2FsIG5hbWUgdHJhbnNsYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZyb21TdHJpbmdcIj5zb3VyY2Ugc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJhbnNsYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIFRyYW5zbGF0ZUxvZ2ljYWxOYW1lKGZyb21TdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLlRyYW5zbGF0ZUxvZ2ljYWxOYW1lRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZUV2ZW50KGZyb21TdHJpbmcpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pmludm9rZXMgZ2V0TWVzc2FnZVN0cmluZyBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0TWVzc2FnZVN0cmluZyhtc2dJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0TWVzc2FnZVN0cmluZ0V2ZW50ICE9PSBudWxsKTtcclxuICAgIGxldCBmcm9tU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZ0V2ZW50KG1zZ0lkKTtcclxuICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBFdmVudHMuVHJhbnNsYXRlKGZyb21TdHJpbmcpO1xyXG4gICAgaWYgKHRleHQgIT09IG51bGwgJiYgdGV4dC5lbmRzV2l0aChcIjpcIikpIHtcclxuICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlcjtcclxuICAgICAgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIodGV4dCk7XHJcbiAgICAgIHN0ci5JbnNlcnQodGV4dC5sZW5ndGgsIFwiIFwiKTtcclxuICAgICAgdGV4dCA9IHN0ci5Ub1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRleHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+cmFpc2VzIEN0cmxGb2N1c0V2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uQ3RybEZvY3VzKGlUYXNrOiBJVGFzaywgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5DdHJsRm9jdXNFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuQ3RybEZvY3VzRXZlbnQoaVRhc2ssIDxNZ0NvbnRyb2xCYXNlPmN0cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSBSdW50aW1lQ29udGV4dEJhc2UgdGhhdCBiZWxvbmdzIHRvIHRoZSBjb250ZXh0SURcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0UnVudGltZUNvbnRleHQoY29udGV4dElEOiBzdHJpbmcpOiBSdW50aW1lQ29udGV4dEJhc2Uge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5HZXRSdW50aW1lQ29udGV4dEV2ZW50ICE9PSBudWxsKTtcclxuICAgIHJldHVybiBFdmVudHMuR2V0UnVudGltZUNvbnRleHRFdmVudChjb250ZXh0SUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTYXZlcyB0aGUgbmFtZSBvZiB0aGUgbGFzdCBjbGlja2VkIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj5ndWlNZ0NvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xOYW1lXCI+TmFtZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgc3RhdGljIFNhdmVMYXN0Q2xpY2tlZEN0cmxOYW1lKGd1aU1nQ29udHJvbDogR3VpTWdDb250cm9sLCBjb250cm9sTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlNhdmVMYXN0Q2xpY2tlZEN0cmxFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuU2F2ZUxhc3RDbGlja2VkQ3RybEV2ZW50KGd1aU1nQ29udHJvbCwgY29udHJvbE5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTYXZlcyB0aGUgbGFzdCBjbGlja2VkIGluZm9ybWF0aW9uLiAoaS5lLiBDby1vcmRpbmF0ZXMgYW5kIGNvbnRyb2wgbmFtZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPmd1aU1nRm9ybTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbE5hbWVcIj5uYW1lIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZmZzZXRYXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZmZzZXRZXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0Q2xpY2tDb29yZGluYXRlc0FyZUluUGl4ZWxzXCI+Y28tb3JkaW5hdGVzIGFyZSBpbiBwaXhlbCBvciBub3QuPC9wYXJhbT5cclxuICBzdGF0aWMgU2F2ZUxhc3RDbGlja0luZm8oZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0sIGNvbnRyb2xOYW1lOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlciwgbGFzdENsaWNrQ29vcmRpbmF0ZXNBcmVJblBpeGVsczogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5TYXZlTGFzdENsaWNrSW5mb0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5TYXZlTGFzdENsaWNrSW5mb0V2ZW50KGd1aU1nRm9ybSwgY29udHJvbE5hbWUsIHgsIHksIG9mZnNldFgsIG9mZnNldFksIGxhc3RDbGlja0Nvb3JkaW5hdGVzQXJlSW5QaXhlbHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlRXJyb3JUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuV3JpdGVFcnJvclRvTG9nRXZlbnQobXNnKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBXcml0ZUV4Y2VwdGlvblRvTG9nKG1zZzogc3RyaW5nKTogdm9pZDtcclxuICBzdGF0aWMgV3JpdGVFeGNlcHRpb25Ub0xvZyhleDogRXhjZXB0aW9uKTogdm9pZDtcclxuICBzdGF0aWMgV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2dPckV4OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIChtc2dPckV4ID09PSBudWxsIHx8IG1zZ09yRXguY29uc3RydWN0b3IgPT09IFN0cmluZykpIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMChtc2dPckV4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMShtc2dPckV4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMChtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuV3JpdGVFcnJvclRvTG9nRXZlbnQobXNnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMShleDogRXhjZXB0aW9uKTogdm9pZCB7XHJcbiAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfXsyfXszfXs0fVwiLCBbXHJcbiAgICAgIGV4LkdldFR5cGUoKSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LlN0YWNrVHJhY2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5NZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+d3JpdGUgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nKG1zZzogc3RyaW5nKTogdm9pZDtcclxuICBzdGF0aWMgV3JpdGVXYXJuaW5nVG9Mb2coZXg6IEV4Y2VwdGlvbik6IHZvaWQ7XHJcbiAgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nKG1zZ09yRXg6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKG1zZ09yRXggPT09IG51bGwgfHwgbXNnT3JFeC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSkge1xyXG4gICAgICBFdmVudHMuV3JpdGVXYXJuaW5nVG9Mb2dfMChtc2dPckV4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nXzEobXNnT3JFeCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBXcml0ZVdhcm5pbmdUb0xvZ18wKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nRXZlbnQobXNnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nXzEoZXg6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nKGV4LkdldFR5cGUoKSArIFwiIDogXCIgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIGV4LlN0YWNrVHJhY2UgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIGV4Lk1lc3NhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibG9nTGV2ZWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFNob3VsZExvZyhsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyk6IGJvb2xlYW4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5TaG91bGRMb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICByZXR1cm4gRXZlbnRzLlNob3VsZExvZ0V2ZW50KGxvZ0xldmVsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT53cml0ZSBhIEdVSSBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZUd1aVRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLldyaXRlR3VpVG9Mb2dFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuV3JpdGVHdWlUb0xvZ0V2ZW50KFwiR1VJOiBcIiArIG1zZyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+d3JpdGUgYSBERVYgbWVzc2FnZSB0byB0aGUgaW50ZXJuYWwgbG9nIGZpbGU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgV3JpdGVEZXZUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZURldlRvTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLldyaXRlRGV2VG9Mb2dFdmVudChtc2cpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9DTEVBUiBtZXNzYWdlIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25DbGVhcihjdHJsOiBHdWlNZ0NvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgaWYgKEV2ZW50cy5DbGVhckV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBFdmVudHMuQ2xlYXJFdmVudChjdHJsKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9VTkRPIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPblVuZG8oY3RybDogR3VpTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICAgIGlmIChFdmVudHMuVW5kb0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBFdmVudHMuVW5kb0V2ZW50KGN0cmwpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCBFbnRlciBiZSBhZGRlZCBhcyBrZXlib2FyZCBldmVudCA/IFRoaXMgaXMgaW1wb3J0YW50IG1vc3RseSBpbiBkZXRlcm1pbmluZyBpZiBhIGNsaWNrIGV2ZW50XHJcbiAgLy8vIHdpbGwgYmUgcmFpc2VkIGZvciBhIGRlZmF1bHQgYnV0dG9uIG9yIG5vdC5cclxuICAvLy8gQWRkaW5nIEVudGVyIGFzIGEga2V5Ym9hcmQgZXZlbnQgd2lsbCBub3QgcmFpc2UgY2xpY2sgb24gZGVmYXVsdCBidXR0b24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBBZGRFbnRlckFzS2V5RXZlbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRXZlbnRzLlNob3VsZEFkZEVudGVyQXNLZXlFdmVudCAhPT0gbnVsbCAmJiBFdmVudHMuU2hvdWxkQWRkRW50ZXJBc0tleUV2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgU2hvd1Nlc3Npb25TdGF0aXN0aWNzRm9ybSgpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuU2hvd1Nlc3Npb25TdGF0aXN0aWNzRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlNob3dTZXNzaW9uU3RhdGlzdGljc0V2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENhbGxlZCB3aGVuIFdNX0NPUFlEQVRBIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29weURhdGFcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkNvcHlEYXRhKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBjb3B5RGF0YTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLkNvcHlEYXRhRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLkNvcHlEYXRhRXZlbnQoZ3VpTWdGb3JtLCBjb3B5RGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcbn1cclxuIl19