@sapui5/sap.fe.templates 1.100.0 → 1.101.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 +123 -112
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +2 -1
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1111 -1081
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -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 +134 -137
- package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
- package/src/sap/fe/templates/ListReport/overrides/ViewState.js +443 -428
- package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -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/AnnotationHelper.js +478 -514
- package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
- 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 +3 -9
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1530 -1447
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -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/templating/ObjectPageTemplating.js +1 -1
- package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +18 -24
- package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -9
- package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +4 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +851 -817
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -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 +22 -0
- 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 +6 -2
- package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ca.properties +6 -2
- package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
- package/src/sap/fe/templates/messagebundle_cy.properties +6 -2
- package/src/sap/fe/templates/messagebundle_da.properties +6 -2
- package/src/sap/fe/templates/messagebundle_de.properties +6 -2
- package/src/sap/fe/templates/messagebundle_el.properties +6 -2
- package/src/sap/fe/templates/messagebundle_en.properties +6 -2
- package/src/sap/fe/templates/messagebundle_en_GB.properties +6 -2
- package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +6 -2
- package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +6 -2
- package/src/sap/fe/templates/messagebundle_es.properties +6 -2
- package/src/sap/fe/templates/messagebundle_es_MX.properties +6 -2
- package/src/sap/fe/templates/messagebundle_et.properties +6 -2
- package/src/sap/fe/templates/messagebundle_fi.properties +6 -2
- package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
- package/src/sap/fe/templates/messagebundle_fr_CA.properties +6 -2
- package/src/sap/fe/templates/messagebundle_hi.properties +6 -2
- package/src/sap/fe/templates/messagebundle_hr.properties +6 -2
- package/src/sap/fe/templates/messagebundle_hu.properties +6 -2
- package/src/sap/fe/templates/messagebundle_id.properties +6 -2
- package/src/sap/fe/templates/messagebundle_it.properties +6 -2
- package/src/sap/fe/templates/messagebundle_iw.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
- package/src/sap/fe/templates/messagebundle_kk.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ko.properties +6 -2
- package/src/sap/fe/templates/messagebundle_lt.properties +6 -2
- package/src/sap/fe/templates/messagebundle_lv.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ms.properties +6 -2
- package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
- package/src/sap/fe/templates/messagebundle_no.properties +6 -2
- package/src/sap/fe/templates/messagebundle_pl.properties +6 -2
- package/src/sap/fe/templates/messagebundle_pt.properties +6 -2
- package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ro.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ru.properties +6 -2
- package/src/sap/fe/templates/messagebundle_sh.properties +6 -2
- package/src/sap/fe/templates/messagebundle_sk.properties +6 -2
- package/src/sap/fe/templates/messagebundle_sl.properties +6 -2
- package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
- package/src/sap/fe/templates/messagebundle_th.properties +6 -2
- package/src/sap/fe/templates/messagebundle_tr.properties +6 -2
- package/src/sap/fe/templates/messagebundle_uk.properties +6 -2
- package/src/sap/fe/templates/messagebundle_vi.properties +6 -2
- package/src/sap/fe/templates/messagebundle_zh_CN.properties +6 -2
- package/src/sap/fe/templates/messagebundle_zh_TW.properties +6 -2
|
@@ -1,820 +1,854 @@
|
|
|
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
|
*/
|
|
6
|
-
sap.ui.define(
|
|
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
|
-
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/f/FlexibleColumnLayoutSemanticHelper", "sap/f/library", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/KeepAliveHelper", "sap/m/Link", "sap/m/MessageBox", "sap/m/MessagePage", "./RootContainerBaseController"], function (Log, FlexibleColumnLayoutSemanticHelper, fLibrary, ViewState, ClassSupport, KeepAliveHelper, Link, MessageBox, MessagePage, BaseController) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _dec, _dec2, _class, _class2, _descriptor;
|
|
9
|
+
|
|
10
|
+
var Icon = MessageBox.Icon;
|
|
11
|
+
var Action = MessageBox.Action;
|
|
12
|
+
var usingExtension = ClassSupport.usingExtension;
|
|
13
|
+
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
14
|
+
|
|
15
|
+
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 }); }
|
|
16
|
+
|
|
17
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
18
|
+
|
|
19
|
+
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
20
|
+
|
|
21
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
22
|
+
|
|
23
|
+
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; }
|
|
24
|
+
|
|
25
|
+
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.'); }
|
|
26
|
+
|
|
27
|
+
var LayoutType = fLibrary.LayoutType;
|
|
28
|
+
var CONSTANTS = {
|
|
29
|
+
page: {
|
|
30
|
+
names: ["BeginColumn", "MidColumn", "EndColumn"],
|
|
31
|
+
currentGetter: {
|
|
32
|
+
prefix: "getCurrent",
|
|
33
|
+
suffix: "Page"
|
|
34
|
+
},
|
|
35
|
+
getter: {
|
|
36
|
+
prefix: "get",
|
|
37
|
+
suffix: "Pages"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
var _getViewFromContainer = function (oContainer) {
|
|
43
|
+
if (oContainer.isA("sap.ui.core.ComponentContainer")) {
|
|
44
|
+
return oContainer.getComponentInstance().getRootControl();
|
|
45
|
+
} else {
|
|
46
|
+
return oContainer;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
var FclController = (_dec = defineUI5Class("sap.fe.templates.RootContainer.controller.Fcl"), _dec2 = usingExtension(ViewState.override({
|
|
51
|
+
applyInitialStateOnly: function () {
|
|
52
|
+
return false;
|
|
53
|
+
},
|
|
54
|
+
adaptBindingRefreshControls: function (aControls) {
|
|
55
|
+
this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
|
|
56
|
+
var pChildView = new Promise(function (resolve) {
|
|
57
|
+
resolve(oChildView);
|
|
58
|
+
});
|
|
59
|
+
aControls.push(pChildView);
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
adaptStateControls: function (aStateControls) {
|
|
63
|
+
this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
|
|
64
|
+
var pChildView = new Promise(function (resolve) {
|
|
65
|
+
resolve(oChildView);
|
|
66
|
+
});
|
|
67
|
+
aStateControls.push(pChildView);
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
onRestore: function () {
|
|
71
|
+
var oView = this.getView(),
|
|
72
|
+
oNavContainer = oView.byId("appContent");
|
|
73
|
+
var oFCLController = this.getView().getController();
|
|
74
|
+
var oInternalModel = oNavContainer.getModel("internal");
|
|
75
|
+
var oPages = oInternalModel.getProperty("/pages");
|
|
76
|
+
|
|
77
|
+
for (var sComponentId in oPages) {
|
|
78
|
+
oInternalModel.setProperty("/pages/" + sComponentId + "/restoreStatus", "pending");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
oFCLController.onContainerReady();
|
|
82
|
+
},
|
|
83
|
+
onSuspend: function () {
|
|
84
|
+
var oFCLController = this.getView().getController();
|
|
85
|
+
var oFCLControl = oFCLController.getFclControl();
|
|
86
|
+
var aBeginColumnPages = oFCLControl.getBeginColumnPages() || [];
|
|
87
|
+
var aMidColumnPages = oFCLControl.getMidColumnPages() || [];
|
|
88
|
+
var aEndColumnPages = oFCLControl.getEndColumnPages() || [];
|
|
89
|
+
var aPages = [].concat(aBeginColumnPages, aMidColumnPages, aEndColumnPages);
|
|
90
|
+
aPages.forEach(function (oPage) {
|
|
91
|
+
var oTargetView = _getViewFromContainer(oPage);
|
|
92
|
+
|
|
93
|
+
var oController = oTargetView && oTargetView.getController();
|
|
94
|
+
|
|
95
|
+
if (oController && oController.viewState && oController.viewState.onSuspend) {
|
|
96
|
+
return oController.viewState.onSuspend();
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
})), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseController) {
|
|
101
|
+
_inheritsLoose(FclController, _BaseController);
|
|
102
|
+
|
|
103
|
+
function FclController() {
|
|
104
|
+
var _this;
|
|
105
|
+
|
|
106
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
107
|
+
args[_key] = arguments[_key];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
_this = _BaseController.call.apply(_BaseController, [this].concat(args)) || this;
|
|
111
|
+
|
|
112
|
+
_initializerDefineProperty(_this, "viewState", _descriptor, _assertThisInitialized(_this));
|
|
113
|
+
|
|
114
|
+
return _this;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var _proto = FclController.prototype;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @private
|
|
121
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.getMetadata
|
|
122
|
+
* @function
|
|
123
|
+
*/
|
|
124
|
+
_proto.onInit = function onInit() {
|
|
125
|
+
_BaseController.prototype.onInit.call(this);
|
|
126
|
+
|
|
127
|
+
this._internalInit();
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
_proto.attachRouteMatchers = function attachRouteMatchers() {
|
|
131
|
+
this.getRouter().attachBeforeRouteMatched(this._getViewForNavigatedRowsComputation, this);
|
|
132
|
+
|
|
133
|
+
_BaseController.prototype.attachRouteMatchers.call(this);
|
|
134
|
+
|
|
135
|
+
this._internalInit();
|
|
136
|
+
|
|
137
|
+
this.getRouter().attachBeforeRouteMatched(this.onBeforeRouteMatched, this);
|
|
138
|
+
this.getRouter().attachRouteMatched(this.onRouteMatched, this);
|
|
139
|
+
this.getFclControl().attachStateChange(this._saveLayout, this);
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
_proto._internalInit = function _internalInit() {
|
|
143
|
+
if (this._oRouterProxy) {
|
|
144
|
+
return; // Already initialized
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
this.sCurrentRouteName = "";
|
|
148
|
+
this.sCurrentArguments = {};
|
|
149
|
+
this.SQUERYKEYNAME = "?query";
|
|
150
|
+
var oAppComponent = this.getAppComponent();
|
|
151
|
+
this._oRouterProxy = oAppComponent.getRouterProxy(); // Get FCL configuration in the manifest
|
|
152
|
+
|
|
153
|
+
this._oFCLConfig = {
|
|
154
|
+
maxColumnsCount: 3
|
|
155
|
+
};
|
|
156
|
+
var oRoutingConfig = oAppComponent.getManifest()["sap.ui5"].routing;
|
|
157
|
+
|
|
158
|
+
if (oRoutingConfig && oRoutingConfig.config) {
|
|
159
|
+
if (oRoutingConfig.config.flexibleColumnLayout) {
|
|
160
|
+
var oFCLManifestConfig = oRoutingConfig.config.flexibleColumnLayout; // Default layout for 2 columns
|
|
161
|
+
|
|
162
|
+
if (oFCLManifestConfig.defaultTwoColumnLayoutType) {
|
|
163
|
+
this._oFCLConfig.defaultTwoColumnLayoutType = oFCLManifestConfig.defaultTwoColumnLayoutType;
|
|
164
|
+
} // Default layout for 3 columns
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
if (oFCLManifestConfig.defaultThreeColumnLayoutType) {
|
|
168
|
+
this._oFCLConfig.defaultThreeColumnLayoutType = oFCLManifestConfig.defaultThreeColumnLayoutType;
|
|
169
|
+
} // Limit FCL to 2 columns ?
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
if (oFCLManifestConfig.limitFCLToTwoColumns === true) {
|
|
173
|
+
this._oFCLConfig.maxColumnsCount = 2;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (oRoutingConfig.config.controlAggregation) {
|
|
178
|
+
this._oFCLConfig.defaultControlAggregation = oRoutingConfig.config.controlAggregation;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
this._initializeTargetAggregation(oAppComponent);
|
|
183
|
+
|
|
184
|
+
this._initializeRoutesInformation(oAppComponent);
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
_proto.getFclControl = function getFclControl() {
|
|
188
|
+
return this.getView().getContent()[0];
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
_proto._saveLayout = function _saveLayout(oEvent) {
|
|
192
|
+
this.sPreviousLayout = oEvent.getParameters().layout;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get the additionnal view (on top of the visible views), to be able to compute the latest table navigated rows of the most right visible view after a nav back or column fullscreen.
|
|
196
|
+
*
|
|
197
|
+
* @function
|
|
198
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_getRightMostViewBeforeRouteMatched
|
|
199
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
200
|
+
*
|
|
201
|
+
*/
|
|
202
|
+
;
|
|
203
|
+
|
|
204
|
+
_proto._getViewForNavigatedRowsComputation = function _getViewForNavigatedRowsComputation() {
|
|
205
|
+
var _this2 = this;
|
|
206
|
+
|
|
207
|
+
var aAllVisibleViewsBeforeRouteMatched = this._getAllVisibleViews(this.sPreviousLayout);
|
|
208
|
+
|
|
209
|
+
var oRightMostViewBeforeRouteMatched = aAllVisibleViewsBeforeRouteMatched[aAllVisibleViewsBeforeRouteMatched.length - 1];
|
|
210
|
+
var oRightMostView;
|
|
211
|
+
this.getRouter().attachEventOnce("routeMatched", function (oEvent) {
|
|
212
|
+
oRightMostView = _getViewFromContainer(oEvent.getParameter("views")[oEvent.getParameter("views").length - 1]);
|
|
213
|
+
|
|
214
|
+
if (oRightMostViewBeforeRouteMatched) {
|
|
215
|
+
// Navigation forward from L2 to view level L3 (FullScreenLayout):
|
|
216
|
+
if (oRightMostView.getViewData() && oRightMostView.getViewData().viewLevel === _this2._oFCLConfig.maxColumnsCount) {
|
|
217
|
+
_this2.oAdditionalViewForNavRowsComputation = oRightMostView;
|
|
218
|
+
} // Navigations backward from L3 down to L2, L1, L0 (ThreeColumn layout):
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
if (oRightMostView.getViewData() && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel < _this2._oFCLConfig.maxColumnsCount && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel > oRightMostView.getViewData().viewLevel && oRightMostView !== oRightMostViewBeforeRouteMatched) {
|
|
222
|
+
_this2.oAdditionalViewForNavRowsComputation = oRightMostViewBeforeRouteMatched;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
_proto.getViewForNavigatedRowsComputation = function getViewForNavigatedRowsComputation() {
|
|
229
|
+
return this.oAdditionalViewForNavRowsComputation;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
_proto.onExit = function onExit() {
|
|
233
|
+
this.getRouter().detachRouteMatched(this.onRouteMatched, this);
|
|
234
|
+
this.getRouter().detachBeforeRouteMatched(this.onBeforeRouteMatched, this);
|
|
235
|
+
this.getFclControl().detachStateChange(this.onStateChanged, this);
|
|
236
|
+
this.getFclControl().detachAfterEndColumnNavigate(this.onStateChanged, this);
|
|
237
|
+
this._oTargetsAggregation = null;
|
|
238
|
+
this._oTargetsFromRoutePattern = null;
|
|
239
|
+
BaseController.prototype.onExit.bind(this)();
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Check if the FCL component is enabled.
|
|
243
|
+
*
|
|
244
|
+
* @function
|
|
245
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#isFclEnabled
|
|
246
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
247
|
+
* @returns {boolean} `true` since we are in FCL scenario
|
|
248
|
+
*
|
|
249
|
+
* @ui5-restricted
|
|
250
|
+
* @final
|
|
251
|
+
*/
|
|
252
|
+
;
|
|
253
|
+
|
|
254
|
+
_proto.isFclEnabled = function isFclEnabled() {
|
|
255
|
+
return true;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
_proto.displayMessagePage = function displayMessagePage(sErrorMessage, mParameters) {
|
|
259
|
+
var oFCLControl = this.getFclControl();
|
|
260
|
+
|
|
261
|
+
if (this._oFCLConfig && mParameters.FCLLevel >= this._oFCLConfig.maxColumnsCount) {
|
|
262
|
+
mParameters.FCLLevel = this._oFCLConfig.maxColumnsCount - 1;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (!this.aMessagePages) {
|
|
266
|
+
this.aMessagePages = [null, null, null];
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var oMessagePage = this.aMessagePages[mParameters.FCLLevel];
|
|
270
|
+
|
|
271
|
+
if (!oMessagePage) {
|
|
272
|
+
oMessagePage = new MessagePage({
|
|
273
|
+
showHeader: false,
|
|
274
|
+
icon: "sap-icon://message-error"
|
|
275
|
+
});
|
|
276
|
+
this.aMessagePages[mParameters.FCLLevel] = oMessagePage;
|
|
277
|
+
|
|
278
|
+
switch (mParameters.FCLLevel) {
|
|
279
|
+
case 0:
|
|
280
|
+
oFCLControl.addBeginColumnPage(oMessagePage);
|
|
281
|
+
break;
|
|
282
|
+
|
|
283
|
+
case 1:
|
|
284
|
+
oFCLControl.addMidColumnPage(oMessagePage);
|
|
285
|
+
break;
|
|
286
|
+
|
|
287
|
+
default:
|
|
288
|
+
oFCLControl.addEndColumnPage(oMessagePage);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
oMessagePage.setText(sErrorMessage);
|
|
293
|
+
|
|
294
|
+
if (mParameters.technicalMessage) {
|
|
295
|
+
oMessagePage.setCustomDescription(new Link({
|
|
296
|
+
text: mParameters.description || mParameters.technicalMessage,
|
|
297
|
+
press: function () {
|
|
298
|
+
MessageBox.show(mParameters.technicalMessage, {
|
|
299
|
+
icon: Icon.ERROR,
|
|
300
|
+
title: mParameters.title,
|
|
301
|
+
actions: [Action.OK],
|
|
302
|
+
defaultAction: Action.OK,
|
|
303
|
+
details: mParameters.technicalDetails || "",
|
|
304
|
+
contentWidth: "60%"
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}));
|
|
308
|
+
} else {
|
|
309
|
+
oMessagePage.setDescription(mParameters.description || "");
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
oFCLControl.to(oMessagePage.getId());
|
|
313
|
+
return Promise.resolve(true);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Initialize the object _oTargetsAggregation that defines for each route the relevant aggregation and pattern.
|
|
317
|
+
*
|
|
318
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeTargetAggregation
|
|
319
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
320
|
+
* @function
|
|
321
|
+
* @param {object} [oAppComponent] Reference to the AppComponent
|
|
322
|
+
*/
|
|
323
|
+
;
|
|
324
|
+
|
|
325
|
+
_proto._initializeTargetAggregation = function _initializeTargetAggregation(oAppComponent) {
|
|
326
|
+
var _this3 = this;
|
|
327
|
+
|
|
328
|
+
var oManifest = oAppComponent.getManifest(),
|
|
329
|
+
oTargets = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.targets : null;
|
|
330
|
+
this._oTargetsAggregation = {};
|
|
331
|
+
|
|
332
|
+
if (oTargets) {
|
|
333
|
+
Object.keys(oTargets).forEach(function (sTargetName) {
|
|
334
|
+
var oTarget = oTargets[sTargetName];
|
|
335
|
+
|
|
336
|
+
if (oTarget.controlAggregation) {
|
|
337
|
+
_this3._oTargetsAggregation[sTargetName] = {
|
|
338
|
+
aggregation: oTarget.controlAggregation,
|
|
339
|
+
pattern: oTarget.contextPattern
|
|
340
|
+
};
|
|
341
|
+
} else {
|
|
342
|
+
_this3._oTargetsAggregation[sTargetName] = {
|
|
343
|
+
aggregation: "page",
|
|
344
|
+
pattern: null
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Initializes the mapping between a route (identifed as its pattern) and the corresponding targets
|
|
352
|
+
*
|
|
353
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeRoutesInformation
|
|
354
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
355
|
+
* @function
|
|
356
|
+
* @param oAppComponent ref to the AppComponent
|
|
357
|
+
*/
|
|
358
|
+
;
|
|
359
|
+
|
|
360
|
+
_proto._initializeRoutesInformation = function _initializeRoutesInformation(oAppComponent) {
|
|
361
|
+
var _this4 = this;
|
|
362
|
+
|
|
363
|
+
var oManifest = oAppComponent.getManifest(),
|
|
364
|
+
aRoutes = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.routes : null;
|
|
365
|
+
this._oTargetsFromRoutePattern = {};
|
|
366
|
+
|
|
367
|
+
if (aRoutes) {
|
|
368
|
+
aRoutes.forEach(function (route) {
|
|
369
|
+
_this4._oTargetsFromRoutePattern[route.pattern] = route.target;
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
_proto.getCurrentArgument = function getCurrentArgument() {
|
|
375
|
+
return this.sCurrentArguments;
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
_proto.getCurrentRouteName = function getCurrentRouteName() {
|
|
379
|
+
return this.sCurrentRouteName;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Get FE FCL constant.
|
|
383
|
+
*
|
|
384
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
385
|
+
* @returns {object}
|
|
386
|
+
*/
|
|
387
|
+
;
|
|
388
|
+
|
|
389
|
+
_proto.getConstants = function getConstants() {
|
|
390
|
+
return CONSTANTS;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Getter for oTargetsAggregation array.
|
|
394
|
+
*
|
|
395
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#getTargetAggregation
|
|
396
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
397
|
+
* @function
|
|
398
|
+
* @returns {Array} The _oTargetsAggregation array
|
|
399
|
+
*
|
|
400
|
+
* @ui5-restricted
|
|
401
|
+
*/
|
|
402
|
+
;
|
|
403
|
+
|
|
404
|
+
_proto.getTargetAggregation = function getTargetAggregation() {
|
|
405
|
+
return this._oTargetsAggregation;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Function triggered by the router RouteMatched event.
|
|
409
|
+
*
|
|
410
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#onRouteMatched
|
|
411
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
412
|
+
* @param {*} oEvent
|
|
413
|
+
*/
|
|
414
|
+
;
|
|
415
|
+
|
|
416
|
+
_proto.onRouteMatched = function onRouteMatched(oEvent) {
|
|
417
|
+
var sRouteName = oEvent.getParameter("name"); // Save the current/previous routes and arguments
|
|
418
|
+
|
|
419
|
+
this.sCurrentRouteName = sRouteName;
|
|
420
|
+
this.sCurrentArguments = oEvent.getParameter("arguments");
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* This function is triggering the table scroll to the navigated row after each layout change.
|
|
424
|
+
*
|
|
425
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#scrollToLastSelectedItem
|
|
426
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
427
|
+
*/
|
|
428
|
+
;
|
|
429
|
+
|
|
430
|
+
_proto._scrollTablesToLastNavigatedItems = function _scrollTablesToLastNavigatedItems() {
|
|
431
|
+
var aViews = this._getAllVisibleViews(); //The scrolls are triggered only if the layout is with several columns or when switching the mostRight column in full screen
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
if (aViews.length > 1 || aViews[0].getViewData().viewLevel < this._oFCLConfig.maxColumnsCount) {
|
|
435
|
+
var sCurrentViewPath;
|
|
436
|
+
var oAdditionalView = this.getViewForNavigatedRowsComputation();
|
|
437
|
+
|
|
438
|
+
if (oAdditionalView && aViews.indexOf(oAdditionalView) === -1) {
|
|
439
|
+
aViews.push(oAdditionalView);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
for (var index = aViews.length - 1; index > 0; index--) {
|
|
443
|
+
var oView = aViews[index],
|
|
444
|
+
oPreviousView = aViews[index - 1];
|
|
445
|
+
|
|
446
|
+
if (oView.getBindingContext()) {
|
|
447
|
+
sCurrentViewPath = oView.getBindingContext().getPath();
|
|
448
|
+
|
|
449
|
+
oPreviousView.getController()._scrollTablesToRow(sCurrentViewPath);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Function triggered by the FCL StateChanged event.
|
|
456
|
+
*
|
|
457
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#onStateChanged
|
|
458
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
459
|
+
* @param {*} oEvent
|
|
460
|
+
*/
|
|
461
|
+
;
|
|
462
|
+
|
|
463
|
+
_proto.onStateChanged = function onStateChanged(oEvent) {
|
|
464
|
+
var bIsNavigationArrow = oEvent.getParameter("isNavigationArrow");
|
|
465
|
+
|
|
466
|
+
if (this.sCurrentArguments !== undefined) {
|
|
467
|
+
if (!this.sCurrentArguments[this.SQUERYKEYNAME]) {
|
|
468
|
+
this.sCurrentArguments[this.SQUERYKEYNAME] = {};
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
this.sCurrentArguments[this.SQUERYKEYNAME].layout = oEvent.getParameter("layout");
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
this._forceModelContextChangeOnBreadCrumbs(oEvent); // Replace the URL with the new layout if a navigation arrow was used
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
if (bIsNavigationArrow) {
|
|
478
|
+
this._oRouterProxy.navTo(this.sCurrentRouteName, this.sCurrentArguments);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Function to fire ModelContextChange event on all breadcrumbs ( on each ObjectPages).
|
|
483
|
+
*
|
|
484
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_forceModelContextChangeOnBreadCrumbs
|
|
485
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
486
|
+
* @param {*} oEvent
|
|
487
|
+
*/
|
|
488
|
+
;
|
|
489
|
+
|
|
490
|
+
_proto._forceModelContextChangeOnBreadCrumbs = function _forceModelContextChangeOnBreadCrumbs(oEvent) {
|
|
491
|
+
//force modelcontextchange on ObjectPages to refresh the breadcrumbs link hrefs
|
|
492
|
+
var oFcl = oEvent.getSource();
|
|
493
|
+
var oPages = [];
|
|
494
|
+
oPages = oPages.concat(oFcl.getBeginColumnPages()).concat(oFcl.getMidColumnPages()).concat(oFcl.getEndColumnPages());
|
|
495
|
+
oPages.forEach(function (oPage) {
|
|
496
|
+
var oView = _getViewFromContainer(oPage);
|
|
497
|
+
|
|
498
|
+
var oBreadCrumbs = oView.byId && oView.byId("breadcrumbs");
|
|
499
|
+
|
|
500
|
+
if (oBreadCrumbs) {
|
|
501
|
+
oBreadCrumbs.fireModelContextChange();
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Function triggered to update the Share button Visibility.
|
|
507
|
+
*
|
|
508
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
509
|
+
* @param {string} viewColumn Name of the current column ("beginColumn", "midColumn", "endColumn")
|
|
510
|
+
* @param {string} sLayout The current layout used by the FCL
|
|
511
|
+
* @returns {boolean}
|
|
512
|
+
*/
|
|
513
|
+
;
|
|
514
|
+
|
|
515
|
+
_proto._updateShareButtonVisibility = function _updateShareButtonVisibility(viewColumn, sLayout) {
|
|
516
|
+
var bShowShareIcon;
|
|
517
|
+
|
|
518
|
+
switch (sLayout) {
|
|
519
|
+
case "OneColumn":
|
|
520
|
+
bShowShareIcon = viewColumn === "beginColumn";
|
|
521
|
+
break;
|
|
522
|
+
|
|
523
|
+
case "MidColumnFullScreen":
|
|
524
|
+
case "ThreeColumnsBeginExpandedEndHidden":
|
|
525
|
+
case "ThreeColumnsMidExpandedEndHidden":
|
|
526
|
+
case "TwoColumnsBeginExpanded":
|
|
527
|
+
case "TwoColumnsMidExpanded":
|
|
528
|
+
bShowShareIcon = viewColumn === "midColumn";
|
|
529
|
+
break;
|
|
530
|
+
|
|
531
|
+
case "EndColumnFullScreen":
|
|
532
|
+
case "ThreeColumnsEndExpanded":
|
|
533
|
+
case "ThreeColumnsMidExpanded":
|
|
534
|
+
bShowShareIcon = viewColumn === "endColumn";
|
|
535
|
+
break;
|
|
536
|
+
|
|
537
|
+
default:
|
|
538
|
+
bShowShareIcon = false;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
return bShowShareIcon;
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
_proto.updateUIStateForView = function updateUIStateForView(oView, FCLLevel) {
|
|
545
|
+
var oUIState = this.getHelper().getCurrentUIState(),
|
|
546
|
+
oFclColName = ["beginColumn", "midColumn", "endColumn"],
|
|
547
|
+
sLayout = this.getFclControl().getLayout();
|
|
548
|
+
var viewColumn;
|
|
549
|
+
|
|
550
|
+
if (!oView.getModel("fclhelper")) {
|
|
551
|
+
oView.setModel(this._createHelperModel(), "fclhelper");
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
if (FCLLevel >= this._oFCLConfig.maxColumnsCount) {
|
|
555
|
+
// The view is on a level > max number of columns. It's always fullscreen without close/exit buttons
|
|
556
|
+
viewColumn = oFclColName[this._oFCLConfig.maxColumnsCount - 1];
|
|
557
|
+
oUIState.actionButtonsInfo.midColumn.fullScreen = null;
|
|
558
|
+
oUIState.actionButtonsInfo.midColumn.exitFullScreen = null;
|
|
559
|
+
oUIState.actionButtonsInfo.midColumn.closeColumn = null;
|
|
560
|
+
oUIState.actionButtonsInfo.endColumn.exitFullScreen = null;
|
|
561
|
+
oUIState.actionButtonsInfo.endColumn.fullScreen = null;
|
|
562
|
+
oUIState.actionButtonsInfo.endColumn.closeColumn = null;
|
|
563
|
+
} else {
|
|
564
|
+
viewColumn = oFclColName[FCLLevel];
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
if (FCLLevel >= this._oFCLConfig.maxColumnsCount || sLayout === "EndColumnFullScreen" || sLayout === "MidColumnFullScreen" || sLayout === "OneColumn") {
|
|
568
|
+
oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", true);
|
|
569
|
+
} else {
|
|
570
|
+
oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", false);
|
|
571
|
+
} // Unfortunately, the FCLHelper doesn't provide actionButton values for the first column
|
|
572
|
+
// so we have to add this info manually
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
oUIState.actionButtonsInfo.beginColumn = {
|
|
576
|
+
fullScreen: null,
|
|
577
|
+
exitFullScreen: null,
|
|
578
|
+
closeColumn: null
|
|
579
|
+
};
|
|
580
|
+
var oActionButtonInfos = Object.assign({}, oUIState.actionButtonsInfo[viewColumn]);
|
|
581
|
+
oActionButtonInfos.switchVisible = oActionButtonInfos.fullScreen !== null || oActionButtonInfos.exitFullScreen !== null;
|
|
582
|
+
oActionButtonInfos.switchIcon = oActionButtonInfos.fullScreen !== null ? "sap-icon://full-screen" : "sap-icon://exit-full-screen";
|
|
583
|
+
oActionButtonInfos.isFullScreen = oActionButtonInfos.fullScreen === null;
|
|
584
|
+
oView.getModel("fclhelper").setProperty("/actionButtonsInfo", oActionButtonInfos);
|
|
585
|
+
oView.getModel("fclhelper").setProperty("/showShareIcon", this._updateShareButtonVisibility(viewColumn, sLayout));
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Function triggered by the router BeforeRouteMatched event.
|
|
589
|
+
*
|
|
590
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#onBeforeRouteMatched
|
|
591
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
592
|
+
* @param {*} oEvent
|
|
593
|
+
*/
|
|
594
|
+
;
|
|
595
|
+
|
|
596
|
+
_proto.onBeforeRouteMatched = function onBeforeRouteMatched(oEvent) {
|
|
597
|
+
if (oEvent) {
|
|
598
|
+
var oQueryParams = oEvent.getParameters().arguments[this.SQUERYKEYNAME];
|
|
599
|
+
var sLayout = oQueryParams ? oQueryParams.layout : null; // If there is no layout parameter, query for the default level 0 layout (normally OneColumn)
|
|
600
|
+
|
|
601
|
+
if (!sLayout) {
|
|
602
|
+
var oNextUIState = this.getHelper().getNextUIState(0);
|
|
603
|
+
sLayout = oNextUIState.layout;
|
|
604
|
+
} // Check if the layout if compatible with the number of targets
|
|
605
|
+
// This should always be the case for normal navigation, just needed in case
|
|
606
|
+
// the URL has been manually modified
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
var aTargets = oEvent.getParameter("config").target;
|
|
610
|
+
sLayout = this._correctLayoutForTargets(sLayout, aTargets); // Update the layout of the FlexibleColumnLayout
|
|
611
|
+
|
|
612
|
+
if (sLayout) {
|
|
613
|
+
this.getFclControl().setLayout(sLayout);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* Helper for the FCL Component.
|
|
619
|
+
*
|
|
620
|
+
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#getHelper
|
|
621
|
+
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
622
|
+
* @returns {object} Instance of a semantic helper
|
|
623
|
+
*/
|
|
624
|
+
;
|
|
625
|
+
|
|
626
|
+
_proto.getHelper = function getHelper() {
|
|
627
|
+
return FlexibleColumnLayoutSemanticHelper.getInstanceFor(this.getFclControl(), this._oFCLConfig);
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Calculates the FCL layout for a given FCL level and a target hash.
|
|
631
|
+
*
|
|
632
|
+
* @param iNextFCLLevel FCL level to be navigated to
|
|
633
|
+
* @param sHash The hash to be navigated to
|
|
634
|
+
* @param sProposedLayout The proposed layout
|
|
635
|
+
* @param keepCurrentLayout True if we want to keep the current layout if possible
|
|
636
|
+
* @returns {object}
|
|
637
|
+
*/
|
|
638
|
+
;
|
|
639
|
+
|
|
640
|
+
_proto.calculateLayout = function calculateLayout(iNextFCLLevel, sHash, sProposedLayout, keepCurrentLayout) {
|
|
641
|
+
// First, ask the FCL helper to calculate the layout if nothing is proposed
|
|
642
|
+
if (!sProposedLayout) {
|
|
643
|
+
sProposedLayout = keepCurrentLayout ? this.getFclControl().getLayout() : this.getHelper().getNextUIState(iNextFCLLevel).layout;
|
|
644
|
+
} // Then change this value if necessary, based on the number of targets
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
var oRoute = this.getRouter().getRouteByHash(sHash + "?layout=" + sProposedLayout);
|
|
648
|
+
|
|
649
|
+
var aTargets = this._oTargetsFromRoutePattern[oRoute.getPattern()];
|
|
650
|
+
|
|
651
|
+
return this._correctLayoutForTargets(sProposedLayout, aTargets);
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* Checks whether a given FCL layout is compatible with an array of targets.
|
|
655
|
+
*
|
|
656
|
+
* @param {*} sProposedLayout Proposed value for the FCL layout
|
|
657
|
+
* @param {*} aTargets Array of target names used for checking
|
|
658
|
+
* @returns {string} The corrected layout
|
|
659
|
+
*/
|
|
660
|
+
;
|
|
661
|
+
|
|
662
|
+
_proto._correctLayoutForTargets = function _correctLayoutForTargets(sProposedLayout, aTargets) {
|
|
663
|
+
var allAllowedLayouts = {
|
|
664
|
+
"2": ["TwoColumnsMidExpanded", "TwoColumnsBeginExpanded", "MidColumnFullScreen"],
|
|
665
|
+
"3": ["ThreeColumnsMidExpanded", "ThreeColumnsEndExpanded", "ThreeColumnsMidExpandedEndHidden", "ThreeColumnsBeginExpandedEndHidden", "MidColumnFullScreen", "EndColumnFullScreen"]
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
if (aTargets && !Array.isArray(aTargets)) {
|
|
669
|
+
// To support single target as a string in the manifest
|
|
670
|
+
aTargets = [aTargets];
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
if (!aTargets) {
|
|
674
|
+
// Defensive, just in case...
|
|
675
|
+
return sProposedLayout;
|
|
676
|
+
} else if (aTargets.length > 1) {
|
|
677
|
+
// More than 1 target: just simply check from the allowed values
|
|
678
|
+
var aLayouts = allAllowedLayouts[aTargets.length];
|
|
679
|
+
|
|
680
|
+
if (aLayouts.indexOf(sProposedLayout) < 0) {
|
|
681
|
+
// The proposed layout isn't compatible with the number of columns
|
|
682
|
+
// --> Ask the helper for the default layout for the number of columns
|
|
683
|
+
sProposedLayout = aLayouts[0]; //this.getHelper().getNextUIState(aTargets.length - 1).layout;
|
|
684
|
+
}
|
|
685
|
+
} else {
|
|
686
|
+
// Only one target
|
|
687
|
+
var sTargetAggregation = this.getTargetAggregation()[aTargets[0]].aggregation || this._oFCLConfig.defaultControlAggregation;
|
|
688
|
+
|
|
689
|
+
switch (sTargetAggregation) {
|
|
690
|
+
case "beginColumnPages":
|
|
691
|
+
sProposedLayout = "OneColumn";
|
|
692
|
+
break;
|
|
693
|
+
|
|
694
|
+
case "midColumnPages":
|
|
695
|
+
sProposedLayout = "MidColumnFullScreen";
|
|
696
|
+
break;
|
|
697
|
+
|
|
698
|
+
case "endColumnPages":
|
|
699
|
+
sProposedLayout = "EndColumnFullScreen";
|
|
700
|
+
break;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
return sProposedLayout;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* get all visible views in the FCL component.
|
|
708
|
+
* sLayout optional parameter is very specific as part of the calculation of the latest navigated row
|
|
709
|
+
*
|
|
710
|
+
* @param {*} sLayout Layout that was applied just before the current navigation
|
|
711
|
+
* @returns {Array} return views
|
|
712
|
+
*/
|
|
713
|
+
;
|
|
714
|
+
|
|
715
|
+
_proto._getAllVisibleViews = function _getAllVisibleViews(sLayout) {
|
|
716
|
+
var aViews = [];
|
|
717
|
+
sLayout = !!sLayout ? sLayout : this.getFclControl().getLayout();
|
|
718
|
+
|
|
719
|
+
switch (sLayout) {
|
|
720
|
+
case LayoutType.EndColumnFullScreen:
|
|
721
|
+
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
722
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
break;
|
|
726
|
+
|
|
727
|
+
case LayoutType.MidColumnFullScreen:
|
|
728
|
+
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
729
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
break;
|
|
733
|
+
|
|
734
|
+
case LayoutType.OneColumn:
|
|
735
|
+
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
736
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
break;
|
|
740
|
+
|
|
741
|
+
case LayoutType.ThreeColumnsEndExpanded:
|
|
742
|
+
case LayoutType.ThreeColumnsMidExpanded:
|
|
743
|
+
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
744
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
748
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
752
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
break;
|
|
756
|
+
|
|
757
|
+
case LayoutType.TwoColumnsBeginExpanded:
|
|
758
|
+
case LayoutType.TwoColumnsMidExpanded:
|
|
759
|
+
case LayoutType.ThreeColumnsMidExpandedEndHidden:
|
|
760
|
+
case LayoutType.ThreeColumnsBeginExpandedEndHidden:
|
|
761
|
+
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
762
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
766
|
+
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
break;
|
|
770
|
+
|
|
771
|
+
default:
|
|
772
|
+
Log.error("Unhandled switch case for " + this.getFclControl().getLayout());
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
return aViews;
|
|
776
|
+
};
|
|
777
|
+
|
|
778
|
+
_proto.onContainerReady = function onContainerReady() {
|
|
779
|
+
// Restore views if neccessary.
|
|
780
|
+
var aViews = this._getAllVisibleViews();
|
|
781
|
+
|
|
782
|
+
var aRestorePromises = [];
|
|
783
|
+
aViews.reduce(function (aPromises, oTargetView) {
|
|
784
|
+
aPromises.push(KeepAliveHelper.restoreView(oTargetView));
|
|
785
|
+
return aPromises;
|
|
786
|
+
}, aRestorePromises);
|
|
787
|
+
return Promise.all(aRestorePromises);
|
|
788
|
+
};
|
|
789
|
+
|
|
790
|
+
_proto.getRightmostContext = function getRightmostContext() {
|
|
791
|
+
var oContext;
|
|
792
|
+
|
|
793
|
+
switch (this.getFclControl().getLayout()) {
|
|
794
|
+
case LayoutType.OneColumn:
|
|
795
|
+
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
796
|
+
oContext = _getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()).getBindingContext();
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
break;
|
|
800
|
+
|
|
801
|
+
case LayoutType.TwoColumnsBeginExpanded:
|
|
802
|
+
case LayoutType.TwoColumnsMidExpanded:
|
|
803
|
+
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
804
|
+
oContext = _getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()).getBindingContext();
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
break;
|
|
808
|
+
|
|
809
|
+
case LayoutType.ThreeColumnsEndExpanded:
|
|
810
|
+
case LayoutType.ThreeColumnsMidExpanded:
|
|
811
|
+
case LayoutType.ThreeColumnsMidExpandedEndHidden:
|
|
812
|
+
case LayoutType.ThreeColumnsBeginExpandedEndHidden:
|
|
813
|
+
case LayoutType.EndColumnFullScreen:
|
|
814
|
+
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
815
|
+
oContext = _getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()).getBindingContext();
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
break;
|
|
819
|
+
|
|
820
|
+
case LayoutType.MidColumnFullScreen:
|
|
821
|
+
// In this case we need to determine if this mid column fullscreen comes from a 2 or a 3 column layout
|
|
822
|
+
var sLayoutWhenExitFullScreen = this.getHelper().getCurrentUIState().actionButtonsInfo.midColumn.exitFullScreen;
|
|
823
|
+
|
|
824
|
+
if (sLayoutWhenExitFullScreen.indexOf("ThreeColumn") >= 0) {
|
|
825
|
+
// We come from a 3 column layout
|
|
826
|
+
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
827
|
+
oContext = _getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()).getBindingContext();
|
|
828
|
+
}
|
|
829
|
+
} else {
|
|
830
|
+
// We come from a 2 column layout
|
|
831
|
+
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
832
|
+
oContext = _getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()).getBindingContext();
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
break;
|
|
837
|
+
|
|
838
|
+
default:
|
|
839
|
+
Log.error("Unhandled switch case for " + this.getFclControl().getLayout());
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
return oContext;
|
|
843
|
+
};
|
|
844
|
+
|
|
845
|
+
return FclController;
|
|
846
|
+
}(BaseController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec2], {
|
|
847
|
+
configurable: true,
|
|
848
|
+
enumerable: true,
|
|
849
|
+
writable: true,
|
|
850
|
+
initializer: null
|
|
851
|
+
})), _class2)) || _class);
|
|
852
|
+
return FclController;
|
|
853
|
+
}, false);
|
|
854
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZjbC5jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbIkxheW91dFR5cGUiLCJmTGlicmFyeSIsIkNPTlNUQU5UUyIsInBhZ2UiLCJuYW1lcyIsImN1cnJlbnRHZXR0ZXIiLCJwcmVmaXgiLCJzdWZmaXgiLCJnZXR0ZXIiLCJfZ2V0Vmlld0Zyb21Db250YWluZXIiLCJvQ29udGFpbmVyIiwiaXNBIiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJnZXRSb290Q29udHJvbCIsIkZjbENvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiVmlld1N0YXRlIiwib3ZlcnJpZGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMiLCJhQ29udHJvbHMiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsIl9nZXRBbGxWaXNpYmxlVmlld3MiLCJmb3JFYWNoIiwib0NoaWxkVmlldyIsInBDaGlsZFZpZXciLCJQcm9taXNlIiwicmVzb2x2ZSIsInB1c2giLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJhU3RhdGVDb250cm9scyIsIm9uUmVzdG9yZSIsIm9WaWV3Iiwib05hdkNvbnRhaW5lciIsImJ5SWQiLCJvRkNMQ29udHJvbGxlciIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJvUGFnZXMiLCJnZXRQcm9wZXJ0eSIsInNDb21wb25lbnRJZCIsInNldFByb3BlcnR5Iiwib25Db250YWluZXJSZWFkeSIsIm9uU3VzcGVuZCIsIm9GQ0xDb250cm9sIiwiZ2V0RmNsQ29udHJvbCIsImFCZWdpbkNvbHVtblBhZ2VzIiwiZ2V0QmVnaW5Db2x1bW5QYWdlcyIsImFNaWRDb2x1bW5QYWdlcyIsImdldE1pZENvbHVtblBhZ2VzIiwiYUVuZENvbHVtblBhZ2VzIiwiZ2V0RW5kQ29sdW1uUGFnZXMiLCJhUGFnZXMiLCJjb25jYXQiLCJvUGFnZSIsIm9UYXJnZXRWaWV3Iiwib0NvbnRyb2xsZXIiLCJ2aWV3U3RhdGUiLCJvbkluaXQiLCJfaW50ZXJuYWxJbml0IiwiYXR0YWNoUm91dGVNYXRjaGVycyIsImdldFJvdXRlciIsImF0dGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCIsIl9nZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uIiwib25CZWZvcmVSb3V0ZU1hdGNoZWQiLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZCIsImF0dGFjaFN0YXRlQ2hhbmdlIiwiX3NhdmVMYXlvdXQiLCJfb1JvdXRlclByb3h5Iiwic0N1cnJlbnRSb3V0ZU5hbWUiLCJzQ3VycmVudEFyZ3VtZW50cyIsIlNRVUVSWUtFWU5BTUUiLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJfb0ZDTENvbmZpZyIsIm1heENvbHVtbnNDb3VudCIsIm9Sb3V0aW5nQ29uZmlnIiwiZ2V0TWFuaWZlc3QiLCJyb3V0aW5nIiwiY29uZmlnIiwiZmxleGlibGVDb2x1bW5MYXlvdXQiLCJvRkNMTWFuaWZlc3RDb25maWciLCJkZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZSIsImRlZmF1bHRUaHJlZUNvbHVtbkxheW91dFR5cGUiLCJsaW1pdEZDTFRvVHdvQ29sdW1ucyIsImNvbnRyb2xBZ2dyZWdhdGlvbiIsImRlZmF1bHRDb250cm9sQWdncmVnYXRpb24iLCJfaW5pdGlhbGl6ZVRhcmdldEFnZ3JlZ2F0aW9uIiwiX2luaXRpYWxpemVSb3V0ZXNJbmZvcm1hdGlvbiIsImdldENvbnRlbnQiLCJvRXZlbnQiLCJzUHJldmlvdXNMYXlvdXQiLCJnZXRQYXJhbWV0ZXJzIiwibGF5b3V0IiwiYUFsbFZpc2libGVWaWV3c0JlZm9yZVJvdXRlTWF0Y2hlZCIsIm9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkIiwibGVuZ3RoIiwib1JpZ2h0TW9zdFZpZXciLCJhdHRhY2hFdmVudE9uY2UiLCJnZXRQYXJhbWV0ZXIiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsIm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbiIsImdldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24iLCJvbkV4aXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJkZXRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQiLCJkZXRhY2hTdGF0ZUNoYW5nZSIsIm9uU3RhdGVDaGFuZ2VkIiwiZGV0YWNoQWZ0ZXJFbmRDb2x1bW5OYXZpZ2F0ZSIsIl9vVGFyZ2V0c0FnZ3JlZ2F0aW9uIiwiX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiIsIkJhc2VDb250cm9sbGVyIiwicHJvdG90eXBlIiwiYmluZCIsImlzRmNsRW5hYmxlZCIsImRpc3BsYXlNZXNzYWdlUGFnZSIsInNFcnJvck1lc3NhZ2UiLCJtUGFyYW1ldGVycyIsIkZDTExldmVsIiwiYU1lc3NhZ2VQYWdlcyIsIm9NZXNzYWdlUGFnZSIsIk1lc3NhZ2VQYWdlIiwic2hvd0hlYWRlciIsImljb24iLCJhZGRCZWdpbkNvbHVtblBhZ2UiLCJhZGRNaWRDb2x1bW5QYWdlIiwiYWRkRW5kQ29sdW1uUGFnZSIsInNldFRleHQiLCJ0ZWNobmljYWxNZXNzYWdlIiwic2V0Q3VzdG9tRGVzY3JpcHRpb24iLCJMaW5rIiwidGV4dCIsImRlc2NyaXB0aW9uIiwicHJlc3MiLCJNZXNzYWdlQm94Iiwic2hvdyIsIkljb24iLCJFUlJPUiIsInRpdGxlIiwiYWN0aW9ucyIsIkFjdGlvbiIsIk9LIiwiZGVmYXVsdEFjdGlvbiIsImRldGFpbHMiLCJ0ZWNobmljYWxEZXRhaWxzIiwiY29udGVudFdpZHRoIiwic2V0RGVzY3JpcHRpb24iLCJ0byIsImdldElkIiwib01hbmlmZXN0Iiwib1RhcmdldHMiLCJ0YXJnZXRzIiwiT2JqZWN0Iiwia2V5cyIsInNUYXJnZXROYW1lIiwib1RhcmdldCIsImFnZ3JlZ2F0aW9uIiwicGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwiYVJvdXRlcyIsInJvdXRlcyIsInJvdXRlIiwidGFyZ2V0IiwiZ2V0Q3VycmVudEFyZ3VtZW50IiwiZ2V0Q3VycmVudFJvdXRlTmFtZSIsImdldENvbnN0YW50cyIsImdldFRhcmdldEFnZ3JlZ2F0aW9uIiwic1JvdXRlTmFtZSIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImFWaWV3cyIsInNDdXJyZW50Vmlld1BhdGgiLCJvQWRkaXRpb25hbFZpZXciLCJpbmRleE9mIiwiaW5kZXgiLCJvUHJldmlvdXNWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRQYXRoIiwiX3Njcm9sbFRhYmxlc1RvUm93IiwiYklzTmF2aWdhdGlvbkFycm93IiwidW5kZWZpbmVkIiwiX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyIsIm5hdlRvIiwib0ZjbCIsImdldFNvdXJjZSIsIm9CcmVhZENydW1icyIsImZpcmVNb2RlbENvbnRleHRDaGFuZ2UiLCJfdXBkYXRlU2hhcmVCdXR0b25WaXNpYmlsaXR5Iiwidmlld0NvbHVtbiIsInNMYXlvdXQiLCJiU2hvd1NoYXJlSWNvbiIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3Iiwib1VJU3RhdGUiLCJnZXRIZWxwZXIiLCJnZXRDdXJyZW50VUlTdGF0ZSIsIm9GY2xDb2xOYW1lIiwiZ2V0TGF5b3V0Iiwic2V0TW9kZWwiLCJfY3JlYXRlSGVscGVyTW9kZWwiLCJhY3Rpb25CdXR0b25zSW5mbyIsIm1pZENvbHVtbiIsImZ1bGxTY3JlZW4iLCJleGl0RnVsbFNjcmVlbiIsImNsb3NlQ29sdW1uIiwiZW5kQ29sdW1uIiwiYmVnaW5Db2x1bW4iLCJvQWN0aW9uQnV0dG9uSW5mb3MiLCJhc3NpZ24iLCJzd2l0Y2hWaXNpYmxlIiwic3dpdGNoSWNvbiIsImlzRnVsbFNjcmVlbiIsIm9RdWVyeVBhcmFtcyIsImFyZ3VtZW50cyIsIm9OZXh0VUlTdGF0ZSIsImdldE5leHRVSVN0YXRlIiwiYVRhcmdldHMiLCJfY29ycmVjdExheW91dEZvclRhcmdldHMiLCJzZXRMYXlvdXQiLCJGbGV4aWJsZUNvbHVtbkxheW91dFNlbWFudGljSGVscGVyIiwiZ2V0SW5zdGFuY2VGb3IiLCJjYWxjdWxhdGVMYXlvdXQiLCJpTmV4dEZDTExldmVsIiwic0hhc2giLCJzUHJvcG9zZWRMYXlvdXQiLCJrZWVwQ3VycmVudExheW91dCIsIm9Sb3V0ZSIsImdldFJvdXRlQnlIYXNoIiwiZ2V0UGF0dGVybiIsImFsbEFsbG93ZWRMYXlvdXRzIiwiQXJyYXkiLCJpc0FycmF5IiwiYUxheW91dHMiLCJzVGFyZ2V0QWdncmVnYXRpb24iLCJFbmRDb2x1bW5GdWxsU2NyZWVuIiwiZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UiLCJNaWRDb2x1bW5GdWxsU2NyZWVuIiwiZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UiLCJPbmVDb2x1bW4iLCJnZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlIiwiVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWQiLCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZCIsIlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkIiwiVHdvQ29sdW1uc01pZEV4cGFuZGVkIiwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRFbmRIaWRkZW4iLCJUaHJlZUNvbHVtbnNCZWdpbkV4cGFuZGVkRW5kSGlkZGVuIiwiTG9nIiwiZXJyb3IiLCJhUmVzdG9yZVByb21pc2VzIiwicmVkdWNlIiwiYVByb21pc2VzIiwiS2VlcEFsaXZlSGVscGVyIiwicmVzdG9yZVZpZXciLCJhbGwiLCJnZXRSaWdodG1vc3RDb250ZXh0Iiwib0NvbnRleHQiLCJzTGF5b3V0V2hlbkV4aXRGdWxsU2NyZWVuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLE1BQU1BLFVBQVUsR0FBR0MsUUFBUSxDQUFDRCxVQUE1QjtBQUVBLE1BQU1FLFNBQVMsR0FBRztBQUNqQkMsSUFBQUEsSUFBSSxFQUFFO0FBQ0xDLE1BQUFBLEtBQUssRUFBRSxDQUFDLGFBQUQsRUFBZ0IsV0FBaEIsRUFBNkIsV0FBN0IsQ0FERjtBQUVMQyxNQUFBQSxhQUFhLEVBQUU7QUFDZEMsUUFBQUEsTUFBTSxFQUFFLFlB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ZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgRmxleGlibGVDb2x1bW5MYXlvdXQgZnJvbSBcInNhcC9mL0ZsZXhpYmxlQ29sdW1uTGF5b3V0XCI7XG5pbXBvcnQgRmxleGlibGVDb2x1bW5MYXlvdXRTZW1hbnRpY0hlbHBlciBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRTZW1hbnRpY0hlbHBlclwiO1xuaW1wb3J0IGZMaWJyYXJ5IGZyb20gXCJzYXAvZi9saWJyYXJ5XCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IExpbmsgZnJvbSBcInNhcC9tL0xpbmtcIjtcbmltcG9ydCBNZXNzYWdlQm94LCB7IEFjdGlvbiwgSWNvbiB9IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVBhZ2UgZnJvbSBcInNhcC9tL01lc3NhZ2VQYWdlXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXIgZnJvbSBcIi4vUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyXCI7XG5cbmNvbnN0IExheW91dFR5cGUgPSBmTGlicmFyeS5MYXlvdXRUeXBlO1xuXG5jb25zdCBDT05TVEFOVFMgPSB7XG5cdHBhZ2U6IHtcblx0XHRuYW1lczogW1wiQmVnaW5Db2x1bW5cIiwgXCJNaWRDb2x1bW5cIiwgXCJFbmRDb2x1bW5cIl0sXG5cdFx0Y3VycmVudEdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldEN1cnJlbnRcIixcblx0XHRcdHN1ZmZpeDogXCJQYWdlXCJcblx0XHR9LFxuXHRcdGdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldFwiLFxuXHRcdFx0c3VmZml4OiBcIlBhZ2VzXCJcblx0XHR9XG5cdH1cbn07XG5jb25zdCBfZ2V0Vmlld0Zyb21Db250YWluZXIgPSBmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdGlmIChvQ29udGFpbmVyLmlzQShcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdHJldHVybiBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCkuZ2V0Um9vdENvbnRyb2woKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb0NvbnRhaW5lcjtcblx0fVxufTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsXCIpXG5jbGFzcyBGY2xDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0Vmlld1N0YXRlLm92ZXJyaWRlKHtcblx0XHRcdGFwcGx5SW5pdGlhbFN0YXRlT25seTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IGFueSkge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIEZjbENvbnRyb2xsZXIpLl9nZXRBbGxWaXNpYmxlVmlld3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hpbGRWaWV3OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBwQ2hpbGRWaWV3ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9DaGlsZFZpZXcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRhZGFwdFN0YXRlQ29udHJvbHM6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIGFTdGF0ZUNvbnRyb2xzOiBhbnkpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBGY2xDb250cm9sbGVyKS5fZ2V0QWxsVmlzaWJsZVZpZXdzKCkuZm9yRWFjaChmdW5jdGlvbiAob0NoaWxkVmlldzogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgcENoaWxkVmlldyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvQ2hpbGRWaWV3KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhU3RhdGVDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRvblJlc3RvcmU6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRvTmF2Q29udGFpbmVyID0gb1ZpZXcuYnlJZChcImFwcENvbnRlbnRcIik7XG5cdFx0XHRcdGNvbnN0IG9GQ0xDb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IG9OYXZDb250YWluZXIuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdGNvbnN0IG9QYWdlcyA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2VzXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3Qgc0NvbXBvbmVudElkIGluIG9QYWdlcykge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2VzL1wiICsgc0NvbXBvbmVudElkICsgXCIvcmVzdG9yZVN0YXR1c1wiLCBcInBlbmRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0KG9GQ0xDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdH0sXG5cdFx0XHRvblN1c3BlbmQ6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcjtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2wgPSBvRkNMQ29udHJvbGxlci5nZXRGY2xDb250cm9sKCk7XG5cdFx0XHRcdGNvbnN0IGFCZWdpbkNvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRCZWdpbkNvbHVtblBhZ2VzKCkgfHwgW107XG5cdFx0XHRcdGNvbnN0IGFNaWRDb2x1bW5QYWdlczogQ29udHJvbFtdID0gb0ZDTENvbnRyb2wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXTtcblx0XHRcdFx0Y29uc3QgYUVuZENvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRFbmRDb2x1bW5QYWdlcygpIHx8IFtdO1xuXHRcdFx0XHRjb25zdCBhUGFnZXMgPSAoW10gYXMgQ29udHJvbFtdKS5jb25jYXQoYUJlZ2luQ29sdW1uUGFnZXMsIGFNaWRDb2x1bW5QYWdlcywgYUVuZENvbHVtblBhZ2VzKTtcblxuXHRcdFx0XHRhUGFnZXMuZm9yRWFjaChmdW5jdGlvbiAob1BhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRWaWV3ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKG9QYWdlKTtcblxuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1RhcmdldFZpZXcgJiYgb1RhcmdldFZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlLm9uU3VzcGVuZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5vblN1c3BlbmQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXHRwcml2YXRlIHNDdXJyZW50Um91dGVOYW1lITogc3RyaW5nO1xuXHRwcml2YXRlIHNDdXJyZW50QXJndW1lbnRzPzogYW55O1xuXHRwcml2YXRlIHNQcmV2aW91c0xheW91dCE6IHN0cmluZztcblx0cHJpdmF0ZSBTUVVFUllLRVlOQU1FITogc3RyaW5nO1xuXHRwcml2YXRlIF9vRkNMQ29uZmlnOiBhbnk7XG5cdHByaXZhdGUgb0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uOiBhbnk7XG5cdHByaXZhdGUgX29UYXJnZXRzQWdncmVnYXRpb246IGFueTtcblx0cHJpdmF0ZSBfb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuOiBhbnk7XG5cdHByaXZhdGUgYU1lc3NhZ2VQYWdlcz86IGFueVtdO1xuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmdldE1ldGFkYXRhXG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblxuXHRvbkluaXQoKSB7XG5cdFx0c3VwZXIub25Jbml0KCk7XG5cblx0XHR0aGlzLl9pbnRlcm5hbEluaXQoKTtcblx0fVxuXG5cdGF0dGFjaFJvdXRlTWF0Y2hlcnMoKSB7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5fZ2V0Vmlld0Zvck5hdmlnYXRlZFJvd3NDb21wdXRhdGlvbiwgdGhpcyk7XG5cdFx0c3VwZXIuYXR0YWNoUm91dGVNYXRjaGVycygpO1xuXHRcdHRoaXMuX2ludGVybmFsSW5pdCgpO1xuXG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5vbkJlZm9yZVJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5vblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRGY2xDb250cm9sKCkuYXR0YWNoU3RhdGVDaGFuZ2UodGhpcy5fc2F2ZUxheW91dCwgdGhpcyk7XG5cdH1cblxuXHRfaW50ZXJuYWxJbml0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGVyUHJveHkpIHtcblx0XHRcdHJldHVybjsgLy8gQWxyZWFkeSBpbml0aWFsaXplZFxuXHRcdH1cblxuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBcIlwiO1xuXHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHMgPSB7fTtcblx0XHR0aGlzLlNRVUVSWUtFWU5BTUUgPSBcIj9xdWVyeVwiO1xuXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHQvLyBHZXQgRkNMIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1hbmlmZXN0XG5cdFx0dGhpcy5fb0ZDTENvbmZpZyA9IHsgbWF4Q29sdW1uc0NvdW50OiAzIH07XG5cdFx0Y29uc3Qgb1JvdXRpbmdDb25maWcgPSAob0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nQ29uZmlnICYmIG9Sb3V0aW5nQ29uZmlnLmNvbmZpZykge1xuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5mbGV4aWJsZUNvbHVtbkxheW91dCkge1xuXHRcdFx0XHRjb25zdCBvRkNMTWFuaWZlc3RDb25maWcgPSBvUm91dGluZ0NvbmZpZy5jb25maWcuZmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cblx0XHRcdFx0Ly8gRGVmYXVsdCBsYXlvdXQgZm9yIDIgY29sdW1uc1xuXHRcdFx0XHRpZiAob0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUd29Db2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZSA9IG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIERlZmF1bHQgbGF5b3V0IGZvciAzIGNvbHVtbnNcblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlID0gb0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUaHJlZUNvbHVtbkxheW91dFR5cGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW1pdCBGQ0wgdG8gMiBjb2x1bW5zID9cblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5saW1pdEZDTFRvVHdvQ29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50ID0gMjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uID0gb1JvdXRpbmdDb25maWcuY29uZmlnLmNvbnRyb2xBZ2dyZWdhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9pbml0aWFsaXplVGFyZ2V0QWdncmVnYXRpb24ob0FwcENvbXBvbmVudCk7XG5cdFx0dGhpcy5faW5pdGlhbGl6ZVJvdXRlc0luZm9ybWF0aW9uKG9BcHBDb21wb25lbnQpO1xuXHR9XG5cblx0Z2V0RmNsQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdIGFzIEZsZXhpYmxlQ29sdW1uTGF5b3V0O1xuXHR9XG5cblx0X3NhdmVMYXlvdXQob0V2ZW50OiBhbnkpIHtcblx0XHR0aGlzLnNQcmV2aW91c0xheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkubGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgYWRkaXRpb25uYWwgdmlldyAob24gdG9wIG9mIHRoZSB2aXNpYmxlIHZpZXdzKSwgdG8gYmUgYWJsZSB0byBjb21wdXRlIHRoZSBsYXRlc3QgdGFibGUgbmF2aWdhdGVkIHJvd3Mgb2YgdGhlIG1vc3QgcmlnaHQgdmlzaWJsZSB2aWV3IGFmdGVyIGEgbmF2IGJhY2sgb3IgY29sdW1uIGZ1bGxzY3JlZW4uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfZ2V0UmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICpcblx0ICovXG5cblx0X2dldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24oKSB7XG5cdFx0Y29uc3QgYUFsbFZpc2libGVWaWV3c0JlZm9yZVJvdXRlTWF0Y2hlZCA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cyh0aGlzLnNQcmV2aW91c0xheW91dCk7XG5cdFx0Y29uc3Qgb1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQgPSBhQWxsVmlzaWJsZVZpZXdzQmVmb3JlUm91dGVNYXRjaGVkW2FBbGxWaXNpYmxlVmlld3NCZWZvcmVSb3V0ZU1hdGNoZWQubGVuZ3RoIC0gMV07XG5cdFx0bGV0IG9SaWdodE1vc3RWaWV3O1xuXHRcdHRoaXMuZ2V0Um91dGVyKCkuYXR0YWNoRXZlbnRPbmNlKFwicm91dGVNYXRjaGVkXCIsIChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0b1JpZ2h0TW9zdFZpZXcgPSBfZ2V0Vmlld0Zyb21Db250YWluZXIob0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpW29FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2aWV3c1wiKS5sZW5ndGggLSAxXSk7XG5cdFx0XHRpZiAob1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGlvbiBmb3J3YXJkIGZyb20gTDIgdG8gdmlldyBsZXZlbCBMMyAoRnVsbFNjcmVlbkxheW91dCk6XG5cdFx0XHRcdGlmIChvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmIG9SaWdodE1vc3RWaWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsID09PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0XHRcdHRoaXMub0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uID0gb1JpZ2h0TW9zdFZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gTmF2aWdhdGlvbnMgYmFja3dhcmQgZnJvbSBMMyBkb3duIHRvIEwyLCBMMSwgTDAgKFRocmVlQ29sdW1uIGxheW91dCk6XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKSAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkLmdldFZpZXdEYXRhKCkudmlld0xldmVsIDwgdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgJiZcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZC5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWwgPiBvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbCAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3ICE9PSBvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbiA9IG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbjtcblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLm9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCh0aGlzLm9uQmVmb3JlUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hTdGF0ZUNoYW5nZSh0aGlzLm9uU3RhdGVDaGFuZ2VkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hBZnRlckVuZENvbHVtbk5hdmlnYXRlKHRoaXMub25TdGF0ZUNoYW5nZWQsIHRoaXMpO1xuXHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb24gPSBudWxsO1xuXHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiA9IG51bGw7XG5cblx0XHRCYXNlQ29udHJvbGxlci5wcm90b3R5cGUub25FeGl0LmJpbmQodGhpcykoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiB0aGUgRkNMIGNvbXBvbmVudCBpcyBlbmFibGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjaXNGY2xFbmFibGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNpbmNlIHdlIGFyZSBpbiBGQ0wgc2NlbmFyaW9cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aXNGY2xFbmFibGVkKCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0ZGlzcGxheU1lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IG9GQ0xDb250cm9sID0gdGhpcy5nZXRGY2xDb250cm9sKCk7XG5cblx0XHRpZiAodGhpcy5fb0ZDTENvbmZpZyAmJiBtUGFyYW1ldGVycy5GQ0xMZXZlbCA+PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCAtIDE7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmFNZXNzYWdlUGFnZXMpIHtcblx0XHRcdHRoaXMuYU1lc3NhZ2VQYWdlcyA9IFtudWxsLCBudWxsLCBudWxsXTtcblx0XHR9XG5cdFx0bGV0IG9NZXNzYWdlUGFnZSA9IHRoaXMuYU1lc3NhZ2VQYWdlc1ttUGFyYW1ldGVycy5GQ0xMZXZlbF07XG5cdFx0aWYgKCFvTWVzc2FnZVBhZ2UpIHtcblx0XHRcdG9NZXNzYWdlUGFnZSA9IG5ldyBNZXNzYWdlUGFnZSh7XG5cdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRpY29uOiBcInNhcC1pY29uOi8vbWVzc2FnZS1lcnJvclwiXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuYU1lc3NhZ2VQYWdlc1ttUGFyYW1ldGVycy5GQ0xMZXZlbF0gPSBvTWVzc2FnZVBhZ2U7XG5cblx0XHRcdHN3aXRjaCAobVBhcmFtZXRlcnMuRkNMTGV2ZWwpIHtcblx0XHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRcdG9GQ0xDb250cm9sLmFkZEJlZ2luQ29sdW1uUGFnZShvTWVzc2FnZVBhZ2UpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0XHRvRkNMQ29udHJvbC5hZGRNaWRDb2x1bW5QYWdlKG9NZXNzYWdlUGFnZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRvRkNMQ29udHJvbC5hZGRFbmRDb2x1bW5QYWdlKG9NZXNzYWdlUGFnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b01lc3NhZ2VQYWdlLnNldFRleHQoc0Vycm9yTWVzc2FnZSk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMudGVjaG5pY2FsTWVzc2FnZSkge1xuXHRcdFx0b01lc3NhZ2VQYWdlLnNldEN1c3RvbURlc2NyaXB0aW9uKFxuXHRcdFx0XHRuZXcgTGluayh7XG5cdFx0XHRcdFx0dGV4dDogbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gfHwgbVBhcmFtZXRlcnMudGVjaG5pY2FsTWVzc2FnZSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KG1QYXJhbWV0ZXJzLnRlY2huaWNhbE1lc3NhZ2UsIHtcblx0XHRcdFx0XHRcdFx0aWNvbjogSWNvbi5FUlJPUixcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLnRpdGxlLFxuXHRcdFx0XHRcdFx0XHRhY3Rpb25zOiBbQWN0aW9uLk9LXSxcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdEFjdGlvbjogQWN0aW9uLk9LLFxuXHRcdFx0XHRcdFx0XHRkZXRhaWxzOiBtUGFyYW1ldGVycy50ZWNobmljYWxEZXRhaWxzIHx8IFwiXCIsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnRXaWR0aDogXCI2MCVcIlxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9NZXNzYWdlUGFnZS5zZXREZXNjcmlwdGlvbihtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiB8fCBcIlwiKTtcblx0XHR9XG5cblx0XHQob0ZDTENvbnRyb2wgYXMgYW55KS50byhvTWVzc2FnZVBhZ2UuZ2V0SWQoKSk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIHRoZSBvYmplY3QgX29UYXJnZXRzQWdncmVnYXRpb24gdGhhdCBkZWZpbmVzIGZvciBlYWNoIHJvdXRlIHRoZSByZWxldmFudCBhZ2dyZWdhdGlvbiBhbmQgcGF0dGVybi5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2luaXRpYWxpemVUYXJnZXRBZ2dyZWdhdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0FwcENvbXBvbmVudF0gUmVmZXJlbmNlIHRvIHRoZSBBcHBDb21wb25lbnRcblx0ICovXG5cdF9pbml0aWFsaXplVGFyZ2V0QWdncmVnYXRpb24ob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0Y29uc3Qgb01hbmlmZXN0ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSxcblx0XHRcdG9UYXJnZXRzID0gb01hbmlmZXN0W1wic2FwLnVpNVwiXS5yb3V0aW5nID8gb01hbmlmZXN0W1wic2FwLnVpNVwiXS5yb3V0aW5nLnRhcmdldHMgOiBudWxsO1xuXG5cdFx0dGhpcy5fb1RhcmdldHNBZ2dyZWdhdGlvbiA9IHt9O1xuXG5cdFx0aWYgKG9UYXJnZXRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhvVGFyZ2V0cykuZm9yRWFjaCgoc1RhcmdldE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBvVGFyZ2V0ID0gb1RhcmdldHNbc1RhcmdldE5hbWVdO1xuXHRcdFx0XHRpZiAob1RhcmdldC5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHR0aGlzLl9vVGFyZ2V0c0FnZ3JlZ2F0aW9uW3NUYXJnZXROYW1lXSA9IHtcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uOiBvVGFyZ2V0LmNvbnRyb2xBZ2dyZWdhdGlvbixcblx0XHRcdFx0XHRcdHBhdHRlcm46IG9UYXJnZXQuY29udGV4dFBhdHRlcm5cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb25bc1RhcmdldE5hbWVdID0ge1xuXHRcdFx0XHRcdFx0YWdncmVnYXRpb246IFwicGFnZVwiLFxuXHRcdFx0XHRcdFx0cGF0dGVybjogbnVsbFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgcm91dGUgKGlkZW50aWZlZCBhcyBpdHMgcGF0dGVybikgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHNcblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2luaXRpYWxpemVSb3V0ZXNJbmZvcm1hdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IHJlZiB0byB0aGUgQXBwQ29tcG9uZW50XG5cdCAqL1xuXG5cdF9pbml0aWFsaXplUm91dGVzSW5mb3JtYXRpb24ob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0Y29uc3Qgb01hbmlmZXN0ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSxcblx0XHRcdGFSb3V0ZXMgPSBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcgPyBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcucm91dGVzIDogbnVsbDtcblxuXHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiA9IHt9O1xuXG5cdFx0aWYgKGFSb3V0ZXMpIHtcblx0XHRcdGFSb3V0ZXMuZm9yRWFjaCgocm91dGU6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0c0Zyb21Sb3V0ZVBhdHRlcm5bcm91dGUucGF0dGVybl0gPSByb3V0ZS50YXJnZXQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXJyZW50QXJndW1lbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc0N1cnJlbnRBcmd1bWVudHM7XG5cdH1cblxuXHRnZXRDdXJyZW50Um91dGVOYW1lKCkge1xuXHRcdHJldHVybiB0aGlzLnNDdXJyZW50Um91dGVOYW1lO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBGRSBGQ0wgY29uc3RhbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cblx0Z2V0Q29uc3RhbnRzKCkge1xuXHRcdHJldHVybiBDT05TVEFOVFM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0dGVyIGZvciBvVGFyZ2V0c0FnZ3JlZ2F0aW9uIGFycmF5LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNnZXRUYXJnZXRBZ2dyZWdhdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIF9vVGFyZ2V0c0FnZ3JlZ2F0aW9uIGFycmF5XG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Z2V0VGFyZ2V0QWdncmVnYXRpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdHJpZ2dlcmVkIGJ5IHRoZSByb3V0ZXIgUm91dGVNYXRjaGVkIGV2ZW50LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNvblJvdXRlTWF0Y2hlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnRcblx0ICovXG5cdG9uUm91dGVNYXRjaGVkKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYW1lXCIpO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgY3VycmVudC9wcmV2aW91cyByb3V0ZXMgYW5kIGFyZ3VtZW50c1xuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBzUm91dGVOYW1lO1xuXHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiYXJndW1lbnRzXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdHJpZ2dlcmluZyB0aGUgdGFibGUgc2Nyb2xsIHRvIHRoZSBuYXZpZ2F0ZWQgcm93IGFmdGVyIGVhY2ggbGF5b3V0IGNoYW5nZS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjc2Nyb2xsVG9MYXN0U2VsZWN0ZWRJdGVtXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKi9cblxuXHRfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKSB7XG5cdFx0Y29uc3QgYVZpZXdzID0gdGhpcy5fZ2V0QWxsVmlzaWJsZVZpZXdzKCk7XG5cdFx0Ly9UaGUgc2Nyb2xscyBhcmUgdHJpZ2dlcmVkIG9ubHkgaWYgdGhlIGxheW91dCBpcyB3aXRoIHNldmVyYWwgY29sdW1ucyBvciB3aGVuIHN3aXRjaGluZyB0aGUgbW9zdFJpZ2h0IGNvbHVtbiBpbiBmdWxsIHNjcmVlblxuXHRcdGlmIChhVmlld3MubGVuZ3RoID4gMSB8fCBhVmlld3NbMF0uZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWwgPCB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0bGV0IHNDdXJyZW50Vmlld1BhdGg7XG5cdFx0XHRjb25zdCBvQWRkaXRpb25hbFZpZXcgPSB0aGlzLmdldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24oKTtcblx0XHRcdGlmIChvQWRkaXRpb25hbFZpZXcgJiYgYVZpZXdzLmluZGV4T2Yob0FkZGl0aW9uYWxWaWV3KSA9PT0gLTEpIHtcblx0XHRcdFx0YVZpZXdzLnB1c2gob0FkZGl0aW9uYWxWaWV3KTtcblx0XHRcdH1cblx0XHRcdGZvciAobGV0IGluZGV4ID0gYVZpZXdzLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuXHRcdFx0XHRjb25zdCBvVmlldyA9IGFWaWV3c1tpbmRleF0sXG5cdFx0XHRcdFx0b1ByZXZpb3VzVmlldyA9IGFWaWV3c1tpbmRleCAtIDFdO1xuXHRcdFx0XHRpZiAob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRcdHNDdXJyZW50Vmlld1BhdGggPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldFBhdGgoKTtcblx0XHRcdFx0XHRvUHJldmlvdXNWaWV3LmdldENvbnRyb2xsZXIoKS5fc2Nyb2xsVGFibGVzVG9Sb3coc0N1cnJlbnRWaWV3UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdHJpZ2dlcmVkIGJ5IHRoZSBGQ0wgU3RhdGVDaGFuZ2VkIGV2ZW50LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNvblN0YXRlQ2hhbmdlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnRcblx0ICovXG5cdG9uU3RhdGVDaGFuZ2VkKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3QgYklzTmF2aWdhdGlvbkFycm93ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlzTmF2aWdhdGlvbkFycm93XCIpO1xuXHRcdGlmICh0aGlzLnNDdXJyZW50QXJndW1lbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdKSB7XG5cdFx0XHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHNbdGhpcy5TUVVFUllLRVlOQU1FXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdLmxheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJsYXlvdXRcIik7XG5cdFx0fVxuXHRcdHRoaXMuX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyhvRXZlbnQpO1xuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgVVJMIHdpdGggdGhlIG5ldyBsYXlvdXQgaWYgYSBuYXZpZ2F0aW9uIGFycm93IHdhcyB1c2VkXG5cdFx0aWYgKGJJc05hdmlnYXRpb25BcnJvdykge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvKHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUsIHRoaXMuc0N1cnJlbnRBcmd1bWVudHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaXJlIE1vZGVsQ29udGV4dENoYW5nZSBldmVudCBvbiBhbGwgYnJlYWRjcnVtYnMgKCBvbiBlYWNoIE9iamVjdFBhZ2VzKS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1ic1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnRcblx0ICovXG5cdF9mb3JjZU1vZGVsQ29udGV4dENoYW5nZU9uQnJlYWRDcnVtYnMob0V2ZW50OiBhbnkpIHtcblx0XHQvL2ZvcmNlIG1vZGVsY29udGV4dGNoYW5nZSBvbiBPYmplY3RQYWdlcyB0byByZWZyZXNoIHRoZSBicmVhZGNydW1icyBsaW5rIGhyZWZzXG5cdFx0Y29uc3Qgb0ZjbCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRsZXQgb1BhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdG9QYWdlcyA9IG9QYWdlcy5jb25jYXQob0ZjbC5nZXRCZWdpbkNvbHVtblBhZ2VzKCkpLmNvbmNhdChvRmNsLmdldE1pZENvbHVtblBhZ2VzKCkpLmNvbmNhdChvRmNsLmdldEVuZENvbHVtblBhZ2VzKCkpO1xuXHRcdG9QYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChvUGFnZTogYW55KSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IF9nZXRWaWV3RnJvbUNvbnRhaW5lcihvUGFnZSk7XG5cdFx0XHRjb25zdCBvQnJlYWRDcnVtYnMgPSBvVmlldy5ieUlkICYmIG9WaWV3LmJ5SWQoXCJicmVhZGNydW1ic1wiKTtcblx0XHRcdGlmIChvQnJlYWRDcnVtYnMpIHtcblx0XHRcdFx0b0JyZWFkQ3J1bWJzLmZpcmVNb2RlbENvbnRleHRDaGFuZ2UoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0cmlnZ2VyZWQgdG8gdXBkYXRlIHRoZSBTaGFyZSBidXR0b24gVmlzaWJpbGl0eS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2aWV3Q29sdW1uIE5hbWUgb2YgdGhlIGN1cnJlbnQgY29sdW1uIChcImJlZ2luQ29sdW1uXCIsIFwibWlkQ29sdW1uXCIsIFwiZW5kQ29sdW1uXCIpXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTGF5b3V0IFRoZSBjdXJyZW50IGxheW91dCB1c2VkIGJ5IHRoZSBGQ0xcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRfdXBkYXRlU2hhcmVCdXR0b25WaXNpYmlsaXR5KHZpZXdDb2x1bW46IHN0cmluZywgc0xheW91dDogc3RyaW5nKSB7XG5cdFx0bGV0IGJTaG93U2hhcmVJY29uO1xuXHRcdHN3aXRjaCAoc0xheW91dCkge1xuXHRcdFx0Y2FzZSBcIk9uZUNvbHVtblwiOlxuXHRcdFx0XHRiU2hvd1NoYXJlSWNvbiA9IHZpZXdDb2x1bW4gPT09IFwiYmVnaW5Db2x1bW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiOlxuXHRcdFx0Y2FzZSBcIlRocmVlQ29sdW1uc0JlZ2luRXhwYW5kZWRFbmRIaWRkZW5cIjpcblx0XHRcdGNhc2UgXCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlblwiOlxuXHRcdFx0Y2FzZSBcIlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkXCI6XG5cdFx0XHRjYXNlIFwiVHdvQ29sdW1uc01pZEV4cGFuZGVkXCI6XG5cdFx0XHRcdGJTaG93U2hhcmVJY29uID0gdmlld0NvbHVtbiA9PT0gXCJtaWRDb2x1bW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRW5kQ29sdW1uRnVsbFNjcmVlblwiOlxuXHRcdFx0Y2FzZSBcIlRocmVlQ29sdW1uc0VuZEV4cGFuZGVkXCI6XG5cdFx0XHRjYXNlIFwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRcIjpcblx0XHRcdFx0YlNob3dTaGFyZUljb24gPSB2aWV3Q29sdW1uID09PSBcImVuZENvbHVtblwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJTaG93U2hhcmVJY29uID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBiU2hvd1NoYXJlSWNvbjtcblx0fVxuXG5cdHVwZGF0ZVVJU3RhdGVGb3JWaWV3KG9WaWV3OiBhbnksIEZDTExldmVsOiBhbnkpIHtcblx0XHRjb25zdCBvVUlTdGF0ZSA9IHRoaXMuZ2V0SGVscGVyKCkuZ2V0Q3VycmVudFVJU3RhdGUoKSBhcyBhbnksXG5cdFx0XHRvRmNsQ29sTmFtZSA9IFtcImJlZ2luQ29sdW1uXCIsIFwibWlkQ29sdW1uXCIsIFwiZW5kQ29sdW1uXCJdLFxuXHRcdFx0c0xheW91dCA9IHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpO1xuXHRcdGxldCB2aWV3Q29sdW1uO1xuXG5cdFx0aWYgKCFvVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKSkge1xuXHRcdFx0b1ZpZXcuc2V0TW9kZWwodGhpcy5fY3JlYXRlSGVscGVyTW9kZWwoKSwgXCJmY2xoZWxwZXJcIik7XG5cdFx0fVxuXHRcdGlmIChGQ0xMZXZlbCA+PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXMgb24gYSBsZXZlbCA+IG1heCBudW1iZXIgb2YgY29sdW1ucy4gSXQncyBhbHdheXMgZnVsbHNjcmVlbiB3aXRob3V0IGNsb3NlL2V4aXQgYnV0dG9uc1xuXHRcdFx0dmlld0NvbHVtbiA9IG9GY2xDb2xOYW1lW3RoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50IC0gMV07XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZXhpdEZ1bGxTY3JlZW4gPSBudWxsO1xuXHRcdFx0b1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm8ubWlkQ29sdW1uLmNsb3NlQ29sdW1uID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLmVuZENvbHVtbi5leGl0RnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5lbmRDb2x1bW4uZnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5lbmRDb2x1bW4uY2xvc2VDb2x1bW4gPSBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2aWV3Q29sdW1uID0gb0ZjbENvbE5hbWVbRkNMTGV2ZWxdO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdEZDTExldmVsID49IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50IHx8XG5cdFx0XHRzTGF5b3V0ID09PSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIiB8fFxuXHRcdFx0c0xheW91dCA9PT0gXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIgfHxcblx0XHRcdHNMYXlvdXQgPT09IFwiT25lQ29sdW1uXCJcblx0XHQpIHtcblx0XHRcdG9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLnNldFByb3BlcnR5KFwiL2JyZWFkQ3J1bWJJc1Zpc2libGVcIiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLnNldFByb3BlcnR5KFwiL2JyZWFkQ3J1bWJJc1Zpc2libGVcIiwgZmFsc2UpO1xuXHRcdH1cblx0XHQvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgRkNMSGVscGVyIGRvZXNuJ3QgcHJvdmlkZSBhY3Rpb25CdXR0b24gdmFsdWVzIGZvciB0aGUgZmlyc3QgY29sdW1uXG5cdFx0Ly8gc28gd2UgaGF2ZSB0byBhZGQgdGhpcyBpbmZvIG1hbnVhbGx5XG5cdFx0b1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm8uYmVnaW5Db2x1bW4gPSB7IGZ1bGxTY3JlZW46IG51bGwsIGV4aXRGdWxsU2NyZWVuOiBudWxsLCBjbG9zZUNvbHVtbjogbnVsbCB9O1xuXG5cdFx0Y29uc3Qgb0FjdGlvbkJ1dHRvbkluZm9zID0gT2JqZWN0LmFzc2lnbih7fSwgb1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm9bdmlld0NvbHVtbl0pO1xuXHRcdG9BY3Rpb25CdXR0b25JbmZvcy5zd2l0Y2hWaXNpYmxlID0gb0FjdGlvbkJ1dHRvbkluZm9zLmZ1bGxTY3JlZW4gIT09IG51bGwgfHwgb0FjdGlvbkJ1dHRvbkluZm9zLmV4aXRGdWxsU2NyZWVuICE9PSBudWxsO1xuXHRcdG9BY3Rpb25CdXR0b25JbmZvcy5zd2l0Y2hJY29uID0gb0FjdGlvbkJ1dHRvbkluZm9zLmZ1bGxTY3JlZW4gIT09IG51bGwgPyBcInNhcC1pY29uOi8vZnVsbC1zY3JlZW5cIiA6IFwic2FwLWljb246Ly9leGl0LWZ1bGwtc2NyZWVuXCI7XG5cdFx0b0FjdGlvbkJ1dHRvbkluZm9zLmlzRnVsbFNjcmVlbiA9IG9BY3Rpb25CdXR0b25JbmZvcy5mdWxsU2NyZWVuID09PSBudWxsO1xuXG5cdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm9cIiwgb0FjdGlvbkJ1dHRvbkluZm9zKTtcblxuXHRcdG9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLnNldFByb3BlcnR5KFwiL3Nob3dTaGFyZUljb25cIiwgdGhpcy5fdXBkYXRlU2hhcmVCdXR0b25WaXNpYmlsaXR5KHZpZXdDb2x1bW4sIHNMYXlvdXQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0cmlnZ2VyZWQgYnkgdGhlIHJvdXRlciBCZWZvcmVSb3V0ZU1hdGNoZWQgZXZlbnQuXG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyI29uQmVmb3JlUm91dGVNYXRjaGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcGFyYW0geyp9IG9FdmVudFxuXHQgKi9cblx0b25CZWZvcmVSb3V0ZU1hdGNoZWQob0V2ZW50OiBhbnkpIHtcblx0XHRpZiAob0V2ZW50KSB7XG5cdFx0XHRjb25zdCBvUXVlcnlQYXJhbXMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpLmFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdO1xuXHRcdFx0bGV0IHNMYXlvdXQgPSBvUXVlcnlQYXJhbXMgPyBvUXVlcnlQYXJhbXMubGF5b3V0IDogbnVsbDtcblxuXHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm8gbGF5b3V0IHBhcmFtZXRlciwgcXVlcnkgZm9yIHRoZSBkZWZhdWx0IGxldmVsIDAgbGF5b3V0IChub3JtYWxseSBPbmVDb2x1bW4pXG5cdFx0XHRpZiAoIXNMYXlvdXQpIHtcblx0XHRcdFx0Y29uc3Qgb05leHRVSVN0YXRlID0gdGhpcy5nZXRIZWxwZXIoKS5nZXROZXh0VUlTdGF0ZSgwKTtcblx0XHRcdFx0c0xheW91dCA9IG9OZXh0VUlTdGF0ZS5sYXlvdXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrIGlmIHRoZSBsYXlvdXQgaWYgY29tcGF0aWJsZSB3aXRoIHRoZSBudW1iZXIgb2YgdGFyZ2V0c1xuXHRcdFx0Ly8gVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlIGZvciBub3JtYWwgbmF2aWdhdGlvbiwganVzdCBuZWVkZWQgaW4gY2FzZVxuXHRcdFx0Ly8gdGhlIFVSTCBoYXMgYmVlbiBtYW51YWxseSBtb2RpZmllZFxuXHRcdFx0Y29uc3QgYVRhcmdldHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29uZmlnXCIpLnRhcmdldDtcblx0XHRcdHNMYXlvdXQgPSB0aGlzLl9jb3JyZWN0TGF5b3V0Rm9yVGFyZ2V0cyhzTGF5b3V0LCBhVGFyZ2V0cyk7XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgbGF5b3V0IG9mIHRoZSBGbGV4aWJsZUNvbHVtbkxheW91dFxuXHRcdFx0aWYgKHNMYXlvdXQpIHtcblx0XHRcdFx0dGhpcy5nZXRGY2xDb250cm9sKCkuc2V0TGF5b3V0KHNMYXlvdXQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgZm9yIHRoZSBGQ0wgQ29tcG9uZW50LlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNnZXRIZWxwZXJcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEluc3RhbmNlIG9mIGEgc2VtYW50aWMgaGVscGVyXG5cdCAqL1xuXHRnZXRIZWxwZXIoKSB7XG5cdFx0cmV0dXJuIEZsZXhpYmxlQ29sdW1uTGF5b3V0U2VtYW50aWNIZWxwZXIuZ2V0SW5zdGFuY2VGb3IodGhpcy5nZXRGY2xDb250cm9sKCksIHRoaXMuX29GQ0xDb25maWcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIEZDTCBsYXlvdXQgZm9yIGEgZ2l2ZW4gRkNMIGxldmVsIGFuZCBhIHRhcmdldCBoYXNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gaU5leHRGQ0xMZXZlbCBGQ0wgbGV2ZWwgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHNQcm9wb3NlZExheW91dCBUaGUgcHJvcG9zZWQgbGF5b3V0XG5cdCAqIEBwYXJhbSBrZWVwQ3VycmVudExheW91dCBUcnVlIGlmIHdlIHdhbnQgdG8ga2VlcCB0aGUgY3VycmVudCBsYXlvdXQgaWYgcG9zc2libGVcblx0ICogQHJldHVybnMge29iamVjdH1cblx0ICovXG5cdGNhbGN1bGF0ZUxheW91dChpTmV4dEZDTExldmVsOiBudW1iZXIsIHNIYXNoOiBzdHJpbmcsIHNQcm9wb3NlZExheW91dDogc3RyaW5nIHwgdW5kZWZpbmVkLCBrZWVwQ3VycmVudExheW91dDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuXHRcdC8vIEZpcnN0LCBhc2sgdGhlIEZDTCBoZWxwZXIgdG8gY2FsY3VsYXRlIHRoZSBsYXlvdXQgaWYgbm90aGluZyBpcyBwcm9wb3NlZFxuXHRcdGlmICghc1Byb3Bvc2VkTGF5b3V0KSB7XG5cdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBrZWVwQ3VycmVudExheW91dCA/IHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpIDogdGhpcy5nZXRIZWxwZXIoKS5nZXROZXh0VUlTdGF0ZShpTmV4dEZDTExldmVsKS5sYXlvdXQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlbiBjaGFuZ2UgdGhpcyB2YWx1ZSBpZiBuZWNlc3NhcnksIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgdGFyZ2V0c1xuXHRcdGNvbnN0IG9Sb3V0ZSA9ICh0aGlzLmdldFJvdXRlcigpIGFzIGFueSkuZ2V0Um91dGVCeUhhc2goc0hhc2ggKyBcIj9sYXlvdXQ9XCIgKyBzUHJvcG9zZWRMYXlvdXQpO1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gdGhpcy5fb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuW29Sb3V0ZS5nZXRQYXR0ZXJuKCldO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzKHNQcm9wb3NlZExheW91dCwgYVRhcmdldHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gRkNMIGxheW91dCBpcyBjb21wYXRpYmxlIHdpdGggYW4gYXJyYXkgb2YgdGFyZ2V0cy5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBzUHJvcG9zZWRMYXlvdXQgUHJvcG9zZWQgdmFsdWUgZm9yIHRoZSBGQ0wgbGF5b3V0XG5cdCAqIEBwYXJhbSB7Kn0gYVRhcmdldHMgQXJyYXkgb2YgdGFyZ2V0IG5hbWVzIHVzZWQgZm9yIGNoZWNraW5nXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb3JyZWN0ZWQgbGF5b3V0XG5cdCAqL1xuXHRfY29ycmVjdExheW91dEZvclRhcmdldHMoc1Byb3Bvc2VkTGF5b3V0OiBhbnksIGFUYXJnZXRzOiBhbnkpIHtcblx0XHRjb25zdCBhbGxBbGxvd2VkTGF5b3V0czogYW55ID0ge1xuXHRcdFx0XCIyXCI6IFtcIlR3b0NvbHVtbnNNaWRFeHBhbmRlZFwiLCBcIlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkXCIsIFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiXSxcblx0XHRcdFwiM1wiOiBbXG5cdFx0XHRcdFwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRcIixcblx0XHRcdFx0XCJUaHJlZUNvbHVtbnNFbmRFeHBhbmRlZFwiLFxuXHRcdFx0XHRcIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuXCIsXG5cdFx0XHRcdFwiVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlblwiLFxuXHRcdFx0XHRcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIixcblx0XHRcdFx0XCJFbmRDb2x1bW5GdWxsU2NyZWVuXCJcblx0XHRcdF1cblx0XHR9O1xuXG5cdFx0aWYgKGFUYXJnZXRzICYmICFBcnJheS5pc0FycmF5KGFUYXJnZXRzKSkge1xuXHRcdFx0Ly8gVG8gc3VwcG9ydCBzaW5nbGUgdGFyZ2V0IGFzIGEgc3RyaW5nIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0YVRhcmdldHMgPSBbYVRhcmdldHNdO1xuXHRcdH1cblxuXHRcdGlmICghYVRhcmdldHMpIHtcblx0XHRcdC8vIERlZmVuc2l2ZSwganVzdCBpbiBjYXNlLi4uXG5cdFx0XHRyZXR1cm4gc1Byb3Bvc2VkTGF5b3V0O1xuXHRcdH0gZWxzZSBpZiAoYVRhcmdldHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gTW9yZSB0aGFuIDEgdGFyZ2V0OiBqdXN0IHNpbXBseSBjaGVjayBmcm9tIHRoZSBhbGxvd2VkIHZhbHVlc1xuXHRcdFx0Y29uc3QgYUxheW91dHMgPSBhbGxBbGxvd2VkTGF5b3V0c1thVGFyZ2V0cy5sZW5ndGhdO1xuXHRcdFx0aWYgKGFMYXlvdXRzLmluZGV4T2Yoc1Byb3Bvc2VkTGF5b3V0KSA8IDApIHtcblx0XHRcdFx0Ly8gVGhlIHByb3Bvc2VkIGxheW91dCBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlIG51bWJlciBvZiBjb2x1bW5zXG5cdFx0XHRcdC8vIC0tPiBBc2sgdGhlIGhlbHBlciBmb3IgdGhlIGRlZmF1bHQgbGF5b3V0IGZvciB0aGUgbnVtYmVyIG9mIGNvbHVtbnNcblx0XHRcdFx0c1Byb3Bvc2VkTGF5b3V0ID0gYUxheW91dHNbMF07IC8vdGhpcy5nZXRIZWxwZXIoKS5nZXROZXh0VUlTdGF0ZShhVGFyZ2V0cy5sZW5ndGggLSAxKS5sYXlvdXQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE9ubHkgb25lIHRhcmdldFxuXHRcdFx0Y29uc3Qgc1RhcmdldEFnZ3JlZ2F0aW9uID0gdGhpcy5nZXRUYXJnZXRBZ2dyZWdhdGlvbigpW2FUYXJnZXRzWzBdXS5hZ2dyZWdhdGlvbiB8fCB0aGlzLl9vRkNMQ29uZmlnLmRlZmF1bHRDb250cm9sQWdncmVnYXRpb247XG5cdFx0XHRzd2l0Y2ggKHNUYXJnZXRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiYmVnaW5Db2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdHNQcm9wb3NlZExheW91dCA9IFwiT25lQ29sdW1uXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJtaWRDb2x1bW5QYWdlc1wiOlxuXHRcdFx0XHRcdHNQcm9wb3NlZExheW91dCA9IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiZW5kQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc1Byb3Bvc2VkTGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmlzaWJsZSB2aWV3cyBpbiB0aGUgRkNMIGNvbXBvbmVudC5cblx0ICogc0xheW91dCBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdmVyeSBzcGVjaWZpYyBhcyBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgbGF0ZXN0IG5hdmlnYXRlZCByb3dcblx0ICpcblx0ICogQHBhcmFtIHsqfSBzTGF5b3V0IExheW91dCB0aGF0IHdhcyBhcHBsaWVkIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IG5hdmlnYXRpb25cblx0ICogQHJldHVybnMge0FycmF5fSByZXR1cm4gdmlld3Ncblx0ICovXG5cblx0X2dldEFsbFZpc2libGVWaWV3cyhzTGF5b3V0PzogYW55KSB7XG5cdFx0Y29uc3QgYVZpZXdzID0gW107XG5cdFx0c0xheW91dCA9ICEhc0xheW91dCA/IHNMYXlvdXQgOiB0aGlzLmdldEZjbENvbnRyb2woKS5nZXRMYXlvdXQoKTtcblx0XHRzd2l0Y2ggKHNMYXlvdXQpIHtcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5FbmRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5NaWRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5PbmVDb2x1bW46XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNFbmRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuVHdvQ29sdW1uc0JlZ2luRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVHdvQ29sdW1uc01pZEV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlRocmVlQ29sdW1uc0JlZ2luRXhwYW5kZWRFbmRIaWRkZW46XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cuZXJyb3IoXCJVbmhhbmRsZWQgc3dpdGNoIGNhc2UgZm9yIFwiICsgdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhVmlld3M7XG5cdH1cblxuXHRvbkNvbnRhaW5lclJlYWR5KCkge1xuXHRcdC8vIFJlc3RvcmUgdmlld3MgaWYgbmVjY2Vzc2FyeS5cblx0XHRjb25zdCBhVmlld3MgPSB0aGlzLl9nZXRBbGxWaXNpYmxlVmlld3MoKTtcblx0XHRjb25zdCBhUmVzdG9yZVByb21pc2VzOiBhbnlbXSA9IFtdO1xuXHRcdGFWaWV3cy5yZWR1Y2UoZnVuY3Rpb24gKGFQcm9taXNlczogYW55LCBvVGFyZ2V0VmlldzogYW55KSB7XG5cdFx0XHRhUHJvbWlzZXMucHVzaChLZWVwQWxpdmVIZWxwZXIucmVzdG9yZVZpZXcob1RhcmdldFZpZXcpKTtcblx0XHRcdHJldHVybiBhUHJvbWlzZXM7XG5cdFx0fSwgYVJlc3RvcmVQcm9taXNlcyk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXN0b3JlUHJvbWlzZXMpO1xuXHR9XG5cblx0Z2V0UmlnaHRtb3N0Q29udGV4dCgpIHtcblx0XHRsZXQgb0NvbnRleHQ7XG5cdFx0c3dpdGNoICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRMYXlvdXQoKSkge1xuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLk9uZUNvbHVtbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdG9Db250ZXh0ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRvQ29udGV4dCA9IF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWRFbmRIaWRkZW46XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlbjpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5FbmRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdG9Db250ZXh0ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5NaWRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHQvLyBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBtaWQgY29sdW1uIGZ1bGxzY3JlZW4gY29tZXMgZnJvbSBhIDIgb3IgYSAzIGNvbHVtbiBsYXlvdXRcblx0XHRcdFx0Y29uc3Qgc0xheW91dFdoZW5FeGl0RnVsbFNjcmVlbiA9ICh0aGlzLmdldEhlbHBlcigpLmdldEN1cnJlbnRVSVN0YXRlKCkgYXMgYW55KS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZXhpdEZ1bGxTY3JlZW47XG5cdFx0XHRcdGlmIChzTGF5b3V0V2hlbkV4aXRGdWxsU2NyZWVuLmluZGV4T2YoXCJUaHJlZUNvbHVtblwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0Ly8gV2UgY29tZSBmcm9tIGEgMyBjb2x1bW4gbGF5b3V0XG5cdFx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFdlIGNvbWUgZnJvbSBhIDIgY29sdW1uIGxheW91dFxuXHRcdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dCA9IF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0TG9nLmVycm9yKFwiVW5oYW5kbGVkIHN3aXRjaCBjYXNlIGZvciBcIiArIHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmNsQ29udHJvbGxlcjtcbiJdfQ==
|