@sapui5/sap.fe.templates 1.100.0 → 1.102.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -5
- package/src/sap/fe/templates/.library +1 -2
- package/src/sap/fe/templates/AnalyticalListPage/Component.js +24 -12
- package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
- package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +30 -32
- package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
- package/src/sap/fe/templates/Feedback.js +80 -0
- package/src/sap/fe/templates/Feedback.ts +67 -0
- package/src/sap/fe/templates/ListComponent.js +156 -118
- package/src/sap/fe/templates/ListComponent.ts +105 -0
- package/src/sap/fe/templates/ListReport/Component.js +82 -53
- package/src/sap/fe/templates/ListReport/Component.ts +39 -0
- package/src/sap/fe/templates/ListReport/ExtensionAPI.js +126 -112
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +106 -0
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +106 -58
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1196 -1081
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1088 -0
- package/src/sap/fe/templates/ListReport/ListReportTemplating.js +45 -0
- package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +30 -0
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +54 -53
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
- package/src/sap/fe/templates/ListReport/overrides/Share.js +137 -137
- package/src/sap/fe/templates/ListReport/overrides/Share.ts +135 -0
- package/src/sap/fe/templates/ListReport/overrides/ViewState.js +451 -428
- package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +419 -0
- package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +25 -25
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
- package/src/sap/fe/templates/ListReport/view/fragments/{MultipleMode.fragment.xml → MultipleModeOld.fragment.xml} +24 -23
- package/src/sap/fe/templates/ObjectPage/Component.js +169 -138
- package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +140 -142
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
- package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +162 -22
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1534 -1447
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1454 -0
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +872 -0
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +837 -0
- package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +136 -101
- package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
- package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +24 -21
- package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
- package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +98 -53
- package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
- package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +20 -19
- package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +50 -47
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +34 -34
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +15 -15
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +11 -11
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +55 -52
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
- package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +15 -17
- package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +13 -17
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
- package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +23 -21
- package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
- package/src/sap/fe/templates/ObjectPage/overrides/Share.js +310 -317
- package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +66 -57
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +26 -33
- package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -10
- package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +15 -15
- package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +31 -27
- package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +15 -16
- package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -5
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPointTitle.fragment.xml +1 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +3 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +16 -17
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +3 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +3 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/RelatedApps.fragment.xml +7 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +71 -6
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +114 -94
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContentLazyLoader.fragment.xml +127 -107
- package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +899 -817
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +833 -0
- package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +205 -189
- package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
- package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +484 -459
- package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
- package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +16 -14
- package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
- package/src/sap/fe/templates/TableScroller.js +45 -53
- package/src/sap/fe/templates/TableScroller.ts +48 -0
- package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
- package/src/sap/fe/templates/controls/MacroChart.fragment.xml +23 -0
- package/src/sap/fe/templates/controls/Table.fragment.xml +3 -4
- package/src/sap/fe/templates/library.js +49 -63
- package/src/sap/fe/templates/library.ts +57 -0
- package/src/sap/fe/templates/messagebundle.properties +19 -7
- package/src/sap/fe/templates/messagebundle_ar.properties +12 -4
- package/src/sap/fe/templates/messagebundle_bg.properties +12 -4
- package/src/sap/fe/templates/messagebundle_ca.properties +12 -4
- package/src/sap/fe/templates/messagebundle_cs.properties +12 -4
- package/src/sap/fe/templates/messagebundle_cy.properties +12 -4
- package/src/sap/fe/templates/messagebundle_da.properties +12 -4
- package/src/sap/fe/templates/messagebundle_de.properties +12 -4
- package/src/sap/fe/templates/messagebundle_el.properties +12 -4
- package/src/sap/fe/templates/messagebundle_en.properties +12 -4
- package/src/sap/fe/templates/messagebundle_en_GB.properties +12 -4
- package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +13 -5
- package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +13 -5
- package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +13 -5
- package/src/sap/fe/templates/messagebundle_es.properties +12 -4
- package/src/sap/fe/templates/messagebundle_es_MX.properties +12 -4
- package/src/sap/fe/templates/messagebundle_et.properties +12 -4
- package/src/sap/fe/templates/messagebundle_fi.properties +12 -4
- package/src/sap/fe/templates/messagebundle_fr.properties +12 -4
- package/src/sap/fe/templates/messagebundle_fr_CA.properties +12 -4
- package/src/sap/fe/templates/messagebundle_hi.properties +12 -4
- package/src/sap/fe/templates/messagebundle_hr.properties +12 -4
- package/src/sap/fe/templates/messagebundle_hu.properties +12 -4
- package/src/sap/fe/templates/messagebundle_id.properties +12 -4
- package/src/sap/fe/templates/messagebundle_it.properties +12 -4
- package/src/sap/fe/templates/messagebundle_iw.properties +12 -4
- package/src/sap/fe/templates/messagebundle_ja.properties +12 -4
- package/src/sap/fe/templates/messagebundle_kk.properties +12 -4
- package/src/sap/fe/templates/messagebundle_ko.properties +12 -4
- package/src/sap/fe/templates/messagebundle_lt.properties +12 -4
- package/src/sap/fe/templates/messagebundle_lv.properties +12 -4
- package/src/sap/fe/templates/messagebundle_ms.properties +12 -4
- package/src/sap/fe/templates/messagebundle_nl.properties +12 -4
- package/src/sap/fe/templates/messagebundle_no.properties +12 -4
- package/src/sap/fe/templates/messagebundle_pl.properties +12 -4
- package/src/sap/fe/templates/messagebundle_pt.properties +13 -5
- package/src/sap/fe/templates/messagebundle_pt_PT.properties +12 -4
- package/src/sap/fe/templates/messagebundle_ro.properties +12 -4
- package/src/sap/fe/templates/messagebundle_ru.properties +12 -4
- package/src/sap/fe/templates/messagebundle_sh.properties +12 -4
- package/src/sap/fe/templates/messagebundle_sk.properties +12 -4
- package/src/sap/fe/templates/messagebundle_sl.properties +12 -4
- package/src/sap/fe/templates/messagebundle_sv.properties +12 -4
- package/src/sap/fe/templates/messagebundle_th.properties +12 -4
- package/src/sap/fe/templates/messagebundle_tr.properties +12 -4
- package/src/sap/fe/templates/messagebundle_uk.properties +12 -4
- package/src/sap/fe/templates/messagebundle_vi.properties +12 -4
- package/src/sap/fe/templates/messagebundle_zh_CN.properties +12 -4
- package/src/sap/fe/templates/messagebundle_zh_TW.properties +12 -4
- package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +0 -518
- package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +0 -120
- package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +0 -138
|
@@ -1,1085 +1,1200 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
5
4
|
*/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/table/Utils", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/ui/core/Core", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/fl/write/api/ControlPersonalizationWriteAPI", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, CommonUtils, EditFlow, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, TableUtils, ExtensionAPI, EditFlowOverrides, TableScroller, Core, OverrideExecution, Device, ControlPersonalizationWriteAPI, StateUtil, hasher, IntentBasedNavigationOverride, ShareOverrides, ViewStateOverrides) {
|
|
6
|
+
"use strict";
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
)
|
|
8
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
|
|
9
|
+
|
|
10
|
+
var system = Device.system;
|
|
11
|
+
var usingExtension = ClassSupport.usingExtension;
|
|
12
|
+
var publicExtension = ClassSupport.publicExtension;
|
|
13
|
+
var privateExtension = ClassSupport.privateExtension;
|
|
14
|
+
var finalExtension = ClassSupport.finalExtension;
|
|
15
|
+
var extensible = ClassSupport.extensible;
|
|
16
|
+
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
17
|
+
|
|
18
|
+
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
|
|
19
|
+
|
|
20
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
21
|
+
|
|
22
|
+
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
23
|
+
|
|
24
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
25
|
+
|
|
26
|
+
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
27
|
+
|
|
28
|
+
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
|
|
29
|
+
|
|
30
|
+
var TemplateContentView = CoreLibrary.TemplateContentView,
|
|
31
|
+
InitialLoadMode = CoreLibrary.InitialLoadMode;
|
|
32
|
+
var ListReportController = (_dec = defineUI5Class("sap.fe.templates.ListReport.ListReportController"), _dec2 = usingExtension(InternalRouting.override({
|
|
33
|
+
onAfterBinding: function () {
|
|
34
|
+
this.getView().getController()._onAfterBinding();
|
|
35
|
+
}
|
|
36
|
+
})), _dec3 = usingExtension(InternalIntentBasedNavigation.override({
|
|
37
|
+
getEntitySet: function () {
|
|
38
|
+
return this.base.getCurrentEntitySet();
|
|
39
|
+
}
|
|
40
|
+
})), _dec4 = usingExtension(SideEffects), _dec5 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec6 = usingExtension(Share.override(ShareOverrides)), _dec7 = usingExtension(EditFlow.override(EditFlowOverrides)), _dec8 = usingExtension(ViewState.override(ViewStateOverrides)), _dec9 = usingExtension(KPIManagement), _dec10 = usingExtension(Placeholder), _dec11 = usingExtension(MassEdit), _dec12 = publicExtension(), _dec13 = finalExtension(), _dec14 = privateExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
|
|
41
|
+
_inheritsLoose(ListReportController, _PageController);
|
|
42
|
+
|
|
43
|
+
function ListReportController() {
|
|
44
|
+
var _this;
|
|
45
|
+
|
|
46
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
47
|
+
args[_key] = arguments[_key];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
_this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
|
|
51
|
+
|
|
52
|
+
_initializerDefineProperty(_this, "_routing", _descriptor, _assertThisInitialized(_this));
|
|
53
|
+
|
|
54
|
+
_initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor2, _assertThisInitialized(_this));
|
|
55
|
+
|
|
56
|
+
_initializerDefineProperty(_this, "sideEffects", _descriptor3, _assertThisInitialized(_this));
|
|
57
|
+
|
|
58
|
+
_initializerDefineProperty(_this, "intentBasedNavigation", _descriptor4, _assertThisInitialized(_this));
|
|
59
|
+
|
|
60
|
+
_initializerDefineProperty(_this, "share", _descriptor5, _assertThisInitialized(_this));
|
|
61
|
+
|
|
62
|
+
_initializerDefineProperty(_this, "editFlow", _descriptor6, _assertThisInitialized(_this));
|
|
63
|
+
|
|
64
|
+
_initializerDefineProperty(_this, "viewState", _descriptor7, _assertThisInitialized(_this));
|
|
65
|
+
|
|
66
|
+
_initializerDefineProperty(_this, "kpiManagement", _descriptor8, _assertThisInitialized(_this));
|
|
67
|
+
|
|
68
|
+
_initializerDefineProperty(_this, "placeholder", _descriptor9, _assertThisInitialized(_this));
|
|
69
|
+
|
|
70
|
+
_initializerDefineProperty(_this, "massEdit", _descriptor10, _assertThisInitialized(_this));
|
|
71
|
+
|
|
72
|
+
_this.handlers = {
|
|
73
|
+
onTabMultiModeChange: function (oEvent) {
|
|
74
|
+
this._updateMultiModeSelectedControl();
|
|
75
|
+
|
|
76
|
+
this._updateMultiControlHiddenStatus();
|
|
77
|
+
|
|
78
|
+
var oFilterBar = this._getFilterBarControl();
|
|
79
|
+
|
|
80
|
+
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
81
|
+
|
|
82
|
+
var oDisplayedControl = this._getCurrentControl();
|
|
83
|
+
|
|
84
|
+
var oMultiModeControl = this._getMultiModeControl();
|
|
85
|
+
|
|
86
|
+
var sSelectedKey = oMultiModeControl.getSelectedKey();
|
|
87
|
+
var sPreviousSelectedKey = oEvent && oEvent.mParameters ? oEvent.mParameters.previousKey : undefined;
|
|
88
|
+
oInternalModelContext.setProperty("tabs/selected", sSelectedKey);
|
|
89
|
+
|
|
90
|
+
if (oInternalModelContext.getProperty("hasPendingFilters") !== true) {
|
|
91
|
+
// No pending filters into FilterBar
|
|
92
|
+
if (oFilterBar && this._isCustomTab()) {
|
|
93
|
+
var oFilterConditions = oFilterBar.getFilterConditions();
|
|
94
|
+
this.onViewNeedsRefresh({
|
|
95
|
+
filterConditions: oFilterConditions,
|
|
96
|
+
currentTabId: sSelectedKey,
|
|
97
|
+
refreshCause: "tabChanged"
|
|
98
|
+
});
|
|
99
|
+
} else if (!oDisplayedControl.isA("sap.ui.mdc.Chart") && (!oDisplayedControl.getRowBinding() || // first time the tab/table is displayed
|
|
100
|
+
oDisplayedControl.data("outdatedRows") === true)) {
|
|
101
|
+
// Search has been triggered on a different tab {}
|
|
102
|
+
oDisplayedControl.rebind();
|
|
103
|
+
oDisplayedControl.data("outdatedRows", false);
|
|
104
|
+
} else if (oDisplayedControl.isA("sap.ui.mdc.Chart") && (!oDisplayedControl.getControlDelegate()._getChart(oDisplayedControl).getBinding("data") || // first time the tab/chart is displayed
|
|
105
|
+
oDisplayedControl.data("outdatedRows") === true)) {
|
|
106
|
+
var oInnerChart = oDisplayedControl.getControlDelegate()._getChart(oDisplayedControl);
|
|
107
|
+
|
|
108
|
+
oDisplayedControl.getControlDelegate().rebind(oDisplayedControl, oInnerChart.getBindingInfo("data"));
|
|
109
|
+
oDisplayedControl.data("outdatedRows", false);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (oEvent && oEvent.mParameters && sPreviousSelectedKey !== oEvent.mParameters.selectedKey) {
|
|
114
|
+
ControlPersonalizationWriteAPI.add({
|
|
115
|
+
changes: [{
|
|
116
|
+
changeSpecificData: {
|
|
117
|
+
changeType: "selectIconTabBarFilter",
|
|
118
|
+
content: {
|
|
119
|
+
selectedKey: sSelectedKey,
|
|
120
|
+
previousSelectedKey: sPreviousSelectedKey
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
selectorElement: oMultiModeControl
|
|
124
|
+
}]
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
this.getExtensionAPI().updateAppState();
|
|
129
|
+
},
|
|
130
|
+
onFiltersChanged: function (oEvent) {
|
|
131
|
+
var oFilterBar = this._getFilterBarControl();
|
|
132
|
+
|
|
133
|
+
if (oFilterBar) {
|
|
134
|
+
var oInternalModelContext = this.getView().getBindingContext("internal"); // Pending filters into FilterBar to be used for custom views
|
|
135
|
+
|
|
136
|
+
this.onPendingFilters();
|
|
137
|
+
oInternalModelContext.setProperty("appliedFilters", oFilterBar.getAssignedFiltersText().filtersText);
|
|
138
|
+
|
|
139
|
+
if (oEvent.getParameter("conditionsBased")) {
|
|
140
|
+
oInternalModelContext.setProperty("hasPendingFilters", true);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
onVariantSelected: function (oEvent) {
|
|
145
|
+
var _this2 = this;
|
|
146
|
+
|
|
147
|
+
var oVM = oEvent.getSource(); // setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
|
|
148
|
+
|
|
149
|
+
setTimeout(function () {
|
|
150
|
+
if (_this2._isMultiMode()) {
|
|
151
|
+
_this2.handlers.onTabMultiModeChange.apply(_this2, [oEvent]);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (_this2._shouldAutoTriggerSearch(oVM)) {
|
|
155
|
+
// the app state will be updated via onSearch handler
|
|
156
|
+
return _this2._getFilterBarControl().triggerSearch();
|
|
157
|
+
} else {
|
|
158
|
+
_this2.getExtensionAPI().updateAppState();
|
|
159
|
+
}
|
|
160
|
+
}, 0);
|
|
161
|
+
},
|
|
162
|
+
onVariantSaved: function () {
|
|
163
|
+
var _this3 = this;
|
|
164
|
+
|
|
165
|
+
//TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save!!!
|
|
166
|
+
setTimeout(function () {
|
|
167
|
+
_this3.getExtensionAPI().updateAppState();
|
|
168
|
+
}, 1000);
|
|
169
|
+
},
|
|
170
|
+
onSearch: function () {
|
|
171
|
+
var _this4 = this;
|
|
172
|
+
|
|
173
|
+
var oFilterBar = this._getFilterBarControl();
|
|
174
|
+
|
|
175
|
+
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
176
|
+
var oMdcChart = this.getChartControl();
|
|
177
|
+
var bHideDraft = FilterUtils.getEditStateIsHideDraft(oFilterBar.getConditions());
|
|
178
|
+
oInternalModelContext.setProperty("hasPendingFilters", false);
|
|
179
|
+
oInternalModelContext.setProperty("hideDraftInfo", bHideDraft);
|
|
180
|
+
|
|
181
|
+
if (this._isMultiMode()) {
|
|
182
|
+
var aControls = this._getControls(),
|
|
183
|
+
oMultiModeControl = this._getMultiModeControl();
|
|
184
|
+
|
|
185
|
+
this._setCountsOutDated();
|
|
186
|
+
|
|
187
|
+
if (!this._isCustomTab()) {
|
|
188
|
+
var sDisplayedControlId = this._getCurrentControl().getId();
|
|
189
|
+
|
|
190
|
+
this._updateMultiTabNotApplicableFields(oInternalModelContext, oFilterBar); // This should be done outside the search event handler of the filter bar.
|
|
191
|
+
// The same logic is required when filter bar is hidden and multiple tables exist on the LR.
|
|
192
|
+
// This is currently done in ListReport/overrides/ViewState.js#onAfterStateApplied()
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
aControls.forEach(function (oControl) {
|
|
196
|
+
oControl.data("outdatedRows", oControl.getId() !== sDisplayedControlId);
|
|
197
|
+
});
|
|
198
|
+
} else {
|
|
199
|
+
var oFilterConditions = oFilterBar.getFilterConditions();
|
|
200
|
+
this.onViewNeedsRefresh({
|
|
201
|
+
filterConditions: oFilterConditions,
|
|
202
|
+
currentTabId: oMultiModeControl.getSelectedKey(),
|
|
203
|
+
refreshCause: "search"
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
this._updateALPNotApplicableFields(oInternalModelContext, oFilterBar);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (oMdcChart) {
|
|
211
|
+
// disable bound actions TODO: this clears everything for the chart?
|
|
212
|
+
oMdcChart.getBindingContext("internal").setProperty("", {});
|
|
213
|
+
var oPageInternalModelContext = oMdcChart.getBindingContext("pageInternal");
|
|
214
|
+
var sTemplateContentView = oPageInternalModelContext.getProperty(oPageInternalModelContext.getPath() + "/alpContentView");
|
|
215
|
+
|
|
216
|
+
if (sTemplateContentView === TemplateContentView.Chart) {
|
|
217
|
+
this.hasPendingChartChanges = true;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (sTemplateContentView === TemplateContentView.Table) {
|
|
221
|
+
this.hasPendingTableChanges = true;
|
|
222
|
+
}
|
|
223
|
+
} // store filter bar conditions to use later while navigation
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
StateUtil.retrieveExternalState(oFilterBar).then(function (oExternalState) {
|
|
227
|
+
_this4.filterBarConditions = oExternalState.filter;
|
|
228
|
+
}).catch(function (oError) {
|
|
229
|
+
Log.error("Error while retrieving the external state", oError);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
if (this.getView().getViewData().liveMode === false) {
|
|
233
|
+
this.getExtensionAPI().updateAppState();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (system.phone) {
|
|
237
|
+
var oDynamicPage = this.getView().byId("fe::ListReport");
|
|
238
|
+
oDynamicPage.setHeaderExpanded(false);
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Triggers an outbound navigation when a user chooses the chevron.
|
|
244
|
+
*
|
|
245
|
+
* @param {object} oController
|
|
246
|
+
* @param {string} sOutboundTarget Name of the outbound target (needs to be defined in the manifest)
|
|
247
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context that contains the data for the target app
|
|
248
|
+
* @param {string} sCreatePath Create path when the chevron is created.
|
|
249
|
+
* @returns {Promise} Promise which is resolved once the navigation is triggered
|
|
250
|
+
* @ui5-restricted
|
|
251
|
+
* @final
|
|
252
|
+
*/
|
|
253
|
+
onChevronPressNavigateOutBound: function (oController, sOutboundTarget, oContext, sCreatePath) {
|
|
254
|
+
return oController._intentBasedNavigation.onChevronPressNavigateOutBound(oController, sOutboundTarget, oContext, sCreatePath);
|
|
255
|
+
},
|
|
256
|
+
onChartSelectionChanged: function (oEvent) {
|
|
257
|
+
var oMdcChart = oEvent.getSource().getContent(),
|
|
258
|
+
oTable = this._getTable(),
|
|
259
|
+
aData = oEvent.getParameter("data"),
|
|
260
|
+
oInternalModelContext = this.getView().getBindingContext("internal");
|
|
261
|
+
|
|
262
|
+
if (aData) {
|
|
263
|
+
// update action buttons enablement / disablement
|
|
264
|
+
ChartRuntime.fnUpdateChart(oEvent); // update selections on selection or deselection
|
|
265
|
+
|
|
266
|
+
ChartUtils.setChartFilters(oMdcChart);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var sTemplateContentView = oInternalModelContext.getProperty(oInternalModelContext.getPath() + "/alpContentView");
|
|
270
|
+
|
|
271
|
+
if (sTemplateContentView === TemplateContentView.Chart) {
|
|
272
|
+
this.hasPendingChartChanges = true;
|
|
273
|
+
} else {
|
|
274
|
+
oTable && oTable.rebind();
|
|
275
|
+
this.hasPendingChartChanges = false;
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
onSegmentedButtonPressed: function (oEvent) {
|
|
279
|
+
var sSelectedKey = oEvent.mParameters.key ? oEvent.mParameters.key : null;
|
|
280
|
+
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
281
|
+
oInternalModelContext.setProperty("alpContentView", sSelectedKey);
|
|
282
|
+
|
|
283
|
+
var oChart = this._getChart();
|
|
284
|
+
|
|
285
|
+
var oTable = this._getTable();
|
|
286
|
+
|
|
287
|
+
var oSegmentedButtonDelegate = {
|
|
288
|
+
onAfterRendering: function () {
|
|
289
|
+
var aItems = oSegmentedButton.getItems();
|
|
290
|
+
aItems.forEach(function (oItem) {
|
|
291
|
+
if (oItem.getKey() === sSelectedKey) {
|
|
292
|
+
oItem.focus();
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
oSegmentedButton.removeEventDelegate(oSegmentedButtonDelegate);
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
var oSegmentedButton = sSelectedKey === TemplateContentView.Table ? this._getSegmentedButton("Table") : this._getSegmentedButton("Chart");
|
|
299
|
+
|
|
300
|
+
if (oSegmentedButton !== oEvent.getSource()) {
|
|
301
|
+
oSegmentedButton.addEventDelegate(oSegmentedButtonDelegate);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
switch (sSelectedKey) {
|
|
305
|
+
case TemplateContentView.Table:
|
|
306
|
+
this._updateTable(oTable);
|
|
307
|
+
|
|
308
|
+
break;
|
|
309
|
+
|
|
310
|
+
case TemplateContentView.Chart:
|
|
311
|
+
this._updateChart(oChart);
|
|
312
|
+
|
|
313
|
+
break;
|
|
314
|
+
|
|
315
|
+
case TemplateContentView.Hybrid:
|
|
316
|
+
this._updateTable(oTable);
|
|
317
|
+
|
|
318
|
+
this._updateChart(oChart);
|
|
319
|
+
|
|
320
|
+
break;
|
|
321
|
+
|
|
322
|
+
default:
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
this.getExtensionAPI().updateAppState();
|
|
327
|
+
},
|
|
328
|
+
onFiltersSegmentedButtonPressed: function (oEvent) {
|
|
329
|
+
if (oEvent.getParameter("key") === "Compact") {
|
|
330
|
+
this._getFilterBarControl().setVisible(true);
|
|
331
|
+
|
|
332
|
+
this.getView().byId(this.getView().getContent()[0].data("visualFilterBarId")).setVisible(false);
|
|
333
|
+
} else {
|
|
334
|
+
this._getFilterBarControl().setVisible(false);
|
|
335
|
+
|
|
336
|
+
this.getView().byId(this.getView().getContent()[0].data("visualFilterBarId")).setVisible(true);
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
onStateChange: function () {
|
|
340
|
+
this.getExtensionAPI().updateAppState();
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
_this.formatters = {
|
|
344
|
+
/**
|
|
345
|
+
* Method to set the message text for the multiple entity sets when fields in the FilterBar need to be ignored.
|
|
346
|
+
*
|
|
347
|
+
* @param this
|
|
348
|
+
* @param {Array} aIgnoredFields Array of ignored fields in the FilterBar for the current tab (multiple entity sets)
|
|
349
|
+
* @param {string} sTabTitle Tab title
|
|
350
|
+
* @param {boolean} bIsChart Flag that indicates whether the control is a chart or not
|
|
351
|
+
* @param {object} oApplySupported ApplySupported for the control
|
|
352
|
+
* @returns {string} Message text
|
|
353
|
+
*/
|
|
354
|
+
setTabMessageStrip: function (aIgnoredFields, sTabTitle, bIsChart, oApplySupported) {
|
|
355
|
+
var sText = "";
|
|
356
|
+
bIsChart = bIsChart === "true" || bIsChart === true;
|
|
357
|
+
|
|
358
|
+
var oFilterBar = this._getFilterBarControl();
|
|
359
|
+
|
|
360
|
+
if (oFilterBar && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && (sTabTitle || bIsChart)) {
|
|
361
|
+
var sFilterBarEntityPath = oFilterBar.data("entityType"),
|
|
362
|
+
oMetaModel = this.getView().getModel().getMetaModel(),
|
|
363
|
+
oResourceBundle = Core.getLibraryResourceBundle("sap.fe.templates"),
|
|
364
|
+
aIgnoredLabels = aIgnoredFields.map(function (sProperty) {
|
|
365
|
+
var oMacroResourceBundle = Core.getLibraryResourceBundle("sap.fe.macros");
|
|
366
|
+
|
|
367
|
+
if (sProperty === "$search") {
|
|
368
|
+
return oMacroResourceBundle ? oMacroResourceBundle.getText("M_FILTERBAR_SEARCH") : "";
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (sProperty === "$editState") {
|
|
372
|
+
return oMacroResourceBundle ? oMacroResourceBundle.getText("M_COMMON_FILTERBAR_EDITING_STATUS") : "";
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
var sLabel = oMetaModel.getObject(sFilterBarEntityPath + sProperty + "@com.sap.vocabularies.Common.v1.Label");
|
|
376
|
+
return DelegateUtil.getLocalizedText(sLabel, oFilterBar);
|
|
377
|
+
});
|
|
378
|
+
var bIsSearchIgnored = !oApplySupported.enableSearch;
|
|
379
|
+
|
|
380
|
+
if (oResourceBundle) {
|
|
381
|
+
sText = CommonUtils.getMessageStripText(this.getView(), aIgnoredLabels, oFilterBar, bIsChart, bIsSearchIgnored, sTabTitle, oResourceBundle, DelegateUtil.getLocalizedText);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return sText;
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
return _this;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
var _proto = ListReportController.prototype;
|
|
392
|
+
|
|
393
|
+
_proto.getExtensionAPI = function getExtensionAPI() {
|
|
394
|
+
if (!this.extensionAPI) {
|
|
395
|
+
this.extensionAPI = new ExtensionAPI(this);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return this.extensionAPI;
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
_proto.onInit = function onInit() {
|
|
402
|
+
var _this5 = this;
|
|
403
|
+
|
|
404
|
+
PageController.prototype.onInit.apply(this);
|
|
405
|
+
|
|
406
|
+
var aControls = this._getControls();
|
|
407
|
+
|
|
408
|
+
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
409
|
+
|
|
410
|
+
if (this._isMultiMode()) {
|
|
411
|
+
var oMultiModeTab = this._getMultiModeControl();
|
|
412
|
+
|
|
413
|
+
oInternalModelContext.setProperty("tabs", {
|
|
414
|
+
selected: oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey()
|
|
415
|
+
});
|
|
416
|
+
aControls.forEach(function (oControl) {
|
|
417
|
+
var oUpdateCounts = function () {
|
|
418
|
+
_this5._updateCounts();
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
CommonUtils.addEventToBindingInfo(oControl, "dataRequested", oUpdateCounts);
|
|
422
|
+
});
|
|
423
|
+
} //TODO: This is only a temporary approach and will be removed once app state behaviour is finalized.
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
oInternalModelContext.setProperty("hasPendingFilters", true);
|
|
427
|
+
oInternalModelContext.setProperty("appliedFilters", "");
|
|
428
|
+
oInternalModelContext.setProperty("hideDraftInfo", false);
|
|
429
|
+
oInternalModelContext.setProperty("uom", {});
|
|
430
|
+
oInternalModelContext.setProperty("scalefactor", {});
|
|
431
|
+
oInternalModelContext.setProperty("scalefactorNumber", {});
|
|
432
|
+
oInternalModelContext.setProperty("currency", {});
|
|
433
|
+
|
|
434
|
+
if (this._hasMultiVisualizations()) {
|
|
435
|
+
var alpContentView = this._getDefaultPath();
|
|
436
|
+
|
|
437
|
+
if (!system.desktop && alpContentView === TemplateContentView.Hybrid) {
|
|
438
|
+
alpContentView = TemplateContentView.Chart;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
oInternalModelContext.setProperty("alpContentView", alpContentView);
|
|
442
|
+
} // Store conditions from filter bar
|
|
443
|
+
// this is later used before navigation to get conditions applied on the filter bar
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
this.filterBarConditions = {}; // As AppStateHandler.applyAppState triggers a navigation we want to make sure it will
|
|
447
|
+
// happen after the routeMatch event has been processed (otherwise the router gets broken)
|
|
448
|
+
|
|
449
|
+
this.getAppComponent().getRouterProxy().waitForRouteMatchBeforeNavigation();
|
|
450
|
+
this._isMultiMode() && this._updateMultiControlHiddenStatus(); // Configure the initial load settings
|
|
451
|
+
|
|
452
|
+
this._setInitLoad();
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
_proto.onExit = function onExit() {
|
|
456
|
+
delete this.filterBarConditions;
|
|
457
|
+
delete this._oListReportControl;
|
|
458
|
+
this.extensionAPI && this.extensionAPI.destroy();
|
|
459
|
+
delete this.extensionAPI;
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
_proto._onAfterBinding = function _onAfterBinding() {
|
|
463
|
+
var _this6 = this;
|
|
464
|
+
|
|
465
|
+
var aTables = this._getControls("table");
|
|
466
|
+
|
|
467
|
+
if (EditState.isEditStateDirty()) {
|
|
468
|
+
var oTableBinding = this._getTableBinding();
|
|
469
|
+
|
|
470
|
+
if (oTableBinding) {
|
|
471
|
+
if (CommonUtils.getAppComponent(this.getView())._isFclEnabled()) {
|
|
472
|
+
// there is an issue if we use a timeout with a kept alive context used on another page
|
|
473
|
+
oTableBinding.refresh();
|
|
474
|
+
} else {
|
|
475
|
+
if (!this.sUpdateTimer) {
|
|
476
|
+
this.sUpdateTimer = setTimeout(function () {
|
|
477
|
+
oTableBinding.refresh();
|
|
478
|
+
|
|
479
|
+
if (_this6._isMultiMode()) {
|
|
480
|
+
_this6._setCountsOutDated();
|
|
481
|
+
|
|
482
|
+
_this6._updateCounts();
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
delete _this6.sUpdateTimer;
|
|
486
|
+
}, 0);
|
|
487
|
+
} // Update action enablement and visibility upon table data update.
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
var fnUpdateTableActions = function () {
|
|
491
|
+
_this6._updateTableActions(aTables);
|
|
492
|
+
|
|
493
|
+
oTableBinding.detachDataReceived(fnUpdateTableActions);
|
|
494
|
+
};
|
|
495
|
+
|
|
496
|
+
oTableBinding.attachDataReceived(fnUpdateTableActions);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
EditState.setEditStateProcessed();
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
if (!this.sUpdateTimer) {
|
|
504
|
+
this._updateTableActions(aTables);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
this.pageReady.waitFor(this.getAppComponent().getAppStateHandler().applyAppState());
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
_proto.onBeforeRendering = function onBeforeRendering() {
|
|
511
|
+
PageController.prototype.onBeforeRendering.apply(this);
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
_proto.onAfterRendering = function onAfterRendering() {
|
|
515
|
+
var _this7 = this;
|
|
516
|
+
|
|
517
|
+
this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
|
|
518
|
+
_this7.oResourceBundle = response;
|
|
519
|
+
|
|
520
|
+
var aControls = _this7._getControls();
|
|
521
|
+
|
|
522
|
+
var sEntitySet = _this7.getView().getViewData().entitySet;
|
|
523
|
+
|
|
524
|
+
var sText = CommonUtils.getTranslatedText("T_TABLE_AND_CHART_NO_DATA_TEXT", _this7.oResourceBundle, undefined, sEntitySet);
|
|
525
|
+
aControls.forEach(function (oControl) {
|
|
526
|
+
oControl.setNoDataText(sText);
|
|
527
|
+
});
|
|
528
|
+
}).catch(function (oError) {
|
|
529
|
+
Log.error("Error while retrieving the resource bundle", oError);
|
|
530
|
+
});
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
_proto.onPageReady = function onPageReady(mParameters) {
|
|
534
|
+
// Enabling mandatory filter fields message dialog and focusing on them
|
|
535
|
+
if (mParameters.forceFocus) {
|
|
536
|
+
var oFilterBar = this._getFilterBarControl();
|
|
537
|
+
|
|
538
|
+
if (oFilterBar && !oFilterBar.getShowMessages()) {
|
|
539
|
+
oFilterBar.setShowMessages(true);
|
|
540
|
+
oFilterBar.setFocusOnFirstErroneousField();
|
|
541
|
+
}
|
|
542
|
+
} // Remove the handler on back navigation that displays Draft confirmation
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
this.getAppComponent().getShellServices().setBackNavigation(undefined);
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Method called when the content of a list report view needs to be refreshed.
|
|
549
|
+
* This happens either when there is a change on the FilterBar and the search is triggered,
|
|
550
|
+
* or when a tab with custom content is selected.
|
|
551
|
+
* This method can be overwritten by the controller extension in case of customization.
|
|
552
|
+
*
|
|
553
|
+
* @param {map} mParameters Map containing the filter conditions of the FilterBar, the currentTabID
|
|
554
|
+
* and the view refresh cause (tabChanged or search).
|
|
555
|
+
* The map looks like this:
|
|
556
|
+
* <code><pre>
|
|
557
|
+
* {
|
|
558
|
+
* filterConditions: {
|
|
559
|
+
* Country: [
|
|
560
|
+
* {
|
|
561
|
+
* operator: "EQ"
|
|
562
|
+
* validated: "NotValidated"
|
|
563
|
+
* values: ["Germany", ...]
|
|
564
|
+
* },
|
|
565
|
+
* ...
|
|
566
|
+
* ]
|
|
567
|
+
* ...
|
|
568
|
+
* },
|
|
569
|
+
* currentTabId: "fe::CustomTab::tab1",
|
|
570
|
+
* refreshCause: "tabChanged" | "search"
|
|
571
|
+
* }
|
|
572
|
+
* </pre></code>
|
|
573
|
+
*
|
|
574
|
+
* @public
|
|
575
|
+
*/
|
|
576
|
+
;
|
|
577
|
+
|
|
578
|
+
_proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
579
|
+
onViewNeedsRefresh = function onViewNeedsRefresh(mParameters) {
|
|
580
|
+
/* To be overriden */
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Method called when a filter or search value has been changed in the FilterBar,
|
|
584
|
+
* but has not been validated yet by the end user (with the 'Go' or 'Search' button).
|
|
585
|
+
* Typically, the content of the current tab is greyed out until the filters are validated.
|
|
586
|
+
* This method can be overwritten by the controller extension in case of customization.
|
|
587
|
+
*
|
|
588
|
+
* @public
|
|
589
|
+
*/
|
|
590
|
+
;
|
|
591
|
+
|
|
592
|
+
_proto.onPendingFilters = function onPendingFilters() {
|
|
593
|
+
/* To be overriden */
|
|
594
|
+
};
|
|
595
|
+
|
|
596
|
+
_proto.getCurrentEntitySet = function getCurrentEntitySet() {
|
|
597
|
+
if (!this._sEntitySet) {
|
|
598
|
+
var oDisplayedControl = this._isMultiMode() && this._getCurrentControl() || this._getTable();
|
|
599
|
+
|
|
600
|
+
this._sEntitySet = oDisplayedControl === null || oDisplayedControl === void 0 ? void 0 : oDisplayedControl.data("targetCollectionPath").slice(1);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
return this._sEntitySet;
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* This method initiates the update of the enabled state of the DataFieldForAction and the visible state of the DataFieldForIBN buttons.
|
|
607
|
+
* @param aTables Array of tables in the list report
|
|
608
|
+
* @private
|
|
609
|
+
*/
|
|
610
|
+
;
|
|
611
|
+
|
|
612
|
+
_proto._updateTableActions = function _updateTableActions(aTables) {
|
|
613
|
+
var aIBNActions = [];
|
|
614
|
+
aTables.forEach(function (oTable) {
|
|
615
|
+
aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions); // Update 'enabled' property of DataFieldForAction buttons on table toolbar
|
|
616
|
+
// The same is also performed on Table selectionChange event
|
|
617
|
+
|
|
618
|
+
var oInternalModelContext = oTable.getBindingContext("internal"),
|
|
619
|
+
oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
|
|
620
|
+
aSelectedContexts = oTable.getSelectedContexts();
|
|
621
|
+
CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
|
|
622
|
+
});
|
|
623
|
+
CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* This method scrolls to a specific row on all the available tables.
|
|
627
|
+
*
|
|
628
|
+
* @function
|
|
629
|
+
* @name sap.fe.templates.ListReport.ListReportController.controller#_scrollTablesToRow
|
|
630
|
+
* @param {string} sRowPath The path of the table row context to be scrolled to
|
|
631
|
+
*/
|
|
632
|
+
;
|
|
633
|
+
|
|
634
|
+
_proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
|
|
635
|
+
this._getControls("table").forEach(function (oTable) {
|
|
636
|
+
TableScroller.scrollTableToRow(oTable, sRowPath);
|
|
637
|
+
});
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
_proto._getPageTitleInformation = function _getPageTitleInformation() {
|
|
641
|
+
var oTitleInfo = {
|
|
642
|
+
title: "",
|
|
643
|
+
subtitle: "",
|
|
644
|
+
intent: "",
|
|
645
|
+
icon: ""
|
|
646
|
+
};
|
|
647
|
+
oTitleInfo.title = this.getView().getContent()[0].data().ListReportTitle;
|
|
648
|
+
oTitleInfo.subtitle = this.getView().getContent()[0].data().ListReportSubtitle;
|
|
649
|
+
return oTitleInfo;
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
_proto._getPageOrFilterBarVariantManagement = function _getPageOrFilterBarVariantManagement() {
|
|
653
|
+
return this.getView().byId("fe::PageVariantManagement") || this.getView().byId(this._getFilterBarControlId() + "::VariantManagement");
|
|
654
|
+
};
|
|
655
|
+
|
|
656
|
+
_proto._getFilterBarControl = function _getFilterBarControl() {
|
|
657
|
+
return this.getView().byId(this._getFilterBarControlId());
|
|
658
|
+
};
|
|
659
|
+
|
|
660
|
+
_proto._getAdaptationFilterBarControl = function _getAdaptationFilterBarControl() {
|
|
661
|
+
// If the adaptation filter bar is part of the DOM tree, the "Adapt Filter" dialog is open,
|
|
662
|
+
// and we return the adaptation filter bar as an active control (visible for the user)
|
|
663
|
+
var adaptationFilterBar = this._getFilterBarControl().getInbuiltFilter();
|
|
664
|
+
|
|
665
|
+
return adaptationFilterBar !== null && adaptationFilterBar !== void 0 && adaptationFilterBar.getParent() ? adaptationFilterBar : undefined;
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
_proto._getSegmentedButton = function _getSegmentedButton(sControl) {
|
|
669
|
+
return this.getView().byId(this._getSegmentedButtonId(sControl));
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
_proto._getSegmentedButtonId = function _getSegmentedButtonId(sControl) {
|
|
673
|
+
if (sControl === "Chart") {
|
|
674
|
+
return this._getChart().data("segmentedButtonId");
|
|
675
|
+
} else {
|
|
676
|
+
var _this$_getTable;
|
|
677
|
+
|
|
678
|
+
return (_this$_getTable = this._getTable()) === null || _this$_getTable === void 0 ? void 0 : _this$_getTable.data("segmentedButtonId");
|
|
679
|
+
}
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
_proto._getFilterBarControlId = function _getFilterBarControlId() {
|
|
683
|
+
return this.getView().getContent()[0].data("filterBarId");
|
|
684
|
+
};
|
|
685
|
+
|
|
686
|
+
_proto._getChartControlId = function _getChartControlId() {
|
|
687
|
+
return this.getView().getContent()[0].data("singleChartId");
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
_proto.getChartControl = function getChartControl() {
|
|
691
|
+
return this.getView().byId(this._getChartControlId());
|
|
692
|
+
};
|
|
693
|
+
|
|
694
|
+
_proto._getVisualFilterBarControl = function _getVisualFilterBarControl() {
|
|
695
|
+
return this.getView().byId(this._getVisualFilterBarControlId());
|
|
696
|
+
};
|
|
697
|
+
|
|
698
|
+
_proto._getVisualFilterBarControlId = function _getVisualFilterBarControlId() {
|
|
699
|
+
return this.getView().getContent()[0].data("visualFilterBarId");
|
|
700
|
+
};
|
|
701
|
+
|
|
702
|
+
_proto._getMultiModeControl = function _getMultiModeControl() {
|
|
703
|
+
return this.getView().byId("fe::TabMultipleMode");
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
_proto._getTableControlId = function _getTableControlId() {
|
|
707
|
+
return this.getView().getContent()[0].data("singleTableId");
|
|
708
|
+
};
|
|
709
|
+
|
|
710
|
+
_proto._getCurrentControl = function _getCurrentControl() {
|
|
711
|
+
if (!this._oListReportControl) {
|
|
712
|
+
var oMultiModeTab = this._getMultiModeControl();
|
|
713
|
+
|
|
714
|
+
this._oListReportControl = this.getView().byId(oMultiModeTab.getSelectedKey() || oMultiModeTab.getItems()[0].getKey());
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
return this._oListReportControl;
|
|
718
|
+
};
|
|
719
|
+
|
|
720
|
+
_proto._getTable = function _getTable() {
|
|
721
|
+
if (this._isMultiMode()) {
|
|
722
|
+
var oControl = this._getCurrentControl();
|
|
723
|
+
|
|
724
|
+
return oControl && oControl.isA("sap.ui.mdc.Table") ? oControl : undefined;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
return this.getView().byId(this._getTableControlId());
|
|
728
|
+
};
|
|
729
|
+
|
|
730
|
+
_proto._getChart = function _getChart() {
|
|
731
|
+
return this.getView().byId(this._getChartControlId());
|
|
732
|
+
};
|
|
733
|
+
|
|
734
|
+
_proto._getTableBinding = function _getTableBinding(sTableId) {
|
|
735
|
+
var oTableControl = sTableId ? this.getView().byId(sTableId) : this._getTable();
|
|
736
|
+
|
|
737
|
+
var oBinding = oTableControl && oTableControl._getRowBinding();
|
|
738
|
+
|
|
739
|
+
return oBinding;
|
|
740
|
+
};
|
|
741
|
+
|
|
742
|
+
_proto._getControls = function _getControls(sKey) {
|
|
743
|
+
var _this8 = this;
|
|
744
|
+
|
|
745
|
+
if (this._isMultiMode()) {
|
|
746
|
+
var aControls = [];
|
|
747
|
+
|
|
748
|
+
var oTabMultiMode = this._getMultiModeControl();
|
|
749
|
+
|
|
750
|
+
oTabMultiMode.getItems().forEach(function (oItem) {
|
|
751
|
+
var oControl = _this8.getView().byId(oItem.getKey());
|
|
752
|
+
|
|
753
|
+
if (sKey) {
|
|
754
|
+
if (oItem.getKey().indexOf("fe::" + sKey) > -1) {
|
|
755
|
+
oControl && aControls.push(oControl);
|
|
756
|
+
}
|
|
757
|
+
} else {
|
|
758
|
+
oControl && aControls.push(oControl);
|
|
759
|
+
}
|
|
760
|
+
});
|
|
761
|
+
return aControls;
|
|
762
|
+
} else if (sKey === "Chart") {
|
|
763
|
+
var oChart = this._getChart();
|
|
764
|
+
|
|
765
|
+
return oChart ? [oChart] : [];
|
|
766
|
+
} else {
|
|
767
|
+
var oTable = this._getTable();
|
|
768
|
+
|
|
769
|
+
return oTable ? [oTable] : [];
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
_proto._getDefaultPath = function _getDefaultPath() {
|
|
774
|
+
var defaultPath = this.getView().getContent()[0].data("defaultPath");
|
|
775
|
+
|
|
776
|
+
switch (defaultPath) {
|
|
777
|
+
case "primary":
|
|
778
|
+
return TemplateContentView.Chart;
|
|
779
|
+
|
|
780
|
+
case "secondary":
|
|
781
|
+
return TemplateContentView.Table;
|
|
782
|
+
|
|
783
|
+
case "both":
|
|
784
|
+
default:
|
|
785
|
+
return TemplateContentView.Hybrid;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Method to know if ListReport is configured with Multiple Table mode.
|
|
790
|
+
*
|
|
791
|
+
* @function
|
|
792
|
+
* @name _isMultiMode
|
|
793
|
+
* @returns {boolean} Is Multiple Table mode set?
|
|
794
|
+
*/
|
|
795
|
+
;
|
|
796
|
+
|
|
797
|
+
_proto._isMultiMode = function _isMultiMode() {
|
|
798
|
+
if (!this._oListReportControl) {
|
|
799
|
+
this._bMultiMode = !!this._getMultiModeControl();
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
return this._bMultiMode;
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* Method to know if ListReport is configured to load data at start up.
|
|
806
|
+
*
|
|
807
|
+
* @function
|
|
808
|
+
* @name _isInitLoadDisabled
|
|
809
|
+
* @returns {boolean} Is InitLoad enabled?
|
|
810
|
+
*/
|
|
811
|
+
;
|
|
812
|
+
|
|
813
|
+
_proto._isInitLoadEnabled = function _isInitLoadEnabled() {
|
|
814
|
+
var initLoadMode = this.getView().getViewData().initialLoad;
|
|
815
|
+
return initLoadMode === InitialLoadMode.Enabled;
|
|
816
|
+
}
|
|
817
|
+
/**
|
|
818
|
+
* Method to know if ListReport is configured with Multiple EntitySets.
|
|
819
|
+
*
|
|
820
|
+
* @function
|
|
821
|
+
* @name _isMultiEntitySets
|
|
822
|
+
* @returns {boolean} Is Multiple EntitySets configuration?
|
|
823
|
+
*/
|
|
824
|
+
;
|
|
825
|
+
|
|
826
|
+
_proto._isMultiEntitySets = function _isMultiEntitySets() {
|
|
827
|
+
return this.getView().getContent()[0].data("isMultiEntitySets") === "true";
|
|
828
|
+
};
|
|
829
|
+
|
|
830
|
+
_proto._hasMultiVisualizations = function _hasMultiVisualizations() {
|
|
831
|
+
return this.getView().getContent()[0].data("hasMultiVisualizations") === "true";
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* Method to suspend search on the filter bar. The initial loading of data is disabled based on the manifest configuration InitLoad - Disabled/Auto.
|
|
835
|
+
* It is enabled later when the view state is set, when it is possible to realize if there are default filters.
|
|
836
|
+
*/
|
|
837
|
+
;
|
|
838
|
+
|
|
839
|
+
_proto._disableInitLoad = function _disableInitLoad() {
|
|
840
|
+
var filterBar = this._getFilterBarControl(); // check for filter bar hidden
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
if (filterBar) {
|
|
844
|
+
filterBar.setSuspendSelection(true);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* Method called by flex to determine if the applyAutomatically setting on the variant is valid.
|
|
849
|
+
* Called only for Standard Variant and only when there is display text set for applyAutomatically (FE only sets it for Auto).
|
|
850
|
+
*
|
|
851
|
+
* @returns Boolean true if data should be loaded automatically, false otherwise
|
|
852
|
+
*/
|
|
853
|
+
;
|
|
854
|
+
|
|
855
|
+
_proto._applyAutomaticallyOnStandardVariant = function _applyAutomaticallyOnStandardVariant() {
|
|
856
|
+
// We always return false and take care of it when view state is set
|
|
857
|
+
return false;
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* Configure the settings for initial load based on
|
|
861
|
+
* - manifest setting initLoad - Enabled/Disabled/Auto
|
|
862
|
+
* - user's setting of applyAutomatically on variant
|
|
863
|
+
* - if there are default filters
|
|
864
|
+
* We disable the filter bar search at the beginning and enable it when view state is set.
|
|
865
|
+
*/
|
|
866
|
+
;
|
|
867
|
+
|
|
868
|
+
_proto._setInitLoad = function _setInitLoad() {
|
|
869
|
+
// if initLoad is Disabled or Auto, switch off filter bar search temporarily at start
|
|
870
|
+
if (!this._isInitLoadEnabled()) {
|
|
871
|
+
this._disableInitLoad();
|
|
872
|
+
} // set hook for flex for when standard variant is set (at start or by user at runtime)
|
|
873
|
+
// required to override the user setting 'apply automatically' behaviour if there are no filters
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
var variantManagement = this._getPageOrFilterBarVariantManagement();
|
|
877
|
+
|
|
878
|
+
if (variantManagement) {
|
|
879
|
+
variantManagement.registerApplyAutomaticallyOnStandardVariant(this._applyAutomaticallyOnStandardVariant.bind(this));
|
|
880
|
+
}
|
|
881
|
+
};
|
|
882
|
+
|
|
883
|
+
_proto._setShareModel = function _setShareModel() {
|
|
884
|
+
// TODO: deactivated for now - currently there is no _templPriv anymore, to be discussed
|
|
885
|
+
// this method is currently not called anymore from the init method
|
|
886
|
+
var fnGetUser = ObjectPath.get("sap.ushell.Container.getUser"); //var oManifest = this.getOwnerComponent().getAppComponent().getMetadata().getManifestEntry("sap.ui");
|
|
887
|
+
//var sBookmarkIcon = (oManifest && oManifest.icons && oManifest.icons.icon) || "";
|
|
888
|
+
//shareModel: Holds all the sharing relevant information and info used in XML view
|
|
889
|
+
|
|
890
|
+
var oShareInfo = {
|
|
891
|
+
bookmarkTitle: document.title,
|
|
892
|
+
//To name the bookmark according to the app title.
|
|
893
|
+
bookmarkCustomUrl: function () {
|
|
894
|
+
var sHash = hasher.getHash();
|
|
895
|
+
return sHash ? "#" + sHash : window.location.href;
|
|
896
|
+
},
|
|
897
|
+
|
|
898
|
+
/*
|
|
899
|
+
To be activated once the FLP shows the count - see comment above
|
|
900
|
+
bookmarkServiceUrl: function() {
|
|
901
|
+
//var oTable = oTable.getInnerTable(); oTable is already the sap.fe table (but not the inner one)
|
|
902
|
+
// we should use table.getListBindingInfo instead of the binding
|
|
903
|
+
var oBinding = oTable.getBinding("rows") || oTable.getBinding("items");
|
|
904
|
+
return oBinding ? fnGetDownloadUrl(oBinding) : "";
|
|
905
|
+
},*/
|
|
906
|
+
isShareInJamActive: !!fnGetUser && fnGetUser().isJamActive()
|
|
907
|
+
};
|
|
908
|
+
var oTemplatePrivateModel = this.getOwnerComponent().getModel("_templPriv");
|
|
909
|
+
oTemplatePrivateModel.setProperty("/listReport/share", oShareInfo);
|
|
910
|
+
}
|
|
911
|
+
/**
|
|
912
|
+
* Hidden tables must be marked as hidden to avoid sending
|
|
913
|
+
* requests when FilterBar is changed or LR is initialized
|
|
914
|
+
* Best workflow would be to suspend table binding but
|
|
915
|
+
* if the user switch quickly between tabs the batch response of previous
|
|
916
|
+
* is received when previous tab is already disabled (binding is suspended) and
|
|
917
|
+
* generates error.
|
|
918
|
+
* A temporary solution (if we find better workflow) is to set a customData and don't trigger
|
|
919
|
+
* rebindTable if this customData is set to true.
|
|
920
|
+
*/
|
|
921
|
+
;
|
|
922
|
+
|
|
923
|
+
_proto._updateMultiControlHiddenStatus = function _updateMultiControlHiddenStatus() {
|
|
924
|
+
var oDisplayedControl = this._getCurrentControl();
|
|
925
|
+
|
|
926
|
+
if (this._isMultiMode() && oDisplayedControl) {
|
|
927
|
+
var sDisplayControlId = oDisplayedControl.getId();
|
|
928
|
+
|
|
929
|
+
var aControls = this._getControls();
|
|
930
|
+
|
|
931
|
+
aControls.forEach(function (oControl) {
|
|
932
|
+
var sControlId = oControl.getId();
|
|
933
|
+
oControl.data("controlHidden", sControlId !== sDisplayControlId);
|
|
934
|
+
});
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the multiple table scenario).
|
|
939
|
+
*
|
|
940
|
+
* @param {sap.ui.model.context} oInternalModelContext The internal model context
|
|
941
|
+
* @param {sap.ui.mdc.FilterBar} oFilterBar MDC filter bar
|
|
942
|
+
*/
|
|
943
|
+
;
|
|
944
|
+
|
|
945
|
+
_proto._updateMultiTabNotApplicableFields = function _updateMultiTabNotApplicableFields(oInternalModelContext, oFilterBar) {
|
|
946
|
+
var _this9 = this;
|
|
947
|
+
|
|
948
|
+
var mCache = {};
|
|
949
|
+
|
|
950
|
+
var ignoredFields = {},
|
|
951
|
+
ignoredFieldsTitle = {},
|
|
952
|
+
aTables = this._getControls("table"),
|
|
953
|
+
aCharts = this._getControls("Chart");
|
|
954
|
+
|
|
955
|
+
aTables.forEach(function (oTable) {
|
|
956
|
+
var sTableEntityPath = oTable.data("targetCollectionPath"),
|
|
957
|
+
sTableEntitySet = sTableEntityPath.slice(1),
|
|
958
|
+
sTabId = oTable.getParent().getParent().getKey(),
|
|
959
|
+
sTabTitle = oTable.getParent().getParent().getText(),
|
|
960
|
+
sCacheKey = sTableEntitySet + (oTable.data("enableAnalytics") === "true" ? "Analytical" : "Regular");
|
|
961
|
+
|
|
962
|
+
if (!mCache[sCacheKey]) {
|
|
963
|
+
mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oTable);
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
ignoredFields[sTabId] = mCache[sCacheKey];
|
|
967
|
+
ignoredFieldsTitle[sTabId] = _this9.formatters.setTabMessageStrip.call(_this9, mCache[sCacheKey], sTabTitle, "false", {});
|
|
968
|
+
});
|
|
969
|
+
aCharts.forEach(function (oChart) {
|
|
970
|
+
var sChartEntityPath = oChart.data("targetCollectionPath"),
|
|
971
|
+
sChartEntitySet = sChartEntityPath.slice(1),
|
|
972
|
+
sTabId = oChart.getParent().getParent().getKey(),
|
|
973
|
+
sTabTitle = oChart.getParent().getParent().getText(),
|
|
974
|
+
sCacheKey = sChartEntitySet + "Chart";
|
|
975
|
+
|
|
976
|
+
if (!mCache[sCacheKey]) {
|
|
977
|
+
mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
ignoredFields[sTabId] = mCache[sCacheKey];
|
|
981
|
+
ignoredFieldsTitle[sTabId] = _this9.formatters.setTabMessageStrip.call(_this9, mCache[sCacheKey], sTabTitle, "false", {});
|
|
982
|
+
});
|
|
983
|
+
oInternalModelContext.setProperty("tabs/ignoredFields", ignoredFields);
|
|
984
|
+
oInternalModelContext.setProperty("tabs/ignoredFieldsTitle", ignoredFieldsTitle);
|
|
985
|
+
}
|
|
986
|
+
/**
|
|
987
|
+
* Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the ALP scenario).
|
|
988
|
+
*
|
|
989
|
+
* @param {sap.ui.model.context} oInternalModelContext The internal model context
|
|
990
|
+
* @param {sap.ui.mdc.FilterBar} oFilterBar MDC filter bar
|
|
991
|
+
*/
|
|
992
|
+
;
|
|
993
|
+
|
|
994
|
+
_proto._updateALPNotApplicableFields = function _updateALPNotApplicableFields(oInternalModelContext, oFilterBar) {
|
|
995
|
+
var mCache = {};
|
|
996
|
+
|
|
997
|
+
var ignoredFields = {},
|
|
998
|
+
aTables = this._getControls("table"),
|
|
999
|
+
aCharts = this._getControls("Chart");
|
|
1000
|
+
|
|
1001
|
+
if (!aTables.length || !aCharts.length) {
|
|
1002
|
+
// If there's not a table and a chart, we're not in the ALP case
|
|
1003
|
+
return;
|
|
1004
|
+
} // For the moment, there's nothing for tables...
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
aCharts.forEach(function (oChart) {
|
|
1008
|
+
var sChartEntityPath = oChart.data("targetCollectionPath"),
|
|
1009
|
+
sChartEntitySet = sChartEntityPath.slice(1),
|
|
1010
|
+
sCacheKey = sChartEntitySet + "Chart";
|
|
1011
|
+
|
|
1012
|
+
if (!mCache[sCacheKey]) {
|
|
1013
|
+
mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
ignoredFields[sCacheKey] = mCache[sCacheKey];
|
|
1017
|
+
});
|
|
1018
|
+
oInternalModelContext.setProperty("controls/ignoredFields", ignoredFields);
|
|
1019
|
+
};
|
|
1020
|
+
|
|
1021
|
+
_proto._updateMultiModeSelectedControl = function _updateMultiModeSelectedControl() {
|
|
1022
|
+
this._sEntitySet = undefined;
|
|
1023
|
+
this._oListReportControl = undefined;
|
|
1024
|
+
|
|
1025
|
+
this._getCurrentControl();
|
|
1026
|
+
};
|
|
1027
|
+
|
|
1028
|
+
_proto._updateCounts = function _updateCounts() {
|
|
1029
|
+
this._updateMultiModeCounts();
|
|
1030
|
+
}
|
|
1031
|
+
/**
|
|
1032
|
+
* Method to determine if a tab from the list report is a custom tab.
|
|
1033
|
+
*
|
|
1034
|
+
* @function
|
|
1035
|
+
* @name _isCustomTab
|
|
1036
|
+
* @returns {boolean} Determines if the tab is a custom tab.
|
|
1037
|
+
*/
|
|
1038
|
+
;
|
|
1039
|
+
|
|
1040
|
+
_proto._isCustomTab = function _isCustomTab() {
|
|
1041
|
+
var oMultiModeControl = this._getMultiModeControl();
|
|
1042
|
+
|
|
1043
|
+
return oMultiModeControl && oMultiModeControl.getSelectedKey().indexOf("::CustomTab::") > -1;
|
|
1044
|
+
};
|
|
1045
|
+
|
|
1046
|
+
_proto._setCountsOutDated = function _setCountsOutDated() {
|
|
1047
|
+
var oMultiModeControl = this._getMultiModeControl();
|
|
1048
|
+
|
|
1049
|
+
if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true") {
|
|
1050
|
+
var aItems = oMultiModeControl.getItems();
|
|
1051
|
+
aItems.forEach(function (oItem) {
|
|
1052
|
+
if (oItem.getKey().indexOf("fe::Chart") === -1) {
|
|
1053
|
+
oItem.data("outdatedCounts", true);
|
|
1054
|
+
}
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
};
|
|
1058
|
+
|
|
1059
|
+
_proto._updateMultiModeCounts = function _updateMultiModeCounts() {
|
|
1060
|
+
var _this10 = this;
|
|
1061
|
+
|
|
1062
|
+
var aBindingPromises = [];
|
|
1063
|
+
|
|
1064
|
+
var oMultiModeControl = this._getMultiModeControl();
|
|
1065
|
+
|
|
1066
|
+
if (oMultiModeControl && oMultiModeControl.data("showCounts") === "true" && !this._isCustomTab()) {
|
|
1067
|
+
var oDisplayedControl = this._getCurrentControl();
|
|
1068
|
+
|
|
1069
|
+
var sDisplayedControlId = oDisplayedControl.getId();
|
|
1070
|
+
var aCompliantTabs = [];
|
|
1071
|
+
var aItems = oMultiModeControl.getItems();
|
|
1072
|
+
aItems.forEach(function (oItem) {
|
|
1073
|
+
var oControl = _this10.getView().byId(oItem.getKey());
|
|
1074
|
+
|
|
1075
|
+
if (oControl && !oControl.isA("sap.ui.mdc.Chart") && (oItem.data("outdatedCounts") || oControl.getId() === sDisplayedControlId)) {
|
|
1076
|
+
aCompliantTabs.push({
|
|
1077
|
+
control: oControl,
|
|
1078
|
+
item: oItem
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
});
|
|
1082
|
+
aBindingPromises = aCompliantTabs.map(function (mTab) {
|
|
1083
|
+
mTab.item.setCount("...");
|
|
1084
|
+
var oControl = mTab.control;
|
|
1085
|
+
var oFilterInfos = TableUtils.getFiltersInfoForSV(oControl, mTab.item.data("selectionVariant"));
|
|
1086
|
+
return TableUtils.getListBindingForCount(oControl, _this10.getView().getBindingContext(), {
|
|
1087
|
+
batchGroupId: oControl.getId() === sDisplayedControlId ? oControl.data("batchGroupId") : "$auto",
|
|
1088
|
+
additionalFilters: oFilterInfos.filters
|
|
1089
|
+
});
|
|
1090
|
+
});
|
|
1091
|
+
Promise.all(aBindingPromises).then(function (aCounts) {
|
|
1092
|
+
for (var k in aCounts) {
|
|
1093
|
+
var oItem = aCompliantTabs[k].item;
|
|
1094
|
+
oItem.setCount(TableUtils.getCountFormatted(aCounts[k]));
|
|
1095
|
+
oItem.data("outdatedCounts", false);
|
|
1096
|
+
}
|
|
1097
|
+
}).catch(function (oError) {
|
|
1098
|
+
Log.error("Error while retrieving the values for the icon tab bar", oError);
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
};
|
|
1102
|
+
|
|
1103
|
+
_proto._isFilterBarHidden = function _isFilterBarHidden() {
|
|
1104
|
+
return this.getView().getViewData().hideFilterBar;
|
|
1105
|
+
};
|
|
1106
|
+
|
|
1107
|
+
_proto._shouldAutoTriggerSearch = function _shouldAutoTriggerSearch(oVM) {
|
|
1108
|
+
if (this.getView().getViewData().initialLoad === InitialLoadMode.Auto && (!oVM || oVM.getStandardVariantKey() === oVM.getCurrentVariantKey())) {
|
|
1109
|
+
var oFilterBar = this._getFilterBarControl();
|
|
1110
|
+
|
|
1111
|
+
if (oFilterBar) {
|
|
1112
|
+
var oConditions = oFilterBar.getConditions();
|
|
1113
|
+
|
|
1114
|
+
for (var sKey in oConditions) {
|
|
1115
|
+
// ignore filters starting with $ (e.g. $search, $editState)
|
|
1116
|
+
if (!sKey.startsWith("$") && Array.isArray(oConditions[sKey]) && oConditions[sKey].length) {
|
|
1117
|
+
// load data as per user's setting of applyAutomatically on the variant
|
|
1118
|
+
var standardVariant = oVM.getVariants().find(function (variant) {
|
|
1119
|
+
return variant.key === oVM.getCurrentVariantKey();
|
|
1120
|
+
});
|
|
1121
|
+
return standardVariant && standardVariant.executeOnSelect;
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
return false;
|
|
1128
|
+
};
|
|
1129
|
+
|
|
1130
|
+
_proto._updateTable = function _updateTable(oTable) {
|
|
1131
|
+
if (!oTable.isTableBound() || this.hasPendingChartChanges) {
|
|
1132
|
+
oTable.rebind();
|
|
1133
|
+
this.hasPendingChartChanges = false;
|
|
1134
|
+
}
|
|
1135
|
+
};
|
|
1136
|
+
|
|
1137
|
+
_proto._updateChart = function _updateChart(oChart) {
|
|
1138
|
+
var oInnerChart = oChart.getControlDelegate()._getChart(oChart);
|
|
1139
|
+
|
|
1140
|
+
if (!(oInnerChart && oInnerChart.isBound("data")) || this.hasPendingTableChanges) {
|
|
1141
|
+
oChart.getControlDelegate().rebind(oChart, oInnerChart.getBindingInfo("data"));
|
|
1142
|
+
this.hasPendingTableChanges = false;
|
|
1143
|
+
}
|
|
1144
|
+
};
|
|
1145
|
+
|
|
1146
|
+
return ListReportController;
|
|
1147
|
+
}(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "_routing", [_dec2], {
|
|
1148
|
+
configurable: true,
|
|
1149
|
+
enumerable: true,
|
|
1150
|
+
writable: true,
|
|
1151
|
+
initializer: null
|
|
1152
|
+
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "_intentBasedNavigation", [_dec3], {
|
|
1153
|
+
configurable: true,
|
|
1154
|
+
enumerable: true,
|
|
1155
|
+
writable: true,
|
|
1156
|
+
initializer: null
|
|
1157
|
+
}), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "sideEffects", [_dec4], {
|
|
1158
|
+
configurable: true,
|
|
1159
|
+
enumerable: true,
|
|
1160
|
+
writable: true,
|
|
1161
|
+
initializer: null
|
|
1162
|
+
}), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "intentBasedNavigation", [_dec5], {
|
|
1163
|
+
configurable: true,
|
|
1164
|
+
enumerable: true,
|
|
1165
|
+
writable: true,
|
|
1166
|
+
initializer: null
|
|
1167
|
+
}), _descriptor5 = _applyDecoratedDescriptor(_class2.prototype, "share", [_dec6], {
|
|
1168
|
+
configurable: true,
|
|
1169
|
+
enumerable: true,
|
|
1170
|
+
writable: true,
|
|
1171
|
+
initializer: null
|
|
1172
|
+
}), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "editFlow", [_dec7], {
|
|
1173
|
+
configurable: true,
|
|
1174
|
+
enumerable: true,
|
|
1175
|
+
writable: true,
|
|
1176
|
+
initializer: null
|
|
1177
|
+
}), _descriptor7 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec8], {
|
|
1178
|
+
configurable: true,
|
|
1179
|
+
enumerable: true,
|
|
1180
|
+
writable: true,
|
|
1181
|
+
initializer: null
|
|
1182
|
+
}), _descriptor8 = _applyDecoratedDescriptor(_class2.prototype, "kpiManagement", [_dec9], {
|
|
1183
|
+
configurable: true,
|
|
1184
|
+
enumerable: true,
|
|
1185
|
+
writable: true,
|
|
1186
|
+
initializer: null
|
|
1187
|
+
}), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec10], {
|
|
1188
|
+
configurable: true,
|
|
1189
|
+
enumerable: true,
|
|
1190
|
+
writable: true,
|
|
1191
|
+
initializer: null
|
|
1192
|
+
}), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "massEdit", [_dec11], {
|
|
1193
|
+
configurable: true,
|
|
1194
|
+
enumerable: true,
|
|
1195
|
+
writable: true,
|
|
1196
|
+
initializer: null
|
|
1197
|
+
}), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onViewNeedsRefresh", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onViewNeedsRefresh"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPendingFilters", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onPendingFilters"), _class2.prototype)), _class2)) || _class);
|
|
1198
|
+
return ListReportController;
|
|
1199
|
+
}, false);
|
|
1200
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiVGVtcGxhdGVDb250ZW50VmlldyIsIkNvcmVMaWJyYXJ5IiwiSW5pdGlhbExvYWRNb2RlIiwiTGlzdFJlcG9ydENvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiSW50ZXJuYWxSb3V0aW5nIiwib3ZlcnJpZGUiLCJvbkFmdGVyQmluZGluZyIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiX29uQWZ0ZXJCaW5kaW5nIiwiSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXRFbnRpdHlTZXQiLCJiYXNlIiwiZ2V0Q3VycmVudEVudGl0eVNldCIsIlNpZGVFZmZlY3RzIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUiLCJTaGFyZSIsIlNoYXJlT3ZlcnJpZGVzIiwiRWRpdEZsb3ciLCJFZGl0Rmxvd092ZXJyaWRlcyIsIlZpZXdTdGF0ZSIsIlZpZXdTdGF0ZU92ZXJyaWRlcyIsIktQSU1hbmFnZW1lbnQiLCJQbGFjZWhvbGRlciIsIk1hc3NFZGl0IiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJwcml2YXRlRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJoYW5kbGVycyIsIm9uVGFiTXVsdGlNb2RlQ2hhbmdlIiwib0V2ZW50IiwiX3VwZGF0ZU11bHRpTW9kZVNlbGVjdGVkQ29udHJvbCIsIl91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMiLCJvRmlsdGVyQmFyIiwiX2dldEZpbHRlckJhckNvbnRyb2wiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9EaXNwbGF5ZWRDb250cm9sIiwiX2dldEN1cnJlbnRDb250cm9sIiwib011bHRpTW9kZUNvbnRyb2wiLCJfZ2V0TXVsdGlNb2RlQ29udHJvbCIsInNTZWxlY3RlZEtleSIsImdldFNlbGVjdGVkS2V5Iiwic1ByZXZpb3VzU2VsZWN0ZWRLZXkiLCJtUGFyYW1ldGVycyIsInByZXZpb3VzS2V5IiwidW5kZWZpbmVkIiwic2V0UHJvcGVydHkiLCJnZXRQcm9wZXJ0eSIsIl9pc0N1c3RvbVRhYiIsIm9GaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVyQ29uZGl0aW9ucyIsIm9uVmlld05lZWRzUmVmcmVzaCIsImZpbHRlckNvbmRpdGlvbnMiLCJjdXJyZW50VGFiSWQiLCJyZWZyZXNoQ2F1c2UiLCJpc0EiLCJnZXRSb3dCaW5kaW5nIiwiZGF0YSIsInJlYmluZCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsIl9nZXRDaGFydCIsImdldEJpbmRpbmciLCJvSW5uZXJDaGFydCIsImdldEJpbmRpbmdJbmZvIiwic2VsZWN0ZWRLZXkiLCJDb250cm9sUGVyc29uYWxpemF0aW9uV3JpdGVBUEkiLCJhZGQiLCJjaGFuZ2VzIiwiY2hhbmdlU3BlY2lmaWNEYXRhIiwiY2hhbmdlVHlwZSIsImNvbnRlbnQiLCJwcmV2aW91c1NlbGVjdGVkS2V5Iiwic2VsZWN0b3JFbGVtZW50IiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJvbkZpbHRlcnNDaGFuZ2VkIiwib25QZW5kaW5nRmlsdGVycyIsImdldEFzc2lnbmVkRmlsdGVyc1RleHQiLCJmaWx0ZXJzVGV4dCIsImdldFBhcmFtZXRlciIsIm9uVmFyaWFudFNlbGVjdGVkIiwib1ZNIiwiZ2V0U291cmNlIiwic2V0VGltZW91dCIsIl9pc011bHRpTW9kZSIsImFwcGx5IiwiX3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoIiwidHJpZ2dlclNlYXJjaCIsIm9uVmFyaWFudFNhdmVkIiwib25TZWFyY2giLCJvTWRjQ2hhcnQiLCJnZXRDaGFydENvbnRyb2wiLCJiSGlkZURyYWZ0IiwiRmlsdGVyVXRpbHMiLCJnZXRFZGl0U3RhdGVJc0hpZGVEcmFmdCIsImdldENvbmRpdGlvbnMiLCJhQ29udHJvbHMiLCJfZ2V0Q29udHJvbHMiLCJfc2V0Q291bnRzT3V0RGF0ZWQiLCJzRGlzcGxheWVkQ29udHJvbElkIiwiZ2V0SWQiLCJfdXBkYXRlTXVsdGlUYWJOb3RBcHBsaWNhYmxlRmllbGRzIiwiZm9yRWFjaCIsIm9Db250cm9sIiwiX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMiLCJvUGFnZUludGVybmFsTW9kZWxDb250ZXh0Iiwic1RlbXBsYXRlQ29udGVudFZpZXciLCJnZXRQYXRoIiwiQ2hhcnQiLCJoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzIiwiVGFibGUiLCJoYXNQZW5kaW5nVGFibGVDaGFuZ2VzIiwiU3RhdGVVdGlsIiwicmV0cmlldmVFeHRlcm5hbFN0YXRlIiwidGhlbiIsIm9FeHRlcm5hbFN0YXRlIiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImZpbHRlciIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJnZXRWaWV3RGF0YSIsImxpdmVNb2RlIiwic3lzdGVtIiwicGhvbmUiLCJvRHluYW1pY1BhZ2UiLCJieUlkIiwic2V0SGVhZGVyRXhwYW5kZWQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJvQ29udHJvbGxlciIsInNPdXRib3VuZFRhcmdldCIsIm9Db250ZXh0Iiwic0NyZWF0ZVBhdGgiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJnZXRDb250ZW50Iiwib1RhYmxlIiwiX2dldFRhYmxlIiwiYURhdGEiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0IiwiQ2hhcnRVdGlscyIsInNldENoYXJ0RmlsdGVycyIsIm9uU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsImtleSIsIm9DaGFydCIsIm9TZWdtZW50ZWRCdXR0b25EZWxlZ2F0ZSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJhSXRlbXMiLCJvU2VnbWVudGVkQnV0dG9uIiwiZ2V0SXRlbXMiLCJvSXRlbSIsImdldEtleSIsImZvY3VzIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9nZXRTZWdtZW50ZWRCdXR0b24iLCJhZGRFdmVudERlbGVnYXRlIiwiX3VwZGF0ZVRhYmxlIiwiX3VwZGF0ZUNoYXJ0IiwiSHlicmlkIiwib25GaWx0ZXJzU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsInNldFZpc2libGUiLCJvblN0YXRlQ2hhbmdlIiwiZm9ybWF0dGVycyIsInNldFRhYk1lc3NhZ2VTdHJpcCIsImFJZ25vcmVkRmllbGRzIiwic1RhYlRpdGxlIiwiYklzQ2hhcnQiLCJvQXBwbHlTdXBwb3J0ZWQiLCJzVGV4dCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInNGaWx0ZXJCYXJFbnRpdHlQYXRoIiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1Jlc291cmNlQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImFJZ25vcmVkTGFiZWxzIiwibWFwIiwic1Byb3BlcnR5Iiwib01hY3JvUmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0Iiwic0xhYmVsIiwiZ2V0T2JqZWN0IiwiRGVsZWdhdGVVdGlsIiwiZ2V0TG9jYWxpemVkVGV4dCIsImJJc1NlYXJjaElnbm9yZWQiLCJlbmFibGVTZWFyY2giLCJDb21tb25VdGlscyIsImdldE1lc3NhZ2VTdHJpcFRleHQiLCJleHRlbnNpb25BUEkiLCJFeHRlbnNpb25BUEkiLCJvbkluaXQiLCJQYWdlQ29udHJvbGxlciIsInByb3RvdHlwZSIsIm9NdWx0aU1vZGVUYWIiLCJzZWxlY3RlZCIsIm9VcGRhdGVDb3VudHMiLCJfdXBkYXRlQ291bnRzIiwiYWRkRXZlbnRUb0JpbmRpbmdJbmZvIiwiX2hhc011bHRpVmlzdWFsaXphdGlvbnMiLCJhbHBDb250ZW50VmlldyIsIl9nZXREZWZhdWx0UGF0aCIsImRlc2t0b3AiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsIl9zZXRJbml0TG9hZCIsIm9uRXhpdCIsIl9vTGlzdFJlcG9ydENvbnRyb2wiLCJkZXN0cm95IiwiYVRhYmxlcyIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJvVGFibGVCaW5kaW5nIiwiX2dldFRhYmxlQmluZGluZyIsIl9pc0ZjbEVuYWJsZWQiLCJyZWZyZXNoIiwic1VwZGF0ZVRpbWVyIiwiZm5VcGRhdGVUYWJsZUFjdGlvbnMiLCJfdXBkYXRlVGFibGVBY3Rpb25zIiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwic2V0RWRpdFN0YXRlUHJvY2Vzc2VkIiwicGFnZVJlYWR5Iiwid2FpdEZvciIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJvbkJlZm9yZVJlbmRlcmluZyIsImdldFJlc291cmNlQnVuZGxlIiwicmVzcG9uc2UiLCJzRW50aXR5U2V0IiwiZW50aXR5U2V0IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJzZXROb0RhdGFUZXh0Iiwib25QYWdlUmVhZHkiLCJmb3JjZUZvY3VzIiwiZ2V0U2hvd01lc3NhZ2VzIiwic2V0U2hvd01lc3NhZ2VzIiwic2V0Rm9jdXNPbkZpcnN0RXJyb25lb3VzRmllbGQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJfc0VudGl0eVNldCIsInNsaWNlIiwiYUlCTkFjdGlvbnMiLCJnZXRJQk5BY3Rpb25zIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkpTT04iLCJwYXJzZSIsIkNvbW1vbkhlbHBlciIsInBhcnNlQ3VzdG9tRGF0YSIsImdldEN1c3RvbURhdGEiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwib1RpdGxlSW5mbyIsInRpdGxlIiwic3VidGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiTGlzdFJlcG9ydFRpdGxlIiwiTGlzdFJlcG9ydFN1YnRpdGxlIiwiX2dldFBhZ2VPckZpbHRlckJhclZhcmlhbnRNYW5hZ2VtZW50IiwiX2dldEZpbHRlckJhckNvbnRyb2xJZCIsIl9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCIsImFkYXB0YXRpb25GaWx0ZXJCYXIiLCJnZXRJbmJ1aWx0RmlsdGVyIiwiZ2V0UGFyZW50Iiwic0NvbnRyb2wiLCJfZ2V0U2VnbWVudGVkQnV0dG9uSWQiLCJfZ2V0Q2hhcnRDb250cm9sSWQiLCJfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCIsIl9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sSWQiLCJfZ2V0VGFibGVDb250cm9sSWQiLCJzVGFibGVJZCIsIm9UYWJsZUNvbnRyb2wiLCJvQmluZGluZyIsIl9nZXRSb3dCaW5kaW5nIiwic0tleSIsIm9UYWJNdWx0aU1vZGUiLCJpbmRleE9mIiwicHVzaCIsImRlZmF1bHRQYXRoIiwiX2JNdWx0aU1vZGUiLCJfaXNJbml0TG9hZEVuYWJsZWQiLCJpbml0TG9hZE1vZGUiLCJpbml0aWFsTG9hZCIsIkVuYWJsZWQiLCJfaXNNdWx0aUVudGl0eVNldHMiLCJfZGlzYWJsZUluaXRMb2FkIiwiZmlsdGVyQmFyIiwic2V0U3VzcGVuZFNlbGVjdGlvbiIsIl9hcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCIsInZhcmlhbnRNYW5hZ2VtZW50IiwicmVnaXN0ZXJBcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCIsImJpbmQiLCJfc2V0U2hhcmVNb2RlbCIsImZuR2V0VXNlciIsIk9iamVjdFBhdGgiLCJnZXQiLCJvU2hhcmVJbmZvIiwiYm9va21hcmtUaXRsZSIsImRvY3VtZW50IiwiYm9va21hcmtDdXN0b21VcmwiLCJzSGFzaCIsImhhc2hlciIsImdldEhhc2giLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJpc1NoYXJlSW5KYW1BY3RpdmUiLCJpc0phbUFjdGl2ZSIsIm9UZW1wbGF0ZVByaXZhdGVNb2RlbCIsImdldE93bmVyQ29tcG9uZW50Iiwic0Rpc3BsYXlDb250cm9sSWQiLCJzQ29udHJvbElkIiwibUNhY2hlIiwiaWdub3JlZEZpZWxkcyIsImlnbm9yZWRGaWVsZHNUaXRsZSIsImFDaGFydHMiLCJzVGFibGVFbnRpdHlQYXRoIiwic1RhYmxlRW50aXR5U2V0Iiwic1RhYklkIiwic0NhY2hlS2V5IiwiZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMiLCJjYWxsIiwic0NoYXJ0RW50aXR5UGF0aCIsInNDaGFydEVudGl0eVNldCIsIl91cGRhdGVNdWx0aU1vZGVDb3VudHMiLCJhQmluZGluZ1Byb21pc2VzIiwiYUNvbXBsaWFudFRhYnMiLCJjb250cm9sIiwiaXRlbSIsIm1UYWIiLCJzZXRDb3VudCIsIm9GaWx0ZXJJbmZvcyIsIlRhYmxlVXRpbHMiLCJnZXRGaWx0ZXJzSW5mb0ZvclNWIiwiZ2V0TGlzdEJpbmRpbmdGb3JDb3VudCIsImJhdGNoR3JvdXBJZCIsImFkZGl0aW9uYWxGaWx0ZXJzIiwiZmlsdGVycyIsIlByb21pc2UiLCJhbGwiLCJhQ291bnRzIiwiayIsImdldENvdW50Rm9ybWF0dGVkIiwiX2lzRmlsdGVyQmFySGlkZGVuIiwiaGlkZUZpbHRlckJhciIsIkF1dG8iLCJnZXRTdGFuZGFyZFZhcmlhbnRLZXkiLCJnZXRDdXJyZW50VmFyaWFudEtleSIsIm9Db25kaXRpb25zIiwic3RhcnRzV2l0aCIsInN0YW5kYXJkVmFyaWFudCIsImdldFZhcmlhbnRzIiwiZmluZCIsInZhcmlhbnQiLCJleGVjdXRlT25TZWxlY3QiLCJpc1RhYmxlQm91bmQiLCJpc0JvdW5kIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1EQSxNQUFNQSxtQkFBbUIsR0FBR0MsV0FBVyxDQUFDRCxtQkFBeEM7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TUFBM0IsQ0FBM0M7QUFDQSxhQUFLZ0Qsc0JBQUwsR0FBOEIsS0FBOUI7QUFDQTtBQUNELEs7OztJQXJ1QmlDc0YsYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBc2dDcEJ6TSxvQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBEeW5hbWljUGFnZSBmcm9tIFwic2FwL2YvRHluYW1pY1BhZ2VcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBFZGl0RmxvdyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRWRpdEZsb3dcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgS1BJTWFuYWdlbWVudCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvS1BJTWFuYWdlbWVudFwiO1xuaW1wb3J0IE1hc3NFZGl0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NYXNzRWRpdFwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IFNoYXJlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9TaGFyZVwiO1xuaW1wb3J0IFNpZGVFZmZlY3RzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9TaWRlRWZmZWN0c1wiO1xuaW1wb3J0IFZpZXdTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgRmlsdGVyQmFyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7XG5cdGRlZmluZVVJNUNsYXNzLFxuXHRleHRlbnNpYmxlLFxuXHRmaW5hbEV4dGVuc2lvbixcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uLFxuXHR1c2luZ0V4dGVuc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDaGFydFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRSdW50aW1lXCI7XG5pbXBvcnQgQ2hhcnRVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBUYWJsZVV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1V0aWxzXCI7XG5pbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0xpc3RSZXBvcnQvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgRWRpdEZsb3dPdmVycmlkZXMgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvUm9vdENvbnRhaW5lci9vdmVycmlkZXMvRWRpdEZsb3dcIjtcbmltcG9ydCBUYWJsZVNjcm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1RhYmxlU2Nyb2xsZXJcIjtcbmltcG9ydCBJY29uVGFiQmFyIGZyb20gXCJzYXAvbS9JY29uVGFiQmFyXCI7XG5pbXBvcnQgU2VnbWVudGVkQnV0dG9uIGZyb20gXCJzYXAvbS9TZWdtZW50ZWRCdXR0b25cIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB7IHN5c3RlbSB9IGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgQ29udHJvbFBlcnNvbmFsaXphdGlvbldyaXRlQVBJIGZyb20gXCJzYXAvdWkvZmwvd3JpdGUvYXBpL0NvbnRyb2xQZXJzb25hbGl6YXRpb25Xcml0ZUFQSVwiO1xuaW1wb3J0IFN0YXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9wMTNuL1N0YXRlVXRpbFwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvcmVzb3VyY2UvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IGhhc2hlciBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvaGFzaGVyXCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IFNoYXJlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9TaGFyZVwiO1xuaW1wb3J0IFZpZXdTdGF0ZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvVmlld1N0YXRlXCI7XG5cbmNvbnN0IFRlbXBsYXRlQ29udGVudFZpZXcgPSBDb3JlTGlicmFyeS5UZW1wbGF0ZUNvbnRlbnRWaWV3LFxuXHRJbml0aWFsTG9hZE1vZGUgPSBDb3JlTGlicmFyeS5Jbml0aWFsTG9hZE1vZGU7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlclwiKVxuY2xhc3MgTGlzdFJlcG9ydENvbnRyb2xsZXIgZXh0ZW5kcyBQYWdlQ29udHJvbGxlciB7XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRJbnRlcm5hbFJvdXRpbmcub3ZlcnJpZGUoe1xuXHRcdFx0b25BZnRlckJpbmRpbmc6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbFJvdXRpbmcpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBMaXN0UmVwb3J0Q29udHJvbGxlcikuX29uQWZ0ZXJCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfcm91dGluZyE6IEludGVybmFsUm91dGluZztcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKHtcblx0XHRcdGdldEVudGl0eVNldDogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdHJldHVybiAodGhpcy5iYXNlIGFzIExpc3RSZXBvcnRDb250cm9sbGVyKS5nZXRDdXJyZW50RW50aXR5U2V0KCk7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfaW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cdEB1c2luZ0V4dGVuc2lvbihTaWRlRWZmZWN0cylcblx0c2lkZUVmZmVjdHMhOiBTaWRlRWZmZWN0cztcblxuXHRAdXNpbmdFeHRlbnNpb24oSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlKSlcblx0aW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihTaGFyZS5vdmVycmlkZShTaGFyZU92ZXJyaWRlcykpXG5cdHNoYXJlITogU2hhcmU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEVkaXRGbG93Lm92ZXJyaWRlKEVkaXRGbG93T3ZlcnJpZGVzKSlcblx0ZWRpdEZsb3chOiBFZGl0RmxvdztcblxuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlLm92ZXJyaWRlKFZpZXdTdGF0ZU92ZXJyaWRlcykpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oS1BJTWFuYWdlbWVudClcblx0a3BpTWFuYWdlbWVudCE6IEtQSU1hbmFnZW1lbnQ7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKE1hc3NFZGl0KVxuXHRtYXNzRWRpdCE6IE1hc3NFZGl0O1xuXHRwcml2YXRlIGV4dGVuc2lvbkFQST86IEV4dGVuc2lvbkFQSTtcblx0cHJpdmF0ZSBfb0xpc3RSZXBvcnRDb250cm9sPzogQ29udHJvbDtcblx0cHJpdmF0ZSBmaWx0ZXJCYXJDb25kaXRpb25zPzogYW55O1xuXHRwcml2YXRlIF9iTXVsdGlNb2RlPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBzVXBkYXRlVGltZXI/OiBhbnk7XG5cdHByaXZhdGUgb1Jlc291cmNlQnVuZGxlPzogUmVzb3VyY2VCdW5kbGU7XG5cdHByaXZhdGUgX3NFbnRpdHlTZXQ/OiBzdHJpbmc7XG5cdHByaXZhdGUgaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcz86IGJvb2xlYW47XG5cdHByaXZhdGUgaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcz86IGJvb2xlYW47XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSSgpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHR9XG5cblx0b25Jbml0KCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkluaXQuYXBwbHkodGhpcyk7XG5cdFx0Y29uc3QgYUNvbnRyb2xzID0gdGhpcy5fZ2V0Q29udHJvbHMoKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRjb25zdCBvTXVsdGlNb2RlVGFiID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidGFic1wiLCB7XG5cdFx0XHRcdHNlbGVjdGVkOiBvTXVsdGlNb2RlVGFiLmdldFNlbGVjdGVkS2V5KCkgfHwgKG9NdWx0aU1vZGVUYWIuZ2V0SXRlbXMoKVswXSBhcyBhbnkpLmdldEtleSgpXG5cdFx0XHR9KTtcblx0XHRcdGFDb250cm9scy5mb3JFYWNoKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9VcGRhdGVDb3VudHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ291bnRzKCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdENvbW1vblV0aWxzLmFkZEV2ZW50VG9CaW5kaW5nSW5mbyhvQ29udHJvbCwgXCJkYXRhUmVxdWVzdGVkXCIsIG9VcGRhdGVDb3VudHMpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vVE9ETzogVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGFwcHJvYWNoIGFuZCB3aWxsIGJlIHJlbW92ZWQgb25jZSBhcHAgc3RhdGUgYmVoYXZpb3VyIGlzIGZpbmFsaXplZC5cblxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIHRydWUpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFwcGxpZWRGaWx0ZXJzXCIsIFwiXCIpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhpZGVEcmFmdEluZm9cIiwgZmFsc2UpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInVvbVwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JcIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNjYWxlZmFjdG9yTnVtYmVyXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjdXJyZW5jeVwiLCB7fSk7XG5cblx0XHRpZiAodGhpcy5faGFzTXVsdGlWaXN1YWxpemF0aW9ucygpKSB7XG5cdFx0XHRsZXQgYWxwQ29udGVudFZpZXcgPSB0aGlzLl9nZXREZWZhdWx0UGF0aCgpO1xuXHRcdFx0aWYgKCFzeXN0ZW0uZGVza3RvcCAmJiBhbHBDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQpIHtcblx0XHRcdFx0YWxwQ29udGVudFZpZXcgPSBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0O1xuXHRcdFx0fVxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgYWxwQ29udGVudFZpZXcpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIGNvbmRpdGlvbnMgZnJvbSBmaWx0ZXIgYmFyXG5cdFx0Ly8gdGhpcyBpcyBsYXRlciB1c2VkIGJlZm9yZSBuYXZpZ2F0aW9uIHRvIGdldCBjb25kaXRpb25zIGFwcGxpZWQgb24gdGhlIGZpbHRlciBiYXJcblx0XHR0aGlzLmZpbHRlckJhckNvbmRpdGlvbnMgPSB7fTtcblxuXHRcdC8vIEFzIEFwcFN0YXRlSGFuZGxlci5hcHBseUFwcFN0YXRlIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCB3aWxsXG5cdFx0Ly8gaGFwcGVuIGFmdGVyIHRoZSByb3V0ZU1hdGNoIGV2ZW50IGhhcyBiZWVuIHByb2Nlc3NlZCAob3RoZXJ3aXNlIHRoZSByb3V0ZXIgZ2V0cyBicm9rZW4pXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0dGhpcy5faXNNdWx0aU1vZGUoKSAmJiB0aGlzLl91cGRhdGVNdWx0aUNvbnRyb2xIaWRkZW5TdGF0dXMoKTtcblxuXHRcdC8vIENvbmZpZ3VyZSB0aGUgaW5pdGlhbCBsb2FkIHNldHRpbmdzXG5cdFx0dGhpcy5fc2V0SW5pdExvYWQoKTtcblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHRkZWxldGUgdGhpcy5maWx0ZXJCYXJDb25kaXRpb25zO1xuXHRcdGRlbGV0ZSB0aGlzLl9vTGlzdFJlcG9ydENvbnRyb2w7XG5cdFx0dGhpcy5leHRlbnNpb25BUEkgJiYgdGhpcy5leHRlbnNpb25BUEkuZGVzdHJveSgpO1xuXHRcdGRlbGV0ZSB0aGlzLmV4dGVuc2lvbkFQSTtcblx0fVxuXG5cdF9vbkFmdGVyQmluZGluZygpIHtcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKTtcblx0XHRpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0Y29uc3Qgb1RhYmxlQmluZGluZyA9IHRoaXMuX2dldFRhYmxlQmluZGluZygpO1xuXHRcdFx0aWYgKG9UYWJsZUJpbmRpbmcpIHtcblx0XHRcdFx0aWYgKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlcmUgaXMgYW4gaXNzdWUgaWYgd2UgdXNlIGEgdGltZW91dCB3aXRoIGEga2VwdCBhbGl2ZSBjb250ZXh0IHVzZWQgb24gYW5vdGhlciBwYWdlXG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLnNVcGRhdGVUaW1lcikge1xuXHRcdFx0XHRcdFx0dGhpcy5zVXBkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0Q291bnRzT3V0RGF0ZWQoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVDb3VudHMoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5zVXBkYXRlVGltZXI7XG5cdFx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYW5kIHZpc2liaWxpdHkgdXBvbiB0YWJsZSBkYXRhIHVwZGF0ZS5cblx0XHRcdFx0XHRjb25zdCBmblVwZGF0ZVRhYmxlQWN0aW9ucyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZVByb2Nlc3NlZCgpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhZ2VSZWFkeS53YWl0Rm9yKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0QXBwU3RhdGVIYW5kbGVyKCkuYXBwbHlBcHBTdGF0ZSgpKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0KCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHQudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IHJlc3BvbnNlO1xuXHRcdFx0XHRjb25zdCBhQ29udHJvbHMgPSB0aGlzLl9nZXRDb250cm9scygpO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJUX1RBQkxFX0FORF9DSEFSVF9OT19EQVRBX1RFWFRcIixcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSBhcyBSZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdG9Db250cm9sLnNldE5vRGF0YVRleHQoc1RleHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBhZ2VSZWFkeShtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Ly8gRW5hYmxpbmcgbWFuZGF0b3J5IGZpbHRlciBmaWVsZHMgbWVzc2FnZSBkaWFsb2cgYW5kIGZvY3VzaW5nIG9uIHRoZW1cblx0XHRpZiAobVBhcmFtZXRlcnMuZm9yY2VGb2N1cykge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblxuXHRcdFx0aWYgKG9GaWx0ZXJCYXIgJiYgIW9GaWx0ZXJCYXIuZ2V0U2hvd01lc3NhZ2VzKCkpIHtcblx0XHRcdFx0b0ZpbHRlckJhci5zZXRTaG93TWVzc2FnZXModHJ1ZSk7XG5cdFx0XHRcdChvRmlsdGVyQmFyIGFzIGFueSkuc2V0Rm9jdXNPbkZpcnN0RXJyb25lb3VzRmllbGQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGhhbmRsZXIgb24gYmFjayBuYXZpZ2F0aW9uIHRoYXQgZGlzcGxheXMgRHJhZnQgY29uZmlybWF0aW9uXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnQgb2YgYSBsaXN0IHJlcG9ydCB2aWV3IG5lZWRzIHRvIGJlIHJlZnJlc2hlZC5cblx0ICogVGhpcyBoYXBwZW5zIGVpdGhlciB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIG9uIHRoZSBGaWx0ZXJCYXIgYW5kIHRoZSBzZWFyY2ggaXMgdHJpZ2dlcmVkLFxuXHQgKiBvciB3aGVuIGEgdGFiIHdpdGggY3VzdG9tIGNvbnRlbnQgaXMgc2VsZWN0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge21hcH0gbVBhcmFtZXRlcnMgTWFwIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBjb25kaXRpb25zIG9mIHRoZSBGaWx0ZXJCYXIsIHRoZSBjdXJyZW50VGFiSURcblx0ICogYW5kIHRoZSB2aWV3IHJlZnJlc2ggY2F1c2UgKHRhYkNoYW5nZWQgb3Igc2VhcmNoKS5cblx0ICogVGhlIG1hcCBsb29rcyBsaWtlIHRoaXM6XG5cdCAqIDxjb2RlPjxwcmU+XG5cdCAqIFx0e1xuXHQgKiBcdFx0ZmlsdGVyQ29uZGl0aW9uczoge1xuXHQgKiBcdFx0XHRDb3VudHJ5OiBbXG5cdCAqIFx0XHRcdFx0e1xuXHQgKiBcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIlxuXHQgKlx0XHRcdFx0XHR2YWxpZGF0ZWQ6IFwiTm90VmFsaWRhdGVkXCJcblx0ICpcdFx0XHRcdFx0dmFsdWVzOiBbXCJHZXJtYW55XCIsIC4uLl1cblx0ICogXHRcdFx0XHR9LFxuXHQgKiBcdFx0XHRcdC4uLlxuXHQgKiBcdFx0XHRdXG5cdCAqIFx0XHRcdC4uLlxuXHQgKiBcdFx0fSxcblx0ICpcdFx0Y3VycmVudFRhYklkOiBcImZlOjpDdXN0b21UYWI6OnRhYjFcIixcblx0ICpcdFx0cmVmcmVzaENhdXNlOiBcInRhYkNoYW5nZWRcIiB8IFwic2VhcmNoXCJcblx0ICpcdH1cblx0ICogPC9wcmU+PC9jb2RlPlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25WaWV3TmVlZHNSZWZyZXNoKG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvKiBUbyBiZSBvdmVycmlkZW4gKi9cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBmaWx0ZXIgb3Igc2VhcmNoIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIEZpbHRlckJhcixcblx0ICogYnV0IGhhcyBub3QgYmVlbiB2YWxpZGF0ZWQgeWV0IGJ5IHRoZSBlbmQgdXNlciAod2l0aCB0aGUgJ0dvJyBvciAnU2VhcmNoJyBidXR0b24pLlxuXHQgKiBUeXBpY2FsbHksIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IHRhYiBpcyBncmV5ZWQgb3V0IHVudGlsIHRoZSBmaWx0ZXJzIGFyZSB2YWxpZGF0ZWQuXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY29udHJvbGxlciBleHRlbnNpb24gaW4gY2FzZSBvZiBjdXN0b21pemF0aW9uLlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGVuZGluZ0ZpbHRlcnMoKSB7XG5cdFx0LyogVG8gYmUgb3ZlcnJpZGVuICovXG5cdH1cblxuXHRnZXRDdXJyZW50RW50aXR5U2V0KCkge1xuXHRcdGlmICghdGhpcy5fc0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgb0Rpc3BsYXllZENvbnRyb2wgPSAodGhpcy5faXNNdWx0aU1vZGUoKSAmJiB0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpKSB8fCB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0dGhpcy5fc0VudGl0eVNldCA9IG9EaXNwbGF5ZWRDb250cm9sPy5kYXRhKFwidGFyZ2V0Q29sbGVjdGlvblBhdGhcIikuc2xpY2UoMSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9zRW50aXR5U2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYXRlcyB0aGUgdXBkYXRlIG9mIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JJQk4gYnV0dG9ucy5cblx0ICogQHBhcmFtIGFUYWJsZXMgQXJyYXkgb2YgdGFibGVzIGluIHRoZSBsaXN0IHJlcG9ydFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzOiBhbnkpIHtcblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gVXBkYXRlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiBEYXRhRmllbGRGb3JBY3Rpb24gYnV0dG9ucyBvbiB0YWJsZSB0b29sYmFyXG5cdFx0XHQvLyBUaGUgc2FtZSBpcyBhbHNvIHBlcmZvcm1lZCBvbiBUYWJsZSBzZWxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpLFxuXHRcdFx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpIGFzIGFueVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyA9IG9UYWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCk7XG5cblx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIHRvIGEgc3BlY2lmaWMgcm93IG9uIGFsbCB0aGUgYXZhaWxhYmxlIHRhYmxlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyI19zY3JvbGxUYWJsZXNUb1Jvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Jvd1BhdGggVGhlIHBhdGggb2YgdGhlIHRhYmxlIHJvdyBjb250ZXh0IHRvIGJlIHNjcm9sbGVkIHRvXG5cdCAqL1xuXHRfc2Nyb2xsVGFibGVzVG9Sb3coc1Jvd1BhdGg6IHN0cmluZykge1xuXHRcdHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIikuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhvVGFibGUsIHNSb3dQYXRoKTtcblx0XHR9KTtcblx0fVxuXG5cdF9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpIHtcblx0XHRjb25zdCBvVGl0bGVJbmZvID0geyB0aXRsZTogXCJcIiwgc3VidGl0bGU6IFwiXCIsIGludGVudDogXCJcIiwgaWNvbjogXCJcIiB9O1xuXHRcdG9UaXRsZUluZm8udGl0bGUgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YSgpLkxpc3RSZXBvcnRUaXRsZTtcblx0XHRvVGl0bGVJbmZvLnN1YnRpdGxlID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoKS5MaXN0UmVwb3J0U3VidGl0bGU7XG5cdFx0cmV0dXJuIG9UaXRsZUluZm87XG5cdH1cblxuXHRfZ2V0UGFnZU9yRmlsdGVyQmFyVmFyaWFudE1hbmFnZW1lbnQoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6UGFnZVZhcmlhbnRNYW5hZ2VtZW50XCIpIHx8IHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCkgKyBcIjo6VmFyaWFudE1hbmFnZW1lbnRcIilcblx0XHQpO1xuXHR9XG5cblx0X2dldEZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCkpIGFzIEZpbHRlckJhcjtcblx0fVxuXG5cdF9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHQvLyBJZiB0aGUgYWRhcHRhdGlvbiBmaWx0ZXIgYmFyIGlzIHBhcnQgb2YgdGhlIERPTSB0cmVlLCB0aGUgXCJBZGFwdCBGaWx0ZXJcIiBkaWFsb2cgaXMgb3Blbixcblx0XHQvLyBhbmQgd2UgcmV0dXJuIHRoZSBhZGFwdGF0aW9uIGZpbHRlciBiYXIgYXMgYW4gYWN0aXZlIGNvbnRyb2wgKHZpc2libGUgZm9yIHRoZSB1c2VyKVxuXHRcdGNvbnN0IGFkYXB0YXRpb25GaWx0ZXJCYXIgPSAodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueSkuZ2V0SW5idWlsdEZpbHRlcigpO1xuXHRcdHJldHVybiBhZGFwdGF0aW9uRmlsdGVyQmFyPy5nZXRQYXJlbnQoKSA/IGFkYXB0YXRpb25GaWx0ZXJCYXIgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0U2VnbWVudGVkQnV0dG9uKHNDb250cm9sOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRTZWdtZW50ZWRCdXR0b25JZChzQ29udHJvbCkpO1xuXHR9XG5cblx0X2dldFNlZ21lbnRlZEJ1dHRvbklkKHNDb250cm9sOiBhbnkpIHtcblx0XHRpZiAoc0NvbnRyb2wgPT09IFwiQ2hhcnRcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldENoYXJ0KCkuZGF0YShcInNlZ21lbnRlZEJ1dHRvbklkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0VGFibGUoKT8uZGF0YShcInNlZ21lbnRlZEJ1dHRvbklkXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwiZmlsdGVyQmFySWRcIik7XG5cdH1cblxuXHRfZ2V0Q2hhcnRDb250cm9sSWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwic2luZ2xlQ2hhcnRJZFwiKTtcblx0fVxuXG5cdGdldENoYXJ0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRDaGFydENvbnRyb2xJZCgpKTtcblx0fVxuXG5cdF9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHRoaXMuX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2xJZCgpKTtcblx0fVxuXG5cdF9nZXRWaXN1YWxGaWx0ZXJCYXJDb250cm9sSWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXS5kYXRhKFwidmlzdWFsRmlsdGVyQmFySWRcIik7XG5cdH1cblxuXHRfZ2V0TXVsdGlNb2RlQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpUYWJNdWx0aXBsZU1vZGVcIikgYXMgSWNvblRhYkJhcjtcblx0fVxuXG5cdF9nZXRUYWJsZUNvbnRyb2xJZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJzaW5nbGVUYWJsZUlkXCIpO1xuXHR9XG5cblx0X2dldEN1cnJlbnRDb250cm9sKCk6IENvbnRyb2wge1xuXHRcdGlmICghdGhpcy5fb0xpc3RSZXBvcnRDb250cm9sKSB7XG5cdFx0XHRjb25zdCBvTXVsdGlNb2RlVGFiID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdFx0dGhpcy5fb0xpc3RSZXBvcnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChcblx0XHRcdFx0b011bHRpTW9kZVRhYi5nZXRTZWxlY3RlZEtleSgpIHx8IChvTXVsdGlNb2RlVGFiLmdldEl0ZW1zKClbMF0gYXMgYW55KS5nZXRLZXkoKVxuXHRcdFx0KSBhcyBDb250cm9sO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fb0xpc3RSZXBvcnRDb250cm9sIGFzIENvbnRyb2w7XG5cdH1cblxuXHRfZ2V0VGFibGUoKTogVGFibGUgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCk7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSA/IChvQ29udHJvbCBhcyBUYWJsZSkgOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHRoaXMuX2dldFRhYmxlQ29udHJvbElkKCkpIGFzIFRhYmxlO1xuXHR9XG5cblx0X2dldENoYXJ0KCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHRoaXMuX2dldENoYXJ0Q29udHJvbElkKCkpO1xuXHR9XG5cblx0X2dldFRhYmxlQmluZGluZyhzVGFibGVJZD86IGFueSkge1xuXHRcdGNvbnN0IG9UYWJsZUNvbnRyb2wgPSBzVGFibGVJZCA/IHRoaXMuZ2V0VmlldygpLmJ5SWQoc1RhYmxlSWQpIDogdGhpcy5fZ2V0VGFibGUoKTtcblx0XHRjb25zdCBvQmluZGluZyA9IG9UYWJsZUNvbnRyb2wgJiYgKG9UYWJsZUNvbnRyb2wgYXMgYW55KS5fZ2V0Um93QmluZGluZygpO1xuXG5cdFx0cmV0dXJuIG9CaW5kaW5nO1xuXHR9XG5cblx0X2dldENvbnRyb2xzKHNLZXk/OiBhbnkpIHtcblx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0Y29uc3QgYUNvbnRyb2xzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3Qgb1RhYk11bHRpTW9kZSA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRcdG9UYWJNdWx0aU1vZGUuZ2V0SXRlbXMoKS5mb3JFYWNoKChvSXRlbTogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChvSXRlbS5nZXRLZXkoKSk7XG5cdFx0XHRcdGlmIChzS2V5KSB7XG5cdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpLmluZGV4T2YoXCJmZTo6XCIgKyBzS2V5KSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRvQ29udHJvbCAmJiBhQ29udHJvbHMucHVzaChvQ29udHJvbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Db250cm9sICYmIGFDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYUNvbnRyb2xzO1xuXHRcdH0gZWxzZSBpZiAoc0tleSA9PT0gXCJDaGFydFwiKSB7XG5cdFx0XHRjb25zdCBvQ2hhcnQgPSB0aGlzLl9nZXRDaGFydCgpO1xuXHRcdFx0cmV0dXJuIG9DaGFydCA/IFtvQ2hhcnRdIDogW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0XHRyZXR1cm4gb1RhYmxlID8gW29UYWJsZV0gOiBbXTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0RGVmYXVsdFBhdGgoKSB7XG5cdFx0Y29uc3QgZGVmYXVsdFBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcImRlZmF1bHRQYXRoXCIpO1xuXHRcdHN3aXRjaCAoZGVmYXVsdFBhdGgpIHtcblx0XHRcdGNhc2UgXCJwcmltYXJ5XCI6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0O1xuXHRcdFx0Y2FzZSBcInNlY29uZGFyeVwiOlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTtcblx0XHRcdGNhc2UgXCJib3RoXCI6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB3aXRoIE11bHRpcGxlIFRhYmxlIG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNNdWx0aU1vZGVcblx0ICogQHJldHVybnMge2Jvb2xlYW59IElzIE11bHRpcGxlIFRhYmxlIG1vZGUgc2V0P1xuXHQgKi9cblx0X2lzTXVsdGlNb2RlKCkge1xuXHRcdGlmICghdGhpcy5fb0xpc3RSZXBvcnRDb250cm9sKSB7XG5cdFx0XHR0aGlzLl9iTXVsdGlNb2RlID0gISF0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9iTXVsdGlNb2RlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBrbm93IGlmIExpc3RSZXBvcnQgaXMgY29uZmlndXJlZCB0byBsb2FkIGRhdGEgYXQgc3RhcnQgdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaXNJbml0TG9hZERpc2FibGVkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBJcyBJbml0TG9hZCBlbmFibGVkP1xuXHQgKi9cblx0X2lzSW5pdExvYWRFbmFibGVkKCkge1xuXHRcdGNvbnN0IGluaXRMb2FkTW9kZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuaW5pdGlhbExvYWQ7XG5cdFx0cmV0dXJuIGluaXRMb2FkTW9kZSA9PT0gSW5pdGlhbExvYWRNb2RlLkVuYWJsZWQ7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGtub3cgaWYgTGlzdFJlcG9ydCBpcyBjb25maWd1cmVkIHdpdGggTXVsdGlwbGUgRW50aXR5U2V0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pc011bHRpRW50aXR5U2V0c1xuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgTXVsdGlwbGUgRW50aXR5U2V0cyBjb25maWd1cmF0aW9uP1xuXHQgKi9cblx0X2lzTXVsdGlFbnRpdHlTZXRzKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcImlzTXVsdGlFbnRpdHlTZXRzXCIpID09PSBcInRydWVcIjtcblx0fVxuXG5cdF9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCkge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcImhhc011bHRpVmlzdWFsaXphdGlvbnNcIikgPT09IFwidHJ1ZVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzdXNwZW5kIHNlYXJjaCBvbiB0aGUgZmlsdGVyIGJhci4gVGhlIGluaXRpYWwgbG9hZGluZyBvZiBkYXRhIGlzIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIEluaXRMb2FkIC0gRGlzYWJsZWQvQXV0by5cblx0ICogSXQgaXMgZW5hYmxlZCBsYXRlciB3aGVuIHRoZSB2aWV3IHN0YXRlIGlzIHNldCwgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byByZWFsaXplIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnMuXG5cdCAqL1xuXHRfZGlzYWJsZUluaXRMb2FkKCkge1xuXHRcdGNvbnN0IGZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHQvLyBjaGVjayBmb3IgZmlsdGVyIGJhciBoaWRkZW5cblx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRmaWx0ZXJCYXIuc2V0U3VzcGVuZFNlbGVjdGlvbih0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCBieSBmbGV4IHRvIGRldGVybWluZSBpZiB0aGUgYXBwbHlBdXRvbWF0aWNhbGx5IHNldHRpbmcgb24gdGhlIHZhcmlhbnQgaXMgdmFsaWQuXG5cdCAqIENhbGxlZCBvbmx5IGZvciBTdGFuZGFyZCBWYXJpYW50IGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgZGlzcGxheSB0ZXh0IHNldCBmb3IgYXBwbHlBdXRvbWF0aWNhbGx5IChGRSBvbmx5IHNldHMgaXQgZm9yIEF1dG8pLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHRydWUgaWYgZGF0YSBzaG91bGQgYmUgbG9hZGVkIGF1dG9tYXRpY2FsbHksIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0X2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50KCkge1xuXHRcdC8vIFdlIGFsd2F5cyByZXR1cm4gZmFsc2UgYW5kIHRha2UgY2FyZSBvZiBpdCB3aGVuIHZpZXcgc3RhdGUgaXMgc2V0XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgZm9yIGluaXRpYWwgbG9hZCBiYXNlZCBvblxuXHQgKiAtIG1hbmlmZXN0IHNldHRpbmcgaW5pdExvYWQgLSBFbmFibGVkL0Rpc2FibGVkL0F1dG9cblx0ICogLSB1c2VyJ3Mgc2V0dGluZyBvZiBhcHBseUF1dG9tYXRpY2FsbHkgb24gdmFyaWFudFxuXHQgKiAtIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnNcblx0ICogV2UgZGlzYWJsZSB0aGUgZmlsdGVyIGJhciBzZWFyY2ggYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5hYmxlIGl0IHdoZW4gdmlldyBzdGF0ZSBpcyBzZXQuXG5cdCAqL1xuXHRfc2V0SW5pdExvYWQoKSB7XG5cdFx0Ly8gaWYgaW5pdExvYWQgaXMgRGlzYWJsZWQgb3IgQXV0bywgc3dpdGNoIG9mZiBmaWx0ZXIgYmFyIHNlYXJjaCB0ZW1wb3JhcmlseSBhdCBzdGFydFxuXHRcdGlmICghdGhpcy5faXNJbml0TG9hZEVuYWJsZWQoKSkge1xuXHRcdFx0dGhpcy5fZGlzYWJsZUluaXRMb2FkKCk7XG5cdFx0fVxuXHRcdC8vIHNldCBob29rIGZvciBmbGV4IGZvciB3aGVuIHN0YW5kYXJkIHZhcmlhbnQgaXMgc2V0IChhdCBzdGFydCBvciBieSB1c2VyIGF0IHJ1bnRpbWUpXG5cdFx0Ly8gcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhlIHVzZXIgc2V0dGluZyAnYXBwbHkgYXV0b21hdGljYWxseScgYmVoYXZpb3VyIGlmIHRoZXJlIGFyZSBubyBmaWx0ZXJzXG5cdFx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnQ6IGFueSA9IHRoaXMuX2dldFBhZ2VPckZpbHRlckJhclZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50KSB7XG5cdFx0XHR2YXJpYW50TWFuYWdlbWVudC5yZWdpc3RlckFwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50KHRoaXMuX2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50LmJpbmQodGhpcykpO1xuXHRcdH1cblx0fVxuXG5cdF9zZXRTaGFyZU1vZGVsKCkge1xuXHRcdC8vIFRPRE86IGRlYWN0aXZhdGVkIGZvciBub3cgLSBjdXJyZW50bHkgdGhlcmUgaXMgbm8gX3RlbXBsUHJpdiBhbnltb3JlLCB0byBiZSBkaXNjdXNzZWRcblx0XHQvLyB0aGlzIG1ldGhvZCBpcyBjdXJyZW50bHkgbm90IGNhbGxlZCBhbnltb3JlIGZyb20gdGhlIGluaXQgbWV0aG9kXG5cblx0XHRjb25zdCBmbkdldFVzZXIgPSBPYmplY3RQYXRoLmdldChcInNhcC51c2hlbGwuQ29udGFpbmVyLmdldFVzZXJcIik7XG5cdFx0Ly92YXIgb01hbmlmZXN0ID0gdGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC51aVwiKTtcblx0XHQvL3ZhciBzQm9va21hcmtJY29uID0gKG9NYW5pZmVzdCAmJiBvTWFuaWZlc3QuaWNvbnMgJiYgb01hbmlmZXN0Lmljb25zLmljb24pIHx8IFwiXCI7XG5cblx0XHQvL3NoYXJlTW9kZWw6IEhvbGRzIGFsbCB0aGUgc2hhcmluZyByZWxldmFudCBpbmZvcm1hdGlvbiBhbmQgaW5mbyB1c2VkIGluIFhNTCB2aWV3XG5cdFx0Y29uc3Qgb1NoYXJlSW5mbyA9IHtcblx0XHRcdGJvb2ttYXJrVGl0bGU6IGRvY3VtZW50LnRpdGxlLCAvL1RvIG5hbWUgdGhlIGJvb2ttYXJrIGFjY29yZGluZyB0byB0aGUgYXBwIHRpdGxlLlxuXHRcdFx0Ym9va21hcmtDdXN0b21Vcmw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgc0hhc2ggPSBoYXNoZXIuZ2V0SGFzaCgpO1xuXHRcdFx0XHRyZXR1cm4gc0hhc2ggPyBcIiNcIiArIHNIYXNoIDogd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHR9LFxuXHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0VG8gYmUgYWN0aXZhdGVkIG9uY2UgdGhlIEZMUCBzaG93cyB0aGUgY291bnQgLSBzZWUgY29tbWVudCBhYm92ZVxuXHRcdFx0XHRcdFx0XHRib29rbWFya1NlcnZpY2VVcmw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vdmFyIG9UYWJsZSA9IG9UYWJsZS5nZXRJbm5lclRhYmxlKCk7IG9UYWJsZSBpcyBhbHJlYWR5IHRoZSBzYXAuZmUgdGFibGUgKGJ1dCBub3QgdGhlIGlubmVyIG9uZSlcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgdXNlIHRhYmxlLmdldExpc3RCaW5kaW5nSW5mbyBpbnN0ZWFkIG9mIHRoZSBiaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0dmFyIG9CaW5kaW5nID0gb1RhYmxlLmdldEJpbmRpbmcoXCJyb3dzXCIpIHx8IG9UYWJsZS5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gZm5HZXREb3dubG9hZFVybChvQmluZGluZykgOiBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9LCovXG5cdFx0XHRpc1NoYXJlSW5KYW1BY3RpdmU6ICEhZm5HZXRVc2VyICYmIGZuR2V0VXNlcigpLmlzSmFtQWN0aXZlKClcblx0XHR9O1xuXG5cdFx0Y29uc3Qgb1RlbXBsYXRlUHJpdmF0ZU1vZGVsID0gdGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiX3RlbXBsUHJpdlwiKSBhcyBKU09OTW9kZWw7XG5cdFx0b1RlbXBsYXRlUHJpdmF0ZU1vZGVsLnNldFByb3BlcnR5KFwiL2xpc3RSZXBvcnQvc2hhcmVcIiwgb1NoYXJlSW5mbyk7XG5cdH1cblxuXHQvKipcblx0ICogSGlkZGVuIHRhYmxlcyBtdXN0IGJlIG1hcmtlZCBhcyBoaWRkZW4gdG8gYXZvaWQgc2VuZGluZ1xuXHQgKiByZXF1ZXN0cyB3aGVuIEZpbHRlckJhciBpcyBjaGFuZ2VkIG9yIExSIGlzIGluaXRpYWxpemVkXG5cdCAqIEJlc3Qgd29ya2Zsb3cgd291bGQgYmUgdG8gc3VzcGVuZCB0YWJsZSBiaW5kaW5nIGJ1dFxuXHQgKiBpZiB0aGUgdXNlciBzd2l0Y2ggcXVpY2tseSBiZXR3ZWVuIHRhYnMgdGhlIGJhdGNoIHJlc3BvbnNlIG9mIHByZXZpb3VzXG5cdCAqIGlzIHJlY2VpdmVkIHdoZW4gcHJldmlvdXMgdGFiIGlzIGFscmVhZHkgZGlzYWJsZWQgKGJpbmRpbmcgaXMgc3VzcGVuZGVkKSBhbmRcblx0ICogZ2VuZXJhdGVzIGVycm9yLlxuXHQgKiBBIHRlbXBvcmFyeSBzb2x1dGlvbiAoaWYgd2UgZmluZCBiZXR0ZXIgd29ya2Zsb3cpIGlzIHRvIHNldCBhIGN1c3RvbURhdGEgYW5kIGRvbid0IHRyaWdnZXJcblx0ICogcmViaW5kVGFibGUgaWYgdGhpcyBjdXN0b21EYXRhIGlzIHNldCB0byB0cnVlLlxuXHQgKi9cblx0X3VwZGF0ZU11bHRpQ29udHJvbEhpZGRlblN0YXR1cygpIHtcblx0XHRjb25zdCBvRGlzcGxheWVkQ29udHJvbCA9IHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCk7XG5cdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkgJiYgb0Rpc3BsYXllZENvbnRyb2wpIHtcblx0XHRcdGNvbnN0IHNEaXNwbGF5Q29udHJvbElkID0gb0Rpc3BsYXllZENvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFDb250cm9scyA9IHRoaXMuX2dldENvbnRyb2xzKCk7XG5cdFx0XHRhQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRjb25zdCBzQ29udHJvbElkID0gb0NvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdFx0b0NvbnRyb2wuZGF0YShcImNvbnRyb2xIaWRkZW5cIiwgc0NvbnRyb2xJZCAhPT0gc0Rpc3BsYXlDb250cm9sSWQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byB1cGRhdGUgdGhlIGxvY2FsIFVJIG1vZGVsIG9mIHRoZSBwYWdlIHdpdGggdGhlIGZpZWxkcyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSB0byB0aGUgZmlsdGVyIGJhciAodGhpcyBpcyBzcGVjaWZpYyB0byB0aGUgbXVsdGlwbGUgdGFibGUgc2NlbmFyaW8pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5jb250ZXh0fSBvSW50ZXJuYWxNb2RlbENvbnRleHQgVGhlIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0ICogQHBhcmFtIHtzYXAudWkubWRjLkZpbHRlckJhcn0gb0ZpbHRlckJhciBNREMgZmlsdGVyIGJhclxuXHQgKi9cblx0X3VwZGF0ZU11bHRpVGFiTm90QXBwbGljYWJsZUZpZWxkcyhvSW50ZXJuYWxNb2RlbENvbnRleHQ6IGFueSwgb0ZpbHRlckJhcjogYW55KSB7XG5cdFx0Y29uc3QgbUNhY2hlOiBhbnkgPSB7fTtcblx0XHRjb25zdCBpZ25vcmVkRmllbGRzOiBhbnkgPSB7fSxcblx0XHRcdGlnbm9yZWRGaWVsZHNUaXRsZTogYW55ID0ge30sXG5cdFx0XHRhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKSxcblx0XHRcdGFDaGFydHMgPSB0aGlzLl9nZXRDb250cm9scyhcIkNoYXJ0XCIpO1xuXHRcdGFUYWJsZXMuZm9yRWFjaCgob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IHNUYWJsZUVudGl0eVBhdGggPSBvVGFibGUuZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpLFxuXHRcdFx0XHRzVGFibGVFbnRpdHlTZXQgPSBzVGFibGVFbnRpdHlQYXRoLnNsaWNlKDEpLFxuXHRcdFx0XHRzVGFiSWQgPSBvVGFibGUuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0S2V5KCksXG5cdFx0XHRcdHNUYWJUaXRsZSA9IG9UYWJsZS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRUZXh0KCksXG5cdFx0XHRcdHNDYWNoZUtleSA9IHNUYWJsZUVudGl0eVNldCArIChvVGFibGUuZGF0YShcImVuYWJsZUFuYWx5dGljc1wiKSA9PT0gXCJ0cnVlXCIgPyBcIkFuYWx5dGljYWxcIiA6IFwiUmVndWxhclwiKTtcblx0XHRcdGlmICghbUNhY2hlW3NDYWNoZUtleV0pIHtcblx0XHRcdFx0bUNhY2hlW3NDYWNoZUtleV0gPSBGaWx0ZXJVdGlscy5nZXROb3RBcHBsaWNhYmxlRmlsdGVycyhvRmlsdGVyQmFyLCBvVGFibGUpO1xuXHRcdFx0fVxuXHRcdFx0aWdub3JlZEZpZWxkc1tzVGFiSWRdID0gbUNhY2hlW3NDYWNoZUtleV07XG5cdFx0XHRpZ25vcmVkRmllbGRzVGl0bGVbc1RhYklkXSA9IHRoaXMuZm9ybWF0dGVycy5zZXRUYWJNZXNzYWdlU3RyaXAuY2FsbCh0aGlzLCBtQ2FjaGVbc0NhY2hlS2V5XSwgc1RhYlRpdGxlLCBcImZhbHNlXCIsIHt9KTtcblx0XHR9KTtcblx0XHRhQ2hhcnRzLmZvckVhY2goKG9DaGFydDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzQ2hhcnRFbnRpdHlQYXRoID0gb0NoYXJ0LmRhdGEoXCJ0YXJnZXRDb2xsZWN0aW9uUGF0aFwiKSxcblx0XHRcdFx0c0NoYXJ0RW50aXR5U2V0ID0gc0NoYXJ0RW50aXR5UGF0aC5zbGljZSgxKSxcblx0XHRcdFx0c1RhYklkID0gb0NoYXJ0LmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldEtleSgpLFxuXHRcdFx0XHRzVGFiVGl0bGUgPSBvQ2hhcnQuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0VGV4dCgpLFxuXHRcdFx0XHRzQ2FjaGVLZXkgPSBzQ2hhcnRFbnRpdHlTZXQgKyBcIkNoYXJ0XCI7XG5cdFx0XHRpZiAoIW1DYWNoZVtzQ2FjaGVLZXldKSB7XG5cdFx0XHRcdG1DYWNoZVtzQ2FjaGVLZXldID0gRmlsdGVyVXRpbHMuZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMob0ZpbHRlckJhciwgb0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGlnbm9yZWRGaWVsZHNbc1RhYklkXSA9IG1DYWNoZVtzQ2FjaGVLZXldO1xuXHRcdFx0aWdub3JlZEZpZWxkc1RpdGxlW3NUYWJJZF0gPSB0aGlzLmZvcm1hdHRlcnMuc2V0VGFiTWVzc2FnZVN0cmlwLmNhbGwodGhpcywgbUNhY2hlW3NDYWNoZUtleV0sIHNUYWJUaXRsZSwgXCJmYWxzZVwiLCB7fSk7XG5cdFx0fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidGFicy9pZ25vcmVkRmllbGRzXCIsIGlnbm9yZWRGaWVsZHMpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInRhYnMvaWdub3JlZEZpZWxkc1RpdGxlXCIsIGlnbm9yZWRGaWVsZHNUaXRsZSk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHVwZGF0ZSB0aGUgbG9jYWwgVUkgbW9kZWwgb2YgdGhlIHBhZ2Ugd2l0aCB0aGUgZmllbGRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIHRoZSBmaWx0ZXIgYmFyICh0aGlzIGlzIHNwZWNpZmljIHRvIHRoZSBBTFAgc2NlbmFyaW8pLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5jb250ZXh0fSBvSW50ZXJuYWxNb2RlbENvbnRleHQgVGhlIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0ICogQHBhcmFtIHtzYXAudWkubWRjLkZpbHRlckJhcn0gb0ZpbHRlckJhciBNREMgZmlsdGVyIGJhclxuXHQgKi9cblx0X3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0OiBhbnksIG9GaWx0ZXJCYXI6IGFueSkge1xuXHRcdGNvbnN0IG1DYWNoZTogYW55ID0ge307XG5cdFx0Y29uc3QgaWdub3JlZEZpZWxkczogYW55ID0ge30sXG5cdFx0XHRhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKSxcblx0XHRcdGFDaGFydHMgPSB0aGlzLl9nZXRDb250cm9scyhcIkNoYXJ0XCIpO1xuXG5cdFx0aWYgKCFhVGFibGVzLmxlbmd0aCB8fCAhYUNoYXJ0cy5sZW5ndGgpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3Mgbm90IGEgdGFibGUgYW5kIGEgY2hhcnQsIHdlJ3JlIG5vdCBpbiB0aGUgQUxQIGNhc2Vcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGb3IgdGhlIG1vbWVudCwgdGhlcmUncyBub3RoaW5nIGZvciB0YWJsZXMuLi5cblx0XHRhQ2hhcnRzLmZvckVhY2goZnVuY3Rpb24gKG9DaGFydDogYW55KSB7XG5cdFx0XHRjb25zdCBzQ2hhcnRFbnRpdHlQYXRoID0gb0NoYXJ0LmRhdGEoXCJ0YXJnZXRDb2xsZWN0aW9uUGF0aFwiKSxcblx0XHRcdFx0c0NoYXJ0RW50aXR5U2V0ID0gc0NoYXJ0RW50aXR5UGF0aC5zbGljZSgxKSxcblx0XHRcdFx0c0NhY2hlS2V5ID0gc0NoYXJ0RW50aXR5U2V0ICsgXCJDaGFydFwiO1xuXHRcdFx0aWYgKCFtQ2FjaGVbc0NhY2hlS2V5XSkge1xuXHRcdFx0XHRtQ2FjaGVbc0NhY2hlS2V5XSA9IEZpbHRlclV0aWxzLmdldE5vdEFwcGxpY2FibGVGaWx0ZXJzKG9GaWx0ZXJCYXIsIG9DaGFydCk7XG5cdFx0XHR9XG5cdFx0XHRpZ25vcmVkRmllbGRzW3NDYWNoZUtleV0gPSBtQ2FjaGVbc0NhY2hlS2V5XTtcblx0XHR9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjb250cm9scy9pZ25vcmVkRmllbGRzXCIsIGlnbm9yZWRGaWVsZHMpO1xuXHR9XG5cblx0X3VwZGF0ZU11bHRpTW9kZVNlbGVjdGVkQ29udHJvbCgpIHtcblx0XHR0aGlzLl9zRW50aXR5U2V0ID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuX29MaXN0UmVwb3J0Q29udHJvbCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLl9nZXRDdXJyZW50Q29udHJvbCgpO1xuXHR9XG5cblx0X3VwZGF0ZUNvdW50cygpIHtcblx0XHR0aGlzLl91cGRhdGVNdWx0aU1vZGVDb3VudHMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIGEgdGFiIGZyb20gdGhlIGxpc3QgcmVwb3J0IGlzIGEgY3VzdG9tIHRhYi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pc0N1c3RvbVRhYlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gRGV0ZXJtaW5lcyBpZiB0aGUgdGFiIGlzIGEgY3VzdG9tIHRhYi5cblx0ICovXG5cdF9pc0N1c3RvbVRhYigpIHtcblx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRyZXR1cm4gb011bHRpTW9kZUNvbnRyb2wgJiYgb011bHRpTW9kZUNvbnRyb2wuZ2V0U2VsZWN0ZWRLZXkoKS5pbmRleE9mKFwiOjpDdXN0b21UYWI6OlwiKSA+IC0xO1xuXHR9XG5cblx0X3NldENvdW50c091dERhdGVkKCkge1xuXHRcdGNvbnN0IG9NdWx0aU1vZGVDb250cm9sID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdGlmIChvTXVsdGlNb2RlQ29udHJvbCAmJiBvTXVsdGlNb2RlQ29udHJvbC5kYXRhKFwic2hvd0NvdW50c1wiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdGNvbnN0IGFJdGVtcyA9IG9NdWx0aU1vZGVDb250cm9sLmdldEl0ZW1zKCk7XG5cdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRpZiAob0l0ZW0uZ2V0S2V5KCkuaW5kZXhPZihcImZlOjpDaGFydFwiKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRvSXRlbS5kYXRhKFwib3V0ZGF0ZWRDb3VudHNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF91cGRhdGVNdWx0aU1vZGVDb3VudHMoKSB7XG5cdFx0bGV0IGFCaW5kaW5nUHJvbWlzZXMgPSBbXTtcblx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRpZiAob011bHRpTW9kZUNvbnRyb2wgJiYgb011bHRpTW9kZUNvbnRyb2wuZGF0YShcInNob3dDb3VudHNcIikgPT09IFwidHJ1ZVwiICYmICF0aGlzLl9pc0N1c3RvbVRhYigpKSB7XG5cdFx0XHRjb25zdCBvRGlzcGxheWVkQ29udHJvbCA9IHRoaXMuX2dldEN1cnJlbnRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBzRGlzcGxheWVkQ29udHJvbElkID0gb0Rpc3BsYXllZENvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFDb21wbGlhbnRUYWJzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgYUl0ZW1zID0gb011bHRpTW9kZUNvbnRyb2wuZ2V0SXRlbXMoKTtcblx0XHRcdGFJdGVtcy5mb3JFYWNoKChvSXRlbTogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChvSXRlbS5nZXRLZXkoKSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvQ29udHJvbCAmJlxuXHRcdFx0XHRcdCFvQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLkNoYXJ0XCIpICYmXG5cdFx0XHRcdFx0KG9JdGVtLmRhdGEoXCJvdXRkYXRlZENvdW50c1wiKSB8fCBvQ29udHJvbC5nZXRJZCgpID09PSBzRGlzcGxheWVkQ29udHJvbElkKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRhQ29tcGxpYW50VGFicy5wdXNoKHtcblx0XHRcdFx0XHRcdGNvbnRyb2w6IG9Db250cm9sLFxuXHRcdFx0XHRcdFx0aXRlbTogb0l0ZW1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGFCaW5kaW5nUHJvbWlzZXMgPSBhQ29tcGxpYW50VGFicy5tYXAoKG1UYWI6IGFueSkgPT4ge1xuXHRcdFx0XHRtVGFiLml0ZW0uc2V0Q291bnQoXCIuLi5cIik7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gbVRhYi5jb250cm9sO1xuXHRcdFx0XHRjb25zdCBvRmlsdGVySW5mb3MgPSBUYWJsZVV0aWxzLmdldEZpbHRlcnNJbmZvRm9yU1Yob0NvbnRyb2wsIG1UYWIuaXRlbS5kYXRhKFwic2VsZWN0aW9uVmFyaWFudFwiKSkgYXMgYW55O1xuXHRcdFx0XHRyZXR1cm4gVGFibGVVdGlscy5nZXRMaXN0QmluZGluZ0ZvckNvdW50KG9Db250cm9sLCB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLCB7XG5cdFx0XHRcdFx0YmF0Y2hHcm91cElkOiBvQ29udHJvbC5nZXRJZCgpID09PSBzRGlzcGxheWVkQ29udHJvbElkID8gb0NvbnRyb2wuZGF0YShcImJhdGNoR3JvdXBJZFwiKSA6IFwiJGF1dG9cIixcblx0XHRcdFx0XHRhZGRpdGlvbmFsRmlsdGVyczogb0ZpbHRlckluZm9zLmZpbHRlcnNcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0UHJvbWlzZS5hbGwoYUJpbmRpbmdQcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFDb3VudHM6IGFueVtdKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBrIGluIGFDb3VudHMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9JdGVtID0gYUNvbXBsaWFudFRhYnNba10uaXRlbTtcblx0XHRcdFx0XHRcdG9JdGVtLnNldENvdW50KFRhYmxlVXRpbHMuZ2V0Q291bnRGb3JtYXR0ZWQoYUNvdW50c1trXSkpO1xuXHRcdFx0XHRcdFx0b0l0ZW0uZGF0YShcIm91dGRhdGVkQ291bnRzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSBpY29uIHRhYiBiYXJcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X2lzRmlsdGVyQmFySGlkZGVuKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmhpZGVGaWx0ZXJCYXI7XG5cdH1cblxuXHRfc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2gob1ZNOiBhbnkpIHtcblx0XHRpZiAoXG5cdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmluaXRpYWxMb2FkID09PSBJbml0aWFsTG9hZE1vZGUuQXV0byAmJlxuXHRcdFx0KCFvVk0gfHwgb1ZNLmdldFN0YW5kYXJkVmFyaWFudEtleSgpID09PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhcikge1xuXHRcdFx0XHRjb25zdCBvQ29uZGl0aW9ucyA9IG9GaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb0NvbmRpdGlvbnMpIHtcblx0XHRcdFx0XHQvLyBpZ25vcmUgZmlsdGVycyBzdGFydGluZyB3aXRoICQgKGUuZy4gJHNlYXJjaCwgJGVkaXRTdGF0ZSlcblx0XHRcdFx0XHRpZiAoIXNLZXkuc3RhcnRzV2l0aChcIiRcIikgJiYgQXJyYXkuaXNBcnJheShvQ29uZGl0aW9uc1tzS2V5XSkgJiYgb0NvbmRpdGlvbnNbc0tleV0ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvLyBsb2FkIGRhdGEgYXMgcGVyIHVzZXIncyBzZXR0aW5nIG9mIGFwcGx5QXV0b21hdGljYWxseSBvbiB0aGUgdmFyaWFudFxuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhbmRhcmRWYXJpYW50OiBhbnkgPSBvVk0uZ2V0VmFyaWFudHMoKS5maW5kKCh2YXJpYW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhcmlhbnQua2V5ID09PSBvVk0uZ2V0Q3VycmVudFZhcmlhbnRLZXkoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHN0YW5kYXJkVmFyaWFudCAmJiBzdGFuZGFyZFZhcmlhbnQuZXhlY3V0ZU9uU2VsZWN0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRfdXBkYXRlVGFibGUob1RhYmxlOiBhbnkpIHtcblx0XHRpZiAoIW9UYWJsZS5pc1RhYmxlQm91bmQoKSB8fCB0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMpIHtcblx0XHRcdG9UYWJsZS5yZWJpbmQoKTtcblx0XHRcdHRoaXMuaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdF91cGRhdGVDaGFydChvQ2hhcnQ6IGFueSkge1xuXHRcdGNvbnN0IG9Jbm5lckNoYXJ0ID0gb0NoYXJ0LmdldENvbnRyb2xEZWxlZ2F0ZSgpLl9nZXRDaGFydChvQ2hhcnQpO1xuXHRcdGlmICghKG9Jbm5lckNoYXJ0ICYmIG9Jbm5lckNoYXJ0LmlzQm91bmQoXCJkYXRhXCIpKSB8fCB0aGlzLmhhc1BlbmRpbmdUYWJsZUNoYW5nZXMpIHtcblx0XHRcdG9DaGFydC5nZXRDb250cm9sRGVsZWdhdGUoKS5yZWJpbmQob0NoYXJ0LCBvSW5uZXJDaGFydC5nZXRCaW5kaW5nSW5mbyhcImRhdGFcIikpO1xuXHRcdFx0dGhpcy5oYXNQZW5kaW5nVGFibGVDaGFuZ2VzID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlcnMgPSB7XG5cdFx0b25UYWJNdWx0aU1vZGVDaGFuZ2UodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHR0aGlzLl91cGRhdGVNdWx0aU1vZGVTZWxlY3RlZENvbnRyb2woKTtcblx0XHRcdHRoaXMuX3VwZGF0ZU11bHRpQ29udHJvbEhpZGRlblN0YXR1cygpO1xuXG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdGNvbnN0IG9EaXNwbGF5ZWRDb250cm9sID0gdGhpcy5fZ2V0Q3VycmVudENvbnRyb2woKSBhcyBhbnk7XG5cdFx0XHRjb25zdCBvTXVsdGlNb2RlQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKTtcblx0XHRcdGNvbnN0IHNTZWxlY3RlZEtleSA9IG9NdWx0aU1vZGVDb250cm9sLmdldFNlbGVjdGVkS2V5KCk7XG5cdFx0XHRjb25zdCBzUHJldmlvdXNTZWxlY3RlZEtleSA9IG9FdmVudCAmJiBvRXZlbnQubVBhcmFtZXRlcnMgPyBvRXZlbnQubVBhcmFtZXRlcnMucHJldmlvdXNLZXkgOiB1bmRlZmluZWQ7XG5cblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInRhYnMvc2VsZWN0ZWRcIiwgc1NlbGVjdGVkS2V5KTtcblx0XHRcdGlmIChvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiKSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHQvLyBObyBwZW5kaW5nIGZpbHRlcnMgaW50byBGaWx0ZXJCYXJcblx0XHRcdFx0aWYgKG9GaWx0ZXJCYXIgJiYgdGhpcy5faXNDdXN0b21UYWIoKSkge1xuXHRcdFx0XHRcdGNvbnN0IG9GaWx0ZXJDb25kaXRpb25zID0gb0ZpbHRlckJhci5nZXRGaWx0ZXJDb25kaXRpb25zKCk7XG5cdFx0XHRcdFx0dGhpcy5vblZpZXdOZWVkc1JlZnJlc2goe1xuXHRcdFx0XHRcdFx0ZmlsdGVyQ29uZGl0aW9uczogb0ZpbHRlckNvbmRpdGlvbnMsXG5cdFx0XHRcdFx0XHRjdXJyZW50VGFiSWQ6IHNTZWxlY3RlZEtleSxcblx0XHRcdFx0XHRcdHJlZnJlc2hDYXVzZTogXCJ0YWJDaGFuZ2VkXCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHQhb0Rpc3BsYXllZENvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSAmJlxuXHRcdFx0XHRcdCghb0Rpc3BsYXllZENvbnRyb2wuZ2V0Um93QmluZGluZygpIHx8IC8vIGZpcnN0IHRpbWUgdGhlIHRhYi90YWJsZSBpcyBkaXNwbGF5ZWRcblx0XHRcdFx0XHRcdG9EaXNwbGF5ZWRDb250cm9sLmRhdGEoXCJvdXRkYXRlZFJvd3NcIikgPT09IHRydWUpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIFNlYXJjaCBoYXMgYmVlbiB0cmlnZ2VyZWQgb24gYSBkaWZmZXJlbnQgdGFiIHt9XG5cdFx0XHRcdFx0b0Rpc3BsYXllZENvbnRyb2wucmViaW5kKCk7XG5cdFx0XHRcdFx0b0Rpc3BsYXllZENvbnRyb2wuZGF0YShcIm91dGRhdGVkUm93c1wiLCBmYWxzZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0b0Rpc3BsYXllZENvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSAmJlxuXHRcdFx0XHRcdCghb0Rpc3BsYXllZENvbnRyb2wuZ2V0Q29udHJvbERlbGVnYXRlKCkuX2dldENoYXJ0KG9EaXNwbGF5ZWRDb250cm9sKS5nZXRCaW5kaW5nKFwiZGF0YVwiKSB8fCAvLyBmaXJzdCB0aW1lIHRoZSB0YWIvY2hhcnQgaXMgZGlzcGxheWVkXG5cdFx0XHRcdFx0XHRvRGlzcGxheWVkQ29udHJvbC5kYXRhKFwib3V0ZGF0ZWRSb3dzXCIpID09PSB0cnVlKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCBvSW5uZXJDaGFydCA9IG9EaXNwbGF5ZWRDb250cm9sLmdldENvbnRyb2xEZWxlZ2F0ZSgpLl9nZXRDaGFydChvRGlzcGxheWVkQ29udHJvbCk7XG5cdFx0XHRcdFx0b0Rpc3BsYXllZENvbnRyb2wuZ2V0Q29udHJvbERlbGVnYXRlKCkucmViaW5kKG9EaXNwbGF5ZWRDb250cm9sLCBvSW5uZXJDaGFydC5nZXRCaW5kaW5nSW5mbyhcImRhdGFcIikpO1xuXHRcdFx0XHRcdG9EaXNwbGF5ZWRDb250cm9sLmRhdGEoXCJvdXRkYXRlZFJvd3NcIiwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRXZlbnQgJiYgb0V2ZW50Lm1QYXJhbWV0ZXJzICYmIHNQcmV2aW91c1NlbGVjdGVkS2V5ICE9PSBvRXZlbnQubVBhcmFtZXRlcnMuc2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0Q29udHJvbFBlcnNvbmFsaXphdGlvbldyaXRlQVBJLmFkZCh7XG5cdFx0XHRcdFx0Y2hhbmdlczogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VTcGVjaWZpY0RhdGE6IHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VUeXBlOiBcInNlbGVjdEljb25UYWJCYXJGaWx0ZXJcIixcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzZWxlY3RlZEtleTogc1NlbGVjdGVkS2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJldmlvdXNTZWxlY3RlZEtleTogc1ByZXZpb3VzU2VsZWN0ZWRLZXlcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHNlbGVjdG9yRWxlbWVudDogb011bHRpTW9kZUNvbnRyb2xcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25GaWx0ZXJzQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhcikge1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0XHQvLyBQZW5kaW5nIGZpbHRlcnMgaW50byBGaWx0ZXJCYXIgdG8gYmUgdXNlZCBmb3IgY3VzdG9tIHZpZXdzXG5cdFx0XHRcdHRoaXMub25QZW5kaW5nRmlsdGVycygpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhcHBsaWVkRmlsdGVyc1wiLCBvRmlsdGVyQmFyLmdldEFzc2lnbmVkRmlsdGVyc1RleHQoKS5maWx0ZXJzVGV4dCk7XG5cdFx0XHRcdGlmIChvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29uZGl0aW9uc0Jhc2VkXCIpKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVmFyaWFudFNlbGVjdGVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1ZNID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0Ly8gc2V0VGltZW91dCBjYXVzZSB0aGUgdmFyaWFudCBuZWVkcyB0byBiZSBhcHBsaWVkIGJlZm9yZSBqdWRnaW5nIHRoZSBhdXRvIHNlYXJjaCBvciB1cGRhdGluZyB0aGUgYXBwIHN0YXRlXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdFx0XHQodGhpcy5oYW5kbGVycyBhcyBhbnkpLm9uVGFiTXVsdGlNb2RlQ2hhbmdlLmFwcGx5KHRoaXMsIFtvRXZlbnRdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5fc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2gob1ZNKSkge1xuXHRcdFx0XHRcdC8vIHRoZSBhcHAgc3RhdGUgd2lsbCBiZSB1cGRhdGVkIHZpYSBvblNlYXJjaCBoYW5kbGVyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS50cmlnZ2VyU2VhcmNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAwKTtcblx0XHR9LFxuXHRcdG9uVmFyaWFudFNhdmVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlISEhXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgMTAwMCk7XG5cdFx0fSxcblx0XHRvblNlYXJjaCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvTWRjQ2hhcnQgPSB0aGlzLmdldENoYXJ0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgYkhpZGVEcmFmdCA9IEZpbHRlclV0aWxzLmdldEVkaXRTdGF0ZUlzSGlkZURyYWZ0KG9GaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIGZhbHNlKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhpZGVEcmFmdEluZm9cIiwgYkhpZGVEcmFmdCk7XG5cdFx0XHRpZiAodGhpcy5faXNNdWx0aU1vZGUoKSkge1xuXHRcdFx0XHRjb25zdCBhQ29udHJvbHMgPSB0aGlzLl9nZXRDb250cm9scygpLFxuXHRcdFx0XHRcdG9NdWx0aU1vZGVDb250cm9sID0gdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpO1xuXHRcdFx0XHR0aGlzLl9zZXRDb3VudHNPdXREYXRlZCgpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzQ3VzdG9tVGFiKCkpIHtcblx0XHRcdFx0XHRjb25zdCBzRGlzcGxheWVkQ29udHJvbElkID0gdGhpcy5fZ2V0Q3VycmVudENvbnRyb2woKS5nZXRJZCgpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZU11bHRpVGFiTm90QXBwbGljYWJsZUZpZWxkcyhvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9GaWx0ZXJCYXIpO1xuXHRcdFx0XHRcdC8vIFRoaXMgc2hvdWxkIGJlIGRvbmUgb3V0c2lkZSB0aGUgc2VhcmNoIGV2ZW50IGhhbmRsZXIgb2YgdGhlIGZpbHRlciBiYXIuXG5cdFx0XHRcdFx0Ly8gVGhlIHNhbWUgbG9naWMgaXMgcmVxdWlyZWQgd2hlbiBmaWx0ZXIgYmFyIGlzIGhpZGRlbiBhbmQgbXVsdGlwbGUgdGFibGVzIGV4aXN0IG9uIHRoZSBMUi5cblx0XHRcdFx0XHQvLyBUaGlzIGlzIGN1cnJlbnRseSBkb25lIGluIExpc3RSZXBvcnQvb3ZlcnJpZGVzL1ZpZXdTdGF0ZS5qcyNvbkFmdGVyU3RhdGVBcHBsaWVkKClcblx0XHRcdFx0XHRhQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdFx0b0NvbnRyb2wuZGF0YShcIm91dGRhdGVkUm93c1wiLCBvQ29udHJvbC5nZXRJZCgpICE9PSBzRGlzcGxheWVkQ29udHJvbElkKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvRmlsdGVyQ29uZGl0aW9ucyA9IG9GaWx0ZXJCYXIuZ2V0RmlsdGVyQ29uZGl0aW9ucygpO1xuXHRcdFx0XHRcdHRoaXMub25WaWV3TmVlZHNSZWZyZXNoKHtcblx0XHRcdFx0XHRcdGZpbHRlckNvbmRpdGlvbnM6IG9GaWx0ZXJDb25kaXRpb25zLFxuXHRcdFx0XHRcdFx0Y3VycmVudFRhYklkOiBvTXVsdGlNb2RlQ29udHJvbC5nZXRTZWxlY3RlZEtleSgpLFxuXHRcdFx0XHRcdFx0cmVmcmVzaENhdXNlOiBcInNlYXJjaFwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyKTtcblx0XHRcdH1cblx0XHRcdGlmIChvTWRjQ2hhcnQpIHtcblx0XHRcdFx0Ly8gZGlzYWJsZSBib3VuZCBhY3Rpb25zIFRPRE86IHRoaXMgY2xlYXJzIGV2ZXJ5dGhpbmcgZm9yIHRoZSBjaGFydD9cblx0XHRcdFx0KG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcIlwiLCB7fSk7XG5cblx0XHRcdFx0Y29uc3Qgb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0Y29uc3Qgc1RlbXBsYXRlQ29udGVudFZpZXcgPSBvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KG9QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpICsgXCIvYWxwQ29udGVudFZpZXdcIik7XG5cdFx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydCkge1xuXHRcdFx0XHRcdHRoaXMuaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3LlRhYmxlKSB7XG5cdFx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nVGFibGVDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gc3RvcmUgZmlsdGVyIGJhciBjb25kaXRpb25zIHRvIHVzZSBsYXRlciB3aGlsZSBuYXZpZ2F0aW9uXG5cdFx0XHRTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIpXG5cdFx0XHRcdC50aGVuKChvRXh0ZXJuYWxTdGF0ZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5maWx0ZXJCYXJDb25kaXRpb25zID0gb0V4dGVybmFsU3RhdGUuZmlsdGVyO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgZXh0ZXJuYWwgc3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRpZiAoKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5saXZlTW9kZSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3lzdGVtLnBob25lKSB7XG5cdFx0XHRcdGNvbnN0IG9EeW5hbWljUGFnZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6TGlzdFJlcG9ydFwiKSBhcyBEeW5hbWljUGFnZTtcblx0XHRcdFx0b0R5bmFtaWNQYWdlLnNldEhlYWRlckV4cGFuZGVkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzT3V0Ym91bmRUYXJnZXQgTmFtZSBvZiB0aGUgb3V0Ym91bmQgdGFyZ2V0IChuZWVkcyB0byBiZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdClcblx0XHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ3JlYXRlUGF0aCBDcmVhdGUgcGF0aCB3aGVuIHRoZSBjaGV2cm9uIGlzIGNyZWF0ZWQuXG5cdFx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXI6IExpc3RSZXBvcnRDb250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZywgb0NvbnRleHQ6IGFueSwgc0NyZWF0ZVBhdGg6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblx0XHRvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9NZGNDaGFydCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZW50KCksXG5cdFx0XHRcdG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCksXG5cdFx0XHRcdGFEYXRhID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImRhdGFcIiksXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoYURhdGEpIHtcblx0XHRcdFx0Ly8gdXBkYXRlIGFjdGlvbiBidXR0b25zIGVuYWJsZW1lbnQgLyBkaXNhYmxlbWVudFxuXHRcdFx0XHRDaGFydFJ1bnRpbWUuZm5VcGRhdGVDaGFydChvRXZlbnQpO1xuXHRcdFx0XHQvLyB1cGRhdGUgc2VsZWN0aW9ucyBvbiBzZWxlY3Rpb24gb3IgZGVzZWxlY3Rpb25cblx0XHRcdFx0Q2hhcnRVdGlscy5zZXRDaGFydEZpbHRlcnMob01kY0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9hbHBDb250ZW50Vmlld1wiKTtcblx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydCkge1xuXHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1RhYmxlICYmIChvVGFibGUgYXMgYW55KS5yZWJpbmQoKTtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblNlZ21lbnRlZEJ1dHRvblByZXNzZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBzU2VsZWN0ZWRLZXkgPSBvRXZlbnQubVBhcmFtZXRlcnMua2V5ID8gb0V2ZW50Lm1QYXJhbWV0ZXJzLmtleSA6IG51bGw7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgc1NlbGVjdGVkS2V5KTtcblx0XHRcdGNvbnN0IG9DaGFydCA9IHRoaXMuX2dldENoYXJ0KCk7XG5cdFx0XHRjb25zdCBvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgb1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlID0ge1xuXHRcdFx0XHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9TZWdtZW50ZWRCdXR0b24uZ2V0SXRlbXMoKTtcblx0XHRcdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpID09PSBzU2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0b0l0ZW0uZm9jdXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLnJlbW92ZUV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9TZWdtZW50ZWRCdXR0b24gPSAoXG5cdFx0XHRcdHNTZWxlY3RlZEtleSA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSA/IHRoaXMuX2dldFNlZ21lbnRlZEJ1dHRvbihcIlRhYmxlXCIpIDogdGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uKFwiQ2hhcnRcIilcblx0XHRcdCkgYXMgU2VnbWVudGVkQnV0dG9uO1xuXHRcdFx0aWYgKG9TZWdtZW50ZWRCdXR0b24gIT09IG9FdmVudC5nZXRTb3VyY2UoKSkge1xuXHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLmFkZEV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAoc1NlbGVjdGVkS2V5KSB7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ6XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ2hhcnQob0NoYXJ0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZDpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUNoYXJ0KG9DaGFydCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkZpbHRlcnNTZWdtZW50ZWRCdXR0b25QcmVzc2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0aWYgKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJrZXlcIikgPT09IFwiQ29tcGFjdFwiKSB7XG5cdFx0XHRcdHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLmdldFZpZXcoKS5nZXRDb250ZW50KClbMF0uZGF0YShcInZpc3VhbEZpbHRlckJhcklkXCIpKSBhcyBDb250cm9sKS5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdLmRhdGEoXCJ2aXN1YWxGaWx0ZXJCYXJJZFwiKSkgYXMgQ29udHJvbCkuc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uU3RhdGVDaGFuZ2UodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9XG5cdH07XG5cdGZvcm1hdHRlcnMgPSB7XG5cdFx0LyoqXG5cdFx0ICogTWV0aG9kIHRvIHNldCB0aGUgbWVzc2FnZSB0ZXh0IGZvciB0aGUgbXVsdGlwbGUgZW50aXR5IHNldHMgd2hlbiBmaWVsZHMgaW4gdGhlIEZpbHRlckJhciBuZWVkIHRvIGJlIGlnbm9yZWQuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gdGhpc1xuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFJZ25vcmVkRmllbGRzIEFycmF5IG9mIGlnbm9yZWQgZmllbGRzIGluIHRoZSBGaWx0ZXJCYXIgZm9yIHRoZSBjdXJyZW50IHRhYiAobXVsdGlwbGUgZW50aXR5IHNldHMpXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYWJUaXRsZSBUYWIgdGl0bGVcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJJc0NoYXJ0IEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY29udHJvbCBpcyBhIGNoYXJ0IG9yIG5vdFxuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBvQXBwbHlTdXBwb3J0ZWQgQXBwbHlTdXBwb3J0ZWQgZm9yIHRoZSBjb250cm9sXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZSB0ZXh0XG5cdFx0ICovXG5cdFx0c2V0VGFiTWVzc2FnZVN0cmlwKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBhSWdub3JlZEZpZWxkczogYW55W10sIHNUYWJUaXRsZTogc3RyaW5nLCBiSXNDaGFydD86IGFueSwgb0FwcGx5U3VwcG9ydGVkPzogYW55KSB7XG5cdFx0XHRsZXQgc1RleHQgPSBcIlwiO1xuXHRcdFx0YklzQ2hhcnQgPSBiSXNDaGFydCA9PT0gXCJ0cnVlXCIgfHwgYklzQ2hhcnQgPT09IHRydWU7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0aWYgKG9GaWx0ZXJCYXIgJiYgQXJyYXkuaXNBcnJheShhSWdub3JlZEZpZWxkcykgJiYgYUlnbm9yZWRGaWVsZHMubGVuZ3RoID4gMCAmJiAoc1RhYlRpdGxlIHx8IGJJc0NoYXJ0KSkge1xuXHRcdFx0XHRjb25zdCBzRmlsdGVyQmFyRW50aXR5UGF0aCA9IG9GaWx0ZXJCYXIuZGF0YShcImVudGl0eVR5cGVcIiksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUudGVtcGxhdGVzXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdGFJZ25vcmVkTGFiZWxzID0gYUlnbm9yZWRGaWVsZHMubWFwKGZ1bmN0aW9uIChzUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9NYWNyb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUubWFjcm9zXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdFx0XHRcdFx0aWYgKHNQcm9wZXJ0eSA9PT0gXCIkc2VhcmNoXCIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NYWNyb1Jlc291cmNlQnVuZGxlID8gb01hY3JvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fRklMVEVSQkFSX1NFQVJDSFwiKSA6IFwiXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoc1Byb3BlcnR5ID09PSBcIiRlZGl0U3RhdGVcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01hY3JvUmVzb3VyY2VCdW5kbGUgPyBvTWFjcm9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9DT01NT05fRklMVEVSQkFSX0VESVRJTkdfU1RBVFVTXCIpIDogXCJcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IHNMYWJlbCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNGaWx0ZXJCYXJFbnRpdHlQYXRoICsgc1Byb3BlcnR5ICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCIpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIERlbGVnYXRlVXRpbC5nZXRMb2NhbGl6ZWRUZXh0KHNMYWJlbCwgb0ZpbHRlckJhcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IGJJc1NlYXJjaElnbm9yZWQgPSAhb0FwcGx5U3VwcG9ydGVkLmVuYWJsZVNlYXJjaDtcblx0XHRcdFx0aWYgKG9SZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHRcdHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0TWVzc2FnZVN0cmlwVGV4dChcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0YUlnbm9yZWRMYWJlbHMsXG5cdFx0XHRcdFx0XHRvRmlsdGVyQmFyLFxuXHRcdFx0XHRcdFx0YklzQ2hhcnQsXG5cdFx0XHRcdFx0XHRiSXNTZWFyY2hJZ25vcmVkLFxuXHRcdFx0XHRcdFx0c1RhYlRpdGxlLFxuXHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0RGVsZWdhdGVVdGlsLmdldExvY2FsaXplZFRleHRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1RleHQ7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBMaXN0UmVwb3J0Q29udHJvbGxlcjtcbiJdfQ==
|