@magic-xpa/gui 4.801.0-dev481.244 → 4.801.0-dev481.250

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 (96) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
  3. package/esm2020/src/Commands.mjs +186 -0
  4. package/{esm2015/src/Events.js → esm2020/src/Events.mjs} +0 -0
  5. package/{esm2015/src/EventsProcessor.js → esm2020/src/EventsProcessor.mjs} +0 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
  8. package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +0 -0
  9. package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
  10. package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +1 -0
  11. package/esm2020/src/Manager.mjs +192 -0
  12. package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
  13. package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +1 -0
  14. package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
  15. package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
  16. package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
  17. package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
  18. package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
  19. package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
  20. package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
  21. package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
  22. package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
  23. package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
  24. package/{esm2015/src/gui/low/GuiInteractive.js → esm2020/src/gui/low/GuiInteractive.mjs} +0 -0
  25. package/{esm2015/src/gui/low/Style.js → esm2020/src/gui/low/Style.mjs} +0 -0
  26. package/{esm2015/src/management/RuntimeContextBase.js → esm2020/src/management/RuntimeContextBase.mjs} +0 -0
  27. package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
  28. package/{esm2015/src/management/data/DcValues.js → esm2020/src/management/data/DcValues.mjs} +0 -0
  29. package/{esm2015/src/management/data/DcValuesBuilderBase.js → esm2020/src/management/data/DcValuesBuilderBase.mjs} +0 -0
  30. package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
  31. package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
  32. package/{esm2015/src/management/data/GuiDataViewBase.js → esm2020/src/management/data/GuiDataViewBase.mjs} +0 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
  35. package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
  36. package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
  37. package/{esm2015/src/management/data/ObjectReferenceBase.js → esm2020/src/management/data/ObjectReferenceBase.mjs} +0 -0
  38. package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
  39. package/{esm2015/src/management/data/RecordUtils.js → esm2020/src/management/data/RecordUtils.mjs} +0 -0
  40. package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
  41. package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
  42. package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
  43. package/{esm2015/src/management/events/IGuiEventsManager.js → esm2020/src/management/events/IGuiEventsManager.mjs} +1 -0
  44. package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
  45. package/{esm2015/src/management/exp/GuiExpressionEvaluator.js → esm2020/src/management/exp/GuiExpressionEvaluator.mjs} +0 -0
  46. package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
  47. package/{esm2015/src/management/gui/DisplayConvertor.js → esm2020/src/management/gui/DisplayConvertor.mjs} +0 -0
  48. package/{esm2015/src/management/gui/FieldValidator.js → esm2020/src/management/gui/FieldValidator.mjs} +0 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
  51. package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
  52. package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
  55. package/{esm2015/src/management/gui/PIC.js → esm2020/src/management/gui/PIC.mjs} +0 -0
  56. package/{esm2015/src/management/gui/PropDefaults.js → esm2020/src/management/gui/PropDefaults.mjs} +0 -0
  57. package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +0 -0
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1382 -0
  60. package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
  61. package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
  62. package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
  63. package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
  65. package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
  66. package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
  67. package/{esm2015/src/management/tasks/MgTimer.js → esm2020/src/management/tasks/MgTimer.mjs} +0 -0
  68. package/{esm2015/src/management/tasks/TaskDefinitionId.js → esm2020/src/management/tasks/TaskDefinitionId.mjs} +0 -0
  69. package/{esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js → esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs} +0 -0
  70. package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
  71. package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
  72. package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
  73. package/{esm2015/src/util/ProcessLauncher.js → esm2020/src/util/ProcessLauncher.mjs} +0 -0
  74. package/{esm2015/src/util/UsernamePasswordCredentials.js → esm2020/src/util/UsernamePasswordCredentials.mjs} +0 -0
  75. package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +50 -4
  76. package/fesm2015/magic-xpa-gui.mjs.map +1 -0
  77. package/fesm2020/magic-xpa-gui.mjs +17805 -0
  78. package/fesm2020/magic-xpa-gui.mjs.map +1 -0
  79. package/package.json +27 -14
  80. package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
  81. package/src/management/tasks/GuiTaskBase.d.ts +1 -1
  82. package/bundles/magic-xpa-gui.umd.js +0 -19344
  83. package/bundles/magic-xpa-gui.umd.js.map +0 -1
  84. package/bundles/magic-xpa-gui.umd.min.js +0 -16
  85. package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
  86. package/esm2015/src/Commands.js +0 -189
  87. package/esm2015/src/FocusManager.js +0 -41
  88. package/esm2015/src/Manager.js +0 -197
  89. package/esm2015/src/management/data/GuiFieldBase.js +0 -85
  90. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
  91. package/esm2015/src/management/gui/MgControlBase.js +0 -1978
  92. package/esm2015/src/management/gui/MgFormBase.js +0 -763
  93. package/esm2015/src/management/gui/PropTable.js +0 -224
  94. package/esm2015/src/management/gui/Property.js +0 -1402
  95. package/esm2015/src/management/tasks/GuiTaskBase.js +0 -506
  96. package/fesm2015/magic-xpa-gui.js.map +0 -1
@@ -0,0 +1,748 @@
1
+ import { Constants, Logger_LogLevels, MgControlType, StorageAttribute, StrUtil, TabbingOrderType, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
2
+ import { Debug, Int32, List, NString, Stack, StringBuilder } from '@magic-xpa/mscorelib';
3
+ import { MgControlBase } from './MgControlBase';
4
+ import { PropTable } from './PropTable';
5
+ import { ControlTable } from './ControlTable';
6
+ import { Manager } from '../../Manager';
7
+ import { Events } from '../../Events';
8
+ import { Property } from './Property';
9
+ import { CommandType, HtmlProperties } from '../../GuiEnums';
10
+ import { NUM_TYPE } from '../data/NUM_TYPE';
11
+ import { Commands } from '../../Commands';
12
+ import { PropInterface } from './PropInterface';
13
+ import { GuiConstants } from '../../GuiConstants';
14
+ import { GuiFormPropertyAdapter } from './GuiFormPropertyAdapter';
15
+ const delimiter = ', ';
16
+ export class MgFormBase extends GuiFormPropertyAdapter {
17
+ constructor() {
18
+ super();
19
+ this.InInitForm = false;
20
+ this.CtrlTab = null;
21
+ this.FormRefreshed = false;
22
+ this.RefreshRepeatableAllowed = false;
23
+ this.Rows = null;
24
+ this.ModalFormsCount = 0;
25
+ this.ErrorOccured = false;
26
+ this.FormIsn = 0;
27
+ this.Name = null;
28
+ this.Opened = false;
29
+ this.isLegalForm = false;
30
+ this.PBImagesNumber = 0;
31
+ this.ignoreFirstRefreshTable = false;
32
+ this.ParentForm = null;
33
+ this._destTblRow = Int32.MinValue;
34
+ this._firstTableTabOrder = 0;
35
+ this._inRefreshDisp = false;
36
+ this._inRestore = false;
37
+ this._lastRowSent = -1;
38
+ this._prevGuiTopIndex = -1;
39
+ this._propTab = null;
40
+ this._rowsInPage = 1;
41
+ this._maxRowsInPaginatedTable = 0;
42
+ this._subFormCtrl = null;
43
+ this._tableMgControl = null;
44
+ this._tableItemsCount = 0;
45
+ this._tableRefreshed = false;
46
+ this._task = null;
47
+ this._topIndexUpdated = false;
48
+ this._transferingData = false;
49
+ this._allowedSubformRecompute = true;
50
+ this._concreteWindowType = 0;
51
+ this._containerCtrl = null;
52
+ this._firstRefreshOfProps = true;
53
+ this._prevSelIndex = -1;
54
+ this._shouldCreateToolbar = false;
55
+ this._tableChildren = null;
56
+ this._tableColumns = null;
57
+ this._userStateId = '';
58
+ this.displayLine = 0;
59
+ this.defaultRouterOutlet = null;
60
+ this._propTab = new PropTable(this);
61
+ this.CtrlTab = new ControlTable();
62
+ this.Rows = new List();
63
+ this._concreteWindowType = 0;
64
+ this.ParentForm = null;
65
+ }
66
+ get DisplayLine() {
67
+ return this.displayLine;
68
+ }
69
+ set DisplayLine(value) {
70
+ this.displayLine = value;
71
+ }
72
+ get UniqueName() {
73
+ if (this.GetComputedProperty(PropInterface.PROP_TYPE_FORM_NAME) != null)
74
+ return this.GetComputedProperty(PropInterface.PROP_TYPE_FORM_NAME).GetComputedValue();
75
+ else
76
+ return null;
77
+ }
78
+ get TaskTag() {
79
+ return this.getTask().getTaskTag();
80
+ }
81
+ get TableChildren() {
82
+ if (this._tableChildren === null)
83
+ this.buildTableChildren();
84
+ return this._tableChildren;
85
+ }
86
+ set TableChildren(value) {
87
+ this._tableChildren = value;
88
+ }
89
+ get ShouldCreateToolbar() {
90
+ return this._shouldCreateToolbar;
91
+ }
92
+ get AllowedSubformRecompute() {
93
+ return this._allowedSubformRecompute;
94
+ }
95
+ set AllowedSubformRecompute(value) {
96
+ this._allowedSubformRecompute = value;
97
+ }
98
+ get ConcreteWindowType() {
99
+ if (this._concreteWindowType === 0) {
100
+ let windowType = this.GetComputedProperty(PropInterface.PROP_TYPE_WINDOW_TYPE).GetComputedValueInteger();
101
+ if (this.ParentForm === null || windowType !== WindowType.Overlay)
102
+ windowType = WindowType.Default;
103
+ this._concreteWindowType = windowType;
104
+ }
105
+ return this._concreteWindowType;
106
+ }
107
+ set ConcreteWindowType(value) {
108
+ this._concreteWindowType = value;
109
+ }
110
+ static ShouldPutActOnFormClose() {
111
+ return false;
112
+ }
113
+ static ShouldBehaveAsModal() {
114
+ return false;
115
+ }
116
+ static ConvertArrayListToString(items, isItemNumType) {
117
+ let from = ['\\', '-', ','];
118
+ let to = ['\\\\', '\\-', '\\,'];
119
+ let stringBuilder = new StringBuilder();
120
+ let nUM_TYPE;
121
+ for (let index = 0; index < items.length; index = index + 1) {
122
+ if (isItemNumType) {
123
+ nUM_TYPE = new NUM_TYPE(items.get_Item(index));
124
+ items.set_Item(index, nUM_TYPE.to_double().toString());
125
+ }
126
+ stringBuilder.Append(StrUtil.searchAndReplace(items.get_Item(index), from, to));
127
+ if (index < items.length - 1)
128
+ stringBuilder.Append(delimiter);
129
+ }
130
+ return stringBuilder.ToString();
131
+ }
132
+ UpdateModalFormsCount(mgFormBase, increase) {
133
+ if (increase)
134
+ this.ModalFormsCount += 1;
135
+ else
136
+ this.ModalFormsCount -= 1;
137
+ Events.SetModal(mgFormBase, increase);
138
+ }
139
+ async EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
140
+ return await this._task.EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, true, wasEvaluated);
141
+ }
142
+ GetExpressionStorage(expId) {
143
+ return this._task.GetExpressionStorage(expId);
144
+ }
145
+ checkIfExistProp(propId) {
146
+ let exist = false;
147
+ if (this._propTab !== null) {
148
+ let propById = this._propTab.getPropById(propId);
149
+ exist = (propById !== null);
150
+ }
151
+ return exist;
152
+ }
153
+ getProp(propId) {
154
+ let prop = null;
155
+ if (this._propTab !== null) {
156
+ prop = this._propTab.getPropById(propId);
157
+ if (prop === null) {
158
+ prop = Property.getDefaultProp(propId, GuiConstants.PARENT_TYPE_FORM, this);
159
+ if (prop !== null)
160
+ this._propTab.addProp(prop);
161
+ }
162
+ }
163
+ return prop;
164
+ }
165
+ GetComputedProperty(propId) {
166
+ let prop = null;
167
+ if (this._propTab !== null)
168
+ prop = this._propTab.getPropById(propId);
169
+ return prop;
170
+ }
171
+ PropertyHasExpression(propId) {
172
+ let prop = this._propTab.getPropById(propId);
173
+ return prop !== null && prop.isExpression();
174
+ }
175
+ getCompIdx() {
176
+ return (this.getTask() === null) ? 0 : this.getTask().getCompIdx();
177
+ }
178
+ IsFirstRefreshOfProps() {
179
+ return this._firstRefreshOfProps;
180
+ }
181
+ getForm() {
182
+ return this;
183
+ }
184
+ fillData(taskRef) {
185
+ let parser = Manager.GetCurrentRuntimeContext().Parser;
186
+ if (this._task === null && taskRef !== null)
187
+ this._task = taskRef;
188
+ while (this.initInnerObjects(parser.getNextTag())) {
189
+ }
190
+ }
191
+ init() {
192
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
193
+ let ctrl = this.CtrlTab.getCtrl(i);
194
+ ctrl.Init();
195
+ }
196
+ this.buildLinkedControlsLists();
197
+ this.buildTableColumnsList();
198
+ this.createForm();
199
+ this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_SCREEN_MODE, this.isScreenMode());
200
+ this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_LEFT_TO_RIGHT, !this.GetComputedProperty(PropInterface.PROP_TYPE_HEBREW).GetComputedValueBoolean());
201
+ }
202
+ fillName(formTag) {
203
+ let parser = Manager.GetCurrentRuntimeContext().Parser;
204
+ let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
205
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
206
+ let tag = parser.getXMLsubstring(endContext);
207
+ parser.add2CurrIndex(tag.indexOf(formTag) + formTag.length);
208
+ let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
209
+ let attribute;
210
+ let valueStr;
211
+ for (let i = 0; i < tokensVector.length; i = i + 2) {
212
+ attribute = tokensVector.get_Item(i);
213
+ valueStr = tokensVector.get_Item(i + 1);
214
+ switch (attribute) {
215
+ case XMLConstants.MG_ATTR_NAME:
216
+ this.Name = XmlParser.unescape(valueStr).toString();
217
+ if (Events.ShouldLog(Logger_LogLevels.Gui))
218
+ Events.WriteGuiToLog(NString.Format('Parsing form "{0}"', this.Name));
219
+ break;
220
+ case XMLConstants.MG_ATTR_IS_FRAMESET:
221
+ break;
222
+ case XMLConstants.MG_ATTR_IS_LIGAL_RC_FORM:
223
+ this.isLegalForm = XmlParser.getBoolean(valueStr);
224
+ break;
225
+ case XMLConstants.MG_ATTR_PB_IMAGES_NUMBER:
226
+ this.PBImagesNumber = XmlParser.getInt(valueStr);
227
+ break;
228
+ case XMLConstants.MG_ATTR_FORM_ISN:
229
+ this.FormIsn = XmlParser.getInt(valueStr);
230
+ break;
231
+ case XMLConstants.MG_ATTR_USERSTATE_ID:
232
+ this._userStateId = XmlParser.unescape(valueStr).toString();
233
+ break;
234
+ default:
235
+ Events.WriteExceptionToLog(NString.Format('Unhandled attribute \'{0}\'.', attribute));
236
+ break;
237
+ }
238
+ }
239
+ parser.setCurrIndex(endContext + 1);
240
+ return;
241
+ }
242
+ Events.WriteExceptionToLog('in Form.FillName() out of bounds');
243
+ }
244
+ createForm() {
245
+ let inputControls = this.GetListOfInputControls();
246
+ let formName = this.buildFormName();
247
+ if (!this.isSubForm()) {
248
+ Commands.addOpenForm(this, formName, '0', this.getTask().getTaskTag(), inputControls, this.isDialog());
249
+ }
250
+ else {
251
+ Commands.addOpensubform(CommandType.CREATE_SUB_FORM, this.getSubFormCtrl(), this.getTask().getTaskTag(), this.getSubFormCtrl().getName(), formName, inputControls, this.getTask().RouterPath, this.getTask().GetRouterParams(), this.getTask().InDefaultRouterOutlet);
252
+ }
253
+ if (this.HasTable())
254
+ this.InitTableControl();
255
+ Commands.beginInvoke();
256
+ }
257
+ async CallJS(methodName, args) {
258
+ return Commands.addCallJS(this, this.UniqueName, methodName, args);
259
+ }
260
+ isAutomaticTabbingOrder() {
261
+ return this.GetComputedProperty(PropInterface.PROP_TYPE_TABBING_ORDER).GetComputedValueInteger() === TabbingOrderType.Automatically;
262
+ }
263
+ isRefreshRepeatableAllowed() {
264
+ return this.RefreshRepeatableAllowed;
265
+ }
266
+ isScreenMode() {
267
+ return !this.isLineMode();
268
+ }
269
+ isLineMode() {
270
+ return this.getMainControl() !== null;
271
+ }
272
+ hasTable() {
273
+ return this._tableMgControl !== null;
274
+ }
275
+ isDialog() {
276
+ let isDialog = false;
277
+ let windowType = this.ConcreteWindowType;
278
+ if (windowType === WindowType.Overlay)
279
+ isDialog = true;
280
+ else if (MgFormBase.ShouldBehaveAsModal())
281
+ isDialog = true;
282
+ return isDialog;
283
+ }
284
+ isSubForm() {
285
+ return this._subFormCtrl !== null;
286
+ }
287
+ HasTable() {
288
+ return this._tableMgControl !== null;
289
+ }
290
+ getTopMostForm() {
291
+ let topMostForm = this;
292
+ while (topMostForm.isSubForm() && topMostForm.ParentForm !== null)
293
+ topMostForm = topMostForm.ParentForm;
294
+ return topMostForm;
295
+ }
296
+ getTopMostFrameForm() {
297
+ let topMostForm = this;
298
+ while (topMostForm !== null)
299
+ topMostForm = ((topMostForm.ParentForm !== null) ? topMostForm.ParentForm : null);
300
+ return topMostForm;
301
+ }
302
+ getSubFormCtrl() {
303
+ return this._subFormCtrl;
304
+ }
305
+ getCtrl(ctrlIdx) {
306
+ return this.CtrlTab.getCtrl(ctrlIdx);
307
+ }
308
+ GetCtrl(ctrlName) {
309
+ return this.CtrlTab.getCtrl(ctrlName);
310
+ }
311
+ get DefaultRouterOutlet() {
312
+ if (this.defaultRouterOutlet == null) {
313
+ this.defaultRouterOutlet = this.CtrlTab.GetControl((x) => {
314
+ return x.IsDefaultRouterOutlet();
315
+ });
316
+ }
317
+ return this.defaultRouterOutlet;
318
+ }
319
+ async GetChoiceControlItemList(mgControl) {
320
+ Debug.Assert(mgControl.isChoiceControl());
321
+ let items = new List();
322
+ let fld = mgControl.getField();
323
+ let storageAttribute = fld.getCellsType();
324
+ if (storageAttribute !== StorageAttribute.DATE && storageAttribute !== StorageAttribute.TIME) {
325
+ if (mgControl.isRadio()) {
326
+ for (let i = 0; i < fld.GetRadioCtrls().length; i++) {
327
+ let radioControl = fld.GetRadioCtrls().get_Item(i);
328
+ items.AddRange(await radioControl.GetItemsRange());
329
+ }
330
+ }
331
+ else {
332
+ items.AddRange(await mgControl.GetItemsRange());
333
+ }
334
+ return MgFormBase.ConvertArrayListToString(items, storageAttribute === StorageAttribute.NUMERIC);
335
+ }
336
+ return NString.Empty;
337
+ }
338
+ async GetChoiceControlDisplayList(mgControl) {
339
+ Debug.Assert(mgControl.isChoiceControl());
340
+ let items = new List();
341
+ let fld = mgControl.getField();
342
+ let storageAttribute = fld.getCellsType();
343
+ if (storageAttribute !== StorageAttribute.DATE && storageAttribute !== StorageAttribute.TIME) {
344
+ if (mgControl.isRadio()) {
345
+ for (let i = 0; i < fld.GetRadioCtrls().length; i++) {
346
+ let radioControl = fld.GetRadioCtrls().get_Item(i);
347
+ items.AddRange(await radioControl.GetDisplayRange());
348
+ }
349
+ }
350
+ else {
351
+ items.AddRange(await mgControl.GetItemsRange());
352
+ }
353
+ return MgFormBase.ConvertArrayListToString(items, false);
354
+ }
355
+ return NString.Empty;
356
+ }
357
+ getControlColumn(ctrl) {
358
+ let column = null;
359
+ if ((ctrl.IsRepeatable || ctrl.IsTableHeaderChild) && this._tableColumns !== null)
360
+ column = this._tableColumns.get_Item(ctrl.getLayer() - 1);
361
+ return column;
362
+ }
363
+ getContainerCtrl() {
364
+ return this._containerCtrl;
365
+ }
366
+ getColumnControls() {
367
+ let columnControlsList = null;
368
+ if (this.CtrlTab !== null) {
369
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
370
+ let ctrl = this.CtrlTab.getCtrl(i);
371
+ if (ctrl.Type === MgControlType.CTRL_TYPE_COLUMN) {
372
+ if (columnControlsList === null)
373
+ columnControlsList = new List();
374
+ columnControlsList.push(ctrl);
375
+ }
376
+ }
377
+ }
378
+ return columnControlsList;
379
+ }
380
+ getTask() {
381
+ return this._task;
382
+ }
383
+ getTableCtrl() {
384
+ return this._tableMgControl;
385
+ }
386
+ getMainControl() {
387
+ return this._tableMgControl;
388
+ }
389
+ getCtrlByName(ctrlName, ctrlType) {
390
+ return this.CtrlTab.getCtrlByName(ctrlName, ctrlType);
391
+ }
392
+ checkAndCreateRow(idx) {
393
+ if (this._tableMgControl !== null && !this.isRowCreated(idx))
394
+ this.createRow(idx);
395
+ }
396
+ IsValidRow(idx) {
397
+ let validRow = false;
398
+ if (this._tableMgControl !== null && idx >= 0 && idx < this.Rows.length) {
399
+ let row = this.Rows.get_Item(idx);
400
+ validRow = (row !== null && row.Validated);
401
+ }
402
+ return validRow;
403
+ }
404
+ async refreshProps() {
405
+ if (this._firstRefreshOfProps) {
406
+ this.getProp(PropInterface.PROP_TYPE_TITLE_BAR);
407
+ }
408
+ await this._propTab.RefreshDisplay(false, false);
409
+ if (this._firstRefreshOfProps)
410
+ this._firstRefreshOfProps = false;
411
+ }
412
+ async refreshControls(repeatableOnly) {
413
+ let ctrl;
414
+ if (this.DisplayLine === Int32.MinValue)
415
+ return;
416
+ if (this._tableMgControl !== null && !repeatableOnly)
417
+ await this._tableMgControl.RefreshDisplay();
418
+ if (this._tableColumns !== null && !repeatableOnly) {
419
+ for (let i = 0; i < this._tableColumns.length; i = i + 1) {
420
+ let mgControlBase = this._tableColumns.get_Item(i);
421
+ await mgControlBase.RefreshDisplay();
422
+ }
423
+ }
424
+ this.checkAndCreateRow(this.DisplayLine);
425
+ let tabAndGroupControls = new Stack();
426
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
427
+ ctrl = this.CtrlTab.getCtrl(i);
428
+ if ((ctrl.isTabControl() || ctrl.isGroup()) && !repeatableOnly) {
429
+ tabAndGroupControls.push(ctrl);
430
+ }
431
+ if (ctrl.Type !== MgControlType.CTRL_TYPE_TABLE && ctrl.Type !== MgControlType.CTRL_TYPE_COLUMN) {
432
+ if (ctrl.IsRepeatable || !repeatableOnly)
433
+ await ctrl.RefreshDisplay();
434
+ }
435
+ else if (ctrl.Type === MgControlType.CTRL_TYPE_TABLE && repeatableOnly)
436
+ await ctrl.RefreshDisplay(repeatableOnly);
437
+ }
438
+ }
439
+ markRowNOTCreated(idx) {
440
+ Commands.addWithNumber(CommandType.UNDO_CREATE_TABLE_ROW, this._tableMgControl, idx);
441
+ if (idx >= 0 && idx < this.Rows.length)
442
+ this.Rows.set_Item(idx, new Row(false, false));
443
+ }
444
+ SelectRow(sendAlwaysOrRowIdx, sendAlways) {
445
+ if (arguments.length === 0)
446
+ this.SelectRow_0();
447
+ else if (arguments.length === 1)
448
+ this.SelectRow_1(sendAlwaysOrRowIdx);
449
+ else
450
+ this.SelectRow_2(sendAlwaysOrRowIdx, sendAlways);
451
+ }
452
+ getRowsInPage() {
453
+ return this._rowsInPage;
454
+ }
455
+ getMaxRowsInPaginatedTable() {
456
+ return this._maxRowsInPaginatedTable;
457
+ }
458
+ setRowsInPage(size) {
459
+ this._rowsInPage = size;
460
+ }
461
+ getColumnsCount() {
462
+ let columnsCount = 0;
463
+ if (this.CtrlTab !== null) {
464
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
465
+ let control = this.CtrlTab.getCtrl(i);
466
+ if (control.Type === MgControlType.CTRL_TYPE_COLUMN)
467
+ columnsCount = columnsCount + 1;
468
+ }
469
+ }
470
+ return columnsCount;
471
+ }
472
+ inRefreshDisplay() {
473
+ return this._inRefreshDisp;
474
+ }
475
+ setTitle(newTitle) {
476
+ Commands.setTitle(this, newTitle);
477
+ }
478
+ getControlIdx(ctrl) {
479
+ return this.CtrlTab.getControlIdx(ctrl, true);
480
+ }
481
+ getTopIndexFromGUI() {
482
+ let topDisplayLine = 0;
483
+ if (this.hasTable())
484
+ topDisplayLine = Commands.getTopIndex(this.getMainControl());
485
+ return topDisplayLine;
486
+ }
487
+ getTableItemsCount() {
488
+ return this._tableItemsCount;
489
+ }
490
+ removeRefsToCtrls() {
491
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
492
+ this.CtrlTab.getCtrl(i).removeRefFromField();
493
+ }
494
+ }
495
+ buildTableChildren() {
496
+ if (this._tableChildren === null) {
497
+ this._tableChildren = new List();
498
+ if (this.CtrlTab !== null) {
499
+ let minTabOrder = 2147483647;
500
+ let automaticTabbingOrder = this.isAutomaticTabbingOrder();
501
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
502
+ let ctrl = this.CtrlTab.getCtrl(i);
503
+ if (ctrl.IsRepeatable || ctrl.IsTableHeaderChild) {
504
+ this._tableChildren.push(ctrl);
505
+ if (automaticTabbingOrder) {
506
+ let prop = ctrl.GetComputedProperty(PropInterface.PROP_TYPE_TAB_ORDER);
507
+ if (prop !== null) {
508
+ let valueInt = prop.GetComputedValueInteger();
509
+ if (valueInt < minTabOrder)
510
+ minTabOrder = valueInt;
511
+ }
512
+ }
513
+ }
514
+ }
515
+ if (minTabOrder !== Int32.MaxValue && automaticTabbingOrder) {
516
+ this._firstTableTabOrder = minTabOrder;
517
+ }
518
+ }
519
+ }
520
+ }
521
+ setTableCtrl(tableCtrl) {
522
+ this._tableMgControl = tableCtrl;
523
+ }
524
+ getCtrlCount() {
525
+ return this.CtrlTab.getSize();
526
+ }
527
+ GetControlsCountExcludingStatusBar() {
528
+ return this.CtrlTab.getSize();
529
+ }
530
+ async refreshPropsOnExpression() {
531
+ let i;
532
+ let size = (this._propTab == null ? 0 : this._propTab.getSize());
533
+ let prop;
534
+ let refresh = false;
535
+ for (i = 0; i < size && !refresh; i++) {
536
+ prop = this._propTab.getProp(i);
537
+ if (prop.isExpression()) {
538
+ refresh = true;
539
+ await this.refreshProps();
540
+ }
541
+ }
542
+ }
543
+ getTabControl(ctrl) {
544
+ let obj;
545
+ let result = null;
546
+ obj = ctrl;
547
+ while (obj instanceof MgControlBase) {
548
+ let currCtrl = obj;
549
+ if (currCtrl.isTabControl()) {
550
+ result = currCtrl;
551
+ break;
552
+ }
553
+ obj = currCtrl.getParent();
554
+ }
555
+ if (result == null) {
556
+ for (let i = 0; i < this.CtrlTab.getSize(); i++) {
557
+ obj = this.CtrlTab.getCtrl(i);
558
+ if (obj.isTabControl()) {
559
+ result = obj;
560
+ break;
561
+ }
562
+ }
563
+ }
564
+ return result;
565
+ }
566
+ IsInputType(ctrl) {
567
+ switch (ctrl.Type) {
568
+ case MgControlType.CTRL_TYPE_CHECKBOX:
569
+ case MgControlType.CTRL_TYPE_TEXT:
570
+ case MgControlType.CTRL_TYPE_COMBO:
571
+ case MgControlType.CTRL_TYPE_LIST:
572
+ case MgControlType.CTRL_TYPE_RADIO:
573
+ return true;
574
+ default:
575
+ return false;
576
+ }
577
+ }
578
+ GetListOfInputControls() {
579
+ let filterterList = this.CtrlTab.filter(((c) => this.IsInputType(c)));
580
+ let names = filterterList.reduce((pre, ctrl) => {
581
+ pre[ctrl.UniqueName] = ctrl.IsRepeatable ? '1' : '0';
582
+ return pre;
583
+ }, {});
584
+ return names;
585
+ }
586
+ firstTableRefresh() {
587
+ if (this._tableMgControl !== null) {
588
+ this._rowsInPage = Commands.getRowsInPage(this._tableMgControl);
589
+ this.RefreshRepeatableAllowed = true;
590
+ }
591
+ }
592
+ SetTableItemsCount(dvsize, tableItemsCountOrRemoveAll, removeAll) {
593
+ if (typeof tableItemsCountOrRemoveAll == 'boolean') {
594
+ this.SetTableItemsCount_0(dvsize, tableItemsCountOrRemoveAll);
595
+ }
596
+ else
597
+ this.SetTableItemsCount_1(dvsize, tableItemsCountOrRemoveAll, removeAll);
598
+ }
599
+ SetTableItemsCount_0(dvsize, removeAll) {
600
+ this.SetTableItemsCount_1(dvsize, dvsize, removeAll);
601
+ }
602
+ SetTableItemsCount_1(dvsize, tableItemsCount, removeAll) {
603
+ this.InitTableControl(dvsize, tableItemsCount, removeAll);
604
+ }
605
+ InitTableControl(dvSize, tableItemsCount, removeAll) {
606
+ if (arguments.length === 0) {
607
+ this.InitTableControl_0();
608
+ return;
609
+ }
610
+ this.InitTableControl_1(dvSize, tableItemsCount);
611
+ }
612
+ UpdateTableChildrenArraysSize(size) {
613
+ let children = this.TableChildren;
614
+ if (children != null) {
615
+ for (let i = 0; i < children.length; i++) {
616
+ let control = children.get_Item(i);
617
+ control.updateArrays(size);
618
+ }
619
+ }
620
+ if (this._tableMgControl != null)
621
+ this._tableMgControl.updateArrays(size);
622
+ }
623
+ toString() {
624
+ return '{GuiMgForm' + ': Id=' + this._userStateId + '}';
625
+ }
626
+ IncludeControlInTabbingOrder(control) {
627
+ if (!control.PropertyExists(PropInterface.PROP_TYPE_TAB_ORDER))
628
+ return false;
629
+ return true;
630
+ }
631
+ GetHashCode() {
632
+ return this.FormIsn;
633
+ }
634
+ initInnerObjects(foundTagName) {
635
+ if (foundTagName === null)
636
+ return false;
637
+ let parser = Manager.GetCurrentRuntimeContext().Parser;
638
+ if (MgFormBase.IsFormTag(foundTagName))
639
+ this.fillName(foundTagName);
640
+ else if (foundTagName === XMLConstants.MG_TAG_PROP)
641
+ this._propTab.fillData(this, 'F', parser);
642
+ else if (foundTagName === XMLConstants.MG_TAG_CONTROL) {
643
+ this.CtrlTab.fillData(this, parser);
644
+ if (!this.HasTable())
645
+ this.RefreshRepeatableAllowed = true;
646
+ }
647
+ else if (MgFormBase.IsEndFormTag(foundTagName)) {
648
+ parser.setCurrIndex2EndOfTag();
649
+ return false;
650
+ }
651
+ else
652
+ return false;
653
+ return true;
654
+ }
655
+ isRowCreated(idx) {
656
+ if (this.Rows.length <= idx || idx < 0) {
657
+ return false;
658
+ }
659
+ let row = this.Rows.get_Item(idx);
660
+ if (row === null)
661
+ return false;
662
+ return row.Created;
663
+ }
664
+ buildLinkedControlsLists() {
665
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
666
+ let ctrl = this.CtrlTab.getCtrl(i);
667
+ let linkedParent = ctrl.getLinkedParent(false);
668
+ if (linkedParent !== null)
669
+ linkedParent.linkCtrl(ctrl);
670
+ }
671
+ }
672
+ buildTableColumnsList() {
673
+ if (this._tableMgControl !== null) {
674
+ this._tableColumns = new List();
675
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
676
+ let control = this.CtrlTab.getCtrl(i);
677
+ if (control.Type === MgControlType.CTRL_TYPE_COLUMN)
678
+ this._tableColumns.push(control);
679
+ }
680
+ }
681
+ }
682
+ createRow(idx) {
683
+ Commands.addWithNumber(CommandType.CREATE_TABLE_ROW, this._tableMgControl, idx);
684
+ if (this.Rows.length <= idx)
685
+ this.Rows.SetSize(idx + 1);
686
+ this.Rows.set_Item(idx, new Row(true, true));
687
+ }
688
+ SelectRow_0() {
689
+ this.SelectRow(false);
690
+ }
691
+ SelectRow_1(sendAlways) {
692
+ this.SelectRow(this.DisplayLine, sendAlways);
693
+ }
694
+ SelectRow_2(rowIdx, sendAlways) {
695
+ let mainControl = this.getMainControl();
696
+ if (mainControl !== null && this.RefreshRepeatableAllowed) {
697
+ let index = rowIdx;
698
+ if (this._task.DataView.isEmptyDataview())
699
+ index = GuiConstants.NO_ROW_SELECTED;
700
+ if (sendAlways || index !== this._prevSelIndex) {
701
+ this._prevSelIndex = index;
702
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, mainControl, 0, HtmlProperties.SelectedRow, index);
703
+ }
704
+ }
705
+ }
706
+ InitTableControl_0() {
707
+ this.InitTableControl(1, 1, false);
708
+ }
709
+ InitTableControl_1(dvSize, tableItemsCount) {
710
+ if (this._tableMgControl != null) {
711
+ Commands.addWithNumber(CommandType.SET_TABLE_ITEMS_COUNT, this._tableMgControl, tableItemsCount);
712
+ this._tableItemsCount = tableItemsCount;
713
+ this.Rows.SetSize(dvSize);
714
+ this._prevGuiTopIndex = -2;
715
+ this._prevSelIndex = -2;
716
+ this.UpdateTableChildrenArraysSize(dvSize);
717
+ this._maxRowsInPaginatedTable = Commands.getMaxRowsInPaginatedTable(this._tableMgControl);
718
+ }
719
+ }
720
+ InsertTableChildrenArrays(idx, count) {
721
+ let children = this.TableChildren;
722
+ if (children != null) {
723
+ for (let i = 0; i < children.length; i++) {
724
+ let control = children[i];
725
+ control.InsertArrays(idx, count);
726
+ }
727
+ }
728
+ }
729
+ }
730
+ export class Row {
731
+ constructor(created, validated) {
732
+ this.Created = false;
733
+ this.Validated = false;
734
+ if (arguments.length === 0) {
735
+ this.constructor_0();
736
+ return;
737
+ }
738
+ this.constructor_1(created, validated);
739
+ }
740
+ constructor_0() {
741
+ this.Validated = true;
742
+ }
743
+ constructor_1(created, validated) {
744
+ this.Created = created;
745
+ this.Validated = validated;
746
+ }
747
+ }
748
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdGb3JtQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUMsS0FBSyxFQUFhLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFZLEtBQUssRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7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LGNBQVMsR0FBWSxLQUFLLENBQUM7UUFLekIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxPQUFnQixFQUFFLFNBQWtCO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UHJvcFBhcmVudEludGVyZmFjZX0gZnJvbSAnLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFRhYmJpbmdPcmRlclR5cGUsXHJcbiAgV2luZG93VHlwZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7RGVidWcsIElIYXNoQ29kZSwgSW50MzIsIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlcn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge01nQ29udHJvbEJhc2V9IGZyb20gJy4vTWdDb250cm9sQmFzZSc7XHJcbmltcG9ydCB7UHJvcFRhYmxlfSBmcm9tICcuL1Byb3BUYWJsZSc7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gJy4uL3Rhc2tzL0d1aVRhc2tCYXNlJztcclxuaW1wb3J0IHtDb250cm9sVGFibGV9IGZyb20gJy4vQ29udHJvbFRhYmxlJztcclxuaW1wb3J0IHtNYW5hZ2VyfSBmcm9tICcuLi8uLi9NYW5hZ2VyJztcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gJy4vUHJvcGVydHknO1xyXG5pbXBvcnQge0NvbW1hbmRUeXBlLCBIdG1sUHJvcGVydGllc30gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQge05VTV9UWVBFfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHtDb21tYW5kc30gZnJvbSAnLi4vLi4vQ29tbWFuZHMnO1xyXG5pbXBvcnQge0d1aUZpZWxkQmFzZX0gZnJvbSAnLi4vZGF0YS9HdWlGaWVsZEJhc2UnO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gJy4vUHJvcEludGVyZmFjZSc7XHJcbmltcG9ydCB7R3VpQ29uc3RhbnRzfSBmcm9tICcuLi8uLi9HdWlDb25zdGFudHMnO1xyXG5pbXBvcnQge0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gJy4vR3VpRm9ybVByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcn0gZnJvbSAnLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyJztcclxuXHJcblxyXG5jb25zdCBkZWxpbWl0ZXI6IHN0cmluZyA9ICcsICc7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBkYXRhIGZvciA8Zm9ybT4uLi48L2Zvcm0+XHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNZ0Zvcm1CYXNlIGV4dGVuZHMgR3VpRm9ybVByb3BlcnR5QWRhcHRlciBpbXBsZW1lbnRzIFByb3BQYXJlbnRJbnRlcmZhY2UsIElIYXNoQ29kZSB7XHJcbiAgSW5Jbml0Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBDdHJsVGFiOiBDb250cm9sVGFibGUgPSBudWxsO1xyXG4gIC8vIHVudGlsIHRoZSBmb3JtIGlzIHJlZnJlc2hlZCBpbiB0aGUgZmlyc3QgdGltZVxyXG4gIEZvcm1SZWZyZXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBSZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBSb3dzOiBMaXN0PFJvdz4gPSBudWxsO1xyXG4gIE1vZGFsRm9ybXNDb3VudDogbnVtYmVyID0gMDtcclxuICBFcnJvck9jY3VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBGb3JtSXNuOiBudW1iZXIgPSAwO1xyXG4gIE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNMZWdhbEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQQkltYWdlc051bWJlcjogbnVtYmVyID0gMDtcclxuICBpZ25vcmVGaXJzdFJlZnJlc2hUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcm90ZWN0ZWQgX2Rlc3RUYmxSb3c6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByb3RlY3RlZCBfZmlyc3RUYWJsZVRhYk9yZGVyOiBudW1iZXIgPSAwOyAgICAgICAgICAgIC8vIHRhYiBvcmRlciBvZiBmaXJzdCBjaGlsZCBvZiB0YWJsZVxyXG4gIHByb3RlY3RlZCBfaW5SZWZyZXNoRGlzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBfaW5SZXN0b3JlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9sYXN0Um93U2VudDogbnVtYmVyID0gLTE7ICAgICAgICAgICAgICAgICAgLy8gbGFzdCByb3cgc2VudCBybyBndWkgdGhyZWFkXHJcbiAgcHJvdGVjdGVkIF9wcmV2R3VpVG9wSW5kZXg6IG51bWJlciA9IC0xOyAgICAgICAgICAgICAgLy8gRm9yIHBhZ2luYXRlZCB0YWJsZSBpdCdzIEd1aVRvcEluZGV4IGVsc2UgaXQncyBkdlRvcEluZGV4XHJcbiAgcHJvdGVjdGVkIF9wcm9wVGFiOiBQcm9wVGFibGUgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfcm93c0luUGFnZTogbnVtYmVyID0gMTtcclxuICBwcm90ZWN0ZWQgX21heFJvd3NJblBhZ2luYXRlZFRhYmxlOiBudW1iZXIgPSAwOyAgICAgICAvLyBtYXggbm8gb2Ygcm93cyBpbiBwYWdpbmF0ZWQgdGFibGVcclxuICBwcm90ZWN0ZWQgX3N1YkZvcm1DdHJsOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX3RhYmxlTWdDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX3RhYmxlSXRlbXNDb3VudDogbnVtYmVyID0gMDsgICAgICAgICAgICAgICAvLyBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGVcclxuICBwcm90ZWN0ZWQgX3RhYmxlUmVmcmVzaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF90YXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhc2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgZm9ybSBiZWxvbmdzXHJcbiAgcHJvdGVjdGVkIF90b3BJbmRleFVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gdHJ1ZSBpZiBhIHRvcCBpbmRleCB3YXMgdXBkYXRlZFxyXG5cclxuICAvLyBGb3JtIHJlcHJlc2VudGluZyB0aGUgaW50ZXJuYWwgaGVscCB3aW5kb3cuSGVyZSB0aGUgaW50ZXJuYWwgZm9ybSBvYmplY3QgaXMga2VwdCBvbiB0aGUgZm9ybSBvYmplY3QgaXRzZWxmLlxyXG4gIHByb3RlY3RlZCBfdHJhbnNmZXJpbmdEYXRhOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIHJvd3MgYXJlIHJlcXVlc3RlZCBmb3IgYSBHVUkgdGhyZWFkXHJcbiAgLy8gcHJldmVudHMgcmVmcmVzaCBvZiBEaXNwbGF5TGlzdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbHMgYW5kIGN1cnJSZWNDb21wdXRlKFJDKVxyXG4gIHByaXZhdGUgX2FsbG93ZWRTdWJmb3JtUmVjb21wdXRlOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9jb25jcmV0ZVdpbmRvd1R5cGU6IFdpbmRvd1R5cGUgPSAwO1xyXG4gIHByaXZhdGUgX2NvbnRhaW5lckN0cmw6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2ZpcnN0UmVmcmVzaE9mUHJvcHM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9wcmV2U2VsSW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIHByaXZhdGUgX3Nob3VsZENyZWF0ZVRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgIC8vIGlmIHRvIGNyZWF0ZSB0b29sYmFyXHJcbiAgcHJpdmF0ZSBfdGFibGVDaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7ICAgLy8gQ2FuJ3QgdXNlIExpc3Q8VD5cclxuICBwcml2YXRlIF90YWJsZUNvbHVtbnM6IExpc3Q8TWdDb250cm9sQmFzZT4gPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfdXNlclN0YXRlSWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIGRpc3BsYXlMaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuX3Byb3BUYWIgPSBuZXcgUHJvcFRhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5DdHJsVGFiID0gbmV3IENvbnRyb2xUYWJsZSgpO1xyXG4gICAgdGhpcy5Sb3dzID0gbmV3IExpc3QoKTtcclxuICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IDxXaW5kb3dUeXBlPjA7XHJcbiAgICB0aGlzLlBhcmVudEZvcm0gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IERpc3BsYXlMaW5lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIHNldCBEaXNwbGF5TGluZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpc3BsYXlMaW5lID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVW5pcXVlTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNX05BTUUpICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STV9OQU1FKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRhc2tUYWcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IFRhYmxlQ2hpbGRyZW4oKTogTGlzdDxNZ0NvbnRyb2xCYXNlPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVDaGlsZHJlbiA9PT0gbnVsbClcclxuICAgICAgdGhpcy5idWlsZFRhYmxlQ2hpbGRyZW4oKTtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZUNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgc2V0IFRhYmxlQ2hpbGRyZW4odmFsdWU6IExpc3Q8TWdDb250cm9sQmFzZT4pIHtcclxuICAgIHRoaXMuX3RhYmxlQ2hpbGRyZW4gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBTaG91bGRDcmVhdGVUb29sYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3VsZENyZWF0ZVRvb2xiYXI7XHJcbiAgfVxyXG5cclxuICBnZXQgQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZFN1YmZvcm1SZWNvbXB1dGU7XHJcbiAgfVxyXG5cclxuICBzZXQgQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgZm9yIGEgRml0VG9NZGkgd2luZG93LlxyXG5cclxuICBnZXQgQ29uY3JldGVXaW5kb3dUeXBlKCk6IFdpbmRvd1R5cGUge1xyXG4gICAgaWYgKHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9PT0gPFdpbmRvd1R5cGU+MCkge1xyXG4gICAgICBsZXQgd2luZG93VHlwZTogV2luZG93VHlwZSA9IDxXaW5kb3dUeXBlPnRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfVFlQRSkuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgaWYgKHRoaXMuUGFyZW50Rm9ybSA9PT0gbnVsbCB8fCB3aW5kb3dUeXBlICE9PSBXaW5kb3dUeXBlLk92ZXJsYXkpXHJcbiAgICAgICAgd2luZG93VHlwZSA9IFdpbmRvd1R5cGUuRGVmYXVsdDtcclxuXHJcbiAgICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IHdpbmRvd1R5cGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fY29uY3JldGVXaW5kb3dUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgZm9yIEZsb2F0aW5nLCBUb29sIG9yIE1vZGFsLlxyXG5cclxuICBzZXQgQ29uY3JldGVXaW5kb3dUeXBlKHZhbHVlOiBXaW5kb3dUeXBlKSB7XHJcbiAgICB0aGlzLl9jb25jcmV0ZVdpbmRvd1R5cGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2QgZW5hYmxlcyBhIHNwZWNpZmljIGFjdGlvbiBvbiBhbGwgdGhlIG1lbnUgb2JqZWN0cyBvZiB0aGUgZm9ybSBhbmQgaXRzIGNoaWxkcmVuJ3NcclxuICAvLy8gbWVudXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFjdGlvblwiPmFjdGlvbiB3aG9zZSBzdGF0ZSBoYXMgY2hhbmdlZDwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFNob3VsZFB1dEFjdE9uRm9ybUNsb3NlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGZvcm0gdGhhdCBhbHJlYWR5IHdhcyBjb21wdXRlZCBieSBpdHMgSWRcclxuICAvLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgY3JlYXRlIGEgcHJvcGVydHkgaWYgaXQgaXNuJ3QgZXhpc3QuXHJcbiAgLy8vIE1heSB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHByb3BlcnR5IGFuZCB1c2UgaXRzIGRlZmF1bHQgdmFsdWUuXHJcbiAgLy8vIEluIFBoYXNlIDIgaW4gUmVmcmVzaFByb3BlcnRpZXMgbWV0aG9kIHdlJ2xsIGNyZWF0ZSBhbmQgY29tcHV0ZSBwcm9wZXJ0aWVzLFxyXG4gIC8vLyBwZXJoYXBzIHdlIG5lZWQgY3JlYXRlIGFsbCBwcm9wZXJ0aWVzIG5vdCBvbmx5IHRob3NlIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgc3RhdGljIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrcyBpZiBwcm9wZXJ0eSBoYXMgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBDb252ZXJ0QXJyYXlMaXN0VG9TdHJpbmcoaXRlbXM6IExpc3Q8c3RyaW5nPiwgaXNJdGVtTnVtVHlwZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgZnJvbTogc3RyaW5nW10gPSBbJ1xcXFwnLCAnLScsICcsJ107XHJcbiAgICBsZXQgdG86IHN0cmluZ1tdID0gWydcXFxcXFxcXCcsICdcXFxcLScsICdcXFxcLCddO1xyXG4gICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IG5VTV9UWVBFOiBOVU1fVFlQRTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleDogbnVtYmVyID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ID0gaW5kZXggKyAxKSB7XHJcbiAgICAgIGlmIChpc0l0ZW1OdW1UeXBlKSB7XHJcbiAgICAgICAgblVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoPHN0cmluZz5pdGVtcy5nZXRfSXRlbShpbmRleCkpO1xyXG4gICAgICAgIGl0ZW1zLnNldF9JdGVtKGluZGV4LCBuVU1fVFlQRS50b19kb3VibGUoKS50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKDxzdHJpbmc+aXRlbXMuZ2V0X0l0ZW0oaW5kZXgpLCBmcm9tLCB0bykpO1xyXG5cclxuICAgICAgaWYgKGluZGV4IDwgaXRlbXMubGVuZ3RoIC0gMSlcclxuICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChkZWxpbWl0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHBhcnNlIHRoZSBmb3JtIHN0cnVjdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5jcmVhc2VcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZU1vZGFsRm9ybXNDb3VudChtZ0Zvcm1CYXNlOiBNZ0Zvcm1CYXNlLCBpbmNyZWFzZTogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgIGlmIChpbmNyZWFzZSlcclxuICAgICAgdGhpcy5Nb2RhbEZvcm1zQ291bnQgKz0gMTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5Nb2RhbEZvcm1zQ291bnQgLT0gMTtcclxuXHJcbiAgICBFdmVudHMuU2V0TW9kYWwobWdGb3JtQmFzZSwgaW5jcmVhc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUbyBhbGxvY2F0ZSBhbmQgZmlsbCBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBFdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIsIGNvbnRlbnRUeXBlVW5pY29kZTogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzQ2VsbFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGFsd2F5c0V2YWx1YXRlOiBib29sZWFuLCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90YXNrLkV2YWx1YXRlRXhwcmVzc2lvbihleHBJZCwgcmVzVHlwZSwgbGVuZ3RoLCBjb250ZW50VHlwZVVuaWNvZGUsIHJlc0NlbGxUeXBlLCB0cnVlLCB3YXNFdmFsdWF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2suR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdGlhbGl6YXRpb24uXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgY2hlY2tJZkV4aXN0UHJvcChwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcHJvcEJ5SWQ6IFByb3BlcnR5ID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgICBleGlzdCA9IChwcm9wQnlJZCAhPT0gbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCBuYW1lIG1lbWJlciBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCB0aGVuIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBhbmQgZ2l2ZSBpdCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNLCB0aGlzKTtcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX3Byb3BUYWIuYWRkUHJvcChwcm9wKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZm9yIGVhY2ggY29udHJvbCBidWlsZCB0aGUgbGlzdCBvZiBhbGwgdGhlIGNvbnRyb2xzIHRoYXQgYXJlIGxpbmtlZCB0byBpdFxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIEdldENvbXB1dGVkUHJvcGVydHkocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKVxyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG5cclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUHJvcGVydHlIYXNFeHByZXNzaW9uKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICByZXR1cm4gcHJvcCAhPT0gbnVsbCAmJiBwcm9wLmlzRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb21wSWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuZ2V0VGFzaygpID09PSBudWxsKSA/IDAgOiB0aGlzLmdldFRhc2soKS5nZXRDb21wSWR4KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYXJyYW5nZSB6b3JkZXIgZm9yIGNvbnRyb2xzLiByZWN1cnNpdmUgZnVuY3Rpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWZyZXNoT2ZQcm9wcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBsaXN0IG9mIGFsbCBjb2x1bW5zIGNvbnRyb2xzXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVja3MgaWYgYW4gaW50ZXJuYWwgRml0IHRvIE1ESSBmb3JtIG5lZWRzIHRvIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGUgTWFpbiBQcm9ncmFtIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+cmVmZXJlbmNlIHRvIHRoZSBvd25lclRhc2sgb2YgdGhpcyBmb3JtPC9wYXJhbT5cclxuICBmaWxsRGF0YSh0YXNrUmVmOiBHdWlUYXNrQmFzZSk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Rhc2sgPT09IG51bGwgJiYgdGFza1JlZiAhPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFzayA9IHRhc2tSZWY7XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpKSkge1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgIC8vIGluaXRpYWxpemVzIHRoZSBzdWJmb3JtIGNvbnRyb2xzXHJcbiAgICAgIGN0cmwuSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGJ1aWxkIGxpc3RzIG9mIGxpbmtlZCBjb250cm9scyBvbiB0aGVpciBwYXJlbnRzXHJcbiAgICB0aGlzLmJ1aWxkTGlua2VkQ29udHJvbHNMaXN0cygpO1xyXG5cclxuICAgIC8vIGJ1aWxkIGxpc3Qgb2YgY29sdW1ucyBhbmQgbm9uIGNvbHVtbnNcclxuICAgIHRoaXMuYnVpbGRUYWJsZUNvbHVtbnNMaXN0KCk7XHJcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuXHJcbiAgICB0aGlzLl90YXNrLnNldEtleWJvYXJkTWFwcGluZ1N0YXRlKENvbnN0YW50cy5BQ1RfU1RUX1RCTF9TQ1JFRU5fTU9ERSwgdGhpcy5pc1NjcmVlbk1vZGUoKSk7XHJcbiAgICB0aGlzLl90YXNrLnNldEtleWJvYXJkTWFwcGluZ1N0YXRlKENvbnN0YW50cy5BQ1RfU1RUX1RCTF9MRUZUX1RPX1JJR0hULCAhdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVykuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgb3JkZXIgdGhlIHNwbGl0dGVyIGNvbnRhaW5lciBjaGlsZHJlbi4gVGhlIGNoaWxkIHRoYXQgaXMgZG9ja2VkIHRvIGZpbGwgaXMgYWRkZWQgZmlyc3QsIHRoZW5cclxuICAvLy8gICB0aGUgc3BsaXR0ZXIgY29udHJvbCBhbmQgZmluYWxseSB0aGUgY2hpbGQgdGhhdCBpcyBkb2NrZWQgZWl0aGVyIHRvIHRoZSB0b3Agb3IgdG8gdGhlIGxlZnRcclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBlbmQgSW5kZXggb2YgdGhlPGZvcm0gLi4uPiBzdWJ0YWc8L3JldHVybnM+XHJcbiAgZmlsbE5hbWUoZm9ybVRhZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihmb3JtVGFnKSArIGZvcm1UYWcubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmc7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaSA9IGkgKyAyKSB7XHJcbiAgICAgICAgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGkgKyAxKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgICAgdGhpcy5OYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkd1aSkpXHJcbiAgICAgICAgICAgICAgRXZlbnRzLldyaXRlR3VpVG9Mb2coTlN0cmluZy5Gb3JtYXQoJ1BhcnNpbmcgZm9ybSBcInswfVwiJywgdGhpcy5OYW1lKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19GUkFNRVNFVDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX0xJR0FMX1JDX0ZPUk06XHJcbiAgICAgICAgICAgIHRoaXMuaXNMZWdhbEZvcm0gPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9QQl9JTUFHRVNfTlVNQkVSOlxyXG4gICAgICAgICAgICB0aGlzLlBCSW1hZ2VzTnVtYmVyID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9GT1JNX0lTTjpcclxuICAgICAgICAgICAgdGhpcy5Gb3JtSXNuID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9VU0VSU1RBVEVfSUQ6XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJTdGF0ZUlkID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KCdVbmhhbmRsZWQgYXR0cmlidXRlIFxcJ3swfVxcJy4nLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIDEpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKCdpbiBGb3JtLkZpbGxOYW1lKCkgb3V0IG9mIGJvdW5kcycpO1xyXG4gIH1cclxuXHJcblxyXG4gIGFic3RyYWN0IGJ1aWxkRm9ybU5hbWUoKTogc3RyaW5nO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdHJ1ZSBmb3IgbWRpIGNoaWxkIGFuZCBmaXQgdG8gbWRpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ3aW5kb3dUeXBlXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjcmVhdGVGb3JtKCk6IHZvaWQge1xyXG4gICAgbGV0IGlucHV0Q29udHJvbHMgPSB0aGlzLkdldExpc3RPZklucHV0Q29udHJvbHMoKTtcclxuICAgIGxldCBmb3JtTmFtZTogc3RyaW5nID0gdGhpcy5idWlsZEZvcm1OYW1lKCk7XHJcbiAgICBpZiAoIXRoaXMuaXNTdWJGb3JtKCkpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlbkZvcm0odGhpcywgZm9ybU5hbWUsICcwJywgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza1RhZygpLCBpbnB1dENvbnRyb2xzLCB0aGlzLmlzRGlhbG9nKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlbnN1YmZvcm0oQ29tbWFuZFR5cGUuQ1JFQVRFX1NVQl9GT1JNLCB0aGlzLmdldFN1YkZvcm1DdHJsKCksIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgKDxNZ0NvbnRyb2xCYXNlPnRoaXMuZ2V0U3ViRm9ybUN0cmwoKSkuZ2V0TmFtZSgpLFxyXG4gICAgICAgIGZvcm1OYW1lLCBpbnB1dENvbnRyb2xzLCB0aGlzLmdldFRhc2soKS5Sb3V0ZXJQYXRoLCB0aGlzLmdldFRhc2soKS5HZXRSb3V0ZXJQYXJhbXMoKSwgdGhpcy5nZXRUYXNrKCkuSW5EZWZhdWx0Um91dGVyT3V0bGV0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWZhdWx0IGNyZWF0ZSBvbmUgcm93IGluIHRhYmxlIGNvbnRyb2wuIERPTidUIHNldCBpdGVtcyBjb3VudCBkdXJpbmcgZm9ybSBvcGVuLlxyXG4gICAgLy8gZmlyc3RUYWJsZVJlZnJlc2goKSB3aWxsIGNyZWF0ZSB0aGUgYWN0dWFsIHJvd3MsIGFuZCByZWZyZXNoIHRoZSB0YWJsZS5cclxuICAgIGlmICh0aGlzLkhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbCgpO1xyXG5cclxuICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBhZGQgdGhlIGNhbGwganMgY29tbWFuZCBhbmQgZ2V0IHRoZSByZXR1cm4gdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgQ2FsbEpTKG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogQXJyYXk8YW55Pik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gQ29tbWFuZHMuYWRkQ2FsbEpTKHRoaXMsIHRoaXMuVW5pcXVlTmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgZm9ybSBoYXMgYXV0b21hdGljIHRhYmJpbmcgb3JkZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNBdXRvbWF0aWNUYWJiaW5nT3JkZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfT1JERVIpLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCkgPT09IFRhYmJpbmdPcmRlclR5cGUuQXV0b21hdGljYWxseTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cnVlIGlmIHdlIGNhbiByZWZyZXNoIHJlcGVhdGFibGUgY29udHJvbHNcclxuICAvLy8gICBRQ1IgIzQzNDY0OSwgd2UgcHJldmVudCBwYWludGluZyB0YWJsZSdzIGNvbnRyb2wgdW50aWxsIHNoZWxsIGlzIG9wZW5lZCBhbmQgd2Uga25vdyBob3cgbWFueSByb3dzIHRvIHBhaW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybSBpcyBzY3JlZW4gbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTY3JlZW5Nb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmlzTGluZU1vZGUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGZvcm0gaXMgbGluZSBtb2RlXHJcbiAgLy8vICAgaWYgd2UgaGF2ZSBhIHRyZWUgb3IgYSB0YWJsZSBvbiB0aGUgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNMaW5lTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldE1haW5Db250cm9sKCkgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGFzayBoYXMgdGFibGUgb3IgdHJlZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBoYXNUYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiBmb3JtIHNob3VsZCBiZSBvcGVuZWQgYXMgbW9kYWwgd2luZG93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRGlhbG9nKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgd2luZG93VHlwZTogV2luZG93VHlwZSA9IHRoaXMuQ29uY3JldGVXaW5kb3dUeXBlO1xyXG4gICAgaWYgKHdpbmRvd1R5cGUgPT09IFdpbmRvd1R5cGUuT3ZlcmxheSlcclxuICAgICAgaXNEaWFsb2cgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoTWdGb3JtQmFzZS5TaG91bGRCZWhhdmVBc01vZGFsKCkpXHJcbiAgICAgIGlzRGlhbG9nID0gdHJ1ZTtcclxuICAgIHJldHVybiBpc0RpYWxvZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuPC9yZXR1cm5zPlxyXG4gIGlzU3ViRm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJGb3JtQ3RybCAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBmb3JtIGlzIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEhhc1RhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgdG9wTW9zdEZvcm06IE1nRm9ybUJhc2UgPSB0aGlzO1xyXG5cclxuICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBzdWIgZm9ybSBjb250cm9sXHJcbiAgICB3aGlsZSAodG9wTW9zdEZvcm0uaXNTdWJGb3JtKCkgJiYgdG9wTW9zdEZvcm0uUGFyZW50Rm9ybSAhPT0gbnVsbClcclxuICAgICAgdG9wTW9zdEZvcm0gPSB0b3BNb3N0Rm9ybS5QYXJlbnRGb3JtO1xyXG5cclxuICAgIHJldHVybiB0b3BNb3N0Rm9ybTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB0b3Btb3N0IGZyYW1lIGZvcm0gZm9yIG1lbnUgcmVmcmVzaC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRvcE1vc3RGcmFtZUZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgdG9wTW9zdEZvcm06IE1nRm9ybUJhc2UgPSB0aGlzO1xyXG5cclxuICAgIHdoaWxlICh0b3BNb3N0Rm9ybSAhPT0gbnVsbClcclxuICAgICAgdG9wTW9zdEZvcm0gPSAoKHRvcE1vc3RGb3JtLlBhcmVudEZvcm0gIT09IG51bGwpID8gdG9wTW9zdEZvcm0uUGFyZW50Rm9ybSA6IG51bGwpO1xyXG5cclxuICAgIHJldHVybiB0b3BNb3N0Rm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHRvcG1vc3QgbWdmb3JtIG9mIHRoZSBzdWJmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRTdWJGb3JtQ3RybCgpOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJGb3JtQ3RybDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIGZvcm0gbWFwcGluZyBpbiBjb250cm9sJ3MgbWFwXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsSWR4XCI+dGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgZ2V0Q3RybChjdHJsSWR4OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0Q3RybChjdHJsSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5SZXR1cm5zIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgR2V0Q3RybChjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldEN0cmwoY3RybE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWZhdWx0Um91dGVyT3V0bGV0OiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IERlZmF1bHRSb3V0ZXJPdXRsZXQoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBpZiAodGhpcy5kZWZhdWx0Um91dGVyT3V0bGV0ID09IG51bGwpIHtcclxuICAgICAgdGhpcy5kZWZhdWx0Um91dGVyT3V0bGV0ID0gdGhpcy5DdHJsVGFiLkdldENvbnRyb2woKHg6IE1nQ29udHJvbEJhc2UpID0+IHtcclxuICAgICAgICByZXR1cm4geC5Jc0RlZmF1bHRSb3V0ZXJPdXRsZXQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJvdXRlck91dGxldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXRDaG9pY2VDb250cm9sSXRlbUxpc3QobWdDb250cm9sOiBNZ0NvbnRyb2xCYXNlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIERlYnVnLkFzc2VydChtZ0NvbnRyb2wuaXNDaG9pY2VDb250cm9sKCkpO1xyXG5cclxuICAgIGxldCBpdGVtczogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3QoKTtcclxuICAgIGxldCBmbGQ6IEd1aUZpZWxkQmFzZSA9IG1nQ29udHJvbC5nZXRGaWVsZCgpO1xyXG4gICAgbGV0IHN0b3JhZ2VBdHRyaWJ1dGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgaWYgKHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSAmJiBzdG9yYWdlQXR0cmlidXRlICE9PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgaWYgKG1nQ29udHJvbC5pc1JhZGlvKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmxkLkdldFJhZGlvQ3RybHMoKS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHJhZGlvQ29udHJvbDogTWdDb250cm9sQmFzZSA9IGZsZC5HZXRSYWRpb0N0cmxzKCkuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCByYWRpb0NvbnRyb2wuR2V0SXRlbXNSYW5nZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbXMuQWRkUmFuZ2UoYXdhaXQgbWdDb250cm9sLkdldEl0ZW1zUmFuZ2UoKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE1nRm9ybUJhc2UuQ29udmVydEFycmF5TGlzdFRvU3RyaW5nKGl0ZW1zLCBzdG9yYWdlQXR0cmlidXRlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGl0ZW1zIGxpc3Qgb2YgY2hvaWNlIGNvbnRyb2xzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdDb250cm9sXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXRDaG9pY2VDb250cm9sRGlzcGxheUxpc3QobWdDb250cm9sOiBNZ0NvbnRyb2xCYXNlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIERlYnVnLkFzc2VydChtZ0NvbnRyb2wuaXNDaG9pY2VDb250cm9sKCkpO1xyXG5cclxuICAgIGxldCBpdGVtczogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3QoKTtcclxuICAgIGxldCBmbGQ6IEd1aUZpZWxkQmFzZSA9IG1nQ29udHJvbC5nZXRGaWVsZCgpO1xyXG4gICAgbGV0IHN0b3JhZ2VBdHRyaWJ1dGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgaWYgKHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSAmJiBzdG9yYWdlQXR0cmlidXRlICE9PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgaWYgKG1nQ29udHJvbC5pc1JhZGlvKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmxkLkdldFJhZGlvQ3RybHMoKS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHJhZGlvQ29udHJvbDogTWdDb250cm9sQmFzZSA9IGZsZC5HZXRSYWRpb0N0cmxzKCkuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCByYWRpb0NvbnRyb2wuR2V0RGlzcGxheVJhbmdlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCBtZ0NvbnRyb2wuR2V0SXRlbXNSYW5nZSgpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gTWdGb3JtQmFzZS5Db252ZXJ0QXJyYXlMaXN0VG9TdHJpbmcoaXRlbXMsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5FbXB0eTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGhlIGNvbW1hIGNvbmNhdGVuYXRlZCBzdHJpbmcgZnJvbSBhcnJheSBsaXN0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRlbXNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzSXRlbU51bVR5cGVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbnRyb2xDb2x1bW4oY3RybDogTWdDb250cm9sQmFzZSk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgbGV0IGNvbHVtbjogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKChjdHJsLklzUmVwZWF0YWJsZSB8fCBjdHJsLklzVGFibGVIZWFkZXJDaGlsZCkgJiYgdGhpcy5fdGFibGVDb2x1bW5zICE9PSBudWxsKVxyXG4gICAgICBjb2x1bW4gPSB0aGlzLl90YWJsZUNvbHVtbnMuZ2V0X0l0ZW0oY3RybC5nZXRMYXllcigpIC0gMSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbjtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGNvbnRhaW5lciBjb250cm9sPC9yZXR1cm5zPlxyXG4gIGdldENvbnRhaW5lckN0cmwoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gY29udHJvbCdzIGNvbHVtblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDb2x1bW5Db250cm9scygpOiBMaXN0PE1nQ29udHJvbEJhc2U+IHtcclxuICAgIGxldCBjb2x1bW5Db250cm9sc0xpc3Q6IExpc3Q8TWdDb250cm9sQmFzZT4gPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLkN0cmxUYWIgIT09IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OKSB7XHJcbiAgICAgICAgICBpZiAoY29sdW1uQ29udHJvbHNMaXN0ID09PSBudWxsKVxyXG4gICAgICAgICAgICBjb2x1bW5Db250cm9sc0xpc3QgPSBuZXcgTGlzdDxNZ0NvbnRyb2xCYXNlPigpO1xyXG4gICAgICAgICAgY29sdW1uQ29udHJvbHNMaXN0LnB1c2goY3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29sdW1uQ29udHJvbHNMaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrKCk6IEd1aVRhc2tCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl90YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgY29udmVydHMgZnJvbSBkb3VibGUgcGl4ZWxzIHRvIHVvbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGl4VmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1hheGlzXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUYWJsZUN0cmwoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVNZ0NvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWZ0ZXIgb3BlbiB0aGUgZm9ybSBuZWVkIHRvIG1vdmUgaXQgYWNjb3JkaW5nIHRvIHRoZSBzdGFydHVwIHBvc2l0aW9uIHByb3BlcnR5IG9uIHRoZSBmb3JtXHJcbiAgLy8vICAgUFJPUF9UWVBFX1NUQVJUVVBfUE9TSVRJT05cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRNYWluQ29udHJvbCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU1nQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxCeU5hbWUoY3RybE5hbWU6IHN0cmluZywgY3RybFR5cGU6IE1nQ29udHJvbFR5cGUpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0Q3RybEJ5TmFtZShjdHJsTmFtZSwgY3RybFR5cGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gUG9pbnQgLGNlbnRlciB0byB0aGUgZ2l2aW5nIHJlbGF0aXZlUmVjdFxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgY2hlY2tBbmRDcmVhdGVSb3coaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiAhdGhpcy5pc1Jvd0NyZWF0ZWQoaWR4KSlcclxuICAgICAgdGhpcy5jcmVhdGVSb3coaWR4KTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZHhcIj48L3BhcmFtPlxyXG4gIElzVmFsaWRSb3coaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCB2YWxpZFJvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiBpZHggPj0gMCAmJiBpZHggPCB0aGlzLlJvd3MubGVuZ3RoKSB7XHJcbiAgICAgIGxldCByb3c6IFJvdyA9IHRoaXMuUm93cy5nZXRfSXRlbShpZHgpO1xyXG4gICAgICB2YWxpZFJvdyA9IChyb3cgIT09IG51bGwgJiYgcm93LlZhbGlkYXRlZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWRSb3c7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRyZWUgb3IgdGFibGUgY29udHJvbCBvZiB0aGUgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaFByb3BzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHMpIHtcclxuICAgICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0JBUik7XHJcblxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5fcHJvcFRhYi5SZWZyZXNoRGlzcGxheShmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLl9maXJzdFJlZnJlc2hPZlByb3BzKVxyXG4gICAgICB0aGlzLl9maXJzdFJlZnJlc2hPZlByb3BzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBjb250cm9sICh3aGljaCBpcyBub3QgdGhlIGZyYW1lIGZvcm0pIHdpdGggYSBnaXZlbiBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+dGhlIG9mIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFR5cGVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlcGVhdGFibGVPbmx5XCI+c2hvdWxkIGJlIHRydWUgaW4gb3JkZXIgdG8gcmVmcmVzaCBvbmx5IHRoZSBjb250cm9scyB0aGF0IGJlbG9uZyB0byBhIHRhYmxlPC9wYXJhbT5cclxuICBhc3luYyByZWZyZXNoQ29udHJvbHMocmVwZWF0YWJsZU9ubHk6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlO1xyXG4gICAgLy8gcmVjb3JkIGRvZXMgbm90IGV4aXN0XHJcbiAgICBpZiAodGhpcy5EaXNwbGF5TGluZSA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyByZWZyZXNoIHRoZSB0YWJsZSBmaXJzdFxyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICFyZXBlYXRhYmxlT25seSlcclxuICAgICAgYXdhaXQgdGhpcy5fdGFibGVNZ0NvbnRyb2wuUmVmcmVzaERpc3BsYXkoKTtcclxuXHJcbiAgICAvLyByZWZyZXNoIGFsbCBDT0xVTU5TIChyZWZyZXNoIGZvciBlYWNoIGNvbnRyb2wgYmFzZSBvbiB0aGUgcmVmcmVzaCBvZiB0aGUgY29sdW1uIChlLmc6Y29sdW1uIHdpZHRoKVxyXG4gICAgLy8gc28gd2UgbXVzdCByZWZyZXNoIHRoZSBjb2x1bW4gZmlyc3RcclxuICAgIGlmICh0aGlzLl90YWJsZUNvbHVtbnMgIT09IG51bGwgJiYgIXJlcGVhdGFibGVPbmx5KSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl90YWJsZUNvbHVtbnMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgbWdDb250cm9sQmFzZTogTWdDb250cm9sQmFzZSA9IHRoaXMuX3RhYmxlQ29sdW1ucy5nZXRfSXRlbShpKTtcclxuICAgICAgICBhd2FpdCBtZ0NvbnRyb2xCYXNlLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNoZWNrQW5kQ3JlYXRlUm93KHRoaXMuRGlzcGxheUxpbmUpO1xyXG5cclxuICAgIC8vIFFDUiAjNzA5NTYzIE11c3QgcmVmcmVzaCBmcmFtZXNldCdzIHN1YmZyb21zIGJlZm9yZSB3ZSByZWZyZXNoIGZyYW1lc2V0IGl0c2VsZi5cclxuICAgIC8vIER1cmluZyByZWZyZXNoIG9mIHRoZSBmcmFtZXNldCBuZXN0ZWQgc3ViZm9ybXMgd2l0aCBSZWZyZXNoV2hlbkhpZGRlbiBtaWdodCBiZSBicm91Z2h0IHRvIHNlcnZlclxyXG4gICAgLy8gYnV0IHRoZWlyIHN1YmZvcm0ncyBjb250cm9scyBoYXZlIG5vdCBiZWVuIHNldCB3aXRoIGNvcnJlY3QgYm91bmRzLiBUaGlzIGNhdXNlcyBpbGxlZ2FsIHBsYWNlbWVudFxyXG4gICAgLy8gYW5kIGluY29ycmVjdCBmaW5hbCBsb2NhdGlvbiBvZiBjb250cm9scyBvbiBuZXN0ZWQgc3ViZm9ybXNcclxuICAgIGxldCB0YWJBbmRHcm91cENvbnRyb2xzOiBTdGFjazxNZ0NvbnRyb2xCYXNlPiA9IG5ldyBTdGFjazxNZ0NvbnRyb2xCYXNlPigpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgY3RybCA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICBpZiAoKGN0cmwuaXNUYWJDb250cm9sKCkgfHwgY3RybC5pc0dyb3VwKCkpICYmICFyZXBlYXRhYmxlT25seSkge1xyXG4gICAgICAgIHRhYkFuZEdyb3VwQ29udHJvbHMucHVzaChjdHJsKTtcclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFICYmIGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OKSB7XHJcbiAgICAgICAgaWYgKGN0cmwuSXNSZXBlYXRhYmxlIHx8ICFyZXBlYXRhYmxlT25seSlcclxuICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgfSBlbHNlIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFICYmIHJlcGVhdGFibGVPbmx5KVxyXG4gICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkocmVwZWF0YWJsZU9ubHkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBtYXJrUm93Tk9UQ3JlYXRlZChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5VTkRPX0NSRUFURV9UQUJMRV9ST1csIHRoaXMuX3RhYmxlTWdDb250cm9sLCBpZHgpO1xyXG5cclxuICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCB0aGlzLlJvd3MubGVuZ3RoKVxyXG4gICAgICB0aGlzLlJvd3Muc2V0X0l0ZW0oaWR4LCBuZXcgUm93KGZhbHNlLCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcbiAgU2VsZWN0Um93KCk6IHZvaWQ7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpZiByb3cgaXMgbm90IGNyZWF0ZWQgeWV0IGNyZWF0ZXMgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgU2VsZWN0Um93KHNlbmRBbHdheXM6IGJvb2xlYW4pOiB2b2lkO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbWFya3Mgcm93IGNyZWF0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBTZWxlY3RSb3cocm93SWR4OiBudW1iZXIsIHNlbmRBbHdheXM6IGJvb2xlYW4pOiB2b2lkO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgU2VsZWN0Um93KHNlbmRBbHdheXNPclJvd0lkeD86IGFueSwgc2VuZEFsd2F5cz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxyXG4gICAgICB0aGlzLlNlbGVjdFJvd18wKCk7XHJcblxyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5TZWxlY3RSb3dfMShzZW5kQWx3YXlzT3JSb3dJZHgpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5TZWxlY3RSb3dfMihzZW5kQWx3YXlzT3JSb3dJZHgsIHNlbmRBbHdheXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PihwdWJsaWMpXHJcbiAgLy8vIGNoZWNrIGlmIHNwZWNpZmllZCByb3cgaXMgdmFsaWQgcm93IGluIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgY29udHJvbHMgb2YgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpbnQgaXMgdGhlIHRhYmxlIHNpemU8L3JldHVybnM+XHJcbiAgZ2V0Um93c0luUGFnZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NJblBhZ2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IGludCBpcyB0aGUgdGFibGUgc2l6ZTwvcmV0dXJucz5cclxuICBnZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heFJvd3NJblBhZ2luYXRlZFRhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBSb3cgaXMgY3JlYXRlZCBvbiBHVUkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzaXplXCI+dGhlIHRhYmxlIHNpemU8L3BhcmFtPlxyXG4gIHNldFJvd3NJblBhZ2Uoc2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yb3dzSW5QYWdlID0gc2l6ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtYXJrcyB0aGlzIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29sdW1uc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgY29sdW1uc0NvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLkN0cmxUYWIgIT09IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OKVxyXG4gICAgICAgICAgY29sdW1uc0NvdW50ID0gY29sdW1uc0NvdW50ICsgMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW5zQ291bnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpblJlZnJlc2hEaXNwbGF5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVmcmVzaERpc3A7XHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZShuZXdUaXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5zZXRUaXRsZSh0aGlzLCBuZXdUaXRsZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBcImluIHJlZnJlc2ggZGlzcGxheVwiIGZsYWdcclxuXHJcbiAgZ2V0Q29udHJvbElkeChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0Q29udHJvbElkeChjdHJsLCB0cnVlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRXhlY3V0ZSB0aGUgbGF5b3V0IGFuZCBhbGwgaXRzIGNoaWxkcmVuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VG9wSW5kZXhGcm9tR1VJKCk6IG51bWJlciB7XHJcbiAgICBsZXQgdG9wRGlzcGxheUxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5oYXNUYWJsZSgpKVxyXG4gICAgICB0b3BEaXNwbGF5TGluZSA9IENvbW1hbmRzLmdldFRvcEluZGV4KHRoaXMuZ2V0TWFpbkNvbnRyb2woKSk7XHJcbiAgICByZXR1cm4gdG9wRGlzcGxheUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIFRSVUUgaWYgdGhpcyBncm91cCBpcyB0aGUgbGFzdCBncm91cCBpbiB0aGUgdG9vbGJhclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJncm91cE51bWJlclwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGFibGUgaXRlbXMgY291bnQ8L3JldHVybnM+XHJcbiAgZ2V0VGFibGVJdGVtc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJdGVtc0NvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUYWJsZSBjb250cm9sIGlzIGFsd2F5cyBmaXJzdCBvbiB0aGUgZm9ybVxyXG4gIC8vLyBXaGVuIHRhYmxlIGlzIGEgY2hpbGQgb2YgdGFiLCBpdCBpcyBjcmVhdGVkIGJlZm9yZSB0YWIncyBsYXllcnMoVGFiUGFnZXMpIGFyZSBjcmVhdGVkLlxyXG4gIC8vLyBDb21wdXRpbmcgVGFiJ3MgY2hpbGRyZW4gY29vcmRpbmF0ZXMgZGVwZW5kcyBvbiB0aGUgVGFiUGFnZXMgYmVpbmcgY3JlYXRlZFxyXG4gIC8vLyBTbywgd2UgbXVzdCBmaXggdGFibGUncyBsb2NhdGlvbiBhZnRlciBUYWIgaXMgY3JlYXRlZFxyXG4gIC8vLyBRQ1IgIzI4OTk2NlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZnNUb0N0cmxzKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKS5yZW1vdmVSZWZGcm9tRmllbGQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdGhpcyBmb3JtIG1heSBoYXZlIEFjdGl2ZVJvd0hpZ2h0bGlnaHRTdGF0ZVxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkVGFibGVDaGlsZHJlbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZUNoaWxkcmVuID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3RhYmxlQ2hpbGRyZW4gPSBuZXcgTGlzdDxNZ0NvbnRyb2xCYXNlPigpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuQ3RybFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBtaW5UYWJPcmRlcjogbnVtYmVyID0gMjE0NzQ4MzY0NztcclxuICAgICAgICBsZXQgYXV0b21hdGljVGFiYmluZ09yZGVyOiBib29sZWFuID0gdGhpcy5pc0F1dG9tYXRpY1RhYmJpbmdPcmRlcigpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG5cclxuICAgICAgICAgIGlmIChjdHJsLklzUmVwZWF0YWJsZSB8fCBjdHJsLklzVGFibGVIZWFkZXJDaGlsZCkge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNoaWxkcmVuLnB1c2goY3RybCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXV0b21hdGljVGFiYmluZ09yZGVyKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gY3RybC5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9PUkRFUik7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVJbnQ6IG51bWJlciA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA8IG1pblRhYk9yZGVyKVxyXG4gICAgICAgICAgICAgICAgICBtaW5UYWJPcmRlciA9IHZhbHVlSW50O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1pblRhYk9yZGVyICE9PSBJbnQzMi5NYXhWYWx1ZSAmJiBhdXRvbWF0aWNUYWJiaW5nT3JkZXIpIHtcclxuICAgICAgICAgIHRoaXMuX2ZpcnN0VGFibGVUYWJPcmRlciA9IG1pblRhYk9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcHJldiBncm91cCBpbmRleCBpZiBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyR3JvdXBcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhYmxlQ3RybFwiPnRoZSB0YWJsZUN0cmwgdG8gc2V0PC9wYXJhbT5cclxuICBzZXRUYWJsZUN0cmwodGFibGVDdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YWJsZU1nQ29udHJvbCA9IHRhYmxlQ3RybDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuXHJcbiAgZ2V0Q3RybENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldFNpemUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbHNDb3VudEV4Y2x1ZGluZ1N0YXR1c0JhcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoUHJvcHNPbkV4cHJlc3Npb24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9ICh0aGlzLl9wcm9wVGFiID09IG51bGwgPyAwIDogdGhpcy5fcHJvcFRhYi5nZXRTaXplKCkpO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IHJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplICYmICFyZWZyZXNoOyBpKyspIHtcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcChpKTtcclxuICAgICAgaWYgKHByb3AuaXNFeHByZXNzaW9uKCkpIHtcclxuICAgICAgICByZWZyZXNoID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hQcm9wcygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRhYkNvbnRyb2woY3RybDogTWdDb250cm9sQmFzZSk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgbGV0IG9iajogT2JqZWN0O1xyXG4gICAgbGV0IHJlc3VsdDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gICAgb2JqID0gY3RybDtcclxuICAgIHdoaWxlIChvYmogaW5zdGFuY2VvZiBNZ0NvbnRyb2xCYXNlKSB7XHJcbiAgICAgIGxldCBjdXJyQ3RybCA9IDxNZ0NvbnRyb2xCYXNlPm9iajtcclxuICAgICAgaWYgKGN1cnJDdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gY3VyckN0cmw7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgb2JqID0gY3VyckN0cmwuZ2V0UGFyZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgY3RybCBpcyBub3QgdGFiIGFuZCBub3QgdGFiJ3MgY2hpbGQgLSBmaW5kIGZpcnN0IHRhYiBpbiB0aGUgZm9ybVxyXG4gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBvYmogPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoKDxNZ0NvbnRyb2xCYXNlPm9iaikuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IDxNZ0NvbnRyb2xCYXNlPm9iajtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGNvbnRyb2xzIG9mIHRoaXMgZm9ybVxyXG5cclxuICBJc0lucHV0VHlwZShjdHJsOiBNZ0NvbnRyb2xCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBzd2l0Y2ggKGN0cmwuVHlwZSkge1xyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQ6XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09NQk86XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVDpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTzpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIGxpc3Qgb2YgdGFibGUgY2hpbGRyZW5cclxuXHJcbiAgcHVibGljIEdldExpc3RPZklucHV0Q29udHJvbHMoKTogYW55IHtcclxuICAgIGxldCBmaWx0ZXJ0ZXJMaXN0ID0gdGhpcy5DdHJsVGFiLmZpbHRlcigoKGMpID0+IHRoaXMuSXNJbnB1dFR5cGUoYykpKTtcclxuICAgIGxldCBuYW1lcyA9IGZpbHRlcnRlckxpc3QucmVkdWNlKChwcmUsIGN0cmwpID0+IHtcclxuICAgICAgcHJlW2N0cmwuVW5pcXVlTmFtZV0gPSBjdHJsLklzUmVwZWF0YWJsZSA/ICcxJyA6ICcwJztcclxuICAgICAgcmV0dXJuIHByZTtcclxuICAgIH0sIHt9KTtcclxuICAgIHJldHVybiBuYW1lcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFic3RyYWN0IENvbnN0cnVjdE1nQ29udHJvbCgpOiBNZ0NvbnRyb2xCYXNlO1xyXG5cclxuICAvLyBnZXRHdWlUYWJsZUNoaWxkcmVuKCk6IExpc3Q8R3VpTWdDb250cm9sPiB7XHJcbiAgLy8gICBsZXQgZmxhZzogYm9vbGVhbiA9IHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW4gPT09IG51bGw7XHJcbiAgLy8gICBpZiAoZmxhZykge1xyXG4gIC8vICAgICB0aGlzLl9ndWlUYWJsZUNoaWxkcmVuID0gbmV3IExpc3Q8R3VpTWdDb250cm9sPigpO1xyXG4gIC8vICAgICBsZXQgdGFibGVDaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuVGFibGVDaGlsZHJlbjtcclxuICAvLyAgICAgbGV0IGVudW1lcmF0b3I6IExpc3RfRW51bWVyYXRvcjxNZ0NvbnRyb2xCYXNlPiA9IHRhYmxlQ2hpbGRyZW4uR2V0RW51bWVyYXRvcigpO1xyXG4gIC8vICAgICB0cnkge1xyXG4gIC8vICAgICAgIHdoaWxlIChlbnVtZXJhdG9yLk1vdmVOZXh0KCkpIHtcclxuICAvLyAgICAgICAgIGxldCBjdXJyZW50OiBNZ0NvbnRyb2xCYXNlID0gZW51bWVyYXRvci5DdXJyZW50O1xyXG4gIC8vICAgICAgICAgdGhpcy5fZ3VpVGFibGVDaGlsZHJlbi5BZGQoY3VycmVudCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGZpbmFsbHkge1xyXG4gIC8vICAgICAgICg8SURpc3Bvc2FibGU+ZW51bWVyYXRvcikuRGlzcG9zZSgpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdGhpcy5fZ3VpVGFibGVDaGlsZHJlbjtcclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXRzIHRoZSB0YWJsZSBjb250cm9sIHJlbGF0ZWQgdG8gdGhpcyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWZyZXNoIGZvcm0gZGlzcGxheSBpZiBpdCBoYXMgYSBwcm9wZXJ0eSB3aGljaCBpcyBhbiBleHByZXNzaW9uXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlyc3RUYWJsZVJlZnJlc2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcm93c0luUGFnZSA9IENvbW1hbmRzLmdldFJvd3NJblBhZ2UodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgICB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gcGFyYW1ldGVyIHNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZHZzaXplXCI+bmV3IGR2c2l6ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YWJsZUl0ZW1zQ291bnRcIj5uZXcgdGFibGVJdGVtc0NvdW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlbW92ZUFsbFwiPnJlbW92ZSBhbGwgZWxlbWVudHMgZm9ybSB0aGUgdGFibGUgaW5jbHVkaW5nIGZpcnN0IGFuZCBsYXN0IGR1bW15IGVsZW1lbnRzPC9wYXJhbT5cclxuICBTZXRUYWJsZUl0ZW1zQ291bnQoZHZzaXplOiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWRcclxuICBTZXRUYWJsZUl0ZW1zQ291bnQoZHZzaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudDogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIFNldFRhYmxlSXRlbXNDb3VudChkdnNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50T3JSZW1vdmVBbGw6IGFueSwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgIGlmICh0eXBlb2YgdGFibGVJdGVtc0NvdW50T3JSZW1vdmVBbGwgPT0gJ2Jvb2xlYW4nKXtcclxuICAgICAgdGhpcy5TZXRUYWJsZUl0ZW1zQ291bnRfMChkdnNpemUsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsKTtcclxuICAgIH0gZWxzZVxyXG4gICAgICB0aGlzLlNldFRhYmxlSXRlbXNDb3VudF8xKGR2c2l6ZSwgdGFibGVJdGVtc0NvdW50T3JSZW1vdmVBbGwsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFNldFRhYmxlSXRlbXNDb3VudF8wKGR2c2l6ZTogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuU2V0VGFibGVJdGVtc0NvdW50XzEoZHZzaXplLCBkdnNpemUsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFNldFRhYmxlSXRlbXNDb3VudF8xKGR2c2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2woZHZzaXplLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRzIHRoZSB0YWJsZSBjb250cm9sXHJcbiAgLy8vIHVwZGF0ZSB0YWJsZSBpdGVtJ3MgY291bnQgYWNjb3JkaW5nIHRvIHBhcmFtZXRlciBkdnNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXRUYWJsZUNvbnRyb2woKTogdm9pZDtcclxuICBJbml0VGFibGVDb250cm9sKGR2U2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZDtcclxuICBJbml0VGFibGVDb250cm9sKGR2U2l6ZT86IG51bWJlciwgdGFibGVJdGVtc0NvdW50PzogbnVtYmVyLCByZW1vdmVBbGw/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2xfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2xfMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhcnJheXMgb2YgdGFibGUgY2hpbGRyZW4gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNpemVcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZVRhYmxlQ2hpbGRyZW5BcnJheXNTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gdGhpcy5UYWJsZUNoaWxkcmVuO1xyXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBjaGlsZHJlbi5nZXRfSXRlbShpKTtcclxuICAgICAgICBjb250cm9sLnVwZGF0ZUFycmF5cyhzaXplKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgIHRoaXMuX3RhYmxlTWdDb250cm9sLnVwZGF0ZUFycmF5cyhzaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIHRhYiBjb250cm9sIGZvciBwZXJmb3JtaW5nIENUUkwrVEFCICYmIENUUkwrU0hJRlQrVEFCIGFjdGlvbnNcclxuICAvLy8gICB0aGUgY29kZSBvcmlnaW5hbCBpcyBpbiBSVDo6c2tpcF90b190YWJfY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y3VycmVudCBjb250cm9sPC9wYXJhbT5cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAne0d1aU1nRm9ybScgKyAnOiBJZD0nICsgdGhpcy5fdXNlclN0YXRlSWQgKyAnfSc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEluY2x1ZGVDb250cm9sSW5UYWJiaW5nT3JkZXIoY29udHJvbDogTWdDb250cm9sQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjb250cm9sLlByb3BlcnR5RXhpc3RzKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9PUkRFUikpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgR2V0SGFzaENvZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5Gb3JtSXNuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGlmIChNZ0Zvcm1CYXNlLklzRm9ybVRhZyhmb3VuZFRhZ05hbWUpKVxyXG4gICAgICB0aGlzLmZpbGxOYW1lKGZvdW5kVGFnTmFtZSk7XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUClcclxuICAgICAgdGhpcy5fcHJvcFRhYi5maWxsRGF0YSh0aGlzLCAnRicsIHBhcnNlcik7XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICB0aGlzLkN0cmxUYWIuZmlsbERhdGEodGhpcywgcGFyc2VyKTtcclxuICAgICAgLy90aGlzLmluaXRDb250ZXh0UHJvcEZvckNvbnRyb2xzKCk7XHJcbiAgICAgIGlmICghdGhpcy5IYXNUYWJsZSgpKVxyXG4gICAgICAgIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoTWdGb3JtQmFzZS5Jc0VuZEZvcm1UYWcoZm91bmRUYWdOYW1lKSkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbnN0cnVjdHMgYW4gb2JqZWN0IG9mIE1nQ29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50Q29udHJvbFwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHVibGljIGlzUm93Q3JlYXRlZChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuUm93cy5sZW5ndGggPD0gaWR4IHx8IGlkeCA8IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByb3c6IFJvdyA9IHRoaXMuUm93cy5nZXRfSXRlbShpZHgpO1xyXG4gICAgaWYgKHJvdyA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiByb3cuQ3JlYXRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYnVpbGRMaW5rZWRDb250cm9sc0xpc3RzKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICBsZXQgbGlua2VkUGFyZW50OiBNZ0NvbnRyb2xCYXNlID0gPE1nQ29udHJvbEJhc2U+Y3RybC5nZXRMaW5rZWRQYXJlbnQoZmFsc2UpO1xyXG4gICAgICBpZiAobGlua2VkUGFyZW50ICE9PSBudWxsKVxyXG4gICAgICAgIGxpbmtlZFBhcmVudC5saW5rQ3RybChjdHJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgbGlzdCBvZiBhbGwgY29sdW1ucyBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBidWlsZFRhYmxlQ29sdW1uc0xpc3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdGFibGVDb2x1bW5zID0gbmV3IExpc3Q8TWdDb250cm9sQmFzZT4oKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OKVxyXG4gICAgICAgICAgdGhpcy5fdGFibGVDb2x1bW5zLnB1c2goY29udHJvbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhcnJheXMgb2YgdGFibGUgY2hpbGRyZW4gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjcmVhdGVSb3coaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuQ1JFQVRFX1RBQkxFX1JPVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGlkeCk7XHJcblxyXG4gICAgaWYgKHRoaXMuUm93cy5sZW5ndGggPD0gaWR4KVxyXG4gICAgICB0aGlzLlJvd3MuU2V0U2l6ZShpZHggKyAxKTtcclxuXHJcbiAgICB0aGlzLlJvd3Muc2V0X0l0ZW0oaWR4LCBuZXcgUm93KHRydWUsIHRydWUpKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIFNlbGVjdFJvd18wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5TZWxlY3RSb3coZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGFwcHJvcHJpYXRlIHdpbmRvdyB0eXBlIGZvciBhIERlZmF1bHQgd2luZG93IHR5cGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ3aW5kb3dUeXBlXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIFNlbGVjdFJvd18xKHNlbmRBbHdheXM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuU2VsZWN0Um93KHRoaXMuRGlzcGxheUxpbmUsIHNlbmRBbHdheXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3Igb25saW5lIHdlIG5lZWQgdG8gcGl0ICdBQ1RfSElUJyB3aGVuIHRoZSBmb3JtIHdhcyBjbG9zZWQgZnJvbSBzeXN0ZW0gbWVudVxyXG4gIC8vLyBpZiB0aGUgdGFzayBoYXMgb25seSBzdWJmb3JtIGNvbnRyb2wgb24gaXQuXHJcbiAgLy8vIEZvciBSQyBhbHdheXMgcmV0dXJuIGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWx3YXlzXCI+c2VuZCBzZWxlY3Rpb24gY29tbWFuZCBkZXBlbmRpbmcgb24gcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgU2VsZWN0Um93XzIocm93SWR4OiBudW1iZXIsIHNlbmRBbHdheXM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIC8vIGNvbnRyb2xGb3JTZWxlY3QgY2FuIGJlIHRhYmxlIGNvbnRyb2wgb3IgdHJlZSBjb250cm9sXHJcbiAgICBsZXQgbWFpbkNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLmdldE1haW5Db250cm9sKCk7XHJcblxyXG4gICAgaWYgKG1haW5Db250cm9sICE9PSBudWxsICYmIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKSB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gcm93SWR4O1xyXG4gICAgICBpZiAodGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICBpbmRleCA9IEd1aUNvbnN0YW50cy5OT19ST1dfU0VMRUNURUQ7XHJcblxyXG4gICAgICBpZiAoc2VuZEFsd2F5cyB8fCBpbmRleCAhPT0gdGhpcy5fcHJldlNlbEluZGV4KSB7XHJcbiAgICAgICAgLy8gZm9yIHRyZWUgY29udHJvbCB3ZSBhbHdheXMgc2VuZCBzZWxlY3Rpb24sIHNpbmNlIHNvbWV0aW1lcyB3ZSBuZWVkIHRvIHVuZG8gdHJlZSBkZWZhdWwgc2VsZWN0aW9uXHJcbiAgICAgICAgdGhpcy5fcHJldlNlbEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCBtYWluQ29udHJvbCwgMCwgSHRtbFByb3BlcnRpZXMuU2VsZWN0ZWRSb3csIGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZm9yY2UgYWxsIE1nQ29udHJvbHMgdG8gdXBkYXRlIHRoZSBjb2xvcnMgdXNlZCBvbiB0aGUgY29udHJvbHNcclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEluaXRUYWJsZUNvbnRyb2xfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbCgxLCAxLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlbW92ZUFsbFwiPnJlbW92ZSBhbGwgZWxlbWVudHMgZm9ybSB0aGUgdGFibGUgaW5jbHVkaW5nIGZpcnN0IGFuZCBsYXN0IGR1bW15IGVsZW1lbnRzPC9wYXJhbT5cclxuICBwcml2YXRlIEluaXRUYWJsZUNvbnRyb2xfMShkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lURU1TX0NPVU5ULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgdGFibGVJdGVtc0NvdW50KTtcclxuICAgICAgdGhpcy5fdGFibGVJdGVtc0NvdW50ID0gdGFibGVJdGVtc0NvdW50O1xyXG4gICAgICB0aGlzLlJvd3MuU2V0U2l6ZShkdlNpemUpO1xyXG4gICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSAtMjtcclxuICAgICAgdGhpcy5fcHJldlNlbEluZGV4ID0gLTI7XHJcbiAgICAgIHRoaXMuVXBkYXRlVGFibGVDaGlsZHJlbkFycmF5c1NpemUoZHZTaXplKTtcclxuICAgICAgdGhpcy5fbWF4Um93c0luUGFnaW5hdGVkVGFibGUgPSBDb21tYW5kcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSh0aGlzLl90YWJsZU1nQ29udHJvbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhcnJheXMgb2YgdGFibGUgY2hpbGRyZW4gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNpemVcIj48L3BhcmFtPlxyXG4gIHB1YmxpYyBJbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGxldCBjaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuVGFibGVDaGlsZHJlbjtcclxuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgY29udHJvbC5JbnNlcnRBcnJheXMoaWR4LCBjb3VudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2xhc3MgZGVzY3JpYmluZyByb3dcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxhdXRob3I+cmluYXY8L2F1dGhvcj5cclxuZXhwb3J0IGNsYXNzIFJvdyB7XHJcbiAgQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgLy8gaXMgcm93IGNyZWF0ZWQgb24gZ3VpIGxldmVsXHJcbiAgVmFsaWRhdGVkOiBib29sZWFuID0gZmFsc2U7ICAgLy8gaXMgcm93IFZhbGlkYXRlZFxyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGNyZWF0ZWQ6IGJvb2xlYW4sIHZhbGlkYXRlZDogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IoY3JlYXRlZD86IGJvb2xlYW4sIHZhbGlkYXRlZD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY3JlYXRlZCwgdmFsaWRhdGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuVmFsaWRhdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShjcmVhdGVkOiBib29sZWFuLCB2YWxpZGF0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQ3JlYXRlZCA9IGNyZWF0ZWQ7XHJcbiAgICB0aGlzLlZhbGlkYXRlZCA9IHZhbGlkYXRlZDtcclxuICB9XHJcbn1cclxuIl19