@magic-xpa/gui 4.1100.0-dev4110.24 → 4.1100.0-dev4110.240

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 (200) hide show
  1. package/{esm2020 → esm2022}/index.mjs +71 -71
  2. package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
  3. package/esm2022/src/Commands.mjs +184 -0
  4. package/esm2022/src/Events.mjs +425 -0
  5. package/esm2022/src/EventsProcessor.mjs +67 -0
  6. package/esm2022/src/FocusManager.mjs +34 -0
  7. package/esm2022/src/GuiConstants.mjs +68 -0
  8. package/{esm2020 → esm2022}/src/GuiEnums.mjs +299 -299
  9. package/esm2022/src/GuiEnvironment.mjs +4 -0
  10. package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
  11. package/{esm2020 → esm2022}/src/Manager.mjs +91 -91
  12. package/esm2022/src/UIBridge.mjs +33 -0
  13. package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
  14. package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
  15. package/esm2022/src/gui/GuiMgControl.mjs +123 -0
  16. package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
  17. package/esm2022/src/gui/KeyboardItem.mjs +135 -0
  18. package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
  19. package/esm2022/src/gui/MgValue.mjs +16 -0
  20. package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
  21. package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
  22. package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
  23. package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
  24. package/esm2022/src/gui/low/GuiInteractive.mjs +177 -0
  25. package/esm2022/src/gui/low/Style.mjs +20 -0
  26. package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
  27. package/esm2022/src/management/data/BlobType.mjs +281 -0
  28. package/{esm2020 → esm2022}/src/management/data/DcValues.mjs +214 -214
  29. package/esm2022/src/management/data/DcValuesBuilderBase.mjs +96 -0
  30. package/esm2022/src/management/data/FieldDef.mjs +331 -0
  31. package/esm2022/src/management/data/FieldsTable.mjs +54 -0
  32. package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
  33. package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
  35. package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
  36. package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
  37. package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
  39. package/esm2022/src/management/data/RecordUtils.mjs +361 -0
  40. package/esm2022/src/management/data/VectorType.mjs +612 -0
  41. package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
  42. package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
  43. package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
  44. package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
  45. package/{esm2020 → esm2022}/src/management/exp/GuiExpressionEvaluator.mjs +305 -307
  46. package/esm2022/src/management/gui/ControlTable.mjs +118 -0
  47. package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
  48. package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
  49. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
  50. package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
  51. package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
  52. package/esm2022/src/management/gui/Helps.mjs +237 -0
  53. package/esm2022/src/management/gui/MgControlBase.mjs +1859 -0
  54. package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
  55. package/esm2022/src/management/gui/PIC.mjs +1185 -0
  56. package/esm2022/src/management/gui/PropDefaults.mjs +230 -0
  57. package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
  58. package/esm2022/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2022/src/management/gui/Property.mjs +1362 -0
  60. package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
  61. package/esm2022/src/management/gui/ValidationDetailsBase.mjs +93 -0
  62. package/esm2022/src/management/gui/WrongFormatException.mjs +29 -0
  63. package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
  64. package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
  65. package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
  66. package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
  67. package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
  68. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
  69. package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/esm2022/src/util/MemoryUtil.mjs +35 -0
  71. package/{esm2020 → esm2022}/src/util/ObjectReference.mjs +36 -36
  72. package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
  73. package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16074 -16074
  74. package/fesm2022/magic-xpa-gui.mjs.map +1 -0
  75. package/index.d.ts +70 -70
  76. package/package.json +6 -12
  77. package/src/Commands.d.ts +40 -39
  78. package/src/Events.d.ts +157 -155
  79. package/src/EventsProcessor.d.ts +13 -13
  80. package/src/FocusManager.d.ts +8 -8
  81. package/src/GuiConstants.d.ts +65 -65
  82. package/src/GuiEnums.d.ts +282 -282
  83. package/src/GuiEnvironment.d.ts +4 -4
  84. package/src/IFlowMonitorQueue.d.ts +3 -3
  85. package/src/Manager.d.ts +26 -26
  86. package/src/UIBridge.d.ts +16 -16
  87. package/src/env/IEnvironment.d.ts +31 -31
  88. package/src/gui/ControlBase.d.ts +4 -4
  89. package/src/gui/GuiMgControl.d.ts +38 -38
  90. package/src/gui/GuiMgForm.d.ts +3 -3
  91. package/src/gui/KeyboardItem.d.ts +18 -18
  92. package/src/gui/LastFocusedVal.d.ts +7 -7
  93. package/src/gui/MgValue.d.ts +15 -15
  94. package/src/gui/PropParentInterface.d.ts +13 -13
  95. package/src/gui/low/DialogHandler.d.ts +4 -4
  96. package/src/gui/low/GuiCommand.d.ts +37 -37
  97. package/src/gui/low/GuiCommandQueue.d.ts +13 -13
  98. package/src/gui/low/GuiInteractive.d.ts +55 -53
  99. package/src/gui/low/Style.d.ts +19 -19
  100. package/src/management/RuntimeContextBase.d.ts +23 -23
  101. package/src/management/data/BlobType.d.ts +29 -29
  102. package/src/management/data/DcValues.d.ts +33 -33
  103. package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
  104. package/src/management/data/FieldDef.d.ts +53 -53
  105. package/src/management/data/FieldsTable.d.ts +16 -16
  106. package/src/management/data/GuiDataViewBase.d.ts +27 -27
  107. package/src/management/data/GuiFieldBase.d.ts +17 -17
  108. package/src/management/data/IRecord.d.ts +12 -12
  109. package/src/management/data/IReferencedObject.d.ts +5 -5
  110. package/src/management/data/NUM_TYPE.d.ts +103 -103
  111. package/src/management/data/ObjectReferenceBase.d.ts +16 -16
  112. package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
  113. package/src/management/data/RecordUtils.d.ts +21 -21
  114. package/src/management/data/VectorType.d.ts +52 -52
  115. package/src/management/data/VectorTypeBase.d.ts +8 -8
  116. package/src/management/events/IActionManager.d.ts +7 -7
  117. package/src/management/events/IGuiEventsManager.d.ts +20 -20
  118. package/src/management/exp/ExpressionInterface.d.ts +242 -242
  119. package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
  120. package/src/management/gui/ControlTable.d.ts +28 -28
  121. package/src/management/gui/DisplayConvertor.d.ts +103 -103
  122. package/src/management/gui/FieldValidator.d.ts +35 -35
  123. package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
  124. package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
  125. package/src/management/gui/HebrewDate.d.ts +46 -46
  126. package/src/management/gui/Helps.d.ts +51 -51
  127. package/src/management/gui/MgControlBase.d.ts +223 -223
  128. package/src/management/gui/MgFormBase.d.ts +160 -160
  129. package/src/management/gui/PIC.d.ts +108 -108
  130. package/src/management/gui/PropDefaults.d.ts +7 -7
  131. package/src/management/gui/PropInterface.d.ts +244 -243
  132. package/src/management/gui/PropTable.d.ts +33 -33
  133. package/src/management/gui/Property.d.ts +121 -121
  134. package/src/management/gui/ValidationDetails.d.ts +52 -52
  135. package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
  136. package/src/management/gui/WrongFormatException.d.ts +9 -9
  137. package/src/management/tasks/GuiDataCollection.d.ts +4 -4
  138. package/src/management/tasks/GuiTaskBase.d.ts +150 -150
  139. package/src/management/tasks/IMGDataTable.d.ts +10 -10
  140. package/src/management/tasks/ITask.d.ts +6 -6
  141. package/src/management/tasks/MgTimer.d.ts +8 -8
  142. package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
  143. package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
  144. package/src/util/MemoryUtil.d.ts +6 -6
  145. package/src/util/ObjectReference.d.ts +9 -9
  146. package/src/util/UsernamePasswordCredentials.d.ts +18 -18
  147. package/esm2020/src/Commands.mjs +0 -177
  148. package/esm2020/src/Events.mjs +0 -420
  149. package/esm2020/src/EventsProcessor.mjs +0 -67
  150. package/esm2020/src/FocusManager.mjs +0 -34
  151. package/esm2020/src/GuiConstants.mjs +0 -68
  152. package/esm2020/src/GuiEnvironment.mjs +0 -4
  153. package/esm2020/src/UIBridge.mjs +0 -32
  154. package/esm2020/src/gui/GuiMgControl.mjs +0 -125
  155. package/esm2020/src/gui/KeyboardItem.mjs +0 -135
  156. package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
  157. package/esm2020/src/gui/MgValue.mjs +0 -16
  158. package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
  159. package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
  160. package/esm2020/src/gui/low/GuiInteractive.mjs +0 -165
  161. package/esm2020/src/gui/low/Style.mjs +0 -20
  162. package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
  163. package/esm2020/src/management/data/BlobType.mjs +0 -281
  164. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +0 -96
  165. package/esm2020/src/management/data/FieldDef.mjs +0 -331
  166. package/esm2020/src/management/data/FieldsTable.mjs +0 -54
  167. package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
  168. package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
  169. package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
  170. package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
  171. package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
  172. package/esm2020/src/management/data/RecordUtils.mjs +0 -361
  173. package/esm2020/src/management/data/VectorType.mjs +0 -612
  174. package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
  175. package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
  176. package/esm2020/src/management/gui/ControlTable.mjs +0 -118
  177. package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
  178. package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
  179. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
  180. package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
  181. package/esm2020/src/management/gui/Helps.mjs +0 -237
  182. package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
  183. package/esm2020/src/management/gui/MgFormBase.mjs +0 -738
  184. package/esm2020/src/management/gui/PIC.mjs +0 -1185
  185. package/esm2020/src/management/gui/PropDefaults.mjs +0 -230
  186. package/esm2020/src/management/gui/PropTable.mjs +0 -221
  187. package/esm2020/src/management/gui/Property.mjs +0 -1356
  188. package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
  189. package/esm2020/src/management/gui/ValidationDetailsBase.mjs +0 -93
  190. package/esm2020/src/management/gui/WrongFormatException.mjs +0 -29
  191. package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
  192. package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
  193. package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
  194. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
  195. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
  196. package/esm2020/src/util/MemoryUtil.mjs +0 -35
  197. package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
  198. package/fesm2015/magic-xpa-gui.mjs +0 -16364
  199. package/fesm2015/magic-xpa-gui.mjs.map +0 -1
  200. package/fesm2020/magic-xpa-gui.mjs.map +0 -1
@@ -0,0 +1,1859 @@
1
+ import { ApplicationException, Debug, Exception, List, NNumber, NString, RefParam, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
2
+ import { GuiFieldBase } from '../data/GuiFieldBase';
3
+ import { ChoiceUtils, Constants, InternalInterface, MagicProperties, MgControlType, Misc, SEQ_2_STR, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
4
+ import { PIC } from './PIC';
5
+ import { PropTable } from './PropTable';
6
+ import { ValidationDetails } from './ValidationDetails';
7
+ import { FieldDef } from '../data/FieldDef';
8
+ import { Property } from './Property';
9
+ import { Manager } from '../../Manager';
10
+ import { CommandType, HtmlProperties } from '../../GuiEnums';
11
+ import { Commands } from '../../Commands';
12
+ import { NUM_TYPE } from '../data/NUM_TYPE';
13
+ import { PropInterface } from './PropInterface';
14
+ import { Events } from '../../Events';
15
+ import { EMPTY_DCREF } from '../data/DcValues';
16
+ import { DisplayConvertor } from './DisplayConvertor';
17
+ import { BlobType } from '../data/BlobType';
18
+ import { VectorType } from '../data/VectorType';
19
+ import { ObjectReference } from '../../util/ObjectReference';
20
+ import { GuiConstants } from '../../GuiConstants';
21
+ import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
22
+ import { FocusManager } from '../../FocusManager';
23
+ export class MgControlBase extends GuiControlPropertyAdapter {
24
+ _ditIdx = 0;
25
+ _linkedControls = null;
26
+ _field = null;
27
+ _picStr = null;
28
+ _choiceDisps = null;
29
+ _choiceLayerList = null;
30
+ _choiceLinks = null;
31
+ _choiceNums = null;
32
+ _containerDitIdx = -1;
33
+ _currReadOnly = null;
34
+ _dataCtrl = false;
35
+ _dcTableRefs = null;
36
+ _firstRefreshProperties = true;
37
+ _form = null;
38
+ _hasValidItmAndDispVal = false;
39
+ _controlIsn = -1;
40
+ _linkedParentDitIdx = -1;
41
+ _orgChoiceDisps = null;
42
+ _parentTable = null;
43
+ _pic = null;
44
+ _picExpExists = false;
45
+ _prevIsNulls = null;
46
+ _prevPicExpResult = null;
47
+ _prevValues = null;
48
+ _propTab = null;
49
+ _range = null;
50
+ _rangeChanged = false;
51
+ _valExpId = 0;
52
+ _vd = null;
53
+ _dcValId = -2;
54
+ parent = 0;
55
+ veeIndx = 0;
56
+ SourceTableReference = null;
57
+ ClipBoardDataExists = false;
58
+ DataType = StorageAttribute.NONE;
59
+ KeyStrokeOn = false;
60
+ ModifiedByUser = false;
61
+ Value = null;
62
+ IsNull = false;
63
+ forceRefresh = false;
64
+ _isModal;
65
+ set Form(value) {
66
+ this._form = value;
67
+ this.GuiMgForm = value;
68
+ }
69
+ get Form() {
70
+ return this._form;
71
+ }
72
+ get ControlIsn() {
73
+ return this._controlIsn;
74
+ }
75
+ RefreshOnVisible = false;
76
+ InControl = false;
77
+ ValidateControl = false;
78
+ PromptHelp = null;
79
+ constructor(type, parentMgForm, parentControl) {
80
+ super();
81
+ if (arguments.length === 0) {
82
+ this.constructor_0();
83
+ return;
84
+ }
85
+ this.constructor_1(type, parentMgForm, parentControl);
86
+ }
87
+ constructor_0() {
88
+ this._linkedControls = new List();
89
+ this.DataType = StorageAttribute.NONE;
90
+ }
91
+ constructor_1(type, parentMgForm, parentControl) {
92
+ this.constructor_0();
93
+ this.initReferences(parentMgForm);
94
+ this.Type = type;
95
+ this._containerDitIdx = parentControl;
96
+ this._linkedParentDitIdx = parentControl;
97
+ this._propTab = new PropTable(this);
98
+ this.createArrays(false);
99
+ }
100
+ get UniqueName() {
101
+ return this.Name;
102
+ }
103
+ get TaskTag() {
104
+ return this.Form.getTask().getTaskTag();
105
+ }
106
+ checkIfExistProp(propId) {
107
+ let exist = false;
108
+ if (this._propTab !== null) {
109
+ let propById = this._propTab.getPropById(propId);
110
+ exist = (propById !== null);
111
+ }
112
+ return exist;
113
+ }
114
+ getProp(propId) {
115
+ let prop = null;
116
+ if (this._propTab !== null) {
117
+ prop = this._propTab.getPropById(propId);
118
+ if (prop === null) {
119
+ prop = Property.getDefaultProp(propId, 'C', this);
120
+ if (prop !== null) {
121
+ this._propTab.addProp(prop);
122
+ }
123
+ }
124
+ }
125
+ return prop;
126
+ }
127
+ getForm() {
128
+ return this.Form;
129
+ }
130
+ getCompIdx() {
131
+ return this.getForm().getTask().getCompIdx();
132
+ }
133
+ IsFirstRefreshOfProps() {
134
+ return this._firstRefreshProperties;
135
+ }
136
+ async EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
137
+ return await this.getForm().getTask().EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated);
138
+ }
139
+ GetExpressionStorage(expId) {
140
+ return this.getForm().getTask().GetExpressionStorage(expId);
141
+ }
142
+ GetComputedProperty(propId) {
143
+ let prop = null;
144
+ if (this._propTab !== null)
145
+ prop = this._propTab.getPropById(propId);
146
+ return prop;
147
+ }
148
+ initReferences(mgForm) {
149
+ this.Form = mgForm;
150
+ }
151
+ createArrays(forceCreateArrays) {
152
+ if (this._firstRefreshProperties || forceCreateArrays) {
153
+ if (this.SupportsDataSource()) {
154
+ this._dcTableRefs = new List();
155
+ }
156
+ this._prevValues = new List();
157
+ if (!forceCreateArrays) {
158
+ this._currReadOnly = new List();
159
+ }
160
+ this._choiceDisps = new List();
161
+ this._orgChoiceDisps = new List();
162
+ this._choiceLinks = new List();
163
+ this._choiceNums = new List();
164
+ this._prevIsNulls = new List();
165
+ this._choiceLayerList = new List();
166
+ if (!this.IsRepeatable && !super.isTableControl()) {
167
+ this.updateArrays(1);
168
+ }
169
+ }
170
+ }
171
+ async SetFocus(ctrl, line, activateForm) {
172
+ await FocusManager.SetFocus(ctrl.getForm().getTask(), ctrl, line, activateForm);
173
+ }
174
+ InsertArrays(idx, count) {
175
+ this._prevValues.InsertRange(new Array(count));
176
+ this._prevIsNulls.InsertRange(new Array(count));
177
+ this._currReadOnly.InsertRange(new Array(count));
178
+ this._choiceDisps.InsertRange(new Array(count));
179
+ this._orgChoiceDisps.InsertRange(new Array(count));
180
+ this._choiceLinks.InsertRange(new Array(count));
181
+ this._choiceLayerList.InsertRange(new Array(count));
182
+ this._choiceNums.InsertRange(new Array(count));
183
+ if (this.SupportsDataSource())
184
+ this._dcTableRefs.InsertRange(new Array(count));
185
+ this._propTab.InsertPrevValueArray(count);
186
+ }
187
+ updateArrays(newSize) {
188
+ this._prevValues.SetSize(newSize);
189
+ this._prevIsNulls.SetSize(newSize);
190
+ this._currReadOnly.SetSize(newSize);
191
+ this._choiceDisps.SetSize(newSize);
192
+ this._orgChoiceDisps.SetSize(newSize);
193
+ this._choiceLinks.SetSize(newSize);
194
+ this._choiceLayerList.SetSize(newSize);
195
+ this._choiceNums.SetSize(newSize);
196
+ if (this.SupportsDataSource()) {
197
+ this._dcTableRefs.SetSize(newSize);
198
+ }
199
+ this._propTab.updatePrevValueArray(newSize);
200
+ }
201
+ updatePrevValArrays(newSize) {
202
+ this._propTab.updatePrevValueArray(newSize);
203
+ }
204
+ fillData(mgForm, ditIdx, parser) {
205
+ if (this.Form === null) {
206
+ this.initReferences(mgForm);
207
+ }
208
+ this._ditIdx = ditIdx;
209
+ while (this.initInnerObjects(parser.getNextTag(), parser)) {
210
+ }
211
+ if (this.DataType === StorageAttribute.BLOB && this._picStr === null) {
212
+ this._picStr = "";
213
+ }
214
+ if (this._picStr !== null && typeof this.DataType !== "undefined") {
215
+ this.setPIC(this._picStr);
216
+ }
217
+ else {
218
+ switch (this.Type) {
219
+ case MgControlType.CTRL_TYPE_IMAGE:
220
+ case MgControlType.CTRL_TYPE_BROWSER:
221
+ case MgControlType.CTRL_TYPE_BUTTON:
222
+ if (this.DataType === StorageAttribute.NONE)
223
+ this.DataType = StorageAttribute.ALPHA;
224
+ break;
225
+ case MgControlType.CTRL_TYPE_TABLE:
226
+ case MgControlType.CTRL_TYPE_COLUMN:
227
+ case MgControlType.CTRL_TYPE_SUBFORM:
228
+ case MgControlType.CTRL_TYPE_GROUP:
229
+ case MgControlType.CTRL_TYPE_FRAME_SET:
230
+ case MgControlType.CTRL_TYPE_FRAME_FORM:
231
+ case MgControlType.CTRL_TYPE_CONTAINER:
232
+ case MgControlType.CTRL_TYPE_LINE:
233
+ break;
234
+ default:
235
+ Events.WriteExceptionToLog(NString.Format("in Control.fillData(): missing datatype or picture string for control: {0}", this.Name));
236
+ break;
237
+ }
238
+ }
239
+ if (super.isTableControl()) {
240
+ this.Form.setTableCtrl(this);
241
+ }
242
+ this.createArrays(false);
243
+ }
244
+ initInnerObjects(foundTagName, parser) {
245
+ if (foundTagName === null)
246
+ return false;
247
+ if (foundTagName === XMLConstants.MG_TAG_PROP) {
248
+ if (this._propTab === null)
249
+ this._propTab = new PropTable(this);
250
+ this._propTab.fillData(this, 'C', parser);
251
+ }
252
+ else if (foundTagName === XMLConstants.MG_TAG_CONTROL)
253
+ this.parseAttributes(parser);
254
+ else if (foundTagName === "SourceTable")
255
+ this.ParseSourceTable(parser);
256
+ else if (foundTagName === "/" + XMLConstants.MG_TAG_CONTROL) {
257
+ parser.setCurrIndex2EndOfTag();
258
+ return false;
259
+ }
260
+ else {
261
+ Events.WriteExceptionToLog(NString.Format("There is no such tag in Control. Insert else if to Control.initInnerObjects for {0}", foundTagName));
262
+ return false;
263
+ }
264
+ return true;
265
+ }
266
+ ParseSourceTable(parser) {
267
+ parser.setCurrIndex2EndOfTag();
268
+ let objRefStr = parser.ReadToEndOfCurrentElement();
269
+ let sourceTableReference = ObjectReference.FromXML(objRefStr.trim());
270
+ this.SourceTableReference = sourceTableReference;
271
+ parser.setCurrIndex2EndOfTag();
272
+ }
273
+ parseAttributes(parser) {
274
+ let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
275
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
276
+ let tag = parser.getXMLsubstring(endContext);
277
+ parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_CONTROL) + XMLConstants.MG_TAG_CONTROL.length);
278
+ let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
279
+ for (let i = 0; i < tokens.length; i = i + 2) {
280
+ let attribute = tokens.get_Item(i);
281
+ let valueStr = tokens.get_Item(i + 1);
282
+ this.SetAttribute(attribute, valueStr);
283
+ }
284
+ parser.setCurrIndex(endContext + 1);
285
+ }
286
+ else {
287
+ Events.WriteExceptionToLog("in Control.FillName() out of string bounds");
288
+ }
289
+ }
290
+ SetAttribute(attribute, valueStr) {
291
+ let isTagProcessed = true;
292
+ switch (attribute) {
293
+ case XMLConstants.MG_ATTR_TYPE:
294
+ this.Type = valueStr[0];
295
+ break;
296
+ case XMLConstants.MG_ATTR_DATA_CTRL:
297
+ this._dataCtrl = XmlParser.getBoolean(valueStr);
298
+ break;
299
+ case XMLConstants.MG_ATTR_LINKED_PARENT:
300
+ this.setLinkedParentIdx(XmlParser.getInt(valueStr));
301
+ break;
302
+ case XMLConstants.MG_ATTR_CONTAINER:
303
+ this.setContainer(XmlParser.getInt(valueStr));
304
+ break;
305
+ case XMLConstants.MG_ATTR_CONTROL_ISN:
306
+ this._controlIsn = XmlParser.getInt(valueStr);
307
+ break;
308
+ case XMLConstants.MG_ATTR_IS_MODAL:
309
+ this._isModal = XmlParser.getBoolean(valueStr);
310
+ break;
311
+ case XMLConstants.MG_ATTR_CONTROL_Z_ORDER:
312
+ break;
313
+ case XMLConstants.MG_HOR_ALIGMENT_IS_INHERITED:
314
+ break;
315
+ default:
316
+ isTagProcessed = false;
317
+ break;
318
+ }
319
+ return isTagProcessed;
320
+ }
321
+ setImage() {
322
+ let newVal = this.Value;
323
+ if (newVal === null || this.IsNull) {
324
+ newVal = "";
325
+ }
326
+ if (this.DataType === StorageAttribute.BLOB) {
327
+ }
328
+ else {
329
+ this.setImageWithFileName(newVal);
330
+ }
331
+ }
332
+ setImageWithFileName(fileName) {
333
+ if (fileName === null) {
334
+ fileName = "";
335
+ }
336
+ fileName = Events.TranslateLogicalName(fileName);
337
+ if (!Misc.IsWebUrl(fileName))
338
+ fileName = Events.GetAssetsURL() + "/images/" + fileName;
339
+ if (this.IsImageButton()) {
340
+ Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, fileName);
341
+ }
342
+ else {
343
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Image, fileName);
344
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), fileName);
345
+ }
346
+ }
347
+ setContainer(containerIdx) {
348
+ this._containerDitIdx = containerIdx;
349
+ let container = null;
350
+ if (this._containerDitIdx !== -1) {
351
+ container = this.Form.getCtrl(this._containerDitIdx);
352
+ }
353
+ if (container !== null && container.Type === MgControlType.CTRL_TYPE_TABLE) {
354
+ this._parentTable = container;
355
+ }
356
+ this.IsRepeatable = (this._parentTable !== null && !super.isColumnControl());
357
+ }
358
+ getName() {
359
+ return this.Name;
360
+ }
361
+ getLinkedControls() {
362
+ return this._linkedControls;
363
+ }
364
+ isRepeatable() {
365
+ return this.IsRepeatable;
366
+ }
367
+ IsModal() {
368
+ return this._isModal;
369
+ }
370
+ getDisplayLine(useLineForItems) {
371
+ let line = 0;
372
+ if (this.IsRepeatable || (useLineForItems && super.isTableControl())) {
373
+ line = this.Form.DisplayLine;
374
+ }
375
+ return line;
376
+ }
377
+ isVisible() {
378
+ let result = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true);
379
+ if (result) {
380
+ result = this.isParentPropValue(PropInterface.PROP_TYPE_VISIBLE);
381
+ }
382
+ return result;
383
+ }
384
+ isEnabled() {
385
+ return this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true);
386
+ }
387
+ isModifiable() {
388
+ let modifiable = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFIABLE, true);
389
+ let taskInQuery = this.getForm().getTask().getMode() === Constants.TASK_MODE_QUERY;
390
+ let modifyInQuery = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false);
391
+ let result = modifiable && (modifyInQuery || !taskInQuery);
392
+ if (result && this._field != null) {
393
+ result = (this._field.DbModifiable || this.getForm().getTask().getMode() === Constants.TASK_MODE_CREATE);
394
+ }
395
+ return result;
396
+ }
397
+ getDcVals() {
398
+ let dataView = this.getForm().getTask().DataView;
399
+ let dcv = null;
400
+ if (this._dcValId === EMPTY_DCREF) {
401
+ dcv = ((this.DataType === StorageAttribute.BLOB_VECTOR) ? dataView.getEmptyChoiceForVectors() : dataView.getEmptyChoice());
402
+ }
403
+ else {
404
+ if (this._dcValId > -1) {
405
+ dcv = dataView.getDcValues(this._dcValId);
406
+ }
407
+ }
408
+ return dcv;
409
+ }
410
+ getPrevIsNull() {
411
+ let line = this.getDisplayLine(true);
412
+ let currObj = this._prevIsNulls.get_Item(line);
413
+ let curr;
414
+ if (currObj === null) {
415
+ curr = false;
416
+ this._prevIsNulls.set_Item(line, curr);
417
+ }
418
+ else {
419
+ curr = currObj;
420
+ }
421
+ return curr;
422
+ }
423
+ setPrevIsNull(newValue) {
424
+ this._prevIsNulls.set_Item(this.getDisplayLine(true), newValue);
425
+ }
426
+ setPIC(picStr) {
427
+ if (super.isButton()) {
428
+ this._picStr = (super.IsImageButton() ? "" + XMLConstants.FILE_NAME_SIZE.toString() : Events.Translate(picStr));
429
+ }
430
+ else {
431
+ this._picStr = picStr;
432
+ }
433
+ this._pic = new PIC(this._picStr, this.DataType, this.getForm().getTask().getCompIdx());
434
+ if (this._dataCtrl && this._picStr.indexOf('H') > -1) {
435
+ this._pic.setHebrew();
436
+ }
437
+ }
438
+ getPIC() {
439
+ if (this._picExpExists)
440
+ this._pic.setFormatExp(this._picExpExists);
441
+ return this._pic;
442
+ }
443
+ getParent() {
444
+ let retParent = this.Form;
445
+ if (this._containerDitIdx !== -1) {
446
+ retParent = this.Form.getCtrl(this._containerDitIdx);
447
+ }
448
+ else {
449
+ if (this.Form.isSubForm()) {
450
+ retParent = this.Form.getSubFormCtrl();
451
+ }
452
+ }
453
+ return retParent;
454
+ }
455
+ getField() {
456
+ return this._field;
457
+ }
458
+ setField(fieldOrFieldStrID) {
459
+ if (fieldOrFieldStrID === null || fieldOrFieldStrID instanceof GuiFieldBase) {
460
+ this.setField_0(fieldOrFieldStrID);
461
+ return;
462
+ }
463
+ this.setField_1(fieldOrFieldStrID);
464
+ }
465
+ setField_0(field) {
466
+ this._field = field;
467
+ if (field !== null) {
468
+ this._field.SetControl(this);
469
+ }
470
+ }
471
+ setField_1(fieldStrID) {
472
+ let returnField = this.getFieldByValueStr(fieldStrID);
473
+ if (returnField !== null) {
474
+ this._field = returnField;
475
+ this._field.SetControl(this);
476
+ return;
477
+ }
478
+ throw new ApplicationException("in Control.setField(): illegal field identifier: " + fieldStrID);
479
+ }
480
+ setPicStr(format, expId) {
481
+ this._picStr = format;
482
+ if (expId > 0) {
483
+ this._picExpExists = true;
484
+ }
485
+ }
486
+ setRange(newRange) {
487
+ this._range = newRange;
488
+ this._vd = null;
489
+ }
490
+ setValExp(expId) {
491
+ this._valExpId = expId;
492
+ }
493
+ buildCopyPicture(oldVal, newVal) {
494
+ if (super.isTableControl() || super.isColumnControl()) {
495
+ return null;
496
+ }
497
+ else {
498
+ let copyVD = this.getCopyOfVD();
499
+ copyVD.setValue(newVal);
500
+ copyVD.setOldValue(oldVal);
501
+ return copyVD;
502
+ }
503
+ }
504
+ getCopyOfVD() {
505
+ let result;
506
+ if (this._vd === null) {
507
+ result = new ValidationDetails(this.Value, this.Value, this._range, this._pic, this);
508
+ }
509
+ else {
510
+ result = new ValidationDetails(this._vd);
511
+ }
512
+ return result;
513
+ }
514
+ getRanges() {
515
+ return this._range;
516
+ }
517
+ getRangedValue(newVal) {
518
+ let vd;
519
+ vd = this.buildPicture(this.Value, newVal);
520
+ vd.evaluate();
521
+ this.ModifiedByUser = true;
522
+ let val = vd.getDispValue();
523
+ return (val.toString());
524
+ }
525
+ validate(newVal) {
526
+ let vd;
527
+ let modified = this.ModifiedByUser;
528
+ this.ModifiedByUser = true;
529
+ vd = this.buildPicture(this.Value, newVal);
530
+ vd.evaluate();
531
+ this.ModifiedByUser = modified;
532
+ if (vd.ValidationFailed)
533
+ return vd.ErrorMessage;
534
+ else
535
+ return null;
536
+ }
537
+ getFieldByValueStr(valueStr) {
538
+ let refParent = new RefParam(this.parent);
539
+ let refVeeIndx = new RefParam(this.veeIndx);
540
+ let ret = this.getForm().getTask().getFieldByValueStr(valueStr, refParent, refVeeIndx);
541
+ this.parent = refParent.value;
542
+ this.veeIndx = refVeeIndx.value;
543
+ return ret;
544
+ }
545
+ hasContainer() {
546
+ return this._containerDitIdx !== -1;
547
+ }
548
+ getLayer() {
549
+ return this.Layer;
550
+ }
551
+ computePIC(picExpResult) {
552
+ let picResult = (picExpResult !== null && super.isButton()) ? Events.Translate(picExpResult) : picExpResult;
553
+ if (this._prevPicExpResult === null || !(this._prevPicExpResult === picResult)) {
554
+ this._pic = new PIC(picResult, this.DataType, this.getForm().getTask().getCompIdx());
555
+ this._prevPicExpResult = picResult;
556
+ }
557
+ return this._pic;
558
+ }
559
+ getCurrentIndexOfChoice() {
560
+ let selectedIndice = [-1];
561
+ let val = this.Value;
562
+ if (!NString.IsNullOrEmpty(val)) {
563
+ let array2 = val.split(',');
564
+ selectedIndice = new Array(array2.length);
565
+ for (let iCtr = 0; iCtr < array2.length; iCtr = iCtr + 1) {
566
+ let num = NNumber.Parse(array2[iCtr]);
567
+ selectedIndice[iCtr] = ((num >= 0) ? num : -1);
568
+ }
569
+ }
570
+ return selectedIndice;
571
+ }
572
+ IsMultipleSelectionListBox() {
573
+ return super.isListBox();
574
+ }
575
+ IsDateTimePicture() {
576
+ return this._pic.getAttr() === StorageAttribute.DATE || this._pic.getAttr() === StorageAttribute.TIME;
577
+ }
578
+ SupportsDataSource() {
579
+ return super.isSelectionCtrl() || super.isTabControl() || super.isRadio() || this.HasAutocomplete();
580
+ }
581
+ HasAutocomplete() {
582
+ if (super.isTextControl())
583
+ return this.getProp(PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC).GetComputedValueBoolean();
584
+ return false;
585
+ }
586
+ async getIndexOfChoice(mgVal, line, isNull) {
587
+ let splitCommaSeperatedVals = this.IsMultipleSelectionListBox();
588
+ await this.computeChoice(line);
589
+ let isVectorValue = this.getField() !== null && this.getField().getType() === StorageAttribute.BLOB_VECTOR;
590
+ return this.getDcVals().getIndexOf(mgVal, isVectorValue, isNull, this._choiceLinks.get_Item(line), this._choiceNums.get_Item(line), splitCommaSeperatedVals);
591
+ }
592
+ async getDispVals(line, execComputeChoice) {
593
+ if (execComputeChoice) {
594
+ await this.computeChoice(line);
595
+ }
596
+ if (super.isTabControl()) {
597
+ return this._orgChoiceDisps.get_Item(line);
598
+ }
599
+ else {
600
+ return this._choiceDisps.get_Item(line);
601
+ }
602
+ }
603
+ emptyChoice(line) {
604
+ let value = new Array(0);
605
+ this._choiceDisps.set_Item(line, value);
606
+ this._orgChoiceDisps.set_Item(line, value);
607
+ this._choiceLinks.set_Item(line, value);
608
+ this._choiceLayerList.set_Item(line, value);
609
+ }
610
+ async computeChoice(line) {
611
+ let fromHelp = [
612
+ "\\\\", "\\-", "\\,"
613
+ ];
614
+ let toHelp = [
615
+ "XX", "XX", "XX"
616
+ ];
617
+ let task = this.getForm().getTask();
618
+ let dataView = task.DataView;
619
+ let dcv = dataView.getDcValues(this._dcValId);
620
+ let currDcId = this.getDcRef();
621
+ let choiceDispStr = null;
622
+ let choiceLinkStr = "";
623
+ let optionsValid = true;
624
+ let trimToLength = -1;
625
+ let dataType = this.DataType;
626
+ let isItemsListTreatedAsDisplayList = false;
627
+ try {
628
+ if (this._choiceLinks.get_Item(line) === null || (this.isDataCtrl() && currDcId !== this._dcValId)) {
629
+ if (dataType === StorageAttribute.BLOB_VECTOR) {
630
+ dataType = this.getField().getCellsType();
631
+ }
632
+ let dispVals = dcv.getDispVals();
633
+ let dispProp = this.getProp(PropInterface.PROP_TYPE_DISPLAY_LIST);
634
+ let linkProp = this.getProp(PropInterface.PROP_TYPE_LABEL);
635
+ if (dispProp !== null) {
636
+ choiceDispStr = await dispProp.getValue();
637
+ }
638
+ if (linkProp !== null) {
639
+ choiceLinkStr = await linkProp.getValue();
640
+ }
641
+ if (choiceLinkStr === null || StrUtil.rtrim(choiceLinkStr).length === 0) {
642
+ choiceLinkStr = "";
643
+ }
644
+ if (choiceDispStr === null || StrUtil.rtrim(choiceDispStr).length === 0) {
645
+ if (!this.isDataCtrl() || dispVals === null || dispVals.length === 0) {
646
+ choiceDispStr = choiceLinkStr;
647
+ }
648
+ else {
649
+ choiceDispStr = (choiceLinkStr = "");
650
+ }
651
+ isItemsListTreatedAsDisplayList = true;
652
+ }
653
+ choiceDispStr = Events.Translate(choiceDispStr);
654
+ if (dataType === StorageAttribute.NUMERIC) {
655
+ choiceLinkStr = StrUtil.searchAndReplace(choiceLinkStr, "\\-", "-");
656
+ }
657
+ let helpStr = StrUtil.searchAndReplace(choiceLinkStr, fromHelp, toHelp);
658
+ let sTok = StrUtil.tokenize(helpStr, ",");
659
+ let linkSize = (helpStr !== "") ? sTok.length : 0;
660
+ let helpStrDisp = StrUtil.searchAndReplace(choiceDispStr, fromHelp, toHelp);
661
+ sTok = StrUtil.tokenize(helpStrDisp, ",");
662
+ let displaySize = (helpStrDisp !== "") ? sTok.length : 0;
663
+ if (linkSize !== displaySize && displaySize > 0) {
664
+ choiceDispStr = choiceLinkStr;
665
+ isItemsListTreatedAsDisplayList = true;
666
+ }
667
+ let size = linkSize;
668
+ let choiceLink = new Array(size);
669
+ this._choiceLinks.set_Item(line, choiceLink);
670
+ if (dataType === StorageAttribute.NUMERIC || dataType === StorageAttribute.DATE || dataType === StorageAttribute.TIME) {
671
+ this._choiceNums.set_Item(line, new Array(size));
672
+ }
673
+ let orgChoiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, false, true, !isItemsListTreatedAsDisplayList);
674
+ this._orgChoiceDisps.set_Item(line, orgChoiceDisp);
675
+ let choiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, super.isSelectionCtrl() || super.isTabControl(), true, !isItemsListTreatedAsDisplayList);
676
+ this._choiceDisps.set_Item(line, choiceDisp);
677
+ if (this.getField() !== null) {
678
+ trimToLength = this.getField().getSize();
679
+ }
680
+ let token = null;
681
+ let helpToken = null;
682
+ let tokenBuffer;
683
+ for (let i = 0, currPos = 0, nextPos = 0; i < size && optionsValid; i++) {
684
+ nextPos = currPos;
685
+ nextPos = helpStr.indexOf(',', nextPos);
686
+ if (nextPos === currPos)
687
+ token = helpToken = "";
688
+ else if (nextPos === -1) {
689
+ token = choiceLinkStr.substr(currPos);
690
+ helpToken = helpStr.substr(currPos);
691
+ }
692
+ else {
693
+ token = choiceLinkStr.substr(currPos, (nextPos) - (currPos));
694
+ helpToken = helpStr.substr(currPos, (nextPos) - (currPos));
695
+ }
696
+ currPos = nextPos + 1;
697
+ switch (dataType) {
698
+ case StorageAttribute.ALPHA:
699
+ case StorageAttribute.MEMO:
700
+ case StorageAttribute.UNICODE:
701
+ case StorageAttribute.BLOB_VECTOR:
702
+ token = StrUtil.ltrim(token);
703
+ helpToken = StrUtil.ltrim(helpToken);
704
+ if (helpToken.indexOf('\\') >= 0) {
705
+ tokenBuffer = new StringBuilder();
706
+ for (let tokenPos = 0; tokenPos < helpToken.length; tokenPos++)
707
+ if (helpToken[tokenPos] !== '\\')
708
+ tokenBuffer.Append(token[tokenPos]);
709
+ else if (tokenPos === helpToken.length - 1)
710
+ tokenBuffer.Append(' ');
711
+ token = tokenBuffer.ToString();
712
+ }
713
+ token = StrUtil.makePrintableTokens(token, SEQ_2_STR);
714
+ if (this.isSelectionCtrl() || this.isTabControl())
715
+ token = ChoiceUtils.RemoveAcclCharFromOptions(new StringBuilder(token));
716
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && dataType === StorageAttribute.ALPHA) {
717
+ if (trimToLength !== -1 && UtilStrByteMode.lenB(token) > trimToLength)
718
+ token = UtilStrByteMode.leftB(token, trimToLength);
719
+ }
720
+ else {
721
+ if (trimToLength !== -1 && token.length > trimToLength)
722
+ token = token.substr(0, trimToLength);
723
+ }
724
+ choiceLink[i] = token;
725
+ break;
726
+ case StorageAttribute.NUMERIC:
727
+ case StorageAttribute.DATE:
728
+ case StorageAttribute.TIME:
729
+ let picture = PIC.buildPicture(dataType, token, task.getCompIdx(), false);
730
+ optionsValid = this.optionIsValid(token);
731
+ choiceLink[i] = DisplayConvertor.Instance.disp2mg(token.trim(), picture, task.getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
732
+ ((this._choiceNums.get_Item(line)))[i] = new NUM_TYPE(choiceLink[i]);
733
+ break;
734
+ case StorageAttribute.BOOLEAN:
735
+ choiceLink[i] = (1 - i).toString();
736
+ break;
737
+ default:
738
+ break;
739
+ }
740
+ }
741
+ if (!optionsValid)
742
+ this.emptyChoice(line);
743
+ }
744
+ }
745
+ catch (ex) {
746
+ if (ex instanceof Exception) {
747
+ optionsValid = false;
748
+ this.emptyChoice(line);
749
+ Events.WriteExceptionToLog(NString.Format("{0} : {1}", ex.GetType(), ex.Message));
750
+ }
751
+ else
752
+ throw ex;
753
+ }
754
+ this._hasValidItmAndDispVal = optionsValid;
755
+ }
756
+ getTopMostForm() {
757
+ return this.getForm().getTopMostForm();
758
+ }
759
+ setUrl() {
760
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, 0, this.Value);
761
+ }
762
+ async getMgValue(dispVal) {
763
+ let mgVal = null;
764
+ if (super.isCheckBox()) {
765
+ mgVal = dispVal ? "1" : "0";
766
+ }
767
+ else {
768
+ if (super.isSelectionCtrl() || super.isTabControl() || super.isRadio()) {
769
+ let line = this.getDisplayLine(true);
770
+ if (line < 0)
771
+ line = 0;
772
+ if (typeof dispVal === "number")
773
+ dispVal = dispVal.toString();
774
+ if (Array.isArray(dispVal))
775
+ dispVal = dispVal.join(',').toString();
776
+ if (dispVal === "") {
777
+ mgVal = dispVal;
778
+ }
779
+ else {
780
+ mgVal = await this.getLinkValue(dispVal, line);
781
+ }
782
+ if (mgVal === null) {
783
+ let refMgVal = new RefParam(mgVal);
784
+ if (this._field !== null) {
785
+ mgVal = refMgVal.value;
786
+ }
787
+ }
788
+ }
789
+ else {
790
+ let blobContentType = (this._field !== null) ? this._field.getContentType() : BlobType.CONTENT_TYPE_UNKNOWN;
791
+ mgVal = DisplayConvertor.Instance.disp2mg(dispVal, this._pic, this.getForm().getTask().getCompIdx(), blobContentType);
792
+ }
793
+ }
794
+ return mgVal;
795
+ }
796
+ async getLinkValue(selectedIndice, line) {
797
+ let size = 0;
798
+ let result = NString.Empty;
799
+ let temp = new List();
800
+ await this.computeChoice(line);
801
+ let choiceLink = this._choiceLinks.get_Item(line);
802
+ if (choiceLink !== null) {
803
+ size = choiceLink.length;
804
+ }
805
+ let linkIndice = this.getLinkIdxFromLayer(Misc.GetIntArray(selectedIndice));
806
+ let array2 = linkIndice;
807
+ for (let i = 0; i < array2.length; i = i + 1) {
808
+ let idx = array2[i];
809
+ if (idx >= size) {
810
+ let dcVals = this.getDcVals();
811
+ temp.push(dcVals.getLinkValue(idx - size));
812
+ }
813
+ else {
814
+ if (idx >= 0 && idx < choiceLink.length) {
815
+ temp.push(choiceLink[idx]);
816
+ }
817
+ else {
818
+ temp.push(null);
819
+ }
820
+ }
821
+ }
822
+ if (this.DataType === StorageAttribute.BLOB_VECTOR) {
823
+ let vectorType = new VectorType(this.getField());
824
+ for (let indx = 0; indx < temp.length; indx = indx + 1) {
825
+ vectorType.setVecCell(indx + 1, temp.get_Item(indx), temp.get_Item(indx) === null);
826
+ }
827
+ result = vectorType.toString();
828
+ }
829
+ else {
830
+ if (temp.length > 1) {
831
+ result = temp.join(",");
832
+ }
833
+ else {
834
+ result = temp.get_Item(0);
835
+ }
836
+ }
837
+ return result;
838
+ }
839
+ setText() {
840
+ let displayLine = this.getDisplayLine(true);
841
+ let mlsTranslatedValue = this.Value;
842
+ if (super.isButton()) {
843
+ mlsTranslatedValue = Events.Translate(this.Value);
844
+ }
845
+ if (this.isTextControl() || this.isButton())
846
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, displayLine, mlsTranslatedValue);
847
+ else
848
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, displayLine, HtmlProperties.Text, mlsTranslatedValue);
849
+ }
850
+ setRadioChecked(index) {
851
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), index);
852
+ Commands.beginInvoke();
853
+ if (index !== GuiConstants.DEFAULT_VALUE_INT) {
854
+ this.setControlToFocus();
855
+ }
856
+ }
857
+ setControlToFocus() {
858
+ if (this.getField() !== null) {
859
+ this.getField().ControlToFocus = this;
860
+ }
861
+ }
862
+ setCheckBoxValue(line, mgVal) {
863
+ let checkState = DisplayConvertor.toBoolean(mgVal);
864
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, line, checkState);
865
+ }
866
+ async refreshAndSetItemListByDataSource(line, valueChanged) {
867
+ if (this.SupportsDataSource()) {
868
+ let currDcId = this.getDcRef();
869
+ if (this._rangeChanged) {
870
+ valueChanged = true;
871
+ }
872
+ this._rangeChanged = false;
873
+ if (this.isDataCtrl() && currDcId !== this._dcValId) {
874
+ valueChanged = true;
875
+ await this.refreshAndSetItemsList(line, true);
876
+ this.setDcRef(this._dcValId);
877
+ }
878
+ }
879
+ return valueChanged;
880
+ }
881
+ setDcRef(dcId) {
882
+ this._dcTableRefs.set_Item(this.getDcLineNum(), dcId);
883
+ }
884
+ setImageList(url) {
885
+ }
886
+ async updatePropertyLogicNesting(propId, commandType, val, updateThis) {
887
+ if (updateThis) {
888
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), commandType === CommandType.PROP_SET_VISIBLE ? HtmlProperties.Visible : HtmlProperties.Enabled, val);
889
+ }
890
+ await this.updateChildrenPropValue(propId, commandType, val);
891
+ }
892
+ SetEnabled(val) {
893
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Enabled, val);
894
+ }
895
+ async updateChildrenPropValue(propId, commandType, val) {
896
+ if (!super.isTableControl()) {
897
+ for (let i = 0; i < this._linkedControls.length; i = i + 1) {
898
+ let child = this._linkedControls.get_Item(i);
899
+ if (child.IsFirstRefreshOfProps())
900
+ continue;
901
+ let childValue = (child.GetComputedBooleanProperty(propId, true));
902
+ childValue = childValue && val;
903
+ let childOnCurrentLayer = this.isChildOnCurrentLayer(child);
904
+ if (commandType === CommandType.PROP_SET_VISIBLE) {
905
+ if (childValue) {
906
+ childValue = childOnCurrentLayer;
907
+ }
908
+ await child.updateChildrenPropValue(propId, commandType, childValue);
909
+ }
910
+ }
911
+ if (super.isSubform()) {
912
+ await this.updateSubformChildrenPropValue(propId, commandType, val);
913
+ }
914
+ }
915
+ }
916
+ isDescendentOfControl(control) {
917
+ let isContained = false;
918
+ if (control !== null) {
919
+ let parent = this.getParent();
920
+ if (parent instanceof MgControlBase) {
921
+ if (parent === control) {
922
+ isContained = true;
923
+ }
924
+ else {
925
+ let parentControl = ((parent instanceof MgControlBase) ? parent : null);
926
+ if (control.Type === MgControlType.CTRL_TYPE_COLUMN && parentControl !== null && parentControl.Type === MgControlType.CTRL_TYPE_TABLE && control.Layer === this.Layer)
927
+ isContained = true;
928
+ else
929
+ isContained = (parent.isDescendentOfControl(control));
930
+ }
931
+ }
932
+ }
933
+ return isContained;
934
+ }
935
+ updateSubformChildrenPropValue(propId, commandType, val) {
936
+ }
937
+ isChildOnCurrentLayer(child) {
938
+ let ret = true;
939
+ if (super.isChoiceControl()) {
940
+ let parentLayer = 0;
941
+ if (this.Value !== null) {
942
+ parentLayer = this.getCurrentLinkIdx() + 1;
943
+ }
944
+ let layer = child.getLayer();
945
+ if (parentLayer !== layer && layer > 0) {
946
+ ret = false;
947
+ }
948
+ }
949
+ return ret;
950
+ }
951
+ getCurrentLinkIdx() {
952
+ let currLinkIdx = 0;
953
+ if (super.isChoiceControl() || this.HasAutocomplete()) {
954
+ let currentLayers = this.getCurrentIndexOfChoice();
955
+ let currLinkIndice = this.getLinkIdxFromLayer(currentLayers);
956
+ currLinkIdx = currLinkIndice[0];
957
+ }
958
+ return currLinkIdx;
959
+ }
960
+ getLayerFromLinkIdx(indice) {
961
+ let layers = new Array(indice.length);
962
+ for (let iCtr = 0; iCtr < indice.length; iCtr = iCtr + 1) {
963
+ let idx = indice[iCtr];
964
+ layers[iCtr] = idx;
965
+ if (super.isTabControl() && idx >= 0) {
966
+ let line = this.getDisplayLine(false);
967
+ if (line < 0) {
968
+ line = 0;
969
+ }
970
+ let layerList = this._choiceLayerList.get_Item(line);
971
+ if (layerList !== null && layerList.length > 0) {
972
+ layers[iCtr] = layerList.indexOf((idx + 1).toString());
973
+ }
974
+ }
975
+ }
976
+ return layers;
977
+ }
978
+ getLinkIdxFromLayer(layers) {
979
+ let linkIndice = new Array(layers.length);
980
+ for (let iCtr = 0; iCtr < layers.length; iCtr = iCtr + 1) {
981
+ let layer = layers[iCtr];
982
+ linkIndice[iCtr] = layer;
983
+ if (super.isTabControl()) {
984
+ if (layer < 0) {
985
+ linkIndice[iCtr] = 0;
986
+ }
987
+ else {
988
+ let line = this.getDisplayLine(false);
989
+ if (line < 0) {
990
+ line = 0;
991
+ }
992
+ let layerList = this._choiceLayerList.get_Item(line);
993
+ if (layerList !== null && typeof layerList !== "undefined" && layerList.length !== 0 && layer < layerList.length) {
994
+ linkIndice[iCtr] = NNumber.Parse(layerList[layer]) - 1;
995
+ }
996
+ }
997
+ }
998
+ }
999
+ return linkIndice;
1000
+ }
1001
+ isParentPropValue(propId) {
1002
+ let column = this.Form.getControlColumn(this);
1003
+ let parent = this.getLinkedParent(true);
1004
+ let result;
1005
+ if (parent === null) {
1006
+ result = true;
1007
+ }
1008
+ else {
1009
+ if (!parent.GetComputedBooleanProperty(propId, true)) {
1010
+ result = false;
1011
+ }
1012
+ else {
1013
+ if (!parent.isChildOnCurrentLayer(this)) {
1014
+ result = false;
1015
+ }
1016
+ else {
1017
+ result = (!(column !== null && !column.GetComputedBooleanProperty(propId, true)) && parent.isParentPropValue(propId));
1018
+ }
1019
+ }
1020
+ }
1021
+ return result;
1022
+ }
1023
+ getLinkedParent(checkSubformFather) {
1024
+ if (this._linkedParentDitIdx !== -1) {
1025
+ return this.Form.getCtrl(this._linkedParentDitIdx);
1026
+ }
1027
+ else {
1028
+ if (checkSubformFather && this.Form.isSubForm()) {
1029
+ return this.Form.getSubFormCtrl();
1030
+ }
1031
+ else {
1032
+ return null;
1033
+ }
1034
+ }
1035
+ }
1036
+ SetCurrReadOnly(newVal) {
1037
+ this._currReadOnly.set_Item(this.getDisplayLine(true), newVal);
1038
+ }
1039
+ GetCurrReadOnly() {
1040
+ let line = super.isTableControl() ? 0 : this.getDisplayLine(true);
1041
+ let currObj = this._currReadOnly.get_Item(line);
1042
+ let curr;
1043
+ if (currObj === null) {
1044
+ curr = false;
1045
+ this._currReadOnly.set_Item(line, curr);
1046
+ }
1047
+ else {
1048
+ curr = currObj;
1049
+ }
1050
+ return curr;
1051
+ }
1052
+ isDataCtrl() {
1053
+ return this._dataCtrl;
1054
+ }
1055
+ getDcRef() {
1056
+ let line = this.getDcLineNum();
1057
+ let obj = this._dcTableRefs.get_Item(this.getDcLineNum());
1058
+ let dcId;
1059
+ if (obj === null) {
1060
+ dcId = -2;
1061
+ this._dcTableRefs.set_Item(line, dcId);
1062
+ }
1063
+ else {
1064
+ dcId = obj;
1065
+ }
1066
+ return dcId;
1067
+ }
1068
+ getDcLineNum() {
1069
+ return this.IsRepeatable ? this.Form.DisplayLine : 0;
1070
+ }
1071
+ optionIsValid(option) {
1072
+ let isValid = true;
1073
+ if (this.DataType === StorageAttribute.NUMERIC && option.length > 0 && option.indexOf('0') === -1) {
1074
+ let convertNum = new NUM_TYPE();
1075
+ convertNum.num_4_a_std(option);
1076
+ if (convertNum.num_is_zero()) {
1077
+ isValid = false;
1078
+ }
1079
+ }
1080
+ return isValid;
1081
+ }
1082
+ async getOrderedDispList(choiceDispList, line) {
1083
+ let choiceLayerStr = "";
1084
+ let dispArryList = new List();
1085
+ let layerArryList = new List();
1086
+ let layerProp = this.getProp(PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST);
1087
+ if (layerProp !== null) {
1088
+ choiceLayerStr = await layerProp.getValue();
1089
+ }
1090
+ if (choiceLayerStr === null || StrUtil.rtrim(choiceLayerStr).length === 0) {
1091
+ choiceLayerStr = "";
1092
+ }
1093
+ if (choiceLayerStr.length > 0 && choiceDispList.length > 0) {
1094
+ let layerList = choiceLayerStr.split(",");
1095
+ let posCopyIndex = -1;
1096
+ for (let index = 0; index < layerList.length; index = index + 1) {
1097
+ let currLayerListVal = layerList[index].trim();
1098
+ if (!(layerArryList.indexOf(currLayerListVal) !== -1)) {
1099
+ let refPosCopyIndex = new RefParam(posCopyIndex);
1100
+ let isNumber = NNumber.TryParse(currLayerListVal, refPosCopyIndex);
1101
+ posCopyIndex = refPosCopyIndex.value;
1102
+ if (isNumber && posCopyIndex > 0 && posCopyIndex <= choiceDispList.length) {
1103
+ dispArryList.push((choiceDispList[posCopyIndex - 1]).trim());
1104
+ layerArryList.push(currLayerListVal);
1105
+ }
1106
+ }
1107
+ }
1108
+ }
1109
+ let result;
1110
+ if (dispArryList.length === 0) {
1111
+ result = choiceDispList;
1112
+ this._choiceLayerList.set_Item(line, new Array(0));
1113
+ }
1114
+ else {
1115
+ result = new Array(dispArryList.length);
1116
+ for (let _ai = 0; _ai < result.length; ++_ai)
1117
+ result[_ai] = null;
1118
+ result = dispArryList.ToArray();
1119
+ this._choiceLayerList.set_Item(line, layerArryList.ToArray());
1120
+ }
1121
+ return result;
1122
+ }
1123
+ resetPrevVal() {
1124
+ let line = this.getDisplayLine(true);
1125
+ if (line < 0) {
1126
+ line = 0;
1127
+ }
1128
+ this._prevValues.set_Item(line, null);
1129
+ this.setPrevIsNull_ToNull();
1130
+ }
1131
+ setPrevIsNull_ToNull() {
1132
+ this._prevIsNulls.set_Item(this.getDisplayLine(true), null);
1133
+ }
1134
+ expressionSetAsData() {
1135
+ return this._valExpId > 0;
1136
+ }
1137
+ clearRange(line) {
1138
+ this._orgChoiceDisps.set_Item(line, null);
1139
+ this._choiceDisps.set_Item(line, null);
1140
+ this._choiceLinks.set_Item(line, null);
1141
+ this._choiceLayerList.set_Item(line, null);
1142
+ }
1143
+ haveToCheckParentValue() {
1144
+ let ret = false;
1145
+ if (this._linkedParentDitIdx !== -1) {
1146
+ if (!this.isContainedInLinkedParent()) {
1147
+ ret = true;
1148
+ }
1149
+ else {
1150
+ if (this.Form.getCtrl(this._linkedParentDitIdx).isTabControl() || this.Form.getCtrl(this._linkedParentDitIdx).isGroup()) {
1151
+ ret = true;
1152
+ }
1153
+ }
1154
+ }
1155
+ else {
1156
+ if (this.Form.isSubForm()) {
1157
+ ret = true;
1158
+ }
1159
+ }
1160
+ return ret;
1161
+ }
1162
+ isContainedInLinkedParent() {
1163
+ return this._containerDitIdx !== -1 && this._containerDitIdx === this._linkedParentDitIdx;
1164
+ }
1165
+ static combineStringArrays(firstStrings, lastStrings) {
1166
+ let result = new Array();
1167
+ if (firstStrings !== null)
1168
+ result = result.concat(firstStrings);
1169
+ if (lastStrings !== null)
1170
+ result = result.concat(lastStrings);
1171
+ return result;
1172
+ }
1173
+ GetComputedBooleanProperty(propId, defaultRetVal, line) {
1174
+ if (arguments.length === 2 && (propId === null || propId.constructor === Number) && (defaultRetVal === null || defaultRetVal.constructor === Boolean)) {
1175
+ return this.GetComputedBooleanProperty_0(propId, defaultRetVal);
1176
+ }
1177
+ return this.GetComputedBooleanProperty_1(propId, defaultRetVal, line);
1178
+ }
1179
+ GetComputedBooleanProperty_0(propId, defaultRetVal) {
1180
+ let result = defaultRetVal;
1181
+ let prop = this.GetComputedProperty(propId);
1182
+ if (prop !== null) {
1183
+ result = prop.GetComputedValueBoolean();
1184
+ }
1185
+ return result;
1186
+ }
1187
+ GetComputedBooleanProperty_1(propId, defaultRetVal, line) {
1188
+ let result = defaultRetVal;
1189
+ if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1190
+ let prop = this.GetComputedProperty(propId);
1191
+ if (prop !== null) {
1192
+ let val = prop.getPrevValue(line);
1193
+ if (val !== null) {
1194
+ result = DisplayConvertor.toBoolean(val);
1195
+ }
1196
+ }
1197
+ }
1198
+ else {
1199
+ result = this.GetComputedBooleanProperty(propId, defaultRetVal);
1200
+ }
1201
+ return result;
1202
+ }
1203
+ async checkPropWithLine(propId, defaultRetVal, line) {
1204
+ let result = defaultRetVal;
1205
+ if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1206
+ let prop = this.getProp(propId);
1207
+ if (prop !== null) {
1208
+ let val = prop.getPrevValue(line);
1209
+ if (val !== null) {
1210
+ result = DisplayConvertor.toBoolean(val);
1211
+ }
1212
+ }
1213
+ }
1214
+ else {
1215
+ result = await this.checkProp(propId, defaultRetVal);
1216
+ }
1217
+ return result;
1218
+ }
1219
+ async checkProp(propId, defaultRetVal) {
1220
+ let result = defaultRetVal;
1221
+ let prop = this.getProp(propId);
1222
+ if (prop !== null) {
1223
+ result = await prop.getValueBoolean();
1224
+ }
1225
+ return result;
1226
+ }
1227
+ isPropertyRepeatable(propId) {
1228
+ let isRepeatable = this.IsRepeatable;
1229
+ if (isRepeatable) {
1230
+ return true;
1231
+ }
1232
+ else {
1233
+ return super.isTableControl() && Property.isRepeatableInTable();
1234
+ }
1235
+ }
1236
+ async SetAndRefreshDisplayValue(mgVal, isNull) {
1237
+ let dcRangeIsEmpty = true;
1238
+ if (mgVal === null) {
1239
+ this.Value = "";
1240
+ if (!isNull)
1241
+ mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1242
+ }
1243
+ else {
1244
+ if (super.isChoiceControl()) {
1245
+ let line = this.getDisplayLine(true);
1246
+ if (line < 0) {
1247
+ line = 0;
1248
+ }
1249
+ let layers = this.getLayerFromLinkIdx(await this.getIndexOfChoice(mgVal, line, isNull));
1250
+ if (layers[0] < 0 && super.isTabControl()) {
1251
+ layers[0] = 0;
1252
+ mgVal = await this.getLinkValue(layers[0].toString(), line);
1253
+ isNull = false;
1254
+ if (this._field !== null && mgVal !== null) {
1255
+ await this._field.getTask().UpdateFieldValueAndStartRecompute(this._field, mgVal, isNull);
1256
+ }
1257
+ }
1258
+ this.Value = Misc.GetCommaSeperatedString(layers);
1259
+ dcRangeIsEmpty = false;
1260
+ }
1261
+ }
1262
+ if (dcRangeIsEmpty) {
1263
+ if (!super.isCheckBox() && (this._field === null || !isNull || !this._field.hasNullDisplayValue())) {
1264
+ try {
1265
+ if ((super.isImageControl() && this.DataType === StorageAttribute.BLOB) || super.IsImageButton()) {
1266
+ this.Value = mgVal;
1267
+ }
1268
+ else {
1269
+ if ((this._field === null && isNull) && (this.DataType === StorageAttribute.NUMERIC || this.DataType === StorageAttribute.DATE || this.DataType === StorageAttribute.TIME || this.DataType === StorageAttribute.BOOLEAN)) {
1270
+ this.Value = mgVal;
1271
+ }
1272
+ else {
1273
+ let inControl = this.InControl;
1274
+ this.Value = DisplayConvertor.Instance.mg2disp(mgVal, this._range, this._pic, true, super.isSelectionCtrl(), this.getForm().getTask().getCompIdx(), inControl);
1275
+ }
1276
+ }
1277
+ if (typeof this.Value === 'string' && (!this._pic.isAttrNumeric() || this._pic.isLeft())) {
1278
+ this.rtrimValue();
1279
+ }
1280
+ }
1281
+ catch (innerException) {
1282
+ if (innerException instanceof ApplicationException) {
1283
+ Events.WriteExceptionToLog(new ApplicationException(NString.Format("Control: '{0}', mgval: {1}", this.Name, mgVal), innerException));
1284
+ this.Value = "";
1285
+ mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1286
+ }
1287
+ else
1288
+ throw innerException;
1289
+ }
1290
+ }
1291
+ else {
1292
+ if (this.isCheckBox())
1293
+ this.Value = DisplayConvertor.toBoolean(mgVal);
1294
+ else
1295
+ this.Value = mgVal;
1296
+ }
1297
+ }
1298
+ if ((super.isImageControl() && this.DataType !== StorageAttribute.BLOB) || super.IsImageButton()) {
1299
+ mgVal = Events.TranslateLogicalName(mgVal);
1300
+ }
1301
+ this.IsNull = isNull;
1302
+ await this.RefreshDisplayValue(mgVal);
1303
+ }
1304
+ UpdateModifiedByUser(newValue) {
1305
+ if (!(super.isButton() || super.isImageControl())) {
1306
+ let ctrlCurrIsNull = this.IsNull;
1307
+ let valChanged = (this.isDifferentValue(newValue, false, false));
1308
+ if (!valChanged) {
1309
+ if (this.CanGetNullFromControlValue()) {
1310
+ valChanged = (ctrlCurrIsNull !== this.isNullValue(newValue));
1311
+ }
1312
+ }
1313
+ if (valChanged || this.KeyStrokeOn) {
1314
+ this.ModifiedByUser = true;
1315
+ }
1316
+ }
1317
+ }
1318
+ rtrimValue() {
1319
+ if ((super.isImageControl() && this.DataType === StorageAttribute.BLOB) || super.IsImageButton()) {
1320
+ this.Value = NString.TrimEnd(this.Value);
1321
+ }
1322
+ else {
1323
+ let minimumValueLength = this.getMinimumValueLength();
1324
+ if (this.Value.length > minimumValueLength) {
1325
+ let str = this.Value.substr(minimumValueLength);
1326
+ this.Value = this.Value.substr(0, minimumValueLength);
1327
+ this.Value = this.Value + StrUtil.rtrimWithNull(str, true);
1328
+ }
1329
+ if (super.isTextControl() && this.DataType === StorageAttribute.NUMERIC) {
1330
+ this.Value = NString.TrimEnd(this.Value);
1331
+ }
1332
+ }
1333
+ }
1334
+ getMinimumValueLength() {
1335
+ let minLength = this._pic.getMaskLength();
1336
+ while (minLength > 0 && !this._pic.picIsMask(minLength - 1)) {
1337
+ minLength = minLength - 1;
1338
+ }
1339
+ return minLength;
1340
+ }
1341
+ isNullValue(str) {
1342
+ let retIsNullControl = false;
1343
+ if (this.CanGetNullFromControlValue() && str === "") {
1344
+ retIsNullControl = true;
1345
+ }
1346
+ return retIsNullControl;
1347
+ }
1348
+ CanGetNullFromControlValue() {
1349
+ return false;
1350
+ }
1351
+ isChoiceNull(idx) {
1352
+ let result;
1353
+ if (idx >= 0) {
1354
+ let dcVals = this.getDcVals();
1355
+ return dcVals.isNull(idx);
1356
+ }
1357
+ else {
1358
+ return result;
1359
+ }
1360
+ }
1361
+ async ComputeAndRefreshDisplayValue(forceRefresh) {
1362
+ if (forceRefresh) {
1363
+ this.resetPrevVal();
1364
+ }
1365
+ if (this._valExpId > 0) {
1366
+ let wasEvaluated;
1367
+ let refWasEvaluated = new RefParam(wasEvaluated);
1368
+ let retExp = await this.EvaluateExpression(this._valExpId, this.DataType, this._pic.getSize(), true, StorageAttribute.SKIP, false, refWasEvaluated);
1369
+ wasEvaluated = refWasEvaluated.value;
1370
+ if (wasEvaluated) {
1371
+ await this.SetAndRefreshDisplayValue(retExp, retExp === null);
1372
+ }
1373
+ }
1374
+ else {
1375
+ if (this._field !== null) {
1376
+ let value = NString.Empty;
1377
+ let isNull = false;
1378
+ let refValue = new RefParam(value);
1379
+ let refIsNull = new RefParam(isNull);
1380
+ this._field.getTask().getFieldDisplayValue(this._field, refValue, refIsNull);
1381
+ value = refValue.value;
1382
+ isNull = refIsNull.value;
1383
+ await this.SetAndRefreshDisplayValue(value, isNull);
1384
+ }
1385
+ else {
1386
+ if (!super.isTableControl() && !super.isColumnControl()) {
1387
+ await this.RefreshDisplayValue(this.Value);
1388
+ }
1389
+ }
1390
+ }
1391
+ }
1392
+ ShouldRefreshOnControlEnter() {
1393
+ return this.Type === MgControlType.CTRL_TYPE_TEXT && this.getField() !== null && (this.getField().getType() === StorageAttribute.DATE ||
1394
+ this.getField().getType() === StorageAttribute.TIME || this.getField().getType() === StorageAttribute.NUMERIC);
1395
+ }
1396
+ async RefreshDisplayValue(mgVal) {
1397
+ let line = this.getDisplayLine(true);
1398
+ let valueChanged = true;
1399
+ let saveValueChanged = valueChanged;
1400
+ if (line < 0) {
1401
+ line = 0;
1402
+ }
1403
+ try {
1404
+ let prevValue = this._prevValues.get_Item(line);
1405
+ let prevNull = this.getPrevIsNull();
1406
+ if (StorageAttributeCheck.IsTypeAlphaOrUnicode(this.DataType)) {
1407
+ if (StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue) ||
1408
+ (mgVal !== null && StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue))) {
1409
+ valueChanged = false;
1410
+ }
1411
+ if (prevNull !== this.IsNull) {
1412
+ valueChanged = true;
1413
+ }
1414
+ }
1415
+ else {
1416
+ ;
1417
+ if (mgVal === prevValue || (mgVal !== null && mgVal === prevValue))
1418
+ valueChanged = false;
1419
+ if (prevNull !== this.IsNull)
1420
+ valueChanged = true;
1421
+ }
1422
+ this._prevValues.set_Item(line, mgVal);
1423
+ this.setPrevIsNull(this.IsNull);
1424
+ switch (this.Type) {
1425
+ case MgControlType.CTRL_TYPE_TABLE:
1426
+ case MgControlType.CTRL_TYPE_COLUMN:
1427
+ case MgControlType.CTRL_TYPE_LABEL:
1428
+ case MgControlType.CTRL_TYPE_SUBFORM:
1429
+ case MgControlType.CTRL_TYPE_GROUP:
1430
+ case MgControlType.CTRL_TYPE_STATUS_BAR:
1431
+ case MgControlType.CTRL_TYPE_FRAME_SET:
1432
+ case MgControlType.CTRL_TYPE_CONTAINER:
1433
+ case MgControlType.CTRL_TYPE_FRAME_FORM:
1434
+ case MgControlType.CTRL_TYPE_SB_LABEL:
1435
+ case MgControlType.CTRL_TYPE_LINE:
1436
+ return;
1437
+ case MgControlType.CTRL_TYPE_BROWSER:
1438
+ if (valueChanged && this.Value != null)
1439
+ this.setUrl();
1440
+ return;
1441
+ case MgControlType.CTRL_TYPE_IMAGE:
1442
+ case MgControlType.CTRL_TYPE_SB_IMAGE:
1443
+ if (valueChanged && this.Value != null)
1444
+ this.setImage();
1445
+ return;
1446
+ case MgControlType.CTRL_TYPE_CHECKBOX:
1447
+ if (valueChanged || this.forceRefresh)
1448
+ this.setCheckBoxValue(line, mgVal);
1449
+ return;
1450
+ case MgControlType.CTRL_TYPE_TAB:
1451
+ case MgControlType.CTRL_TYPE_COMBO:
1452
+ case MgControlType.CTRL_TYPE_LIST:
1453
+ saveValueChanged = valueChanged;
1454
+ valueChanged = await this.refreshAndSetItemListByDataSource(line, valueChanged);
1455
+ if (valueChanged) {
1456
+ let prevDisplayValue = null;
1457
+ if (saveValueChanged === valueChanged) {
1458
+ if (prevValue !== null) {
1459
+ prevDisplayValue = this.getLayerFromLinkIdx(await this.getIndexOfChoice(prevValue, line, prevNull));
1460
+ for (let i = 0; i < prevDisplayValue.length; i = i + 1) {
1461
+ if (prevDisplayValue[i] === GuiConstants.DEFAULT_VALUE_INT) {
1462
+ prevDisplayValue[i] = GuiConstants.DEFAULT_LIST_VALUE;
1463
+ }
1464
+ }
1465
+ }
1466
+ }
1467
+ let indice = Misc.GetIntArray(this.Value);
1468
+ if (this.isTabControl()) {
1469
+ let currentLayer = this.getCurrentLinkIdx();
1470
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedValue, indice[0].toString());
1471
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedLayer, currentLayer.toString());
1472
+ }
1473
+ if (this.IsMultipleSelectionListBox()) {
1474
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, line, indice);
1475
+ }
1476
+ else
1477
+ Commands.addValueWithLine(CommandType.SET_VALUE, this, line, +this.Value);
1478
+ }
1479
+ break;
1480
+ case MgControlType.CTRL_TYPE_BUTTON:
1481
+ case MgControlType.CTRL_TYPE_TEXT:
1482
+ if (this.HasAutocomplete())
1483
+ await this.refreshAndSetItemListByDataSource(line, valueChanged);
1484
+ if (valueChanged) {
1485
+ if (this.IsImageButton()) {
1486
+ this.setImageWithFileName(this.Value);
1487
+ }
1488
+ else
1489
+ this.setText();
1490
+ }
1491
+ else
1492
+ return;
1493
+ break;
1494
+ case MgControlType.CTRL_TYPE_RADIO:
1495
+ valueChanged = await this.refreshAndSetItemListByDataSource(line, valueChanged);
1496
+ if (!valueChanged)
1497
+ return;
1498
+ this.setRadioChecked(+this.Value);
1499
+ break;
1500
+ default:
1501
+ Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() unknown type: {0}", this.Type));
1502
+ return;
1503
+ }
1504
+ if (super.isChoiceControl() && valueChanged)
1505
+ await this.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, await this.checkProp(PropInterface.PROP_TYPE_VISIBLE, true), false);
1506
+ }
1507
+ catch (ex_360) {
1508
+ if (ex_360 instanceof Exception) {
1509
+ Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() for control: {0}", this.Name));
1510
+ }
1511
+ else
1512
+ throw ex_360;
1513
+ }
1514
+ }
1515
+ async RefreshDisplay(onlyRepeatableProps) {
1516
+ if (isNullOrUndefined(onlyRepeatableProps))
1517
+ onlyRepeatableProps = false;
1518
+ await this.RefreshDisplay_1(onlyRepeatableProps);
1519
+ }
1520
+ async RefreshDisplay_1(onlyRepeatableProps) {
1521
+ if (!(super.isSubform() && this.GetSubformMgForm() !== null && this.GetSubformMgForm().inRefreshDisplay())) {
1522
+ await this.refreshProperties(onlyRepeatableProps);
1523
+ if (this.ShouldComputeAndRefreshOnClosedForm()) {
1524
+ await this.ComputeAndRefreshDisplayValue(false);
1525
+ }
1526
+ let isParkableCtrl = !(await this.isParkable(false)) || !await this.isModifiable();
1527
+ if (this.GetCurrReadOnly() !== isParkableCtrl) {
1528
+ this.SetCurrReadOnly(isParkableCtrl);
1529
+ await Manager.SetReadOnlyControl(this, isParkableCtrl);
1530
+ }
1531
+ let mustInputProperty = this.GetComputedProperty(PropInterface.PROP_TYPE_MUST_INPUT);
1532
+ if (mustInputProperty != null && mustInputProperty.isExpression()) {
1533
+ let prevMustInput = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MUST_INPUT, false);
1534
+ if (prevMustInput !== await this.checkProp(PropInterface.PROP_TYPE_MUST_INPUT, false))
1535
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.MustInput, !prevMustInput);
1536
+ }
1537
+ else if (mustInputProperty != null) {
1538
+ let mustInputVal = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MUST_INPUT, false);
1539
+ if (mustInputVal)
1540
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.MustInput, mustInputVal);
1541
+ }
1542
+ if (!this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_TAB_IN, true))
1543
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.TabIndex, -1);
1544
+ }
1545
+ }
1546
+ ShouldComputeAndRefreshOnClosedForm() {
1547
+ return true;
1548
+ }
1549
+ async refreshProperties(onlyRepeatableProps) {
1550
+ if (this._field !== null && this.DataType !== StorageAttribute.NONE && this._firstRefreshProperties)
1551
+ Commands.addWithNumber(CommandType.SET_ATTRIBUTE, this, this.DataType.charCodeAt(0));
1552
+ if (this._propTab !== null) {
1553
+ try {
1554
+ if (this._firstRefreshProperties) {
1555
+ this.createDefaultProps();
1556
+ await this.ZoomButtonInitialization();
1557
+ }
1558
+ if (!(await this._propTab.RefreshDisplay(false, onlyRepeatableProps))) {
1559
+ Events.WriteExceptionToLog(NString.Format("Control '{0}': Not all properties could be set", this.getName()));
1560
+ }
1561
+ if (this._firstRefreshProperties) {
1562
+ if (!onlyRepeatableProps) {
1563
+ this._firstRefreshProperties = false;
1564
+ }
1565
+ }
1566
+ }
1567
+ catch (ex) {
1568
+ if (ex instanceof Exception) {
1569
+ let msg = new StringBuilder(NString.Format("Control '{0}': {1}", this.getName(), ex.Message));
1570
+ Events.WriteExceptionToLog(msg.ToString());
1571
+ }
1572
+ else
1573
+ throw ex;
1574
+ }
1575
+ }
1576
+ }
1577
+ async refreshTabForLayerList(line) {
1578
+ let currentLinkValue = null;
1579
+ if (this.getForm().Opened) {
1580
+ let indice = this.getCurrentIndexOfChoice();
1581
+ let currentLayer = indice[0];
1582
+ currentLinkValue = await this.getLinkValue(currentLayer.toString(), line);
1583
+ }
1584
+ await this.refreshAndSetItemsList(line, false);
1585
+ if (this.getForm().Opened) {
1586
+ await this.SetAndRefreshDisplayValue(currentLinkValue, this.IsNull);
1587
+ }
1588
+ }
1589
+ async refreshAndSetItemsList(line, execComputeChoice) {
1590
+ if (execComputeChoice) {
1591
+ this.clearRange(line);
1592
+ }
1593
+ let optionsStrings = await this.refreshDispRange(execComputeChoice);
1594
+ if (super.isChoiceControl() || this.HasAutocomplete()) {
1595
+ let options = optionsStrings.map((displayValue, index) => {
1596
+ return { index, displayValue };
1597
+ });
1598
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
1599
+ }
1600
+ }
1601
+ async refreshDispRange(execComputeChoice) {
1602
+ let selectCmd = new Array(0);
1603
+ let line = this.getDisplayLine(true);
1604
+ if (line < 0) {
1605
+ line = 0;
1606
+ }
1607
+ if (this.SupportsDataSource()) {
1608
+ let dataView = this.getForm().getTask().DataView;
1609
+ let dcv = dataView.getDcValues(this._dcValId);
1610
+ let dispVals = await this.getDispVals(line, execComputeChoice);
1611
+ if (this._hasValidItmAndDispVal) {
1612
+ selectCmd = MgControlBase.combineStringArrays(dispVals, dcv.getDispVals());
1613
+ }
1614
+ }
1615
+ else {
1616
+ selectCmd = await this.getDispVals(line, execComputeChoice);
1617
+ }
1618
+ this._rangeChanged = true;
1619
+ return await this.getOrderedDispList(selectCmd, line);
1620
+ }
1621
+ async refreshItmRange(execComputeChoice) {
1622
+ Debug.Assert(this.SupportsDataSource());
1623
+ let orderedItmList = new Array(0);
1624
+ let line = this.getDisplayLine(false);
1625
+ if (line < 0) {
1626
+ line = 0;
1627
+ }
1628
+ if (execComputeChoice) {
1629
+ await this.computeChoice(line);
1630
+ }
1631
+ let linkVals = this._choiceLinks.get_Item(line);
1632
+ let dataView = this.getForm().getTask().DataView;
1633
+ let dcv = dataView.getDcValues(this._dcValId);
1634
+ if (this._hasValidItmAndDispVal) {
1635
+ orderedItmList = MgControlBase.combineStringArrays(linkVals, dcv.GetLinkVals());
1636
+ }
1637
+ return await this.getOrderedDispList(orderedItmList, line);
1638
+ }
1639
+ async GetItemsRange() {
1640
+ return await this.refreshItmRange(false);
1641
+ }
1642
+ async GetDisplayRange() {
1643
+ return await this.refreshDispRange(false);
1644
+ }
1645
+ createDefaultProps() {
1646
+ this.getProp(PropInterface.PROP_TYPE_VISIBLE);
1647
+ this.getProp(PropInterface.PROP_TYPE_ENABLED);
1648
+ if (super.isTableControl()) {
1649
+ this.getProp(PropInterface.PROP_TYPE_SCROLL_BAR);
1650
+ }
1651
+ }
1652
+ setLinkedParentIdx(linkedParentDitIdx) {
1653
+ this._linkedParentDitIdx = linkedParentDitIdx;
1654
+ }
1655
+ buildPicture(oldVal, val) {
1656
+ if (super.isTableControl() || super.isColumnControl())
1657
+ return null;
1658
+ if (this._picExpExists) {
1659
+ this._vd = null;
1660
+ }
1661
+ if (this._vd === null) {
1662
+ this._vd = new ValidationDetails(oldVal, val, this._range, this._pic, this);
1663
+ }
1664
+ else {
1665
+ this._vd.setValue(val);
1666
+ this._vd.setOldValue(oldVal);
1667
+ }
1668
+ return this._vd;
1669
+ }
1670
+ isDifferentValue(newValue, isNull, checkNullValue) {
1671
+ let ctrlCurrValue = this.Value;
1672
+ let valChanged = false;
1673
+ if (newValue instanceof Date) {
1674
+ if (this.DataType === StorageAttribute.DATE)
1675
+ valChanged = !this.CompareDate(newValue, ctrlCurrValue);
1676
+ else
1677
+ valChanged = !this.CompareTime(newValue, ctrlCurrValue);
1678
+ }
1679
+ if (typeof newValue === 'boolean' || typeof newValue === 'number') {
1680
+ if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string') {
1681
+ let newValuestr = newValue.toString();
1682
+ valChanged = (newValuestr !== ctrlCurrValue);
1683
+ }
1684
+ else {
1685
+ valChanged = (newValue !== ctrlCurrValue);
1686
+ }
1687
+ }
1688
+ else {
1689
+ if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string' && Array.isArray(newValue)) {
1690
+ let newValueStr = newValue.join(',').toString();
1691
+ valChanged = !(StrUtil.rtrim(newValueStr) === StrUtil.rtrim(ctrlCurrValue));
1692
+ }
1693
+ else {
1694
+ let ctrlCurrIsNull = this.IsNull;
1695
+ valChanged = !(StrUtil.rtrim(newValue) === StrUtil.rtrim(ctrlCurrValue));
1696
+ if (!valChanged && checkNullValue) {
1697
+ valChanged = (isNull !== ctrlCurrIsNull);
1698
+ }
1699
+ }
1700
+ }
1701
+ return valChanged;
1702
+ }
1703
+ CompareDate(d1, d2) {
1704
+ let retval;
1705
+ if (d1 === null && d2 === null)
1706
+ retval = true;
1707
+ else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1708
+ retval = false;
1709
+ else if (d1.getFullYear() === d2.getFullYear()
1710
+ && d1.getDate() === d2.getDate()
1711
+ && d1.getMonth() === d2.getMonth())
1712
+ retval = true;
1713
+ return retval;
1714
+ }
1715
+ CompareTime(d1, d2) {
1716
+ let retval;
1717
+ if (d1 === null && d2 === null)
1718
+ retval = true;
1719
+ else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1720
+ retval = false;
1721
+ else if (d1.getHours() === d2.getHours()
1722
+ && d1.getMinutes() === d2.getMinutes()
1723
+ && d1.getSeconds() === d2.getSeconds())
1724
+ retval = true;
1725
+ return retval;
1726
+ }
1727
+ isColumnSortable() {
1728
+ let isSortable = false;
1729
+ if (this.Type === MgControlType.CTRL_TYPE_COLUMN && this._propTab.propExists(PropInterface.PROP_TYPE_SORT_COLUMN)) {
1730
+ isSortable = this.GetComputedProperty(PropInterface.PROP_TYPE_SORT_COLUMN).GetComputedValueBoolean();
1731
+ }
1732
+ return isSortable;
1733
+ }
1734
+ getColumnChildControl() {
1735
+ if (this.Type !== MgControlType.CTRL_TYPE_COLUMN)
1736
+ return null;
1737
+ let linkedControls = this._parentTable.getLinkedControls();
1738
+ return linkedControls.find((control) => (control.getLayer() === this.getLayer() && control.Type !== MgControlType.CTRL_TYPE_COLUMN && !control.IsTableHeaderChild));
1739
+ }
1740
+ getControlNameForHandlerSearch() {
1741
+ let childControl = this.getColumnChildControl();
1742
+ if (childControl !== null) {
1743
+ return childControl.Name;
1744
+ }
1745
+ else
1746
+ return this.Name;
1747
+ }
1748
+ linkCtrl(ctrl) {
1749
+ this._linkedControls.push(ctrl);
1750
+ }
1751
+ removeRefFromField() {
1752
+ if (this._field !== null) {
1753
+ this._field.RemoveControl(this);
1754
+ }
1755
+ }
1756
+ getDitIdx() {
1757
+ return this._ditIdx;
1758
+ }
1759
+ setDcValId(dcValId) {
1760
+ this._dcValId = dcValId;
1761
+ }
1762
+ SetKeyboardLanguage() {
1763
+ Commands.beginInvoke();
1764
+ }
1765
+ Init() {
1766
+ }
1767
+ async IsParkable() {
1768
+ return await this.isParkable(true);
1769
+ }
1770
+ HasExpOrParentTaskField() {
1771
+ let task = this.getForm().getTask();
1772
+ return (this.getField() === null || this.getField().getTask() !== task);
1773
+ }
1774
+ async isParkable(checkEnabledAndVisible) {
1775
+ let result;
1776
+ result = !super.isTableControl() && !super.isColumnControl();
1777
+ let task = this.getForm().getTask();
1778
+ if (result) {
1779
+ result = task.IsInteractive;
1780
+ }
1781
+ if (result && task.DataView.isEmptyDataview() && this._field !== null && this._field.PartOfDataview) {
1782
+ result = false;
1783
+ }
1784
+ if (result) {
1785
+ if (!super.isSubform()) {
1786
+ result = ((this._field !== null && this._field.getTask() === task) || this.isButton());
1787
+ }
1788
+ if (result && checkEnabledAndVisible) {
1789
+ result = (this.isEnabled() && this.isVisible());
1790
+ }
1791
+ if ((result && this._parentTable !== null) && checkEnabledAndVisible) {
1792
+ result = (this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true) && this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true));
1793
+ }
1794
+ }
1795
+ return result;
1796
+ }
1797
+ RaiseControlHitOnLeftClickOfMouseDown() {
1798
+ let raiseCtrlHit = false;
1799
+ if (!super.IsHyperTextButton() && !super.isRadio() && !super.isTabControl()) {
1800
+ raiseCtrlHit = true;
1801
+ }
1802
+ return raiseCtrlHit;
1803
+ }
1804
+ GetVarIndex() {
1805
+ return 0;
1806
+ }
1807
+ RaiseControlHitOnMouseDown(leftClickWasPressed) {
1808
+ let raiseCtrlHit = false;
1809
+ if (leftClickWasPressed) {
1810
+ if (this.RaiseControlHitOnLeftClickOfMouseDown()) {
1811
+ raiseCtrlHit = true;
1812
+ }
1813
+ }
1814
+ return raiseCtrlHit;
1815
+ }
1816
+ OnSubformClick() {
1817
+ Manager.EventsManager.addGuiTriggeredEventWithTaskAndCode(this.getForm().getTask(), InternalInterface.MG_ACT_HIT);
1818
+ }
1819
+ GetSubformMgForm() {
1820
+ return null;
1821
+ }
1822
+ PropertyExists(id) {
1823
+ return this._propTab.propExists(id);
1824
+ }
1825
+ toString() {
1826
+ return "{" + this.constructor.name + ": " + MgControlType[this.Type] + "}";
1827
+ }
1828
+ isDateZero(val) {
1829
+ let zeroDate = false;
1830
+ if (val instanceof Date) {
1831
+ if (val.getMonth() === 0 && val.getFullYear() === 0 && val.getDay() === 0)
1832
+ zeroDate = true;
1833
+ }
1834
+ return zeroDate;
1835
+ }
1836
+ IsDefaultRouterOutlet() {
1837
+ return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_DEFAULT_OUTLET, false));
1838
+ }
1839
+ IsRouterOutlet() {
1840
+ return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_IS_ROUTER_OUTLET, false));
1841
+ }
1842
+ async ZoomButtonInitialization() {
1843
+ if (this.isTextControl() && this.checkIfExistProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)) {
1844
+ let connectedButton = this.Form.CtrlTab.GetControlByIsn((await (await this.getProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)).getValueInt()));
1845
+ if (connectedButton) {
1846
+ let imageFileName = null;
1847
+ if (connectedButton.IsImageButton() && connectedButton.PropertyExists(PropInterface.PROP_TYPE_IMAGE_FILENAME)) {
1848
+ imageFileName = await (await connectedButton.getProp(PropInterface.PROP_TYPE_IMAGE_FILENAME)).getValue();
1849
+ if (!Misc.IsWebUrl(imageFileName))
1850
+ imageFileName = Events.GetAssetsURL() + "/images/" + imageFileName;
1851
+ Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, imageFileName);
1852
+ }
1853
+ this.ConnectedControl = connectedButton;
1854
+ connectedButton.ConnectedControl = this;
1855
+ }
1856
+ }
1857
+ }
1858
+ }
1859
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDbEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMx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LE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVuSyxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUVwQixJQUFJLGFBQWEsR0FBVyxJQUFJLENBQUM7Z0JBQ2pDLElBQUksZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztvQkFDOUcsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLGVBQWUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDekcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO3dCQUMvQixhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLFVBQVUsR0FBRyxhQUFhLENBQUM7b0JBQ3JFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFFMUcsQ0FBQztnQkFHRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO2dCQUN4QyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlcixcclxuICBpc051bGxPclVuZGVmaW5lZFxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtHdWlNZ0NvbnRyb2x9IGZyb20gJy4uLy4uL2d1aS9HdWlNZ0NvbnRyb2wnO1xyXG5pbXBvcnQge1Byb3BQYXJlbnRJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlJztcclxuaW1wb3J0IHtHdWlGaWVsZEJhc2V9IGZyb20gJy4uL2RhdGEvR3VpRmllbGRCYXNlJztcclxuaW1wb3J0IHtcclxuICBDaG9pY2VVdGlscyxcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTWFnaWNQcm9wZXJ0aWVzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBTRVFfMl9TVFIsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge01nRm9ybUJhc2V9IGZyb20gJy4vTWdGb3JtQmFzZSc7XHJcbmltcG9ydCB7UElDfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7UHJvcFRhYmxlfSBmcm9tICcuL1Byb3BUYWJsZSc7XHJcbmltcG9ydCB7VmFsaWRhdGlvbkRldGFpbHN9IGZyb20gJy4vVmFsaWRhdGlvbkRldGFpbHMnO1xyXG5pbXBvcnQge0ZpZWxkRGVmfSBmcm9tICcuLi9kYXRhL0ZpZWxkRGVmJztcclxuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSAnLi9Qcm9wZXJ0eSc7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gJy4uL3Rhc2tzL0d1aVRhc2tCYXNlJztcclxuaW1wb3J0IHtNYW5hZ2VyfSBmcm9tICcuLi8uLi9NYW5hZ2VyJztcclxuaW1wb3J0IHtDb21tYW5kVHlwZSwgSHRtbFByb3BlcnRpZXN9IGZyb20gJy4uLy4uL0d1aUVudW1zJztcclxuaW1wb3J0IHtDb21tYW5kc30gZnJvbSAnLi4vLi4vQ29tbWFuZHMnO1xyXG5pbXBvcnQge05VTV9UWVBFfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHtQcm9wSW50ZXJmYWNlfSBmcm9tICcuL1Byb3BJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHtEY1ZhbHVlcywgRU1QVFlfRENSRUZ9IGZyb20gJy4uL2RhdGEvRGNWYWx1ZXMnO1xyXG5pbXBvcnQge0d1aURhdGFWaWV3QmFzZX0gZnJvbSAnLi4vZGF0YS9HdWlEYXRhVmlld0Jhc2UnO1xyXG5pbXBvcnQge0Rpc3BsYXlDb252ZXJ0b3J9IGZyb20gJy4vRGlzcGxheUNvbnZlcnRvcic7XHJcbmltcG9ydCB7QmxvYlR5cGV9IGZyb20gJy4uL2RhdGEvQmxvYlR5cGUnO1xyXG5pbXBvcnQge1ZlY3RvclR5cGV9IGZyb20gJy4uL2RhdGEvVmVjdG9yVHlwZSc7XHJcbmltcG9ydCB7T2JqZWN0UmVmZXJlbmNlfSBmcm9tICcuLi8uLi91dGlsL09iamVjdFJlZmVyZW5jZSc7XHJcbmltcG9ydCB7R3VpQ29uc3RhbnRzfSBmcm9tICcuLi8uLi9HdWlDb25zdGFudHMnO1xyXG5pbXBvcnQge0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gJy4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7Rm9jdXNNYW5hZ2VyfSBmcm9tICcuLi8uLi9Gb2N1c01hbmFnZXInO1xyXG5cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGNvbnRyb2w+IC4uLjwvY29udHJvbD4gdGFnXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNZ0NvbnRyb2xCYXNlIGV4dGVuZHMgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciBpbXBsZW1lbnRzIFByb3BQYXJlbnRJbnRlcmZhY2Uge1xyXG5cclxuICAvLyBmaXhlZCBkZWZlY3QgIzo4MTQ5OCwgd2hpbGUgUlQgaXMgc2V0IGRlZmF1bHQgdmFsdWUgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBjb250cm9sXHJcbiAgLy8gdG8gdGhlIHZhbHVlIHdpbGwgc2V0IHRvIHRoZSBjb250cm9sXHJcblxyXG4gIF9kaXRJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfbGlua2VkQ29udHJvbHM6IExpc3Q8TWdDb250cm9sQmFzZT4gPSBudWxsOyAvLyBhcnJheSBvZiBjb250cm9scyB0aGF0IGFyZSBsaW5rZWQgdG8gdGhpcyBjb250cm9sXHJcbiAgX2ZpZWxkOiBHdWlGaWVsZEJhc2UgPSBudWxsOyAvLyByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sXHJcbiAgcHJpdmF0ZSBfcGljU3RyOiBzdHJpbmcgPSBudWxsO1xyXG4gIF9jaG9pY2VEaXNwczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCBob2xkcyB0aGVcclxuICBfY2hvaWNlTGF5ZXJMaXN0OiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIHRoZSBvcmRlciBvbiB3aGljaCB0YWJzIHRvIGJlIGRpc3BsYXllZFxyXG4gIF9jaG9pY2VMaW5rczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCBob2xkcyB0aGVcclxuICBfY2hvaWNlTnVtczogTGlzdDxOVU1fVFlQRVtdPiA9IG51bGw7ICAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCB3aXRoIG51bWVyaWNcclxuICBwcml2YXRlIF9jb250YWluZXJEaXRJZHg6IG51bWJlciA9IC0xO1xyXG4gIF9jdXJyUmVhZE9ubHk6IExpc3Q8Ym9vbGVhbj4gPSBudWxsOyAvLyBhIGhpc3RvcnkgYXJyYXkgZm9yIHJlYWRvbmx5IHBhcmFtXHJcbiAgcHJpdmF0ZSBfZGF0YUN0cmw6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVGhlIGRhdGEgY29udHJvbCBmbGFnIHN0YXRlcyB0aGF0IHRoaXNcclxuICBfZGNUYWJsZVJlZnM6IExpc3Q8bnVtYmVyPiA9IG51bGw7IC8vIHJlZmVyZW5jZXMgdG8gZGNWYWxzIGZvciBlYWNoIGxpbmUgb2YgYSBjb250cm9sIGlzIGEgZGF0YSBjb250cm9sXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWZyZXNoUHJvcGVydGllczogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfZm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzVmFsaWRJdG1BbmREaXNwVmFsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2NvbnRyb2xJc246IG51bWJlciA9IC0xOyAvLyBmb3IgY3VycmVudCBpc25cclxuXHJcbiAgcHJpdmF0ZSBfbGlua2VkUGFyZW50RGl0SWR4OiBudW1iZXIgPSAtMTsgLy8gbm90IHRyaWdnZXIgYW55IGV2ZW50IGhhbmRsZXIsIHdoaWxlIHBhcmtpbmcgaW4gdGhpcyBjb250cm9sXHJcbiAgX29yZ0Nob2ljZURpc3BzOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIGZvciBUQUIgQ29udHJvbCBzYXZlIHRoZSBvcmcgb3B0aW9uICh3aXRoIHRoZSAmKVxyXG4gIF9wYXJlbnRUYWJsZTogTWdDb250cm9sQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byBwYXJlbnQgTWFnaWMgVGFibGUgZm9yXHJcbiAgX3BpYzogUElDID0gbnVsbDtcclxuICBwcml2YXRlIF9waWNFeHBFeGlzdHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfcHJldklzTnVsbHM6IExpc3Q8Ym9vbGVhbj4gPSBudWxsOyAvLyBmb3IgTlVMTFxyXG4gIHByaXZhdGUgX3ByZXZQaWNFeHBSZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgX3ByZXZWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IG51bGw7IC8vIHJlZmVyZW5jZXMgdG8gcHJldmlvdXMgdmFsdWVzIG9mIHRoZVxyXG4gIF9wcm9wVGFiOiBQcm9wVGFibGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX3JhbmdlOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX3JhbmdlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCB0cnVlIGlmIHRoZWlyIHJhbmdlXHJcblxyXG4gIF92YWxFeHBJZDogbnVtYmVyID0gMDsgLy8gcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBleHByZXNzaW9uXHJcbiAgcHJpdmF0ZSBfdmQ6IFZhbGlkYXRpb25EZXRhaWxzID0gbnVsbDtcclxuICBwcml2YXRlIF9kY1ZhbElkOiBudW1iZXIgPSAtMjtcclxuICBwYXJlbnQ6IG51bWJlciA9IDA7XHJcbiAgdmVlSW5keDogbnVtYmVyID0gMDtcclxuICBTb3VyY2VUYWJsZVJlZmVyZW5jZTogT2JqZWN0UmVmZXJlbmNlID0gbnVsbDtcclxuICBDbGlwQm9hcmREYXRhRXhpc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgRGF0YVR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBTdG9yYWdlQXR0cmlidXRlLk5PTkU7XHJcbiAgS2V5U3Ryb2tlT246IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiB0aGUgdXNlciBwcmVzc2VkIGEga2V5XHJcbiAgTW9kaWZpZWRCeVVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBWYWx1ZTogYW55ID0gbnVsbDtcclxuICBJc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3JjZVJlZnJlc2ggOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNNb2RhbCA6IGJvb2xlYW47IC8vYXBwbGljYWJsZSBmb3Igc3ViZm9ybSwgaWYgc3ViZm9ybSBpcyBNb2RhbFxyXG5cclxuICBwcm90ZWN0ZWQgc2V0IEZvcm0odmFsdWU6IE1nRm9ybUJhc2UpIHtcclxuICAgIHRoaXMuX2Zvcm0gPSB2YWx1ZTtcclxuICAgIHRoaXMuR3VpTWdGb3JtID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9ybTtcclxuICB9XHJcblxyXG4gIGdldCBDb250cm9sSXNuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbElzbjtcclxuICB9XHJcblxyXG4gIFJlZnJlc2hPblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSwgaWYgdGhlIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWQgb24gYmVjb21lIHZpc2libGVcclxuICBJbkNvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBWYWxpZGF0ZUNvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcm9tcHRIZWxwOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLyB0aGUgcHJvbXB0IGhlbHAgdGV4dCBhc3NpZ25lZCB0byBjb250cm9sXHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU/OiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm0/OiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sPzogbnVtYmVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMSh0eXBlLCBwYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2wpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbGlua2VkQ29udHJvbHMgPSBuZXcgTGlzdDxNZ0NvbnRyb2xCYXNlPigpO1xyXG4gICAgdGhpcy5EYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMSh0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLmluaXRSZWZlcmVuY2VzKHBhcmVudE1nRm9ybSk7XHJcbiAgICB0aGlzLlR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5fY29udGFpbmVyRGl0SWR4ID0gcGFyZW50Q29udHJvbDtcclxuICAgIHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCA9IHBhcmVudENvbnRyb2w7XHJcbiAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuICAgIHRoaXMuY3JlYXRlQXJyYXlzKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGdldCBVbmlxdWVOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRhc2tUYWcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm0uZ2V0VGFzaygpLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBjaGVja0lmRXhpc3RQcm9wKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBwcm9wQnlJZDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGV4aXN0ID0gKHByb3BCeUlkICE9PSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBleGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgSWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBnZXRQcm9wKHByb3BJZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsICdDJywgdGhpcyk7XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IHRoZW4gY3JlYXRlIGEgbmV3IHByb3BlcnR5IGFuZCBnaXZlIGl0IHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgLy8gaW4gYWRkaXRpb24gYWRkIHRoaXMgcHJvcGVydHkgdG8gdGhlIHByb3BlcnRpZXMgdGFibGVcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5fcHJvcFRhYi5hZGRQcm9wKHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZm9ybSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgaXMgZmlyc3QgcmVmcmVzaFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVVuaWNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhbHdheXNFdmFsdWF0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwid2FzRXZhbHVhdGVkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV2YWx1YXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlciwgY29udGVudFR5cGVVbmljb2RlOiBib29sZWFuLCByZXNDZWxsVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgYWx3YXlzRXZhbHVhdGU6IGJvb2xlYW4sIHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5FdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQsIHJlc1R5cGUsIGxlbmd0aCwgY29udGVudFR5cGVVbmljb2RlLCByZXNDZWxsVHlwZSwgYWx3YXlzRXZhbHVhdGUsIHdhc0V2YWx1YXRlZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogU3RvcmFnZUF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2wgdGhhdCBhbHJlYWR5IHdhcyBjb21wdXRlZFxyXG4gIC8vLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjcmVhdGUgYSBwcm9wZXJ0eSBpZiBpdCBpc24ndCBleGlzdC5cclxuICAvLy8gTWF5IHdlIG5lZWQgdG8gY3JlYXRlIGEgcHJvcGVydHkgYW5kIHVzZSBpdHMgZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gSW4gUGhhc2UgMiBpbiBSZWZyZXNoUHJvcGVydGllcyBtZXRob2Qgd2UnbGwgY3JlYXRlIGFuZCBjb21wdXRlIHByb3BlcnRpZXMsXHJcbiAgLy8vIHBlcmhhcHMgd2UgbmVlZCBjcmVhdGUgYWxsIHByb3BlcnRpZXMgbm90IG9ubHkgdGhvc2UgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gZGVmYXVsdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbml0aWFsaXppbmcgb2YgaW5uZXIgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj5yZWZlcmVuY2UgdG8gdGhlIHRhc2sgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdFJlZmVyZW5jZXMobWdGb3JtOiBNZ0Zvcm1CYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLkZvcm0gPSBtZ0Zvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW4gdGhlIGZpcnN0IHRpbWUgdGhhdCB3ZSByZWZyZXNoIHRoZSBjb250cm9sIG5lZWQgdG8gY3JlYXRlIGFycmF5c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZUNyZWF0ZUFycmF5c1wiPmNyZWF0ZSBhcnJheXMgaW4gYW55IGNhc2U8L3BhcmFtPlxyXG4gIGNyZWF0ZUFycmF5cyhmb3JjZUNyZWF0ZUFycmF5czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMgfHwgZm9yY2VDcmVhdGVBcnJheXMpIHtcclxuXHJcbiAgICAgIC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIGFsd2F5cyBpbml0aWFsaXplIERDIHRhYmxlIHNpbmNlIHdlIHVzZSBpdCB0byBtZXJnZSBjaG9pY2VzIGZyb20gdGhlXHJcbiAgICAgIC8vIHByb3AgbGlzdCB3aXRoIGNob2ljZXMgZnJvbSB0aGUgREFUQSBDT05UUk9MLlxyXG4gICAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICAgIHRoaXMuX2RjVGFibGVSZWZzID0gbmV3IExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzID0gbmV3IExpc3QoKTtcclxuXHJcbiAgICAgIC8vIFRoZSBwcm9wZXJ0eSBQUk9QX1NFVF9SRUFEX09OTFkgaXMgc2V0IG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBCeSBkZWZhdWx0XHJcbiAgICAgIC8vIHRoaXMgcHJvcGVydHkgaXMgZmFsc2UsIHNvIHdlIGRvIG5vdCBzZXQgaXQuXHJcbiAgICAgIC8vIEJ1dCBmb3IgdGhlIHBoYW50b20gdGFzayBpZiB0aGlzIHByb3BlcnR5IHdhcyB0cnVlLCBhbmQgd2UgZXhpdCB0aGUgcGhhbnRvbSBhbmQgYWdhaW4gZW50ZXIgaW50b1xyXG4gICAgICAvLyB0aGlzIHBoYW50b20gdGhlIHByb3BlcnR5IGJlY29tZXMgZmFsc2UuXHJcbiAgICAgIC8vIFNvIHdlIG5lZWQgdG8gc2F2ZSB0aGUgcHJldmlvdXMgX2N1cnJSZWFkT25seSB2YWx1ZSBmb3IgdGhlIHBoYW50b20gdGFzay5cclxuICAgICAgaWYgKCFmb3JjZUNyZWF0ZUFycmF5cykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWFkT25seSA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY2hvaWNlRGlzcHMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxpbmtzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTnVtcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGxzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0ID0gbmV3IExpc3QoKTtcclxuICAgICAgaWYgKCF0aGlzLklzUmVwZWF0YWJsZSAmJiAhc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJyYXlzKDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXRzIHRoZSBmb2N1cyBvbiB0aGUgY29udHJvbCBhbmQgcmVmcmVzaGVzIHByb21wdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj5Db250cm9sIHRvIGhhdmUgZm9jdXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj5saW5lIG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVmcmVzaFByb21wdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYWN0aXZhdGVGb3JtXCI+d2hldGhlciB0byBhY3RpdmF0ZSBhIGZvcm0gYWZ0ZXIgc2V0Zm9jdXMgb3Igbm90PC9wYXJhbT5cclxuICBhc3luYyBTZXRGb2N1cyhjdHJsOiBNZ0NvbnRyb2xCYXNlLCBsaW5lOiBudW1iZXIsIGFjdGl2YXRlRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSwgY3RybCwgbGluZSwgYWN0aXZhdGVGb3JtKTtcclxuICB9XHJcblxyXG4gIEluc2VydEFycmF5cyhpZHg6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcblxyXG4gICAgdGhpcy5fY3VyclJlYWRPbmx5Lkluc2VydFJhbmdlKG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QuSW5zZXJ0UmFuZ2UoIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlTnVtcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKVxyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX3Byb3BUYWIuSW5zZXJ0UHJldlZhbHVlQXJyYXkoIGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgYXJyYXkncyBzaXplIGFjY29yZGluZyB0byB0aGUgbmV3U2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVBcnJheXMobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY3VyclJlYWRPbmx5LlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZU51bXMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgIHRoaXMuX2RjVGFibGVSZWZzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcm9wVGFiLnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlUHJldlZhbEFycmF5cyhuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb3BUYWIudXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIHBhcnNlIGlucHV0IHN0cmluZyBhbmQgZmlsbCBpbm5lciBkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj50byBwYXJlbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXRpZHhcIj5udW1iZXIgb2YgdGhlIENvbnRyb2wgaW4gQ29udHJvbCBUYWJsZTwvcGFyYW0+XHJcbiAgZmlsbERhdGEobWdGb3JtOiBNZ0Zvcm1CYXNlLCBkaXRJZHg6IG51bWJlciwgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkZvcm0gPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5pbml0UmVmZXJlbmNlcyhtZ0Zvcm0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGl0SWR4ID0gZGl0SWR4O1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGRhdGF0eXBlIGlzIEJMT0IsIGl0cyBwaWN0dXJlIHdvdWxkIGJlIGJsYW5rLiBCdXQgYWZ0ZXIgdmVyc2lvbiAjOTdcclxuICAgIC8vIG9mIEFwcFNlcmlhbGl6ZXIuY3MgKGNoYW5nZWQgZm9yICM0ODU3MjIpLCBibGFuayBwaWN0dXJlIGlzIG5vdCBzZXJpYWxpemVkLlxyXG4gICAgLy8gU28sIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgdG8gYmxhbmsgaGVyZS5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgdGhpcy5fcGljU3RyID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fcGljU3RyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLkRhdGFUeXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgIHRoaXMuc2V0UElDKHRoaXMuX3BpY1N0cik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0U6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OOlxyXG4gICAgICAgICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSlcclxuICAgICAgICAgICAgdGhpcy5EYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0dST1VQOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfU0VUOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTlRBSU5FUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJTkU6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBDb250cm9sLmZpbGxEYXRhKCk6IG1pc3NpbmcgZGF0YXR5cGUgb3IgcGljdHVyZSBzdHJpbmcgZm9yIGNvbnRyb2w6IHswfVwiLCB0aGlzLk5hbWUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgdGhpcy5Gb3JtLnNldFRhYmxlQ3RybCh0aGlzKTtcclxuICAgIH1cclxuICAgIHRoaXMuY3JlYXRlQXJyYXlzKGZhbHNlKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPm5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gaWYgbmV4dCB0YWcgaXMgaW5uZXIgdGFnPC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCkge1xyXG4gICAgICBpZiAodGhpcy5fcHJvcFRhYiA9PT0gbnVsbClcclxuICAgICAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ0MnLCBwYXJzZXIpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKVxyXG4gICAgICB0aGlzLnBhcnNlQXR0cmlidXRlcyhwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIlNvdXJjZVRhYmxlXCIpXHJcbiAgICAgIHRoaXMuUGFyc2VTb3VyY2VUYWJsZShwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIENvbnRyb2wuIEluc2VydCBlbHNlIGlmIHRvIENvbnRyb2wuaW5pdElubmVyT2JqZWN0cyBmb3IgezB9XCIsIGZvdW5kVGFnTmFtZSkpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFBhcnNlU291cmNlVGFibGUocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgIGxldCBvYmpSZWZTdHI6IHN0cmluZyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICBsZXQgc291cmNlVGFibGVSZWZlcmVuY2U6IE9iamVjdFJlZmVyZW5jZSA9IE9iamVjdFJlZmVyZW5jZS5Gcm9tWE1MKG9ialJlZlN0ci50cmltKCkpO1xyXG5cclxuICAgIHRoaXMuU291cmNlVGFibGVSZWZlcmVuY2UgPSBzb3VyY2VUYWJsZVJlZmVyZW5jZTtcclxuICAgIC8vIFNraXAgdGhlIGNsb3NpbmcgPC9wcm9wPiB0YWdcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbnRyb2wgZnJvbSB0aGUgWE1MXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHBhcnNlQXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihcIj5cIiwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcblxyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTC5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pLyonXCInKi87XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSA9IGkgKyAyKSB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGkgKyAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5TZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZVN0cik7XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgMSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIENvbnRyb2wuRmlsbE5hbWUoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHRoZSBjb250cm9sIGF0dHJpYnV0ZXMgaW4gcGFyc2luZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVFlQRTpcclxuICAgICAgICB0aGlzLlR5cGUgPSB2YWx1ZVN0clswXSBhcyBNZ0NvbnRyb2xUeXBlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0RBVEFfQ1RSTDpcclxuICAgICAgICB0aGlzLl9kYXRhQ3RybCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9MSU5LRURfUEFSRU5UOlxyXG4gICAgICAgIHRoaXMuc2V0TGlua2VkUGFyZW50SWR4KFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9DT05UQUlORVI6XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXIoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfSVNOOlxyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xJc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19NT0RBTDpcclxuICAgICAgICB0aGlzLl9pc01vZGFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfWl9PUkRFUjpcclxuICAgICAgICAvL1RPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0hPUl9BTElHTUVOVF9JU19JTkhFUklURUQ6XHJcbiAgICAgICAgLy9UT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlzVGFnUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gc2V0IHRoZSBpbWFnZSBvbiB0aGUgY29udHJvbCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmlsZU5hbWVcIj48L3BhcmFtPlxyXG4gIHNldEltYWdlKCk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gdGhpcy5WYWx1ZTtcclxuICAgIGlmIChuZXdWYWwgPT09IG51bGwgfHwgdGhpcy5Jc051bGwpIHtcclxuICAgICAgbmV3VmFsID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgLy8gVE9ETyAtIGNoZWNrIGlmIHNob3VsZCBiZSBzdXBwb3J0ZWQgLlxyXG4gICAgICAvLyBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5QUk9QX1NFVF9JTUFHRV9EQVRBLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgQmxvYlR5cGUuZ2V0Qnl0ZXMobmV3VmFsKSwgcHJvcC5nZXRWYWx1ZUludCgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldEltYWdlV2l0aEZpbGVOYW1lKG5ld1ZhbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJbWFnZVdpdGhGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZmlsZU5hbWUgPT09IG51bGwpIHtcclxuICAgICAgZmlsZU5hbWUgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgZmlsZU5hbWUgPSBFdmVudHMuVHJhbnNsYXRlTG9naWNhbE5hbWUoZmlsZU5hbWUpO1xyXG5cclxuICAgIGlmICghTWlzYy5Jc1dlYlVybChmaWxlTmFtZSkpXHJcbiAgICAgIGZpbGVOYW1lID0gRXZlbnRzLkdldEFzc2V0c1VSTCgpICtcIi9pbWFnZXMvXCIgKyBmaWxlTmFtZTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1NUWUxFLCB0aGlzLCAwLCBNYWdpY1Byb3BlcnRpZXMuSW1hZ2VGaWxlLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuSW1hZ2UsIGZpbGVOYW1lKTtcclxuICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSBsYXlvdXQgb25seSBpZiB0aGUgcmFkaW8gaXMgbm90IG9uIHRhYmxlLiBmb3IgdGFibGUsIGl0IGlzIGRvbmVcclxuICAgIC8vIGZyb20gTGdSYWRpb0NvbnRhaW5lci5zZXRTcGVjaWZpY0NvbnRyb2xQcm9wZXJ0aWVzKCkuXHJcblxyXG4gICAgLy8gaWYgKHN1cGVyLmlzUmFkaW8oKSAmJiAhdGhpcy5Jc1JlcGVhdGFibGUpIHtcclxuICAgIC8vICAgQ29tbWFuZHMuYWRkQXN5bmMoQ29tbWFuZFR5cGUuRVhFQ1VURV9MQVlPVVQsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmYWxzZSk7XHJcbiAgICAvL31cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgY29udGFpbmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbnRhaW5lcklkeFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRDb250YWluZXIoY29udGFpbmVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9IGNvbnRhaW5lcklkeDtcclxuICAgIGxldCBjb250YWluZXI6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lckRpdElkeCAhPT0gLTEpIHtcclxuICAgICAgY29udGFpbmVyID0gdGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fY29udGFpbmVyRGl0SWR4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29udGFpbmVyICE9PSBudWxsICYmIGNvbnRhaW5lci5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYWJsZSA9IGNvbnRhaW5lcjtcclxuICAgIH1cclxuICAgIHRoaXMuSXNSZXBlYXRhYmxlID0gKHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsICYmICFzdXBlci5pc0NvbHVtbkNvbnRyb2woKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBuYW1lIG9mIHRoZSBDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBpZiAodGhpcy5pc1JlcGVhdGFibGUoKSkge1xyXG4gICAgLy8gICByZXR1cm4gc3VwZXIuZ2V0TmFtZSh0aGlzLkZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExpbmtlZENvbnRyb2xzKCk6IExpc3Q8TWdDb250cm9sQmFzZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpbmtlZENvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1JlcGVhdGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1JlcGVhdGFibGU7XHJcbiAgfVxyXG5cclxuICBJc01vZGFsKCkgOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIGN1cnJlbnQgZGlzcGxheSBsaW5lIG9mIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidXNlTGluZUZvckl0ZW1zXCI+aWYgdHJ1ZSwgdXNlIGN1cnJlbnQgbGluZSBmb3IgdHJlZTwvcGFyYW0+XHJcbiAgZ2V0RGlzcGxheUxpbmUodXNlTGluZUZvckl0ZW1zOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuSXNSZXBlYXRhYmxlIHx8ICh1c2VMaW5lRm9ySXRlbXMgJiYgc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkpIHtcclxuICAgICAgbGluZSA9IHRoaXMuRm9ybS5EaXNwbGF5TGluZTtcclxuICAgIH1cclxuICAgIHJldHVybiBsaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyB2aXNpYmlsaXR5IGNvbnNpZGVyaW5nIHBhcmVudCB2aXNpYmlsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLmlzUGFyZW50UHJvcFZhbHVlKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgZW5hYmxlZCBjb25zaWRlcmluZyBwYXJlbnQgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjb250cm9sIGlzIG1vZGlmaWFibGUgYW5kIHRoZSB0YXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc01vZGlmaWFibGUoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IG1vZGlmaWFibGU6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEUsIHRydWUpO1xyXG4gICAgbGV0IHRhc2tJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWTtcclxuICAgIGxldCBtb2RpZnlJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIGZhbHNlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gbW9kaWZpYWJsZSAmJiAobW9kaWZ5SW5RdWVyeSB8fCAhdGFza0luUXVlcnkpO1xyXG4gICAgaWYgKHJlc3VsdCAmJiB0aGlzLl9maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLl9maWVsZC5EYk1vZGlmaWFibGUgfHwgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBkYyB2YWx1ZXMgb2YgdGhpcyBkYXRhIGNvbnRyb2wgZnJvbSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERjVmFscygpOiBEY1ZhbHVlcyB7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9kY1ZhbElkID09PSBFTVBUWV9EQ1JFRikge1xyXG4gICAgICBkY3YgPSAoKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gZGF0YVZpZXcuZ2V0RW1wdHlDaG9pY2VGb3JWZWN0b3JzKCkgOiBkYXRhVmlldy5nZXRFbXB0eUNob2ljZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZGNWYWxJZCA+IC0xKSB7XHJcbiAgICAgICAgZGN2ID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkY3Y7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdXJyZW50IGlzTnVsbCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBQcmV2SXNOdWxsIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldFByZXZJc051bGwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBjdXJyT2JqOiBhbnkgPSB0aGlzLl9wcmV2SXNOdWxscy5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBjdXJyOiBib29sZWFuO1xyXG4gICAgaWYgKGN1cnJPYmogPT09IG51bGwpIHtcclxuICAgICAgY3VyciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbShsaW5lLCBjdXJyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdXJyID0gPGJvb2xlYW4+Y3Vyck9iajtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHByZXZJc051bGwgdmFsdWUgb2YgdGhlIHByZXZJc051bGwgYXJyYXlcclxuICAvLy8gICB0aGUgbmV3VmFsdWUgY2FuIGJlIE5VTEwgb3IgYm9vbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0PC9wYXJhbT5cclxuICBzZXRQcmV2SXNOdWxsKG5ld1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBuZXdWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPjwvcGFyYW0+XHJcbiAgc2V0UElDKHBpY1N0cjogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gZm9yIHB1c2ggYnV0dG9uLCB0cmFuc2xhdGUgdGhlIGZvcm1hdC5cclxuICAgIGlmIChzdXBlci5pc0J1dHRvbigpKSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IChzdXBlci5Jc0ltYWdlQnV0dG9uKCkgPyBcIlwiICsgWE1MQ29uc3RhbnRzLkZJTEVfTkFNRV9TSVpFLnRvU3RyaW5nKCkgOiBFdmVudHMuVHJhbnNsYXRlKHBpY1N0cikpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IHBpY1N0cjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BpYyA9IG5ldyBQSUModGhpcy5fcGljU3RyLCB0aGlzLkRhdGFUeXBlLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZGF0YUN0cmwgJiYgdGhpcy5fcGljU3RyLmluZGV4T2YoJ0gnKSA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX3BpYy5zZXRIZWJyZXcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHBpY3R1cmUgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUElDIHJlZmVyZW5jZTwvcmV0dXJucz5cclxuICBnZXRQSUMoKTogUElDIHtcclxuICAgIGlmICh0aGlzLl9waWNFeHBFeGlzdHMpXHJcbiAgICAgIHRoaXMuX3BpYy5zZXRGb3JtYXRFeHAodGhpcy5fcGljRXhwRXhpc3RzKTtcclxuICAgIHJldHVybiB0aGlzLl9waWM7XHJcbiAgfVxyXG5cclxuXHJcbi8vLyA8cmV0dXJucz4gdGhlIHBhcmVudCBvZiB0aGUgY29udHJvbCBjYW4gYmUgVGFibGVcXFRhYlxcQ2hvaWNlIGNvbnRyb2xcXEZvcm08L3JldHVybnM+XHJcbiAgZ2V0UGFyZW50KCk6IGFueSB7XHJcbiAgICBsZXQgcmV0UGFyZW50OiBhbnkgPSB0aGlzLkZvcm07XHJcbiAgICBpZiAodGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9jb250YWluZXJEaXRJZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFBhcmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmaWVsZCBhdHRhY2hlZCB0byB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RmllbGQoKTogR3VpRmllbGRCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9maWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sIGJ5IHRoZSBmaWVsZCBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRcIj48L3BhcmFtPlxyXG4gIHNldEZpZWxkKGZpZWxkT3JGaWVsZFN0cklEOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChmaWVsZE9yRmllbGRTdHJJRCA9PT0gbnVsbCB8fCBmaWVsZE9yRmllbGRTdHJJRCBpbnN0YW5jZW9mIEd1aUZpZWxkQmFzZSkge1xyXG4gICAgICB0aGlzLnNldEZpZWxkXzAoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEZpZWxkXzEoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc2V0RmllbGRfMChmaWVsZDogR3VpRmllbGRCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWVsZCA9IGZpZWxkO1xyXG4gICAgaWYgKGZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0IHRoZSBmaWVsZCBvZiB0aGUgY29udHJvbCBieSBhIHN0cmluZyBmaWVsZCBpZGVudGlmaWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+dGhlIGZpZWxkIGlkZW50aWZpZXI6IFwicGFyZW50SWQsZmllbGRJZHhcIi9wYXJhbT5cclxuICBwcml2YXRlIHNldEZpZWxkXzEoZmllbGRTdHJJRDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcmV0dXJuRmllbGQ6IEd1aUZpZWxkQmFzZSA9IHRoaXMuZ2V0RmllbGRCeVZhbHVlU3RyKGZpZWxkU3RySUQpO1xyXG4gICAgaWYgKHJldHVybkZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkID0gcmV0dXJuRmllbGQ7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIENvbnRyb2wuc2V0RmllbGQoKTogaWxsZWdhbCBmaWVsZCBpZGVudGlmaWVyOiBcIiArIGZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcGljdHVyZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JtYXRcIj50aGUgZm9ybWF0IHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJleHBJZFwiPmFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm1hdDwvcGFyYW0+XHJcbiAgc2V0UGljU3RyKGZvcm1hdDogc3RyaW5nLCBleHBJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9waWNTdHIgPSBmb3JtYXQ7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgICAgdGhpcy5fcGljRXhwRXhpc3RzID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSByYW5nZSBvZiB0aGUgY29udHJvbCBhbmQgY2xlYXJzIHRoZSBtYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1JhbmdlXCI+aXMgdGhlIG5ldyByYW5nZTwvcGFyYW0+XHJcbiAgc2V0UmFuZ2UobmV3UmFuZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmFuZ2UgPSBuZXdSYW5nZTtcclxuICAgIHRoaXMuX3ZkID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXhwSWRcIj5hIHJlZmVyZW5jZSB0byB0aGUgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgc2V0VmFsRXhwKGV4cElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZhbEV4cElkID0gZXhwSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGNvcHkgb2YgdmFsaWRhdGlvbiBkZXRhaWxzIHdpdGggbmV3ICYgb2xkIHZhbHVlIHdpdGhvdXQgY2hhbmdpbmcgcmVhbCB2YWxpZGF0aW9uIGRldGFpbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkVmFsXCI+dmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsXCI+dmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIGJ1aWxkQ29weVBpY3R1cmUob2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkgfHwgc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGNvcHlWRDogVmFsaWRhdGlvbkRldGFpbHMgPSB0aGlzLmdldENvcHlPZlZEKCk7XHJcbiAgICAgIGNvcHlWRC5zZXRWYWx1ZShuZXdWYWwpO1xyXG4gICAgICBjb3B5VkQuc2V0T2xkVmFsdWUob2xkVmFsKTtcclxuICAgICAgcmV0dXJuIGNvcHlWRDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBjb3B5IG9mIHZhbGlkYXRpb24gZGV0YWlscywgd2l0aG91dCBpbmZsdWVuY2UgdG8gdGhlIHJlYWwgdmFsaWRhdGlvbiBkZXRhaWxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldENvcHlPZlZEKCk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIGxldCByZXN1bHQ6IFZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgaWYgKHRoaXMuX3ZkID09PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uRGV0YWlscyh0aGlzLlZhbHVlLCB0aGlzLlZhbHVlLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0aGlzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHModGhpcy5fdmQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSYW5nZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9yYW5nZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmFuZ2VkIHZhbHVlIGZvciBpbnB1dCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmFuZ2VkVmFsdWUobmV3VmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICB2ZCA9IHRoaXMuYnVpbGRQaWN0dXJlKHRoaXMuVmFsdWUsIG5ld1ZhbCk7XHJcbiAgICB2ZC5ldmFsdWF0ZSgpO1xyXG5cclxuICAgIC8vIHVzZXIgaGFzIG1vZGlmaWVkIHZhbHVlLCBzbyB3ZSBhcmUgaGVyZSAuLi5Nb2RpZmllZEJ5VXNlciBzaG91bGQgYmUgc2V0IHRvIHRydWVcclxuICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcyB2YWx1ZSB3YXMgd3JvbmdcclxuICAgIGxldCB2YWw6IGFueSAgPSB2ZC5nZXREaXNwVmFsdWUoKVxyXG4gICAgcmV0dXJuICh2YWwudG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgdXNlciBpbnB1dFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdmFsaWRhdGUobmV3VmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICBsZXQgbW9kaWZpZWQ6IGJvb2xlYW4gPSB0aGlzLk1vZGlmaWVkQnlVc2VyO1xyXG4gICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICB2ZCA9IHRoaXMuYnVpbGRQaWN0dXJlKHRoaXMuVmFsdWUsIG5ld1ZhbCk7XHJcbiAgICB2ZC5ldmFsdWF0ZSgpO1xyXG4gICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IG1vZGlmaWVkO1xyXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcyB2YWx1ZSB3YXMgd3JvbmdcclxuICAgIGlmICh2ZC5WYWxpZGF0aW9uRmFpbGVkKVxyXG4gICAgICByZXR1cm4gdmQuRXJyb3JNZXNzYWdlO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RmllbGRCeVZhbHVlU3RyKHZhbHVlU3RyOiBzdHJpbmcpOiBHdWlGaWVsZEJhc2Uge1xyXG5cclxuICAgIGxldCByZWZQYXJlbnQ6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPih0aGlzLnBhcmVudCk7XHJcbiAgICBsZXQgcmVmVmVlSW5keDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KHRoaXMudmVlSW5keCk7XHJcbiAgICBsZXQgcmV0OiBHdWlGaWVsZEJhc2UgPSA8R3VpRmllbGRCYXNlPnRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHIsIHJlZlBhcmVudCwgcmVmVmVlSW5keCk7XHJcbiAgICB0aGlzLnBhcmVudCA9IHJlZlBhcmVudC52YWx1ZTtcclxuICAgIHRoaXMudmVlSW5keCA9IHJlZlZlZUluZHgudmFsdWU7XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBoYXMgY29udGFpbmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGhhc0NvbnRhaW5lcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgbGF5ZXIgb2YgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRMYXllcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuTGF5ZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZXMgdGhlIHBpYyB1c2luZyB0aGUgcmVzdWx0IG9mIHRoZSBmb3JtYXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNFeHBSZXN1bHRcIj50aGUgcmVzdWx0IG9mIHRoZSBmb3JtYXQgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBQSUMgcmVmZXJlbmNlIDwvcmV0dXJucz5cclxuICBjb21wdXRlUElDKHBpY0V4cFJlc3VsdDogc3RyaW5nKTogUElDIHtcclxuICAgIC8vIGZvciBwdXNoIGJ1dHRvbiwgdHJhbnNsYXRlIHRoZSBmb3JtYXQuXHJcbiAgICBsZXQgcGljUmVzdWx0OiBzdHJpbmcgPSAocGljRXhwUmVzdWx0ICE9PSBudWxsICYmIHN1cGVyLmlzQnV0dG9uKCkpID8gRXZlbnRzLlRyYW5zbGF0ZShwaWNFeHBSZXN1bHQpIDogcGljRXhwUmVzdWx0O1xyXG5cclxuICAgIC8vIGNvbnN0cnVjdCBhIG5ldyBwaWN0dXJlIG9ubHkgaWYgdGhlIGV4cHJlc3Npb24gcmVzdWx0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBwcmV2aW91cyByZXN1bHRcclxuICAgIGlmICh0aGlzLl9wcmV2UGljRXhwUmVzdWx0ID09PSBudWxsIHx8ICEodGhpcy5fcHJldlBpY0V4cFJlc3VsdCA9PT0gcGljUmVzdWx0KSkge1xyXG4gICAgICB0aGlzLl9waWMgPSBuZXcgUElDKHBpY1Jlc3VsdCwgdGhpcy5EYXRhVHlwZSwgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgIHRoaXMuX3ByZXZQaWNFeHBSZXN1bHQgPSBwaWNSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fcGljO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXRzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaG9pY2UgaW4gdGhlIGNob2ljZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+aW5kZXggb2YgdGhlIGN1cnJlbnQgY2hvaWNlPC9yZXR1cm5zPlxyXG4gIGdldEN1cnJlbnRJbmRleE9mQ2hvaWNlKCk6IG51bWJlcltdIHtcclxuICAgIGxldCBzZWxlY3RlZEluZGljZTogbnVtYmVyW10gPSBbLTFdO1xyXG5cclxuICAgIGxldCB2YWw6IHN0cmluZyA9IHRoaXMuVmFsdWU7XHJcblxyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkodmFsKSkge1xyXG4gICAgICBsZXQgYXJyYXkyOiBzdHJpbmdbXSA9IHZhbC5zcGxpdCgnLCcvKicsJyovKTtcclxuICAgICAgc2VsZWN0ZWRJbmRpY2UgPSBuZXcgQXJyYXk8bnVtYmVyPihhcnJheTIubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGFycmF5Mi5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICAgIGxldCBudW06IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoYXJyYXkyW2lDdHJdKTtcclxuICAgICAgICBzZWxlY3RlZEluZGljZVtpQ3RyXSA9ICgobnVtID49IDApID8gbnVtIDogLTEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRJbmRpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpcyBtdWx0aSBzZWxlY3Rpb24gbGlzdCBib3ggZWxzZSBmYWxzZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc3VwZXIuaXNMaXN0Qm94KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBjb250cm9sIHBpY3R1cmUgaXMgZGF0ZSBvciB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzRGF0ZVRpbWVQaWN0dXJlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BpYy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9waWMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGhpcyBjb250cm9sIHN1cHBvcnQgZGF0YSBzb3VyY2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU3VwcG9ydHNEYXRhU291cmNlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpIHx8IHN1cGVyLmlzUmFkaW8oKSB8fCB0aGlzLkhhc0F1dG9jb21wbGV0ZSgpIDtcclxuICB9XHJcblxyXG4gIEhhc0F1dG9jb21wbGV0ZSgpIHtcclxuICAgIGlmIChzdXBlci5pc1RleHRDb250cm9sKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19DT01QTEVURV9NT0RFX1dDKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBhcnJheSBvZiBpbmRpY2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBzcGVjaWZpYyBsaW5rIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIHJlcXVlc3RlZCB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc051bGxcIj50cnVlIGlmIG1nVmFsIHJlcHJlc2VudHMgYSBudWxsIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGFycmF5IG9mIGluZGljZTwvcmV0dXJucz5cclxuICBhc3luYyBnZXRJbmRleE9mQ2hvaWNlKG1nVmFsOiBzdHJpbmcsIGxpbmU6IG51bWJlciwgaXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTxudW1iZXJbXT4ge1xyXG5cclxuICAgIC8vIGlmIHRoZSBjb250cm9sIGlzIGxpc3Rib3ggd2l0aCBzaW5nbGUgc2VsZWN0aW9uIG1vZGUsIGFuZCB0aGUgdmFsdWUgaXMgY29tbWEgc2VwYXJhdGVkLCB0aGVuIHdlIHNob3VsZCBub3Qgc3BsaXQgdmFsdWUgb24gY29tbWEuXHJcbiAgICBsZXQgc3BsaXRDb21tYVNlcGVyYXRlZFZhbHM6IGJvb2xlYW4gPSB0aGlzLklzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG5cclxuICAgIGxldCBpc1ZlY3RvclZhbHVlOiBib29sZWFuID0gdGhpcy5nZXRGaWVsZCgpICE9PSBudWxsICYmIHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREY1ZhbHMoKS5nZXRJbmRleE9mKG1nVmFsLCBpc1ZlY3RvclZhbHVlLCBpc051bGwsIHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpLCB0aGlzLl9jaG9pY2VOdW1zLmdldF9JdGVtKGxpbmUpLCBzcGxpdENvbW1hU2VwZXJhdGVkVmFscyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHBhcnNlZCBjb250ZW50IG9mIFBST1BfVFlQRV9ESVNQTEFZX0xJU1Q8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0RGlzcFZhbHMobGluZTogbnVtYmVyLCBleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX29yZ0Nob2ljZURpc3BzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jaG9pY2VEaXNwcy5nZXRfSXRlbShsaW5lKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBlbXB0eUNob2ljZShsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB2YWx1ZTogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigwKTtcclxuICAgIHRoaXMuX2Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZXMgdGhlIGNob2ljZXMgb2YgYSBTRUxFQ1QgY29udHJvbCB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoZSBjb250cm9sJ3MgcHJvcGVydGllcyAoaW4gY29udHJhc3QgdG9cclxuICAvLy8gICB0aGUgb25lcyBvcmlnaW5hdGluZyBmcm9tIHRoZSB1bmRlcmxheWluZyB0YWJsZSBvZiBhIGRhdGEgY29udHJvbClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgY29tcHV0ZUNob2ljZShsaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmcm9tSGVscDogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiXFxcXFxcXFxcIiwgXCJcXFxcLVwiLCBcIlxcXFwsXCJcclxuICAgIF07XHJcbiAgICBsZXQgdG9IZWxwOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJYWFwiLCBcIlhYXCIsIFwiWFhcIlxyXG4gICAgXTtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGFzay5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICBsZXQgY3VyckRjSWQ6IG51bWJlciA9IHRoaXMuZ2V0RGNSZWYoKTtcclxuICAgIGxldCBjaG9pY2VEaXNwU3RyOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGNob2ljZUxpbmtTdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgb3B0aW9uc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCB0cmltVG9MZW5ndGg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGRhdGFUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5EYXRhVHlwZTtcclxuICAgIGxldCBpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIC8vIHJlLWNvbXB1dGUgdmFsdWVzIG9ubHkgaWYgdGhleSBhcmUgbm90IHZhbGlkIG9yIHRoZSBEQyB3YXMgY2hhbmdlZCAoZHVlIHRvSGVscCByZWNvbXB1dGUpXHJcbiAgICAgIGlmICh0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKSA9PT0gbnVsbCB8fCAodGhpcy5pc0RhdGFDdHJsKCkgJiYgY3VyckRjSWQgIT09IHRoaXMuX2RjVmFsSWQpKSB7XHJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgICAgICBkYXRhVHlwZSA9IHRoaXMuZ2V0RmllbGQoKS5nZXRDZWxsc1R5cGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRpc3BWYWxzOiBzdHJpbmdbXSA9IGRjdi5nZXREaXNwVmFscygpO1xyXG4gICAgICAgIGxldCBkaXNwUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9MSVNUKTtcclxuICAgICAgICBsZXQgbGlua1Byb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKTtcclxuICAgICAgICBpZiAoZGlzcFByb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgIGNob2ljZURpc3BTdHIgPSBhd2FpdCBkaXNwUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGlua1Byb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgIGNob2ljZUxpbmtTdHIgPSBhd2FpdCBsaW5rUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hvaWNlTGlua1N0ciA9PT0gbnVsbCB8fCBTdHJVdGlsLnJ0cmltKGNob2ljZUxpbmtTdHIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgY2hvaWNlTGlua1N0ciA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaG9pY2VEaXNwU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlRGlzcFN0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaXNEYXRhQ3RybCgpIHx8IGRpc3BWYWxzID09PSBudWxsIHx8IGRpc3BWYWxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gY2hvaWNlTGlua1N0cjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gKGNob2ljZUxpbmtTdHIgPSBcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaG9pY2VEaXNwU3RyID0gRXZlbnRzLlRyYW5zbGF0ZShjaG9pY2VEaXNwU3RyKTtcclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykge1xyXG4gICAgICAgICAgY2hvaWNlTGlua1N0ciA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShjaG9pY2VMaW5rU3RyLCBcIlxcXFwtXCIsIFwiLVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGhlbHBTdHI6IHN0cmluZyA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShjaG9pY2VMaW5rU3RyLCBmcm9tSGVscCwgdG9IZWxwKTtcclxuICAgICAgICBsZXQgc1Rvazogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGhlbHBTdHIsIFwiLFwiKTtcclxuICAgICAgICBsZXQgbGlua1NpemU6IG51bWJlciA9IChoZWxwU3RyICE9PSBcIlwiKSA/IHNUb2subGVuZ3RoIDogMDtcclxuICAgICAgICBsZXQgaGVscFN0ckRpc3A6IHN0cmluZyA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShjaG9pY2VEaXNwU3RyLCBmcm9tSGVscCwgdG9IZWxwKTtcclxuICAgICAgICBzVG9rID0gU3RyVXRpbC50b2tlbml6ZShoZWxwU3RyRGlzcCwgXCIsXCIpO1xyXG4gICAgICAgIGxldCBkaXNwbGF5U2l6ZTogbnVtYmVyID0gKGhlbHBTdHJEaXNwICE9PSBcIlwiKSA/IHNUb2subGVuZ3RoIDogMDtcclxuXHJcbiAgICAgICAgaWYgKGxpbmtTaXplICE9PSBkaXNwbGF5U2l6ZSAmJiBkaXNwbGF5U2l6ZSA+IDApIHtcclxuICAgICAgICAgIGNob2ljZURpc3BTdHIgPSBjaG9pY2VMaW5rU3RyO1xyXG4gICAgICAgICAgaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXIgPSBsaW5rU2l6ZTtcclxuICAgICAgICBsZXQgY2hvaWNlTGluazogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihzaXplKTtcclxuICAgICAgICB0aGlzLl9jaG9pY2VMaW5rcy5zZXRfSXRlbShsaW5lLCBjaG9pY2VMaW5rKTtcclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCBkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgICAgIHRoaXMuX2Nob2ljZU51bXMuc2V0X0l0ZW0obGluZSwgbmV3IEFycmF5PE5VTV9UWVBFPihzaXplKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgZGlzcGxheSB2YWx1ZXNcclxuICAgICAgICBsZXQgb3JnQ2hvaWNlRGlzcDogc3RyaW5nW10gPSBDaG9pY2VVdGlscy5HZXREaXNwbGF5TGlzdEZyb21TdHJpbmcoY2hvaWNlRGlzcFN0ciwgZmFsc2UsIHRydWUsICFpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0KTtcclxuICAgICAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBvcmdDaG9pY2VEaXNwKTtcclxuICAgICAgICBsZXQgY2hvaWNlRGlzcDogc3RyaW5nW10gPSBDaG9pY2VVdGlscy5HZXREaXNwbGF5TGlzdEZyb21TdHJpbmcoY2hvaWNlRGlzcFN0ciwgc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCkgfHwgc3VwZXIuaXNUYWJDb250cm9sKCksIHRydWUsICFpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0KTtcclxuICAgICAgICB0aGlzLl9jaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBjaG9pY2VEaXNwKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRGaWVsZCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0cmltVG9MZW5ndGggPSB0aGlzLmdldEZpZWxkKCkuZ2V0U2l6ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGxldCB0b2tlbjogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICBsZXQgaGVscFRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGxldCB0b2tlbkJ1ZmZlcjogU3RyaW5nQnVpbGRlcjtcclxuICAgICAgICAvLyBBZGQgbGluayB2YWx1ZXMuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgY3VyclBvczogbnVtYmVyID0gMCwgbmV4dFBvcyA9IDA7IGkgPCBzaXplICYmIG9wdGlvbnNWYWxpZDsgaSsrKSB7XHJcbiAgICAgICAgICBuZXh0UG9zID0gY3VyclBvcztcclxuICAgICAgICAgIG5leHRQb3MgPSBoZWxwU3RyLmluZGV4T2YoJywnLCBuZXh0UG9zKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV4dFBvcyA9PT0gY3VyclBvcylcclxuICAgICAgICAgICAgdG9rZW4gPSBoZWxwVG9rZW4gPSBcIlwiO1xyXG4gICAgICAgICAgZWxzZSBpZiAobmV4dFBvcyA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdG9rZW4gPSBjaG9pY2VMaW5rU3RyLnN1YnN0cihjdXJyUG9zKTtcclxuICAgICAgICAgICAgaGVscFRva2VuID0gaGVscFN0ci5zdWJzdHIoY3VyclBvcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdG9rZW4gPSBjaG9pY2VMaW5rU3RyLnN1YnN0cihjdXJyUG9zLCAobmV4dFBvcykgLSAoY3VyclBvcykpO1xyXG4gICAgICAgICAgICBoZWxwVG9rZW4gPSBoZWxwU3RyLnN1YnN0cihjdXJyUG9zLCAobmV4dFBvcykgLSAoY3VyclBvcykpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGN1cnJQb3MgPSBuZXh0UG9zICsgMTtcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk1FTU86XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICAgICAgdG9rZW4gPSBTdHJVdGlsLmx0cmltKHRva2VuKTtcclxuICAgICAgICAgICAgICBoZWxwVG9rZW4gPSBTdHJVdGlsLmx0cmltKGhlbHBUb2tlbik7XHJcbiAgICAgICAgICAgICAgaWYgKGhlbHBUb2tlbi5pbmRleE9mKCdcXFxcJykgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5CdWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdG9rZW5Qb3M6IG51bWJlciA9IDA7IHRva2VuUG9zIDwgaGVscFRva2VuLmxlbmd0aDsgdG9rZW5Qb3MrKylcclxuICAgICAgICAgICAgICAgICAgaWYgKGhlbHBUb2tlblt0b2tlblBvc10gIT09ICdcXFxcJylcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbkJ1ZmZlci5BcHBlbmQodG9rZW5bdG9rZW5Qb3NdKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5Qb3MgPT09IGhlbHBUb2tlbi5sZW5ndGggLSAxKVxyXG4gICAgICAgICAgICAgICAgICAgIHRva2VuQnVmZmVyLkFwcGVuZCgnICcpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5CdWZmZXIuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdG9rZW4gPSBTdHJVdGlsLm1ha2VQcmludGFibGVUb2tlbnModG9rZW4sIFNFUV8yX1NUUik7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25DdHJsKCkgfHwgdGhpcy5pc1RhYkNvbnRyb2woKSlcclxuICAgICAgICAgICAgICAgIHRva2VuID0gQ2hvaWNlVXRpbHMuUmVtb3ZlQWNjbENoYXJGcm9tT3B0aW9ucyhuZXcgU3RyaW5nQnVpbGRlcih0b2tlbikpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBjaG9pY2VMaW5rIHNpemUgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBzaXplIG9mIHRoZSBmaWVsZCwgc28gdHJpbSBpdC5cclxuICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyaW1Ub0xlbmd0aCAhPT0gLTEgJiYgVXRpbFN0ckJ5dGVNb2RlLmxlbkIodG9rZW4pID4gdHJpbVRvTGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICB0b2tlbiA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0b2tlbiwgdHJpbVRvTGVuZ3RoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpbVRvTGVuZ3RoICE9PSAtMSAmJiB0b2tlbi5sZW5ndGggPiB0cmltVG9MZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKDAsIHRyaW1Ub0xlbmd0aCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjaG9pY2VMaW5rW2ldID0gdG9rZW47XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgICAgIGxldCBwaWN0dXJlOiBQSUMgPSBQSUMuYnVpbGRQaWN0dXJlKGRhdGFUeXBlLCB0b2tlbiwgdGFzay5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgICAgICBvcHRpb25zVmFsaWQgPSB0aGlzLm9wdGlvbklzVmFsaWQodG9rZW4pO1xyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRpc3AybWcodG9rZW4udHJpbSgpLCBwaWN0dXJlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRDb21wSWR4KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgICAgICAgICAgKCh0aGlzLl9jaG9pY2VOdW1zLmdldF9JdGVtKGxpbmUpKSlbaV0gPSBuZXcgTlVNX1RZUEUoY2hvaWNlTGlua1tpXSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAgICAgICBjaG9pY2VMaW5rW2ldID0gKDEgLSBpKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb3B0aW9uc1ZhbGlkKVxyXG4gICAgICAgICAgdGhpcy5lbXB0eUNob2ljZShsaW5lKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgb3B0aW9uc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lbXB0eUNob2ljZShsaW5lKTtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfVwiLCBleC5HZXRUeXBlKCksIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9oYXNWYWxpZEl0bUFuZERpc3BWYWwgPSBvcHRpb25zVmFsaWQ7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHRvcG1vc3QgZm9ybSBvZiB0aGUgc3ViZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUb3BNb3N0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUb3BNb3N0Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlIHVybCBvbiBicm93c2VyIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0VXJsKCk6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIDAsIHRoaXMuVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIGluIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNvbnRyb2wgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbFwiPnRoZSBkaXNwbGF5ZWQgdmFsdWUgd2l0aCB0aGUgbWFza2luZyBjaGFyYWN0ZXJzPC9wYXJhbT5cclxuICBhc3luYyBnZXRNZ1ZhbHVlKGRpc3BWYWw6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzQ2hlY2tCb3goKSkge1xyXG4gICAgICBtZ1ZhbCA9IGRpc3BWYWwgPyBcIjFcIiA6IFwiMFwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSB8fCBzdXBlci5pc1JhZGlvKCkpIHtcclxuXHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmIChsaW5lIDwgMClcclxuICAgICAgICAgIGxpbmUgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3BWYWwgPT09IFwibnVtYmVyXCIpXHJcbiAgICAgICAgICBkaXNwVmFsID0gZGlzcFZhbC50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkaXNwVmFsKSlcclxuICAgICAgICAgIGRpc3BWYWwgPSBkaXNwVmFsLmpvaW4oJywnKS50b1N0cmluZygpO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKGRpc3BWYWwgPT09IFwiXCIpIHtcclxuICAgICAgICAgIG1nVmFsID0gZGlzcFZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGF3YWl0IHRoaXMuZ2V0TGlua1ZhbHVlKGRpc3BWYWwsIGxpbmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWdWYWwgPT09IG51bGwpIHtcclxuICAgICAgICAgIC8vIFRoZSBkYXRhIGNvbnRyb2wgd2lsbCBuZXZlciByZXR1cm4gYW4gaWxsZWdhbCB2YWx1ZSBhcyBhIHJlc3VsdCBvZiBhIHVzZXIgc2VsZWN0aW9uXHJcbiAgICAgICAgICAvLyBidXQgYXMgYSByZXN1bHQgb2YgYW4gaW5pdCBleHByZXNzaW9uLCB1cGRhdGUgb3BlcmF0aW9uIG9yIHZhbHVlcyBvZiBkYXRhIGluXHJcbiAgICAgICAgICAvLyB0aGUgcmVjb3JkLiBUaGVyZWZvcmUsIHRoZSBzYW1lIGlsbGVnYWwgdmFsdWUgc2hvdWxkIGJlIHRha2VuIGZyb20gaXRzIHNvdXJjZSxcclxuICAgICAgICAgIC8vIHdoaWNoIGlzIGEgZmllbGQgb3IgYW4gZXhwcmVzc2lvbi4gKEVodWQgMTktanVuLTIwMDEpXHJcbiAgICAgICAgICBsZXQgcmVmTWdWYWw6IFJlZlBhcmFtPHN0cmluZz4gPSBuZXcgUmVmUGFyYW08c3RyaW5nPihtZ1ZhbCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWdWYWwgPSByZWZNZ1ZhbC52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGJsb2JDb250ZW50VHlwZTogc3RyaW5nID0gKHRoaXMuX2ZpZWxkICE9PSBudWxsKSA/IHRoaXMuX2ZpZWxkLmdldENvbnRlbnRUeXBlKCkgOiBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTjtcclxuICAgICAgICBtZ1ZhbCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyhkaXNwVmFsLCB0aGlzLl9waWMsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGJsb2JDb250ZW50VHlwZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtZ1ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIGZvciBpbmRpY2UgcGFzc2VkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VsZWN0ZWRJbmRpY2VcIj5jb21tYSBzZXBhcmF0ZWQgdmFsdWVzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+Y29tbWEgc2VwYXJhdGVkIHZhbHVlczwvcmV0dXJucz5cclxuICBhc3luYyBnZXRMaW5rVmFsdWUoc2VsZWN0ZWRJbmRpY2U6IHN0cmluZywgbGluZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gTlN0cmluZy5FbXB0eTtcclxuICAgIGxldCB0ZW1wOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG5cclxuICAgIGxldCBjaG9pY2VMaW5rOiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpO1xyXG5cclxuICAgIGlmIChjaG9pY2VMaW5rICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIGNvbXB1dGUgc2l6ZSBvZiBkaXNwbGF5ZWQgdmFsdWVzIGFycmF5XHJcbiAgICAgIHNpemUgPSBjaG9pY2VMaW5rLmxlbmd0aDtcclxuICAgIH1cclxuICAgIGxldCBsaW5rSW5kaWNlOiBudW1iZXJbXSA9IHRoaXMuZ2V0TGlua0lkeEZyb21MYXllcihNaXNjLkdldEludEFycmF5KHNlbGVjdGVkSW5kaWNlKSk7XHJcblxyXG4gICAgbGV0IGFycmF5MjogbnVtYmVyW10gPSBsaW5rSW5kaWNlO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGFycmF5Mi5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBhcnJheTJbaV07XHJcbiAgICAgIGlmIChpZHggPj0gc2l6ZSkge1xyXG4gICAgICAgIGxldCBkY1ZhbHM6IERjVmFsdWVzID0gdGhpcy5nZXREY1ZhbHMoKTtcclxuICAgICAgICB0ZW1wLnB1c2goZGNWYWxzLmdldExpbmtWYWx1ZShpZHggLSBzaXplKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGNob2ljZUxpbmsubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0ZW1wLnB1c2goY2hvaWNlTGlua1tpZHhdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0ZW1wLnB1c2gobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbGV0IHZlY3RvclR5cGU6IFZlY3RvclR5cGUgPSBuZXcgVmVjdG9yVHlwZSh0aGlzLmdldEZpZWxkKCkpO1xyXG4gICAgICBmb3IgKGxldCBpbmR4OiBudW1iZXIgPSAwOyBpbmR4IDwgdGVtcC5sZW5ndGg7IGluZHggPSBpbmR4ICsgMSkge1xyXG4gICAgICAgIHZlY3RvclR5cGUuc2V0VmVjQ2VsbChpbmR4ICsgMSwgdGVtcC5nZXRfSXRlbShpbmR4KSwgdGVtcC5nZXRfSXRlbShpbmR4KSA9PT0gbnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gdmVjdG9yVHlwZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXN1bHQgPSB0ZW1wLmpvaW4oXCIsXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IHRlbXAuZ2V0X0l0ZW0oMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRleHQgb24gdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0VGV4dCgpOiB2b2lkIHtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBtbHNUcmFuc2xhdGVkVmFsdWU6IGFueSA9IHRoaXMuVmFsdWU7XHJcbiAgICBpZiAoc3VwZXIuaXNCdXR0b24oKSkge1xyXG4gICAgICBtbHNUcmFuc2xhdGVkVmFsdWUgPSBFdmVudHMuVHJhbnNsYXRlKHRoaXMuVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNUZXh0Q29udHJvbCgpIHx8IHRoaXMuaXNCdXR0b24oKSlcclxuICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGRpc3BsYXlMaW5lLCBtbHNUcmFuc2xhdGVkVmFsdWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGRpc3BsYXlMaW5lLCAvKlwiaW5uZXJIVE1MXCIqLyBIdG1sUHJvcGVydGllcy5UZXh0LCBtbHNUcmFuc2xhdGVkVmFsdWUpO1xyXG5cclxuICAgIC8vIENvbW1hbmRzLmFkZEFzeW5jKENvbW1hbmRUeXBlLlBST1BfU0VUX1RFWFQsIHRoaXMsIGRpc3BsYXlMaW5lLCBtbHNUcmFuc2xhdGVkVmFsdWUsIDApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHJhZGlvIGJ1dHRvbiBjaGVja2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhZGlvTGluZVwiPmlzIHRoZSBsaW5lIG9mIHRoZSByYWRpbyB0aGF0IG5lZWQgdG8gYmUgU2V0PC9wYXJhbT5cclxuICBwcml2YXRlIHNldFJhZGlvQ2hlY2tlZChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBpbmRleCk7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG5cclxuICAgIC8vIHNldCBjb250cm9sIHRvIGZvY3VzXHJcbiAgICBpZiAoaW5kZXggIT09IEd1aUNvbnN0YW50cy5ERUZBVUxUX1ZBTFVFX0lOVCkge1xyXG4gICAgICB0aGlzLnNldENvbnRyb2xUb0ZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRDb250cm9sVG9Gb2N1cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5nZXRGaWVsZCgpLkNvbnRyb2xUb0ZvY3VzID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgQ2hlY2tCb3ggVmFsdWUgdG8gdGhlIGNoZWNrIGJveCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ1ZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHNldENoZWNrQm94VmFsdWUobGluZTogbnVtYmVyLCBtZ1ZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgY2hlY2tTdGF0ZTogYm9vbGVhbiA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKG1nVmFsKTtcclxuICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCBsaW5lLCBjaGVja1N0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZUNoYW5nZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZTogbnVtYmVyLCB2YWx1ZUNoYW5nZWQ6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgIGxldCBjdXJyRGNJZDogbnVtYmVyID0gdGhpcy5nZXREY1JlZigpO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIHJhbmdlIHdhcyBjaGFuZ2VkIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhlIGNvcnJlY3QgY2hvaWNlIG9wdGlvblxyXG4gICAgICBpZiAodGhpcy5fcmFuZ2VDaGFuZ2VkKSB7XHJcbiAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9yYW5nZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhQ3RybCgpICYmIGN1cnJEY0lkICE9PSB0aGlzLl9kY1ZhbElkKSB7XHJcblxyXG4gICAgICAgIC8vIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiBzZXJ2ZXIgd3JpdGVzIG9wdGlvbkxpc3QgdG8gdGhlIEhUTUwuIE5vIG5lZWQgdG8gYXBwbHlcclxuICAgICAgICAvLyB0aGVtXHJcbiAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCB0aW1lLlxyXG4gICAgICAgIC8vIGZvcmNlIHVwZGF0ZSBvZiB0aGUgdmFsdWUgd2hlbmV2ZXIgdGhlIHNldCBvZiBvcHRpb25zIGlzIHJlcGxhY2VkXHJcbiAgICAgICAgLy8gaWYgKGZvcm0uZm9ybVJlZnJlc2hlZCgpIHx8IGZvcmNlUmVmcmVzaClcclxuXHJcbiAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXREY1JlZih0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGRjcmVmIGZvciB0aGUgY3VycmVudCB0YWJsZSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRjSWRcIj50aGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgZGN2YWxzPC9wYXJhbT5cclxuICBzZXREY1JlZihkY0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RjVGFibGVSZWZzLnNldF9JdGVtKHRoaXMuZ2V0RGNMaW5lTnVtKCksIGRjSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlIGltYWdlIGxpc3Qgb2YgYW4gYnV0dG9uIGNvbnRyb2wgd2l0aCB0aGUgaW1hZ2UgYXQgdGhlIGdpdmVuIFVSTFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW1hZ2VMaXN0KHVybDogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZSBib29sZWFuIHByb3BlcnR5KGV4OnZpc2libGVcXGVuYWJsZSkgb2YgY29udHJvbCBhbmQgaXQncyBjaGlsZHJlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5wcm9wZXJ0eSBpZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj5jb21tYW5kIHR5cGUgdGhhdCBiZWxvbmcgdG8gdGhlIHByb3AgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVwZGF0ZVRoaXNcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHVwZGF0ZVByb3BlcnR5TG9naWNOZXN0aW5nKHByb3BJZDogbnVtYmVyLCBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUsIHZhbDogYm9vbGVhbiwgdXBkYXRlVGhpczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgKHZhbCAmJiB0aGlzLmhhdmVUb0NoZWNrUGFyZW50VmFsdWUoKSkge1xyXG4gICAgLy8gIHZhbCA9IHRoaXMuaXNQYXJlbnRQcm9wVmFsdWUocHJvcElkKTtcclxuICAgIC8vIH1cclxuICAgIGlmICh1cGRhdGVUaGlzKSB7XHJcblxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kVHlwZSA9PT0gQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSA/IEh0bWxQcm9wZXJ0aWVzLlZpc2libGUgOiBIdG1sUHJvcGVydGllcy5FbmFibGVkLCB2YWwpO1xyXG5cclxuICAgIH1cclxuICAgIC8vIHRvZG86IHNob3VsZCBnbyBvdmVyIG9ubHkgbGlua2VkIGNvbnRyb2xzIC0gbm90IGNoaWxkcmVuIGNvbnRyb2xzLCBuZWVkIHRvIGNoZWNrIHdpdGggUE0gdGhpcyBiZWhhdmlvclxyXG4gICAgYXdhaXQgdGhpcy51cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCB2YWwpO1xyXG4gIH1cclxuXHJcbiAgU2V0RW5hYmxlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLkVuYWJsZWQsIHZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVXBkYXRlcyB2aXNpYmlsaXR5IG9mIGNvbnRyb2xzIGxpbmtlZCB0byB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICBhc3luYyB1cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAoIXN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgLy8gaW4gdGFibGUgYWxsIGNoaWxkcmVuIGFyZSBjb250YWluZWQsXHJcbiAgICAgIC8vIHRhYmxlJ3MgdmlzaWJpbGl0eVxcZW5hYmxlIHdpbGwgYWZmZWN0IHRoZW1cclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9saW5rZWRDb250cm9scy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICBsZXQgY2hpbGQ6IE1nQ29udHJvbEJhc2UgPSB0aGlzLl9saW5rZWRDb250cm9scy5nZXRfSXRlbShpKTtcclxuICAgICAgICAvLyBEZWZlY3QgMTE3Mjk0LiBEbyBub3QgY29udGludWUgZm9yIHRoZSBmaXJzdCB0aW1lLiBJdCBhZmZlY3RzIG9uIHRoZSBwbGFjZW1lbnQuXHJcbiAgICAgICAgaWYgKGNoaWxkLklzRmlyc3RSZWZyZXNoT2ZQcm9wcygpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZFZhbHVlOiBib29sZWFuID0gKGNoaWxkLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpO1xyXG5cclxuICAgICAgICBjaGlsZFZhbHVlID0gY2hpbGRWYWx1ZSAmJiB2YWw7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZE9uQ3VycmVudExheWVyOiBib29sZWFuID0gdGhpcy5pc0NoaWxkT25DdXJyZW50TGF5ZXIoY2hpbGQpO1xyXG5cclxuICAgICAgICBpZiAoY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUpIHtcclxuXHJcbiAgICAgICAgICBpZiAoY2hpbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICBjaGlsZFZhbHVlID0gY2hpbGRPbkN1cnJlbnRMYXllcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF3YWl0IGNoaWxkLnVwZGF0ZUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIGNoaWxkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoc3VwZXIuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdWJmb3JtQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgdmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgY29udHJvbCBpcyBkZXNjZW5kYW50IG9mIHNwZWNpZmllZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRGVzY2VuZGVudE9mQ29udHJvbChjb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0NvbnRhaW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChjb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMuZ2V0UGFyZW50KCk7XHJcbiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZ0NvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gY29udHJvbCkge1xyXG4gICAgICAgICAgaXNDb250YWluZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIGN1cnJlbnQgY29udHJvbCBiZWxvbmdzIHRvIHRhYmxlLCB0aGVuIGl0IGlzIGFsc28gYSBkZXNjZW5kYW50IG9mIHRoZSBjb2x1bW4gY29udHJvbCB0b1xyXG4gICAgICAgICAgLy8gd2hpY2ggaXQgYmVsb25ncy4gQWNjb3JkaW5nIHRvIG91ciBoaWVyYXJjaHksIHRoZSBjb250cm9sIGlzIGRpcmVjdCBkZXNjZW5kYW50IG9mIHRhYmxlXHJcbiAgICAgICAgICAvLyBjb250cm9sOyBoZW5jZSwgd2UgbmVlZCB0byBoYW5kbGUgY29sdW1uIGNvbnRyb2xcclxuXHJcbiAgICAgICAgICBsZXQgcGFyZW50Q29udHJvbDogTWdDb250cm9sQmFzZSA9ICgocGFyZW50IGluc3RhbmNlb2YgTWdDb250cm9sQmFzZSkgPyA8TWdDb250cm9sQmFzZT5wYXJlbnQgOiBudWxsKTtcclxuICAgICAgICAgIGlmIChjb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTiAmJiBwYXJlbnRDb250cm9sICE9PSBudWxsICYmIHBhcmVudENvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY29udHJvbC5MYXllciA9PT0gdGhpcy5MYXllcilcclxuICAgICAgICAgICAgaXNDb250YWluZWQgPSB0cnVlO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpc0NvbnRhaW5lZCA9ICgoPE1nQ29udHJvbEJhc2U+cGFyZW50KS5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY29udHJvbCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzQ29udGFpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZXMgdmlzaWJpbGl0eSBvciBlbmFibGUgcHJvcGVydHkgb2Ygc3ViZm9ybSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5JZCBvZiB2aXNpYmlsaXR5IG9yIGVuYWJsZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPnR5cGUgb2YgdGhlIEdVSSBjb21tYW5kPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnZhbHVlIGZvciB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIHVwZGF0ZVN1YmZvcm1DaGlsZHJlblByb3BWYWx1ZShwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgY2hpbGQncyBsYXllciBpcyBlcXVhbCB0byBjdXJyZW50IGxheWVyIG9mIHRoZSBwYXJlbnQsIHJlbGF2YW50IGZvciB0YWIgY29udHJvbCBmb3IgYWxsIG90aGVyXHJcbiAgLy8vICAgY29udHJvbHMgcmV0dXJucyB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoaWxkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgcGFyZW50IGlzIG5vdCB0YWIgY29udHJvbCBvciBwYXJlbnQgaXMgdGFiIGNvbnRyb2wgd2l0aCBzYW1lIGxheWVyPC9yZXR1cm5zPlxyXG4gIGlzQ2hpbGRPbkN1cnJlbnRMYXllcihjaGlsZDogTWdDb250cm9sQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyBjaGVjayB0aGF0IHRoZSBjb250cm9sIGhhcyBzYW1lIGxheWVyIHRoYXQgaXMgY3VycmVudGx5IHNldCBvbiBpdCdzIHBhcmVudCB0YWIgY29udHJvbFxyXG4gICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgIGxldCBwYXJlbnRMYXllcjogbnVtYmVyID0gMDtcclxuICAgICAgaWYgKHRoaXMuVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICBwYXJlbnRMYXllciA9IHRoaXMuZ2V0Q3VycmVudExpbmtJZHgoKSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxheWVyOiBudW1iZXIgPSBjaGlsZC5nZXRMYXllcigpO1xyXG4gICAgICBpZiAocGFyZW50TGF5ZXIgIT09IGxheWVyICYmIGxheWVyID4gMCkge1xyXG4gICAgICAgIC8vIHNvbnMgb2YgbGF5ZXIgMCBkaXNwbGF5ZWQgYWx3YXlzXHJcbiAgICAgICAgcmV0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIGN1cnJlbnQgbGluayBJZHggb2YgY2hvaWNlIGNvbnRyb2xzLCBvciB6ZXJvIGZvciBvdGhlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q3VycmVudExpbmtJZHgoKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyTGlua0lkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNDaG9pY2VDb250cm9sKCkgfHwgdGhpcy5IYXNBdXRvY29tcGxldGUoKSkge1xyXG4gICAgICBsZXQgY3VycmVudExheWVyczogbnVtYmVyW10gPSB0aGlzLmdldEN1cnJlbnRJbmRleE9mQ2hvaWNlKCk7XHJcbiAgICAgIGxldCBjdXJyTGlua0luZGljZTogbnVtYmVyW10gPSB0aGlzLmdldExpbmtJZHhGcm9tTGF5ZXIoY3VycmVudExheWVycyk7XHJcbiAgICAgIGN1cnJMaW5rSWR4ID0gY3VyckxpbmtJbmRpY2VbMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyckxpbmtJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldHMgbGF5ZXIgZnJvbSB0aGUgc2VsZWN0ZWQgaW5kaWNlIHBhc3NlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmtJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5hcnJheSBvZiBsYXllciB2YWx1ZXMuPC9yZXR1cm5zPlxyXG4gIGdldExheWVyRnJvbUxpbmtJZHgoaW5kaWNlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuICAgIGxldCBsYXllcnM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oaW5kaWNlLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGluZGljZS5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBpbmRpY2VbaUN0cl07XHJcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIGxheWVyID0gbGlua0lkeCB1bmxlc3MgaXQgaXMgYSBUYWIgY29udHJvbFxyXG5cclxuICAgICAgbGF5ZXJzW2lDdHJdID0gaWR4O1xyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzVGFiQ29udHJvbCgpICYmIGlkeCA+PSAwKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LmdldF9JdGVtKGxpbmUpO1xyXG4gICAgICAgIGlmIChsYXllckxpc3QgIT09IG51bGwgJiYgbGF5ZXJMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxheWVyc1tpQ3RyXSA9IGxheWVyTGlzdC5pbmRleE9mKChpZHggKyAxKS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsYXllcnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgdGhlIHNlbGVjdGVkIGluZGljZSBmb3Igc2VsZWN0ZWQgdmFsdWVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGF5ZXJzXCI+YW4gYXJyYXkgb2YgY3VycmVudCBsYXllcnMgdGFiIGNvbnRyb2xzLiBJdCBjYW4gYmUgYXJyYXkgYmVjYXVzZSBvZiBtdWx0aXBsZSBzZWxlY3Rpb24uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YXJyYXkgb2YgaW5kaWNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TGlua0lkeEZyb21MYXllcihsYXllcnM6IG51bWJlcltdKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGxpbmtJbmRpY2U6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4obGF5ZXJzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgbGF5ZXJzLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgIGxldCBsYXllcjogbnVtYmVyID0gbGF5ZXJzW2lDdHJdO1xyXG4gICAgICBsaW5rSW5kaWNlW2lDdHJdID0gbGF5ZXI7XHJcbiAgICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgIGlmIChsYXllciA8IDApIHtcclxuICAgICAgICAgIGxpbmtJbmRpY2VbaUN0cl0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgICBsaW5lID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LmdldF9JdGVtKGxpbmUpO1xyXG4gICAgICAgICAgaWYgKGxheWVyTGlzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGF5ZXJMaXN0ICE9PSBcInVuZGVmaW5lZFwiICYmIGxheWVyTGlzdC5sZW5ndGggIT09IDAgJiYgbGF5ZXIgPCBsYXllckxpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxpbmtJbmRpY2VbaUN0cl0gPSBOTnVtYmVyLlBhcnNlKGxheWVyTGlzdFtsYXllcl0pIC0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsaW5rSW5kaWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY3Vyc2l2ZSBtZXRob2QsIGNoZWNrcyBpZiBwYXJlbnQgb2YgdGhlIGNoaWxkIGlzIHZpc2libGVcXGVuYWJsZSwgdWx0aWwgdGhlcmUgaXMgbm8gcGFyZW50IG9yIGZvdW5kXHJcbiAgLy8vICAgcGFyZW50IHRoYXQgaXMgaGlkZGVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1BhcmVudFByb3BWYWx1ZShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvbHVtbjogTWdDb250cm9sQmFzZSA9IHRoaXMuRm9ybS5nZXRDb250cm9sQ29sdW1uKHRoaXMpO1xyXG4gICAgbGV0IHBhcmVudDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuZ2V0TGlua2VkUGFyZW50KHRydWUpO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcblxyXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyBubyBtb3JlIHBhcmVudHNcclxuICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBwYXJlbnQgaXMgaGlkZGVuXHJcbiAgICAgIGlmICghcGFyZW50LkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpIHtcclxuICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoIXBhcmVudC5pc0NoaWxkT25DdXJyZW50TGF5ZXIodGhpcykpIHtcclxuICAgICAgICAgIC8vIHBhcmVudCBpcyB0YWIgY29udHJvbCB3aXRoIGN1cnJlbnQgbGF5ZXJcclxuICAgICAgICAgIC8vIGRpZmZlcmVudCBmcm9tIGNoaWxkJ3MgbGF5ZXJcclxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGZvciB0YWJsZSBjaGlsZHJlbiBjaGVjayBpZiBjb2x1bW4gdmlzaWJsZVxyXG4gICAgICAgICAgcmVzdWx0ID0gKCEoY29sdW1uICE9PSBudWxsICYmICFjb2x1bW4uR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCB0cnVlKSkgJiYgcGFyZW50LmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgY29udHJvbCB0byB3aGljaCB0aGlzIGNvbnRyb2wgaXMgbGlua2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrU3ViZm9ybUZhdGhlclwiPmlmIHRydWUgY2hlY2sgZm9yIFN1YmZvcm0gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRMaW5rZWRQYXJlbnQoY2hlY2tTdWJmb3JtRmF0aGVyOiBib29sZWFuKTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGNoZWNrU3ViZm9ybUZhdGhlciAmJiB0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBjdXJyZW50IGxpbmUgdmFsdWUgb2YgdGhlIHJlYWRPbmx5IGhpc3RvcnkgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsXCI+dGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPlxyXG4gIFNldEN1cnJSZWFkT25seShuZXdWYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBuZXdWYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgY3VycmVudCByZWFkT25seSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZWFkT25seSB2YWx1ZTwvcmV0dXJucz5cclxuICBHZXRDdXJyUmVhZE9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gc3VwZXIuaXNUYWJsZUNvbnRyb2woKSA/IDAgOiB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IGN1cnJPYmo6IGFueSA9IHRoaXMuX2N1cnJSZWFkT25seS5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBjdXJyOiBib29sZWFuO1xyXG4gICAgaWYgKGN1cnJPYmogPT09IG51bGwpIHtcclxuICAgICAgY3VyciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9jdXJyUmVhZE9ubHkuc2V0X0l0ZW0obGluZSwgY3Vycik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY3VyciA9IDxib29sZWFuPmN1cnJPYmo7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VycjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBjb250cm9sIGlzIGEgRGF0YSBDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0RhdGFDdHJsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgZGNyZWYgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBkY0lkPC9yZXR1cm5zPlxyXG4gIGdldERjUmVmKCk6IG51bWJlciB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREY0xpbmVOdW0oKTtcclxuICAgIGxldCBvYmo6IGFueSA9IHRoaXMuX2RjVGFibGVSZWZzLmdldF9JdGVtKHRoaXMuZ2V0RGNMaW5lTnVtKCkpO1xyXG4gICAgbGV0IGRjSWQ6IG51bWJlcjtcclxuICAgIGlmIChvYmogPT09IG51bGwpIHtcclxuICAgICAgZGNJZCA9IC0yO1xyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5zZXRfSXRlbShsaW5lLCBkY0lkKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkY0lkID0gPG51bWJlcj5vYmo7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGNJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGZvciBhIGRhdGEgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXREY0xpbmVOdW0oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLklzUmVwZWF0YWJsZSA/IHRoaXMuRm9ybS5EaXNwbGF5TGluZSA6IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlIG9uZSBjaG9pY2Ugb3B0aW9uIGZyb20gaXRlbXMgbGlzdCBpcyB2YWxpZC4gVGhlIGNoZWNrIGlzIG9ubHkgZm9yIGl0ZW1zIGxpc3QgYW5kIG5vdCBmb3IgdGhlXHJcbiAgLy8vICAgZGF0YSBzb3VyY2Ugb3B0aW9ucywgKEZZSTogZm9yIHRoZSBvcHRpb24gZnJvbSB0aGUgRGF0YUN0cmwsIHdlIGFyZSBub3QgY2FsbGluZyB0aGlzXHJcbiAgLy8vICAgbWV0aG9kLCBOTyBDSEVDSyBJUyBET05FKSBpbiBvbmxpbmUgOmNpX2NoZWNrX3JhbmdlX3N0clxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcHRpb246XCI+b25lIG9wdGlvbiBmcm9tIHRoZSBpdGVtcyBsaXN0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgb3B0aW9uSXNWYWxpZChvcHRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgJiYgb3B0aW9uLmxlbmd0aCA+IDAgJiYgb3B0aW9uLmluZGV4T2YoJzAnKSA9PT0gLTEpIHtcclxuICAgICAgbGV0IGNvbnZlcnROdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIGNvbnZlcnROdW0ubnVtXzRfYV9zdGQob3B0aW9uKTtcclxuICAgICAgaWYgKGNvbnZlcnROdW0ubnVtX2lzX3plcm8oKSkge1xyXG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVmFsaWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJlcGFyZXMgYW5kIHJldHVybnMgdGhlIG9yZGVyZWQgbGlzdCBiYXNlZCBvbiBsYXllcnMgaW4gbGF5ZXJMaXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNob2ljZURpc3BMaXN0XCI+dW5vcmRlcmVkIGxpc3Q8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRPcmRlcmVkRGlzcExpc3QoY2hvaWNlRGlzcExpc3Q6IHN0cmluZ1tdLCBsaW5lOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcblxyXG4gICAgbGV0IGNob2ljZUxheWVyU3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IGRpc3BBcnJ5TGlzdDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IGxheWVyQXJyeUxpc3Q6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCBsYXllclByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVfTEFZRVJTX0xJU1QpO1xyXG5cclxuICAgIGlmIChsYXllclByb3AgIT09IG51bGwpIHtcclxuICAgICAgY2hvaWNlTGF5ZXJTdHIgPSBhd2FpdCBsYXllclByb3AuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hvaWNlTGF5ZXJTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VMYXllclN0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNob2ljZUxheWVyU3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmIChjaG9pY2VMYXllclN0ci5sZW5ndGggPiAwICYmIGNob2ljZURpc3BMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGxheWVyTGlzdDogc3RyaW5nW10gPSBjaG9pY2VMYXllclN0ci5zcGxpdChcIixcIik7XHJcbiAgICAgIGxldCBwb3NDb3B5SW5kZXg6IG51bWJlciA9IC0xO1xyXG4gICAgICBmb3IgKGxldCBpbmRleDogbnVtYmVyID0gMDsgaW5kZXggPCBsYXllckxpc3QubGVuZ3RoOyBpbmRleCA9IGluZGV4ICsgMSkge1xyXG4gICAgICAgIGxldCBjdXJyTGF5ZXJMaXN0VmFsOiBzdHJpbmcgPSBsYXllckxpc3RbaW5kZXhdLnRyaW0oKTtcclxuICAgICAgICBpZiAoIShsYXllckFycnlMaXN0LmluZGV4T2YoY3VyckxheWVyTGlzdFZhbCkgIT09IC0xKSkge1xyXG4gICAgICAgICAgbGV0IHJlZlBvc0NvcHlJbmRleDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KHBvc0NvcHlJbmRleCk7XHJcbiAgICAgICAgICBsZXQgaXNOdW1iZXI6IGJvb2xlYW4gPSBOTnVtYmVyLlRyeVBhcnNlKGN1cnJMYXllckxpc3RWYWwsIHJlZlBvc0NvcHlJbmRleCk7XHJcbiAgICAgICAgICBwb3NDb3B5SW5kZXggPSByZWZQb3NDb3B5SW5kZXgudmFsdWU7XHJcblxyXG4gICAgICAgICAgLy8gcG9zQ29weUluZGV4IGlzIDFCYXNlZCwgc28gbXVzdCBub3QgYmUgemVyby4gQWxzbywgaXQgbXVzdCBub3QgYmVcclxuICAgICAgICAgIC8vIGdyZWF0ZXIgdGhhbiBubyBvZiBlbGVtZW50cyBpbiB0aGUgRGlwbGF5TGlzdC5cclxuXHJcbiAgICAgICAgICBpZiAoaXNOdW1iZXIgJiYgcG9zQ29weUluZGV4ID4gMCAmJiBwb3NDb3B5SW5kZXggPD0gY2hvaWNlRGlzcExpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRpc3BBcnJ5TGlzdC5wdXNoKChjaG9pY2VEaXNwTGlzdFtwb3NDb3B5SW5kZXggLSAxXSkudHJpbSgpKTtcclxuICAgICAgICAgICAgbGF5ZXJBcnJ5TGlzdC5wdXNoKGN1cnJMYXllckxpc3RWYWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdO1xyXG4gICAgaWYgKGRpc3BBcnJ5TGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmVzdWx0ID0gY2hvaWNlRGlzcExpc3Q7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBuZXcgQXJyYXk8c3RyaW5nPigwKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oZGlzcEFycnlMaXN0Lmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgcmVzdWx0Lmxlbmd0aDsgKytfYWkpXHJcbiAgICAgICAgcmVzdWx0W19haV0gPSBudWxsO1xyXG5cclxuICAgICAgcmVzdWx0ID0gZGlzcEFycnlMaXN0LlRvQXJyYXkoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIGxheWVyQXJyeUxpc3QuVG9BcnJheSgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIHByZXZpb3VzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFByZXZWYWwoKTogdm9pZCB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLnNldFByZXZJc051bGxfVG9OdWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gICBzZXRzIHRoZSBwcmV2SXNOdWxsIHZhbHVlIG9mIHRoZSBwcmV2SXNOdWxsIGFycmF5XHJcbiAgLy8vICAgdGhlIG5ld1ZhbHVlIGNhbiBiZSBOVUxMIG9yIGJvb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFByZXZJc051bGxfVG9OdWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldklzTnVsbHMuc2V0X0l0ZW0odGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKSwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBhbiBleHByZXNzaW9uIHdhcyBzZXQgYXMgdGhlIGRhdGE8L3JldHVybnM+XHJcbiAgZXhwcmVzc2lvblNldEFzRGF0YSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl92YWxFeHBJZCA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbGVkIHdoZW5ldmVyIHRoZSBjaG9pY2UgbGlzdCBvZiBhIFNFTEVDVCBjb250cm9sIGhhcyBjaGFuZ2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhclJhbmdlKGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhdmUgdG8gY2hlY2sgcGFyZW50IHZpc2liaWxpdHlcXGVuYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUsIGlmIHRoZSBjb250cm9sIGlzIGNvbm5lY3RlZCB0byBhIGNvbnRhaW5lciBvciB0aGUgdGFzayBpcyBhIHN1YmZvbTwvcmV0dXJucz5cclxuICBoYXZlVG9DaGVja1BhcmVudFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCAhPT0gLTEpIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5lZEluTGlua2VkUGFyZW50KCkpIHtcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnRhaW5lZCB0YWIgY2hpbGRyZW4gb2YgYWxsIGxheWVycyBhcmUgb24gdGhlIHNhbWUgd2luZG93LFxyXG4gICAgICAvLyBzbyB3ZSBtdXN0IGhhbmRsZSB0aGVyZSB2aXNpYmlsaXR5XFxlbmFibGVcclxuXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpLmlzVGFiQ29udHJvbCgpIHx8IHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCkuaXNHcm91cCgpKSB7XHJcbiAgICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBjb250cm9sIGlzIGNvbnRhaW4gaW4gaXRzIGxpbmtlZCBwYXJlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDb250YWluZWRJbkxpbmtlZFBhcmVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xICYmIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9PT0gdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbWJpbmUgdHdvIHN0cmluZ3MgYXJyYXkgaW50byBvbmUuIEVhY2ggb2YgdGhlIG9yaWdpbmFsIGFycmF5cyBtYXkgYmUgbnVsbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmlyc3RTdHJpbmdzXCI+dGhlIGZpcnN0IHN0cmluZ3MgYXJyYXkgdGhhdCB3aWxsIGFsd2F5cyBvY2N1cHkgdGhlIGZpcnN0IGFycmF5IGNlbGxzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxhc3RTdHJpbmdzXCI+dGhlIGxhc3Qgc3RyaW5ncyBhcnJheSB0aGF0IHdpbGwgYWx3YXlzIG9jY3VweSB0aGUgbGFzdCBhcnJheSBjZWxsczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjb21iaW5lZCBTdHJpbmdzIGFycmF5PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGNvbWJpbmVTdHJpbmdBcnJheXMoZmlyc3RTdHJpbmdzOiBzdHJpbmdbXSwgbGFzdFN0cmluZ3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG5cclxuICAgIGlmIChmaXJzdFN0cmluZ3MgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZmlyc3RTdHJpbmdzKTtcclxuXHJcbiAgICBpZiAobGFzdFN0cmluZ3MgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobGFzdFN0cmluZ3MpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4sIGxpbmU/OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIChwcm9wSWQgPT09IG51bGwgfHwgcHJvcElkLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChkZWZhdWx0UmV0VmFsID09PSBudWxsIHx8IGRlZmF1bHRSZXRWYWwuY29uc3RydWN0b3IgPT09IEJvb2xlYW4pKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAocHJvcElkLCBkZWZhdWx0UmV0VmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzEocHJvcElkLCBkZWZhdWx0UmV0VmFsLCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBib29sZWFuIGNvbXB1dGVkIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIHByaXZhdGUgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkocHJvcElkKTtcclxuICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sIC0gaWYgdGhlIGNvbnRyb2wgaXMgcmVwZWF0YWJsZSBhbmQgdGhlIGxpbmUgaXNcclxuICAvLy8gZGlmZmVyZW50IHRoYW4gdGhlIGZvcm1zIGN1cnJlbnQgbGluZSB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGNvbnRyb2wgcHJvcGVydHkgYXQgdGhhdCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBudW1iZXIgaW4gdGFibGUgaW4gd2hpY2ggdGhlIGNvbnRyb2wgaXMgbG9jYXRlZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8xKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuLCBsaW5lOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG5cclxuICAgIGlmICh0aGlzLmlzUHJvcGVydHlSZXBlYXRhYmxlKHByb3BJZCkgJiYgdGhpcy5Gb3JtLkRpc3BsYXlMaW5lICE9PSBsaW5lKSB7XHJcbiAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQpO1xyXG4gICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IHByb3AuZ2V0UHJldlZhbHVlKGxpbmUpO1xyXG4gICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIGRlZmF1bHRSZXRWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCAtIGlmIHRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgYW5kIHRoZSBsaW5lIGlzXHJcbiAgLy8vICAgZGlmZmVyZW50IHRoYW4gdGhlIGZvcm1zIGN1cnJlbnQgbGluZSB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGNvbnRyb2wgcHJvcGVydHkgYXQgdGhhdFxyXG4gIC8vLyAgIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSBsaW5lIG51bWJlciBpbiB0YWJsZSBpbiB3aGljaCB0aGUgY29udHJvbCBpcyBsb2NhdGVkPC9wYXJhbT5cclxuICBhc3luYyBjaGVja1Byb3BXaXRoTGluZShwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbiwgbGluZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Byb3BlcnR5UmVwZWF0YWJsZShwcm9wSWQpICYmIHRoaXMuRm9ybS5EaXNwbGF5TGluZSAhPT0gbGluZSkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AocHJvcElkKTtcclxuICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBwcm9wLmdldFByZXZWYWx1ZShsaW5lKTtcclxuICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKHByb3BJZCwgZGVmYXVsdFJldFZhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICBhc3luYyBjaGVja1Byb3AocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBwcm9wLmdldFZhbHVlQm9vbGVhbigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgcHJvcElkIHByb3BlcnR5IGlzIHJlcGVhdGFibGUgZm9yIHRoaXMgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNQcm9wZXJ0eVJlcGVhdGFibGUocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1JlcGVhdGFibGU6IGJvb2xlYW4gPSB0aGlzLklzUmVwZWF0YWJsZTtcclxuICAgIGlmIChpc1JlcGVhdGFibGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmlzVGFibGVDb250cm9sKCkgJiYgUHJvcGVydHkuaXNSZXBlYXRhYmxlSW5UYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaW4gbWFnaWMgaW50ZXJuYWwgZm9ybWF0IHRvIGJlIGRpc3BsYXllZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBhc3luYyBTZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRjUmFuZ2VJc0VtcHR5OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAobWdWYWwgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5WYWx1ZSA9IFwiXCI7XHJcbiAgICAgIC8vIFFDUiAzMDg0NzUgLSBjb250cm9scyB0aGF0IGFyZSBJbml0aWFsaXplZCB3aXRoIG51bGwgc2hvdWxkIGJlIGdpdmVuIG1hZ2ljIGRlZmF1bHQgdmFsdWUuXHJcbiAgICAgIGlmICghaXNOdWxsKVxyXG4gICAgICAgIG1nVmFsID0gRmllbGREZWYuZ2V0TWFnaWNEZWZhdWx0VmFsdWUodGhpcy5EYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgICAgICBsaW5lID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxheWVyczogbnVtYmVyW10gPSB0aGlzLmdldExheWVyRnJvbUxpbmtJZHgoYXdhaXQgdGhpcy5nZXRJbmRleE9mQ2hvaWNlKG1nVmFsLCBsaW5lLCBpc051bGwpKTtcclxuXHJcbiAgICAgICAgLy8gV2UgZG8gbm90IGFsbG93IG5vIHNlbGVjdGlvbiBmb3IgYSB0YWIgY29udHJvbC5cclxuICAgICAgICAvLyBTbywgaWYgdGhlcmUgaXMgbm8gVGFiIHRvIGJlIHNlbGVjdGVkLCBzZWxlY3QgdGhlIGZpcnN0IFRhYiBhbmRcclxuICAgICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgZmllbGQncyB2YWx1ZSBhY2NvcmRpbmdseS5cclxuXHJcbiAgICAgICAgaWYgKGxheWVyc1swXSA8IDAgJiYgc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIGxheWVyc1swXSA9IDA7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGF3YWl0IHRoaXMuZ2V0TGlua1ZhbHVlKGxheWVyc1swXS50b1N0cmluZygpLCBsaW5lKTtcclxuICAgICAgICAgIGlzTnVsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIG1nVmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICg8R3VpVGFza0Jhc2U+dGhpcy5fZmllbGQuZ2V0VGFzaygpKS5VcGRhdGVGaWVsZFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodGhpcy5fZmllbGQsIG1nVmFsLCBpc051bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbHVlID0gTWlzYy5HZXRDb21tYVNlcGVyYXRlZFN0cmluZyhsYXllcnMpO1xyXG4gICAgICAgIGRjUmFuZ2VJc0VtcHR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIzQ1MDI0ODogYW4gZW1wdHkgcmFuZ2UgaW4gdGhlIGRhdGEgY29udHJvbCBjYXVzZWQgZGVsZXRpbmcgdGhlIHZhbHVlXHJcbiAgICAvLyBvZiB0aGUgY29udHJvbCB3aGVuIGxlYXZpbmcgaXQuIE5vdywgdGhlIHJhbmdlIG9mIHRoZSBjb250cm9sIGlzIHVzZWQgd2hlblxyXG4gICAgLy8gdGhlIGRhdGEgY29udHJvbCByYW5nZSBpcyBlbXB0eS5cclxuICAgIGlmIChkY1JhbmdlSXNFbXB0eSkge1xyXG4gICAgICBpZiAoIXN1cGVyLmlzQ2hlY2tCb3goKSAmJiAodGhpcy5fZmllbGQgPT09IG51bGwgfHwgIWlzTnVsbCB8fCAhdGhpcy5fZmllbGQuaGFzTnVsbERpc3BsYXlWYWx1ZSgpKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoKHN1cGVyLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB8fCBzdXBlci5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IG1nVmFsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5fZmllbGQgPT09IG51bGwgJiYgaXNOdWxsKSAmJiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUgfHwgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgaW5Db250cm9sOiBib29sZWFuID0gdGhpcy5JbkNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChtZ1ZhbCwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdHJ1ZSwgc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCksIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGluQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIERlZmVjdCAjIDEzODgwMyA6IEZpeCB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1bmlQYWFTLiBEbyBub3QgY2FsbCBydHJpbVZhbHVlKCkgd2hlbiByZWZyZXNoaW5nIHRoZSBkaXNwbGF5IGlmIHRoZSBkYXRhIHR5cGVcclxuICAgICAgICAgIC8vIGlzIG5vdCBudW1lcmljIG9yIGxlZnQganVzdGlmeSBwcm9wZXJ0eSBpcyBOby5cclxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5WYWx1ZSA9PT0gJ3N0cmluZycgJiYgKCF0aGlzLl9waWMuaXNBdHRyTnVtZXJpYygpIHx8IHRoaXMuX3BpYy5pc0xlZnQoKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5ydHJpbVZhbHVlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoaW5uZXJFeGNlcHRpb24pIHtcclxuICAgICAgICAgIGlmIChpbm5lckV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihOU3RyaW5nLkZvcm1hdChcIkNvbnRyb2w6ICd7MH0nLCBtZ3ZhbDogezF9XCIsIHRoaXMuTmFtZSwgbWdWYWwpLCBpbm5lckV4Y2VwdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLlZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgbWdWYWwgPSBGaWVsZERlZi5nZXRNYWdpY0RlZmF1bHRWYWx1ZSh0aGlzLkRhdGFUeXBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgaW5uZXJFeGNlcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ2hlY2tCb3goKSlcclxuICAgICAgICAgIHRoaXMuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihtZ1ZhbCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5WYWx1ZSA9IG1nVmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBUcmFuc2xhdGUgbG9naWNhbCBuYW1lIGZvciBpbWFnZSBjb250cm9sLlxyXG4gICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgIG1nVmFsID0gRXZlbnRzLlRyYW5zbGF0ZUxvZ2ljYWxOYW1lKG1nVmFsKTtcclxuICAgIH1cclxuICAgIHRoaXMuSXNOdWxsID0gaXNOdWxsO1xyXG4gICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIGlmIHRoZSBjb250cm9sJ3MgdmFsdWUgaXMgbW9kaWZpZWQgYW5kIGlmIHNvLCB1cGRhdGVzIHRoZSBNb2RpZmllZEJ5VXNlciA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZU1vZGlmaWVkQnlVc2VyKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBGb3IgaW1hZ2UgY29udHJvbCBhbmQgaW1hZ2UgYnV0dG9uLCB0aGUgdmFsdWUgd291bGQgbm90IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuIEJ1dCwgaWYgaXQgaGFzXHJcbiAgICAvLyBhIGxvZ2ljYWwgbmFtZSwgaXQgaXMgcmVwbGFjZWQuIE9yIGlmIGl0IGlzIGZpbGVTZXJ2ZXIgZ2V0LCB0aGUgdmFsdWUgaXMgcmVwbGFjZWQgYnkgYSBzZXJ2ZXIgdXJsLlxyXG4gICAgLy8gSW4gYm90aCB0aGVzZSBjYXNlcywgd2Ugc2hvdWxkIG5vdCBtYXJrIGl0IGFzIG1vZGlmaWVkLlxyXG4gICAgaWYgKCEoc3VwZXIuaXNCdXR0b24oKSB8fCBzdXBlci5pc0ltYWdlQ29udHJvbCgpKSkge1xyXG4gICAgICBsZXQgY3RybEN1cnJJc051bGw6IGJvb2xlYW4gPSB0aGlzLklzTnVsbDtcclxuICAgICAgbGV0IHZhbENoYW5nZWQ6IGJvb2xlYW4gPSAodGhpcy5pc0RpZmZlcmVudFZhbHVlKG5ld1ZhbHVlLCBmYWxzZSwgZmFsc2UpKTtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSB2YWx1ZSBkaWRuJ3QgY2hhbmdlIHRoZW4gbGV0J3MgY2hlY2sgaWYgdGhlIG51bGxpdHkgaGF2ZSBjaGFuZ2VkXHJcbiAgICAgIGlmICghdmFsQ2hhbmdlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLkNhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCkpIHtcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSAoY3RybEN1cnJJc051bGwgIT09IHRoaXMuaXNOdWxsVmFsdWUobmV3VmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbENoYW5nZWQgfHwgdGhpcy5LZXlTdHJva2VPbikge1xyXG4gICAgICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUlRyaW1zIHRoZSBjb250cm9sIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHJ0cmltVmFsdWUoKTogdm9pZCB7XHJcbiAgICBpZiAoKHN1cGVyLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB8fCBzdXBlci5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgdGhpcy5WYWx1ZSA9IE5TdHJpbmcuVHJpbUVuZCh0aGlzLlZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbWluaW11bVZhbHVlTGVuZ3RoOiBudW1iZXIgPSB0aGlzLmdldE1pbmltdW1WYWx1ZUxlbmd0aCgpO1xyXG4gICAgICAvLyBSVHJpbSB0aGUgdmFsdWUgYmV5b25kIHRoaXMgaW5kZXhcclxuICAgICAgaWYgKHRoaXMuVmFsdWUubGVuZ3RoID4gbWluaW11bVZhbHVlTGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHN0cjogc3RyaW5nID0gdGhpcy5WYWx1ZS5zdWJzdHIobWluaW11bVZhbHVlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgLy8gY29weSB0aGUgbWluaW11bSBsZW5ndGggdmFsdWUgYXMgaXNcclxuICAgICAgICB0aGlzLlZhbHVlID0gdGhpcy5WYWx1ZS5zdWJzdHIoMCwgbWluaW11bVZhbHVlTGVuZ3RoKTtcclxuICAgICAgICAvLyBydHJpbSB0aGUgdmFsdWUgYmV5b25kIG1pbmltdW0gbGVuZ3RoXHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IHRoaXMuVmFsdWUgKyBTdHJVdGlsLnJ0cmltV2l0aE51bGwoc3RyLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWx3YXlzIHRyaW0gdGhlIG51bWVyaWMgdmFsdWUuXHJcbiAgICAgIGlmIChzdXBlci5pc1RleHRDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IE5TdHJpbmcuVHJpbUVuZCh0aGlzLlZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUgbGVuZ3RoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldE1pbmltdW1WYWx1ZUxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbkxlbmd0aDogbnVtYmVyID0gdGhpcy5fcGljLmdldE1hc2tMZW5ndGgoKTtcclxuXHJcbiAgICAvLyB0cmF2ZXJzZSBmcm9tIHJpZ2h0IHRpbGwgYSB2YWxpZCBtYXNrIGNoYXIgaXMgZW5jb3VudGVyZWRcclxuICAgIHdoaWxlIChtaW5MZW5ndGggPiAwICYmICF0aGlzLl9waWMucGljSXNNYXNrKG1pbkxlbmd0aCAtIDEpKSB7XHJcbiAgICAgIG1pbkxlbmd0aCA9IG1pbkxlbmd0aCAtIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWluTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc051bGxWYWx1ZShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldElzTnVsbENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLkNhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCkgJiYgc3RyID09PSBcIlwiKSB7XHJcbiAgICAgIHJldElzTnVsbENvbnRyb2wgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElzTnVsbENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGhpcyBjb250cm9sIGNhbiBnZXQgbnVsbCB2YWx1ZSBmcm9tIHRoZSBjb250cm9sIGhpbXNlbGZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ2FuR2V0TnVsbEZyb21Db250cm9sVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgc3BlY2lmaWMgaW5kZXggY29ycmVzcG9uZHMgdG8gYSBudWxsIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNDaG9pY2VOdWxsKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgIGxldCBkY1ZhbHM6IERjVmFsdWVzID0gdGhpcy5nZXREY1ZhbHMoKTtcclxuICAgICAgcmV0dXJuIGRjVmFscy5pc051bGwoaWR4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wdXRlcyB0aGUgY29udHJvbCdzIHZhbHVlIGVpdGhlciBmcm9tIGV4cHJlc3Npb24gb3IgZmllbGQgYW5kIHJlZnJlc2hlcyB0aGUgR1VJIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JjZVJlZnJlc2hcIj48L3BhcmFtPlxyXG4gIGFzeW5jIENvbXB1dGVBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGZvcmNlUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICB0aGlzLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxFeHBJZCA+IDApIHtcclxuICAgICAgbGV0IHdhc0V2YWx1YXRlZDogYm9vbGVhbjtcclxuICAgICAgbGV0IHJlZldhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4od2FzRXZhbHVhdGVkKTtcclxuXHJcbiAgICAgIGxldCByZXRFeHA6IHN0cmluZyA9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5FdmFsdWF0ZUV4cHJlc3Npb24odGhpcy5fdmFsRXhwSWQsIHRoaXMuRGF0YVR5cGUsIHRoaXMuX3BpYy5nZXRTaXplKCksIHRydWUsIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgZmFsc2UsIHJlZldhc0V2YWx1YXRlZCk7XHJcbiAgICAgIHdhc0V2YWx1YXRlZCA9IHJlZldhc0V2YWx1YXRlZC52YWx1ZTtcclxuICAgICAgaWYgKHdhc0V2YWx1YXRlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShyZXRFeHAsIHJldEV4cCA9PT0gbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCByZWZWYWx1ZTogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbTxzdHJpbmc+KHZhbHVlKTtcclxuICAgICAgICBsZXQgcmVmSXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbTxib29sZWFuPihpc051bGwpO1xyXG4gICAgICAgICg8R3VpVGFza0Jhc2U+dGhpcy5fZmllbGQuZ2V0VGFzaygpKS5nZXRGaWVsZERpc3BsYXlWYWx1ZSh0aGlzLl9maWVsZCwgcmVmVmFsdWUsIHJlZklzTnVsbCk7XHJcbiAgICAgICAgdmFsdWUgPSByZWZWYWx1ZS52YWx1ZTtcclxuICAgICAgICBpc051bGwgPSByZWZJc051bGwudmFsdWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKHZhbHVlLCBpc051bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiAhc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlWYWx1ZSh0aGlzLlZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRGVjaWRlcyBpZiB0aGUgY29udHJvbCBzaG91bGQgYmUgcmVmcmVzaGVkIHdoaWxlIGVudGVyaW5nIGEgY29udHJvbC4gVmFsdWVzIGZvciBzb21lIGRhdGEgdHlwZXNcclxuICAvLy8gYXJlIGRpc3BsYXllZCBkaWZmZXJlbnRseSB3aGlsZSBwYXJrZWQgb24gdGhlIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQgJiYgdGhpcy5nZXRGaWVsZCgpICE9PSBudWxsICYmICh0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHxcclxuICAgICAgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FIHx8IHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheWVkIHZhbHVlIG9ubHkgKHdpdGhvdXQgdGhlIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2wpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+aXMgdGhlIG1hZ2ljIGludGVybmFsIHZhbHVlIG9mIHRoZSBwcmVzZW50YXRpb24gdmFsdWU8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5VmFsdWUobWdWYWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBsZXQgdmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBzYXZlVmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdmFsdWVDaGFuZ2VkO1xyXG5cclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIC8vIEFUVEVOVElPTjpcclxuICAgIC8vIHRoZSB1c2Ugb2YgdGhlIGZ1bmN0aW9uIGdldE5hbWUoKSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBuYW1lIG1lbWJlciB2YXJpYWJsZVxyXG4gICAgLy8gaXMgdG8gZW5oYW5jZSB0aGUgdXNlIG9mIGNvbnRyb2xzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gYSB0YWJsZVxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgbGV0IHByZXZWYWx1ZTogc3RyaW5nID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgbGV0IHByZXZOdWxsOiBib29sZWFuID0gdGhpcy5nZXRQcmV2SXNOdWxsKCk7XHJcblxyXG4gICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKHRoaXMuRGF0YVR5cGUpKSB7XHJcbiAgICAgICAgaWYgKFN0clV0aWwucnRyaW0obWdWYWwpID09PSBTdHJVdGlsLnJ0cmltKHByZXZWYWx1ZSkgfHxcclxuICAgICAgICAgIChtZ1ZhbCAhPT0gbnVsbCAmJiBTdHJVdGlsLnJ0cmltKG1nVmFsKSA9PT0gU3RyVXRpbC5ydHJpbShwcmV2VmFsdWUpKSkge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJldk51bGwgIT09IHRoaXMuSXNOdWxsKSB7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICA7XHJcbiAgICAgICAgaWYgKG1nVmFsID09PSBwcmV2VmFsdWUgfHwgKG1nVmFsICE9PSBudWxsICYmIG1nVmFsID09PSBwcmV2VmFsdWUpKVxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChwcmV2TnVsbCAhPT0gdGhpcy5Jc051bGwpXHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIG1nVmFsKTtcclxuICAgICAgdGhpcy5zZXRQcmV2SXNOdWxsKHRoaXMuSXNOdWxsKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0dST1VQOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1RBVFVTX0JBUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX1NFVDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTlRBSU5FUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX0ZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TQl9MQUJFTDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJTkU6XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUjpcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQgJiYgdGhpcy5WYWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLnNldFVybCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU0JfSU1BR0U6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkICYmIHRoaXMuVmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5zZXRJbWFnZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YOlxyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCB8fCAgdGhpcy5mb3JjZVJlZnJlc2gpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tCb3hWYWx1ZShsaW5lLCBtZ1ZhbCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09NQk86XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUOlxyXG4gICAgICAgICAgc2F2ZVZhbHVlQ2hhbmdlZCA9IHZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGZpeGVkIGJ1ZyM6Nzc2MjE1LCA4MDA3NjMsOTQxODQxLCB0aGUgcHJldlZhbHVlIGlzIHNhdmUgYXMgbWd2YWwgbmVlZCB0byBjb252ZXJ0IHRvIGxheWVyXHJcbiAgICAgICAgICAgIGxldCBwcmV2RGlzcGxheVZhbHVlOiBudW1iZXJbXSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBGaXggYnVnIzo3ODQzOTFcclxuICAgICAgICAgICAgLy8gSWYgSXRlbUxpc3Qgd2FzIHVwZGF0ZSByZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UgdGhlbiB0aGUgdmFsdWUgbXVzdCBiZSBzZXRcclxuXHJcbiAgICAgICAgICAgIGlmIChzYXZlVmFsdWVDaGFuZ2VkID09PSB2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBpZiAocHJldlZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwcmV2RGlzcGxheVZhbHVlID0gdGhpcy5nZXRMYXllckZyb21MaW5rSWR4KGF3YWl0IHRoaXMuZ2V0SW5kZXhPZkNob2ljZShwcmV2VmFsdWUsIGxpbmUsIHByZXZOdWxsKSk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcHJldkRpc3BsYXlWYWx1ZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocHJldkRpc3BsYXlWYWx1ZVtpXSA9PT0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfVkFMVUVfSU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldkRpc3BsYXlWYWx1ZVtpXSA9IEd1aUNvbnN0YW50cy5ERUZBVUxUX0xJU1RfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGluZGljZSA9IE1pc2MuR2V0SW50QXJyYXkodGhpcy5WYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyZW50TGF5ZXIgPSB0aGlzLmdldEN1cnJlbnRMaW5rSWR4KCk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFZhbHVlLCBpbmRpY2VbMF0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZExheWVyLCBjdXJyZW50TGF5ZXIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgbGluZSwgaW5kaWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsICt0aGlzLlZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5IYXNBdXRvY29tcGxldGUoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZSwgdmFsdWVDaGFuZ2VkKTtcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgLy8gaWYgKGZvcm0uZm9ybVJlZnJlc2hlZCgpIHx8IGZvcmNlUmVmcmVzaCB8fCB2YWxFeHAgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAvLyB2YWxFeHAuY29tcHV0ZWRCeUNsaWVudE9ubHkoKSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRJbWFnZVdpdGhGaWxlTmFtZSh0aGlzLlZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPOlxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZSwgdmFsdWVDaGFuZ2VkKTtcclxuICAgICAgICAgIGlmICghdmFsdWVDaGFuZ2VkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB0aGlzLnNldFJhZGlvQ2hlY2tlZCgrdGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAvLyBzZXRSYWRpb0NoZWNrZWQodmFsdWUgLmxlbmd0aCgpID09IDAgPyBERUZBVUxUX1ZBTFVFX0lOVCA6IEludGVnZXIucGFyc2VJbnQodmFsdWUpKTtcclxuICAgICAgICAgIC8vIGlmICghdGFzay5zdGFydFByb2Nlc3MoKSlcclxuICAgICAgICAgIC8vIGd1aU1hbmFnZXIuc2V0Rm9jdXModGhpcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5SZWZyZXNoRGlzcGxheVZhbHVlKCkgdW5rbm93biB0eXBlOiB7MH1cIiwgdGhpcy5UeXBlKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSAmJiB2YWx1ZUNoYW5nZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFLCBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCB0cnVlKSwgZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoZXhfMzYwKSB7XHJcbiAgICAgIGlmIChleF8zNjAgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIENvbnRyb2wuUmVmcmVzaERpc3BsYXlWYWx1ZSgpIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4XzM2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KG9ubHlSZXBlYXRhYmxlUHJvcHM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQob25seVJlcGVhdGFibGVQcm9wcykpXHJcbiAgICAgIG9ubHlSZXBlYXRhYmxlUHJvcHMgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlfMShvbmx5UmVwZWF0YWJsZVByb3BzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBjb250cm9sIGluY2x1ZGluZyBpdHMgdmFsdWUgYW5kIGl0cyBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZXBlYXRhYmxlUHJvcHNcIj5pZiBjb250cm9sIHRyZWUgLSByZWZyZXNoZXMgb25seSByZXBlYXRhYmxlIHRyZWUgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBSZWZyZXNoRGlzcGxheV8xKG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAjNDIyMjUwLiBTa2lwIHRoZSByZWZyZXNoIGRpc3BsYXkgb2YgdGhlIHBhcmVudCdzIHN1YmZvcm0gY29udHJvbCBpZiB0aGUgZm9ybSBpbnNpZGUgaXQgaXMgc3RpbGwgaW4gaXRzIFJlZnJlc2hEaXNwbGF5LlxyXG4gICAgaWYgKCEoc3VwZXIuaXNTdWJmb3JtKCkgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkgIT09IG51bGwgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKSkge1xyXG5cclxuICAgICAgLy8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wcyk7XHJcblxyXG4gICAgICAvLyBjb21wdXRlIGFuZCBkaXNwbGF5IHRoZSB2YWx1ZS5cclxuICAgICAgaWYgKHRoaXMuU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleGVjdXRlcyB0aGUgcmVhZG9ubHkgY29tbWFuZCBvbmx5IGlmIG5lZWRlZFxyXG4gICAgICBsZXQgaXNQYXJrYWJsZUN0cmw6IGJvb2xlYW4gPSAhKGF3YWl0IHRoaXMuaXNQYXJrYWJsZShmYWxzZSkpIHx8ICEgYXdhaXQgdGhpcy5pc01vZGlmaWFibGUoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldEN1cnJSZWFkT25seSgpICE9PSBpc1BhcmthYmxlQ3RybCkge1xyXG4gICAgICAgIHRoaXMuU2V0Q3VyclJlYWRPbmx5KGlzUGFya2FibGVDdHJsKTtcclxuICAgICAgICBhd2FpdCBNYW5hZ2VyLlNldFJlYWRPbmx5Q29udHJvbCh0aGlzLCBpc1BhcmthYmxlQ3RybCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtdXN0SW5wdXRQcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCk7XHJcbiAgICAgIC8vIG5lZWQgdG8gY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgY29udHJvbCdzIGRhdGEgaXMgYW4gZXhwcmVzc2lvblxyXG4gICAgICAvLyBvciB0aGUgZm9ybWF0IGlzIGV4cHJlc3Npb24uIFdoZW4gdGhlIGZvcm1hdCBpcyBjaGFuZ2VkLCB0aGUgZGlzcGxheSB2YWwgbWF5IGNoYW5nZSBhcyB3ZWxsLlxyXG4gICAgICBpZiAobXVzdElucHV0UHJvcGVydHkgIT0gbnVsbCAmJiBtdXN0SW5wdXRQcm9wZXJ0eS5pc0V4cHJlc3Npb24oKSkge1xyXG5cclxuICAgICAgICBsZXQgcHJldk11c3RJbnB1dDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAocHJldk11c3RJbnB1dCAhPT0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpKVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLk11c3RJbnB1dCwgIXByZXZNdXN0SW5wdXQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYobXVzdElucHV0UHJvcGVydHkgIT0gbnVsbCl7XHJcbiAgICAgICAgbGV0IG11c3RJbnB1dFZhbDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpO1xyXG4gICAgICAgIGlmKG11c3RJbnB1dFZhbClcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLk11c3RJbnB1dCwgbXVzdElucHV0VmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9JTiwgdHJ1ZSkpXHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuVGFiSW5kZXgsIC0xKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBSaWNoIENsaWVudCBjb21wdXRlIGFuZCByZWZyZXNoIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhbHdheXMsIGFsc28gaWYgdGhlIGZvcm0gaXMgbm90IHlldCBvcGVuZWQuXHJcbiAgLy8vIEZvciBPbmxpbmUgb25seSBmb3Igb3BlbmVkIGZvcm1zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRDb21wdXRlQW5kUmVmcmVzaE9uQ2xvc2VkRm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBSZWZyZXNoZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2wuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbmx5UmVwZWF0YWJsZVByb3BzXCI+PC9wYXJhbT5cclxuICBhc3luYyByZWZyZXNoUHJvcGVydGllcyhvbmx5UmVwZWF0YWJsZVByb3BzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSAmJiB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzKVxyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9BVFRSSUJVVEUsIHRoaXMsIHRoaXMuRGF0YVR5cGUuY2hhckNvZGVBdCgwKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0UHJvcHMoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ab29tQnV0dG9uSW5pdGlhbGl6YXRpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuX3Byb3BUYWIuUmVmcmVzaERpc3BsYXkoZmFsc2UsIG9ubHlSZXBlYXRhYmxlUHJvcHMpKSkge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sICd7MH0nOiBOb3QgYWxsIHByb3BlcnRpZXMgY291bGQgYmUgc2V0XCIsIHRoaXMuZ2V0TmFtZSgpKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcykge1xyXG4gICAgICAgICAgaWYgKCFvbmx5UmVwZWF0YWJsZVByb3BzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgbXNnOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sICd7MH0nOiB7MX1cIiwgdGhpcy5nZXROYW1lKCksIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKG1zZy5Ub1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hUYWJGb3JMYXllckxpc3QobGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VycmVudExpbmtWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBoYXMgYWxyZWFkeSBvcGVuZWQsIGdldCB0aGUgY3VycmVudCBsaW5rIHZhbHVlIGJlZm9yZVxyXG4gICAgLy8gY2hhbmdpbmcgdGhlIGxheWVyIGxpc3QgaS5lLiBiZWZvcmUgY2FsbGluZyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KCkuXHJcbiAgICAvLyBBbmQgdGhlbiwgYWZ0ZXIgY2hhbmdpbmcgdGhlIGxheWVyIGxpc3QsIHNlbGVjdCB0aGUgVEFCIGNvcnJlc3BvbmRpbmdcclxuICAgIC8vIHRvIHRoZSBjdXJyZW50IGxpbmsgdmFsdWUuXHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkuT3BlbmVkKSB7XHJcbiAgICAgIGxldCBpbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpO1xyXG4gICAgICBsZXQgY3VycmVudExheWVyOiBudW1iZXIgPSBpbmRpY2VbMF07XHJcbiAgICAgIGN1cnJlbnRMaW5rVmFsdWUgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShjdXJyZW50TGF5ZXIudG9TdHJpbmcoKSwgbGluZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgZmFsc2UpO1xyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpLk9wZW5lZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLlNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoY3VycmVudExpbmtWYWx1ZSwgdGhpcy5Jc051bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGl0ZW0gbGlzdCBhbmQgc2V0IGl0IGludG8gdGhlIGd1aSBjb250cm9sIGlmIGl0IGlzIGNvbWJvIGJveCAsIHJlZnJlc2ggYWxzbyB0aGUgdmlzaWJsZVxyXG4gIC8vLyAgIGxpbmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICB0aGlzLmNsZWFyUmFuZ2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9uc1N0cmluZ3M6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSB8fCB0aGlzLkhhc0F1dG9jb21wbGV0ZSgpKSB7XHJcblxyXG4gICAgICBsZXQgb3B0aW9ucyA9IG9wdGlvbnNTdHJpbmdzLm1hcCgoZGlzcGxheVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7aW5kZXgsIGRpc3BsYXlWYWx1ZX1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgY2hvaWNlIGxpc3Qgb2YgYSBTRUxFQ1QgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaERpc3BSYW5nZShleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIGxldCBzZWxlY3RDbWQ6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMCk7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuXHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgbGV0IGRpc3BWYWxzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMuZ2V0RGlzcFZhbHMobGluZSwgZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCkge1xyXG4gICAgICAgIHNlbGVjdENtZCA9IE1nQ29udHJvbEJhc2UuY29tYmluZVN0cmluZ0FycmF5cyhkaXNwVmFscywgZGN2LmdldERpc3BWYWxzKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc2VsZWN0Q21kID0gYXdhaXQgdGhpcy5nZXREaXNwVmFscyhsaW5lLCBleGVjQ29tcHV0ZUNob2ljZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yYW5nZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0T3JkZXJlZERpc3BMaXN0KHNlbGVjdENtZCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlZnJlc2ggdGhlIGl0ZW1zIGxpc3Qgb2YgdGhlIHNlbGVjdGlvbiBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhlY0NvbXB1dGVDaG9pY2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgcmVmcmVzaEl0bVJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG5cclxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciBzZWxlY3Rpb24gY29udHJvbC5cclxuICAgIERlYnVnLkFzc2VydCh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKTtcclxuICAgIGxldCBvcmRlcmVkSXRtTGlzdDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigwKTtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgbGlua1ZhbHM6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICBpZiAodGhpcy5faGFzVmFsaWRJdG1BbmREaXNwVmFsKSB7XHJcbiAgICAgIG9yZGVyZWRJdG1MaXN0ID0gTWdDb250cm9sQmFzZS5jb21iaW5lU3RyaW5nQXJyYXlzKGxpbmtWYWxzLCBkY3YuR2V0TGlua1ZhbHMoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0T3JkZXJlZERpc3BMaXN0KG9yZGVyZWRJdG1MaXN0LCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBpdGVtcyB2YWx1ZXMgZnJvbSBkYXRhIHNvdXJjZSAmIGl0ZW0gbGlzdCBwcm9wZXJ0eS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0SXRlbXNSYW5nZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoSXRtUmFuZ2UoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGRpc3BsYXkgdmFsdWVzIGZyb20gZGF0YSBzb3VyY2UgJiBkaXNwbGF5IGxpc3QgcHJvcGVydHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldERpc3BsYXlSYW5nZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0UHJvcHMoKSB7XHJcbiAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSk7XHJcblxyXG4gICAgLy8gRml4ZWQgYnVnIzo3ODE3NDFcclxuICAgIC8vIGluIDEuOSAtLT5cclxuICAgIC8vIHdoZW4gYXNrIGFib3V0IGFueSBwcm9wZXJ0eShQUk9QX1RZUEVfRU5BQkxFRCkgd2Ugd2FzIGNyZWF0ZWQgdGhlIGRlZmF1bHQgcHJvcGVydHkgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSh0cnVlKS5cclxuICAgIC8vIGFuZCB3aGVuIGdldCB0byBSZWZyZXNoUHJvcHMgb2YgdGhlIHByb3BlcnR5IFwiUFJPUF9UWVBFX0VOQUJMRURcIiB3ZSB3YXMgYWRkIGNvbW1hbmQgdG8gdGhlIHF1ZXVlIGluIGd1aSB0aHJlYWRcclxuICAgIC8vIHRoZSBjb21tYW5kIHdhcyB3YXMgdXBkYXRlIHRoZSBUYWdEYXRhLkVuYWJsZSB0byBiZSBcInRydWVcIlxyXG4gICAgLy8gaW4gMi4wIC0tPlxyXG4gICAgLy8gd2UgdXNlaW5nIGEgbmV3IG1ldGhvZCBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eSgpIHRoYXQgbm90IGNyZWF0ZWQgYW55IGRlZmF1bHQgcHJvcGVydHkgYW5kIG5vIGdldCB0byByZWZyZXNoUHJvcFxyXG4gICAgLy8gb24gdGhlIHByb3BlcnR5IGFuZCB0aGUgdmFsdWUgb24gdGhlIENvbnRyb2wuRW5hYmxlIHdhcyB3cm9uZ1xyXG4gICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQpO1xyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IExpbmtlZCBQYXJlbnQgSWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5rZWRQYXJlbnREaXRJZHhcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0TGlua2VkUGFyZW50SWR4KGxpbmtlZFBhcmVudERpdElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggPSBsaW5rZWRQYXJlbnREaXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB2YWxpZGF0aW9uIGRldGFpbHMgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZFZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGJ1aWxkUGljdHVyZShvbGRWYWw6IGFueSwgdmFsOiBhbnkpOiBWYWxpZGF0aW9uRGV0YWlscyB7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkgfHwgc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9waWNFeHBFeGlzdHMpIHtcclxuICAgICAgdGhpcy5fdmQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3ZkID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZkID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzKG9sZFZhbCwgdmFsLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0aGlzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl92ZC5zZXRWYWx1ZSh2YWwpO1xyXG4gICAgICB0aGlzLl92ZC5zZXRPbGRWYWx1ZShvbGRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl92ZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVja3MgaWYgdGhlIHNlbnQgdmFsdWUgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGNvbnRyb2wncyBleGlzdGluZyB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiTmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2hlY2tOdWxsVmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEaWZmZXJlbnRWYWx1ZShuZXdWYWx1ZTogYW55LCBpc051bGw6IGJvb2xlYW4sIGNoZWNrTnVsbFZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IGN0cmxDdXJyVmFsdWU6IGFueSA9IHRoaXMuVmFsdWU7XHJcbiAgICBsZXQgdmFsQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSlcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIXRoaXMuQ29tcGFyZURhdGUobmV3VmFsdWUsIGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICF0aGlzLkNvbXBhcmVUaW1lKG5ld1ZhbHVlLCBjdHJsQ3VyclZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG5ld1ZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSAmJiB0eXBlb2YgY3RybEN1cnJWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBsZXQgbmV3VmFsdWVzdHIgPSBuZXdWYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAobmV3VmFsdWVzdHIgIT09IGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAobmV3VmFsdWUgIT09IGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25DdHJsKCkgJiYgdHlwZW9mIGN0cmxDdXJyVmFsdWUgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpKSB7XHJcbiAgICAgICAgbGV0IG5ld1ZhbHVlU3RyID0gbmV3VmFsdWUuam9pbignLCcpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICEoU3RyVXRpbC5ydHJpbShuZXdWYWx1ZVN0cikgPT09IFN0clV0aWwucnRyaW0oY3RybEN1cnJWYWx1ZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBjdHJsQ3VycklzTnVsbDogYm9vbGVhbiA9IHRoaXMuSXNOdWxsO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhKFN0clV0aWwucnRyaW0obmV3VmFsdWUpID09PSBTdHJVdGlsLnJ0cmltKGN0cmxDdXJyVmFsdWUpKTtcclxuICAgICAgICBpZiAoIXZhbENoYW5nZWQgJiYgY2hlY2tOdWxsVmFsdWUpIHtcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSAoaXNOdWxsICE9PSBjdHJsQ3VycklzTnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIENvbXBhcmVEYXRlKGQxOiBEYXRlLCBkMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldHZhbDogYm9vbGVhbjtcclxuICAgIGlmIChkMSA9PT0gbnVsbCAmJiBkMiA9PT0gbnVsbClcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKChkMSA9PT0gbnVsbCAmJiBkMiAhPT0gbnVsbCkgfHwgKGQxICE9PSBudWxsICYmIGQyID09PSBudWxsKSlcclxuICAgICAgcmV0dmFsID0gZmFsc2U7XHJcbiAgICBlbHNlIGlmIChkMS5nZXRGdWxsWWVhcigpID09PSBkMi5nZXRGdWxsWWVhcigpXHJcbiAgICAgICYmIGQxLmdldERhdGUoKSA9PT0gZDIuZ2V0RGF0ZSgpXHJcbiAgICAgICYmIGQxLmdldE1vbnRoKCkgPT09IGQyLmdldE1vbnRoKCkpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG4gIH1cclxuXHJcbiAgQ29tcGFyZVRpbWUoZDE6IERhdGUsIGQyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0dmFsOiBib29sZWFuO1xyXG4gICAgaWYgKGQxID09PSBudWxsICYmIGQyID09PSBudWxsKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoKGQxID09PSBudWxsICYmIGQyICE9PSBudWxsKSB8fCAoZDEgIT09IG51bGwgJiYgZDIgPT09IG51bGwpKVxyXG4gICAgICByZXR2YWwgPSBmYWxzZTtcclxuICAgIGVsc2UgaWYgKGQxLmdldEhvdXJzKCkgPT09IGQyLmdldEhvdXJzKClcclxuICAgICAgJiYgZDEuZ2V0TWludXRlcygpID09PSBkMi5nZXRNaW51dGVzKClcclxuICAgICAgJiYgZDEuZ2V0U2Vjb25kcygpID09PSBkMi5nZXRTZWNvbmRzKCkpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgY29sdW1uJ3Mgc29ydGFibGUgcHJvcGVydHkgaXMgc2V0IHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDb2x1bW5Tb3J0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1NvcnRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmIHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTikpIHtcclxuICAgICAgaXNTb3J0YWJsZSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTikuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNTb3J0YWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGZpcnN0IGNoaWxkIE1nQ29udHJvbCBvZiBjb2x1bW4gaS5lLiBmaWVsZCBhdHRhY2hlZCB0byBjb2x1bW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcblxyXG4gIGdldENvbHVtbkNoaWxkQ29udHJvbCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmICh0aGlzLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTilcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgbGV0IGxpbmtlZENvbnRyb2xzOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gdGhpcy5fcGFyZW50VGFibGUuZ2V0TGlua2VkQ29udHJvbHMoKTtcclxuXHJcbiAgICByZXR1cm4gbGlua2VkQ29udHJvbHMuZmluZCgoY29udHJvbDogTWdDb250cm9sQmFzZSkgPT4gKGNvbnRyb2wuZ2V0TGF5ZXIoKSA9PT0gdGhpcy5nZXRMYXllcigpICYmIGNvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmICFjb250cm9sLklzVGFibGVIZWFkZXJDaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBjb250cm9sIG5hbWUgZm9yIGhhbmRsZXIgc2VhcmNoIHByb3Bvc2UuXHJcbiAgLy8vICAgVGhlIGNvbnRyb2wgaXRzZWxmLCBtYXkgbm90IGhhdmUgYSBuYW1lIGZvciBoYW5kbGVyIHNlYXJjaCAobGlrZSBjb2x1bW4gY29udHJvbCwgaW4gd2hpY2ggd2UgbmVlZCB0byB1c2VcclxuICAvLy8gICB0aGUgY2hpbGQgY29udHJvbCBuYW1lIGZvciBoYW5kbGVycyBzZWFyY2gpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbnRyb2xOYW1lRm9ySGFuZGxlclNlYXJjaCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNoaWxkQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk7XHJcbiAgICBpZiAoY2hpbGRDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBjaGlsZENvbnRyb2wuTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIGxpbmtlZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBsaW5rQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRDb250cm9scy5wdXNoKGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGNvbnRyb2wgZnJvbSB0aGUgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZkZyb21GaWVsZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9maWVsZC5SZW1vdmVDb250cm9sKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGRpdCBpbmRleCBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGl0SWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIGRjVmFsSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRjVmFsSWRcIj48L3BhcmFtPlxyXG4gIHNldERjVmFsSWQoZGNWYWxJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1ZhbElkID0gZGNWYWxJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpZiB0aGUgcGljdHVyZSBkZWZpbmUgYXMgaGVicmV3IHRoZW4gc2V0IHRoZSBsYW5nIHRvIGhlYnJldywgb3RoZXJ3aXNlIHJlc3RvcmUgdGhlIGxhbmdcclxuICAvLy8gICBUaGUgc2FtZSB3ZSBkb2luZyBmb3Igb25saW5lIDplZHRfZWRpdC5jcHAgOiBTZXRLZXlib2FyZExhbmd1YWdlKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdG9yZUxhbmdcIj48L3BhcmFtPlxyXG4gIFNldEtleWJvYXJkTGFuZ3VhZ2UoKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbml0aWFsaXplIGNvbnRyb2wgcHJvcGVydGllcyBmb3IgZGVyaXZlZCBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4oaW50ZXJuYWwpXHJcbiAgLy8vIGNoZWNrcyBpZiBjb250cm9sIGlzIHBhcmthYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIElzUGFya2FibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pc1BhcmthYmxlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PihpbnRlcm5hbClcclxuICAvLy8gY2hlY2tzIGlmIGNvbnRyb2wgaGFzIGV4cHJlc3Npb24gb3IgUGFyZW50IHRhc2sgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSGFzRXhwT3JQYXJlbnRUYXNrRmllbGQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICByZXR1cm4gKHRoaXMuZ2V0RmllbGQoKSA9PT0gbnVsbCB8fCB0aGlzLmdldEZpZWxkKCkuZ2V0VGFzaygpICE9PSB0YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tFbmFibGVkQW5kVmlzaWJsZVwiPmNoZWNrIGVuYWJsZWQgYW5kIHZpc2libGUgcHJvcGVydGllcyB0b288L3BhcmFtPlxyXG4gIGFzeW5jIGlzUGFya2FibGUoY2hlY2tFbmFibGVkQW5kVmlzaWJsZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICByZXN1bHQgPSAhc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiAhc3VwZXIuaXNDb2x1bW5Db250cm9sKCk7XHJcblxyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgLy8gbm9uIGludGVyYWN0aXZlIC0+IG5vdCBwYXJrYWJsZS5cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgcmVzdWx0ID0gdGFzay5Jc0ludGVyYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQgJiYgdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSAmJiB0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5QYXJ0T2ZEYXRhdmlldykge1xyXG4gICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgLy8gUUNSICM0NDExNzcuIFdoZW4gd2UgY2hlY2sgdGhlIHN1YmZvcm0gcGFyayBhYmlsaXR5LCB3ZSBuZWVkIHRvIGNoZWNrIGFsc28gaXQncyB2aXNpYmlsaXR5IGFuZCBlbmFibGUgcHJvcGVydGllcy5cclxuICAgICAgaWYgKCFzdXBlci5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gKCh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5nZXRUYXNrKCkgPT09IHRhc2spIHx8IHRoaXMuaXNCdXR0b24oKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdCAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5pc1Zpc2libGUoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgocmVzdWx0ICYmIHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsKSAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpICYmIHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmFpc2UgQUNUX0NUUkxfSElUIG9uIGxlZnQgbW91c2UgY2xpY2sgaWYgaXQgbWVldHMgZm9sbG93aW5nIGNvbmRpdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmFpc2VDb250cm9sSGl0T25MZWZ0Q2xpY2tPZk1vdXNlRG93bigpOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICghc3VwZXIuSXNIeXBlclRleHRCdXR0b24oKSAmJiAhc3VwZXIuaXNSYWRpbygpICYmICFzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICByYWlzZUN0cmxIaXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhaXNlQ3RybEhpdDtcclxuICB9XHJcblxyXG4gIEdldFZhckluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgJ0NvbnRyb2wgSGl0JyBldmVudCBzaG91bGQgYmUgcmFpc2VkIG9uIG1vdXNlIGRvd24uXHJcbiAgLy8vIFRoZSBtZXRob2Qgd2FzIGV4dHJhY3RlZCBmcm9tIHByb2Nlc3NNb3VzZURvd24sIHNpbmNlIHdlIG1pZ2h0IGhhdmUgZGlmZmVyZW50XHJcbiAgLy8vIGJlaGF2aW9ycyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRyZWUgY29udHJvbHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZWZ0Q2xpY2tXYXNQcmVzc2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFJhaXNlQ29udHJvbEhpdE9uTW91c2VEb3duKGxlZnRDbGlja1dhc1ByZXNzZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChsZWZ0Q2xpY2tXYXNQcmVzc2VkKSB7XHJcbiAgICAgIGlmICh0aGlzLlJhaXNlQ29udHJvbEhpdE9uTGVmdENsaWNrT2ZNb3VzZURvd24oKSkge1xyXG4gICAgICAgIHJhaXNlQ3RybEhpdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByYWlzZUN0cmxIaXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZSBNR19BQ1RfSElUIG9uIHRoZSBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE9uU3ViZm9ybUNsaWNrKCk6IHZvaWQge1xyXG4gICAgTWFuYWdlci5FdmVudHNNYW5hZ2VyLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0hJVCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgTWdGb3JtIG9mIHRoZSBzdWJmb3JtIGNvbnRyb2wgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0U3ViZm9ybU1nRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUHJvcGVydHlFeGlzdHMoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhpZCk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IFwiICsgTWdDb250cm9sVHlwZVt0aGlzLlR5cGVdICsgXCJ9XCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyBpZiBuZXcgZGF0ZSBpcyAwPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+IFRoZSB2YWx1ZSB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNEYXRlWmVybyh2YWw6IERhdGUpIHtcclxuICAgIGxldCB6ZXJvRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgaWYgKHZhbC5nZXRNb250aCgpID09PSAwICYmIHZhbC5nZXRGdWxsWWVhcigpID09PSAwICYmIHZhbC5nZXREYXkoKSA9PT0gMClcclxuICAgICAgICB6ZXJvRGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gemVyb0RhdGU7XHJcbiAgfVxyXG5cclxuICBJc0RlZmF1bHRSb3V0ZXJPdXRsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSAmJiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9PVVRMRVQsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBJc1JvdXRlck91dGxldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNICYmIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVULCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgWm9vbUJ1dHRvbkluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaXNUZXh0Q29udHJvbCgpICYmIHRoaXMuY2hlY2tJZkV4aXN0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MKSkge1xyXG4gICAgICBsZXQgY29ubmVjdGVkQnV0dG9uOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5Gb3JtLkN0cmxUYWIuR2V0Q29udHJvbEJ5SXNuKChhd2FpdCAoYXdhaXQgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0wpKS5nZXRWYWx1ZUludCgpKSk7XHJcblxyXG4gICAgICBpZiAoY29ubmVjdGVkQnV0dG9uKSB7XHJcbiAgICAgICAgLy8gaW1hZ2UgYnV0dG9uIC0gY2FsY3VsYXRlIGFjY29yZGluZyB0byBpbWFnZVxyXG4gICAgICAgIGxldCBpbWFnZUZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGlmIChjb25uZWN0ZWRCdXR0b24uSXNJbWFnZUJ1dHRvbigpICYmIGNvbm5lY3RlZEJ1dHRvbi5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkpIHtcclxuICAgICAgICAgIGltYWdlRmlsZU5hbWUgPSBhd2FpdCAoYXdhaXQgY29ubmVjdGVkQnV0dG9uLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpKS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgaWYgKCFNaXNjLklzV2ViVXJsKGltYWdlRmlsZU5hbWUpKVxyXG4gICAgICAgICAgICBpbWFnZUZpbGVOYW1lID0gRXZlbnRzLkdldEFzc2V0c1VSTCgpICsgXCIvaW1hZ2VzL1wiICsgaW1hZ2VGaWxlTmFtZTtcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9TVFlMRSwgdGhpcywgMCwgTWFnaWNQcm9wZXJ0aWVzLkltYWdlRmlsZSwgaW1hZ2VGaWxlTmFtZSk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc3RvcmUgdGhlIGVkaXQgY29udHJvbCBvbiB0aGUgYnV0dG9uXHJcbiAgICAgICAgdGhpcy5Db25uZWN0ZWRDb250cm9sID0gY29ubmVjdGVkQnV0dG9uO1xyXG4gICAgICAgIGNvbm5lY3RlZEJ1dHRvbi5Db25uZWN0ZWRDb250cm9sID0gdGhpcztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=