@sapui5/sap.fe.templates 1.98.0 → 1.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/package.json +9 -6
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +25 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +31 -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 +157 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +83 -39
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +124 -107
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +34 -27
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1112 -1001
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +55 -53
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +135 -136
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +444 -406
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -0
  24. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +31 -23
  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 +479 -473
  29. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
  30. package/src/sap/fe/templates/ObjectPage/Component.js +170 -149
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +141 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +14 -53
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1531 -1464
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -0
  37. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +137 -95
  38. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +25 -21
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +99 -53
  42. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  43. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +21 -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 +51 -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 +35 -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 +16 -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 +12 -11
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  53. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +56 -52
  54. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +16 -17
  56. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +14 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +24 -21
  60. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +311 -317
  62. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +67 -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 +3 -3
  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 +9 -5
  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/Heading.fragment.xml +33 -0
  74. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +17 -0
  75. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +18 -0
  76. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +3 -3
  77. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +3 -3
  78. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  79. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +852 -815
  80. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -0
  81. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +206 -187
  82. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  83. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +485 -459
  84. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  85. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +17 -14
  86. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  87. package/src/sap/fe/templates/TableScroller.js +46 -53
  88. package/src/sap/fe/templates/TableScroller.ts +48 -0
  89. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  90. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +22 -0
  91. package/src/sap/fe/templates/library.js +50 -63
  92. package/src/sap/fe/templates/library.ts +57 -0
  93. package/src/sap/fe/templates/messagebundle.properties +32 -36
  94. package/src/sap/fe/templates/messagebundle_ar.properties +15 -8
  95. package/src/sap/fe/templates/messagebundle_bg.properties +15 -8
  96. package/src/sap/fe/templates/messagebundle_ca.properties +15 -8
  97. package/src/sap/fe/templates/messagebundle_cs.properties +15 -8
  98. package/src/sap/fe/templates/messagebundle_cy.properties +15 -8
  99. package/src/sap/fe/templates/messagebundle_da.properties +15 -8
  100. package/src/sap/fe/templates/messagebundle_de.properties +15 -8
  101. package/src/sap/fe/templates/messagebundle_el.properties +16 -9
  102. package/src/sap/fe/templates/messagebundle_en.properties +15 -8
  103. package/src/sap/fe/templates/messagebundle_en_GB.properties +15 -8
  104. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +9 -6
  105. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +15 -8
  106. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +15 -8
  107. package/src/sap/fe/templates/messagebundle_es.properties +15 -8
  108. package/src/sap/fe/templates/messagebundle_es_MX.properties +15 -8
  109. package/src/sap/fe/templates/messagebundle_et.properties +15 -8
  110. package/src/sap/fe/templates/messagebundle_fi.properties +15 -8
  111. package/src/sap/fe/templates/messagebundle_fr.properties +15 -8
  112. package/src/sap/fe/templates/messagebundle_fr_CA.properties +15 -8
  113. package/src/sap/fe/templates/messagebundle_hi.properties +15 -8
  114. package/src/sap/fe/templates/messagebundle_hr.properties +16 -9
  115. package/src/sap/fe/templates/messagebundle_hu.properties +15 -8
  116. package/src/sap/fe/templates/messagebundle_id.properties +17 -10
  117. package/src/sap/fe/templates/messagebundle_it.properties +15 -8
  118. package/src/sap/fe/templates/messagebundle_iw.properties +15 -8
  119. package/src/sap/fe/templates/messagebundle_ja.properties +15 -8
  120. package/src/sap/fe/templates/messagebundle_kk.properties +15 -8
  121. package/src/sap/fe/templates/messagebundle_ko.properties +15 -8
  122. package/src/sap/fe/templates/messagebundle_lt.properties +15 -8
  123. package/src/sap/fe/templates/messagebundle_lv.properties +15 -8
  124. package/src/sap/fe/templates/messagebundle_ms.properties +15 -8
  125. package/src/sap/fe/templates/messagebundle_nl.properties +15 -8
  126. package/src/sap/fe/templates/messagebundle_no.properties +15 -8
  127. package/src/sap/fe/templates/messagebundle_pl.properties +15 -8
  128. package/src/sap/fe/templates/messagebundle_pt.properties +18 -11
  129. package/src/sap/fe/templates/messagebundle_pt_PT.properties +16 -9
  130. package/src/sap/fe/templates/messagebundle_ro.properties +15 -8
  131. package/src/sap/fe/templates/messagebundle_ru.properties +15 -8
  132. package/src/sap/fe/templates/messagebundle_sh.properties +15 -8
  133. package/src/sap/fe/templates/messagebundle_sk.properties +15 -8
  134. package/src/sap/fe/templates/messagebundle_sl.properties +15 -8
  135. package/src/sap/fe/templates/messagebundle_sv.properties +16 -9
  136. package/src/sap/fe/templates/messagebundle_th.properties +15 -8
  137. package/src/sap/fe/templates/messagebundle_tr.properties +15 -8
  138. package/src/sap/fe/templates/messagebundle_uk.properties +16 -9
  139. package/src/sap/fe/templates/messagebundle_vi.properties +15 -8
  140. package/src/sap/fe/templates/messagebundle_zh_CN.properties +15 -8
  141. package/src/sap/fe/templates/messagebundle_zh_TW.properties +15 -8
  142. package/ui5.yaml +0 -3
  143. package/src/sap/fe/templates/ListReport/overrides/MassEdit.js +0 -95
  144. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.xml +0 -49
@@ -1,461 +1,487 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(
6
- [
7
- "sap/ui/model/json/JSONModel",
8
- "sap/fe/core/BaseController",
9
- "sap/ui/core/Component",
10
- "sap/ui/core/routing/HashChanger",
11
- "sap/fe/core/CommonUtils",
12
- "sap/fe/macros/SizeHelper",
13
- "sap/ui/model/odata/v4/AnnotationHelper",
14
- "sap/ui/base/BindingParser",
15
- "sap/base/Log",
16
- "sap/fe/core/controllerextensions/Placeholder"
17
- ],
18
- function(
19
- JSONModel,
20
- BaseController,
21
- Component,
22
- HashChanger,
23
- CommonUtils,
24
- SizeHelper,
25
- AnnotationHelper,
26
- BindingParser,
27
- Log,
28
- Placeholder
29
- ) {
30
- "use strict";
31
-
32
- /**
33
- @class Internal base controller class for SAP Fiori elements application.
34
- *
35
- * If you want to extend a base controller for your application, please use for sap.fe.templates.RootContainer.controller.Fcl or sap.fe.templates.RootContainer.controller.NavContainer
36
- *
37
- * @hideconstructor
38
- * @public
39
- * @name sap.fe.templates.RootContainer.controller.RootContainerBaseController
40
- */
41
- return BaseController.extend("sap.fe.templates.RootContainer.controller.RootContainerBaseController", {
42
- oPlaceholder: Placeholder,
43
- onInit: function() {
44
- SizeHelper.init();
45
-
46
- this._aHelperModels = [];
47
- },
48
-
49
- getPlaceholder: function() {
50
- return this.oPlaceholder;
51
- },
52
- attachRouteMatchers: function() {
53
- this.oPlaceholder.attachRouteMatchers();
54
- this.getAppComponent()
55
- .getRoutingService()
56
- .attachAfterRouteMatched(this._onAfterRouteMatched, this);
57
- },
58
- onExit: function() {
59
- this.getAppComponent()
60
- .getRoutingService()
61
- .detachAfterRouteMatched(this._onAfterRouteMatched, this);
62
- this.oRouter = null;
63
-
64
- SizeHelper.exit();
65
-
66
- // Destroy all JSON models created dynamically for the views
67
- this._aHelperModels.forEach(function(oModel) {
68
- oModel.destroy();
69
- });
70
- },
71
- /**
72
- * Convenience method for getting the resource bundle.
73
- *
74
- * @public
75
- * @returns {sap.ui.model.resource.ResourceModel} The resourceModel of the component
76
- */
77
- getResourceBundle: function() {
78
- return this.getOwnerComponent()
79
- .getModel("i18n")
80
- .getResourceBundle();
81
- },
82
- getRouter: function() {
83
- if (!this.oRouter) {
84
- this.oRouter = this.getAppComponent().getRouter();
85
- }
86
-
87
- return this.oRouter;
88
- },
89
-
90
- _createHelperModel: function() {
91
- // We keep a reference on the models created dynamically, as they don't get destroyed
92
- // automatically when the view is destroyed.
93
- // This is done during onExit
94
- var oModel = new JSONModel();
95
- this._aHelperModels.push(oModel);
96
-
97
- return oModel;
98
- },
99
-
100
- /**
101
- * Function waiting for the Right most view to be ready.
102
- *
103
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
104
- * @param {*} oEvent Reference an Event parameter coming from routeMatched event
105
- * @returns {Promise}
106
- */
107
- waitForRightMostViewReady: function(oEvent) {
108
- return new Promise(function(resolve) {
109
- var aContainers = oEvent.getParameter("views"),
110
- // There can also be reuse components in the view, remove them before processing.
111
- aFEContainers = [];
112
- aContainers.forEach(function(oContainer) {
113
- var oView = oContainer;
114
- if (oContainer && oContainer.getComponentInstance) {
115
- var oComponentInstance = oContainer.getComponentInstance();
116
- oView = oComponentInstance.getRootControl();
117
- }
118
- if (oView && oView.getController() && oView.getController().pageReady) {
119
- aFEContainers.push(oView);
120
- }
121
- });
122
- var oRightMostFEView = aFEContainers[aFEContainers.length - 1];
123
- if (oRightMostFEView && oRightMostFEView.getController().pageReady.isPageReady()) {
124
- resolve(oRightMostFEView);
125
- } else {
126
- oRightMostFEView &&
127
- oRightMostFEView.getController().pageReady.attachEventOnce("pageReady", function() {
128
- resolve(oRightMostFEView);
129
- });
130
- }
131
- });
132
- },
133
-
134
- /**
135
- * Callback when the navigation is done.
136
- * - update the shell title.
137
- * - update table scroll.
138
- * - call onPageReady on the rightMostView.
139
- *
140
- * @param oEvent
141
- * @name sap.fe.templates.RootContainer.controller.BaseController#_onAfterRouteMatched
142
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
143
- */
144
- _onAfterRouteMatched: function(oEvent) {
145
- var that = this;
146
- if (!that._oRouteMatchedPromise) {
147
- that._oRouteMatchedPromise = that
148
- .waitForRightMostViewReady(oEvent)
149
- .then(function(oView) {
150
- // The autoFocus is initially disabled on the navContainer or the FCL, so that the focus stays on the Shell menu
151
- // even if the app takes a long time to launch
152
- // The first time the view is displayed, we need to enable the autofocus so that it's managed properly during navigation
153
- var oRootControl = that.getView().getContent()[0];
154
- if (oRootControl && oRootControl.getAutoFocus && !oRootControl.getAutoFocus()) {
155
- oRootControl.setProperty("autoFocus", true, true); // Do not mark the container as invalid, otherwise it's re-rendered
156
- }
157
-
158
- var oAppComponent = that.getAppComponent();
159
- that._scrollTablesToLastNavigatedItems();
160
- if (oAppComponent.getEnvironmentCapabilities().getCapabilities().UShell) {
161
- that._computeTitleHierarchy(oView);
162
- }
163
- var bForceFocus = oAppComponent.getRouterProxy().isFocusForced();
164
- oAppComponent.getRouterProxy().setFocusForced(false); // reset
165
- if (oView.getController() && oView.getController().onPageReady && oView.getParent().onPageReady) {
166
- oView.getParent().onPageReady({ forceFocus: bForceFocus });
167
- }
168
- if (that.onContainerReady) {
169
- that.onContainerReady();
170
- }
171
- })
172
- .catch(function(oError) {
173
- Log.error("An error occurs while computing the title hierarchy and calling focus method", oError);
174
- })
175
- .finally(function() {
176
- that._oRouteMatchedPromise = null;
177
- });
178
- }
179
- },
180
-
181
- /**
182
- * This function returns the TitleHierarchy cache ( or initializes it if undefined).
183
- *
184
- * @name sap.fe.templates.RootContainer.controller.BaseController#_getTitleHierarchyCache
185
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
186
- *
187
- * @returns {object} The TitleHierarchy cache
188
- */
189
- _getTitleHierarchyCache: function() {
190
- if (!this.oTitleHierarchyCache) {
191
- this.oTitleHierarchyCache = {};
192
- }
193
- return this.oTitleHierarchyCache;
194
- },
195
-
196
- /**
197
- * This function returns a titleInfo object.
198
- *
199
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
200
- * @param {*} title
201
- * @param {*} subtitle
202
- * @param {*} sIntent The intent path to be redirected to
203
- * @returns {object} The title information
204
- */
205
- _computeTitleInfo: function(title, subtitle, sIntent) {
206
- var aParts = sIntent.split("/");
207
- if (aParts[aParts.length - 1].indexOf("?") === -1) {
208
- sIntent += "?restoreHistory=true";
209
- } else {
210
- sIntent += "&restoreHistory=true";
211
- }
212
- return {
213
- title: title,
214
- subtitle: subtitle,
215
- intent: sIntent,
216
- icon: ""
217
- };
218
- },
219
-
220
- /**
221
- * Fetches the value of the HeaderInfo title for a given path.
222
- *
223
- * @param {string} sPath The path to the entity
224
- * @returns {Promise} A promise containing the value of the title, or an empty string if no HeaderInfo title annotation is available
225
- */
226
- _fetchTitleValue: function(sPath) {
227
- var oAppComponent = this.getAppComponent(),
228
- oModel = this.getView().getModel(),
229
- oMetaModel = oAppComponent.getMetaModel(),
230
- sMetaPath = oMetaModel.getMetaPath(sPath);
231
-
232
- var sTitleExpression = AnnotationHelper.format(
233
- oMetaModel.getProperty(sMetaPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value"),
234
- { context: oMetaModel.createBindingContext("/") }
235
- );
236
- var oTitleExpression = BindingParser.complexParser(sTitleExpression);
237
-
238
- if (oTitleExpression) {
239
- var sTitlePath = oTitleExpression.parts ? oTitleExpression.parts[0].path : oTitleExpression.path;
240
- var fnTitleFormatter = oTitleExpression.formatter;
241
- var oBindingViewContext = oModel.createBindingContext(sPath);
242
- var oPropertyBinding = oModel.bindProperty(sTitlePath, oBindingViewContext);
243
-
244
- oPropertyBinding.initialize();
245
-
246
- return new Promise(function(resolve) {
247
- var fnChange = function(oEvent) {
248
- var sTargetValue = fnTitleFormatter
249
- ? fnTitleFormatter(oEvent.getSource().getValue())
250
- : oEvent.getSource().getValue();
251
-
252
- oPropertyBinding.detachChange(fnChange);
253
- resolve(sTargetValue);
254
- };
255
-
256
- oPropertyBinding.attachChange(fnChange);
257
- });
258
- } else {
259
- return Promise.resolve("");
260
- }
261
- },
262
-
263
- _getAppSpecificHash: function() {
264
- return HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
265
- },
266
-
267
- _getHash: function() {
268
- return HashChanger.getInstance().getHash();
269
- },
270
-
271
- /**
272
- * This function returns titleInformation from a path.
273
- * It updates the cache to store Title Information if necessary
274
- *
275
- * @name sap.fe.templates.RootContainer.controller.BaseController#getTitleInfoFromPath
276
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
277
- * @param {*} sPath path of the context to retrieve title information from MetaModel
278
- *
279
- * @returns {promise} oTitleinformation returned as promise
280
- */
281
-
282
- getTitleInfoFromPath: function(sPath) {
283
- var oTitleHierarchyCache = this._getTitleHierarchyCache();
284
-
285
- if (oTitleHierarchyCache[sPath]) {
286
- // The title info is already stored in the cache
287
- return Promise.resolve(oTitleHierarchyCache[sPath]);
288
- }
289
-
290
- var oMetaModel = this.getAppComponent().getMetaModel();
291
- var that = this;
292
- var sEntityPath = oMetaModel.getMetaPath(sPath);
293
- var sTypeName = oMetaModel.getProperty(sEntityPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName");
294
- var sAppSpecificHash = this._getAppSpecificHash();
295
- var sIntent = sAppSpecificHash + sPath.slice(1);
296
-
297
- return this._fetchTitleValue(sPath).then(function(sTitle) {
298
- var oTitleInfo = that._computeTitleInfo(sTypeName, sTitle, sIntent);
299
- oTitleHierarchyCache[sPath] = oTitleInfo;
300
- return oTitleInfo;
301
- });
302
- },
303
- /**
304
- * Ensure that the ushell service receives all elements
305
- * (title, subtitle, intent, icon) as strings.
306
- *
307
- * Annotation HeaderInfo allows for binding of title and description
308
- * (which are used here as title and subtitle) to any element in the entity
309
- * (being possibly types like boolean, timestamp, double, etc.)
310
- *
311
- * Creates a new hierarchy and converts non-string types to string.
312
- *
313
- * @param {*} aHierarchy Shell title hierarchy
314
- * @returns {*} Copy of shell title hierarchy containing all elements as strings
315
- */
316
- _ensureHierarchyElementsAreStrings: function(aHierarchy) {
317
- var aHierarchyShell = [];
318
- for (var level in aHierarchy) {
319
- var oHierarchy = aHierarchy[level];
320
- var oShellHierarchy = {};
321
- for (var key in oHierarchy) {
322
- oShellHierarchy[key] = typeof oHierarchy[key] !== "string" ? String(oHierarchy[key]) : oHierarchy[key];
323
- }
324
- aHierarchyShell.push(oShellHierarchy);
325
- }
326
- return aHierarchyShell;
327
- },
328
-
329
- _getTargetTypeFromHash: function(sHash) {
330
- var oAppComponent = this.getAppComponent();
331
- var sTargetType = "";
332
-
333
- var aRoutes = oAppComponent.getManifestEntry("/sap.ui5/routing/routes");
334
- for (var j = 0; j < aRoutes.length; j++) {
335
- var oRoute = oAppComponent.getRouter().getRoute(aRoutes[j].name);
336
- if (oRoute.match(sHash)) {
337
- var sTarget = Array.isArray(aRoutes[j].target) ? aRoutes[j].target[0] : aRoutes[j].target;
338
- sTargetType = oAppComponent.getRouter().getTarget(sTarget)._oOptions.name;
339
- break;
340
- }
341
- }
342
-
343
- return sTargetType;
344
- },
345
-
346
- /**
347
- * This function is updating the shell title after each navigation.
348
- *
349
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
350
- * @param {*} oView The current view
351
- * @returns {*} A Promise that is resolved when the menu is filled properly
352
- */
353
- _computeTitleHierarchy: function(oView) {
354
- var that = this,
355
- oAppComponent = this.getAppComponent(),
356
- oContext = oView.getBindingContext(),
357
- oCurrentPage = oView.getParent(),
358
- aTitleInformationPromises = [],
359
- sAppSpecificHash = this._getAppSpecificHash(),
360
- sAppTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").title || "",
361
- sAppSubTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").appSubTitle || "",
362
- oPageTitleInformation,
363
- sNewPath;
364
-
365
- if (oCurrentPage && oCurrentPage._getPageTitleInformation) {
366
- if (oContext) {
367
- // If the first page of the application is a LR, use the title and subtitle from the manifest
368
- if (this._getTargetTypeFromHash("") === "sap.fe.templates.ListReport") {
369
- aTitleInformationPromises.push(
370
- Promise.resolve(that._computeTitleInfo(sAppTitle, sAppSubTitle, sAppSpecificHash))
371
- );
372
- }
373
-
374
- // Then manage other pages
375
- sNewPath = oContext.getPath();
376
- var aPathParts = sNewPath.split("/"),
377
- sPath = "";
378
-
379
- aPathParts.shift(); // Remove the first segment (empty string) as it has been managed above
380
- aPathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
381
-
382
- aPathParts.forEach(function(sPathPart) {
383
- sPath += "/" + sPathPart;
384
- var oMetaModel = oAppComponent.getMetaModel(),
385
- sParameterPath = oMetaModel.getMetaPath(sPath),
386
- bIsParameterized = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
387
- if (!bIsParameterized) {
388
- aTitleInformationPromises.push(that.getTitleInfoFromPath(sPath));
389
- }
390
- });
391
- }
392
-
393
- // Current page
394
- oPageTitleInformation = oCurrentPage._getPageTitleInformation();
395
- oPageTitleInformation = that._computeTitleInfo(
396
- oPageTitleInformation.title,
397
- oPageTitleInformation.subtitle,
398
- sAppSpecificHash + this._getHash()
399
- );
400
-
401
- if (oContext) {
402
- that._getTitleHierarchyCache()[sNewPath] = oPageTitleInformation;
403
- } else {
404
- that._getTitleHierarchyCache()[sAppSpecificHash] = oPageTitleInformation;
405
- }
406
- } else {
407
- aTitleInformationPromises.push(Promise.reject("Title information missing in HeaderInfo"));
408
- }
409
- return Promise.all(aTitleInformationPromises)
410
- .then(function(aTitleInfoHierarchy) {
411
- // workaround for shell which is expecting all elements being of type string
412
- var aTitleInfoHierarchyShell = that._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
413
- sTitle = oPageTitleInformation.title;
414
- oAppComponent.getShellServices().setHierarchy(aTitleInfoHierarchyShell.reverse());
415
- oAppComponent.getShellServices().setTitle(sTitle);
416
- })
417
- .catch(function(sErrorMessage) {
418
- Log.error(sErrorMessage);
419
- })
420
- .finally(function() {
421
- that.bIsComputingTitleHierachy = false;
422
- })
423
- .catch(function(sErrorMessage) {
424
- Log.error(sErrorMessage);
425
- });
426
- },
427
-
428
- calculateLayout: function(iNextFCLLevel, sPath, sProposedLayout) {
429
- return null;
430
- },
431
-
432
- /**
433
- * Callback after a view has been bound to a context.
434
- *
435
- * @param {sap.ui.model.odata.v4.Context} oContext The context that has been bound to a view
436
- */
437
- onContextBoundToView: function(oContext) {
438
- if (oContext) {
439
- var sDeepestPath = this.getView()
440
- .getModel("internal")
441
- .getProperty("/deepestPath"),
442
- sViewContextPath = oContext.getPath();
443
-
444
- if (!sDeepestPath || sDeepestPath.indexOf(sViewContextPath) !== 0) {
445
- // There was no previous value for the deepest reached path, or the path
446
- // for the view isn't a subpath of the previous deepest path --> update
447
- this.getView()
448
- .getModel("internal")
449
- .setProperty("/deepestPath", sViewContextPath, undefined, true);
450
- }
451
- }
452
- },
453
-
454
- displayMessagePage: function(sErrorMessage, mParameters) {
455
- // To be overridden
456
- },
457
-
458
- updateUIStateForView: function(oView, FCLLevel) {}
459
- });
460
- }
461
- );
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/helpers/ClassSupport", "sap/fe/macros/SizeHelper", "sap/ui/base/BindingParser", "sap/ui/core/routing/HashChanger", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/AnnotationHelper"], function (Log, BaseController, Placeholder, ClassSupport, SizeHelper, BindingParser, HashChanger, JSONModel, AnnotationHelper) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _class, _class2, _descriptor;
9
+
10
+ var usingExtension = ClassSupport.usingExtension;
11
+ var defineUI5Class = ClassSupport.defineUI5Class;
12
+
13
+ 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 }); }
14
+
15
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
16
+
17
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
18
+
19
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
20
+
21
+ 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; }
22
+
23
+ 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.'); }
24
+
25
+ var RootContainerBaseController = (_dec = defineUI5Class("sap.fe.templates.RootContainer.controller.RootContainerBaseController"), _dec2 = usingExtension(Placeholder), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseController) {
26
+ _inheritsLoose(RootContainerBaseController, _BaseController);
27
+
28
+ function RootContainerBaseController() {
29
+ var _this;
30
+
31
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
32
+ args[_key] = arguments[_key];
33
+ }
34
+
35
+ _this = _BaseController.call.apply(_BaseController, [this].concat(args)) || this;
36
+
37
+ _initializerDefineProperty(_this, "oPlaceholder", _descriptor, _assertThisInitialized(_this));
38
+
39
+ _this.bIsComputingTitleHierachy = false;
40
+ return _this;
41
+ }
42
+
43
+ var _proto = RootContainerBaseController.prototype;
44
+
45
+ _proto.onInit = function onInit() {
46
+ SizeHelper.init();
47
+ this._aHelperModels = [];
48
+ };
49
+
50
+ _proto.getPlaceholder = function getPlaceholder() {
51
+ return this.oPlaceholder;
52
+ };
53
+
54
+ _proto.attachRouteMatchers = function attachRouteMatchers() {
55
+ this.oPlaceholder.attachRouteMatchers();
56
+ this.getAppComponent().getRoutingService().attachAfterRouteMatched(this._onAfterRouteMatched, this);
57
+ };
58
+
59
+ _proto.onExit = function onExit() {
60
+ this.getAppComponent().getRoutingService().detachAfterRouteMatched(this._onAfterRouteMatched, this);
61
+ this.oRouter = undefined;
62
+ SizeHelper.exit(); // Destroy all JSON models created dynamically for the views
63
+
64
+ this._aHelperModels.forEach(function (oModel) {
65
+ oModel.destroy();
66
+ });
67
+ }
68
+ /**
69
+ * Convenience method for getting the resource bundle.
70
+ *
71
+ * @public
72
+ * @returns {sap.ui.model.resource.ResourceModel} The resourceModel of the component
73
+ */
74
+ ;
75
+
76
+ _proto.getResourceBundle = function getResourceBundle() {
77
+ return this.getOwnerComponent().getModel("i18n").getResourceBundle();
78
+ };
79
+
80
+ _proto.getRouter = function getRouter() {
81
+ if (!this.oRouter) {
82
+ this.oRouter = this.getAppComponent().getRouter();
83
+ }
84
+
85
+ return this.oRouter;
86
+ };
87
+
88
+ _proto._createHelperModel = function _createHelperModel() {
89
+ // We keep a reference on the models created dynamically, as they don't get destroyed
90
+ // automatically when the view is destroyed.
91
+ // This is done during onExit
92
+ var oModel = new JSONModel();
93
+
94
+ this._aHelperModels.push(oModel);
95
+
96
+ return oModel;
97
+ }
98
+ /**
99
+ * Function waiting for the Right most view to be ready.
100
+ *
101
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
102
+ * @param {*} oEvent Reference an Event parameter coming from routeMatched event
103
+ * @returns {Promise}
104
+ */
105
+ ;
106
+
107
+ _proto.waitForRightMostViewReady = function waitForRightMostViewReady(oEvent) {
108
+ return new Promise(function (resolve) {
109
+ var aContainers = oEvent.getParameter("views"),
110
+ // There can also be reuse components in the view, remove them before processing.
111
+ aFEContainers = [];
112
+ aContainers.forEach(function (oContainer) {
113
+ var oView = oContainer;
114
+
115
+ if (oContainer && oContainer.getComponentInstance) {
116
+ var oComponentInstance = oContainer.getComponentInstance();
117
+ oView = oComponentInstance.getRootControl();
118
+ }
119
+
120
+ if (oView && oView.getController() && oView.getController().pageReady) {
121
+ aFEContainers.push(oView);
122
+ }
123
+ });
124
+ var oRightMostFEView = aFEContainers[aFEContainers.length - 1];
125
+
126
+ if (oRightMostFEView && oRightMostFEView.getController().pageReady.isPageReady()) {
127
+ resolve(oRightMostFEView);
128
+ } else {
129
+ oRightMostFEView && oRightMostFEView.getController().pageReady.attachEventOnce("pageReady", function () {
130
+ resolve(oRightMostFEView);
131
+ });
132
+ }
133
+ });
134
+ }
135
+ /**
136
+ * Callback when the navigation is done.
137
+ * - update the shell title.
138
+ * - update table scroll.
139
+ * - call onPageReady on the rightMostView.
140
+ *
141
+ * @param oEvent
142
+ * @name sap.fe.templates.RootContainer.controller.BaseController#_onAfterRouteMatched
143
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
144
+ */
145
+ ;
146
+
147
+ _proto._onAfterRouteMatched = function _onAfterRouteMatched(oEvent) {
148
+ var _this2 = this;
149
+
150
+ if (!this._oRouteMatchedPromise) {
151
+ this._oRouteMatchedPromise = this.waitForRightMostViewReady(oEvent).then(function (oView) {
152
+ // The autoFocus is initially disabled on the navContainer or the FCL, so that the focus stays on the Shell menu
153
+ // even if the app takes a long time to launch
154
+ // The first time the view is displayed, we need to enable the autofocus so that it's managed properly during navigation
155
+ var oRootControl = _this2.getView().getContent()[0];
156
+
157
+ if (oRootControl && oRootControl.getAutoFocus && !oRootControl.getAutoFocus()) {
158
+ oRootControl.setProperty("autoFocus", true, true); // Do not mark the container as invalid, otherwise it's re-rendered
159
+ }
160
+
161
+ var oAppComponent = _this2.getAppComponent();
162
+
163
+ _this2._scrollTablesToLastNavigatedItems();
164
+
165
+ if (oAppComponent.getEnvironmentCapabilities().getCapabilities().UShell) {
166
+ _this2._computeTitleHierarchy(oView);
167
+ }
168
+
169
+ var bForceFocus = oAppComponent.getRouterProxy().isFocusForced();
170
+ oAppComponent.getRouterProxy().setFocusForced(false); // reset
171
+
172
+ if (oView.getController() && oView.getController().onPageReady && oView.getParent().onPageReady) {
173
+ oView.getParent().onPageReady({
174
+ forceFocus: bForceFocus
175
+ });
176
+ }
177
+
178
+ if (_this2.onContainerReady) {
179
+ _this2.onContainerReady();
180
+ }
181
+ }).catch(function (oError) {
182
+ Log.error("An error occurs while computing the title hierarchy and calling focus method", oError);
183
+ }).finally(function () {
184
+ _this2._oRouteMatchedPromise = null;
185
+ });
186
+ }
187
+ }
188
+ /**
189
+ * This function returns the TitleHierarchy cache ( or initializes it if undefined).
190
+ *
191
+ * @name sap.fe.templates.RootContainer.controller.BaseController#_getTitleHierarchyCache
192
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
193
+ *
194
+ * @returns {object} The TitleHierarchy cache
195
+ */
196
+ ;
197
+
198
+ _proto._getTitleHierarchyCache = function _getTitleHierarchyCache() {
199
+ if (!this.oTitleHierarchyCache) {
200
+ this.oTitleHierarchyCache = {};
201
+ }
202
+
203
+ return this.oTitleHierarchyCache;
204
+ }
205
+ /**
206
+ * This function returns a titleInfo object.
207
+ *
208
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
209
+ * @param {*} title
210
+ * @param {*} subtitle
211
+ * @param {*} sIntent The intent path to be redirected to
212
+ * @returns {object} The title information
213
+ */
214
+ ;
215
+
216
+ _proto._computeTitleInfo = function _computeTitleInfo(title, subtitle, sIntent) {
217
+ var aParts = sIntent.split("/");
218
+
219
+ if (aParts[aParts.length - 1].indexOf("?") === -1) {
220
+ sIntent += "?restoreHistory=true";
221
+ } else {
222
+ sIntent += "&restoreHistory=true";
223
+ }
224
+
225
+ return {
226
+ title: title,
227
+ subtitle: subtitle,
228
+ intent: sIntent,
229
+ icon: ""
230
+ };
231
+ }
232
+ /**
233
+ * Fetches the value of the HeaderInfo title for a given path.
234
+ *
235
+ * @param {string} sPath The path to the entity
236
+ * @returns {Promise} A promise containing the value of the title, or an empty string if no HeaderInfo title annotation is available
237
+ */
238
+ ;
239
+
240
+ _proto._fetchTitleValue = function _fetchTitleValue(sPath) {
241
+ var oAppComponent = this.getAppComponent(),
242
+ oModel = this.getView().getModel(),
243
+ oMetaModel = oAppComponent.getMetaModel(),
244
+ sMetaPath = oMetaModel.getMetaPath(sPath);
245
+ var sTitleExpression = AnnotationHelper.format(oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value"), {
246
+ context: oMetaModel.createBindingContext("/")
247
+ });
248
+ var oTitleExpression = BindingParser.complexParser(sTitleExpression);
249
+
250
+ if (oTitleExpression) {
251
+ var sTitlePath = oTitleExpression.parts ? oTitleExpression.parts[0].path : oTitleExpression.path;
252
+ var fnTitleFormatter = oTitleExpression.formatter;
253
+ var oBindingViewContext = oModel.createBindingContext(sPath);
254
+ var oPropertyBinding = oModel.bindProperty(sTitlePath, oBindingViewContext);
255
+ oPropertyBinding.initialize();
256
+ return new Promise(function (resolve) {
257
+ var fnChange = function (oEvent) {
258
+ var sTargetValue = fnTitleFormatter ? fnTitleFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
259
+ oPropertyBinding.detachChange(fnChange);
260
+ resolve(sTargetValue);
261
+ };
262
+
263
+ oPropertyBinding.attachChange(fnChange);
264
+ });
265
+ } else {
266
+ return Promise.resolve("");
267
+ }
268
+ };
269
+
270
+ _proto._getAppSpecificHash = function _getAppSpecificHash() {
271
+ // HashChanged isShellNavigationHashChanger
272
+ return HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
273
+ };
274
+
275
+ _proto._getHash = function _getHash() {
276
+ return HashChanger.getInstance().getHash();
277
+ }
278
+ /**
279
+ * This function returns titleInformation from a path.
280
+ * It updates the cache to store Title Information if necessary
281
+ *
282
+ * @name sap.fe.templates.RootContainer.controller.BaseController#getTitleInfoFromPath
283
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
284
+ * @param {*} sPath path of the context to retrieve title information from MetaModel
285
+ *
286
+ * @returns {promise} oTitleinformation returned as promise
287
+ */
288
+ ;
289
+
290
+ _proto.getTitleInfoFromPath = function getTitleInfoFromPath(sPath) {
291
+ var _this3 = this;
292
+
293
+ var oTitleHierarchyCache = this._getTitleHierarchyCache();
294
+
295
+ if (oTitleHierarchyCache[sPath]) {
296
+ // The title info is already stored in the cache
297
+ return Promise.resolve(oTitleHierarchyCache[sPath]);
298
+ }
299
+
300
+ var oMetaModel = this.getAppComponent().getMetaModel();
301
+ var sEntityPath = oMetaModel.getMetaPath(sPath);
302
+ var sTypeName = oMetaModel.getObject(sEntityPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName");
303
+
304
+ var sAppSpecificHash = this._getAppSpecificHash();
305
+
306
+ var sIntent = sAppSpecificHash + sPath.slice(1);
307
+ return this._fetchTitleValue(sPath).then(function (sTitle) {
308
+ var oTitleInfo = _this3._computeTitleInfo(sTypeName, sTitle, sIntent);
309
+
310
+ oTitleHierarchyCache[sPath] = oTitleInfo;
311
+ return oTitleInfo;
312
+ });
313
+ }
314
+ /**
315
+ * Ensure that the ushell service receives all elements
316
+ * (title, subtitle, intent, icon) as strings.
317
+ *
318
+ * Annotation HeaderInfo allows for binding of title and description
319
+ * (which are used here as title and subtitle) to any element in the entity
320
+ * (being possibly types like boolean, timestamp, double, etc.)
321
+ *
322
+ * Creates a new hierarchy and converts non-string types to string.
323
+ *
324
+ * @param {*} aHierarchy Shell title hierarchy
325
+ * @returns {*} Copy of shell title hierarchy containing all elements as strings
326
+ */
327
+ ;
328
+
329
+ _proto._ensureHierarchyElementsAreStrings = function _ensureHierarchyElementsAreStrings(aHierarchy) {
330
+ var aHierarchyShell = [];
331
+
332
+ for (var level in aHierarchy) {
333
+ var oHierarchy = aHierarchy[level];
334
+ var oShellHierarchy = {};
335
+
336
+ for (var key in oHierarchy) {
337
+ oShellHierarchy[key] = typeof oHierarchy[key] !== "string" ? String(oHierarchy[key]) : oHierarchy[key];
338
+ }
339
+
340
+ aHierarchyShell.push(oShellHierarchy);
341
+ }
342
+
343
+ return aHierarchyShell;
344
+ };
345
+
346
+ _proto._getTargetTypeFromHash = function _getTargetTypeFromHash(sHash) {
347
+ var oAppComponent = this.getAppComponent();
348
+ var sTargetType = "";
349
+ var aRoutes = oAppComponent.getManifestEntry("/sap.ui5/routing/routes");
350
+
351
+ for (var j = 0; j < aRoutes.length; j++) {
352
+ var oRoute = oAppComponent.getRouter().getRoute(aRoutes[j].name);
353
+
354
+ if (oRoute.match(sHash)) {
355
+ var sTarget = Array.isArray(aRoutes[j].target) ? aRoutes[j].target[0] : aRoutes[j].target;
356
+ sTargetType = oAppComponent.getRouter().getTarget(sTarget)._oOptions.name;
357
+ break;
358
+ }
359
+ }
360
+
361
+ return sTargetType;
362
+ }
363
+ /**
364
+ * This function is updating the shell title after each navigation.
365
+ *
366
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
367
+ * @param {*} oView The current view
368
+ * @returns {*} A Promise that is resolved when the menu is filled properly
369
+ */
370
+ ;
371
+
372
+ _proto._computeTitleHierarchy = function _computeTitleHierarchy(oView) {
373
+ var _this4 = this;
374
+
375
+ var oAppComponent = this.getAppComponent(),
376
+ oContext = oView.getBindingContext(),
377
+ oCurrentPage = oView.getParent(),
378
+ aTitleInformationPromises = [],
379
+ sAppSpecificHash = this._getAppSpecificHash(),
380
+ sAppTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").title || "",
381
+ sAppSubTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").appSubTitle || "";
382
+
383
+ var oPageTitleInformation, sNewPath;
384
+
385
+ if (oCurrentPage && oCurrentPage._getPageTitleInformation) {
386
+ if (oContext) {
387
+ // If the first page of the application is a LR, use the title and subtitle from the manifest
388
+ if (this._getTargetTypeFromHash("") === "sap.fe.templates.ListReport") {
389
+ aTitleInformationPromises.push(Promise.resolve(this._computeTitleInfo(sAppTitle, sAppSubTitle, sAppSpecificHash)));
390
+ } // Then manage other pages
391
+
392
+
393
+ sNewPath = oContext.getPath();
394
+ var aPathParts = sNewPath.split("/");
395
+ var sPath = "";
396
+ aPathParts.shift(); // Remove the first segment (empty string) as it has been managed above
397
+
398
+ aPathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
399
+
400
+ aPathParts.forEach(function (sPathPart) {
401
+ sPath += "/" + sPathPart;
402
+ var oMetaModel = oAppComponent.getMetaModel(),
403
+ sParameterPath = oMetaModel.getMetaPath(sPath),
404
+ bIsParameterized = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
405
+
406
+ if (!bIsParameterized) {
407
+ aTitleInformationPromises.push(_this4.getTitleInfoFromPath(sPath));
408
+ }
409
+ });
410
+ } // Current page
411
+
412
+
413
+ oPageTitleInformation = oCurrentPage._getPageTitleInformation();
414
+ oPageTitleInformation = this._computeTitleInfo(oPageTitleInformation.title, oPageTitleInformation.subtitle, sAppSpecificHash + this._getHash());
415
+
416
+ if (oContext) {
417
+ this._getTitleHierarchyCache()[sNewPath] = oPageTitleInformation;
418
+ } else {
419
+ this._getTitleHierarchyCache()[sAppSpecificHash] = oPageTitleInformation;
420
+ }
421
+ } else {
422
+ aTitleInformationPromises.push(Promise.reject("Title information missing in HeaderInfo"));
423
+ }
424
+
425
+ return Promise.all(aTitleInformationPromises).then(function (aTitleInfoHierarchy) {
426
+ // workaround for shell which is expecting all elements being of type string
427
+ var aTitleInfoHierarchyShell = _this4._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
428
+ sTitle = oPageTitleInformation.title;
429
+
430
+ oAppComponent.getShellServices().setHierarchy(aTitleInfoHierarchyShell.reverse());
431
+ oAppComponent.getShellServices().setTitle(sTitle);
432
+ }).catch(function (sErrorMessage) {
433
+ Log.error(sErrorMessage);
434
+ }).finally(function () {
435
+ _this4.bIsComputingTitleHierachy = false;
436
+ }).catch(function (sErrorMessage) {
437
+ Log.error(sErrorMessage);
438
+ });
439
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
440
+ ;
441
+
442
+ _proto.calculateLayout = function calculateLayout(iNextFCLLevel, sHash, sProposedLayout, keepCurrentLayout) {
443
+ return null;
444
+ }
445
+ /**
446
+ * Callback after a view has been bound to a context.
447
+ *
448
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that has been bound to a view
449
+ */
450
+ ;
451
+
452
+ _proto.onContextBoundToView = function onContextBoundToView(oContext) {
453
+ if (oContext) {
454
+ var sDeepestPath = this.getView().getModel("internal").getProperty("/deepestPath"),
455
+ sViewContextPath = oContext.getPath();
456
+
457
+ if (!sDeepestPath || sDeepestPath.indexOf(sViewContextPath) !== 0) {
458
+ // There was no previous value for the deepest reached path, or the path
459
+ // for the view isn't a subpath of the previous deepest path --> update
460
+ this.getView().getModel("internal").setProperty("/deepestPath", sViewContextPath, undefined, true);
461
+ }
462
+ }
463
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
464
+ ;
465
+
466
+ _proto.displayMessagePage = function displayMessagePage(sErrorMessage, mParameters) {
467
+ // To be overridden
468
+ return Promise.resolve(true);
469
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
470
+ ;
471
+
472
+ _proto.updateUIStateForView = function updateUIStateForView(oView, FCLLevel) {// To be overriden
473
+ };
474
+
475
+ _proto._scrollTablesToLastNavigatedItems = function _scrollTablesToLastNavigatedItems() {// To be overriden
476
+ };
477
+
478
+ return RootContainerBaseController;
479
+ }(BaseController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "oPlaceholder", [_dec2], {
480
+ configurable: true,
481
+ enumerable: true,
482
+ writable: true,
483
+ initializer: null
484
+ })), _class2)) || _class);
485
+ return RootContainerBaseController;
486
+ }, false);
487
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6WyJSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiUGxhY2Vob2xkZXIiLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5Iiwib25Jbml0IiwiU2l6ZUhlbHBlciIsImluaXQiLCJfYUhlbHBlck1vZGVscyIsImdldFBsYWNlaG9sZGVyIiwib1BsYWNlaG9sZGVyIiwiYXR0YWNoUm91dGVNYXRjaGVycyIsImdldEFwcENvbXBvbmVudCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJfb25BZnRlclJvdXRlTWF0Y2hlZCIsIm9uRXhpdCIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwib1JvdXRlciIsInVuZGVmaW5lZCIsImV4aXQiLCJmb3JFYWNoIiwib01vZGVsIiwiZGVzdHJveSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0T3duZXJDb21wb25lbnQiLCJnZXRNb2RlbCIsImdldFJvdXRlciIsIl9jcmVhdGVIZWxwZXJNb2RlbCIsIkpTT05Nb2RlbCIsInB1c2giLCJ3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5Iiwib0V2ZW50IiwiUHJvbWlzZSIsInJlc29sdmUiLCJhQ29udGFpbmVycyIsImdldFBhcmFtZXRlciIsImFGRUNvbnRhaW5lcnMiLCJvQ29udGFpbmVyIiwib1ZpZXciLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsIm9Db21wb25lbnRJbnN0YW5jZSIsImdldFJvb3RDb250cm9sIiwiZ2V0Q29udHJvbGxlciIsInBhZ2VSZWFkeSIsIm9SaWdodE1vc3RGRVZpZXciLCJsZW5ndGgiLCJpc1BhZ2VSZWFkeSIsImF0dGFjaEV2ZW50T25jZSIsIl9vUm91dGVNYXRjaGVkUHJvbWlzZSIsInRoZW4iLCJvUm9vdENvbnRyb2wiLCJnZXRWaWV3IiwiZ2V0Q29udGVudCIsImdldEF1dG9Gb2N1cyIsInNldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiVVNoZWxsIiwiX2NvbXB1dGVUaXRsZUhpZXJhcmNoeSIsImJGb3JjZUZvY3VzIiwiZ2V0Um91dGVyUHJveHkiLCJpc0ZvY3VzRm9yY2VkIiwic2V0Rm9jdXNGb3JjZWQiLCJvblBhZ2VSZWFkeSIsImdldFBhcmVudCIsImZvcmNlRm9jdXMiLCJvbkNvbnRhaW5lclJlYWR5IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImZpbmFsbHkiLCJfZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSIsIm9UaXRsZUhpZXJhcmNoeUNhY2hlIiwiX2NvbXB1dGVUaXRsZUluZm8iLCJ0aXRsZSIsInN1YnRpdGxlIiwic0ludGVudCIsImFQYXJ0cyIsInNwbGl0IiwiaW5kZXhPZiIsImludGVudCIsImljb24iLCJfZmV0Y2hUaXRsZVZhbHVlIiwic1BhdGgiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJzVGl0bGVFeHByZXNzaW9uIiwiQW5ub3RhdGlvbkhlbHBlciIsImZvcm1hdCIsImdldE9iamVjdCIsImNvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9UaXRsZUV4cHJlc3Npb24iLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsInNUaXRsZVBhdGgiLCJwYXJ0cyIsInBhdGgiLCJmblRpdGxlRm9ybWF0dGVyIiwiZm9ybWF0dGVyIiwib0JpbmRpbmdWaWV3Q29udGV4dCIsIm9Qcm9wZXJ0eUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCJpbml0aWFsaXplIiwiZm5DaGFuZ2UiLCJzVGFyZ2V0VmFsdWUiLCJnZXRTb3VyY2UiLCJnZXRWYWx1ZSIsImRldGFjaENoYW5nZSIsImF0dGFjaENoYW5nZSIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJIYXNoQ2hhbmdlciIsImdldEluc3RhbmNlIiwiaHJlZkZvckFwcFNwZWNpZmljSGFzaCIsIl9nZXRIYXNoIiwiZ2V0SGFzaCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwic0VudGl0eVBhdGgiLCJzVHlwZU5hbWUiLCJzQXBwU3BlY2lmaWNIYXNoIiwic2xpY2UiLCJzVGl0bGUiLCJvVGl0bGVJbmZvIiwiX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyIsImFIaWVyYXJjaHkiLCJhSGllcmFyY2h5U2hlbGwiLCJsZXZlbCIsIm9IaWVyYXJjaHkiLCJvU2hlbGxIaWVyYXJjaHkiLCJrZXkiLCJTdHJpbmciLCJfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoIiwic0hhc2giLCJzVGFyZ2V0VHlwZSIsImFSb3V0ZXMiLCJnZXRNYW5pZmVzdEVudHJ5IiwiaiIsIm9Sb3V0ZSIsImdldFJvdXRlIiwibmFtZSIsIm1hdGNoIiwic1RhcmdldCIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsImdldFRhcmdldCIsIl9vT3B0aW9ucyIsIm9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQ3VycmVudFBhZ2UiLCJhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzIiwic0FwcFRpdGxlIiwiZ2V0TWV0YWRhdGEiLCJzQXBwU3ViVGl0bGUiLCJhcHBTdWJUaXRsZSIsIm9QYWdlVGl0bGVJbmZvcm1hdGlvbiIsInNOZXdQYXRoIiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwiZ2V0UGF0aCIsImFQYXRoUGFydHMiLCJzaGlmdCIsInBvcCIsInNQYXRoUGFydCIsInNQYXJhbWV0ZXJQYXRoIiwiYklzUGFyYW1ldGVyaXplZCIsInJlamVjdCIsImFsbCIsImFUaXRsZUluZm9IaWVyYXJjaHkiLCJhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0SGllcmFyY2h5IiwicmV2ZXJzZSIsInNldFRpdGxlIiwic0Vycm9yTWVzc2FnZSIsImNhbGN1bGF0ZUxheW91dCIsImlOZXh0RkNMTGV2ZWwiLCJzUHJvcG9zZWRMYXlvdXQiLCJrZWVwQ3VycmVudExheW91dCIsIm9uQ29udGV4dEJvdW5kVG9WaWV3Iiwic0RlZXBlc3RQYXRoIiwiZ2V0UHJvcGVydHkiLCJzVmlld0NvbnRleHRQYXRoIiwiZGlzcGxheU1lc3NhZ2VQYWdlIiwibVBhcmFtZXRlcnMiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsIkZDTExldmVsIiwiQmFzZUNvbnRyb2xsZXIiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQVlNQSwyQixXQURMQyxjQUFjLENBQUMsdUVBQUQsQyxVQUViQyxjQUFjLENBQUNDLFdBQUQsQzs7Ozs7Ozs7Ozs7Ozs7WUFNUEMseUIsR0FBcUMsSzs7Ozs7O1dBRTdDQyxNLEdBQUEsa0JBQVM7QUFDUkMsTUFBQUEsVUFBVSxDQUFDQyxJQUFYO0FBRUEsV0FBS0MsY0FBTCxHQUFzQixFQUF0QjtBQUNBLEs7O1dBRURDLGMsR0FBQSwwQkFBaUI7QUFDaEIsYUFBTyxLQUFLQyxZQUFaO0FBQ0EsSzs7V0FDREMsbUIsR0FBQSwrQkFBc0I7QUFDckIsV0FBS0QsWUFBTCxDQUFrQkMsbUJBQWxCO0FBQ0EsV0FBS0MsZUFBTCxHQUF1QkMsaUJBQXZCLEdBQTJDQyx1QkFBM0MsQ0FBbUUsS0FBS0Msb0JBQXhFLEVBQThGLElBQTlGO0FBQ0EsSzs7V0FDREMsTSxHQUFBLGtCQUFTO0FBQ1IsV0FBS0osZUFBTCxHQUF1QkMsaUJBQXZCLEdBQTJDSSx1QkFBM0MsQ0FBbUUsS0FBS0Ysb0JBQXhFLEVBQThGLElBQTlGO0FBQ0EsV0FBS0csT0FBTCxHQUFlQyxTQUFmO0FBRUFiLE1BQUFBLFVBQVUsQ0FBQ2MsSUFBWCxHQUpRLENBTVI7O0FBQ0EsV0FBS1osY0FBTCxDQUFvQmEsT0FBcEIsQ0FBNEIsVUFBVUMsTUFBVixFQUF1QjtBQUNsREEsUUFBQUEsTUFBTSxDQUFDQyxPQUFQO0FBQ0EsT0FGRDtBQUdBO0FBQ0Q7QUFD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QyxFQUFnRCxDQUMvQztBQUNBLEs7O1dBQ0R0SSxpQyxHQUFBLDZDQUEwQyxDQUN6QztBQUNBLEs7OztJQWphd0N1SSxjOzs7Ozs7U0F1YTNCaE0sMkIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgU2l6ZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9TaXplSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IEhhc2hDaGFuZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL0hhc2hDaGFuZ2VyXCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlclwiKVxuY2xhc3MgUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdG9QbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRwcml2YXRlIF9hSGVscGVyTW9kZWxzITogYW55W107XG5cdHByaXZhdGUgb1JvdXRlcj86IFJvdXRlcjtcblx0cHJpdmF0ZSBfb1JvdXRlTWF0Y2hlZFByb21pc2U6IGFueTtcblx0cHJpdmF0ZSBvVGl0bGVIaWVyYXJjaHlDYWNoZTogYW55O1xuXHRwcml2YXRlIGJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRvbkluaXQoKSB7XG5cdFx0U2l6ZUhlbHBlci5pbml0KCk7XG5cblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzID0gW107XG5cdH1cblxuXHRnZXRQbGFjZWhvbGRlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5vUGxhY2Vob2xkZXI7XG5cdH1cblx0YXR0YWNoUm91dGVNYXRjaGVycygpIHtcblx0XHR0aGlzLm9QbGFjZWhvbGRlci5hdHRhY2hSb3V0ZU1hdGNoZXJzKCk7XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuX29uQWZ0ZXJSb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHR9XG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5fb25BZnRlclJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5vUm91dGVyID0gdW5kZWZpbmVkO1xuXG5cdFx0U2l6ZUhlbHBlci5leGl0KCk7XG5cblx0XHQvLyBEZXN0cm95IGFsbCBKU09OIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5IGZvciB0aGUgdmlld3Ncblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKG9Nb2RlbDogYW55KSB7XG5cdFx0XHRvTW9kZWwuZGVzdHJveSgpO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIHJlc291cmNlIGJ1bmRsZS5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLnJlc291cmNlLlJlc291cmNlTW9kZWx9IFRoZSByZXNvdXJjZU1vZGVsIG9mIHRoZSBjb21wb25lbnRcblx0ICovXG5cdGdldFJlc291cmNlQnVuZGxlKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHR9XG5cdGdldFJvdXRlcigpIHtcblx0XHRpZiAoIXRoaXMub1JvdXRlcikge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXIoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyO1xuXHR9XG5cblx0X2NyZWF0ZUhlbHBlck1vZGVsKCkge1xuXHRcdC8vIFdlIGtlZXAgYSByZWZlcmVuY2Ugb24gdGhlIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5LCBhcyB0aGV5IGRvbid0IGdldCBkZXN0cm95ZWRcblx0XHQvLyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHZpZXcgaXMgZGVzdHJveWVkLlxuXHRcdC8vIFRoaXMgaXMgZG9uZSBkdXJpbmcgb25FeGl0XG5cdFx0Y29uc3Qgb01vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMucHVzaChvTW9kZWwpO1xuXG5cdFx0cmV0dXJuIG9Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3YWl0aW5nIGZvciB0aGUgUmlnaHQgbW9zdCB2aWV3IHRvIGJlIHJlYWR5LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnQgUmVmZXJlbmNlIGFuIEV2ZW50IHBhcmFtZXRlciBjb21pbmcgZnJvbSByb3V0ZU1hdGNoZWQgZXZlbnRcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqL1xuXHR3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudDogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgYUNvbnRhaW5lcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmlld3NcIiksXG5cdFx0XHRcdC8vIFRoZXJlIGNhbiBhbHNvIGJlIHJldXNlIGNvbXBvbmVudHMgaW4gdGhlIHZpZXcsIHJlbW92ZSB0aGVtIGJlZm9yZSBwcm9jZXNzaW5nLlxuXHRcdFx0XHRhRkVDb250YWluZXJzOiBhbnlbXSA9IFtdO1xuXHRcdFx0YUNvbnRhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdFx0XHRcdGxldCBvVmlldyA9IG9Db250YWluZXI7XG5cdFx0XHRcdGlmIChvQ29udGFpbmVyICYmIG9Db250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29tcG9uZW50SW5zdGFuY2UgPSBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRcdFx0b1ZpZXcgPSBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0Um9vdENvbnRyb2woKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1ZpZXcgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpICYmIG9WaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkpIHtcblx0XHRcdFx0XHRhRkVDb250YWluZXJzLnB1c2gob1ZpZXcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9SaWdodE1vc3RGRVZpZXcgPSBhRkVDb250YWluZXJzW2FGRUNvbnRhaW5lcnMubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAob1JpZ2h0TW9zdEZFVmlldyAmJiBvUmlnaHRNb3N0RkVWaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkuaXNQYWdlUmVhZHkoKSkge1xuXHRcdFx0XHRyZXNvbHZlKG9SaWdodE1vc3RGRVZpZXcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1JpZ2h0TW9zdEZFVmlldyAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RGRVZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvUmlnaHRNb3N0RkVWaWV3KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmUuXG5cdCAqICAtIHVwZGF0ZSB0aGUgc2hlbGwgdGl0bGUuXG5cdCAqICAtIHVwZGF0ZSB0YWJsZSBzY3JvbGwuXG5cdCAqICAtIGNhbGwgb25QYWdlUmVhZHkgb24gdGhlIHJpZ2h0TW9zdFZpZXcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXIjX29uQWZ0ZXJSb3V0ZU1hdGNoZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqL1xuXHRfb25BZnRlclJvdXRlTWF0Y2hlZChvRXZlbnQ6IGFueSkge1xuXHRcdGlmICghdGhpcy5fb1JvdXRlTWF0Y2hlZFByb21pc2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlID0gdGhpcy53YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudClcblx0XHRcdFx0LnRoZW4oKG9WaWV3OiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBUaGUgYXV0b0ZvY3VzIGlzIGluaXRpYWxseSBkaXNhYmxlZCBvbiB0aGUgbmF2Q29udGFpbmVyIG9yIHRoZSBGQ0wsIHNvIHRoYXQgdGhlIGZvY3VzIHN0YXlzIG9uIHRoZSBTaGVsbCBtZW51XG5cdFx0XHRcdFx0Ly8gZXZlbiBpZiB0aGUgYXBwIHRha2VzIGEgbG9uZyB0aW1lIHRvIGxhdW5jaFxuXHRcdFx0XHRcdC8vIFRoZSBmaXJzdCB0aW1lIHRoZSB2aWV3IGlzIGRpc3BsYXllZCwgd2UgbmVlZCB0byBlbmFibGUgdGhlIGF1dG9mb2N1cyBzbyB0aGF0IGl0J3MgbWFuYWdlZCBwcm9wZXJseSBkdXJpbmcgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGNvbnN0IG9Sb290Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXSBhcyBhbnk7XG5cdFx0XHRcdFx0aWYgKG9Sb290Q29udHJvbCAmJiBvUm9vdENvbnRyb2wuZ2V0QXV0b0ZvY3VzICYmICFvUm9vdENvbnRyb2wuZ2V0QXV0b0ZvY3VzKCkpIHtcblx0XHRcdFx0XHRcdG9Sb290Q29udHJvbC5zZXRQcm9wZXJ0eShcImF1dG9Gb2N1c1wiLCB0cnVlLCB0cnVlKTsgLy8gRG8gbm90IG1hcmsgdGhlIGNvbnRhaW5lciBhcyBpbnZhbGlkLCBvdGhlcndpc2UgaXQncyByZS1yZW5kZXJlZFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdHRoaXMuX3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCk7XG5cdFx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKS5VU2hlbGwpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NvbXB1dGVUaXRsZUhpZXJhcmNoeShvVmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJGb3JjZUZvY3VzID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmlzRm9jdXNGb3JjZWQoKTtcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0Rm9jdXNGb3JjZWQoZmFsc2UpOyAvLyByZXNldFxuXHRcdFx0XHRcdGlmIChvVmlldy5nZXRDb250cm9sbGVyKCkgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpLm9uUGFnZVJlYWR5ICYmIG9WaWV3LmdldFBhcmVudCgpLm9uUGFnZVJlYWR5KSB7XG5cdFx0XHRcdFx0XHRvVmlldy5nZXRQYXJlbnQoKS5vblBhZ2VSZWFkeSh7IGZvcmNlRm9jdXM6IGJGb3JjZUZvY3VzIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGhpcy5vbkNvbnRhaW5lclJlYWR5KSB7XG5cdFx0XHRcdFx0XHR0aGlzLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnMgd2hpbGUgY29tcHV0aW5nIHRoZSB0aXRsZSBoaWVyYXJjaHkgYW5kIGNhbGxpbmcgZm9jdXMgbWV0aG9kXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSA9IG51bGw7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRpdGxlSGllcmFyY2h5IGNhY2hlICggb3IgaW5pdGlhbGl6ZXMgaXQgaWYgdW5kZWZpbmVkKS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXIjX2dldFRpdGxlSGllcmFyY2h5Q2FjaGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBUaGUgVGl0bGVIaWVyYXJjaHkgY2FjaGVcblx0ICovXG5cdF9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCkge1xuXHRcdGlmICghdGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZSkge1xuXHRcdFx0dGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZSA9IHt9O1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0aXRsZUluZm8gb2JqZWN0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSB0aXRsZVxuXHQgKiBAcGFyYW0geyp9IHN1YnRpdGxlXG5cdCAqIEBwYXJhbSB7Kn0gc0ludGVudCBUaGUgaW50ZW50IHBhdGggdG8gYmUgcmVkaXJlY3RlZCB0b1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdGl0bGUgaW5mb3JtYXRpb25cblx0ICovXG5cdF9jb21wdXRlVGl0bGVJbmZvKHRpdGxlOiBhbnksIHN1YnRpdGxlOiBhbnksIHNJbnRlbnQ6IGFueSkge1xuXHRcdGNvbnN0IGFQYXJ0cyA9IHNJbnRlbnQuc3BsaXQoXCIvXCIpO1xuXHRcdGlmIChhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLmluZGV4T2YoXCI/XCIpID09PSAtMSkge1xuXHRcdFx0c0ludGVudCArPSBcIj9yZXN0b3JlSGlzdG9yeT10cnVlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNJbnRlbnQgKz0gXCImcmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IHRpdGxlLFxuXHRcdFx0c3VidGl0bGU6IHN1YnRpdGxlLFxuXHRcdFx0aW50ZW50OiBzSW50ZW50LFxuXHRcdFx0aWNvbjogXCJcIlxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIEhlYWRlckluZm8gdGl0bGUgZm9yIGEgZ2l2ZW4gcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFRoZSBwYXRoIHRvIHRoZSBlbnRpdHlcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBIZWFkZXJJbmZvIHRpdGxlIGFubm90YXRpb24gaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRfZmV0Y2hUaXRsZVZhbHVlKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXG5cdFx0Y29uc3Qgc1RpdGxlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIuZm9ybWF0KFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVGl0bGUvVmFsdWVcIiksXG5cdFx0XHR7IGNvbnRleHQ6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQgfVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1RpdGxlRXhwcmVzc2lvbiA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzVGl0bGVFeHByZXNzaW9uKTtcblxuXHRcdGlmIChvVGl0bGVFeHByZXNzaW9uKSB7XG5cdFx0XHRjb25zdCBzVGl0bGVQYXRoID0gb1RpdGxlRXhwcmVzc2lvbi5wYXJ0cyA/IG9UaXRsZUV4cHJlc3Npb24ucGFydHNbMF0ucGF0aCA6IG9UaXRsZUV4cHJlc3Npb24ucGF0aDtcblx0XHRcdGNvbnN0IGZuVGl0bGVGb3JtYXR0ZXIgPSBvVGl0bGVFeHByZXNzaW9uLmZvcm1hdHRlcjtcblx0XHRcdGNvbnN0IG9CaW5kaW5nVmlld0NvbnRleHQgPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpO1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5QmluZGluZyA9IG9Nb2RlbC5iaW5kUHJvcGVydHkoc1RpdGxlUGF0aCwgb0JpbmRpbmdWaWV3Q29udGV4dCk7XG5cblx0XHRcdG9Qcm9wZXJ0eUJpbmRpbmcuaW5pdGlhbGl6ZSgpO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdGNvbnN0IGZuQ2hhbmdlID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RhcmdldFZhbHVlID0gZm5UaXRsZUZvcm1hdHRlciA/IGZuVGl0bGVGb3JtYXR0ZXIob0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCkpIDogb0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCk7XG5cblx0XHRcdFx0XHRvUHJvcGVydHlCaW5kaW5nLmRldGFjaENoYW5nZShmbkNoYW5nZSk7XG5cdFx0XHRcdFx0cmVzb2x2ZShzVGFyZ2V0VmFsdWUpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG9Qcm9wZXJ0eUJpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRBcHBTcGVjaWZpY0hhc2goKSB7XG5cdFx0Ly8gSGFzaENoYW5nZWQgaXNTaGVsbE5hdmlnYXRpb25IYXNoQ2hhbmdlclxuXHRcdHJldHVybiAoSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKSBhcyBhbnkpLmhyZWZGb3JBcHBTcGVjaWZpY0hhc2hcblx0XHRcdD8gKEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkgYXMgYW55KS5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoKFwiXCIpXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblxuXHRfZ2V0SGFzaCgpIHtcblx0XHRyZXR1cm4gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRpdGxlSW5mb3JtYXRpb24gZnJvbSBhIHBhdGguXG5cdCAqIEl0IHVwZGF0ZXMgdGhlIGNhY2hlIHRvIHN0b3JlIFRpdGxlIEluZm9ybWF0aW9uIGlmIG5lY2Vzc2FyeVxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlciNnZXRUaXRsZUluZm9Gcm9tUGF0aFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBzUGF0aCBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIHJldHJpZXZlIHRpdGxlIGluZm9ybWF0aW9uIGZyb20gTWV0YU1vZGVsXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfSAgb1RpdGxlaW5mb3JtYXRpb24gcmV0dXJuZWQgYXMgcHJvbWlzZVxuXHQgKi9cblxuXHRnZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aDogYW55KSB7XG5cdFx0Y29uc3Qgb1RpdGxlSGllcmFyY2h5Q2FjaGUgPSB0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCk7XG5cblx0XHRpZiAob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKSB7XG5cdFx0XHQvLyBUaGUgdGl0bGUgaW5mbyBpcyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUgY2FjaGVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdGNvbnN0IHNUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVHlwZU5hbWVcIik7XG5cdFx0Y29uc3Qgc0FwcFNwZWNpZmljSGFzaCA9IHRoaXMuX2dldEFwcFNwZWNpZmljSGFzaCgpO1xuXHRcdGNvbnN0IHNJbnRlbnQgPSBzQXBwU3BlY2lmaWNIYXNoICsgc1BhdGguc2xpY2UoMSk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZmV0Y2hUaXRsZVZhbHVlKHNQYXRoKS50aGVuKChzVGl0bGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb1RpdGxlSW5mbyA9IHRoaXMuX2NvbXB1dGVUaXRsZUluZm8oc1R5cGVOYW1lLCBzVGl0bGUsIHNJbnRlbnQpO1xuXHRcdFx0b1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdID0gb1RpdGxlSW5mbztcblx0XHRcdHJldHVybiBvVGl0bGVJbmZvO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBFbnN1cmUgdGhhdCB0aGUgdXNoZWxsIHNlcnZpY2UgcmVjZWl2ZXMgYWxsIGVsZW1lbnRzXG5cdCAqICh0aXRsZSwgc3VidGl0bGUsIGludGVudCwgaWNvbikgYXMgc3RyaW5ncy5cblx0ICpcblx0ICogQW5ub3RhdGlvbiBIZWFkZXJJbmZvIGFsbG93cyBmb3IgYmluZGluZyBvZiB0aXRsZSBhbmQgZGVzY3JpcHRpb25cblx0ICogKHdoaWNoIGFyZSB1c2VkIGhlcmUgYXMgdGl0bGUgYW5kIHN1YnRpdGxlKSB0byBhbnkgZWxlbWVudCBpbiB0aGUgZW50aXR5XG5cdCAqIChiZWluZyBwb3NzaWJseSB0eXBlcyBsaWtlIGJvb2xlYW4sIHRpbWVzdGFtcCwgZG91YmxlLCBldGMuKVxuXHQgKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGhpZXJhcmNoeSBhbmQgY29udmVydHMgbm9uLXN0cmluZyB0eXBlcyB0byBzdHJpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYUhpZXJhcmNoeSBTaGVsbCB0aXRsZSBoaWVyYXJjaHlcblx0ICogQHJldHVybnMgeyp9IENvcHkgb2Ygc2hlbGwgdGl0bGUgaGllcmFyY2h5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGFzIHN0cmluZ3Ncblx0ICovXG5cdF9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3MoYUhpZXJhcmNoeTogYW55KSB7XG5cdFx0Y29uc3QgYUhpZXJhcmNoeVNoZWxsID0gW107XG5cdFx0Zm9yIChjb25zdCBsZXZlbCBpbiBhSGllcmFyY2h5KSB7XG5cdFx0XHRjb25zdCBvSGllcmFyY2h5ID0gYUhpZXJhcmNoeVtsZXZlbF07XG5cdFx0XHRjb25zdCBvU2hlbGxIaWVyYXJjaHk6IGFueSA9IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0hpZXJhcmNoeSkge1xuXHRcdFx0XHRvU2hlbGxIaWVyYXJjaHlba2V5XSA9IHR5cGVvZiBvSGllcmFyY2h5W2tleV0gIT09IFwic3RyaW5nXCIgPyBTdHJpbmcob0hpZXJhcmNoeVtrZXldKSA6IG9IaWVyYXJjaHlba2V5XTtcblx0XHRcdH1cblx0XHRcdGFIaWVyYXJjaHlTaGVsbC5wdXNoKG9TaGVsbEhpZXJhcmNoeSk7XG5cdFx0fVxuXHRcdHJldHVybiBhSGllcmFyY2h5U2hlbGw7XG5cdH1cblxuXHRfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoKHNIYXNoOiBhbnkpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRsZXQgc1RhcmdldFR5cGUgPSBcIlwiO1xuXG5cdFx0Y29uc3QgYVJvdXRlcyA9IG9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmcvcm91dGVzXCIpO1xuXHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVJvdXRlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0Y29uc3Qgb1JvdXRlID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRSb3V0ZShhUm91dGVzW2pdLm5hbWUpO1xuXHRcdFx0aWYgKG9Sb3V0ZS5tYXRjaChzSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9IEFycmF5LmlzQXJyYXkoYVJvdXRlc1tqXS50YXJnZXQpID8gYVJvdXRlc1tqXS50YXJnZXRbMF0gOiBhUm91dGVzW2pdLnRhcmdldDtcblx0XHRcdFx0c1RhcmdldFR5cGUgPSAob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRUYXJnZXQoc1RhcmdldCkgYXMgYW55KS5fb09wdGlvbnMubmFtZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNUYXJnZXRUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdXBkYXRpbmcgdGhlIHNoZWxsIHRpdGxlIGFmdGVyIGVhY2ggbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqIEBwYXJhbSB7Kn0gb1ZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyB7Kn0gQSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbWVudSBpcyBmaWxsZWQgcHJvcGVybHlcblx0ICovXG5cdF9jb21wdXRlVGl0bGVIaWVyYXJjaHkob1ZpZXc6IGFueSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0b0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0b0N1cnJlbnRQYWdlID0gb1ZpZXcuZ2V0UGFyZW50KCksXG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzID0gW10sXG5cdFx0XHRzQXBwU3BlY2lmaWNIYXNoID0gdGhpcy5fZ2V0QXBwU3BlY2lmaWNIYXNoKCksXG5cdFx0XHRzQXBwVGl0bGUgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIikudGl0bGUgfHwgXCJcIixcblx0XHRcdHNBcHBTdWJUaXRsZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmFwcFwiKS5hcHBTdWJUaXRsZSB8fCBcIlwiO1xuXHRcdGxldCBvUGFnZVRpdGxlSW5mb3JtYXRpb246IGFueSwgc05ld1BhdGg7XG5cblx0XHRpZiAob0N1cnJlbnRQYWdlICYmIG9DdXJyZW50UGFnZS5fZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24pIHtcblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgYSBMUiwgdXNlIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0aWYgKHRoaXMuX2dldFRhcmdldFR5cGVGcm9tSGFzaChcIlwiKSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaChQcm9taXNlLnJlc29sdmUodGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhzQXBwVGl0bGUsIHNBcHBTdWJUaXRsZSwgc0FwcFNwZWNpZmljSGFzaCkpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRoZW4gbWFuYWdlIG90aGVyIHBhZ2VzXG5cdFx0XHRcdHNOZXdQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBhUGF0aFBhcnRzID0gc05ld1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRsZXQgc1BhdGggPSBcIlwiO1xuXG5cdFx0XHRcdGFQYXRoUGFydHMuc2hpZnQoKTsgLy8gUmVtb3ZlIHRoZSBmaXJzdCBzZWdtZW50IChlbXB0eSBzdHJpbmcpIGFzIGl0IGhhcyBiZWVuIG1hbmFnZWQgYWJvdmVcblx0XHRcdFx0YVBhdGhQYXJ0cy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgYXMgaXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZSBhbmQgc2hvdWxkbid0IGFwcGVhciBpbiB0aGUgbWVudVxuXG5cdFx0XHRcdGFQYXRoUGFydHMuZm9yRWFjaCgoc1BhdGhQYXJ0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRzUGF0aCArPSBcIi9cIiArIHNQYXRoUGFydDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdHNQYXJhbWV0ZXJQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCksXG5cdFx0XHRcdFx0XHRiSXNQYXJhbWV0ZXJpemVkID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhcmFtZXRlclBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRcIik7XG5cdFx0XHRcdFx0aWYgKCFiSXNQYXJhbWV0ZXJpemVkKSB7XG5cdFx0XHRcdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2godGhpcy5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEN1cnJlbnQgcGFnZVxuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gb0N1cnJlbnRQYWdlLl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpO1xuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gdGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhcblx0XHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uLnRpdGxlLFxuXHRcdFx0XHRvUGFnZVRpdGxlSW5mb3JtYXRpb24uc3VidGl0bGUsXG5cdFx0XHRcdHNBcHBTcGVjaWZpY0hhc2ggKyB0aGlzLl9nZXRIYXNoKClcblx0XHRcdCk7XG5cblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKClbc05ld1BhdGhdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpW3NBcHBTcGVjaWZpY0hhc2hdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2goUHJvbWlzZS5yZWplY3QoXCJUaXRsZSBpbmZvcm1hdGlvbiBtaXNzaW5nIGluIEhlYWRlckluZm9cIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcylcblx0XHRcdC50aGVuKChhVGl0bGVJbmZvSGllcmFyY2h5OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIGZvciBzaGVsbCB3aGljaCBpcyBleHBlY3RpbmcgYWxsIGVsZW1lbnRzIGJlaW5nIG9mIHR5cGUgc3RyaW5nXG5cdFx0XHRcdGNvbnN0IGFUaXRsZUluZm9IaWVyYXJjaHlTaGVsbCA9IHRoaXMuX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyhhVGl0bGVJbmZvSGllcmFyY2h5KSxcblx0XHRcdFx0XHRzVGl0bGUgPSBvUGFnZVRpdGxlSW5mb3JtYXRpb24udGl0bGU7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEhpZXJhcmNoeShhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwucmV2ZXJzZSgpKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0VGl0bGUoc1RpdGxlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHkgPSBmYWxzZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0Y2FsY3VsYXRlTGF5b3V0KGlOZXh0RkNMTGV2ZWw6IG51bWJlciwgc0hhc2g6IHN0cmluZywgc1Byb3Bvc2VkTGF5b3V0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtlZXBDdXJyZW50TGF5b3V0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgYWZ0ZXIgYSB2aWV3IGhhcyBiZWVuIGJvdW5kIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBoYXMgYmVlbiBib3VuZCB0byBhIHZpZXdcblx0ICovXG5cdG9uQ29udGV4dEJvdW5kVG9WaWV3KG9Db250ZXh0OiBhbnkpIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNEZWVwZXN0UGF0aCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikuZ2V0UHJvcGVydHkoXCIvZGVlcGVzdFBhdGhcIiksXG5cdFx0XHRcdHNWaWV3Q29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHRcdGlmICghc0RlZXBlc3RQYXRoIHx8IHNEZWVwZXN0UGF0aC5pbmRleE9mKHNWaWV3Q29udGV4dFBhdGgpICE9PSAwKSB7XG5cdFx0XHRcdC8vIFRoZXJlIHdhcyBubyBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIGRlZXBlc3QgcmVhY2hlZCBwYXRoLCBvciB0aGUgcGF0aFxuXHRcdFx0XHQvLyBmb3IgdGhlIHZpZXcgaXNuJ3QgYSBzdWJwYXRoIG9mIHRoZSBwcmV2aW91cyBkZWVwZXN0IHBhdGggLS0+IHVwZGF0ZVxuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RlZXBlc3RQYXRoXCIsIHNWaWV3Q29udGV4dFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRkaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHVwZGF0ZVVJU3RhdGVGb3JWaWV3KG9WaWV3OiBhbnksIEZDTExldmVsOiBhbnkpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKTogdm9pZCB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cbn1cbmludGVyZmFjZSBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIge1xuXHRvbkNvbnRhaW5lclJlYWR5PygpOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXI7XG4iXX0=