@sapui5/sap.fe.templates 1.98.0 → 1.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/package.json +9 -6
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +25 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +31 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +157 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +83 -39
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +124 -107
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +34 -27
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1112 -1001
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +55 -53
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +135 -136
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +444 -406
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -0
  24. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +31 -23
  25. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  27. package/src/sap/fe/templates/ListReport/view/fragments/MultipleModeOld.fragment.xml +50 -0
  28. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +479 -473
  29. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
  30. package/src/sap/fe/templates/ObjectPage/Component.js +170 -149
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +141 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +14 -53
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1531 -1464
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -0
  37. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +137 -95
  38. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +25 -21
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +99 -53
  42. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  43. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +21 -16
  44. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +51 -47
  46. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +35 -34
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +16 -15
  50. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +12 -11
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  53. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +56 -52
  54. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +16 -17
  56. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +14 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +24 -21
  60. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +311 -317
  62. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +67 -57
  64. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  65. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +1 -1
  66. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +3 -3
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +18 -24
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +38 -0
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +1 -1
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +9 -5
  71. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +1 -0
  72. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +1 -0
  73. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +33 -0
  74. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +17 -0
  75. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +18 -0
  76. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +3 -3
  77. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +3 -3
  78. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  79. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +852 -815
  80. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -0
  81. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +206 -187
  82. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  83. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +485 -459
  84. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  85. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +17 -14
  86. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  87. package/src/sap/fe/templates/TableScroller.js +46 -53
  88. package/src/sap/fe/templates/TableScroller.ts +48 -0
  89. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  90. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +22 -0
  91. package/src/sap/fe/templates/library.js +50 -63
  92. package/src/sap/fe/templates/library.ts +57 -0
  93. package/src/sap/fe/templates/messagebundle.properties +32 -36
  94. package/src/sap/fe/templates/messagebundle_ar.properties +15 -8
  95. package/src/sap/fe/templates/messagebundle_bg.properties +15 -8
  96. package/src/sap/fe/templates/messagebundle_ca.properties +15 -8
  97. package/src/sap/fe/templates/messagebundle_cs.properties +15 -8
  98. package/src/sap/fe/templates/messagebundle_cy.properties +15 -8
  99. package/src/sap/fe/templates/messagebundle_da.properties +15 -8
  100. package/src/sap/fe/templates/messagebundle_de.properties +15 -8
  101. package/src/sap/fe/templates/messagebundle_el.properties +16 -9
  102. package/src/sap/fe/templates/messagebundle_en.properties +15 -8
  103. package/src/sap/fe/templates/messagebundle_en_GB.properties +15 -8
  104. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +9 -6
  105. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +15 -8
  106. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +15 -8
  107. package/src/sap/fe/templates/messagebundle_es.properties +15 -8
  108. package/src/sap/fe/templates/messagebundle_es_MX.properties +15 -8
  109. package/src/sap/fe/templates/messagebundle_et.properties +15 -8
  110. package/src/sap/fe/templates/messagebundle_fi.properties +15 -8
  111. package/src/sap/fe/templates/messagebundle_fr.properties +15 -8
  112. package/src/sap/fe/templates/messagebundle_fr_CA.properties +15 -8
  113. package/src/sap/fe/templates/messagebundle_hi.properties +15 -8
  114. package/src/sap/fe/templates/messagebundle_hr.properties +16 -9
  115. package/src/sap/fe/templates/messagebundle_hu.properties +15 -8
  116. package/src/sap/fe/templates/messagebundle_id.properties +17 -10
  117. package/src/sap/fe/templates/messagebundle_it.properties +15 -8
  118. package/src/sap/fe/templates/messagebundle_iw.properties +15 -8
  119. package/src/sap/fe/templates/messagebundle_ja.properties +15 -8
  120. package/src/sap/fe/templates/messagebundle_kk.properties +15 -8
  121. package/src/sap/fe/templates/messagebundle_ko.properties +15 -8
  122. package/src/sap/fe/templates/messagebundle_lt.properties +15 -8
  123. package/src/sap/fe/templates/messagebundle_lv.properties +15 -8
  124. package/src/sap/fe/templates/messagebundle_ms.properties +15 -8
  125. package/src/sap/fe/templates/messagebundle_nl.properties +15 -8
  126. package/src/sap/fe/templates/messagebundle_no.properties +15 -8
  127. package/src/sap/fe/templates/messagebundle_pl.properties +15 -8
  128. package/src/sap/fe/templates/messagebundle_pt.properties +18 -11
  129. package/src/sap/fe/templates/messagebundle_pt_PT.properties +16 -9
  130. package/src/sap/fe/templates/messagebundle_ro.properties +15 -8
  131. package/src/sap/fe/templates/messagebundle_ru.properties +15 -8
  132. package/src/sap/fe/templates/messagebundle_sh.properties +15 -8
  133. package/src/sap/fe/templates/messagebundle_sk.properties +15 -8
  134. package/src/sap/fe/templates/messagebundle_sl.properties +15 -8
  135. package/src/sap/fe/templates/messagebundle_sv.properties +16 -9
  136. package/src/sap/fe/templates/messagebundle_th.properties +15 -8
  137. package/src/sap/fe/templates/messagebundle_tr.properties +15 -8
  138. package/src/sap/fe/templates/messagebundle_uk.properties +16 -9
  139. package/src/sap/fe/templates/messagebundle_vi.properties +15 -8
  140. package/src/sap/fe/templates/messagebundle_zh_CN.properties +15 -8
  141. package/src/sap/fe/templates/messagebundle_zh_TW.properties +15 -8
  142. package/ui5.yaml +0 -3
  143. package/src/sap/fe/templates/ListReport/overrides/MassEdit.js +0 -95
  144. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.xml +0 -49
@@ -1,1466 +1,1533 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(
6
- [
7
- "sap/fe/core/PageController",
8
- "sap/fe/core/controllerextensions/InternalRouting",
9
- "./overrides/InternalRouting",
10
- "sap/fe/core/controllerextensions/EditFlow",
11
- "sap/fe/core/controllerextensions/InternalEditFlow",
12
- "sap/fe/core/controllerextensions/PageReady",
13
- "sap/fe/core/controllerextensions/InternalIntentBasedNavigation",
14
- "sap/fe/core/controllerextensions/IntentBasedNavigation",
15
- "./overrides/IntentBasedNavigation",
16
- "sap/base/Log",
17
- "sap/base/util/merge",
18
- "sap/fe/core/CommonUtils",
19
- "sap/fe/navigation/SelectionVariant",
20
- "sap/fe/macros/table/Utils",
21
- "sap/m/MessageBox",
22
- "sap/fe/core/BusyLocker",
23
- "sap/m/Link",
24
- "sap/fe/macros/chart/ChartRuntime",
25
- "sap/fe/templates/ObjectPage/ExtensionAPI",
26
- "sap/ui/core/mvc/OverrideExecution",
27
- "sap/fe/core/controllerextensions/ViewState",
28
- "./overrides/ViewState",
29
- "sap/fe/templates/RootContainer/overrides/EditFlow",
30
- "sap/fe/core/helpers/ModelHelper",
31
- "sap/fe/core/controllerextensions/Routing",
32
- "sap/m/InstanceManager",
33
- "sap/fe/core/controllerextensions/MessageHandler",
34
- "./overrides/MessageHandler",
35
- "sap/fe/core/controllerextensions/Share",
36
- "./overrides/Share",
37
- "sap/fe/macros/DelegateUtil",
38
- "sap/fe/macros/CommonHelper",
39
- "sap/fe/templates/TableScroller",
40
- "sap/ui/model/json/JSONModel",
41
- "sap/fe/core/controllerextensions/Paginator",
42
- "./overrides/Paginator",
43
- "sap/fe/core/controllerextensions/Placeholder",
44
- "sap/base/util/UriParameters",
45
- "sap/fe/core/controllerextensions/MassEdit"
46
- ],
47
- function(
48
- PageController,
49
- InternalRouting,
50
- InternalRoutingOverride,
51
- EditFlow,
52
- InternalEditFlow,
53
- PageReady,
54
- InternalIntentBasedNavigation,
55
- IntentBasedNavigation,
56
- IntentBasedNavigationOverride,
57
- Log,
58
- merge,
59
- CommonUtils,
60
- SelectionVariant,
61
- TableUtils,
62
- MessageBox,
63
- BusyLocker,
64
- Link,
65
- ChartRuntime,
66
- ExtensionAPI,
67
- OverrideExecution,
68
- ViewState,
69
- ViewStateOverrides,
70
- EditFlowOverrides,
71
- ModelHelper,
72
- Routing,
73
- InstanceManager,
74
- MessageHandler,
75
- MessageHandlerOverride,
76
- Share,
77
- ShareOverrides,
78
- DelegateUtil,
79
- CommonHelper,
80
- TableScroller,
81
- JSONModel,
82
- Paginator,
83
- PaginatorOverride,
84
- Placeholder,
85
- UriParameters,
86
- MassEdit
87
- ) {
88
- "use strict";
89
-
90
- return PageController.extend("sap.fe.templates.ObjectPage.ObjectPageController", {
91
- metadata: {
92
- methods: {
93
- getExtensionAPI: {
94
- "public": true,
95
- "final": true
96
- },
97
- onPageReady: {
98
- "public": true,
99
- "final": false,
100
- overrideExecution: OverrideExecution.After
101
- }
102
- }
103
- },
104
- placeholder: Placeholder,
105
- editFlow: EditFlow,
106
- share: Share.override(ShareOverrides),
107
- _editFlow: InternalEditFlow.override(EditFlowOverrides),
108
- _routing: InternalRouting.override(InternalRoutingOverride),
109
- paginator: Paginator.override(PaginatorOverride),
110
- messageHandler: MessageHandler.override(MessageHandlerOverride),
111
- intentBasedNavigation: IntentBasedNavigation.override(IntentBasedNavigationOverride),
112
- _intentBasedNavigation: InternalIntentBasedNavigation.override({
113
- getNavigationMode: function() {
114
- var bIsStickyEditMode =
115
- this._oView.getController().getStickyEditMode && this._oView.getController().getStickyEditMode();
116
- return bIsStickyEditMode ? "explace" : undefined;
117
- }
118
- }),
119
- viewState: ViewState.override(ViewStateOverrides),
120
- pageReady: PageReady.override({
121
- isContextExpected: function() {
122
- return true;
123
- }
124
- }),
125
- massEdit: MassEdit,
126
-
127
- getExtensionAPI: function(sId) {
128
- if (sId) {
129
- // to allow local ID usage for custom pages we'll create/return own instances for custom sections
130
- this.mCustomSectionExtensionAPIs = this.mCustomSectionExtensionAPIs || {};
131
-
132
- if (!this.mCustomSectionExtensionAPIs[sId]) {
133
- this.mCustomSectionExtensionAPIs[sId] = new ExtensionAPI(this, sId);
134
- }
135
- return this.mCustomSectionExtensionAPIs[sId];
136
- } else {
137
- if (!this.extensionAPI) {
138
- this.extensionAPI = new ExtensionAPI(this);
139
- }
140
- return this.extensionAPI;
141
- }
142
- },
143
-
144
- onInit: function() {
145
- PageController.prototype.onInit.apply(this);
146
- var oObjectPage = this.byId("fe::ObjectPage");
147
-
148
- // Setting defaults of internal model context
149
- var oInternalModelContext = this.getView().getBindingContext("internal");
150
- oInternalModelContext.setProperty("externalNavigationContext", { "page": true });
151
- oInternalModelContext.setProperty("relatedApps", {
152
- visibility: false,
153
- items: null
154
- });
155
- oInternalModelContext.setProperty("batchGroups", this._getBatchGroupsForView());
156
- oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
157
- if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
158
- //Attaching the event to make the subsection context binding active when it is visible.
159
- oObjectPage.attachEvent("subSectionEnteredViewPort", this._handleSubSectionEnteredViewPort.bind(this));
160
- }
161
- },
162
-
163
- onExit: function() {
164
- var that = this;
165
- if (this.mCustomSectionExtensionAPIs) {
166
- Object.keys(this.mCustomSectionExtensionAPIs).forEach(function(sId) {
167
- that.mCustomSectionExtensionAPIs[sId] && that.mCustomSectionExtensionAPIs[sId].destroy();
168
- });
169
- delete this.mCustomSectionExtensionAPIs;
170
- }
171
- this.extensionAPI && this.extensionAPI.destroy();
172
- delete this.extensionAPI;
173
-
174
- var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton"),
175
- oMessagePopover = oMessageButton ? oMessageButton.oMessagePopover : null;
176
- if (oMessagePopover && oMessagePopover.isOpen()) {
177
- oMessagePopover.close();
178
- }
179
- },
180
-
181
- _getTableBinding: function(oTable) {
182
- return oTable && oTable.getRowBinding();
183
- },
184
-
185
- onBeforeRendering: function() {
186
- PageController.prototype.onBeforeRendering.apply(this);
187
- },
188
-
189
- onAfterRendering: function(oEvent) {
190
- var that = this;
191
- this.getView()
192
- .getModel("sap.fe.i18n")
193
- .getResourceBundle()
194
- .then(function(response) {
195
- that.oResourceBundle = response;
196
- })
197
- .catch(function(oError) {
198
- Log.error("Error while retrieving the resource bundle", oError);
199
- });
200
- },
201
-
202
- _onBeforeBinding: function(oContext, mParameters) {
203
- // TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
204
- var that = this,
205
- aTables = this._findTables(),
206
- oFastCreationRow,
207
- oObjectPage = this.byId("fe::ObjectPage"),
208
- oInternalModelContext = that.getView().getBindingContext("internal"),
209
- oInternalModel = that.getView().getModel("internal"),
210
- aBatchGroups = oInternalModelContext.getProperty("batchGroups"),
211
- iViewLevel = this.getView().getViewData().viewLevel;
212
-
213
- aBatchGroups.push("$auto");
214
- if (mParameters.bDraftNavigation !== true) {
215
- this._closeSideContent();
216
- }
217
- if (
218
- oObjectPage.getBindingContext() &&
219
- oObjectPage.getBindingContext().hasPendingChanges() &&
220
- !aBatchGroups.some(
221
- oObjectPage
222
- .getBindingContext()
223
- .getModel()
224
- .hasPendingChanges.bind(oObjectPage.getBindingContext().getModel())
225
- )
226
- ) {
227
- /* In case there are pending changes for the creation row and no others we need to reset the changes
228
- TODO: this is just a quick solution, this needs to be reworked
229
- */
230
-
231
- oObjectPage
232
- .getBindingContext()
233
- .getBinding()
234
- .resetChanges();
235
- }
236
-
237
- // For now we have to set the binding context to null for every fast creation row
238
- // TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
239
- for (var i = 0; i < aTables.length; i++) {
240
- oFastCreationRow = aTables[i].getCreationRow();
241
- if (oFastCreationRow) {
242
- oFastCreationRow.setBindingContext(null);
243
- }
244
- }
245
-
246
- // Scroll to present Section so that bindings are enabled during navigation through paginator buttons, as there is no view rerendering/rebind
247
- var fnScrollToPresentSection = function(oEvent) {
248
- if (!oObjectPage.isFirstRendering() && !mParameters.bPersistOPScroll) {
249
- oObjectPage.setSelectedSection(null);
250
- }
251
- };
252
- oObjectPage.attachEventOnce("modelContextChange", fnScrollToPresentSection);
253
-
254
- // if the structure of the ObjectPageLayout is changed then scroll to present Section
255
- // FIXME Is this really working as intended ? Initially this was onBeforeRendering, but never triggered onBeforeRendering because it was registered after it
256
- var oDelegateOnBefore = {
257
- onAfterRendering: fnScrollToPresentSection
258
- };
259
- oObjectPage.addEventDelegate(oDelegateOnBefore, that);
260
- this.pageReady.attachEventOnce("pageReady", function(oEvent) {
261
- oObjectPage.removeEventDelegate(oDelegateOnBefore);
262
- });
263
-
264
- //Set the Binding for Paginators using ListBinding ID
265
- if (iViewLevel > 1) {
266
- var oBinding = mParameters && mParameters.listBinding,
267
- oPaginatorCurrentContext = oInternalModel.getProperty("/paginatorCurrentContext");
268
- if (oPaginatorCurrentContext) {
269
- var oBindingToUse = oPaginatorCurrentContext.getBinding();
270
- this.paginator.initialize(oBindingToUse, oPaginatorCurrentContext);
271
- oInternalModel.setProperty("/paginatorCurrentContext", null);
272
- } else if (oBinding) {
273
- if (oBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
274
- this.paginator.initialize(oBinding, oContext);
275
- } else {
276
- //if the binding type is not ODataListBinding because of a deeplink navigation or a refresh of the page
277
- // we need to create it
278
- var sContextPath = oBinding.getPath().replace(/\([^\)]*\)*$/, ""); //removing the last tuple
279
- oBinding = new sap.ui.model.odata.v4.ODataListBinding(
280
- oBinding.oModel,
281
- "",
282
- oBinding.oModel.createBindingContext(sContextPath)
283
- );
284
-
285
- oBinding.getContexts(0);
286
- oBinding.attachEvent("change", function _setListBindingAsync() {
287
- if (oBinding.getContexts().length > 0) {
288
- that.paginator.initialize(oBinding, oContext);
289
- oBinding.detachEvent("change", _setListBindingAsync);
290
- }
291
- });
292
- }
293
- }
294
- }
295
- if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
296
- var aSections = oObjectPage.getSections(),
297
- bUseIconTabBar = oObjectPage.getUseIconTabBar(),
298
- iSkip = 2,
299
- bIsInEditMode = oObjectPage.getModel("ui").getProperty("/editMode") === "Editable",
300
- bEditableHeader = this.getView().getViewData().editableHeaderContent;
301
- for (var iSection = 0; iSection < aSections.length; iSection++) {
302
- var oSection = aSections[iSection];
303
- var aSubSections = oSection.getSubSections();
304
- for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
305
- // In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
306
- if (iSkip < 1 || (bUseIconTabBar && (iSection > 1 || (iSection === 1 && !bEditableHeader && !bIsInEditMode)))) {
307
- var oSubSection = aSubSections[iSubSection];
308
- if (oSubSection.data().isVisibilityDynamic !== "true") {
309
- oSubSection.setBindingContext(null);
310
- }
311
- }
312
- }
313
- }
314
- }
315
-
316
- if (this.placeholder.isPlaceholderEnabled() && mParameters.showPlaceholder) {
317
- var oView = this.getView();
318
- var oNavContainer = oView.getParent().oContainer.getParent();
319
- if (oNavContainer) {
320
- oNavContainer.showPlaceholder({});
321
- }
322
- }
323
- },
324
-
325
- _getFirstClickableElement: function(oObjectPage) {
326
- var oFirstClickableElement;
327
- var aActions = oObjectPage.getHeaderTitle() && oObjectPage.getHeaderTitle().getActions();
328
- if (aActions && aActions.length) {
329
- oFirstClickableElement = aActions.find(function(oAction) {
330
- return oAction.getVisible() && oAction.getEnabled();
331
- });
332
- }
333
- return oFirstClickableElement;
334
- },
335
-
336
- _getFirstEmptyMandatoryFieldFromSubSection: function(aSubSections) {
337
- if (aSubSections) {
338
- for (var subSection = 0; subSection < aSubSections.length; subSection++) {
339
- var aBlocks = aSubSections[subSection].getBlocks();
340
-
341
- if (aBlocks) {
342
- for (var block = 0; block < aBlocks.length; block++) {
343
- var aFormContainers;
344
-
345
- if (aBlocks[block].isA("sap.ui.layout.form.Form")) {
346
- aFormContainers = aBlocks[block].getFormContainers();
347
- } else if (
348
- aBlocks[block].getContent &&
349
- aBlocks[block].getContent() &&
350
- aBlocks[block].getContent().isA("sap.ui.layout.form.Form")
351
- ) {
352
- aFormContainers = aBlocks[block].getContent().getFormContainers();
353
- }
354
-
355
- if (aFormContainers) {
356
- for (var formContainer = 0; formContainer < aFormContainers.length; formContainer++) {
357
- var aFormElements = aFormContainers[formContainer].getFormElements();
358
- if (aFormElements) {
359
- for (var formElement = 0; formElement < aFormElements.length; formElement++) {
360
- var aFields = aFormElements[formElement].getFields();
361
-
362
- if (aFields[0].getRequired() && !aFields[0].getValue()) {
363
- return aFields[0];
364
- }
365
- }
366
- }
367
- }
368
- }
369
- }
370
- }
371
- }
372
- }
373
- return undefined;
374
- },
375
-
376
- _updateFocusInEditMode: function(aSubSections) {
377
- var oObjectPage = this.byId("fe::ObjectPage");
378
-
379
- var oMandatoryField = this._getFirstEmptyMandatoryFieldFromSubSection(aSubSections);
380
- var oFieldToFocus;
381
- if (oMandatoryField) {
382
- oFieldToFocus = oMandatoryField.content.getContentEdit()[0];
383
- } else {
384
- oFieldToFocus = oObjectPage._getFirstEditableInput() || this._getFirstClickableElement(oObjectPage);
385
- }
386
-
387
- if (oFieldToFocus) {
388
- setTimeout(function() {
389
- // We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
390
- oFieldToFocus.focus();
391
- }, 0);
392
- }
393
- },
394
-
395
- _handleSubSectionEnteredViewPort: function(oEvent) {
396
- var oSubSection = oEvent.getParameter("subSection");
397
- oSubSection.setBindingContext(undefined);
398
- },
399
-
400
- _onBackNavigationInDraft: function(oContext) {
401
- if (
402
- this.getAppComponent()
403
- .getRouterProxy()
404
- .checkIfBackHasSameContext()
405
- ) {
406
- // Back nav will keep the same context --> no need to display the dialog
407
- history.back();
408
- } else {
409
- CommonUtils.fnProcessDataLossOrDraftDiscardConfirmation(
410
- function() {
411
- history.back();
412
- },
413
- Function.prototype,
414
- oContext,
415
- this,
416
- false
417
- );
418
- }
419
- },
420
-
421
- _onAfterBinding: function(oBindingContext, mParameters) {
422
- var oObjectPage = this.byId("fe::ObjectPage"),
423
- that = this,
424
- aTables = this._findTables(),
425
- aFormContainers = this._findFormContainers();
426
-
427
- this._sideEffects.clearPropertiesStatus();
428
-
429
- // TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
430
- // binding with ownRequest
431
- oBindingContext = oObjectPage.getBindingContext();
432
-
433
- var aIBNActions = [];
434
- oObjectPage.getSections().forEach(function(oSection) {
435
- oSection.getSubSections().forEach(function(oSubSection) {
436
- aIBNActions = CommonUtils.getIBNActions(oSubSection, aIBNActions);
437
- });
438
- });
439
-
440
- // Assign internal binding contexts to oFormContainer:
441
- // 1. It is not possible to assign the internal binding context to the XML fragment
442
- // (FormContainer.fragment.xml) yet - it is used already for the data-structure.
443
- // 2. Another problem is, that FormContainers assigned to a 'MoreBlock' does not have an
444
- // internal model context at all.
445
-
446
- aFormContainers.forEach(function(oFormContainer) {
447
- var oInternalModelContext,
448
- oInternalModel = oObjectPage.getModel("internal"),
449
- sPageContextPath = "/pages/" + that.getView().getId(),
450
- sFormContainerContextPath = "controls/" + that.getView().getLocalId(oFormContainer.getId()),
451
- SHOW_DETAILS = "showDetails";
452
- if (oFormContainer.getModel("internal") === undefined) {
453
- oFormContainer.setModel(oInternalModel, "internal");
454
- oFormContainer.setBindingContext(
455
- oInternalModel.createBindingContext(sPageContextPath + "/" + sFormContainerContextPath),
456
- "internal"
457
- );
458
- oFormContainer.bindElement({ path: "", model: "internal" });
459
- } else {
460
- oFormContainer.bindElement({ path: sFormContainerContextPath, model: "internal" });
461
- }
462
- oInternalModelContext = oFormContainer.getBindingContext("internal");
463
- oInternalModelContext.setProperty(SHOW_DETAILS, false);
464
- });
465
- aTables.forEach(function(oTable) {
466
- var oInternalModelContext = oTable.getBindingContext("internal");
467
- oInternalModelContext.setProperty("creationRowFieldValidity", {});
468
- oInternalModelContext.setProperty("creationRowCustomValidity", {});
469
-
470
- aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
471
- // temporary workaround for BCP: 2080218004
472
- // Need to fix with BLI: FIORITECHP1-15274
473
- // only for edit mode, we clear the table cache
474
- // Workaround starts here!!
475
- var oTableRowBinding = oTable.getRowBinding();
476
- if (oTableRowBinding) {
477
- if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
478
- // apply for both edit and display mode in sticky
479
- oTableRowBinding.removeCachesAndMessages("");
480
- }
481
- }
482
- // Workaround ends here!!
483
-
484
- // Update 'enabled' property of DataFieldForAction buttons on table toolbar
485
- // The same is also performed on Table selectionChange event
486
- var oActionOperationAvailableMap = JSON.parse(
487
- CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))
488
- ),
489
- aSelectedContexts = oTable.getSelectedContexts();
490
-
491
- CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
492
- });
493
- CommonUtils.getSemanticTargetsFromPageModel(that, "_pageModel");
494
- //Retrieve Object Page header actions from Object Page title control
495
- var oObjectPageTitle = oObjectPage.getHeaderTitle();
496
- var aIBNHeaderActions = [];
497
- aIBNHeaderActions = CommonUtils.getIBNActions(oObjectPageTitle, aIBNHeaderActions);
498
- aIBNActions = aIBNActions.concat(aIBNHeaderActions);
499
- CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
500
-
501
- var oModel, oFinalUIState;
502
-
503
- // TODO: this should be moved into an init event of the MDC tables (not yet existing) and should be part
504
- // of any controller extension
505
- /**
506
- * @param oTable
507
- * @param oListBinding
508
- */
509
- function enableFastCreationRow(oTable, oListBinding) {
510
- var oFastCreationRow = oTable.getCreationRow(),
511
- oFastCreationListBinding,
512
- oFastCreationContext;
513
-
514
- if (oFastCreationRow) {
515
- oFinalUIState
516
- .then(function() {
517
- if (oFastCreationRow.getModel("ui").getProperty("/isEditable")) {
518
- oFastCreationListBinding = oModel.bindList(oListBinding.getPath(), oListBinding.getContext(), [], [], {
519
- $$updateGroupId: "doNotSubmit",
520
- $$groupId: "doNotSubmit"
521
- });
522
- // Workaround suggested by OData model v4 colleagues
523
- oFastCreationListBinding.refreshInternal = function() {};
524
- /*
525
- oFastCreationListBinding.hasPendingChanges = function() {
526
- return false;
527
- };
528
- */
529
-
530
- oFastCreationContext = oFastCreationListBinding.create();
531
- oFastCreationRow.setBindingContext(oFastCreationContext);
532
-
533
- // this is needed to avoid console error
534
- oFastCreationContext.created().catch(function() {
535
- Log.trace("transient fast creation context deleted");
536
- });
537
- }
538
- })
539
- .catch(function(oError) {
540
- Log.error("Error while computing the final UI state", oError);
541
- });
542
- }
543
- }
544
-
545
- // this should not be needed at the all
546
- /**
547
- * @param oTable
548
- */
549
- function handleTableModifications(oTable) {
550
- var oBinding = that._getTableBinding(oTable),
551
- fnHandleTablePatchEvents = function() {
552
- enableFastCreationRow(oTable, oBinding);
553
- };
554
-
555
- if (!oBinding) {
556
- Log.error("Expected binding missing for table: " + oTable.getId());
557
- return;
558
- }
559
-
560
- if (oBinding.oContext) {
561
- fnHandleTablePatchEvents();
562
- } else {
563
- var fnHandleChange = function() {
564
- if (oBinding.oContext) {
565
- fnHandleTablePatchEvents();
566
- oBinding.detachChange(fnHandleChange);
567
- }
568
- };
569
- oBinding.attachChange(fnHandleChange);
570
- }
571
- }
572
-
573
- if (oBindingContext) {
574
- oModel = oBindingContext.getModel();
575
-
576
- // Compute Edit Mode
577
- oFinalUIState = this._editFlow.computeEditMode(oBindingContext);
578
-
579
- // update related apps once Data is received in case of binding cache is not available
580
- // TODO: this is only a temp solution since we need to call _updateRelatedApps method only after data for Object Page is received (if there is no binding)
581
- if (oBindingContext.getBinding().oCache) {
582
- that._updateRelatedApps();
583
- } else {
584
- var fnUpdateRelatedApps = function() {
585
- that._updateRelatedApps();
586
- oBindingContext.getBinding().detachDataReceived(fnUpdateRelatedApps);
587
- };
588
- oBindingContext.getBinding().attachDataReceived(fnUpdateRelatedApps);
589
- }
590
-
591
- //Attach the patch sent and patch completed event to the object page binding so that we can react
592
- var oBinding = (oBindingContext.getBinding && oBindingContext.getBinding()) || oBindingContext;
593
- oBinding.attachEvent("patchSent", this.editFlow.handlePatchSent, this);
594
- oBinding.attachEvent("patchCompleted", this.editFlow.handlePatchCompleted, this);
595
-
596
- aTables.forEach(function(oTable) {
597
- // access binding only after table is bound
598
- TableUtils.whenBound(oTable)
599
- .then(handleTableModifications)
600
- .catch(function(oError) {
601
- Log.error("Error while waiting for the table to be bound", oError);
602
- });
603
- });
604
-
605
- if (!this.getView().getViewData().useNewLazyLoading) {
606
- // should be called only after binding is ready hence calling it in onAfterBinding
607
- oObjectPage._triggerVisibleSubSectionsEvents();
608
- }
609
- }
610
- },
611
- onPageReady: function(mParameters) {
612
- // Apply app state only after the page is ready with the first section selected
613
- var that = this;
614
- var oView = this.getView();
615
- var oInternalModelContext = oView.getBindingContext("internal");
616
- var oBindingContext = oView.getBindingContext();
617
- //Show popup while navigating back from object page in case of draft
618
- if (oBindingContext) {
619
- var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
620
- if (!bIsStickyMode) {
621
- var oAppComponent = CommonUtils.getAppComponent(oView);
622
- oAppComponent.getShellServices().setBackNavigation(that._onBackNavigationInDraft.bind(that, oBindingContext));
623
- }
624
- }
625
- this.getAppComponent()
626
- .getAppStateHandler()
627
- .applyAppState();
628
-
629
- if (mParameters.forceFocus) {
630
- var oObjectPage = this.byId("fe::ObjectPage");
631
- // set the focus to the first action button, or to the first editable input if in editable mode
632
- var isInDisplayMode = oObjectPage.getModel("ui").getProperty("/editMode") === "Display";
633
- var aVisibleSections = oObjectPage.getSections().filter(function(oSection) {
634
- return oSection.getVisible() === true;
635
- });
636
- // Select the first visible section
637
- oObjectPage.setSelectedSection(aVisibleSections[0].getId());
638
-
639
- if (isInDisplayMode) {
640
- var oFirstClickableElement = this._getFirstClickableElement(oObjectPage);
641
- if (oFirstClickableElement) {
642
- oFirstClickableElement.focus();
643
- }
644
- } else {
645
- var aVisibleSubSections;
646
- if (oView.getViewData().sectionLayout === "Tabs") {
647
- // In a tabbed layout, only the subsections of the selected section are visible on the screen
648
- aVisibleSubSections = aVisibleSections[0].getSubSections();
649
- } else {
650
- // In a paged layout, all subsections of the visible sections are visible on the screen
651
- aVisibleSubSections = aVisibleSections
652
- .map(function(oSection) {
653
- return oSection.getSubSections();
654
- })
655
- .flat();
656
- }
657
- this._updateFocusInEditMode(aVisibleSubSections);
658
- }
659
- }
660
-
661
- oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
662
- this._checkDataPointTitleForExternalNavigation();
663
- },
664
- /**
665
- * Get the status of edit mode for sticky session.
666
- *
667
- * @returns {boolean} The status of edit mode for sticky session
668
- *
669
- *
670
- */
671
- getStickyEditMode: function() {
672
- var oBindingContext = this.oView.getBindingContext && this.oView.getBindingContext(),
673
- bIsStickyEditMode = false;
674
- if (oBindingContext) {
675
- var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
676
- if (bIsStickyMode) {
677
- bIsStickyEditMode = this.oView.getModel("ui").getProperty("/isEditable");
678
- }
679
- }
680
- return bIsStickyEditMode;
681
- },
682
-
683
- _getObjectPageLayoutControl: function() {
684
- return this.byId("fe::ObjectPage");
685
- },
686
-
687
- _getPageTitleInformation: function() {
688
- var oObjectPage = this.byId("fe::ObjectPage");
689
- var oObjectPageSubtitle = oObjectPage.getCustomData().find(function(oCustomData) {
690
- return oCustomData.getKey() === "ObjectPageSubtitle";
691
- });
692
- var oTitleInfo = {
693
- title: oObjectPage.data("ObjectPageTitle") || "",
694
- subtitle: oObjectPageSubtitle && oObjectPageSubtitle.getValue(),
695
- intent: "",
696
- icon: ""
697
- };
698
-
699
- return oTitleInfo;
700
- },
701
-
702
- _executeHeaderShortcut: function(sId) {
703
- var sButtonId = this.getView().getId() + "--" + sId,
704
- oButton = this.byId("fe::ObjectPage")
705
- .getHeaderTitle()
706
- .getActions()
707
- .find(function(oElement) {
708
- return oElement.getId() === sButtonId;
709
- });
710
- CommonUtils.fireButtonPress(oButton);
711
- },
712
-
713
- _executeFooterShortcut: function(sId) {
714
- var sButtonId = this.getView().getId() + "--" + sId,
715
- oButton = this.byId("fe::ObjectPage")
716
- .getFooter()
717
- .getContent()
718
- .find(function(oElement) {
719
- return oElement.getMetadata().getName() === "sap.m.Button" && oElement.getId() === sButtonId;
720
- });
721
- CommonUtils.fireButtonPress(oButton);
722
- },
723
-
724
- _executeTabShortCut: function(oExecution) {
725
- var oObjectPage = this.byId("fe::ObjectPage"),
726
- iSelectedSectionIndex = oObjectPage.indexOfSection(this.byId(oObjectPage.getSelectedSection())),
727
- aSections = oObjectPage.getSections(),
728
- iSectionIndexMax = aSections.length - 1,
729
- sCommand = oExecution.oSource.getCommand(),
730
- newSection;
731
- if (iSelectedSectionIndex !== -1 && iSectionIndexMax > 0) {
732
- if (sCommand === "NextTab") {
733
- if (iSelectedSectionIndex <= iSectionIndexMax - 1) {
734
- newSection = aSections[++iSelectedSectionIndex];
735
- }
736
- } else {
737
- // PreviousTab
738
- if (iSelectedSectionIndex !== 0) {
739
- newSection = aSections[--iSelectedSectionIndex];
740
- }
741
- }
742
- if (newSection) {
743
- oObjectPage.setSelectedSection(newSection);
744
- newSection.focus();
745
- }
746
- }
747
- },
748
-
749
- _getFooterVisibility: function(oEvent) {
750
- var oInternalModelContext = this.getView().getBindingContext("internal");
751
- var sViewId = this.getView().getId();
752
- oInternalModelContext.setProperty("messageFooterContainsErrors", false);
753
- sap.ui
754
- .getCore()
755
- .getMessageManager()
756
- .getMessageModel()
757
- .getData()
758
- .forEach(function(oMessage) {
759
- if (oMessage.validation && oMessage.type === "Error" && oMessage.target.indexOf(sViewId) > -1) {
760
- oInternalModelContext.setProperty("messageFooterContainsErrors", true);
761
- }
762
- });
763
- },
764
-
765
- _showMessagePopover: function(err, oRet) {
766
- if (err) {
767
- Log.error(err);
768
- }
769
- var that = this;
770
- var oMessageButton = that.getView().byId("fe::FooterBar::MessageButton"),
771
- oMessagePopover = oMessageButton.oMessagePopover,
772
- oItemBinding = oMessagePopover.getBinding("items");
773
-
774
- if (oItemBinding.getLength() > 0 && !oMessagePopover.isOpen()) {
775
- oMessageButton.setVisible(true);
776
- // workaround to ensure that oMessageButton is rendered when openBy is called
777
- setTimeout(function() {
778
- oMessagePopover.openBy(oMessageButton);
779
- }, 0);
780
- }
781
- return oRet;
782
- },
783
-
784
- _editDocument: function(oContext) {
785
- var oModel = this.getView().getModel("ui"),
786
- mParameters = {
787
- prepareOnEdit: this.getView().getViewData().prepareOnEdit
788
- };
789
- BusyLocker.lock(oModel);
790
- return this.editFlow.editDocument.apply(this.editFlow, [oContext, mParameters]).finally(function() {
791
- BusyLocker.unlock(oModel);
792
- });
793
- },
794
-
795
- _saveDocument: function(oContext) {
796
- var that = this,
797
- oModel = this.getView().getModel("ui"),
798
- aWaitCreateDocuments = [];
799
- // indicates if we are creating a new row in the OP
800
- var bExecuteSideEffectsOnError = false;
801
- BusyLocker.lock(oModel);
802
- this._findTables().forEach(function(oTable) {
803
- var oBinding = that._getTableBinding(oTable);
804
- var mParameters = {
805
- creationMode: oTable.data("creationMode"),
806
- creationRow: oTable.getCreationRow(),
807
- createAtEnd: oTable.data("createAtEnd") === "true"
808
- };
809
- var bCreateDocument =
810
- mParameters.creationRow &&
811
- mParameters.creationRow.getBindingContext() &&
812
- Object.keys(mParameters.creationRow.getBindingContext().getObject()).length > 1;
813
- if (bCreateDocument) {
814
- // the bSkipSideEffects is a parameter created when we click the save key. If we press this key
815
- // we don't execute the handleSideEffects funciton to avoid batch redundancy
816
- mParameters.bSkipSideEffects = true;
817
- bExecuteSideEffectsOnError = true;
818
- aWaitCreateDocuments.push(
819
- that.editFlow.createDocument(oBinding, mParameters).then(function() {
820
- return oBinding;
821
- })
822
- );
823
- }
824
- });
825
- return Promise.all(aWaitCreateDocuments).then(function(aBindings) {
826
- var mParameters = {
827
- bExecuteSideEffectsOnError: bExecuteSideEffectsOnError,
828
- bindings: aBindings
829
- };
830
- return that.editFlow
831
- .saveDocument(oContext, mParameters)
832
- .catch(that._showMessagePopover.bind(that))
833
- .finally(function() {
834
- if (BusyLocker.isLocked(oModel)) {
835
- BusyLocker.unlock(oModel);
836
- }
837
- });
838
- });
839
- },
840
-
841
- _cancelDocument: function(oContext, mParameters) {
842
- mParameters.cancelButton = this.getView().byId(mParameters.cancelButton); //to get the reference of the cancel button from command execution
843
- return this.editFlow.cancelDocument(oContext, mParameters);
844
- },
845
-
846
- _applyDocument: function(oContext) {
847
- var that = this;
848
- return this.editFlow.applyDocument(oContext).catch(that._showMessagePopover.bind(that));
849
- },
850
-
851
- _updateRelatedApps: function() {
852
- var oObjectPage = this.byId("fe::ObjectPage");
853
- if (CommonUtils.resolveStringtoBoolean(oObjectPage.data("showRelatedApps"))) {
854
- CommonUtils.updateRelatedAppsDetails(oObjectPage);
855
- }
856
- },
857
-
858
- _findTableInSubSection: function(aParentElement, aSubsection, aTables) {
859
- var aSubSectionTables = [];
860
- for (var element = 0; element < aParentElement.length; element++) {
861
- var oElement = aParentElement[element].getContent instanceof Function && aParentElement[element].getContent();
862
- if (oElement && oElement.isA && oElement.isA("sap.ui.layout.DynamicSideContent")) {
863
- oElement = oElement.getMainContent instanceof Function && oElement.getMainContent();
864
- if (oElement && oElement.length > 0) {
865
- oElement = oElement[0];
866
- }
867
- }
868
- if (oElement && oElement.isA && oElement.isA("sap.fe.macros.TableAPI")) {
869
- oElement = oElement.getContent instanceof Function && oElement.getContent();
870
- if (oElement && oElement.length > 0) {
871
- oElement = oElement[0];
872
- }
873
- }
874
- if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Table")) {
875
- aTables.push(oElement);
876
- aSubSectionTables.push({
877
- "table": oElement,
878
- "gridTable": oElement.getType().isA("sap.ui.mdc.table.GridTableType")
879
- });
880
- }
881
- }
882
- if (
883
- aSubSectionTables.length === 1 &&
884
- aParentElement.length === 1 &&
885
- aSubSectionTables[0].gridTable &&
886
- !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")
887
- ) {
888
- //In case there is only a single table in a section we fit that to the whole page so that the scrollbar comes only on table and not on page
889
- aSubsection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
890
- } else {
891
- if (aSubSectionTables && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
892
- aSubSectionTables.forEach(function(oTable) {
893
- if (oTable.gridTable) {
894
- //Resetting the row count to default value in case we have a combination of forms and tables or multiple tables in a subsection
895
- oTable.table.getType().setRowCount(null);
896
- }
897
- });
898
- }
899
- }
900
- },
901
-
902
- _getAllSubSections: function() {
903
- var oObjectPage = this.byId("fe::ObjectPage"),
904
- aSubSections = [];
905
- oObjectPage.getSections().forEach(function(oSection) {
906
- aSubSections = aSubSections.concat(oSection.getSubSections());
907
- });
908
- return aSubSections;
909
- },
910
-
911
- _getAllBlocks: function() {
912
- var aBlocks = [];
913
- this._getAllSubSections().forEach(function(oSubSection) {
914
- aBlocks = aBlocks.concat(oSubSection.getBlocks());
915
- });
916
- return aBlocks;
917
- },
918
-
919
- _findFormContainers: function() {
920
- var aSubSections = this._getAllSubSections(),
921
- aFormContainers = [];
922
-
923
- function _collectFormContainersInBlocks(aBlocks) {
924
- for (var i = 0; i < aBlocks.length; i++) {
925
- var oElement = aBlocks[i].getContent instanceof Function && aBlocks[i].getContent();
926
- if (oElement && oElement.isA && oElement.isA("sap.ui.layout.DynamicSideContent")) {
927
- oElement = oElement.getMainContent instanceof Function && oElement.getMainContent();
928
- if (oElement && oElement.length > 0) {
929
- oElement = oElement[0];
930
- }
931
- }
932
- if (
933
- oElement &&
934
- oElement.isA &&
935
- oElement.isA("sap.ui.layout.form.Form") &&
936
- oElement.getFormContainers instanceof Function
937
- ) {
938
- aFormContainers = aFormContainers.concat(oElement.getFormContainers());
939
- }
940
- }
941
- }
942
-
943
- for (var i = 0; i < aSubSections.length; i++) {
944
- _collectFormContainersInBlocks(aSubSections[i].getBlocks());
945
- _collectFormContainersInBlocks(aSubSections[i].getMoreBlocks());
946
- }
947
- return aFormContainers;
948
- },
949
-
950
- //TODO: This is needed for two workarounds - to be removed again
951
- _findTables: function() {
952
- var aSubSections = this._getAllSubSections(),
953
- aTables = [];
954
- for (var subSection = 0; subSection < aSubSections.length; subSection++) {
955
- this._findTableInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aTables);
956
- this._findTableInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aTables);
957
- }
958
- return aTables;
959
- },
960
-
961
- _closeSideContent: function() {
962
- this._getAllBlocks().forEach(function(oBlock) {
963
- var oContent = oBlock.getContent instanceof Function && oBlock.getContent();
964
- if (oContent && oContent.isA && oContent.isA("sap.ui.layout.DynamicSideContent")) {
965
- if (oContent.setShowSideContent instanceof Function) {
966
- oContent.setShowSideContent(false);
967
- }
968
- }
969
- });
970
- },
971
-
972
- /**
973
- * Chart Context is resolved for 1:n microcharts.
974
- *
975
- * @param {sap.ui.model.Context} oChartContext The Context of the MicroChart
976
- * @param {string} sChartPath The collectionPath of the the chart
977
- * @returns {Array} Array of Attributes of the chart Context
978
- */
979
- _getChartContextData: function(oChartContext, sChartPath) {
980
- var oContextData = oChartContext.getObject(),
981
- oChartContextData = [oContextData];
982
- if (oChartContext && sChartPath) {
983
- if (oContextData[sChartPath]) {
984
- oChartContextData = oContextData[sChartPath];
985
- delete oContextData[sChartPath];
986
- oChartContextData.push(oContextData);
987
- }
988
- }
989
- return oChartContextData;
990
- },
991
-
992
- /**
993
- * Scroll the tables to the row with the sPath
994
- *
995
- * @function
996
- * @name sap.fe.templates.ObjectPage.ObjectPageController.controller#_scrollTablesToRow
997
- * @param {string} sRowPath 'sPath of the table row'
998
- *
999
- */
1000
-
1001
- _scrollTablesToRow: function(sRowPath) {
1002
- if (this._findTables && this._findTables().length > 0) {
1003
- var aTables = this._findTables();
1004
- for (var i = 0; i < aTables.length; i++) {
1005
- TableScroller.scrollTableToRow(aTables[i], sRowPath);
1006
- }
1007
- }
1008
- },
1009
-
1010
- /**
1011
- * Method to merge selected contexts and filters.
1012
- *
1013
- * @function
1014
- * @name _mergeMultipleContexts
1015
- * @param {object} oPageContext Page context
1016
- * @param {object|Array} aLineContext Selected Contexts
1017
- * @param {string} sChartPath Collection name of the chart
1018
- * @returns {object} Selection Variant Object
1019
- */
1020
- _mergeMultipleContexts: function(oPageContext, aLineContext, sChartPath) {
1021
- var that = this;
1022
- var aAttributes = [],
1023
- aPageAttributes = [],
1024
- oMetaModel,
1025
- oContext,
1026
- sMetaPathLine,
1027
- sMetaPathPage,
1028
- sPathLine,
1029
- oPageLevelSV,
1030
- sPagePath;
1031
-
1032
- sPagePath = oPageContext.getPath();
1033
- oMetaModel = oPageContext && oPageContext.getModel() && oPageContext.getModel().getMetaModel();
1034
- sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, "");
1035
-
1036
- // Get single line context if necessary
1037
- if (aLineContext && aLineContext.length) {
1038
- oContext = aLineContext[0];
1039
- sPathLine = oContext.getPath();
1040
- sMetaPathLine = oMetaModel && oMetaModel.getMetaPath(sPathLine).replace(/^\/*/, "");
1041
-
1042
- aLineContext.map(function(oSingleContext) {
1043
- if (sChartPath) {
1044
- var oChartContextData = that._getChartContextData(oSingleContext, sChartPath);
1045
- if (oChartContextData) {
1046
- aAttributes = oChartContextData.map(function(oChartContextData) {
1047
- return {
1048
- contextData: oChartContextData,
1049
- entitySet: sMetaPathPage + "/" + sChartPath
1050
- };
1051
- });
1052
- }
1053
- } else {
1054
- aAttributes.push({
1055
- contextData: oSingleContext.getObject(),
1056
- entitySet: sMetaPathLine
1057
- });
1058
- }
1059
- });
1060
- }
1061
- aPageAttributes.push({
1062
- contextData: oPageContext.getObject(),
1063
- entitySet: sMetaPathPage
1064
- });
1065
- // Adding Page Context to selection variant
1066
- aPageAttributes = CommonUtils.removeSensitiveData(aPageAttributes, oMetaModel);
1067
- oPageLevelSV = CommonUtils.addPageContextToSelectionVariant(new SelectionVariant(), aPageAttributes, that.getView());
1068
- aAttributes = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
1069
- return {
1070
- selectionVariant: oPageLevelSV,
1071
- attributes: aAttributes
1072
- };
1073
- },
1074
-
1075
- _getBatchGroupsForView: function() {
1076
- var that = this,
1077
- oViewData = that.getView().getViewData(),
1078
- oConfigurations = oViewData.controlConfiguration,
1079
- aConfigurations = oConfigurations && Object.keys(oConfigurations),
1080
- aBatchGroups = ["$auto.Heroes", "$auto.Decoration", "$auto.Workers"];
1081
-
1082
- if (aConfigurations && aConfigurations.length > 0) {
1083
- aConfigurations.forEach(function(sKey) {
1084
- var oConfiguration = oConfigurations[sKey];
1085
- if (oConfiguration.requestGroupId === "LongRunners") {
1086
- aBatchGroups.push("$auto.LongRunners");
1087
- }
1088
- });
1089
- }
1090
- return aBatchGroups;
1091
- },
1092
-
1093
- /*
1094
- * Reset Breadcrumb links
1095
- *
1096
- * @function
1097
- * @param {sap.m.Breadcrumbs} [oSource] parent control
1098
- * @description Used when context of the objectpage changes.
1099
- * This event callback is attached to modelContextChange
1100
- * event of the Breadcrumb control to catch context change.
1101
- * Then element binding and hrefs are updated for each Link.
1102
- *
1103
- * @ui5-restricted
1104
- * @experimental
1105
- */
1106
- _setBreadcrumbLinks: function(oSource) {
1107
- var oContext = oSource.getBindingContext();
1108
- var oAppComponent = this.getAppComponent();
1109
- if (oContext) {
1110
- var sNewPath = oContext.getPath(),
1111
- aPathParts = sNewPath.split("/"),
1112
- sPath = "",
1113
- oMetaModel = oAppComponent.getMetaModel(),
1114
- iSkipParameterized = 0;
1115
-
1116
- aPathParts.shift();
1117
- aPathParts.splice(-1, 1);
1118
- aPathParts.forEach(function(sPathPart, i) {
1119
- sPath += "/" + sPathPart;
1120
- var oRootViewController = oAppComponent.getRootViewController();
1121
- var pWaitForTitleHiearchyInfo;
1122
- var sParameterPath = oMetaModel.getMetaPath(sPath);
1123
- var bResultContext = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
1124
- if (bResultContext) {
1125
- // We dont need to create a breadcrumb for Parameter path
1126
- iSkipParameterized = 1;
1127
- return;
1128
- }
1129
-
1130
- pWaitForTitleHiearchyInfo = oRootViewController.getTitleInfoFromPath(sPath);
1131
-
1132
- pWaitForTitleHiearchyInfo
1133
- .then(function(oTitleHiearchyInfo) {
1134
- var idx = i - iSkipParameterized,
1135
- oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link();
1136
- // sCurrentEntity is a fallback value in case of empty title
1137
- oLink.setText(oTitleHiearchyInfo.subtitle || oTitleHiearchyInfo.title);
1138
- oLink.setHref(oTitleHiearchyInfo.intent);
1139
- if (!oSource.getLinks()[idx]) {
1140
- oSource.addLink(oLink);
1141
- }
1142
- })
1143
- .catch(function(oError) {
1144
- Log.error("Error while computing the title hierarchy", oError);
1145
- });
1146
- });
1147
- }
1148
- },
1149
- _checkDataPointTitleForExternalNavigation: function() {
1150
- var oView = this.getView();
1151
- var oInternalModelContext = oView.getBindingContext("internal");
1152
- var oDataPoints = CommonUtils.getHeaderFacetItemConfigForExternalNavigation(
1153
- oView.getViewData(),
1154
- this.getAppComponent()
1155
- .getRoutingService()
1156
- .getOutbounds()
1157
- );
1158
- var oShellServices = this.getAppComponent().getShellServices();
1159
- var oPageContext = oView && oView.getBindingContext();
1160
- oInternalModelContext.setProperty("isHeaderDPLinkVisible", {});
1161
- if (oPageContext) {
1162
- oPageContext
1163
- .requestObject()
1164
- .then(function(oData) {
1165
- fnGetLinks(oDataPoints, oData);
1166
- })
1167
- .catch(function(oError) {
1168
- Log.error("Cannot retrieve the links from the shell service", oError);
1169
- });
1170
- }
1171
- /**
1172
- * @param oError
1173
- */
1174
- function fnOnError(oError) {
1175
- Log.error(oError);
1176
- }
1177
- /**
1178
- * @param aSupportedLinks
1179
- */
1180
- function fnSetLinkEnablement(aSupportedLinks) {
1181
- var sLinkId = this.id;
1182
- // process viable links from getLinks for all datapoints having outbound
1183
- if (aSupportedLinks && aSupportedLinks.length === 1 && aSupportedLinks[0].supported) {
1184
- oInternalModelContext.setProperty("isHeaderDPLinkVisible/" + sLinkId, true);
1185
- }
1186
- }
1187
- /**
1188
- * @param oDataPoints
1189
- * @param oPageData
1190
- */
1191
- function fnGetLinks(oDataPoints, oPageData) {
1192
- for (var sId in oDataPoints) {
1193
- var oDataPoint = oDataPoints[sId];
1194
- var oParams = {};
1195
- var oLink = oView.byId(sId);
1196
- if (!oLink) {
1197
- // for data points configured in app descriptor but not annotated in the header
1198
- continue;
1199
- }
1200
- var oLinkContext = oLink.getBindingContext();
1201
- var oLinkData = oLinkContext && oLinkContext.getObject();
1202
- var oMixedContext = merge({}, oPageData, oLinkData);
1203
- // process semantic object mappings
1204
- if (oDataPoint.semanticObjectMapping) {
1205
- var aSemanticObjectMapping = oDataPoint.semanticObjectMapping;
1206
- for (var item in aSemanticObjectMapping) {
1207
- var oMapping = aSemanticObjectMapping[item];
1208
- var sMainProperty = oMapping["LocalProperty"]["$PropertyPath"];
1209
- var sMappedProperty = oMapping["SemanticObjectProperty"];
1210
- if (sMainProperty !== sMappedProperty) {
1211
- if (oMixedContext.hasOwnProperty(sMainProperty)) {
1212
- var oNewMapping = {};
1213
- oNewMapping[sMappedProperty] = oMixedContext[sMainProperty];
1214
- oMixedContext = merge({}, oMixedContext, oNewMapping);
1215
- delete oMixedContext[sMainProperty];
1216
- }
1217
- }
1218
- }
1219
- }
1220
-
1221
- if (oMixedContext) {
1222
- for (var sKey in oMixedContext) {
1223
- if (sKey.indexOf("_") !== 0 && sKey.indexOf("odata.context") === -1) {
1224
- oParams[sKey] = oMixedContext[sKey];
1225
- }
1226
- }
1227
- }
1228
- // validate if a link must be rendered
1229
- oShellServices
1230
- .isNavigationSupported([
1231
- {
1232
- target: {
1233
- semanticObject: oDataPoint.semanticObject,
1234
- action: oDataPoint.action
1235
- },
1236
- params: oParams
1237
- }
1238
- ])
1239
- .then(
1240
- fnSetLinkEnablement.bind({
1241
- id: sId
1242
- })
1243
- )
1244
- .catch(fnOnError);
1245
- }
1246
- }
1247
- },
1248
- handlers: {
1249
- onTableContextChange: function(oEvent) {
1250
- var that = this;
1251
- var oSource = oEvent.getSource();
1252
- var oTable;
1253
- this._findTables().some(function(_oTable) {
1254
- if (_oTable.getRowBinding() === oSource) {
1255
- oTable = _oTable;
1256
- return true;
1257
- }
1258
- return false;
1259
- });
1260
-
1261
- var oCurrentActionPromise = this._editFlow.getCurrentActionPromise();
1262
- if (oCurrentActionPromise) {
1263
- var aTableContexts;
1264
- if (
1265
- oTable
1266
- .getType()
1267
- .getMetadata()
1268
- .isA("sap.ui.mdc.table.GridTableType")
1269
- ) {
1270
- aTableContexts = oSource.getContexts(0);
1271
- } else {
1272
- aTableContexts = oSource.getCurrentContexts();
1273
- }
1274
- //if contexts are not fully loaded the getcontexts function above will trigger a new change event call
1275
- if (!aTableContexts[0]) {
1276
- return;
1277
- }
1278
- oCurrentActionPromise
1279
- .then(function(oActionResponse) {
1280
- if (!oActionResponse || oActionResponse.controlId !== oTable.sId) {
1281
- return;
1282
- }
1283
- var oActionData = oActionResponse.oData;
1284
- var aKeys = oActionResponse.keys;
1285
- var iNewItemp = -1;
1286
- aTableContexts.find(function(oTableContext, i) {
1287
- var oTableData = oTableContext.getObject();
1288
- var bCompare = aKeys.every(function(sKey) {
1289
- return oTableData[sKey] === oActionData[sKey];
1290
- });
1291
- if (bCompare) {
1292
- iNewItemp = i;
1293
- }
1294
- return bCompare;
1295
- });
1296
- if (iNewItemp !== -1) {
1297
- var aDialogs = InstanceManager.getOpenDialogs();
1298
- var oDialog = aDialogs.length > 0 ? aDialogs[0] : null;
1299
- if (oDialog) {
1300
- // by design, a sap.m.dialog set the focus to the previous focused element when closing.
1301
- // we should wait for the dialog to be close before to focus another element
1302
- oDialog.attachEventOnce("afterClose", function() {
1303
- oTable.focusRow(iNewItemp, true);
1304
- });
1305
- } else {
1306
- oTable.focusRow(iNewItemp, true);
1307
- }
1308
- that._editFlow.deleteCurrentActionPromise();
1309
- }
1310
- })
1311
- .catch(function(err) {
1312
- Log.error("An error occurs while scrolling to the newly created Item: " + err);
1313
- });
1314
- }
1315
- // fire ModelContextChange on the message button whenever the table context changes
1316
- var oMessageButton = that.getView().byId("fe::FooterBar::MessageButton");
1317
- oMessageButton.fireModelContextChange();
1318
- },
1319
-
1320
- /**
1321
- * Invokes an action - bound/unbound and sets the page dirty.
1322
- *
1323
- * @param oView
1324
- * @param {string} sActionName The name of the action to be called
1325
- * @param {map} [mParameters] Contains the following attributes:
1326
- * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action, either one context or an array with contexts for which the action shall be called
1327
- * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action; an instance of an OData V4 model
1328
- * @returns {Promise}
1329
- * @ui5-restricted
1330
- * @final
1331
- */
1332
- onCallAction: function(oView, sActionName, mParameters) {
1333
- var oController = oView.getController();
1334
- var that = oController;
1335
- return oController.editFlow
1336
- .invokeAction(sActionName, mParameters)
1337
- .then(that._showMessagePopover.bind(that, undefined))
1338
- .catch(that._showMessagePopover.bind(that));
1339
- },
1340
- onDataPointTitlePressed: function(oController, oSource, oManifestOutbound, sControlConfig, sCollectionPath) {
1341
- oManifestOutbound = typeof oManifestOutbound === "string" ? JSON.parse(oManifestOutbound) : oManifestOutbound;
1342
- var oTargetInfo = oManifestOutbound[sControlConfig],
1343
- aSemanticObjectMapping = CommonUtils.getSemanticObjectMapping(oTargetInfo),
1344
- oDataPointOrChartBindingContext = oSource.getBindingContext(),
1345
- sMetaPath = oDataPointOrChartBindingContext
1346
- .getModel()
1347
- .getMetaModel()
1348
- .getMetaPath(oDataPointOrChartBindingContext.getPath()),
1349
- aNavigationData = oController._getChartContextData(oDataPointOrChartBindingContext, sCollectionPath),
1350
- additionalNavigationParameters;
1351
-
1352
- aNavigationData = aNavigationData.map(function(oNavigationData) {
1353
- return {
1354
- data: oNavigationData,
1355
- metaPath: sMetaPath + (sCollectionPath ? "/" + sCollectionPath : "")
1356
- };
1357
- });
1358
- if (oTargetInfo && oTargetInfo.parameters) {
1359
- var oParams =
1360
- oTargetInfo.parameters && oController._intentBasedNavigation.getOutboundParams(oTargetInfo.parameters);
1361
- if (Object.keys(oParams).length > 0) {
1362
- additionalNavigationParameters = oParams;
1363
- }
1364
- }
1365
- if (oTargetInfo && oTargetInfo.semanticObject && oTargetInfo.action) {
1366
- oController._intentBasedNavigation.navigate(oTargetInfo.semanticObject, oTargetInfo.action, {
1367
- navigationContexts: aNavigationData,
1368
- semanticObjectMapping: aSemanticObjectMapping,
1369
- additionalNavigationParameters: additionalNavigationParameters
1370
- });
1371
- }
1372
- },
1373
- /**
1374
- * Triggers an outbound navigation when a user chooses the chevron.
1375
- *
1376
- * @param {object} oController
1377
- * @param {string} sOutboundTarget Name of the outbound target (needs to be defined in the manifest)
1378
- * @param {sap.ui.model.odata.v4.Context} oContext The context that contains the data for the target app
1379
- * @param {string} sCreatePath Create path when the chevron is created.
1380
- * @returns {Promise} Promise which is resolved once the navigation is triggered (??? maybe only once finished?)
1381
- * @ui5-restricted
1382
- * @final
1383
- */
1384
- onChevronPressNavigateOutBound: function(oController, sOutboundTarget, oContext, sCreatePath) {
1385
- return oController._intentBasedNavigation.onChevronPressNavigateOutBound(
1386
- oController,
1387
- sOutboundTarget,
1388
- oContext,
1389
- sCreatePath
1390
- );
1391
- },
1392
-
1393
- onNavigateChange: function(oEvent) {
1394
- //will be called always when we click on a section tab
1395
- this.getExtensionAPI().updateAppState();
1396
- this.bSectionNavigated = true;
1397
-
1398
- var oInternalModelContext = this.getView().getBindingContext("internal");
1399
- var oObjectPage = this.byId("fe::ObjectPage");
1400
- if (
1401
- oObjectPage.getModel("ui").getProperty("/editMode") !== "Display" &&
1402
- this.getView().getViewData().sectionLayout === "Tabs" &&
1403
- oInternalModelContext.getProperty("errorNavigationSectionFlag") === false
1404
- ) {
1405
- var oSubSection = oEvent.getParameter("subSection");
1406
- this._updateFocusInEditMode([oSubSection]);
1407
- }
1408
- },
1409
- onVariantSelected: function(oEvent) {
1410
- this.getExtensionAPI().updateAppState();
1411
- },
1412
- onVariantSaved: function(oEvent) {
1413
- var that = this;
1414
- //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save
1415
- setTimeout(function() {
1416
- that.getExtensionAPI().updateAppState();
1417
- }, 500);
1418
- },
1419
- navigateToSubSection: function(oController, vDetailConfig) {
1420
- var oDetailConfig = typeof vDetailConfig === "string" ? JSON.parse(vDetailConfig) : vDetailConfig,
1421
- oObjectPage = oController.getView().byId("fe::ObjectPage"),
1422
- oSection,
1423
- oSubSection;
1424
- if (oDetailConfig.sectionId) {
1425
- oSection = oController.getView().byId(oDetailConfig.sectionId);
1426
- oSubSection = oDetailConfig.subSectionId
1427
- ? oController.getView().byId(oDetailConfig.subSectionId)
1428
- : oSection && oSection.getSubSections() && oSection.getSubSections()[0];
1429
- } else if (oDetailConfig.subSectionId) {
1430
- oSubSection = oController.getView().byId(oDetailConfig.subSectionId);
1431
- oSection = oSubSection && oSubSection.getParent();
1432
- }
1433
- if (!oSection || !oSubSection || !oSection.getVisible() || !oSubSection.getVisible()) {
1434
- oController
1435
- .getView()
1436
- .getModel("sap.fe.i18n")
1437
- .getResourceBundle()
1438
- .then(function(oResourceBundle) {
1439
- var sTitle = CommonUtils.getTranslatedText(
1440
- "C_ROUTING_NAVIGATION_DISABLED_TITLE",
1441
- oResourceBundle,
1442
- null,
1443
- oController.getView().getViewData().entitySet
1444
- );
1445
- Log.error(sTitle);
1446
- MessageBox.error(sTitle);
1447
- })
1448
- .catch(function(error) {
1449
- Log.error(error);
1450
- });
1451
- } else {
1452
- oObjectPage.scrollToSection(oSubSection.getId());
1453
- // trigger iapp state change
1454
- oObjectPage.fireNavigate({
1455
- section: oSection,
1456
- subSection: oSubSection
1457
- });
1458
- }
1459
- },
1460
- onChartSelectionChanged: function(oEvent) {
1461
- ChartRuntime.fnUpdateChart(oEvent);
1462
- }
1463
- }
1464
- });
1465
- }
1466
- );
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/actions/collaboration/ActivitySync", "sap/fe/core/actions/collaboration/Manage", "sap/fe/core/BusyLocker", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalEditFlow", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/m/Link", "sap/m/MessageBox", "sap/ui/core/Fragment", "sap/ui/core/mvc/OverrideExecution", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/ODataListBinding", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ActivitySync, Manage, BusyLocker, CommonUtils, EditFlow, IntentBasedNavigation, InternalEditFlow, InternalIntentBasedNavigation, InternalRouting, MassEdit, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, ClassSupport, ModelHelper, PageController, ChartRuntime, CommonHelper, DelegateUtil, TableUtils, SelectionVariant, ExtensionAPI, EditFlowOverrides, TableScroller, InstanceManager, Link, MessageBox, Fragment, OverrideExecution, XMLPreprocessor, XMLTemplateProcessor, JSONModel, ODataListBinding, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10, _descriptor11, _descriptor12;
9
+
10
+ var usingExtension = ClassSupport.usingExtension;
11
+ var publicExtension = ClassSupport.publicExtension;
12
+ var finalExtension = ClassSupport.finalExtension;
13
+ var extensible = ClassSupport.extensible;
14
+ var defineUI5Class = ClassSupport.defineUI5Class;
15
+ var showUserDetails = Manage.showUserDetails;
16
+ var openManageDialog = Manage.openManageDialog;
17
+ var connect = ActivitySync.connect;
18
+
19
+ 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 }); }
20
+
21
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
22
+
23
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
24
+
25
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
26
+
27
+ 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; }
28
+
29
+ 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.'); }
30
+
31
+ var ObjectPageController = (_dec = defineUI5Class("sap.fe.templates.ObjectPage.ObjectPageController"), _dec2 = usingExtension(Placeholder), _dec3 = usingExtension(EditFlow), _dec4 = usingExtension(Share.override(ShareOverrides)), _dec5 = usingExtension(InternalEditFlow.override(EditFlowOverrides)), _dec6 = usingExtension(InternalRouting.override(InternalRoutingOverride)), _dec7 = usingExtension(Paginator.override(PaginatorOverride)), _dec8 = usingExtension(MessageHandler.override(MessageHandlerOverride)), _dec9 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec10 = usingExtension(InternalIntentBasedNavigation.override({
32
+ getNavigationMode: function () {
33
+ var bIsStickyEditMode = this.getView().getController().getStickyEditMode && this.getView().getController().getStickyEditMode();
34
+ return bIsStickyEditMode ? "explace" : undefined;
35
+ }
36
+ })), _dec11 = usingExtension(ViewState.override(ViewStateOverrides)), _dec12 = usingExtension(PageReady.override({
37
+ isContextExpected: function () {
38
+ return true;
39
+ }
40
+ })), _dec13 = usingExtension(MassEdit), _dec14 = publicExtension(), _dec15 = finalExtension(), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
41
+ _inheritsLoose(ObjectPageController, _PageController);
42
+
43
+ function ObjectPageController() {
44
+ var _this;
45
+
46
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
47
+ args[_key] = arguments[_key];
48
+ }
49
+
50
+ _this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
51
+
52
+ _initializerDefineProperty(_this, "placeholder", _descriptor, _assertThisInitialized(_this));
53
+
54
+ _initializerDefineProperty(_this, "editFlow", _descriptor2, _assertThisInitialized(_this));
55
+
56
+ _initializerDefineProperty(_this, "share", _descriptor3, _assertThisInitialized(_this));
57
+
58
+ _initializerDefineProperty(_this, "_editFlow", _descriptor4, _assertThisInitialized(_this));
59
+
60
+ _initializerDefineProperty(_this, "_routing", _descriptor5, _assertThisInitialized(_this));
61
+
62
+ _initializerDefineProperty(_this, "paginator", _descriptor6, _assertThisInitialized(_this));
63
+
64
+ _initializerDefineProperty(_this, "messageHandler", _descriptor7, _assertThisInitialized(_this));
65
+
66
+ _initializerDefineProperty(_this, "intentBasedNavigation", _descriptor8, _assertThisInitialized(_this));
67
+
68
+ _initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor9, _assertThisInitialized(_this));
69
+
70
+ _initializerDefineProperty(_this, "viewState", _descriptor10, _assertThisInitialized(_this));
71
+
72
+ _initializerDefineProperty(_this, "pageReady", _descriptor11, _assertThisInitialized(_this));
73
+
74
+ _initializerDefineProperty(_this, "massEdit", _descriptor12, _assertThisInitialized(_this));
75
+
76
+ _this.handlers = {
77
+ onTableContextChange: function (oEvent) {
78
+ var _this2 = this;
79
+
80
+ var oSource = oEvent.getSource();
81
+ var oTable;
82
+
83
+ this._findTables().some(function (_oTable) {
84
+ if (_oTable.getRowBinding() === oSource) {
85
+ oTable = _oTable;
86
+ return true;
87
+ }
88
+
89
+ return false;
90
+ });
91
+
92
+ var oCurrentActionPromise = this._editFlow.getCurrentActionPromise();
93
+
94
+ if (oCurrentActionPromise) {
95
+ var aTableContexts;
96
+
97
+ if (oTable.getType().getMetadata().isA("sap.ui.mdc.table.GridTableType")) {
98
+ aTableContexts = oSource.getContexts(0);
99
+ } else {
100
+ aTableContexts = oSource.getCurrentContexts();
101
+ } //if contexts are not fully loaded the getcontexts function above will trigger a new change event call
102
+
103
+
104
+ if (!aTableContexts[0]) {
105
+ return;
106
+ }
107
+
108
+ oCurrentActionPromise.then(function (oActionResponse) {
109
+ if (!oActionResponse || oActionResponse.controlId !== oTable.sId) {
110
+ return;
111
+ }
112
+
113
+ var oActionData = oActionResponse.oData;
114
+ var aKeys = oActionResponse.keys;
115
+ var iNewItemp = -1;
116
+ aTableContexts.find(function (oTableContext, i) {
117
+ var oTableData = oTableContext.getObject();
118
+ var bCompare = aKeys.every(function (sKey) {
119
+ return oTableData[sKey] === oActionData[sKey];
120
+ });
121
+
122
+ if (bCompare) {
123
+ iNewItemp = i;
124
+ }
125
+
126
+ return bCompare;
127
+ });
128
+
129
+ if (iNewItemp !== -1) {
130
+ var aDialogs = InstanceManager.getOpenDialogs();
131
+ var oDialog = aDialogs.length > 0 ? aDialogs.find(function (dialog) {
132
+ return dialog.data("FullScreenDialog") !== true;
133
+ }) : null;
134
+
135
+ if (oDialog) {
136
+ // by design, a sap.m.dialog set the focus to the previous focused element when closing.
137
+ // we should wait for the dialog to be close before to focus another element
138
+ oDialog.attachEventOnce("afterClose", function () {
139
+ oTable.focusRow(iNewItemp, true);
140
+ });
141
+ } else {
142
+ oTable.focusRow(iNewItemp, true);
143
+ }
144
+
145
+ _this2._editFlow.deleteCurrentActionPromise();
146
+ }
147
+ }).catch(function (err) {
148
+ Log.error("An error occurs while scrolling to the newly created Item: " + err);
149
+ });
150
+ } // fire ModelContextChange on the message button whenever the table context changes
151
+
152
+
153
+ var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton");
154
+ oMessageButton.fireModelContextChange();
155
+ },
156
+
157
+ /**
158
+ * Invokes an action - bound/unbound and sets the page dirty.
159
+ *
160
+ * @param oView
161
+ * @param {string} sActionName The name of the action to be called
162
+ * @param {map} [mParameters] Contains the following attributes:
163
+ * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action, either one context or an array with contexts for which the action shall be called
164
+ * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action; an instance of an OData V4 model
165
+ * @returns {Promise}
166
+ * @ui5-restricted
167
+ * @final
168
+ */
169
+ onCallAction: function (oView, sActionName, mParameters) {
170
+ var oController = oView.getController();
171
+ var that = oController;
172
+ return oController.editFlow.invokeAction(sActionName, mParameters).then(that._showMessagePopover.bind(that, undefined)).catch(that._showMessagePopover.bind(that));
173
+ },
174
+ onDataPointTitlePressed: function (oController, oSource, oManifestOutbound, sControlConfig, sCollectionPath) {
175
+ oManifestOutbound = typeof oManifestOutbound === "string" ? JSON.parse(oManifestOutbound) : oManifestOutbound;
176
+ var oTargetInfo = oManifestOutbound[sControlConfig],
177
+ aSemanticObjectMapping = CommonUtils.getSemanticObjectMapping(oTargetInfo),
178
+ oDataPointOrChartBindingContext = oSource.getBindingContext(),
179
+ sMetaPath = oDataPointOrChartBindingContext.getModel().getMetaModel().getMetaPath(oDataPointOrChartBindingContext.getPath());
180
+
181
+ var aNavigationData = oController._getChartContextData(oDataPointOrChartBindingContext, sCollectionPath);
182
+
183
+ var additionalNavigationParameters;
184
+ aNavigationData = aNavigationData.map(function (oNavigationData) {
185
+ return {
186
+ data: oNavigationData,
187
+ metaPath: sMetaPath + (sCollectionPath ? "/" + sCollectionPath : "")
188
+ };
189
+ });
190
+
191
+ if (oTargetInfo && oTargetInfo.parameters) {
192
+ var oParams = oTargetInfo.parameters && oController._intentBasedNavigation.getOutboundParams(oTargetInfo.parameters);
193
+
194
+ if (Object.keys(oParams).length > 0) {
195
+ additionalNavigationParameters = oParams;
196
+ }
197
+ }
198
+
199
+ if (oTargetInfo && oTargetInfo.semanticObject && oTargetInfo.action) {
200
+ oController._intentBasedNavigation.navigate(oTargetInfo.semanticObject, oTargetInfo.action, {
201
+ navigationContexts: aNavigationData,
202
+ semanticObjectMapping: aSemanticObjectMapping,
203
+ additionalNavigationParameters: additionalNavigationParameters
204
+ });
205
+ }
206
+ },
207
+
208
+ /**
209
+ * Triggers an outbound navigation when a user chooses the chevron.
210
+ *
211
+ * @param {object} oController
212
+ * @param {string} sOutboundTarget Name of the outbound target (needs to be defined in the manifest)
213
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that contains the data for the target app
214
+ * @param {string} sCreatePath Create path when the chevron is created.
215
+ * @returns {Promise} Promise which is resolved once the navigation is triggered (??? maybe only once finished?)
216
+ * @ui5-restricted
217
+ * @final
218
+ */
219
+ onChevronPressNavigateOutBound: function (oController, sOutboundTarget, oContext, sCreatePath) {
220
+ return oController._intentBasedNavigation.onChevronPressNavigateOutBound(oController, sOutboundTarget, oContext, sCreatePath);
221
+ },
222
+ onNavigateChange: function (oEvent) {
223
+ //will be called always when we click on a section tab
224
+ this.getExtensionAPI().updateAppState();
225
+ this.bSectionNavigated = true;
226
+ var oInternalModelContext = this.getView().getBindingContext("internal");
227
+
228
+ var oObjectPage = this._getObjectPageLayoutControl();
229
+
230
+ if (oObjectPage.getModel("ui").getProperty("/isEditable") && this.getView().getViewData().sectionLayout === "Tabs" && oInternalModelContext.getProperty("errorNavigationSectionFlag") === false) {
231
+ var oSubSection = oEvent.getParameter("subSection");
232
+
233
+ this._updateFocusInEditMode([oSubSection]);
234
+ }
235
+ },
236
+ onVariantSelected: function () {
237
+ this.getExtensionAPI().updateAppState();
238
+ },
239
+ onVariantSaved: function () {
240
+ var _this3 = this;
241
+
242
+ //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save
243
+ setTimeout(function () {
244
+ _this3.getExtensionAPI().updateAppState();
245
+ }, 500);
246
+ },
247
+ navigateToSubSection: function (oController, vDetailConfig) {
248
+ var oDetailConfig = typeof vDetailConfig === "string" ? JSON.parse(vDetailConfig) : vDetailConfig;
249
+ var oObjectPage = oController.getView().byId("fe::ObjectPage");
250
+ var oSection;
251
+ var oSubSection;
252
+
253
+ if (oDetailConfig.sectionId) {
254
+ oSection = oController.getView().byId(oDetailConfig.sectionId);
255
+ oSubSection = oDetailConfig.subSectionId ? oController.getView().byId(oDetailConfig.subSectionId) : oSection && oSection.getSubSections() && oSection.getSubSections()[0];
256
+ } else if (oDetailConfig.subSectionId) {
257
+ oSubSection = oController.getView().byId(oDetailConfig.subSectionId);
258
+ oSection = oSubSection && oSubSection.getParent();
259
+ }
260
+
261
+ if (!oSection || !oSubSection || !oSection.getVisible() || !oSubSection.getVisible()) {
262
+ oController.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (oResourceBundle) {
263
+ var sTitle = CommonUtils.getTranslatedText("C_ROUTING_NAVIGATION_DISABLED_TITLE", oResourceBundle, null, oController.getView().getViewData().entitySet);
264
+ Log.error(sTitle);
265
+ MessageBox.error(sTitle);
266
+ }).catch(function (error) {
267
+ Log.error(error);
268
+ });
269
+ } else {
270
+ oObjectPage.scrollToSection(oSubSection.getId()); // trigger iapp state change
271
+
272
+ oObjectPage.fireNavigate({
273
+ section: oSection,
274
+ subSection: oSubSection
275
+ });
276
+ }
277
+ },
278
+ onChartSelectionChanged: function (oEvent) {
279
+ ChartRuntime.fnUpdateChart(oEvent);
280
+ }
281
+ };
282
+ return _this;
283
+ }
284
+
285
+ var _proto = ObjectPageController.prototype;
286
+
287
+ _proto.getExtensionAPI = function getExtensionAPI(sId) {
288
+ if (sId) {
289
+ // to allow local ID usage for custom pages we'll create/return own instances for custom sections
290
+ this.mCustomSectionExtensionAPIs = this.mCustomSectionExtensionAPIs || {};
291
+
292
+ if (!this.mCustomSectionExtensionAPIs[sId]) {
293
+ this.mCustomSectionExtensionAPIs[sId] = new ExtensionAPI(this, sId);
294
+ }
295
+
296
+ return this.mCustomSectionExtensionAPIs[sId];
297
+ } else {
298
+ if (!this.extensionAPI) {
299
+ this.extensionAPI = new ExtensionAPI(this);
300
+ }
301
+
302
+ return this.extensionAPI;
303
+ }
304
+ };
305
+
306
+ _proto.onInit = function onInit() {
307
+ _PageController.prototype.onInit.call(this);
308
+
309
+ var oObjectPage = this._getObjectPageLayoutControl(); // Setting defaults of internal model context
310
+
311
+
312
+ var oInternalModelContext = this.getView().getBindingContext("internal");
313
+ oInternalModelContext.setProperty("externalNavigationContext", {
314
+ "page": true
315
+ });
316
+ oInternalModelContext.setProperty("relatedApps", {
317
+ visibility: false,
318
+ items: null
319
+ });
320
+ oInternalModelContext.setProperty("batchGroups", this._getBatchGroupsForView());
321
+ oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
322
+
323
+ if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
324
+ //Attaching the event to make the subsection context binding active when it is visible.
325
+ oObjectPage.attachEvent("subSectionEnteredViewPort", this._handleSubSectionEnteredViewPort.bind(this));
326
+ }
327
+ };
328
+
329
+ _proto.onExit = function onExit() {
330
+ if (this.mCustomSectionExtensionAPIs) {
331
+ for (var _i = 0, _Object$keys = Object.keys(this.mCustomSectionExtensionAPIs); _i < _Object$keys.length; _i++) {
332
+ var sId = _Object$keys[_i];
333
+ this.mCustomSectionExtensionAPIs[sId] && this.mCustomSectionExtensionAPIs[sId].destroy();
334
+ }
335
+
336
+ delete this.mCustomSectionExtensionAPIs;
337
+ }
338
+
339
+ this.extensionAPI && this.extensionAPI.destroy();
340
+ delete this.extensionAPI;
341
+ var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton"),
342
+ oMessagePopover = oMessageButton ? oMessageButton.oMessagePopover : null;
343
+
344
+ if (oMessagePopover && oMessagePopover.isOpen()) {
345
+ oMessagePopover.close();
346
+ }
347
+ };
348
+
349
+ _proto._getTableBinding = function _getTableBinding(oTable) {
350
+ return oTable && oTable.getRowBinding();
351
+ };
352
+
353
+ _proto.onBeforeRendering = function onBeforeRendering() {
354
+ PageController.prototype.onBeforeRendering.apply(this);
355
+ };
356
+
357
+ _proto.onAfterRendering = function onAfterRendering() {
358
+ var _this4 = this;
359
+
360
+ this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
361
+ _this4.oResourceBundle = response;
362
+ }).catch(function (oError) {
363
+ Log.error("Error while retrieving the resource bundle", oError);
364
+ });
365
+ };
366
+
367
+ _proto._onBeforeBinding = function _onBeforeBinding(oContext, mParameters) {
368
+ var _this5 = this;
369
+
370
+ // TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
371
+ var aTables = this._findTables(),
372
+ oObjectPage = this._getObjectPageLayoutControl(),
373
+ oInternalModelContext = this.getView().getBindingContext("internal"),
374
+ oInternalModel = this.getView().getModel("internal"),
375
+ aBatchGroups = oInternalModelContext.getProperty("batchGroups"),
376
+ iViewLevel = this.getView().getViewData().viewLevel;
377
+
378
+ var oFastCreationRow;
379
+ aBatchGroups.push("$auto");
380
+
381
+ if (mParameters.bDraftNavigation !== true) {
382
+ this._closeSideContent();
383
+ }
384
+
385
+ var opContext = oObjectPage.getBindingContext();
386
+
387
+ if (opContext && opContext.hasPendingChanges() && !aBatchGroups.some(opContext.getModel().hasPendingChanges.bind(opContext.getModel()))) {
388
+ /* In case there are pending changes for the creation row and no others we need to reset the changes
389
+ TODO: this is just a quick solution, this needs to be reworked
390
+ */
391
+ opContext.getBinding().resetChanges();
392
+ } // For now we have to set the binding context to null for every fast creation row
393
+ // TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
394
+
395
+
396
+ for (var i = 0; i < aTables.length; i++) {
397
+ oFastCreationRow = aTables[i].getCreationRow();
398
+
399
+ if (oFastCreationRow) {
400
+ oFastCreationRow.setBindingContext(null);
401
+ }
402
+ } // Scroll to present Section so that bindings are enabled during navigation through paginator buttons, as there is no view rerendering/rebind
403
+
404
+
405
+ var fnScrollToPresentSection = function () {
406
+ if (!oObjectPage.isFirstRendering() && !mParameters.bPersistOPScroll) {
407
+ oObjectPage.setSelectedSection(null);
408
+ }
409
+ };
410
+
411
+ oObjectPage.attachEventOnce("modelContextChange", fnScrollToPresentSection); // if the structure of the ObjectPageLayout is changed then scroll to present Section
412
+ // FIXME Is this really working as intended ? Initially this was onBeforeRendering, but never triggered onBeforeRendering because it was registered after it
413
+
414
+ var oDelegateOnBefore = {
415
+ onAfterRendering: fnScrollToPresentSection
416
+ };
417
+ oObjectPage.addEventDelegate(oDelegateOnBefore, this);
418
+ this.pageReady.attachEventOnce("pageReady", function () {
419
+ oObjectPage.removeEventDelegate(oDelegateOnBefore);
420
+ }); //Set the Binding for Paginators using ListBinding ID
421
+
422
+ if (iViewLevel > 1) {
423
+ var oBinding = mParameters && mParameters.listBinding;
424
+ var oPaginatorCurrentContext = oInternalModel.getProperty("/paginatorCurrentContext");
425
+
426
+ if (oPaginatorCurrentContext) {
427
+ var oBindingToUse = oPaginatorCurrentContext.getBinding();
428
+ this.paginator.initialize(oBindingToUse, oPaginatorCurrentContext);
429
+ oInternalModel.setProperty("/paginatorCurrentContext", null);
430
+ } else if (oBinding) {
431
+ if (oBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
432
+ this.paginator.initialize(oBinding, oContext);
433
+ } else {
434
+ //if the binding type is not ODataListBinding because of a deeplink navigation or a refresh of the page
435
+ // we need to create it
436
+ var sContextPath = oBinding.getPath().replace(/\([^\)]*\)*$/, ""); //removing the last tuple
437
+
438
+ oBinding = new ODataListBinding(oBinding.oModel, "", oBinding.oModel.createBindingContext(sContextPath));
439
+
440
+ var _setListBindingAsync = function () {
441
+ if (oBinding.getContexts().length > 0) {
442
+ _this5.paginator.initialize(oBinding, oContext);
443
+
444
+ oBinding.detachEvent("change", _setListBindingAsync);
445
+ }
446
+ };
447
+
448
+ oBinding.getContexts(0);
449
+ oBinding.attachEvent("change", _setListBindingAsync);
450
+ }
451
+ }
452
+ }
453
+
454
+ if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
455
+ var aSections = oObjectPage.getSections();
456
+ var bUseIconTabBar = oObjectPage.getUseIconTabBar();
457
+ var iSkip = 2;
458
+ var bIsInEditMode = oObjectPage.getModel("ui").getProperty("/isEditable");
459
+ var bEditableHeader = this.getView().getViewData().editableHeaderContent;
460
+
461
+ for (var iSection = 0; iSection < aSections.length; iSection++) {
462
+ var oSection = aSections[iSection];
463
+ var aSubSections = oSection.getSubSections();
464
+
465
+ for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
466
+ // In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
467
+ if (iSkip < 1 || bUseIconTabBar && (iSection > 1 || iSection === 1 && !bEditableHeader && !bIsInEditMode)) {
468
+ var oSubSection = aSubSections[iSubSection];
469
+
470
+ if (oSubSection.data().isVisibilityDynamic !== "true") {
471
+ oSubSection.setBindingContext(null);
472
+ }
473
+ }
474
+ }
475
+ }
476
+ }
477
+
478
+ if (this.placeholder.isPlaceholderEnabled() && mParameters.showPlaceholder) {
479
+ var oView = this.getView();
480
+ var oNavContainer = oView.getParent().oContainer.getParent();
481
+
482
+ if (oNavContainer) {
483
+ oNavContainer.showPlaceholder({});
484
+ }
485
+ }
486
+ };
487
+
488
+ _proto._getFirstClickableElement = function _getFirstClickableElement(oObjectPage) {
489
+ var oFirstClickableElement;
490
+ var aActions = oObjectPage.getHeaderTitle() && oObjectPage.getHeaderTitle().getActions();
491
+
492
+ if (aActions && aActions.length) {
493
+ oFirstClickableElement = aActions.find(function (oAction) {
494
+ // Due to the left alignment of the Draft switch and the collaborative draft avatar controls
495
+ // there is a ToolbarSpacer in the actions aggregation which we need to exclude here!
496
+ return !oAction.isA("sap.m.ToolbarSpacer") && oAction.getVisible() && oAction.getEnabled();
497
+ });
498
+ }
499
+
500
+ return oFirstClickableElement;
501
+ };
502
+
503
+ _proto._getFirstEmptyMandatoryFieldFromSubSection = function _getFirstEmptyMandatoryFieldFromSubSection(aSubSections) {
504
+ if (aSubSections) {
505
+ for (var subSection = 0; subSection < aSubSections.length; subSection++) {
506
+ var aBlocks = aSubSections[subSection].getBlocks();
507
+
508
+ if (aBlocks) {
509
+ for (var block = 0; block < aBlocks.length; block++) {
510
+ var aFormContainers = void 0;
511
+
512
+ if (aBlocks[block].isA("sap.ui.layout.form.Form")) {
513
+ aFormContainers = aBlocks[block].getFormContainers();
514
+ } else if (aBlocks[block].getContent && aBlocks[block].getContent() && aBlocks[block].getContent().isA("sap.ui.layout.form.Form")) {
515
+ aFormContainers = aBlocks[block].getContent().getFormContainers();
516
+ }
517
+
518
+ if (aFormContainers) {
519
+ for (var formContainer = 0; formContainer < aFormContainers.length; formContainer++) {
520
+ var aFormElements = aFormContainers[formContainer].getFormElements();
521
+
522
+ if (aFormElements) {
523
+ for (var formElement = 0; formElement < aFormElements.length; formElement++) {
524
+ var aFields = aFormElements[formElement].getFields(); // The first field is not necessarily an InputBase (e.g. could be a Text)
525
+ // So we need to check whether it has a getRequired method
526
+
527
+ try {
528
+ if (aFields[0].getRequired && aFields[0].getRequired() && !aFields[0].getValue()) {
529
+ return aFields[0];
530
+ }
531
+ } catch (error) {
532
+ Log.debug("Error when searching for mandaotry empty field: " + error);
533
+ }
534
+ }
535
+ }
536
+ }
537
+ }
538
+ }
539
+ }
540
+ }
541
+ }
542
+
543
+ return undefined;
544
+ };
545
+
546
+ _proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections) {
547
+ var oObjectPage = this._getObjectPageLayoutControl();
548
+
549
+ var oMandatoryField = this._getFirstEmptyMandatoryFieldFromSubSection(aSubSections);
550
+
551
+ var oFieldToFocus;
552
+
553
+ if (oMandatoryField) {
554
+ oFieldToFocus = oMandatoryField.content.getContentEdit()[0];
555
+ } else {
556
+ oFieldToFocus = oObjectPage._getFirstEditableInput() || this._getFirstClickableElement(oObjectPage);
557
+ }
558
+
559
+ if (oFieldToFocus) {
560
+ setTimeout(function () {
561
+ // We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
562
+ oFieldToFocus.focus();
563
+ }, 0);
564
+ }
565
+ };
566
+
567
+ _proto._handleSubSectionEnteredViewPort = function _handleSubSectionEnteredViewPort(oEvent) {
568
+ var oSubSection = oEvent.getParameter("subSection");
569
+ oSubSection.setBindingContext(undefined);
570
+ };
571
+
572
+ _proto._onBackNavigationInDraft = function _onBackNavigationInDraft(oContext) {
573
+ if (this.getAppComponent().getRouterProxy().checkIfBackHasSameContext()) {
574
+ // Back nav will keep the same context --> no need to display the dialog
575
+ history.back();
576
+ } else {
577
+ CommonUtils.fnProcessDataLossOrDraftDiscardConfirmation(function () {
578
+ history.back();
579
+ }, Function.prototype, oContext, this, false);
580
+ }
581
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
582
+ ;
583
+
584
+ _proto._onAfterBinding = function _onAfterBinding(oBindingContext, mParameters) {
585
+ var _this6 = this;
586
+
587
+ var oObjectPage = this._getObjectPageLayoutControl();
588
+
589
+ var aTables = this._findTables();
590
+
591
+ this._sideEffects.clearPropertiesStatus(); // TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
592
+ // binding with ownRequest
593
+
594
+
595
+ oBindingContext = oObjectPage.getBindingContext();
596
+ var aIBNActions = [];
597
+ oObjectPage.getSections().forEach(function (oSection) {
598
+ oSection.getSubSections().forEach(function (oSubSection) {
599
+ aIBNActions = CommonUtils.getIBNActions(oSubSection, aIBNActions);
600
+ });
601
+ }); // Assign internal binding contexts to oFormContainer:
602
+ // 1. It is not possible to assign the internal binding context to the XML fragment
603
+ // (FormContainer.fragment.xml) yet - it is used already for the data-structure.
604
+ // 2. Another problem is, that FormContainers assigned to a 'MoreBlock' does not have an
605
+ // internal model context at all.
606
+
607
+ aTables.forEach(function (oTable) {
608
+ var oInternalModelContext = oTable.getBindingContext("internal");
609
+ oInternalModelContext.setProperty("creationRowFieldValidity", {});
610
+ oInternalModelContext.setProperty("creationRowCustomValidity", {});
611
+ aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions); // temporary workaround for BCP: 2080218004
612
+ // Need to fix with BLI: FIORITECHP1-15274
613
+ // only for edit mode, we clear the table cache
614
+ // Workaround starts here!!
615
+
616
+ var oTableRowBinding = oTable.getRowBinding();
617
+
618
+ if (oTableRowBinding) {
619
+ if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
620
+ // apply for both edit and display mode in sticky
621
+ oTableRowBinding.removeCachesAndMessages("");
622
+ }
623
+ } // Workaround ends here!!
624
+ // Update 'enabled' property of DataFieldForAction buttons on table toolbar
625
+ // The same is also performed on Table selectionChange event
626
+
627
+
628
+ var oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
629
+ aSelectedContexts = oTable.getSelectedContexts();
630
+ CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
631
+ });
632
+ CommonUtils.getSemanticTargetsFromPageModel(this, "_pageModel"); //Retrieve Object Page header actions from Object Page title control
633
+
634
+ var oObjectPageTitle = oObjectPage.getHeaderTitle();
635
+ var aIBNHeaderActions = [];
636
+ aIBNHeaderActions = CommonUtils.getIBNActions(oObjectPageTitle, aIBNHeaderActions);
637
+ aIBNActions = aIBNActions.concat(aIBNHeaderActions);
638
+ CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
639
+ var oModel, oFinalUIState; // TODO: this should be moved into an init event of the MDC tables (not yet existing) and should be part
640
+ // of any controller extension
641
+
642
+ /**
643
+ * @param oTable
644
+ * @param oListBinding
645
+ */
646
+
647
+ function enableFastCreationRow(oTable, oListBinding) {
648
+ var oFastCreationRow = oTable.getCreationRow();
649
+ var oFastCreationListBinding, oFastCreationContext;
650
+
651
+ if (oFastCreationRow) {
652
+ oFinalUIState.then(function () {
653
+ if (oFastCreationRow.getModel("ui").getProperty("/isEditable")) {
654
+ oFastCreationListBinding = oModel.bindList(oListBinding.getPath(), oListBinding.getContext(), [], [], {
655
+ $$updateGroupId: "doNotSubmit",
656
+ $$groupId: "doNotSubmit"
657
+ }); // Workaround suggested by OData model v4 colleagues
658
+
659
+ oFastCreationListBinding.refreshInternal = function () {
660
+ /* do nothing */
661
+ };
662
+ /*
663
+ oFastCreationListBinding.hasPendingChanges = function() {
664
+ return false;
665
+ };
666
+ */
667
+
668
+
669
+ oFastCreationContext = oFastCreationListBinding.create();
670
+ oFastCreationRow.setBindingContext(oFastCreationContext); // this is needed to avoid console error
671
+
672
+ oFastCreationContext.created().catch(function () {
673
+ Log.trace("transient fast creation context deleted");
674
+ });
675
+ }
676
+ }).catch(function (oError) {
677
+ Log.error("Error while computing the final UI state", oError);
678
+ });
679
+ }
680
+ } // this should not be needed at the all
681
+
682
+ /**
683
+ * @param oTable
684
+ */
685
+
686
+
687
+ var handleTableModifications = function (oTable) {
688
+ var oBinding = _this6._getTableBinding(oTable),
689
+ fnHandleTablePatchEvents = function () {
690
+ enableFastCreationRow(oTable, oBinding);
691
+ };
692
+
693
+ if (!oBinding) {
694
+ Log.error("Expected binding missing for table: " + oTable.getId());
695
+ return;
696
+ }
697
+
698
+ if (oBinding.oContext) {
699
+ fnHandleTablePatchEvents();
700
+ } else {
701
+ var fnHandleChange = function () {
702
+ if (oBinding.oContext) {
703
+ fnHandleTablePatchEvents();
704
+ oBinding.detachChange(fnHandleChange);
705
+ }
706
+ };
707
+
708
+ oBinding.attachChange(fnHandleChange);
709
+ }
710
+ };
711
+
712
+ if (oBindingContext) {
713
+ oModel = oBindingContext.getModel(); // Compute Edit Mode
714
+
715
+ oFinalUIState = this._editFlow.computeEditMode(oBindingContext);
716
+
717
+ if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel())) {
718
+ oFinalUIState.then(function () {
719
+ if (_this6.getView().getModel("ui").getProperty("/isEditable")) {
720
+ connect(_this6.getView());
721
+ }
722
+ }).catch(function (oError) {
723
+ Log.error("Error while waiting for the final UI State", oError);
724
+ });
725
+ } // update related apps once Data is received in case of binding cache is not available
726
+ // TODO: this is only a temp solution since we need to call _updateRelatedApps method only after data for Object Page is received (if there is no binding)
727
+
728
+
729
+ if (oBindingContext.getBinding().oCache) {
730
+ this._updateRelatedApps();
731
+ } else {
732
+ var fnUpdateRelatedApps = function () {
733
+ _this6._updateRelatedApps();
734
+
735
+ oBindingContext.getBinding().detachDataReceived(fnUpdateRelatedApps);
736
+ };
737
+
738
+ oBindingContext.getBinding().attachDataReceived(fnUpdateRelatedApps);
739
+ } //Attach the patch sent and patch completed event to the object page binding so that we can react
740
+
741
+
742
+ var oBinding = oBindingContext.getBinding && oBindingContext.getBinding() || oBindingContext;
743
+ oBinding.attachEvent("patchSent", this.editFlow.handlePatchSent, this);
744
+ aTables.forEach(function (oTable) {
745
+ // access binding only after table is bound
746
+ TableUtils.whenBound(oTable).then(handleTableModifications).catch(function (oError) {
747
+ Log.error("Error while waiting for the table to be bound", oError);
748
+ });
749
+ });
750
+
751
+ if (!this.getView().getViewData().useNewLazyLoading) {
752
+ // should be called only after binding is ready hence calling it in onAfterBinding
753
+ oObjectPage._triggerVisibleSubSectionsEvents();
754
+ }
755
+ }
756
+ };
757
+
758
+ _proto.onPageReady = function onPageReady(mParameters) {
759
+ var _this7 = this;
760
+
761
+ // Apply app state only after the page is ready with the first section selected
762
+ var oView = this.getView();
763
+ var oInternalModelContext = oView.getBindingContext("internal");
764
+ var oBindingContext = oView.getBindingContext(); //Show popup while navigating back from object page in case of draft
765
+
766
+ if (oBindingContext) {
767
+ var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
768
+
769
+ if (!bIsStickyMode) {
770
+ var oAppComponent = CommonUtils.getAppComponent(oView);
771
+ oAppComponent.getShellServices().setBackNavigation(function () {
772
+ return _this7._onBackNavigationInDraft(oBindingContext);
773
+ });
774
+ }
775
+ }
776
+
777
+ this.getAppComponent().getAppStateHandler().applyAppState();
778
+
779
+ if (mParameters.forceFocus) {
780
+ var oObjectPage = this._getObjectPageLayoutControl(); // set the focus to the first action button, or to the first editable input if in editable mode
781
+
782
+
783
+ var isInDisplayMode = !oObjectPage.getModel("ui").getProperty("/isEditable");
784
+ var aVisibleSections = oObjectPage.getSections().filter(function (oSection) {
785
+ return oSection.getVisible() === true;
786
+ }); // Select the first visible section
787
+
788
+ oObjectPage.setSelectedSection(aVisibleSections[0].getId());
789
+
790
+ if (isInDisplayMode) {
791
+ var oFirstClickableElement = this._getFirstClickableElement(oObjectPage);
792
+
793
+ if (oFirstClickableElement) {
794
+ oFirstClickableElement.focus();
795
+ }
796
+ } else {
797
+ var aVisibleSubSections;
798
+
799
+ if (oView.getViewData().sectionLayout === "Tabs") {
800
+ // In a tabbed layout, only the subsections of the selected section are visible on the screen
801
+ aVisibleSubSections = aVisibleSections[0].getSubSections();
802
+ } else {
803
+ // In a paged layout, all subsections of the visible sections are visible on the screen
804
+ aVisibleSubSections = aVisibleSections.map(function (oSection) {
805
+ return oSection.getSubSections();
806
+ }).flat();
807
+ }
808
+
809
+ this._updateFocusInEditMode(aVisibleSubSections);
810
+ }
811
+ }
812
+
813
+ oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
814
+
815
+ this._checkDataPointTitleForExternalNavigation();
816
+ }
817
+ /**
818
+ * Get the status of edit mode for sticky session.
819
+ *
820
+ * @returns {boolean} The status of edit mode for sticky session
821
+ *
822
+ *
823
+ */
824
+ ;
825
+
826
+ _proto.getStickyEditMode = function getStickyEditMode() {
827
+ var oBindingContext = this.getView().getBindingContext && this.getView().getBindingContext();
828
+ var bIsStickyEditMode = false;
829
+
830
+ if (oBindingContext) {
831
+ var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
832
+
833
+ if (bIsStickyMode) {
834
+ bIsStickyEditMode = this.getView().getModel("ui").getProperty("/isEditable");
835
+ }
836
+ }
837
+
838
+ return bIsStickyEditMode;
839
+ };
840
+
841
+ _proto._getObjectPageLayoutControl = function _getObjectPageLayoutControl() {
842
+ return this.byId("fe::ObjectPage");
843
+ };
844
+
845
+ _proto._getPageTitleInformation = function _getPageTitleInformation() {
846
+ var oObjectPage = this._getObjectPageLayoutControl();
847
+
848
+ var oObjectPageSubtitle = oObjectPage.getCustomData().find(function (oCustomData) {
849
+ return oCustomData.getKey() === "ObjectPageSubtitle";
850
+ });
851
+ var oTitleInfo = {
852
+ title: oObjectPage.data("ObjectPageTitle") || "",
853
+ subtitle: oObjectPageSubtitle && oObjectPageSubtitle.getValue(),
854
+ intent: "",
855
+ icon: ""
856
+ };
857
+ return oTitleInfo;
858
+ };
859
+
860
+ _proto._executeHeaderShortcut = function _executeHeaderShortcut(sId) {
861
+ var sButtonId = this.getView().getId() + "--" + sId,
862
+ oButton = this._getObjectPageLayoutControl().getHeaderTitle().getActions().find(function (oElement) {
863
+ return oElement.getId() === sButtonId;
864
+ });
865
+
866
+ CommonUtils.fireButtonPress(oButton);
867
+ };
868
+
869
+ _proto._executeFooterShortcut = function _executeFooterShortcut(sId) {
870
+ var sButtonId = this.getView().getId() + "--" + sId,
871
+ oButton = this._getObjectPageLayoutControl().getFooter().getContent().find(function (oElement) {
872
+ return oElement.getMetadata().getName() === "sap.m.Button" && oElement.getId() === sButtonId;
873
+ });
874
+
875
+ CommonUtils.fireButtonPress(oButton);
876
+ };
877
+
878
+ _proto._executeTabShortCut = function _executeTabShortCut(oExecution) {
879
+ var oObjectPage = this._getObjectPageLayoutControl(),
880
+ aSections = oObjectPage.getSections(),
881
+ iSectionIndexMax = aSections.length - 1,
882
+ sCommand = oExecution.oSource.getCommand();
883
+
884
+ var newSection,
885
+ iSelectedSectionIndex = oObjectPage.indexOfSection(this.byId(oObjectPage.getSelectedSection()));
886
+
887
+ if (iSelectedSectionIndex !== -1 && iSectionIndexMax > 0) {
888
+ if (sCommand === "NextTab") {
889
+ if (iSelectedSectionIndex <= iSectionIndexMax - 1) {
890
+ newSection = aSections[++iSelectedSectionIndex];
891
+ }
892
+ } else {
893
+ // PreviousTab
894
+ if (iSelectedSectionIndex !== 0) {
895
+ newSection = aSections[--iSelectedSectionIndex];
896
+ }
897
+ }
898
+
899
+ if (newSection) {
900
+ oObjectPage.setSelectedSection(newSection);
901
+ newSection.focus();
902
+ }
903
+ }
904
+ };
905
+
906
+ _proto._getFooterVisibility = function _getFooterVisibility() {
907
+ var oInternalModelContext = this.getView().getBindingContext("internal");
908
+ var sViewId = this.getView().getId();
909
+ oInternalModelContext.setProperty("messageFooterContainsErrors", false);
910
+ sap.ui.getCore().getMessageManager().getMessageModel().getData().forEach(function (oMessage) {
911
+ if (oMessage.validation && oMessage.type === "Error" && oMessage.target.indexOf(sViewId) > -1) {
912
+ oInternalModelContext.setProperty("messageFooterContainsErrors", true);
913
+ }
914
+ });
915
+ };
916
+
917
+ _proto._showMessagePopover = function _showMessagePopover(err, oRet) {
918
+ if (err) {
919
+ Log.error(err);
920
+ }
921
+
922
+ if (!this.getAppComponent().getRootContainer().getCurrentPage().isA("sap.m.MessagePage")) {
923
+ var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton"),
924
+ oMessagePopover = oMessageButton.oMessagePopover,
925
+ oItemBinding = oMessagePopover.getBinding("items");
926
+
927
+ if (oItemBinding.getLength() > 0 && !oMessagePopover.isOpen()) {
928
+ oMessageButton.setVisible(true); // workaround to ensure that oMessageButton is rendered when openBy is called
929
+
930
+ setTimeout(function () {
931
+ oMessagePopover.openBy(oMessageButton);
932
+ }, 0);
933
+ }
934
+ }
935
+
936
+ return oRet;
937
+ };
938
+
939
+ _proto._editDocument = function _editDocument(oContext) {
940
+ var oModel = this.getView().getModel("ui");
941
+ BusyLocker.lock(oModel);
942
+ return this.editFlow.editDocument.apply(this.editFlow, [oContext]).finally(function () {
943
+ BusyLocker.unlock(oModel);
944
+ });
945
+ };
946
+
947
+ _proto._saveDocument = function _saveDocument(oContext) {
948
+ var _this8 = this;
949
+
950
+ var oModel = this.getView().getModel("ui"),
951
+ aWaitCreateDocuments = []; // indicates if we are creating a new row in the OP
952
+
953
+ var bExecuteSideEffectsOnError = false;
954
+ BusyLocker.lock(oModel);
955
+
956
+ this._findTables().forEach(function (oTable) {
957
+ var oBinding = _this8._getTableBinding(oTable);
958
+
959
+ var mParameters = {
960
+ creationMode: oTable.data("creationMode"),
961
+ creationRow: oTable.getCreationRow(),
962
+ createAtEnd: oTable.data("createAtEnd") === "true"
963
+ };
964
+ var bCreateDocument = mParameters.creationRow && mParameters.creationRow.getBindingContext() && Object.keys(mParameters.creationRow.getBindingContext().getObject()).length > 1;
965
+
966
+ if (bCreateDocument) {
967
+ // the bSkipSideEffects is a parameter created when we click the save key. If we press this key
968
+ // we don't execute the handleSideEffects funciton to avoid batch redundancy
969
+ mParameters.bSkipSideEffects = true;
970
+ bExecuteSideEffectsOnError = true;
971
+ aWaitCreateDocuments.push(_this8.editFlow.createDocument(oBinding, mParameters).then(function () {
972
+ return oBinding;
973
+ }));
974
+ }
975
+ });
976
+
977
+ return Promise.all(aWaitCreateDocuments).then(function (aBindings) {
978
+ var mParameters = {
979
+ bExecuteSideEffectsOnError: bExecuteSideEffectsOnError,
980
+ bindings: aBindings
981
+ };
982
+ return _this8.editFlow.saveDocument(oContext, mParameters).catch(function () {
983
+ return _this8._showMessagePopover;
984
+ });
985
+ }).finally(function () {
986
+ if (BusyLocker.isLocked(oModel)) {
987
+ BusyLocker.unlock(oModel);
988
+ }
989
+ });
990
+ };
991
+
992
+ _proto._manageCollaboration = function _manageCollaboration() {
993
+ openManageDialog(this.getView());
994
+ };
995
+
996
+ _proto._showCollaborationUserDetails = function _showCollaborationUserDetails(event) {
997
+ showUserDetails(event, this.getView());
998
+ };
999
+
1000
+ _proto._cancelDocument = function _cancelDocument(oContext, mParameters) {
1001
+ mParameters.cancelButton = this.getView().byId(mParameters.cancelButton); //to get the reference of the cancel button from command execution
1002
+
1003
+ return this.editFlow.cancelDocument(oContext, mParameters);
1004
+ };
1005
+
1006
+ _proto._applyDocument = function _applyDocument(oContext) {
1007
+ var _this9 = this;
1008
+
1009
+ return this.editFlow.applyDocument(oContext).catch(function () {
1010
+ return _this9._showMessagePopover();
1011
+ });
1012
+ };
1013
+
1014
+ _proto._showSwitchDraftAndActivePopover = function _showSwitchDraftAndActivePopover(event) {
1015
+ var _this10 = this;
1016
+
1017
+ var view = this.getView(),
1018
+ source = event.getSource(),
1019
+ fragmentName = "sap.fe.templates.ObjectPage.view.fragments.SwitchDraftAndActiveObjectPopOver";
1020
+
1021
+ if (this.switchDraftAndActivePopOver) {
1022
+ this.switchDraftAndActivePopOver.openBy(source, false);
1023
+ } else {
1024
+ var localThisModel = new JSONModel({}),
1025
+ preprocessorSettings = {
1026
+ bindingContexts: {
1027
+ "this": localThisModel.createBindingContext("/")
1028
+ },
1029
+ models: {
1030
+ "this": localThisModel
1031
+ }
1032
+ };
1033
+ var popoverFragment = XMLTemplateProcessor.loadTemplate(fragmentName, "fragment");
1034
+ Promise.resolve(XMLPreprocessor.process(popoverFragment, {
1035
+ name: fragmentName
1036
+ }, preprocessorSettings)).then(function (fragment) {
1037
+ return Fragment.load({
1038
+ definition: fragment,
1039
+ controller: _this10
1040
+ });
1041
+ }).then(function (popover) {
1042
+ view.addDependent(popover);
1043
+ popover.setModel(view.getModel("sap.fe.i18n"), "i18n");
1044
+ popover.setPlacement("Bottom"); // TODO
1045
+
1046
+ _this10.switchDraftAndActivePopOver = popover;
1047
+ popover.attachAfterOpen(function () {
1048
+ // While the list entry corresponding to the currently displayed document version is emphasized with a blue
1049
+ // background, we need to pre-focus the other entry
1050
+ var context = _this10.getView().getBindingContext(),
1051
+ isActiveEntity = context.getObject().IsActiveEntity;
1052
+
1053
+ var switchDraftAndActiveOptionsList = popover.getContent().find(function (element) {
1054
+ return element.data("listIdentifier") === "switchDraftAndActivePopoverList";
1055
+ });
1056
+ var listItemToFocus = isActiveEntity ? switchDraftAndActiveOptionsList.getItems().find(function (element) {
1057
+ return element.getKey() === "switchToDraft";
1058
+ }) : switchDraftAndActiveOptionsList.getItems().find(function (element) {
1059
+ return element.getKey() === "switchToActive";
1060
+ });
1061
+ listItemToFocus.focus();
1062
+ });
1063
+ popover.openBy(source); // ensure to remove the reference to the draft popover as it would be destroyed on exit
1064
+
1065
+ view.attachEventOnce("beforeExit", function () {
1066
+ delete _this10.switchDraftAndActivePopOver;
1067
+ });
1068
+ }).catch(function (Error) {
1069
+ Log.error("Error while opening the draft switch popup", Error);
1070
+ });
1071
+ }
1072
+ };
1073
+
1074
+ _proto._switchDraftAndActivePopoverListSelect = function _switchDraftAndActivePopoverListSelect(event) {
1075
+ var context = this.getView().getBindingContext(),
1076
+ selectedItemKey = event.getParameter("item").getProperty("key"),
1077
+ isActiveEntity = context.getObject().IsActiveEntity; // It was decided that we should NOT set the entry in the list corresponding to the currently displayed document version to
1078
+ // disabled, hence the user can click entries which to not cause an action (clicking "Draft" when you already display the
1079
+ // draft version of the document)
1080
+ // Hence we check here which entry in the list was clicked and which document version we currently display and only do
1081
+ // the switch between draft / active version if it makes sense.
1082
+
1083
+ if (isActiveEntity && selectedItemKey === "switchToDraft" || !isActiveEntity && selectedItemKey === "switchToActive") {
1084
+ this.editFlow.toggleDraftActive(context);
1085
+ }
1086
+
1087
+ event.getSource().getParent().close();
1088
+ };
1089
+
1090
+ _proto._updateRelatedApps = function _updateRelatedApps() {
1091
+ var oObjectPage = this._getObjectPageLayoutControl();
1092
+
1093
+ if (CommonUtils.resolveStringtoBoolean(oObjectPage.data("showRelatedApps"))) {
1094
+ CommonUtils.updateRelatedAppsDetails(oObjectPage);
1095
+ }
1096
+ };
1097
+
1098
+ _proto._findTableInSubSection = function _findTableInSubSection(aParentElement, aSubsection, aTables) {
1099
+ var aSubSectionTables = [];
1100
+
1101
+ for (var element = 0; element < aParentElement.length; element++) {
1102
+ var oElement = aParentElement[element].getContent instanceof Function && aParentElement[element].getContent();
1103
+
1104
+ if (oElement && oElement.isA && oElement.isA("sap.ui.layout.DynamicSideContent")) {
1105
+ oElement = oElement.getMainContent instanceof Function && oElement.getMainContent();
1106
+
1107
+ if (oElement && oElement.length > 0) {
1108
+ oElement = oElement[0];
1109
+ }
1110
+ }
1111
+
1112
+ if (oElement && oElement.isA && oElement.isA("sap.fe.macros.TableAPI")) {
1113
+ oElement = oElement.getContent instanceof Function && oElement.getContent();
1114
+
1115
+ if (oElement && oElement.length > 0) {
1116
+ oElement = oElement[0];
1117
+ }
1118
+ }
1119
+
1120
+ if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Table")) {
1121
+ aTables.push(oElement);
1122
+ aSubSectionTables.push({
1123
+ "table": oElement,
1124
+ "gridTable": oElement.getType().isA("sap.ui.mdc.table.GridTableType")
1125
+ });
1126
+ }
1127
+ }
1128
+
1129
+ if (aSubSectionTables.length === 1 && aParentElement.length === 1 && aSubSectionTables[0].gridTable && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
1130
+ //In case there is only a single table in a section we fit that to the whole page so that the scrollbar comes only on table and not on page
1131
+ aSubsection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
1132
+ } else {
1133
+ if (aSubSectionTables && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
1134
+ aSubSectionTables.forEach(function (oTable) {
1135
+ if (oTable.gridTable) {
1136
+ //Resetting the row count to default value in case we have a combination of forms and tables or multiple tables in a subsection
1137
+ oTable.table.getType().setRowCount(null);
1138
+ }
1139
+ });
1140
+ }
1141
+ }
1142
+ };
1143
+
1144
+ _proto._getAllSubSections = function _getAllSubSections() {
1145
+ var oObjectPage = this._getObjectPageLayoutControl();
1146
+
1147
+ var aSubSections = [];
1148
+ oObjectPage.getSections().forEach(function (oSection) {
1149
+ aSubSections = aSubSections.concat(oSection.getSubSections());
1150
+ });
1151
+ return aSubSections;
1152
+ };
1153
+
1154
+ _proto._getAllBlocks = function _getAllBlocks() {
1155
+ var aBlocks = [];
1156
+
1157
+ this._getAllSubSections().forEach(function (oSubSection) {
1158
+ aBlocks = aBlocks.concat(oSubSection.getBlocks());
1159
+ });
1160
+
1161
+ return aBlocks;
1162
+ } //TODO: This is needed for two workarounds - to be removed again
1163
+ ;
1164
+
1165
+ _proto._findTables = function _findTables() {
1166
+ var aSubSections = this._getAllSubSections();
1167
+
1168
+ var aTables = [];
1169
+
1170
+ for (var subSection = 0; subSection < aSubSections.length; subSection++) {
1171
+ this._findTableInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aTables);
1172
+
1173
+ this._findTableInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aTables);
1174
+ }
1175
+
1176
+ return aTables;
1177
+ };
1178
+
1179
+ _proto._closeSideContent = function _closeSideContent() {
1180
+ this._getAllBlocks().forEach(function (oBlock) {
1181
+ var oContent = oBlock.getContent instanceof Function && oBlock.getContent();
1182
+
1183
+ if (oContent && oContent.isA && oContent.isA("sap.ui.layout.DynamicSideContent")) {
1184
+ if (oContent.setShowSideContent instanceof Function) {
1185
+ oContent.setShowSideContent(false);
1186
+ }
1187
+ }
1188
+ });
1189
+ }
1190
+ /**
1191
+ * Chart Context is resolved for 1:n microcharts.
1192
+ *
1193
+ * @param {sap.ui.model.Context} oChartContext The Context of the MicroChart
1194
+ * @param {string} sChartPath The collectionPath of the the chart
1195
+ * @returns {Array} Array of Attributes of the chart Context
1196
+ */
1197
+ ;
1198
+
1199
+ _proto._getChartContextData = function _getChartContextData(oChartContext, sChartPath) {
1200
+ var oContextData = oChartContext.getObject();
1201
+ var oChartContextData = [oContextData];
1202
+
1203
+ if (oChartContext && sChartPath) {
1204
+ if (oContextData[sChartPath]) {
1205
+ oChartContextData = oContextData[sChartPath];
1206
+ delete oContextData[sChartPath];
1207
+ oChartContextData.push(oContextData);
1208
+ }
1209
+ }
1210
+
1211
+ return oChartContextData;
1212
+ }
1213
+ /**
1214
+ * Scroll the tables to the row with the sPath
1215
+ *
1216
+ * @function
1217
+ * @name sap.fe.templates.ObjectPage.ObjectPageController.controller#_scrollTablesToRow
1218
+ * @param {string} sRowPath 'sPath of the table row'
1219
+ *
1220
+ */
1221
+ ;
1222
+
1223
+ _proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
1224
+ if (this._findTables && this._findTables().length > 0) {
1225
+ var aTables = this._findTables();
1226
+
1227
+ for (var i = 0; i < aTables.length; i++) {
1228
+ TableScroller.scrollTableToRow(aTables[i], sRowPath);
1229
+ }
1230
+ }
1231
+ }
1232
+ /**
1233
+ * Method to merge selected contexts and filters.
1234
+ *
1235
+ * @function
1236
+ * @name _mergeMultipleContexts
1237
+ * @param {object} oPageContext Page context
1238
+ * @param {object|Array} aLineContext Selected Contexts
1239
+ * @param {string} sChartPath Collection name of the chart
1240
+ * @returns {object} Selection Variant Object
1241
+ */
1242
+ ;
1243
+
1244
+ _proto._mergeMultipleContexts = function _mergeMultipleContexts(oPageContext, aLineContext, sChartPath) {
1245
+ var _this11 = this;
1246
+
1247
+ var aAttributes = [],
1248
+ aPageAttributes = [],
1249
+ oContext,
1250
+ sMetaPathLine,
1251
+ sPathLine;
1252
+ var sPagePath = oPageContext.getPath();
1253
+ var oMetaModel = oPageContext && oPageContext.getModel() && oPageContext.getModel().getMetaModel();
1254
+ var sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, ""); // Get single line context if necessary
1255
+
1256
+ if (aLineContext && aLineContext.length) {
1257
+ oContext = aLineContext[0];
1258
+ sPathLine = oContext.getPath();
1259
+ sMetaPathLine = oMetaModel && oMetaModel.getMetaPath(sPathLine).replace(/^\/*/, "");
1260
+ aLineContext.map(function (oSingleContext) {
1261
+ if (sChartPath) {
1262
+ var oChartContextData = _this11._getChartContextData(oSingleContext, sChartPath);
1263
+
1264
+ if (oChartContextData) {
1265
+ aAttributes = oChartContextData.map(function (oChartContextData) {
1266
+ return {
1267
+ contextData: oChartContextData,
1268
+ entitySet: sMetaPathPage + "/" + sChartPath
1269
+ };
1270
+ });
1271
+ }
1272
+ } else {
1273
+ aAttributes.push({
1274
+ contextData: oSingleContext.getObject(),
1275
+ entitySet: sMetaPathLine
1276
+ });
1277
+ }
1278
+ });
1279
+ }
1280
+
1281
+ aPageAttributes.push({
1282
+ contextData: oPageContext.getObject(),
1283
+ entitySet: sMetaPathPage
1284
+ }); // Adding Page Context to selection variant
1285
+
1286
+ aPageAttributes = CommonUtils.removeSensitiveData(aPageAttributes, oMetaModel);
1287
+ var oPageLevelSV = CommonUtils.addPageContextToSelectionVariant(new SelectionVariant(), aPageAttributes, this.getView());
1288
+ aAttributes = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
1289
+ return {
1290
+ selectionVariant: oPageLevelSV,
1291
+ attributes: aAttributes
1292
+ };
1293
+ };
1294
+
1295
+ _proto._getBatchGroupsForView = function _getBatchGroupsForView() {
1296
+ var oViewData = this.getView().getViewData(),
1297
+ oConfigurations = oViewData.controlConfiguration,
1298
+ aConfigurations = oConfigurations && Object.keys(oConfigurations),
1299
+ aBatchGroups = ["$auto.Heroes", "$auto.Decoration", "$auto.Workers"];
1300
+
1301
+ if (aConfigurations && aConfigurations.length > 0) {
1302
+ aConfigurations.forEach(function (sKey) {
1303
+ var oConfiguration = oConfigurations[sKey];
1304
+
1305
+ if (oConfiguration.requestGroupId === "LongRunners") {
1306
+ aBatchGroups.push("$auto.LongRunners");
1307
+ }
1308
+ });
1309
+ }
1310
+
1311
+ return aBatchGroups;
1312
+ }
1313
+ /*
1314
+ * Reset Breadcrumb links
1315
+ *
1316
+ * @function
1317
+ * @param {sap.m.Breadcrumbs} [oSource] parent control
1318
+ * @description Used when context of the objectpage changes.
1319
+ * This event callback is attached to modelContextChange
1320
+ * event of the Breadcrumb control to catch context change.
1321
+ * Then element binding and hrefs are updated for each Link.
1322
+ *
1323
+ * @ui5-restricted
1324
+ * @experimental
1325
+ */
1326
+ ;
1327
+
1328
+ _proto._setBreadcrumbLinks = function _setBreadcrumbLinks(oSource) {
1329
+ var oContext = oSource.getBindingContext();
1330
+ var oAppComponent = this.getAppComponent();
1331
+
1332
+ if (oContext) {
1333
+ var sNewPath = oContext.getPath(),
1334
+ aPathParts = sNewPath.split("/"),
1335
+ oMetaModel = oAppComponent.getMetaModel();
1336
+ var sPath = "",
1337
+ iSkipParameterized = 0;
1338
+ aPathParts.shift();
1339
+ aPathParts.splice(-1, 1);
1340
+ aPathParts.forEach(function (sPathPart, i) {
1341
+ sPath += "/" + sPathPart;
1342
+ var oRootViewController = oAppComponent.getRootViewController();
1343
+ var sParameterPath = oMetaModel.getMetaPath(sPath);
1344
+ var bResultContext = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
1345
+
1346
+ if (bResultContext) {
1347
+ // We dont need to create a breadcrumb for Parameter path
1348
+ iSkipParameterized = 1;
1349
+ return;
1350
+ }
1351
+
1352
+ var pWaitForTitleHiearchyInfo = oRootViewController.getTitleInfoFromPath(sPath);
1353
+ pWaitForTitleHiearchyInfo.then(function (oTitleHiearchyInfo) {
1354
+ var idx = i - iSkipParameterized,
1355
+ oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link(); // sCurrentEntity is a fallback value in case of empty title
1356
+
1357
+ oLink.setText(oTitleHiearchyInfo.subtitle || oTitleHiearchyInfo.title);
1358
+ oLink.setHref(oTitleHiearchyInfo.intent);
1359
+
1360
+ if (!oSource.getLinks()[idx]) {
1361
+ oSource.addLink(oLink);
1362
+ }
1363
+ }).catch(function (oError) {
1364
+ Log.error("Error while computing the title hierarchy", oError);
1365
+ });
1366
+ });
1367
+ }
1368
+ };
1369
+
1370
+ _proto._checkDataPointTitleForExternalNavigation = function _checkDataPointTitleForExternalNavigation() {
1371
+ var oView = this.getView();
1372
+ var oInternalModelContext = oView.getBindingContext("internal");
1373
+ var oDataPoints = CommonUtils.getHeaderFacetItemConfigForExternalNavigation(oView.getViewData(), this.getAppComponent().getRoutingService().getOutbounds());
1374
+ var oShellServices = this.getAppComponent().getShellServices();
1375
+ var oPageContext = oView && oView.getBindingContext();
1376
+ oInternalModelContext.setProperty("isHeaderDPLinkVisible", {});
1377
+
1378
+ if (oPageContext) {
1379
+ oPageContext.requestObject().then(function (oData) {
1380
+ fnGetLinks(oDataPoints, oData);
1381
+ }).catch(function (oError) {
1382
+ Log.error("Cannot retrieve the links from the shell service", oError);
1383
+ });
1384
+ }
1385
+ /**
1386
+ * @param oError
1387
+ */
1388
+
1389
+
1390
+ function fnOnError(oError) {
1391
+ Log.error(oError);
1392
+ }
1393
+
1394
+ function fnSetLinkEnablement(id, aSupportedLinks) {
1395
+ var sLinkId = id; // process viable links from getLinks for all datapoints having outbound
1396
+
1397
+ if (aSupportedLinks && aSupportedLinks.length === 1 && aSupportedLinks[0].supported) {
1398
+ oInternalModelContext.setProperty("isHeaderDPLinkVisible/" + sLinkId, true);
1399
+ }
1400
+ }
1401
+ /**
1402
+ * @param oDataPoints
1403
+ * @param oPageData
1404
+ */
1405
+
1406
+
1407
+ function fnGetLinks(oDataPoints, oPageData) {
1408
+ var _loop = function (sId) {
1409
+ var oDataPoint = oDataPoints[sId];
1410
+ var oParams = {};
1411
+ var oLink = oView.byId(sId);
1412
+
1413
+ if (!oLink) {
1414
+ // for data points configured in app descriptor but not annotated in the header
1415
+ return "continue";
1416
+ }
1417
+
1418
+ var oLinkContext = oLink.getBindingContext();
1419
+ var oLinkData = oLinkContext && oLinkContext.getObject();
1420
+ var oMixedContext = merge({}, oPageData, oLinkData); // process semantic object mappings
1421
+
1422
+ if (oDataPoint.semanticObjectMapping) {
1423
+ var aSemanticObjectMapping = oDataPoint.semanticObjectMapping;
1424
+
1425
+ for (var item in aSemanticObjectMapping) {
1426
+ var oMapping = aSemanticObjectMapping[item];
1427
+ var sMainProperty = oMapping["LocalProperty"]["$PropertyPath"];
1428
+ var sMappedProperty = oMapping["SemanticObjectProperty"];
1429
+
1430
+ if (sMainProperty !== sMappedProperty) {
1431
+ if (oMixedContext.hasOwnProperty(sMainProperty)) {
1432
+ var oNewMapping = {};
1433
+ oNewMapping[sMappedProperty] = oMixedContext[sMainProperty];
1434
+ oMixedContext = merge({}, oMixedContext, oNewMapping);
1435
+ delete oMixedContext[sMainProperty];
1436
+ }
1437
+ }
1438
+ }
1439
+ }
1440
+
1441
+ if (oMixedContext) {
1442
+ for (var sKey in oMixedContext) {
1443
+ if (sKey.indexOf("_") !== 0 && sKey.indexOf("odata.context") === -1) {
1444
+ oParams[sKey] = oMixedContext[sKey];
1445
+ }
1446
+ }
1447
+ } // validate if a link must be rendered
1448
+
1449
+
1450
+ oShellServices.isNavigationSupported([{
1451
+ target: {
1452
+ semanticObject: oDataPoint.semanticObject,
1453
+ action: oDataPoint.action
1454
+ },
1455
+ params: oParams
1456
+ }]).then(function (aLinks) {
1457
+ return fnSetLinkEnablement(sId, aLinks);
1458
+ }).catch(fnOnError);
1459
+ };
1460
+
1461
+ for (var sId in oDataPoints) {
1462
+ var _ret = _loop(sId);
1463
+
1464
+ if (_ret === "continue") continue;
1465
+ }
1466
+ }
1467
+ };
1468
+
1469
+ return ObjectPageController;
1470
+ }(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec2], {
1471
+ configurable: true,
1472
+ enumerable: true,
1473
+ writable: true,
1474
+ initializer: null
1475
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "editFlow", [_dec3], {
1476
+ configurable: true,
1477
+ enumerable: true,
1478
+ writable: true,
1479
+ initializer: null
1480
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "share", [_dec4], {
1481
+ configurable: true,
1482
+ enumerable: true,
1483
+ writable: true,
1484
+ initializer: null
1485
+ }), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "_editFlow", [_dec5], {
1486
+ configurable: true,
1487
+ enumerable: true,
1488
+ writable: true,
1489
+ initializer: null
1490
+ }), _descriptor5 = _applyDecoratedDescriptor(_class2.prototype, "_routing", [_dec6], {
1491
+ configurable: true,
1492
+ enumerable: true,
1493
+ writable: true,
1494
+ initializer: null
1495
+ }), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "paginator", [_dec7], {
1496
+ configurable: true,
1497
+ enumerable: true,
1498
+ writable: true,
1499
+ initializer: null
1500
+ }), _descriptor7 = _applyDecoratedDescriptor(_class2.prototype, "messageHandler", [_dec8], {
1501
+ configurable: true,
1502
+ enumerable: true,
1503
+ writable: true,
1504
+ initializer: null
1505
+ }), _descriptor8 = _applyDecoratedDescriptor(_class2.prototype, "intentBasedNavigation", [_dec9], {
1506
+ configurable: true,
1507
+ enumerable: true,
1508
+ writable: true,
1509
+ initializer: null
1510
+ }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "_intentBasedNavigation", [_dec10], {
1511
+ configurable: true,
1512
+ enumerable: true,
1513
+ writable: true,
1514
+ initializer: null
1515
+ }), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec11], {
1516
+ configurable: true,
1517
+ enumerable: true,
1518
+ writable: true,
1519
+ initializer: null
1520
+ }), _descriptor11 = _applyDecoratedDescriptor(_class2.prototype, "pageReady", [_dec12], {
1521
+ configurable: true,
1522
+ enumerable: true,
1523
+ writable: true,
1524
+ initializer: null
1525
+ }), _descriptor12 = _applyDecoratedDescriptor(_class2.prototype, "massEdit", [_dec13], {
1526
+ configurable: true,
1527
+ enumerable: true,
1528
+ writable: true,
1529
+ initializer: null
1530
+ }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype)), _class2)) || _class);
1531
+ return ObjectPageController;
1532
+ }, false);
1533
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiT2JqZWN0UGFnZUNvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiUGxhY2Vob2xkZXIiLCJFZGl0RmxvdyIsIlNoYXJlIiwib3ZlcnJpZGUiLCJTaGFyZU92ZXJyaWRlcyIsIkludGVybmFsRWRpdEZsb3ciLCJFZGl0Rmxvd092ZXJyaWRlcyIsIkludGVybmFsUm91dGluZyIsIkludGVybmFsUm91dGluZ092ZXJyaWRlIiwiUGFnaW5hdG9yIiwiUGFnaW5hdG9yT3ZlcnJpZGUiLCJNZXNzYWdlSGFuZGxlciIsIk1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbk1vZGUiLCJiSXNTdGlja3lFZGl0TW9kZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiZ2V0U3RpY2t5RWRpdE1vZGUiLCJ1bmRlZmluZWQiLCJWaWV3U3RhdGUiLCJWaWV3U3RhdGVPdmVycmlkZXMiLCJQYWdlUmVhZHkiLCJpc0NvbnRleHRFeHBlY3RlZCIsIk1hc3NFZGl0IiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImhhbmRsZXJzIiwib25UYWJsZUNvbnRleHRDaGFuZ2UiLCJvRXZlbnQiLCJvU291cmNlIiwiZ2V0U291cmNlIiwib1RhYmxlIiwiX2ZpbmRUYWJsZXMiLCJzb21lIiwiX29UYWJsZSIsImdldFJvd0JpbmRpbmciLCJvQ3VycmVudEFjdGlvblByb21pc2UiLCJfZWRpdEZsb3ciLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImFUYWJsZUNvbnRleHRzIiwiZ2V0VHlwZSIsImdldE1ldGFkYXRhIiwiaXNBIiwiZ2V0Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJ0aGVuIiwib0FjdGlvblJlc3BvbnNlIiwiY29udHJvbElkIiwic0lkIiwib0FjdGlvbkRhdGEiLCJvRGF0YSIsImFLZXlzIiwia2V5cyIsImlOZXdJdGVtcCIsImZpbmQiLCJvVGFibGVDb250ZXh0IiwiaSIsIm9UYWJsZURhdGEiLCJnZXRPYmplY3QiLCJiQ29tcGFyZSIsImV2ZXJ5Iiwic0tleSIsImFEaWFsb2dzIiwiSW5zdGFuY2VNYW5hZ2VyIiwiZ2V0T3BlbkRpYWxvZ3MiLCJvRGlhbG9nIiwibGVuZ3RoIiwiZGlhbG9nIiwiZGF0YSIsImF0dGFjaEV2ZW50T25jZSIsImZvY3VzUm93IiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwib01lc3NhZ2VCdXR0b24iLCJieUlkIiwiZmlyZU1vZGVsQ29udGV4dENoYW5nZSIsIm9uQ2FsbEFjdGlvbiIsIm9WaWV3Iiwic0FjdGlvbk5hbWUiLCJtUGFyYW1ldGVycyIsIm9Db250cm9sbGVyIiwidGhhdCIsImVkaXRGbG93IiwiaW52b2tlQWN0aW9uIiwiX3Nob3dNZXNzYWdlUG9wb3ZlciIsImJpbmQiLCJvbkRhdGFQb2ludFRpdGxlUHJlc3NlZCIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbnRyb2xDb25maWciLCJzQ29sbGVjdGlvblBhdGgiLCJKU09OIiwicGFyc2UiLCJvVGFyZ2V0SW5mbyIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJDb21tb25VdGlscyIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNNZXRhUGF0aCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiYU5hdmlnYXRpb25EYXRhIiwiX2dldENoYXJ0Q29udGV4dERhdGEiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJtYXAiLCJvTmF2aWdhdGlvbkRhdGEiLCJtZXRhUGF0aCIsInBhcmFtZXRlcnMiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE91dGJvdW5kUGFyYW1zIiwiT2JqZWN0Iiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsIm9Db250ZXh0Iiwic0NyZWF0ZVBhdGgiLCJvbk5hdmlnYXRlQ2hhbmdlIiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJiU2VjdGlvbk5hdmlnYXRlZCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9PYmplY3RQYWdlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwiZ2V0UHJvcGVydHkiLCJnZXRWaWV3RGF0YSIsInNlY3Rpb25MYXlvdXQiLCJvU3ViU2VjdGlvbiIsImdldFBhcmFtZXRlciIsIl91cGRhdGVGb2N1c0luRWRpdE1vZGUiLCJvblZhcmlhbnRTZWxlY3RlZCIsIm9uVmFyaWFudFNhdmVkIiwic2V0VGltZW91dCIsIm5hdmlnYXRlVG9TdWJTZWN0aW9uIiwidkRldGFpbENvbmZpZyIsIm9EZXRhaWxDb25maWciLCJvU2VjdGlvbiIsInNlY3Rpb25JZCIsInN1YlNlY3Rpb25JZCIsImdldFN1YlNlY3Rpb25zIiwiZ2V0UGFyZW50IiwiZ2V0VmlzaWJsZSIsImdldFJlc291cmNlQnVuZGxlIiwib1Jlc291cmNlQnVuZGxlIiwic1RpdGxlIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXQiLCJNZXNzYWdlQm94Iiwic2Nyb2xsVG9TZWN0aW9uIiwiZ2V0SWQiLCJmaXJlTmF2aWdhdGUiLCJzZWN0aW9uIiwic3ViU2VjdGlvbiIsIm9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkIiwiQ2hhcnRSdW50aW1lIiwiZm5VcGRhdGVDaGFydCIsIm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyIsIkV4dGVuc2lvbkFQSSIsImV4dGVuc2lvbkFQSSIsIm9uSW5pdCIsInNldFByb3BlcnR5IiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsInVzZU5ld0xhenlMb2FkaW5nIiwiZ2V0RW5hYmxlTGF6eUxvYWRpbmciLCJhdHRhY2hFdmVudCIsIl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0Iiwib25FeGl0IiwiZGVzdHJveSIsIm9NZXNzYWdlUG9wb3ZlciIsImlzT3BlbiIsImNsb3NlIiwiX2dldFRhYmxlQmluZGluZyIsIm9uQmVmb3JlUmVuZGVyaW5nIiwiUGFnZUNvbnRyb2xsZXIiLCJwcm90b3R5cGUiLCJhcHBseSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJyZXNwb25zZSIsIm9FcnJvciIsIl9vbkJlZm9yZUJpbmRpbmciLCJhVGFibGVzIiwib0ludGVybmFsTW9kZWwiLCJhQmF0Y2hHcm91cHMiLCJpVmlld0xldmVsIiwidmlld0xldmVsIiwib0Zhc3RDcmVhdGlvblJvdyIsInB1c2giLCJiRHJhZnROYXZpZ2F0aW9uIiwiX2Nsb3NlU2lkZUNvbnRlbnQiLCJvcENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJnZXRDcmVhdGlvblJvdyIsInNldEJpbmRpbmdDb250ZXh0IiwiZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uIiwiaXNGaXJzdFJlbmRlcmluZyIsImJQZXJzaXN0T1BTY3JvbGwiLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvRGVsZWdhdGVPbkJlZm9yZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJwYWdlUmVhZHkiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwib0JpbmRpbmciLCJsaXN0QmluZGluZyIsIm9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCIsIm9CaW5kaW5nVG9Vc2UiLCJwYWdpbmF0b3IiLCJpbml0aWFsaXplIiwic0NvbnRleHRQYXRoIiwicmVwbGFjZSIsIk9EYXRhTGlzdEJpbmRpbmciLCJvTW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIl9zZXRMaXN0QmluZGluZ0FzeW5jIiwiZGV0YWNoRXZlbnQiLCJhU2VjdGlvbnMiLCJnZXRTZWN0aW9ucyIsImJVc2VJY29uVGFiQmFyIiwiZ2V0VXNlSWNvblRhYkJhciIsImlTa2lwIiwiYklzSW5FZGl0TW9kZSIsImJFZGl0YWJsZUhlYWRlciIsImVkaXRhYmxlSGVhZGVyQ29udGVudCIsImlTZWN0aW9uIiwiYVN1YlNlY3Rpb25zIiwiaVN1YlNlY3Rpb24iLCJpc1Zpc2liaWxpdHlEeW5hbWljIiwicGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRW5hYmxlZCIsInNob3dQbGFjZWhvbGRlciIsIm9OYXZDb250YWluZXIiLCJvQ29udGFpbmVyIiwiX2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudCIsIm9GaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJhQWN0aW9ucyIsImdldEhlYWRlclRpdGxlIiwiZ2V0QWN0aW9ucyIsIm9BY3Rpb24iLCJnZXRFbmFibGVkIiwiX2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uIiwiYUJsb2NrcyIsImdldEJsb2NrcyIsImJsb2NrIiwiYUZvcm1Db250YWluZXJzIiwiZ2V0Rm9ybUNvbnRhaW5lcnMiLCJnZXRDb250ZW50IiwiZm9ybUNvbnRhaW5lciIsImFGb3JtRWxlbWVudHMiLCJnZXRGb3JtRWxlbWVudHMiLCJmb3JtRWxlbWVudCIsImFGaWVsZHMiLCJnZXRGaWVsZHMiLCJnZXRSZXF1aXJlZCIsImdldFZhbHVlIiwiZGVidWciLCJvTWFuZGF0b3J5RmllbGQiLCJvRmllbGRUb0ZvY3VzIiwiY29udGVudCIsImdldENvbnRlbnRFZGl0IiwiX2dldEZpcnN0RWRpdGFibGVJbnB1dCIsImZvY3VzIiwiX29uQmFja05hdmlnYXRpb25JbkRyYWZ0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0IiwiaGlzdG9yeSIsImJhY2siLCJmblByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJfb25BZnRlckJpbmRpbmciLCJvQmluZGluZ0NvbnRleHQiLCJfc2lkZUVmZmVjdHMiLCJjbGVhclByb3BlcnRpZXNTdGF0dXMiLCJhSUJOQWN0aW9ucyIsImZvckVhY2giLCJnZXRJQk5BY3Rpb25zIiwib1RhYmxlUm93QmluZGluZyIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwicmVtb3ZlQ2FjaGVzQW5kTWVzc2FnZXMiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiQ29tbW9uSGVscGVyIiwicGFyc2VDdXN0b21EYXRhIiwiRGVsZWdhdGVVdGlsIiwiZ2V0Q3VzdG9tRGF0YSIsImFTZWxlY3RlZENvbnRleHRzIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJnZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsIiwib09iamVjdFBhZ2VUaXRsZSIsImFJQk5IZWFkZXJBY3Rpb25zIiwiY29uY2F0IiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJvRmluYWxVSVN0YXRlIiwiZW5hYmxlRmFzdENyZWF0aW9uUm93Iiwib0xpc3RCaW5kaW5nIiwib0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nIiwib0Zhc3RDcmVhdGlvbkNvbnRleHQiLCJiaW5kTGlzdCIsImdldENvbnRleHQiLCIkJHVwZGF0ZUdyb3VwSWQiLCIkJGdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJjcmVhdGVkIiwidHJhY2UiLCJoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMiLCJmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMiLCJmbkhhbmRsZUNoYW5nZSIsImRldGFjaENoYW5nZSIsImF0dGFjaENoYW5nZSIsImNvbXB1dGVFZGl0TW9kZSIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiY29ubmVjdCIsIm9DYWNoZSIsIl91cGRhdGVSZWxhdGVkQXBwcyIsImZuVXBkYXRlUmVsYXRlZEFwcHMiLCJkZXRhY2hEYXRhUmVjZWl2ZWQiLCJhdHRhY2hEYXRhUmVjZWl2ZWQiLCJoYW5kbGVQYXRjaFNlbnQiLCJUYWJsZVV0aWxzIiwid2hlbkJvdW5kIiwiX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMiLCJvblBhZ2VSZWFkeSIsImJJc1N0aWNreU1vZGUiLCJvQXBwQ29tcG9uZW50IiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiZ2V0QXBwU3RhdGVIYW5kbGVyIiwiYXBwbHlBcHBTdGF0ZSIsImZvcmNlRm9jdXMiLCJpc0luRGlzcGxheU1vZGUiLCJhVmlzaWJsZVNlY3Rpb25zIiwiZmlsdGVyIiwiYVZpc2libGVTdWJTZWN0aW9ucyIsImZsYXQiLCJfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbiIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9PYmplY3RQYWdlU3VidGl0bGUiLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsIm9UaXRsZUluZm8iLCJ0aXRsZSIsInN1YnRpdGxlIiwiaW50ZW50IiwiaWNvbiIsIl9leGVjdXRlSGVhZGVyU2hvcnRjdXQiLCJzQnV0dG9uSWQiLCJvQnV0dG9uIiwib0VsZW1lbnQiLCJmaXJlQnV0dG9uUHJlc3MiLCJfZXhlY3V0ZUZvb3RlclNob3J0Y3V0IiwiZ2V0Rm9vdGVyIiwiZ2V0TmFtZSIsIl9leGVjdXRlVGFiU2hvcnRDdXQiLCJvRXhlY3V0aW9uIiwiaVNlY3Rpb25JbmRleE1heCIsInNDb21tYW5kIiwiZ2V0Q29tbWFuZCIsIm5ld1NlY3Rpb24iLCJpU2VsZWN0ZWRTZWN0aW9uSW5kZXgiLCJpbmRleE9mU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsIl9nZXRGb290ZXJWaXNpYmlsaXR5Iiwic1ZpZXdJZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsIm9NZXNzYWdlIiwidmFsaWRhdGlvbiIsInR5cGUiLCJ0YXJnZXQiLCJpbmRleE9mIiwib1JldCIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9JdGVtQmluZGluZyIsImdldExlbmd0aCIsInNldFZpc2libGUiLCJvcGVuQnkiLCJfZWRpdERvY3VtZW50IiwiQnVzeUxvY2tlciIsImxvY2siLCJlZGl0RG9jdW1lbnQiLCJmaW5hbGx5IiwidW5sb2NrIiwiX3NhdmVEb2N1bWVudCIsImFXYWl0Q3JlYXRlRG9jdW1lbnRzIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJjcmVhdGlvbk1vZGUiLCJjcmVhdGlvblJvdyIsImNyZWF0ZUF0RW5kIiwiYkNyZWF0ZURvY3VtZW50IiwiYlNraXBTaWRlRWZmZWN0cyIsImNyZWF0ZURvY3VtZW50IiwiUHJvbWlzZSIsImFsbCIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwic2F2ZURvY3VtZW50IiwiaXNMb2NrZWQiLCJfbWFuYWdlQ29sbGFib3JhdGlvbiIsIm9wZW5NYW5hZ2VEaWFsb2ciLCJfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyIsImV2ZW50Iiwic2hvd1VzZXJEZXRhaWxzIiwiX2NhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY2FuY2VsRG9jdW1lbnQiLCJfYXBwbHlEb2N1bWVudCIsImFwcGx5RG9jdW1lbnQiLCJfc2hvd1N3aXRjaERyYWZ0QW5kQWN0aXZlUG9wb3ZlciIsInZpZXciLCJzb3VyY2UiLCJmcmFnbWVudE5hbWUiLCJzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXIiLCJsb2NhbFRoaXNNb2RlbCIsIkpTT05Nb2RlbCIsInByZXByb2Nlc3NvclNldHRpbmdzIiwiYmluZGluZ0NvbnRleHRzIiwibW9kZWxzIiwicG9wb3ZlckZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJyZXNvbHZlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJmcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwicG9wb3ZlciIsImFkZERlcGVuZGVudCIsInNldE1vZGVsIiwic2V0UGxhY2VtZW50IiwiYXR0YWNoQWZ0ZXJPcGVuIiwiY29udGV4dCIsImlzQWN0aXZlRW50aXR5IiwiSXNBY3RpdmVFbnRpdHkiLCJzd2l0Y2hEcmFmdEFuZEFjdGl2ZU9wdGlvbnNMaXN0IiwiZWxlbWVudCIsImxpc3RJdGVtVG9Gb2N1cyIsImdldEl0ZW1zIiwiRXJyb3IiLCJfc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BvdmVyTGlzdFNlbGVjdCIsInNlbGVjdGVkSXRlbUtleSIsInRvZ2dsZURyYWZ0QWN0aXZlIiwicmVzb2x2ZVN0cmluZ3RvQm9vbGVhbiIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsIl9maW5kVGFibGVJblN1YlNlY3Rpb24iLCJhUGFyZW50RWxlbWVudCIsImFTdWJzZWN0aW9uIiwiYVN1YlNlY3Rpb25UYWJsZXMiLCJnZXRNYWluQ29udGVudCIsImdyaWRUYWJsZSIsImhhc1N0eWxlQ2xhc3MiLCJhZGRTdHlsZUNsYXNzIiwidGFibGUiLCJzZXRSb3dDb3VudCIsIl9nZXRBbGxTdWJTZWN0aW9ucyIsIl9nZXRBbGxCbG9ja3MiLCJnZXRNb3JlQmxvY2tzIiwib0Jsb2NrIiwib0NvbnRlbnQiLCJzZXRTaG93U2lkZUNvbnRlbnQiLCJvQ2hhcnRDb250ZXh0Iiwic0NoYXJ0UGF0aCIsIm9Db250ZXh0RGF0YSIsIm9DaGFydENvbnRleHREYXRhIiwiX3Njcm9sbFRhYmxlc1RvUm93Iiwic1Jvd1BhdGgiLCJUYWJsZVNjcm9sbGVyIiwic2Nyb2xsVGFibGVUb1JvdyIsIl9tZXJnZU11bHRpcGxlQ29udGV4dHMiLCJvUGFnZUNvbnRleHQiLCJhTGluZUNvbnRleHQiLCJhQXR0cmlidXRlcyIsImFQYWdlQXR0cmlidXRlcyIsInNNZXRhUGF0aExpbmUiLCJzUGF0aExpbmUiLCJzUGFnZVBhdGgiLCJvTWV0YU1vZGVsIiwic01ldGFQYXRoUGFnZSIsIm9TaW5nbGVDb250ZXh0IiwiY29udGV4dERhdGEiLCJyZW1vdmVTZW5zaXRpdmVEYXRhIiwib1BhZ2VMZXZlbFNWIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0aW9uVmFyaWFudCIsImF0dHJpYnV0ZXMiLCJvVmlld0RhdGEiLCJvQ29uZmlndXJhdGlvbnMiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImFDb25maWd1cmF0aW9ucyIsIm9Db25maWd1cmF0aW9uIiwicmVxdWVzdEdyb3VwSWQiLCJfc2V0QnJlYWRjcnVtYkxpbmtzIiwic05ld1BhdGgiLCJhUGF0aFBhcnRzIiwic3BsaXQiLCJzUGF0aCIsImlTa2lwUGFyYW1ldGVyaXplZCIsInNoaWZ0Iiwic3BsaWNlIiwic1BhdGhQYXJ0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsInNQYXJhbWV0ZXJQYXRoIiwiYlJlc3VsdENvbnRleHQiLCJwV2FpdEZvclRpdGxlSGllYXJjaHlJbmZvIiwiZ2V0VGl0bGVJbmZvRnJvbVBhdGgiLCJvVGl0bGVIaWVhcmNoeUluZm8iLCJpZHgiLCJvTGluayIsImdldExpbmtzIiwiTGluayIsInNldFRleHQiLCJzZXRIcmVmIiwiYWRkTGluayIsIm9EYXRhUG9pbnRzIiwiZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRPdXRib3VuZHMiLCJvU2hlbGxTZXJ2aWNlcyIsInJlcXVlc3RPYmplY3QiLCJmbkdldExpbmtzIiwiZm5PbkVycm9yIiwiZm5TZXRMaW5rRW5hYmxlbWVudCIsImlkIiwiYVN1cHBvcnRlZExpbmtzIiwic0xpbmtJZCIsInN1cHBvcnRlZCIsIm9QYWdlRGF0YSIsIm9EYXRhUG9pbnQiLCJvTGlua0NvbnRleHQiLCJvTGlua0RhdGEiLCJvTWl4ZWRDb250ZXh0IiwibWVyZ2UiLCJpdGVtIiwib01hcHBpbmciLCJzTWFpblByb3BlcnR5Iiwic01hcHBlZFByb3BlcnR5IiwiaGFzT3duUHJvcGVydHkiLCJvTmV3TWFwcGluZyIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsInBhcmFtcyIsImFMaW5rcyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BMkRNQSxvQixXQURMQyxjQUFjLENBQUMsa0RBQUQsQyxVQUViQyxjQUFjLENBQUNDLFdBQUQsQyxVQUVkRCxjQUFjLENBQUNFLFFBQUQsQyxVQUVkRixjQUFjLENBQUNHLEtBQUssQ0FBQ0MsUUFBTixDQUFlQyxjQUFmLENBQUQsQyxVQUVkTCxjQUFjLENBQUNNLGdCQUFnQixDQUFDRixRQUFqQixDQUEwQkcsaUJBQTFCLENBQUQsQyxVQUVkUCxjQUFjLENBQUNRLGVBQWUsQ0FBQ0osUUFBaEIsQ0FBeUJLLHVCQUF6QixDQUFELEMsVUFFZFQsY0FBYyxDQUFDVSxTQUFTLENBQUNOLFFBQVYsQ0FBbUJPLGlCQUFuQixDQUFELEMsVUFFZFgsY0FBYyxDQUFDWSxjQUFjLENBQUNSLFFBQWYsQ0FBd0JTLHNCQUF4QixDQUFELEMsVUFFZGIsY0FBYyxDQUFDYyxxQkFBcUIsQ0FBQ1YsUUFBdEIsQ0FBK0JXLDZCQUEvQixDQUFELEMsV0FFZGYsY0FBYyxDQUNkZ0IsNkJBQTZCLENBQUNaLFFBQTlCLENBQXVDO0FBQ3RDYSxJQUFBQSxpQkFBaUIsRUFBRSxZQUErQztBQUNqRSxVQUFNQyxpQkFBaUIsR0FDckIsS0FBS0MsT0FBTCxHQUFlQyxhQUFmLEVBQUQsQ0FBeURDLGlCQUF6RCxJQUNDLEtBQUtGLE9BQUwsR0FBZUMsYUFBZixFQUFELENBQXlEQyxpQkFBekQsRUFGRDtBQUdBLGFBQU9I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Z2UsVUFBQUEsY0FBYyxDQUNacUIscUJBREYsQ0FDd0IsQ0FDdEI7QUFDQ2hMLFlBQUFBLE1BQU0sRUFBRTtBQUNQN1EsY0FBQUEsY0FBYyxFQUFFa2IsVUFBVSxDQUFDbGIsY0FEcEI7QUFFUEMsY0FBQUEsTUFBTSxFQUFFaWIsVUFBVSxDQUFDamI7QUFGWixhQURUO0FBS0M2YixZQUFBQSxNQUFNLEVBQUVsYztBQUxULFdBRHNCLENBRHhCLEVBVUVwRSxJQVZGLENBVU8sVUFBQ3VnQixNQUFELEVBQVk7QUFDakIsbUJBQU9uQixtQkFBbUIsQ0FBQ2pmLEdBQUQsRUFBTW9nQixNQUFOLENBQTFCO0FBQ0EsV0FaRixFQWFFNWUsS0FiRixDQWFRd2QsU0FiUjtBQXRDb0Q7O0FBQ3JELGFBQUssSUFBTWhmLEdBQVgsSUFBa0J5ZSxXQUFsQixFQUErQjtBQUFBLDJCQUFwQnplLEdBQW9COztBQUFBLG1DQU03QjtBQTZDRDtBQUNEO0FBQ0QsSzs7O0lBcnBDaUN3SSxjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBbzJDcEJqTSxvQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBvcGVuTWFuYWdlRGlhbG9nLCBzaG93VXNlckRldGFpbHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9jb2xsYWJvcmF0aW9uL01hbmFnZVwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBFZGl0RmxvdyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRWRpdEZsb3dcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsRWRpdEZsb3dcIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IE1hc3NFZGl0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NYXNzRWRpdFwiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2VSZWFkeSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnZVJlYWR5XCI7XG5pbXBvcnQgUGFnaW5hdG9yIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QYWdpbmF0b3JcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24sIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIsIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IENoYXJ0UnVudGltZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEV4dGVuc2lvbkFQSSwgZGVmYXVsdCBhcyBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvUm9vdENvbnRhaW5lci9jb250cm9sbGVyL1Jvb3RDb250YWluZXJCYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IEVkaXRGbG93T3ZlcnJpZGVzIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1Jvb3RDb250YWluZXIvb3ZlcnJpZGVzL0VkaXRGbG93XCI7XG5pbXBvcnQgVGFibGVTY3JvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9UYWJsZVNjcm9sbGVyXCI7XG5pbXBvcnQgSW5zdGFuY2VNYW5hZ2VyIGZyb20gXCJzYXAvbS9JbnN0YW5jZU1hbmFnZXJcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJzYXAvbS9MaW5rXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBTZWxlY3RMaXN0IGZyb20gXCJzYXAvbS9TZWxlY3RMaXN0XCI7XG5pbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IEl0ZW0gZnJvbSBcInNhcC91aS9jb3JlL0l0ZW1cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZVwiO1xuaW1wb3J0IE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcbmltcG9ydCBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCBPYmplY3RQYWdlU3ViU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVN1YlNlY3Rpb25cIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgUGFnaW5hdG9yT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL1BhZ2luYXRvclwiO1xuaW1wb3J0IFNoYXJlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9TaGFyZVwiO1xuaW1wb3J0IFZpZXdTdGF0ZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvVmlld1N0YXRlXCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlclwiKVxuY2xhc3MgT2JqZWN0UGFnZUNvbnRyb2xsZXIgZXh0ZW5kcyBQYWdlQ29udHJvbGxlciB7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKEVkaXRGbG93KVxuXHRlZGl0RmxvdyE6IEVkaXRGbG93O1xuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZXJuYWxFZGl0Rmxvdy5vdmVycmlkZShFZGl0Rmxvd092ZXJyaWRlcykpXG5cdF9lZGl0RmxvdyE6IEludGVybmFsRWRpdEZsb3c7XG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlcm5hbFJvdXRpbmcub3ZlcnJpZGUoSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUpKVxuXHRfcm91dGluZyE6IEludGVybmFsUm91dGluZztcblx0QHVzaW5nRXh0ZW5zaW9uKFBhZ2luYXRvci5vdmVycmlkZShQYWdpbmF0b3JPdmVycmlkZSkpXG5cdHBhZ2luYXRvciE6IFBhZ2luYXRvcjtcblx0QHVzaW5nRXh0ZW5zaW9uKE1lc3NhZ2VIYW5kbGVyLm92ZXJyaWRlKE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUpKVxuXHRtZXNzYWdlSGFuZGxlciE6IE1lc3NhZ2VIYW5kbGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlKSlcblx0aW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0TmF2aWdhdGlvbk1vZGU6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCBiSXNTdGlja3lFZGl0TW9kZSA9XG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUgJiZcblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSgpO1xuXHRcdFx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGUgPyBcImV4cGxhY2VcIiA6IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFZpZXdTdGF0ZS5vdmVycmlkZShWaWV3U3RhdGVPdmVycmlkZXMpKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRQYWdlUmVhZHkub3ZlcnJpZGUoe1xuXHRcdFx0aXNDb250ZXh0RXhwZWN0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRwYWdlUmVhZHkhOiBQYWdlUmVhZHk7XG5cdEB1c2luZ0V4dGVuc2lvbihNYXNzRWRpdClcblx0bWFzc0VkaXQhOiBNYXNzRWRpdDtcblx0cHJpdmF0ZSBtQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM/OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJPjtcblx0cHJpdmF0ZSBleHRlbnNpb25BUEk/OiBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJO1xuXHRwcml2YXRlIG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXHRwcml2YXRlIGJTZWN0aW9uTmF2aWdhdGVkPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXI/OiBQb3BvdmVyO1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRFeHRlbnNpb25BUEkoc0lkPzogc3RyaW5nKTogRXh0ZW5zaW9uQVBJIHtcblx0XHRpZiAoc0lkKSB7XG5cdFx0XHQvLyB0byBhbGxvdyBsb2NhbCBJRCB1c2FnZSBmb3IgY3VzdG9tIHBhZ2VzIHdlJ2xsIGNyZWF0ZS9yZXR1cm4gb3duIGluc3RhbmNlcyBmb3IgY3VzdG9tIHNlY3Rpb25zXG5cdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyA9IHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzIHx8IHt9O1xuXG5cdFx0XHRpZiAoIXRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0pIHtcblx0XHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcywgc0lkKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIXRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbkFQSTtcblx0XHR9XG5cdH1cblxuXHRvbkluaXQoKSB7XG5cdFx0c3VwZXIub25Jbml0KCk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXG5cdFx0Ly8gU2V0dGluZyBkZWZhdWx0cyBvZiBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJleHRlcm5hbE5hdmlnYXRpb25Db250ZXh0XCIsIHsgXCJwYWdlXCI6IHRydWUgfSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHNcIiwge1xuXHRcdFx0dmlzaWJpbGl0eTogZmFsc2UsXG5cdFx0XHRpdGVtczogbnVsbFxuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIsIHRoaXMuX2dldEJhdGNoR3JvdXBzRm9yVmlldygpKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cdFx0aWYgKCEodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnVzZU5ld0xhenlMb2FkaW5nICYmIChvT2JqZWN0UGFnZSBhcyBhbnkpLmdldEVuYWJsZUxhenlMb2FkaW5nKCkpIHtcblx0XHRcdC8vQXR0YWNoaW5nIHRoZSBldmVudCB0byBtYWtlIHRoZSBzdWJzZWN0aW9uIGNvbnRleHQgYmluZGluZyBhY3RpdmUgd2hlbiBpdCBpcyB2aXNpYmxlLlxuXHRcdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnQoXCJzdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0XCIsIHRoaXMuX2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQuYmluZCh0aGlzKSk7XG5cdFx0fVxuXHR9XG5cblx0b25FeGl0KCkge1xuXHRcdGlmICh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykge1xuXHRcdFx0Zm9yIChjb25zdCBzSWQgb2YgT2JqZWN0LmtleXModGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpKSB7XG5cdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0gJiYgdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXS5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0XHRkZWxldGUgdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM7XG5cdFx0fVxuXHRcdHRoaXMuZXh0ZW5zaW9uQVBJICYmIHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHRkZWxldGUgdGhpcy5leHRlbnNpb25BUEk7XG5cblx0XHRjb25zdCBvTWVzc2FnZUJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpNZXNzYWdlQnV0dG9uXCIpLFxuXHRcdFx0b01lc3NhZ2VQb3BvdmVyID0gb01lc3NhZ2VCdXR0b24gPyAob01lc3NhZ2VCdXR0b24gYXMgYW55KS5vTWVzc2FnZVBvcG92ZXIgOiBudWxsO1xuXHRcdGlmIChvTWVzc2FnZVBvcG92ZXIgJiYgb01lc3NhZ2VQb3BvdmVyLmlzT3BlbigpKSB7XG5cdFx0XHRvTWVzc2FnZVBvcG92ZXIuY2xvc2UoKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0VGFibGVCaW5kaW5nKG9UYWJsZTogYW55KSB7XG5cdFx0cmV0dXJuIG9UYWJsZSAmJiBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHR9XG5cblx0b25CZWZvcmVSZW5kZXJpbmcoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyaW5nLmFwcGx5KHRoaXMpO1xuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHQoKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gcmVzcG9uc2U7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0X29uQmVmb3JlQmluZGluZyhvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Ly8gVE9ETzogd2Ugc2hvdWxkIGNoZWNrIGhvdyB0aGlzIGNvbWVzIHRvZ2V0aGVyIHdpdGggdGhlIHRyYW5zYWN0aW9uIGhlbHBlciwgc2FtZSB0byB0aGUgY2hhbmdlIGluIHRoZSBhZnRlckJpbmRpbmdcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpLFxuXHRcdFx0b09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpIGFzIE9iamVjdFBhZ2VMYXlvdXQsXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIpLFxuXHRcdFx0aVZpZXdMZXZlbCA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsO1xuXHRcdGxldCBvRmFzdENyZWF0aW9uUm93O1xuXHRcdGFCYXRjaEdyb3Vwcy5wdXNoKFwiJGF1dG9cIik7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24gIT09IHRydWUpIHtcblx0XHRcdHRoaXMuX2Nsb3NlU2lkZUNvbnRlbnQoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGlmIChcblx0XHRcdG9wQ29udGV4dCAmJlxuXHRcdFx0b3BDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiZcblx0XHRcdCFhQmF0Y2hHcm91cHMuc29tZSgob3BDb250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuaGFzUGVuZGluZ0NoYW5nZXMuYmluZChvcENvbnRleHQuZ2V0TW9kZWwoKSkpXG5cdFx0KSB7XG5cdFx0XHQvKiBcdEluIGNhc2UgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBmb3IgdGhlIGNyZWF0aW9uIHJvdyBhbmQgbm8gb3RoZXJzIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNoYW5nZXNcbiAgICBcdFx0XHRcdFx0XHRUT0RPOiB0aGlzIGlzIGp1c3QgYSBxdWljayBzb2x1dGlvbiwgdGhpcyBuZWVkcyB0byBiZSByZXdvcmtlZFxuICAgIFx0XHRcdFx0IFx0Ki9cblxuXHRcdFx0b3BDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyBGb3Igbm93IHdlIGhhdmUgdG8gc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgdG8gbnVsbCBmb3IgZXZlcnkgZmFzdCBjcmVhdGlvbiByb3dcblx0XHQvLyBUT0RPOiBHZXQgcmlkIG9mIHRoaXMgY29kaW5nIG9yIG1vdmUgaXQgdG8gYW5vdGhlciBsYXllciAtIHRvIGJlIGRpc2N1c3NlZCB3aXRoIE1EQyBhbmQgbW9kZWxcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFUYWJsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cgPSBhVGFibGVzW2ldLmdldENyZWF0aW9uUm93KCk7XG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNjcm9sbCB0byBwcmVzZW50IFNlY3Rpb24gc28gdGhhdCBiaW5kaW5ncyBhcmUgZW5hYmxlZCBkdXJpbmcgbmF2aWdhdGlvbiB0aHJvdWdoIHBhZ2luYXRvciBidXR0b25zLCBhcyB0aGVyZSBpcyBubyB2aWV3IHJlcmVuZGVyaW5nL3JlYmluZFxuXHRcdGNvbnN0IGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICghKG9PYmplY3RQYWdlIGFzIGFueSkuaXNGaXJzdFJlbmRlcmluZygpICYmICFtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihudWxsIGFzIGFueSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hdHRhY2hFdmVudE9uY2UoXCJtb2RlbENvbnRleHRDaGFuZ2VcIiwgZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uKTtcblxuXHRcdC8vIGlmIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE9iamVjdFBhZ2VMYXlvdXQgaXMgY2hhbmdlZCB0aGVuIHNjcm9sbCB0byBwcmVzZW50IFNlY3Rpb25cblx0XHQvLyBGSVhNRSBJcyB0aGlzIHJlYWxseSB3b3JraW5nIGFzIGludGVuZGVkID8gSW5pdGlhbGx5IHRoaXMgd2FzIG9uQmVmb3JlUmVuZGVyaW5nLCBidXQgbmV2ZXIgdHJpZ2dlcmVkIG9uQmVmb3JlUmVuZGVyaW5nIGJlY2F1c2UgaXQgd2FzIHJlZ2lzdGVyZWQgYWZ0ZXIgaXRcblx0XHRjb25zdCBvRGVsZWdhdGVPbkJlZm9yZSA9IHtcblx0XHRcdG9uQWZ0ZXJSZW5kZXJpbmc6IGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvblxuXHRcdH07XG5cdFx0b09iamVjdFBhZ2UuYWRkRXZlbnREZWxlZ2F0ZShvRGVsZWdhdGVPbkJlZm9yZSwgdGhpcyk7XG5cdFx0dGhpcy5wYWdlUmVhZHkuYXR0YWNoRXZlbnRPbmNlKFwicGFnZVJlYWR5XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdG9PYmplY3RQYWdlLnJlbW92ZUV2ZW50RGVsZWdhdGUob0RlbGVnYXRlT25CZWZvcmUpO1xuXHRcdH0pO1xuXG5cdFx0Ly9TZXQgdGhlIEJpbmRpbmcgZm9yIFBhZ2luYXRvcnMgdXNpbmcgTGlzdEJpbmRpbmcgSURcblx0XHRpZiAoaVZpZXdMZXZlbCA+IDEpIHtcblx0XHRcdGxldCBvQmluZGluZyA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmxpc3RCaW5kaW5nO1xuXHRcdFx0Y29uc3Qgb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIik7XG5cdFx0XHRpZiAob1BhZ2luYXRvckN1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nVG9Vc2UgPSBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nVG9Vc2UsIG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZykge1xuXHRcdFx0XHRpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9pZiB0aGUgYmluZGluZyB0eXBlIGlzIG5vdCBPRGF0YUxpc3RCaW5kaW5nIGJlY2F1c2Ugb2YgYSBkZWVwbGluayBuYXZpZ2F0aW9uIG9yIGEgcmVmcmVzaCBvZiB0aGUgcGFnZVxuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY3JlYXRlIGl0XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpLnJlcGxhY2UoL1xcKFteXFwpXSpcXCkqJC8sIFwiXCIpOyAvL3JlbW92aW5nIHRoZSBsYXN0IHR1cGxlXG5cdFx0XHRcdFx0b0JpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KShvQmluZGluZy5vTW9kZWwsIFwiXCIsIG9CaW5kaW5nLm9Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQ29udGV4dFBhdGgpKTtcblx0XHRcdFx0XHRjb25zdCBfc2V0TGlzdEJpbmRpbmdBc3luYyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0cygpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShvQmluZGluZywgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5kZXRhY2hFdmVudChcImNoYW5nZVwiLCBfc2V0TGlzdEJpbmRpbmdBc3luYyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRvQmluZGluZy5nZXRDb250ZXh0cygwKTtcblx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudChcImNoYW5nZVwiLCBfc2V0TGlzdEJpbmRpbmdBc3luYyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCEodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnVzZU5ld0xhenlMb2FkaW5nICYmIG9PYmplY3RQYWdlLmdldEVuYWJsZUxhenlMb2FkaW5nKCkpIHtcblx0XHRcdGNvbnN0IGFTZWN0aW9ucyA9IG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCk7XG5cdFx0XHRjb25zdCBiVXNlSWNvblRhYkJhciA9IG9PYmplY3RQYWdlLmdldFVzZUljb25UYWJCYXIoKTtcblx0XHRcdGxldCBpU2tpcCA9IDI7XG5cdFx0XHRjb25zdCBiSXNJbkVkaXRNb2RlID0gb09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXHRcdFx0Y29uc3QgYkVkaXRhYmxlSGVhZGVyID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lZGl0YWJsZUhlYWRlckNvbnRlbnQ7XG5cdFx0XHRmb3IgKGxldCBpU2VjdGlvbiA9IDA7IGlTZWN0aW9uIDwgYVNlY3Rpb25zLmxlbmd0aDsgaVNlY3Rpb24rKykge1xuXHRcdFx0XHRjb25zdCBvU2VjdGlvbiA9IGFTZWN0aW9uc1tpU2VjdGlvbl07XG5cdFx0XHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCk7XG5cdFx0XHRcdGZvciAobGV0IGlTdWJTZWN0aW9uID0gMDsgaVN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBpU3ViU2VjdGlvbisrLCBpU2tpcC0tKSB7XG5cdFx0XHRcdFx0Ly8gSW4gSWNvblRhYkJhciBtb2RlIGtlZXAgdGhlIHNlY29uZCBzZWN0aW9uIGJvdW5kIGlmIHRoZXJlIGlzIGFuIGVkaXRhYmxlIGhlYWRlciBhbmQgd2UgYXJlIHN3aXRjaGluZyB0byBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHRpZiAoaVNraXAgPCAxIHx8IChiVXNlSWNvblRhYkJhciAmJiAoaVNlY3Rpb24gPiAxIHx8IChpU2VjdGlvbiA9PT0gMSAmJiAhYkVkaXRhYmxlSGVhZGVyICYmICFiSXNJbkVkaXRNb2RlKSkpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IGFTdWJTZWN0aW9uc1tpU3ViU2VjdGlvbl07XG5cdFx0XHRcdFx0XHRpZiAob1N1YlNlY3Rpb24uZGF0YSgpLmlzVmlzaWJpbGl0eUR5bmFtaWMgIT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdFx0XHRcdG9TdWJTZWN0aW9uLnNldEJpbmRpbmdDb250ZXh0KG51bGwgYXMgYW55KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5wbGFjZWhvbGRlci5pc1BsYWNlaG9sZGVyRW5hYmxlZCgpICYmIG1QYXJhbWV0ZXJzLnNob3dQbGFjZWhvbGRlcikge1xuXHRcdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG9OYXZDb250YWluZXIgPSAob1ZpZXcuZ2V0UGFyZW50KCkgYXMgYW55KS5vQ29udGFpbmVyLmdldFBhcmVudCgpO1xuXHRcdFx0aWYgKG9OYXZDb250YWluZXIpIHtcblx0XHRcdFx0b05hdkNvbnRhaW5lci5zaG93UGxhY2Vob2xkZXIoe30pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2U6IGFueSkge1xuXHRcdGxldCBvRmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHRcdGNvbnN0IGFBY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSAmJiBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpLmdldEFjdGlvbnMoKTtcblx0XHRpZiAoYUFjdGlvbnMgJiYgYUFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRvRmlyc3RDbGlja2FibGVFbGVtZW50ID0gYUFjdGlvbnMuZmluZChmdW5jdGlvbiAob0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdC8vIER1ZSB0byB0aGUgbGVmdCBhbGlnbm1lbnQgb2YgdGhlIERyYWZ0IHN3aXRjaCBhbmQgdGhlIGNvbGxhYm9yYXRpdmUgZHJhZnQgYXZhdGFyIGNvbnRyb2xzXG5cdFx0XHRcdC8vIHRoZXJlIGlzIGEgVG9vbGJhclNwYWNlciBpbiB0aGUgYWN0aW9ucyBhZ2dyZWdhdGlvbiB3aGljaCB3ZSBuZWVkIHRvIGV4Y2x1ZGUgaGVyZSFcblx0XHRcdFx0cmV0dXJuICFvQWN0aW9uLmlzQShcInNhcC5tLlRvb2xiYXJTcGFjZXJcIikgJiYgb0FjdGlvbi5nZXRWaXNpYmxlKCkgJiYgb0FjdGlvbi5nZXRFbmFibGVkKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdH1cblxuXHRfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRpZiAoYVN1YlNlY3Rpb25zKSB7XG5cdFx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0XHRjb25zdCBhQmxvY2tzID0gYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpO1xuXG5cdFx0XHRcdGlmIChhQmxvY2tzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgYmxvY2sgPSAwOyBibG9jayA8IGFCbG9ja3MubGVuZ3RoOyBibG9jaysrKSB7XG5cdFx0XHRcdFx0XHRsZXQgYUZvcm1Db250YWluZXJzO1xuXG5cdFx0XHRcdFx0XHRpZiAoYUJsb2Nrc1tibG9ja10uaXNBKFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIikpIHtcblx0XHRcdFx0XHRcdFx0YUZvcm1Db250YWluZXJzID0gYUJsb2Nrc1tibG9ja10uZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQgJiZcblx0XHRcdFx0XHRcdFx0YUJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCgpICYmXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKS5pc0EoXCJzYXAudWkubGF5b3V0LmZvcm0uRm9ybVwiKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKS5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYUZvcm1Db250YWluZXJzKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db250YWluZXIgPSAwOyBmb3JtQ29udGFpbmVyIDwgYUZvcm1Db250YWluZXJzLmxlbmd0aDsgZm9ybUNvbnRhaW5lcisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZvcm1FbGVtZW50cyA9IGFGb3JtQ29udGFpbmVyc1tmb3JtQ29udGFpbmVyXS5nZXRGb3JtRWxlbWVudHMoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYUZvcm1FbGVtZW50cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUVsZW1lbnQgPSAwOyBmb3JtRWxlbWVudCA8IGFGb3JtRWxlbWVudHMubGVuZ3RoOyBmb3JtRWxlbWVudCsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGaWVsZHMgPSBhRm9ybUVsZW1lbnRzW2Zvcm1FbGVtZW50XS5nZXRGaWVsZHMoKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZmlyc3QgZmllbGQgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIElucHV0QmFzZSAoZS5nLiBjb3VsZCBiZSBhIFRleHQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNvIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBoYXMgYSBnZXRSZXF1aXJlZCBtZXRob2Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZpZWxkc1swXS5nZXRSZXF1aXJlZCAmJiBhRmllbGRzWzBdLmdldFJlcXVpcmVkKCkgJiYgIWFGaWVsZHNbMF0uZ2V0VmFsdWUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFGaWVsZHNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhcIkVycm9yIHdoZW4gc2VhcmNoaW5nIGZvciBtYW5kYW90cnkgZW1wdHkgZmllbGQ6IFwiICsgZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfdXBkYXRlRm9jdXNJbkVkaXRNb2RlKGFTdWJTZWN0aW9uczogYW55KSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cblx0XHRjb25zdCBvTWFuZGF0b3J5RmllbGQgPSB0aGlzLl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnMpO1xuXHRcdGxldCBvRmllbGRUb0ZvY3VzOiBhbnk7XG5cdFx0aWYgKG9NYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9NYW5kYXRvcnlGaWVsZC5jb250ZW50LmdldENvbnRlbnRFZGl0KClbMF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZFRvRm9jdXMgPSAob09iamVjdFBhZ2UgYXMgYW55KS5fZ2V0Rmlyc3RFZGl0YWJsZUlucHV0KCkgfHwgdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHR9XG5cblx0XHRpZiAob0ZpZWxkVG9Gb2N1cykge1xuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdG9GaWVsZFRvRm9jdXMuZm9jdXMoKTtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0KG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9Db250ZXh0OiBhbnkpIHtcblx0XHRpZiAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQoKSkge1xuXHRcdFx0Ly8gQmFjayBuYXYgd2lsbCBrZWVwIHRoZSBzYW1lIGNvbnRleHQgLS0+IG5vIG5lZWQgdG8gZGlzcGxheSB0aGUgZGlhbG9nXG5cdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29tbW9uVXRpbHMuZm5Qcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdF9vbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCk7XG5cblx0XHR0aGlzLl9zaWRlRWZmZWN0cy5jbGVhclByb3BlcnRpZXNTdGF0dXMoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gYXMgbG9uZyBhcyB0aGUgbW9kZWwgZml4IHRoZSBjYWNoZSBpc3N1ZSBhbmQgd2UgdXNlIHRoaXMgYWRkaXRpb25hbFxuXHRcdC8vIGJpbmRpbmcgd2l0aCBvd25SZXF1ZXN0XG5cdFx0b0JpbmRpbmdDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdGxldCBhSUJOQWN0aW9uczogYW55W10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBhbnkpIHtcblx0XHRcdG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1N1YlNlY3Rpb24sIGFJQk5BY3Rpb25zKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0Ly8gQXNzaWduIGludGVybmFsIGJpbmRpbmcgY29udGV4dHMgdG8gb0Zvcm1Db250YWluZXI6XG5cdFx0Ly8gMS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGFzc2lnbiB0aGUgaW50ZXJuYWwgYmluZGluZyBjb250ZXh0IHRvIHRoZSBYTUwgZnJhZ21lbnRcblx0XHQvLyAoRm9ybUNvbnRhaW5lci5mcmFnbWVudC54bWwpIHlldCAtIGl0IGlzIHVzZWQgYWxyZWFkeSBmb3IgdGhlIGRhdGEtc3RydWN0dXJlLlxuXHRcdC8vIDIuIEFub3RoZXIgcHJvYmxlbSBpcywgdGhhdCBGb3JtQ29udGFpbmVycyBhc3NpZ25lZCB0byBhICdNb3JlQmxvY2snIGRvZXMgbm90IGhhdmUgYW5cblx0XHQvLyBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IGF0IGFsbC5cblxuXHRcdGFUYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIiwge30pO1xuXG5cdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1RhYmxlLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHQvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgQkNQOiAyMDgwMjE4MDA0XG5cdFx0XHQvLyBOZWVkIHRvIGZpeCB3aXRoIEJMSTogRklPUklURUNIUDEtMTUyNzRcblx0XHRcdC8vIG9ubHkgZm9yIGVkaXQgbW9kZSwgd2UgY2xlYXIgdGhlIHRhYmxlIGNhY2hlXG5cdFx0XHQvLyBXb3JrYXJvdW5kIHN0YXJ0cyBoZXJlISFcblx0XHRcdGNvbnN0IG9UYWJsZVJvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0aWYgKG9UYWJsZVJvd0JpbmRpbmcpIHtcblx0XHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvVGFibGVSb3dCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdFx0Ly8gYXBwbHkgZm9yIGJvdGggZWRpdCBhbmQgZGlzcGxheSBtb2RlIGluIHN0aWNreVxuXHRcdFx0XHRcdG9UYWJsZVJvd0JpbmRpbmcucmVtb3ZlQ2FjaGVzQW5kTWVzc2FnZXMoXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFdvcmthcm91bmQgZW5kcyBoZXJlISFcblxuXHRcdFx0Ly8gVXBkYXRlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiBEYXRhRmllbGRGb3JBY3Rpb24gYnV0dG9ucyBvbiB0YWJsZSB0b29sYmFyXG5cdFx0XHQvLyBUaGUgc2FtZSBpcyBhbHNvIHBlcmZvcm1lZCBvbiBUYWJsZSBzZWxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSBKU09OLnBhcnNlKFxuXHRcdFx0XHRcdENvbW1vbkhlbHBlci5wYXJzZUN1c3RvbURhdGEoRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGEob1RhYmxlLCBcIm9wZXJhdGlvbkF2YWlsYWJsZU1hcFwiKSkgYXMgYW55XG5cdFx0XHRcdCksXG5cdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzID0gb1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKTtcblxuXHRcdFx0Q29tbW9uVXRpbHMuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzKTtcblx0XHR9KTtcblx0XHRDb21tb25VdGlscy5nZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsKHRoaXMsIFwiX3BhZ2VNb2RlbFwiKTtcblx0XHQvL1JldHJpZXZlIE9iamVjdCBQYWdlIGhlYWRlciBhY3Rpb25zIGZyb20gT2JqZWN0IFBhZ2UgdGl0bGUgY29udHJvbFxuXHRcdGNvbnN0IG9PYmplY3RQYWdlVGl0bGUgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpO1xuXHRcdGxldCBhSUJOSGVhZGVyQWN0aW9uczogYW55W10gPSBbXTtcblx0XHRhSUJOSGVhZGVyQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob09iamVjdFBhZ2VUaXRsZSwgYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdGFJQk5BY3Rpb25zID0gYUlCTkFjdGlvbnMuY29uY2F0KGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRDb21tb25VdGlscy51cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9ucywgdGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0bGV0IG9Nb2RlbDogYW55LCBvRmluYWxVSVN0YXRlOiBhbnk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGFuIGluaXQgZXZlbnQgb2YgdGhlIE1EQyB0YWJsZXMgKG5vdCB5ZXQgZXhpc3RpbmcpIGFuZCBzaG91bGQgYmUgcGFydFxuXHRcdC8vIG9mIGFueSBjb250cm9sbGVyIGV4dGVuc2lvblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKiBAcGFyYW0gb0xpc3RCaW5kaW5nXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZW5hYmxlRmFzdENyZWF0aW9uUm93KG9UYWJsZTogYW55LCBvTGlzdEJpbmRpbmc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0Zhc3RDcmVhdGlvblJvdyA9IG9UYWJsZS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0bGV0IG9GYXN0Q3JlYXRpb25MaXN0QmluZGluZywgb0Zhc3RDcmVhdGlvbkNvbnRleHQ7XG5cblx0XHRcdGlmIChvRmFzdENyZWF0aW9uUm93KSB7XG5cdFx0XHRcdG9GaW5hbFVJU3RhdGVcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdy5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikpIHtcblx0XHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9MaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0XHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJkb05vdFN1Ym1pdFwiLFxuXHRcdFx0XHRcdFx0XHRcdCQkZ3JvdXBJZDogXCJkb05vdFN1Ym1pdFwiXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBPRGF0YSBtb2RlbCB2NCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRcdG9GYXN0Q3JlYXRpb25MaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0LyogZG8gbm90aGluZyAqL1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHQvKlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9GYXN0Q3JlYXRpb25MaXN0QmluZGluZy5oYXNQZW5kaW5nQ2hhbmdlcyA9IGZ1bmN0aW9uKCkge1xuICAgIFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgXHRcdFx0XHRcdFx0XHR9O1xuICAgIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCovXG5cblx0XHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkNvbnRleHQgPSBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRcdFx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQob0Zhc3RDcmVhdGlvbkNvbnRleHQpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3Jcblx0XHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkNvbnRleHQuY3JlYXRlZCgpLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY29tcHV0aW5nIHRoZSBmaW5hbCBVSSBzdGF0ZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSksXG5cdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRlbmFibGVGYXN0Q3JlYXRpb25Sb3cob1RhYmxlLCBvQmluZGluZyk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXhwZWN0ZWQgYmluZGluZyBtaXNzaW5nIGZvciB0YWJsZTogXCIgKyBvVGFibGUuZ2V0SWQoKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9CaW5kaW5nLm9Db250ZXh0KSB7XG5cdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZm5IYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKG9CaW5kaW5nLm9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKTtcblxuXHRcdFx0Ly8gQ29tcHV0ZSBFZGl0IE1vZGVcblx0XHRcdG9GaW5hbFVJU3RhdGUgPSB0aGlzLl9lZGl0Rmxvdy5jb21wdXRlRWRpdE1vZGUob0JpbmRpbmdDb250ZXh0KTtcblxuXHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0b0ZpbmFsVUlTdGF0ZVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikpIHtcblx0XHRcdFx0XHRcdFx0Y29ubmVjdCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZmluYWwgVUkgU3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdXBkYXRlIHJlbGF0ZWQgYXBwcyBvbmNlIERhdGEgaXMgcmVjZWl2ZWQgaW4gY2FzZSBvZiBiaW5kaW5nIGNhY2hlIGlzIG5vdCBhdmFpbGFibGVcblx0XHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gc2luY2Ugd2UgbmVlZCB0byBjYWxsIF91cGRhdGVSZWxhdGVkQXBwcyBtZXRob2Qgb25seSBhZnRlciBkYXRhIGZvciBPYmplY3QgUGFnZSBpcyByZWNlaXZlZCAoaWYgdGhlcmUgaXMgbm8gYmluZGluZylcblx0XHRcdGlmIChvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLm9DYWNoZSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVSZWxhdGVkQXBwcygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZm5VcGRhdGVSZWxhdGVkQXBwcyA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVSZWxhdGVkQXBwcygpO1xuXHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlUmVsYXRlZEFwcHMpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmF0dGFjaERhdGFSZWNlaXZlZChmblVwZGF0ZVJlbGF0ZWRBcHBzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9BdHRhY2ggdGhlIHBhdGNoIHNlbnQgYW5kIHBhdGNoIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSAob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSkgfHwgb0JpbmRpbmdDb250ZXh0O1xuXHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwgdGhpcy5lZGl0Rmxvdy5oYW5kbGVQYXRjaFNlbnQsIHRoaXMpO1xuXG5cdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRcdC8vIGFjY2VzcyBiaW5kaW5nIG9ubHkgYWZ0ZXIgdGFibGUgaXMgYm91bmRcblx0XHRcdFx0VGFibGVVdGlscy53aGVuQm91bmQob1RhYmxlKVxuXHRcdFx0XHRcdC50aGVuKGhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFibGUgdG8gYmUgYm91bmRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoISh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudXNlTmV3TGF6eUxvYWRpbmcpIHtcblx0XHRcdFx0Ly8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGJpbmRpbmcgaXMgcmVhZHkgaGVuY2UgY2FsbGluZyBpdCBpbiBvbkFmdGVyQmluZGluZ1xuXHRcdFx0XHQob09iamVjdFBhZ2UgYXMgYW55KS5fdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50cygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdC8vIEFwcGx5IGFwcCBzdGF0ZSBvbmx5IGFmdGVyIHRoZSBwYWdlIGlzIHJlYWR5IHdpdGggdGhlIGZpcnN0IHNlY3Rpb24gc2VsZWN0ZWRcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvL1Nob3cgcG9wdXAgd2hpbGUgbmF2aWdhdGluZyBiYWNrIGZyb20gb2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBkcmFmdFxuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQoKG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0XHRcdGlmICghYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKCkgPT4gdGhpcy5fb25CYWNrTmF2aWdhdGlvbkluRHJhZnQob0JpbmRpbmdDb250ZXh0KSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0QXBwU3RhdGVIYW5kbGVyKCkuYXBwbHlBcHBTdGF0ZSgpO1xuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmZvcmNlRm9jdXMpIHtcblx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHRcdFx0Ly8gc2V0IHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgYWN0aW9uIGJ1dHRvbiwgb3IgdG8gdGhlIGZpcnN0IGVkaXRhYmxlIGlucHV0IGlmIGluIGVkaXRhYmxlIG1vZGVcblx0XHRcdGNvbnN0IGlzSW5EaXNwbGF5TW9kZSA9ICFvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHRjb25zdCBhVmlzaWJsZVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5maWx0ZXIoZnVuY3Rpb24gKG9TZWN0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBvU2VjdGlvbi5nZXRWaXNpYmxlKCkgPT09IHRydWU7XG5cdFx0XHR9KTtcblx0XHRcdC8vIFNlbGVjdCB0aGUgZmlyc3QgdmlzaWJsZSBzZWN0aW9uXG5cdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24oYVZpc2libGVTZWN0aW9uc1swXS5nZXRJZCgpKTtcblxuXHRcdFx0aWYgKGlzSW5EaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRjb25zdCBvRmlyc3RDbGlja2FibGVFbGVtZW50ID0gdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHRcdFx0aWYgKG9GaXJzdENsaWNrYWJsZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRvRmlyc3RDbGlja2FibGVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxldCBhVmlzaWJsZVN1YlNlY3Rpb25zO1xuXHRcdFx0XHRpZiAoKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5zZWN0aW9uTGF5b3V0ID09PSBcIlRhYnNcIikge1xuXHRcdFx0XHRcdC8vIEluIGEgdGFiYmVkIGxheW91dCwgb25seSB0aGUgc3Vic2VjdGlvbnMgb2YgdGhlIHNlbGVjdGVkIHNlY3Rpb24gYXJlIHZpc2libGUgb24gdGhlIHNjcmVlblxuXHRcdFx0XHRcdGFWaXNpYmxlU3ViU2VjdGlvbnMgPSBhVmlzaWJsZVNlY3Rpb25zWzBdLmdldFN1YlNlY3Rpb25zKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW4gYSBwYWdlZCBsYXlvdXQsIGFsbCBzdWJzZWN0aW9ucyBvZiB0aGUgdmlzaWJsZSBzZWN0aW9ucyBhcmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuXG5cdFx0XHRcdFx0YVZpc2libGVTdWJTZWN0aW9ucyA9IChcblx0XHRcdFx0XHRcdGFWaXNpYmxlU2VjdGlvbnMubWFwKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0XHRcdFx0fSkgYXMgYW55XG5cdFx0XHRcdFx0KS5mbGF0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKGFWaXNpYmxlU3ViU2VjdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIsIGZhbHNlKTtcblx0XHR0aGlzLl9jaGVja0RhdGFQb2ludFRpdGxlRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzdGF0dXMgb2YgZWRpdCBtb2RlIGZvciBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBzdGF0dXMgb2YgZWRpdCBtb2RlIGZvciBzdGlja3kgc2Vzc2lvblxuXHQgKlxuXHQgKlxuXHQgKi9cblx0Z2V0U3RpY2t5RWRpdE1vZGUoKSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQgJiYgKHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlO1xuXHR9XG5cblx0X2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHR9XG5cblx0X2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhOiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ3VzdG9tRGF0YS5nZXRLZXkoKSA9PT0gXCJPYmplY3RQYWdlU3VidGl0bGVcIjtcblx0XHR9KTtcblx0XHRjb25zdCBvVGl0bGVJbmZvID0ge1xuXHRcdFx0dGl0bGU6IG9PYmplY3RQYWdlLmRhdGEoXCJPYmplY3RQYWdlVGl0bGVcIikgfHwgXCJcIixcblx0XHRcdHN1YnRpdGxlOiBvT2JqZWN0UGFnZVN1YnRpdGxlICYmIG9PYmplY3RQYWdlU3VidGl0bGUuZ2V0VmFsdWUoKSxcblx0XHRcdGludGVudDogXCJcIixcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXG5cdFx0cmV0dXJuIG9UaXRsZUluZm87XG5cdH1cblxuXHRfZXhlY3V0ZUhlYWRlclNob3J0Y3V0KHNJZDogYW55KSB7XG5cdFx0Y29uc3Qgc0J1dHRvbklkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKSArIFwiLS1cIiArIHNJZCxcblx0XHRcdG9CdXR0b24gPSAodGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUpXG5cdFx0XHRcdC5nZXRBY3Rpb25zKClcblx0XHRcdFx0LmZpbmQoZnVuY3Rpb24gKG9FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0VsZW1lbnQuZ2V0SWQoKSA9PT0gc0J1dHRvbklkO1xuXHRcdFx0XHR9KTtcblx0XHRDb21tb25VdGlscy5maXJlQnV0dG9uUHJlc3Mob0J1dHRvbik7XG5cdH1cblxuXHRfZXhlY3V0ZUZvb3RlclNob3J0Y3V0KHNJZDogYW55KSB7XG5cdFx0Y29uc3Qgc0J1dHRvbklkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKSArIFwiLS1cIiArIHNJZCxcblx0XHRcdG9CdXR0b24gPSAodGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRGb290ZXIoKSBhcyBhbnkpLmdldENvbnRlbnQoKS5maW5kKGZ1bmN0aW9uIChvRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRWxlbWVudC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAubS5CdXR0b25cIiAmJiBvRWxlbWVudC5nZXRJZCgpID09PSBzQnV0dG9uSWQ7XG5cdFx0XHR9KTtcblx0XHRDb21tb25VdGlscy5maXJlQnV0dG9uUHJlc3Mob0J1dHRvbik7XG5cdH1cblxuXHRfZXhlY3V0ZVRhYlNob3J0Q3V0KG9FeGVjdXRpb246IGFueSkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSxcblx0XHRcdGFTZWN0aW9ucyA9IG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCksXG5cdFx0XHRpU2VjdGlvbkluZGV4TWF4ID0gYVNlY3Rpb25zLmxlbmd0aCAtIDEsXG5cdFx0XHRzQ29tbWFuZCA9IG9FeGVjdXRpb24ub1NvdXJjZS5nZXRDb21tYW5kKCk7XG5cdFx0bGV0IG5ld1NlY3Rpb24sXG5cdFx0XHRpU2VsZWN0ZWRTZWN0aW9uSW5kZXggPSBvT2JqZWN0UGFnZS5pbmRleE9mU2VjdGlvbih0aGlzLmJ5SWQob09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCkpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAtMSAmJiBpU2VjdGlvbkluZGV4TWF4ID4gMCkge1xuXHRcdFx0aWYgKHNDb21tYW5kID09PSBcIk5leHRUYWJcIikge1xuXHRcdFx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4IDw9IGlTZWN0aW9uSW5kZXhNYXggLSAxKSB7XG5cdFx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1srK2lTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFByZXZpb3VzVGFiXG5cdFx0XHRcdGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggIT09IDApIHtcblx0XHRcdFx0XHRuZXdTZWN0aW9uID0gYVNlY3Rpb25zWy0taVNlbGVjdGVkU2VjdGlvbkluZGV4XTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG5ld1NlY3Rpb24pIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG5ld1NlY3Rpb24pO1xuXHRcdFx0XHRuZXdTZWN0aW9uLmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZvb3RlclZpc2liaWxpdHkoKSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIiwgZmFsc2UpO1xuXHRcdHNhcC51aVxuXHRcdFx0LmdldENvcmUoKVxuXHRcdFx0LmdldE1lc3NhZ2VNYW5hZ2VyKClcblx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24gJiYgb01lc3NhZ2UudHlwZSA9PT0gXCJFcnJvclwiICYmIG9NZXNzYWdlLnRhcmdldC5pbmRleE9mKHNWaWV3SWQpID4gLTEpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X3Nob3dNZXNzYWdlUG9wb3ZlcihlcnI/OiBhbnksIG9SZXQ/OiBhbnkpIHtcblx0XHRpZiAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHR9XG5cdFx0aWYgKCEodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Q29udGFpbmVyKCkgYXMgYW55KS5nZXRDdXJyZW50UGFnZSgpLmlzQShcInNhcC5tLk1lc3NhZ2VQYWdlXCIpKSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZUJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpNZXNzYWdlQnV0dG9uXCIpIGFzIGFueSxcblx0XHRcdFx0b01lc3NhZ2VQb3BvdmVyID0gb01lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyLFxuXHRcdFx0XHRvSXRlbUJpbmRpbmcgPSBvTWVzc2FnZVBvcG92ZXIuZ2V0QmluZGluZyhcIml0ZW1zXCIpO1xuXG5cdFx0XHRpZiAob0l0ZW1CaW5kaW5nLmdldExlbmd0aCgpID4gMCAmJiAhb01lc3NhZ2VQb3BvdmVyLmlzT3BlbigpKSB7XG5cdFx0XHRcdG9NZXNzYWdlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRcdC8vIHdvcmthcm91bmQgdG8gZW5zdXJlIHRoYXQgb01lc3NhZ2VCdXR0b24gaXMgcmVuZGVyZWQgd2hlbiBvcGVuQnkgaXMgY2FsbGVkXG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG9NZXNzYWdlUG9wb3Zlci5vcGVuQnkob01lc3NhZ2VCdXR0b24pO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9SZXQ7XG5cdH1cblxuXHRfZWRpdERvY3VtZW50KG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTW9kZWwpO1xuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmVkaXREb2N1bWVudC5hcHBseSh0aGlzLmVkaXRGbG93LCBbb0NvbnRleHRdKS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Nb2RlbCk7XG5cdFx0fSk7XG5cdH1cblxuXHRfc2F2ZURvY3VtZW50KG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLFxuXHRcdFx0YVdhaXRDcmVhdGVEb2N1bWVudHM6IGFueVtdID0gW107XG5cdFx0Ly8gaW5kaWNhdGVzIGlmIHdlIGFyZSBjcmVhdGluZyBhIG5ldyByb3cgaW4gdGhlIE9QXG5cdFx0bGV0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gZmFsc2U7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0dGhpcy5fZmluZFRhYmxlcygpLmZvckVhY2goKG9UYWJsZTogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IHRoaXMuX2dldFRhYmxlQmluZGluZyhvVGFibGUpO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlcnM6IGFueSA9IHtcblx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBvVGFibGUuZGF0YShcImNyZWF0aW9uTW9kZVwiKSxcblx0XHRcdFx0Y3JlYXRpb25Sb3c6IG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLFxuXHRcdFx0XHRjcmVhdGVBdEVuZDogb1RhYmxlLmRhdGEoXCJjcmVhdGVBdEVuZFwiKSA9PT0gXCJ0cnVlXCJcblx0XHRcdH07XG5cdFx0XHRjb25zdCBiQ3JlYXRlRG9jdW1lbnQgPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvblJvdyAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpICYmXG5cdFx0XHRcdE9iamVjdC5rZXlzKG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0T2JqZWN0KCkpLmxlbmd0aCA+IDE7XG5cdFx0XHRpZiAoYkNyZWF0ZURvY3VtZW50KSB7XG5cdFx0XHRcdC8vIHRoZSBiU2tpcFNpZGVFZmZlY3RzIGlzIGEgcGFyYW1ldGVyIGNyZWF0ZWQgd2hlbiB3ZSBjbGljayB0aGUgc2F2ZSBrZXkuIElmIHdlIHByZXNzIHRoaXMga2V5XG5cdFx0XHRcdC8vIHdlIGRvbid0IGV4ZWN1dGUgdGhlIGhhbmRsZVNpZGVFZmZlY3RzIGZ1bmNpdG9uIHRvIGF2b2lkIGJhdGNoIHJlZHVuZGFuY3lcblx0XHRcdFx0bVBhcmFtZXRlcnMuYlNraXBTaWRlRWZmZWN0cyA9IHRydWU7XG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gdHJ1ZTtcblx0XHRcdFx0YVdhaXRDcmVhdGVEb2N1bWVudHMucHVzaChcblx0XHRcdFx0XHR0aGlzLmVkaXRGbG93LmNyZWF0ZURvY3VtZW50KG9CaW5kaW5nLCBtUGFyYW1ldGVycykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmc7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVdhaXRDcmVhdGVEb2N1bWVudHMpXG5cdFx0XHQudGhlbigoYUJpbmRpbmdzOiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IsXG5cdFx0XHRcdFx0YmluZGluZ3M6IGFCaW5kaW5nc1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5zYXZlRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKS5jYXRjaCgoKSA9PiB0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob01vZGVsKSkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Nb2RlbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X21hbmFnZUNvbGxhYm9yYXRpb24oKSB7XG5cdFx0b3Blbk1hbmFnZURpYWxvZyh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyhldmVudDogYW55KSB7XG5cdFx0c2hvd1VzZXJEZXRhaWxzKGV2ZW50LCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKTsgLy90byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY2FuY2VsIGJ1dHRvbiBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uXG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdF9hcHBseURvY3VtZW50KG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5hcHBseURvY3VtZW50KG9Db250ZXh0KS5jYXRjaCgoKSA9PiB0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoKSk7XG5cdH1cblxuXHRfc2hvd1N3aXRjaERyYWZ0QW5kQWN0aXZlUG9wb3ZlcihldmVudDogRXZlbnQpIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRzb3VyY2UgPSBldmVudC5nZXRTb3VyY2UoKSxcblx0XHRcdGZyYWdtZW50TmFtZSA9IFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLnZpZXcuZnJhZ21lbnRzLlN3aXRjaERyYWZ0QW5kQWN0aXZlT2JqZWN0UG9wT3ZlclwiO1xuXG5cdFx0aWYgKHRoaXMuc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BPdmVyKSB7XG5cdFx0XHR0aGlzLnN3aXRjaERyYWZ0QW5kQWN0aXZlUG9wT3Zlci5vcGVuQnkoc291cmNlLCBmYWxzZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxvY2FsVGhpc01vZGVsID0gbmV3IEpTT05Nb2RlbCh7fSksXG5cdFx0XHRcdHByZXByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XCJ0aGlzXCI6IGxvY2FsVGhpc01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcInRoaXNcIjogbG9jYWxUaGlzTW9kZWxcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRjb25zdCBwb3BvdmVyRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoZnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHBvcG92ZXJGcmFnbWVudCwgeyBuYW1lOiBmcmFnbWVudE5hbWUgfSwgcHJlcHJvY2Vzc29yU2V0dGluZ3MpKVxuXHRcdFx0XHQudGhlbigoZnJhZ21lbnQpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IGZyYWdtZW50LCBjb250cm9sbGVyOiB0aGlzIH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigocG9wb3ZlcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0dmlldy5hZGREZXBlbmRlbnQocG9wb3Zlcik7XG5cdFx0XHRcdFx0cG9wb3Zlci5zZXRNb2RlbCh2aWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIiksIFwiaTE4blwiKTtcblx0XHRcdFx0XHRwb3BvdmVyLnNldFBsYWNlbWVudChcIkJvdHRvbVwiKTsgLy8gVE9ET1xuXHRcdFx0XHRcdHRoaXMuc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BPdmVyID0gcG9wb3Zlcjtcblx0XHRcdFx0XHRwb3BvdmVyLmF0dGFjaEFmdGVyT3BlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBXaGlsZSB0aGUgbGlzdCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGRvY3VtZW50IHZlcnNpb24gaXMgZW1waGFzaXplZCB3aXRoIGEgYmx1ZVxuXHRcdFx0XHRcdFx0Ly8gYmFja2dyb3VuZCwgd2UgbmVlZCB0byBwcmUtZm9jdXMgdGhlIG90aGVyIGVudHJ5XG5cdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0OiBhbnkgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0XHRcdFx0XHRpc0FjdGl2ZUVudGl0eSA9IGNvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cdFx0XHRcdFx0XHRjb25zdCBzd2l0Y2hEcmFmdEFuZEFjdGl2ZU9wdGlvbnNMaXN0OiBTZWxlY3RMaXN0ID0gKHBvcG92ZXIuZ2V0Q29udGVudCgpIGFzIHVua25vd24gYXMgQ29udHJvbFtdKS5maW5kKFxuXHRcdFx0XHRcdFx0XHQoZWxlbWVudCkgPT4gZWxlbWVudC5kYXRhKFwibGlzdElkZW50aWZpZXJcIikgPT09IFwic3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BvdmVyTGlzdFwiXG5cdFx0XHRcdFx0XHQpIGFzIFNlbGVjdExpc3Q7XG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0SXRlbVRvRm9jdXM6IEl0ZW0gPSBpc0FjdGl2ZUVudGl0eVxuXHRcdFx0XHRcdFx0XHQ/IChzd2l0Y2hEcmFmdEFuZEFjdGl2ZU9wdGlvbnNMaXN0LmdldEl0ZW1zKCkuZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRLZXkoKSA9PT0gXCJzd2l0Y2hUb0RyYWZ0XCIpIGFzIEl0ZW0pXG5cdFx0XHRcdFx0XHRcdDogKHN3aXRjaERyYWZ0QW5kQWN0aXZlT3B0aW9uc0xpc3QuZ2V0SXRlbXMoKS5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50LmdldEtleSgpID09PSBcInN3aXRjaFRvQWN0aXZlXCIpIGFzIEl0ZW0pO1xuXHRcdFx0XHRcdFx0bGlzdEl0ZW1Ub0ZvY3VzLmZvY3VzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cG9wb3Zlci5vcGVuQnkoc291cmNlKTtcblx0XHRcdFx0XHQvLyBlbnN1cmUgdG8gcmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGRyYWZ0IHBvcG92ZXIgYXMgaXQgd291bGQgYmUgZGVzdHJveWVkIG9uIGV4aXRcblx0XHRcdFx0XHR2aWV3LmF0dGFjaEV2ZW50T25jZShcImJlZm9yZUV4aXRcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BPdmVyO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKEVycm9yKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgb3BlbmluZyB0aGUgZHJhZnQgc3dpdGNoIHBvcHVwXCIsIEVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X3N3aXRjaERyYWZ0QW5kQWN0aXZlUG9wb3Zlckxpc3RTZWxlY3QoZXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3QgY29udGV4dDogYW55ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNlbGVjdGVkSXRlbUtleSA9IGV2ZW50LmdldFBhcmFtZXRlcihcIml0ZW1cIikuZ2V0UHJvcGVydHkoXCJrZXlcIiksXG5cdFx0XHRpc0FjdGl2ZUVudGl0eSA9IGNvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cdFx0Ly8gSXQgd2FzIGRlY2lkZWQgdGhhdCB3ZSBzaG91bGQgTk9UIHNldCB0aGUgZW50cnkgaW4gdGhlIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBkb2N1bWVudCB2ZXJzaW9uIHRvXG5cdFx0Ly8gZGlzYWJsZWQsIGhlbmNlIHRoZSB1c2VyIGNhbiBjbGljayBlbnRyaWVzIHdoaWNoIHRvIG5vdCBjYXVzZSBhbiBhY3Rpb24gKGNsaWNraW5nIFwiRHJhZnRcIiB3aGVuIHlvdSBhbHJlYWR5IGRpc3BsYXkgdGhlXG5cdFx0Ly8gZHJhZnQgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQpXG5cdFx0Ly8gSGVuY2Ugd2UgY2hlY2sgaGVyZSB3aGljaCBlbnRyeSBpbiB0aGUgbGlzdCB3YXMgY2xpY2tlZCBhbmQgd2hpY2ggZG9jdW1lbnQgdmVyc2lvbiB3ZSBjdXJyZW50bHkgZGlzcGxheSBhbmQgb25seSBkb1xuXHRcdC8vIHRoZSBzd2l0Y2ggYmV0d2VlbiBkcmFmdCAvIGFjdGl2ZSB2ZXJzaW9uIGlmIGl0IG1ha2VzIHNlbnNlLlxuXHRcdGlmICgoaXNBY3RpdmVFbnRpdHkgJiYgc2VsZWN0ZWRJdGVtS2V5ID09PSBcInN3aXRjaFRvRHJhZnRcIikgfHwgKCFpc0FjdGl2ZUVudGl0eSAmJiBzZWxlY3RlZEl0ZW1LZXkgPT09IFwic3dpdGNoVG9BY3RpdmVcIikpIHtcblx0XHRcdHRoaXMuZWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUoY29udGV4dCk7XG5cdFx0fVxuXHRcdCgoZXZlbnQuZ2V0U291cmNlKCkgYXMgQ29udHJvbCkuZ2V0UGFyZW50KCkgYXMgUG9wb3ZlcikuY2xvc2UoKTtcblx0fVxuXG5cdF91cGRhdGVSZWxhdGVkQXBwcygpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0aWYgKENvbW1vblV0aWxzLnJlc29sdmVTdHJpbmd0b0Jvb2xlYW4ob09iamVjdFBhZ2UuZGF0YShcInNob3dSZWxhdGVkQXBwc1wiKSkpIHtcblx0XHRcdENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyhvT2JqZWN0UGFnZSk7XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRUYWJsZUluU3ViU2VjdGlvbihhUGFyZW50RWxlbWVudDogYW55LCBhU3Vic2VjdGlvbjogYW55LCBhVGFibGVzOiBhbnkpIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvblRhYmxlcyA9IFtdO1xuXHRcdGZvciAobGV0IGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgYVBhcmVudEVsZW1lbnQubGVuZ3RoOyBlbGVtZW50KyspIHtcblx0XHRcdGxldCBvRWxlbWVudCA9IGFQYXJlbnRFbGVtZW50W2VsZW1lbnRdLmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBhUGFyZW50RWxlbWVudFtlbGVtZW50XS5nZXRDb250ZW50KCk7XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRNYWluQ29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLmZlLm1hY3Jvcy5UYWJsZUFQSVwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRDb250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGFUYWJsZXMucHVzaChvRWxlbWVudCk7XG5cdFx0XHRcdGFTdWJTZWN0aW9uVGFibGVzLnB1c2goe1xuXHRcdFx0XHRcdFwidGFibGVcIjogb0VsZW1lbnQsXG5cdFx0XHRcdFx0XCJncmlkVGFibGVcIjogb0VsZW1lbnQuZ2V0VHlwZSgpLmlzQShcInNhcC51aS5tZGMudGFibGUuR3JpZFRhYmxlVHlwZVwiKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0YVN1YlNlY3Rpb25UYWJsZXMubGVuZ3RoID09PSAxICYmXG5cdFx0XHRhUGFyZW50RWxlbWVudC5sZW5ndGggPT09IDEgJiZcblx0XHRcdGFTdWJTZWN0aW9uVGFibGVzWzBdLmdyaWRUYWJsZSAmJlxuXHRcdFx0IWFTdWJzZWN0aW9uLmhhc1N0eWxlQ2xhc3MoXCJzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXJcIilcblx0XHQpIHtcblx0XHRcdC8vSW4gY2FzZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRhYmxlIGluIGEgc2VjdGlvbiB3ZSBmaXQgdGhhdCB0byB0aGUgd2hvbGUgcGFnZSBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY29tZXMgb25seSBvbiB0YWJsZSBhbmQgbm90IG9uIHBhZ2Vcblx0XHRcdGFTdWJzZWN0aW9uLmFkZFN0eWxlQ2xhc3MoXCJzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXJcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChhU3ViU2VjdGlvblRhYmxlcyAmJiAhYVN1YnNlY3Rpb24uaGFzU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKSkge1xuXHRcdFx0XHRhU3ViU2VjdGlvblRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IHsgdGFibGU6IGFueTsgZ3JpZFRhYmxlOiBhbnkgfSkge1xuXHRcdFx0XHRcdGlmIChvVGFibGUuZ3JpZFRhYmxlKSB7XG5cdFx0XHRcdFx0XHQvL1Jlc2V0dGluZyB0aGUgcm93IGNvdW50IHRvIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSB3ZSBoYXZlIGEgY29tYmluYXRpb24gb2YgZm9ybXMgYW5kIHRhYmxlcyBvciBtdWx0aXBsZSB0YWJsZXMgaW4gYSBzdWJzZWN0aW9uXG5cdFx0XHRcdFx0XHRvVGFibGUudGFibGUuZ2V0VHlwZSgpLnNldFJvd0NvdW50KG51bGwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEFsbFN1YlNlY3Rpb25zKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRsZXQgYVN1YlNlY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IGFueSkge1xuXHRcdFx0YVN1YlNlY3Rpb25zID0gYVN1YlNlY3Rpb25zLmNvbmNhdChvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYVN1YlNlY3Rpb25zO1xuXHR9XG5cblx0X2dldEFsbEJsb2NrcygpIHtcblx0XHRsZXQgYUJsb2NrczogYW55W10gPSBbXTtcblx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdGFCbG9ja3MgPSBhQmxvY2tzLmNvbmNhdChvU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFCbG9ja3M7XG5cdH1cblxuXHQvL1RPRE86IFRoaXMgaXMgbmVlZGVkIGZvciB0d28gd29ya2Fyb3VuZHMgLSB0byBiZSByZW1vdmVkIGFnYWluXG5cdF9maW5kVGFibGVzKCkge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYVRhYmxlczogYW55W10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZFRhYmxlSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZUluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gYVRhYmxlcztcblx0fVxuXG5cdF9jbG9zZVNpZGVDb250ZW50KCkge1xuXHRcdHRoaXMuX2dldEFsbEJsb2NrcygpLmZvckVhY2goZnVuY3Rpb24gKG9CbG9jazogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGVudCA9IG9CbG9jay5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0Jsb2NrLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChvQ29udGVudCAmJiBvQ29udGVudC5pc0EgJiYgb0NvbnRlbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0aWYgKG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50KGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYXJ0IENvbnRleHQgaXMgcmVzb2x2ZWQgZm9yIDE6biBtaWNyb2NoYXJ0cy5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwuQ29udGV4dH0gb0NoYXJ0Q29udGV4dCBUaGUgQ29udGV4dCBvZiB0aGUgTWljcm9DaGFydFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NoYXJ0UGF0aCBUaGUgY29sbGVjdGlvblBhdGggb2YgdGhlIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIEF0dHJpYnV0ZXMgb2YgdGhlIGNoYXJ0IENvbnRleHRcblx0ICovXG5cdF9nZXRDaGFydENvbnRleHREYXRhKG9DaGFydENvbnRleHQ6IGFueSwgc0NoYXJ0UGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NoYXJ0Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgb0NoYXJ0Q29udGV4dERhdGEgPSBbb0NvbnRleHREYXRhXTtcblx0XHRpZiAob0NoYXJ0Q29udGV4dCAmJiBzQ2hhcnRQYXRoKSB7XG5cdFx0XHRpZiAob0NvbnRleHREYXRhW3NDaGFydFBhdGhdKSB7XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhID0gb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRkZWxldGUgb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YS5wdXNoKG9Db250ZXh0RGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQ2hhcnRDb250ZXh0RGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIHRhYmxlcyB0byB0aGUgcm93IHdpdGggdGhlIHNQYXRoXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlciNfc2Nyb2xsVGFibGVzVG9Sb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNSb3dQYXRoICdzUGF0aCBvZiB0aGUgdGFibGUgcm93J1xuXHQgKlxuXHQgKi9cblxuXHRfc2Nyb2xsVGFibGVzVG9Sb3coc1Jvd1BhdGg6IHN0cmluZykge1xuXHRcdGlmICh0aGlzLl9maW5kVGFibGVzICYmIHRoaXMuX2ZpbmRUYWJsZXMoKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVGFibGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhhVGFibGVzW2ldLCBzUm93UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtZXJnZSBzZWxlY3RlZCBjb250ZXh0cyBhbmQgZmlsdGVycy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9tZXJnZU11bHRpcGxlQ29udGV4dHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9QYWdlQ29udGV4dCBQYWdlIGNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R8QXJyYXl9IGFMaW5lQ29udGV4dCBTZWxlY3RlZCBDb250ZXh0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NoYXJ0UGF0aCBDb2xsZWN0aW9uIG5hbWUgb2YgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNlbGVjdGlvbiBWYXJpYW50IE9iamVjdFxuXHQgKi9cblx0X21lcmdlTXVsdGlwbGVDb250ZXh0cyhvUGFnZUNvbnRleHQ6IENvbnRleHQsIGFMaW5lQ29udGV4dDogYW55W10sIHNDaGFydFBhdGg6IHN0cmluZykge1xuXHRcdGxldCBhQXR0cmlidXRlczogYW55W10gPSBbXSxcblx0XHRcdGFQYWdlQXR0cmlidXRlcyA9IFtdLFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRzTWV0YVBhdGhMaW5lOiBzdHJpbmcsXG5cdFx0XHRzUGF0aExpbmU7XG5cblx0XHRjb25zdCBzUGFnZVBhdGggPSBvUGFnZUNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvUGFnZUNvbnRleHQgJiYgb1BhZ2VDb250ZXh0LmdldE1vZGVsKCkgJiYgKG9QYWdlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRjb25zdCBzTWV0YVBhdGhQYWdlID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYWdlUGF0aCkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdC8vIEdldCBzaW5nbGUgbGluZSBjb250ZXh0IGlmIG5lY2Vzc2FyeVxuXHRcdGlmIChhTGluZUNvbnRleHQgJiYgYUxpbmVDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0b0NvbnRleHQgPSBhTGluZUNvbnRleHRbMF07XG5cdFx0XHRzUGF0aExpbmUgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRzTWV0YVBhdGhMaW5lID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoTGluZSkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdFx0YUxpbmVDb250ZXh0Lm1hcCgob1NpbmdsZUNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoc0NoYXJ0UGF0aCkge1xuXHRcdFx0XHRcdGNvbnN0IG9DaGFydENvbnRleHREYXRhID0gdGhpcy5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvU2luZ2xlQ29udGV4dCwgc0NoYXJ0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9DaGFydENvbnRleHREYXRhKSB7XG5cdFx0XHRcdFx0XHRhQXR0cmlidXRlcyA9IG9DaGFydENvbnRleHREYXRhLm1hcChmdW5jdGlvbiAob0NoYXJ0Q29udGV4dERhdGE6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvQ2hhcnRDb250ZXh0RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aFBhZ2UgKyBcIi9cIiArIHNDaGFydFBhdGhcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvU2luZ2xlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoTGluZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YVBhZ2VBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0Y29udGV4dERhdGE6IG9QYWdlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoUGFnZVxuXHRcdH0pO1xuXHRcdC8vIEFkZGluZyBQYWdlIENvbnRleHQgdG8gc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRhUGFnZUF0dHJpYnV0ZXMgPSBDb21tb25VdGlscy5yZW1vdmVTZW5zaXRpdmVEYXRhKGFQYWdlQXR0cmlidXRlcywgb01ldGFNb2RlbCk7XG5cdFx0Y29uc3Qgb1BhZ2VMZXZlbFNWID0gQ29tbW9uVXRpbHMuYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQoKSwgYVBhZ2VBdHRyaWJ1dGVzLCB0aGlzLmdldFZpZXcoKSk7XG5cdFx0YUF0dHJpYnV0ZXMgPSBDb21tb25VdGlscy5yZW1vdmVTZW5zaXRpdmVEYXRhKGFBdHRyaWJ1dGVzLCBvTWV0YU1vZGVsKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudDogb1BhZ2VMZXZlbFNWLFxuXHRcdFx0YXR0cmlidXRlczogYUF0dHJpYnV0ZXNcblx0XHR9O1xuXHR9XG5cblx0X2dldEJhdGNoR3JvdXBzRm9yVmlldygpIHtcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSxcblx0XHRcdG9Db25maWd1cmF0aW9ucyA9IG9WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbixcblx0XHRcdGFDb25maWd1cmF0aW9ucyA9IG9Db25maWd1cmF0aW9ucyAmJiBPYmplY3Qua2V5cyhvQ29uZmlndXJhdGlvbnMpLFxuXHRcdFx0YUJhdGNoR3JvdXBzID0gW1wiJGF1dG8uSGVyb2VzXCIsIFwiJGF1dG8uRGVjb3JhdGlvblwiLCBcIiRhdXRvLldvcmtlcnNcIl07XG5cblx0XHRpZiAoYUNvbmZpZ3VyYXRpb25zICYmIGFDb25maWd1cmF0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhQ29uZmlndXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9Db25maWd1cmF0aW9uID0gb0NvbmZpZ3VyYXRpb25zW3NLZXldO1xuXHRcdFx0XHRpZiAob0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQgPT09IFwiTG9uZ1J1bm5lcnNcIikge1xuXHRcdFx0XHRcdGFCYXRjaEdyb3Vwcy5wdXNoKFwiJGF1dG8uTG9uZ1J1bm5lcnNcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUJhdGNoR3JvdXBzO1xuXHR9XG5cblx0Lypcblx0ICogUmVzZXQgQnJlYWRjcnVtYiBsaW5rc1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzYXAubS5CcmVhZGNydW1ic30gW29Tb3VyY2VdIHBhcmVudCBjb250cm9sXG5cdCAqIEBkZXNjcmlwdGlvbiBVc2VkIHdoZW4gY29udGV4dCBvZiB0aGUgb2JqZWN0cGFnZSBjaGFuZ2VzLlxuXHQgKiAgICAgICAgICAgICAgVGhpcyBldmVudCBjYWxsYmFjayBpcyBhdHRhY2hlZCB0byBtb2RlbENvbnRleHRDaGFuZ2Vcblx0ICogICAgICAgICAgICAgIGV2ZW50IG9mIHRoZSBCcmVhZGNydW1iIGNvbnRyb2wgdG8gY2F0Y2ggY29udGV4dCBjaGFuZ2UuXG5cdCAqICAgICAgICAgICAgICBUaGVuIGVsZW1lbnQgYmluZGluZyBhbmQgaHJlZnMgYXJlIHVwZGF0ZWQgZm9yIGVhY2ggTGluay5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBleHBlcmltZW50YWxcblx0ICovXG5cdF9zZXRCcmVhZGNydW1iTGlua3Mob1NvdXJjZTogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBzTmV3UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0YVBhdGhQYXJ0cyA9IHNOZXdQYXRoLnNwbGl0KFwiL1wiKSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgc1BhdGggPSBcIlwiLFxuXHRcdFx0XHRpU2tpcFBhcmFtZXRlcml6ZWQgPSAwO1xuXG5cdFx0XHRhUGF0aFBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRhUGF0aFBhcnRzLnNwbGljZSgtMSwgMSk7XG5cdFx0XHRhUGF0aFBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoUGFydDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0c1BhdGggKz0gXCIvXCIgKyBzUGF0aFBhcnQ7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIFJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlcjtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlclBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdFx0Y29uc3QgYlJlc3VsdENvbnRleHQgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzUGFyYW1ldGVyUGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dFwiKTtcblx0XHRcdFx0aWYgKGJSZXN1bHRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgZG9udCBuZWVkIHRvIGNyZWF0ZSBhIGJyZWFkY3J1bWIgZm9yIFBhcmFtZXRlciBwYXRoXG5cdFx0XHRcdFx0aVNraXBQYXJhbWV0ZXJpemVkID0gMTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwV2FpdEZvclRpdGxlSGllYXJjaHlJbmZvID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCk7XG5cblx0XHRcdFx0cFdhaXRGb3JUaXRsZUhpZWFyY2h5SW5mb1xuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvVGl0bGVIaWVhcmNoeUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaWR4ID0gaSAtIGlTa2lwUGFyYW1ldGVyaXplZCxcblx0XHRcdFx0XHRcdFx0b0xpbmsgPSBvU291cmNlLmdldExpbmtzKClbaWR4XSA/IG9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdIDogbmV3IExpbmsoKTtcblx0XHRcdFx0XHRcdC8vIHNDdXJyZW50RW50aXR5IGlzIGEgZmFsbGJhY2sgdmFsdWUgaW4gY2FzZSBvZiBlbXB0eSB0aXRsZVxuXHRcdFx0XHRcdFx0b0xpbmsuc2V0VGV4dChvVGl0bGVIaWVhcmNoeUluZm8uc3VidGl0bGUgfHwgb1RpdGxlSGllYXJjaHlJbmZvLnRpdGxlKTtcblx0XHRcdFx0XHRcdG9MaW5rLnNldEhyZWYob1RpdGxlSGllYXJjaHlJbmZvLmludGVudCk7XG5cdFx0XHRcdFx0XHRpZiAoIW9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdKSB7XG5cdFx0XHRcdFx0XHRcdG9Tb3VyY2UuYWRkTGluayhvTGluayk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjb21wdXRpbmcgdGhlIHRpdGxlIGhpZXJhcmNoeVwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IG9EYXRhUG9pbnRzID0gQ29tbW9uVXRpbHMuZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKFxuXHRcdFx0b1ZpZXcuZ2V0Vmlld0RhdGEoKSxcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRjb25zdCBvUGFnZUNvbnRleHQgPSBvVmlldyAmJiAob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJpc0hlYWRlckRQTGlua1Zpc2libGVcIiwge30pO1xuXHRcdGlmIChvUGFnZUNvbnRleHQpIHtcblx0XHRcdG9QYWdlQ29udGV4dFxuXHRcdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0Zm5HZXRMaW5rcyhvRGF0YVBvaW50cywgb0RhdGEpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvRXJyb3Jcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmbk9uRXJyb3Iob0Vycm9yOiBhbnkpIHtcblx0XHRcdExvZy5lcnJvcihvRXJyb3IpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGZuU2V0TGlua0VuYWJsZW1lbnQoaWQ6IHN0cmluZywgYVN1cHBvcnRlZExpbmtzOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNMaW5rSWQgPSBpZDtcblx0XHRcdC8vIHByb2Nlc3MgdmlhYmxlIGxpbmtzIGZyb20gZ2V0TGlua3MgZm9yIGFsbCBkYXRhcG9pbnRzIGhhdmluZyBvdXRib3VuZFxuXHRcdFx0aWYgKGFTdXBwb3J0ZWRMaW5rcyAmJiBhU3VwcG9ydGVkTGlua3MubGVuZ3RoID09PSAxICYmIGFTdXBwb3J0ZWRMaW5rc1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaXNIZWFkZXJEUExpbmtWaXNpYmxlL1wiICsgc0xpbmtJZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9EYXRhUG9pbnRzXG5cdFx0ICogQHBhcmFtIG9QYWdlRGF0YVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuR2V0TGlua3Mob0RhdGFQb2ludHM6IGFueSwgb1BhZ2VEYXRhOiBhbnkpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIGluIG9EYXRhUG9pbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhUG9pbnQgPSBvRGF0YVBvaW50c1tzSWRdO1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0xpbmsgPSBvVmlldy5ieUlkKHNJZCk7XG5cdFx0XHRcdGlmICghb0xpbmspIHtcblx0XHRcdFx0XHQvLyBmb3IgZGF0YSBwb2ludHMgY29uZmlndXJlZCBpbiBhcHAgZGVzY3JpcHRvciBidXQgbm90IGFubm90YXRlZCBpbiB0aGUgaGVhZGVyXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0xpbmtDb250ZXh0ID0gb0xpbmsuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgb0xpbmtEYXRhOiBhbnkgPSBvTGlua0NvbnRleHQgJiYgb0xpbmtDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgb01peGVkQ29udGV4dDogYW55ID0gbWVyZ2Uoe30sIG9QYWdlRGF0YSwgb0xpbmtEYXRhKTtcblx0XHRcdFx0Ly8gcHJvY2VzcyBzZW1hbnRpYyBvYmplY3QgbWFwcGluZ3Ncblx0XHRcdFx0aWYgKG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBpbiBhU2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IGFTZW1hbnRpY09iamVjdE1hcHBpbmdbaXRlbV07XG5cdFx0XHRcdFx0XHRjb25zdCBzTWFpblByb3BlcnR5ID0gb01hcHBpbmdbXCJMb2NhbFByb3BlcnR5XCJdW1wiJFByb3BlcnR5UGF0aFwiXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYXBwZWRQcm9wZXJ0eSA9IG9NYXBwaW5nW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXTtcblx0XHRcdFx0XHRcdGlmIChzTWFpblByb3BlcnR5ICE9PSBzTWFwcGVkUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9NaXhlZENvbnRleHQuaGFzT3duUHJvcGVydHkoc01haW5Qcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3TWFwcGluZzogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0b05ld01hcHBpbmdbc01hcHBlZFByb3BlcnR5XSA9IG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdFx0b01peGVkQ29udGV4dCA9IG1lcmdlKHt9LCBvTWl4ZWRDb250ZXh0LCBvTmV3TWFwcGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob01peGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRpZiAoc0tleS5pbmRleE9mKFwiX1wiKSAhPT0gMCAmJiBzS2V5LmluZGV4T2YoXCJvZGF0YS5jb250ZXh0XCIpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRvUGFyYW1zW3NLZXldID0gb01peGVkQ29udGV4dFtzS2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gdmFsaWRhdGUgaWYgYSBsaW5rIG11c3QgYmUgcmVuZGVyZWRcblx0XHRcdFx0b1NoZWxsU2VydmljZXNcblx0XHRcdFx0XHQuaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiB7XG5cdFx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uOiBvRGF0YVBvaW50LmFjdGlvblxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKVxuXHRcdFx0XHRcdC50aGVuKChhTGlua3MpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmblNldExpbmtFbmFibGVtZW50KHNJZCwgYUxpbmtzKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmbk9uRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGhhbmRsZXJzID0ge1xuXHRcdG9uVGFibGVDb250ZXh0Q2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdGxldCBvVGFibGU6IGFueTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5zb21lKGZ1bmN0aW9uIChfb1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0aWYgKF9vVGFibGUuZ2V0Um93QmluZGluZygpID09PSBvU291cmNlKSB7XG5cdFx0XHRcdFx0b1RhYmxlID0gX29UYWJsZTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgb0N1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvblByb21pc2UpIHtcblx0XHRcdFx0bGV0IGFUYWJsZUNvbnRleHRzOiBhbnk7XG5cdFx0XHRcdGlmIChvVGFibGUuZ2V0VHlwZSgpLmdldE1ldGFkYXRhKCkuaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpKSB7XG5cdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMgPSBvU291cmNlLmdldENvbnRleHRzKDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzID0gb1NvdXJjZS5nZXRDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL2lmIGNvbnRleHRzIGFyZSBub3QgZnVsbHkgbG9hZGVkIHRoZSBnZXRjb250ZXh0cyBmdW5jdGlvbiBhYm92ZSB3aWxsIHRyaWdnZXIgYSBuZXcgY2hhbmdlIGV2ZW50IGNhbGxcblx0XHRcdFx0aWYgKCFhVGFibGVDb250ZXh0c1swXSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ3VycmVudEFjdGlvblByb21pc2Vcblx0XHRcdFx0XHQudGhlbigob0FjdGlvblJlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGlmICghb0FjdGlvblJlc3BvbnNlIHx8IG9BY3Rpb25SZXNwb25zZS5jb250cm9sSWQgIT09IG9UYWJsZS5zSWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkRhdGEgPSBvQWN0aW9uUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRcdFx0XHRjb25zdCBhS2V5cyA9IG9BY3Rpb25SZXNwb25zZS5rZXlzO1xuXHRcdFx0XHRcdFx0bGV0IGlOZXdJdGVtcCA9IC0xO1xuXHRcdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMuZmluZChmdW5jdGlvbiAob1RhYmxlQ29udGV4dDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhYmxlRGF0YSA9IG9UYWJsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJDb21wYXJlID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVGFibGVEYXRhW3NLZXldID09PSBvQWN0aW9uRGF0YVtzS2V5XTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChiQ29tcGFyZSkge1xuXHRcdFx0XHRcdFx0XHRcdGlOZXdJdGVtcCA9IGk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJDb21wYXJlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAoaU5ld0l0ZW1wICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhRGlhbG9ncyA9IEluc3RhbmNlTWFuYWdlci5nZXRPcGVuRGlhbG9ncygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID1cblx0XHRcdFx0XHRcdFx0XHRhRGlhbG9ncy5sZW5ndGggPiAwID8gYURpYWxvZ3MuZmluZCgoZGlhbG9nKSA9PiBkaWFsb2cuZGF0YShcIkZ1bGxTY3JlZW5EaWFsb2dcIikgIT09IHRydWUpIDogbnVsbDtcblx0XHRcdFx0XHRcdFx0aWYgKG9EaWFsb2cpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBieSBkZXNpZ24sIGEgc2FwLm0uZGlhbG9nIHNldCB0aGUgZm9jdXMgdG8gdGhlIHByZXZpb3VzIGZvY3VzZWQgZWxlbWVudCB3aGVuIGNsb3NpbmcuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIHdhaXQgZm9yIHRoZSBkaWFsb2cgdG8gYmUgY2xvc2UgYmVmb3JlIHRvIGZvY3VzIGFub3RoZXIgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLl9lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNjcm9sbGluZyB0byB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtOiBcIiArIGVycik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBmaXJlIE1vZGVsQ29udGV4dENoYW5nZSBvbiB0aGUgbWVzc2FnZSBidXR0b24gd2hlbmV2ZXIgdGhlIHRhYmxlIGNvbnRleHQgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OkZvb3RlckJhcjo6TWVzc2FnZUJ1dHRvblwiKTtcblx0XHRcdG9NZXNzYWdlQnV0dG9uLmZpcmVNb2RlbENvbnRleHRDaGFuZ2UoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogSW52b2tlcyBhbiBhY3Rpb24gLSBib3VuZC91bmJvdW5kIGFuZCBzZXRzIHRoZSBwYWdlIGRpcnR5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIG9WaWV3XG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdFx0ICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHRcdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbiwgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkXG5cdFx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOyBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2FsbEFjdGlvbihvVmlldzogYW55LCBzQWN0aW9uTmFtZTogc3RyaW5nLCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnN0IHRoYXQgPSBvQ29udHJvbGxlcjtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvd1xuXHRcdFx0XHQuaW52b2tlQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycylcblx0XHRcdFx0LnRoZW4odGhhdC5fc2hvd01lc3NhZ2VQb3BvdmVyLmJpbmQodGhhdCwgdW5kZWZpbmVkKSlcblx0XHRcdFx0LmNhdGNoKHRoYXQuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKHRoYXQpKTtcblx0XHR9LFxuXHRcdG9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKG9Db250cm9sbGVyOiBhbnksIG9Tb3VyY2U6IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSwgc0NvbnRyb2xDb25maWc6IGFueSwgc0NvbGxlY3Rpb25QYXRoOiBhbnkpIHtcblx0XHRcdG9NYW5pZmVzdE91dGJvdW5kID0gdHlwZW9mIG9NYW5pZmVzdE91dGJvdW5kID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShvTWFuaWZlc3RPdXRib3VuZCkgOiBvTWFuaWZlc3RPdXRib3VuZDtcblx0XHRcdGNvbnN0IG9UYXJnZXRJbmZvID0gb01hbmlmZXN0T3V0Ym91bmRbc0NvbnRyb2xDb25maWddLFxuXHRcdFx0XHRhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9UYXJnZXRJbmZvKSxcblx0XHRcdFx0b0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0c01ldGFQYXRoID0gb0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFQYXRoKG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGxldCBhTmF2aWdhdGlvbkRhdGEgPSBvQ29udHJvbGxlci5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LCBzQ29sbGVjdGlvblBhdGgpO1xuXHRcdFx0bGV0IGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycztcblxuXHRcdFx0YU5hdmlnYXRpb25EYXRhID0gYU5hdmlnYXRpb25EYXRhLm1hcChmdW5jdGlvbiAob05hdmlnYXRpb25EYXRhOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRkYXRhOiBvTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0bWV0YVBhdGg6IHNNZXRhUGF0aCArIChzQ29sbGVjdGlvblBhdGggPyBcIi9cIiArIHNDb2xsZWN0aW9uUGF0aCA6IFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzICYmIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24uZ2V0T3V0Ym91bmRQYXJhbXMob1RhcmdldEluZm8ucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0ICYmIG9UYXJnZXRJbmZvLmFjdGlvbikge1xuXHRcdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0LCBvVGFyZ2V0SW5mby5hY3Rpb24sIHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IGFOYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmcsXG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkICg/Pz8gbWF5YmUgb25seSBvbmNlIGZpbmlzaGVkPylcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZywgb0NvbnRleHQ6IGFueSwgc0NyZWF0ZVBhdGg6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblxuXHRcdG9uTmF2aWdhdGVDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHQvL3dpbGwgYmUgY2FsbGVkIGFsd2F5cyB3aGVuIHdlIGNsaWNrIG9uIGEgc2VjdGlvbiB0YWJcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdHRoaXMuYlNlY3Rpb25OYXZpZ2F0ZWQgPSB0cnVlO1xuXG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgJiZcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5zZWN0aW9uTGF5b3V0ID09PSBcIlRhYnNcIiAmJlxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiKSA9PT0gZmFsc2Vcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUoW29TdWJTZWN0aW9uXSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTZWxlY3RlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgNTAwKTtcblx0XHR9LFxuXHRcdG5hdmlnYXRlVG9TdWJTZWN0aW9uOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCB2RGV0YWlsQ29uZmlnOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxDb25maWcgPSB0eXBlb2YgdkRldGFpbENvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UodkRldGFpbENvbmZpZykgOiB2RGV0YWlsQ29uZmlnO1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdFx0XHRsZXQgb1NlY3Rpb247XG5cdFx0XHRsZXQgb1N1YlNlY3Rpb247XG5cdFx0XHRpZiAob0RldGFpbENvbmZpZy5zZWN0aW9uSWQpIHtcblx0XHRcdFx0b1NlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVNlY3Rpb247XG5cdFx0XHRcdG9TdWJTZWN0aW9uID0gKFxuXHRcdFx0XHRcdG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkXG5cdFx0XHRcdFx0XHQ/IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKVxuXHRcdFx0XHRcdFx0OiBvU2VjdGlvbiAmJiBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpICYmIG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKClbMF1cblx0XHRcdFx0KSBhcyBPYmplY3RQYWdlU3ViU2VjdGlvbjtcblx0XHRcdH0gZWxzZSBpZiAob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpIHtcblx0XHRcdFx0b1N1YlNlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cdFx0XHRcdG9TZWN0aW9uID0gb1N1YlNlY3Rpb24gJiYgKG9TdWJTZWN0aW9uLmdldFBhcmVudCgpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRcdH1cblx0XHRcdGlmICghb1NlY3Rpb24gfHwgIW9TdWJTZWN0aW9uIHx8ICFvU2VjdGlvbi5nZXRWaXNpYmxlKCkgfHwgIW9TdWJTZWN0aW9uLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHQoKG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RpdGxlID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFwiQ19ST1VUSU5HX05BVklHQVRJT05fRElTQUJMRURfVElUTEVcIixcblx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3Ioc1RpdGxlKTtcblx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc1RpdGxlKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zY3JvbGxUb1NlY3Rpb24ob1N1YlNlY3Rpb24uZ2V0SWQoKSk7XG5cdFx0XHRcdC8vIHRyaWdnZXIgaWFwcCBzdGF0ZSBjaGFuZ2Vcblx0XHRcdFx0b09iamVjdFBhZ2UuZmlyZU5hdmlnYXRlKHtcblx0XHRcdFx0XHRzZWN0aW9uOiBvU2VjdGlvbixcblx0XHRcdFx0XHRzdWJTZWN0aW9uOiBvU3ViU2VjdGlvblxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdENoYXJ0UnVudGltZS5mblVwZGF0ZUNoYXJ0KG9FdmVudCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQYWdlQ29udHJvbGxlcjtcbiJdfQ==