@sapui5/sap.fe.templates 1.99.0 → 1.101.1

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