@sapui5/sap.fe.templates 1.100.0 → 1.102.0

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