@sapui5/sap.fe.templates 1.100.0 → 1.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/package.json +4 -5
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +24 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +30 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +156 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +82 -53
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +123 -112
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +2 -1
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1111 -1081
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +54 -53
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +134 -137
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +443 -428
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -0
  24. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +25 -25
  25. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  27. package/src/sap/fe/templates/ListReport/view/fragments/{MultipleMode.fragment.xml → MultipleModeOld.fragment.xml} +24 -23
  28. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +478 -514
  29. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
  30. package/src/sap/fe/templates/ObjectPage/Component.js +169 -138
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +140 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +3 -9
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1530 -1447
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -0
  37. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +136 -101
  38. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +24 -21
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +98 -53
  42. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  43. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +20 -19
  44. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +50 -47
  46. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +34 -34
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +15 -15
  50. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +11 -11
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  53. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +55 -52
  54. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +15 -17
  56. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +13 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +23 -21
  60. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +310 -317
  62. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +66 -57
  64. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  65. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +1 -1
  66. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +1 -1
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +18 -24
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -9
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +4 -4
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  71. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +851 -817
  72. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -0
  73. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +205 -189
  74. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  75. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +484 -459
  76. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  77. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +16 -14
  78. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  79. package/src/sap/fe/templates/TableScroller.js +45 -53
  80. package/src/sap/fe/templates/TableScroller.ts +48 -0
  81. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  82. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +22 -0
  83. package/src/sap/fe/templates/library.js +49 -63
  84. package/src/sap/fe/templates/library.ts +57 -0
  85. package/src/sap/fe/templates/messagebundle.properties +19 -7
  86. package/src/sap/fe/templates/messagebundle_ar.properties +6 -2
  87. package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
  88. package/src/sap/fe/templates/messagebundle_ca.properties +6 -2
  89. package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
  90. package/src/sap/fe/templates/messagebundle_cy.properties +6 -2
  91. package/src/sap/fe/templates/messagebundle_da.properties +6 -2
  92. package/src/sap/fe/templates/messagebundle_de.properties +6 -2
  93. package/src/sap/fe/templates/messagebundle_el.properties +6 -2
  94. package/src/sap/fe/templates/messagebundle_en.properties +6 -2
  95. package/src/sap/fe/templates/messagebundle_en_GB.properties +6 -2
  96. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +6 -2
  97. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +6 -2
  98. package/src/sap/fe/templates/messagebundle_es.properties +6 -2
  99. package/src/sap/fe/templates/messagebundle_es_MX.properties +6 -2
  100. package/src/sap/fe/templates/messagebundle_et.properties +6 -2
  101. package/src/sap/fe/templates/messagebundle_fi.properties +6 -2
  102. package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
  103. package/src/sap/fe/templates/messagebundle_fr_CA.properties +6 -2
  104. package/src/sap/fe/templates/messagebundle_hi.properties +6 -2
  105. package/src/sap/fe/templates/messagebundle_hr.properties +6 -2
  106. package/src/sap/fe/templates/messagebundle_hu.properties +6 -2
  107. package/src/sap/fe/templates/messagebundle_id.properties +6 -2
  108. package/src/sap/fe/templates/messagebundle_it.properties +6 -2
  109. package/src/sap/fe/templates/messagebundle_iw.properties +6 -2
  110. package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
  111. package/src/sap/fe/templates/messagebundle_kk.properties +6 -2
  112. package/src/sap/fe/templates/messagebundle_ko.properties +6 -2
  113. package/src/sap/fe/templates/messagebundle_lt.properties +6 -2
  114. package/src/sap/fe/templates/messagebundle_lv.properties +6 -2
  115. package/src/sap/fe/templates/messagebundle_ms.properties +6 -2
  116. package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
  117. package/src/sap/fe/templates/messagebundle_no.properties +6 -2
  118. package/src/sap/fe/templates/messagebundle_pl.properties +6 -2
  119. package/src/sap/fe/templates/messagebundle_pt.properties +6 -2
  120. package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -2
  121. package/src/sap/fe/templates/messagebundle_ro.properties +6 -2
  122. package/src/sap/fe/templates/messagebundle_ru.properties +6 -2
  123. package/src/sap/fe/templates/messagebundle_sh.properties +6 -2
  124. package/src/sap/fe/templates/messagebundle_sk.properties +6 -2
  125. package/src/sap/fe/templates/messagebundle_sl.properties +6 -2
  126. package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
  127. package/src/sap/fe/templates/messagebundle_th.properties +6 -2
  128. package/src/sap/fe/templates/messagebundle_tr.properties +6 -2
  129. package/src/sap/fe/templates/messagebundle_uk.properties +6 -2
  130. package/src/sap/fe/templates/messagebundle_vi.properties +6 -2
  131. package/src/sap/fe/templates/messagebundle_zh_CN.properties +6 -2
  132. package/src/sap/fe/templates/messagebundle_zh_TW.properties +6 -2
@@ -1,320 +1,313 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/ui/core/routing/HashChanger",
9
- "sap/fe/core/helpers/ModelHelper",
10
- "sap/fe/core/helpers/SemanticKeyHelper",
11
- "sap/ui/model/Filter",
12
- "sap/ui/model/FilterOperator",
13
- "sap/base/Log"
14
- ],
15
- function(HashChanger, ModelHelper, SemanticKeyHelper, Filter, FilterOperator, Log) {
16
- "use strict";
17
- var bIsStickySupported, oUIModel, sEditMode;
18
-
19
- function createFilterToFetchActiveContext(mKeyValues, bIsActiveEntityDefined) {
20
- var aFilters,
21
- aKeys = Object.keys(mKeyValues);
22
-
23
- aFilters = aKeys.map(function(sKey) {
24
- var sValue = mKeyValues[sKey];
25
- if (sValue !== undefined) {
26
- return new Filter(sKey, FilterOperator.EQ, sValue);
27
- }
28
- });
29
-
30
- if (bIsActiveEntityDefined) {
31
- var oActiveFilter = new Filter({
32
- filters: [new Filter("SiblingEntity/IsActiveEntity", FilterOperator.EQ, true)],
33
- and: false
34
- });
35
-
36
- aFilters.push(oActiveFilter);
37
- }
38
-
39
- var oCombinedFilter = new Filter(aFilters, true);
40
- return oCombinedFilter;
41
- }
42
-
43
- function getActiveContextPath(oController, sPageEntityName, oFilter) {
44
- var oListBinding = oController
45
- .getView()
46
- .getBindingContext()
47
- .getModel()
48
- .bindList("/" + sPageEntityName, undefined, undefined, oFilter, { "$$groupId": "$auto.Heroes" });
49
- return oListBinding.requestContexts(0, 2).then(function(oContexts) {
50
- if (oContexts && oContexts.length) {
51
- return oContexts[0].getPath();
52
- }
53
- });
54
- }
55
-
56
- function getActiveContextInstances(oContext, oController, oEntitySet) {
57
- var aActiveContextpromises = [];
58
- var aPages = [];
59
- var sMetaPath = oContext
60
- .getModel()
61
- .getMetaModel()
62
- .getMetaPath(oContext.getPath());
63
- if (sMetaPath.indexOf("/") === 0) {
64
- sMetaPath = sMetaPath.substring(1);
65
- }
66
- var aMetaPathArray = sMetaPath.split("/");
67
- var sCurrentHashNoParams = HashChanger.getInstance()
68
- .getHash()
69
- .split("?")[0];
70
- var aCurrentHashArray = sCurrentHashNoParams.split("/");
71
-
72
- // oPageMap - creating an object that contains map of metapath name and it's technical details
73
- // which is required to create a filter to fetch the relavant/correct active context
74
- // Example: {SalesOrderManage:{technicalID:technicalIDValue}, _Item:{technicalID:technicalIDValue}} etc.,
75
- var oPageMap = {};
76
- var aPageHashArray = [];
77
- aCurrentHashArray.forEach(function(sPageHash) {
78
- var aKeyValues = sPageHash.substring(sPageHash.indexOf("(") + 1, sPageHash.length - 1).split(",");
79
- var mKeyValues = {};
80
- var sPageHashName = sPageHash.split("(")[0];
81
- oPageMap[sPageHashName] = {};
82
- aPageHashArray.push(sPageHashName);
83
- oPageMap[sPageHashName]["bIsActiveEntityDefined"] = true;
84
- for (var i = 0; i < aKeyValues.length; i++) {
85
- var sKeyAssignment = aKeyValues[i];
86
- var aParts = sKeyAssignment.split("=");
87
- var sKeyValue = aParts[1];
88
- var sKey = aParts[0];
89
- // In case if only one technical key is defined then the url just contains the technicalIDValue but not the technicalID
90
- // Example: SalesOrderManage(ID=11111129-aaaa-bbbb-cccc-ddddeeeeffff,IsActiveEntity=false)/_Item(11111129-aaaa-bbbb-cccc-ddddeeeeffff)
91
- // In above example SalesOrderItem has only one technical key defined, hence technicalID info is not present in the url
92
- // Hence in such cases we get technical key and use them to fetch active context
93
- if (sKeyAssignment.indexOf("=") === -1) {
94
- var oMetaModel = oContext.getModel().getMetaModel();
95
- var aTechnicalKeys = oMetaModel.getObject("/" + aPageHashArray.join("/") + "/$Type/$Key");
96
- sKeyValue = aParts[0];
97
- sKey = aTechnicalKeys[0];
98
- oPageMap[sPageHash.split("(")[0]]["bIsActiveEntityDefined"] = false;
99
- }
100
-
101
- if (sKey !== "IsActiveEntity") {
102
- if (sKeyValue.indexOf("'") === 0 && sKeyValue.lastIndexOf("'") === sKeyValue.length - 1) {
103
- // Remove the quotes from the value and decode special chars
104
- sKeyValue = decodeURIComponent(sKeyValue.substring(1, sKeyValue.length - 1));
105
- }
106
- mKeyValues[sKey] = sKeyValue;
107
- }
108
- }
109
- oPageMap[sPageHashName].mKeyValues = mKeyValues;
110
- });
111
-
112
- var oPageEntitySet = oEntitySet;
113
- aMetaPathArray.forEach(function(sNavigationPath) {
114
- var oPageInfo = {};
115
- var sPageEntitySetName =
116
- oPageEntitySet.$NavigationPropertyBinding && oPageEntitySet.$NavigationPropertyBinding[sNavigationPath];
117
- if (sPageEntitySetName) {
118
- oPageInfo.pageEntityName = oPageEntitySet.$NavigationPropertyBinding[sNavigationPath];
119
- oPageEntitySet =
120
- oContext
121
- .getModel()
122
- .getMetaModel()
123
- .getObject("/" + sPageEntitySetName) || oEntitySet;
124
- } else {
125
- oPageInfo.pageEntityName = sNavigationPath;
126
- }
127
- oPageInfo.mKeyValues = oPageMap[sNavigationPath].mKeyValues;
128
- oPageInfo.bIsActiveEntityDefined = oPageMap[sNavigationPath].bIsActiveEntityDefined;
129
- aPages.push(oPageInfo);
130
- });
131
-
132
- aPages.forEach(function(oPageInfo) {
133
- var oFilter = createFilterToFetchActiveContext(oPageInfo.mKeyValues, oPageInfo.bIsActiveEntityDefined);
134
- aActiveContextpromises.push(getActiveContextPath(oController, oPageInfo.pageEntityName, oFilter));
135
- });
136
-
137
- return aActiveContextpromises;
138
- }
139
-
140
- /**
141
- * Method to fetch active context path's.
142
- * @param {sap.ui.model.odata.v4.Context} oContext The Page Context
143
- * @param oController
144
- * @returns {Promise} Promise which is resolved once the active context's are fetched
145
- */
146
- function getActiveContextPaths(oContext, oController) {
147
- var sCurrentHashNoParams = HashChanger.getInstance()
148
- .getHash()
149
- .split("?")[0];
150
- var sRootEntityName = sCurrentHashNoParams && sCurrentHashNoParams.substr(0, sCurrentHashNoParams.indexOf("("));
151
- if (sRootEntityName.indexOf("/") === 0) {
152
- sRootEntityName = sRootEntityName.substring(1);
153
- }
154
- var oEntitySet = oContext
155
- .getModel()
156
- .getMetaModel()
157
- .getObject("/" + sRootEntityName);
158
- var oPageContext = oContext;
159
- var aActiveContextpromises = getActiveContextInstances(oContext, oController, oEntitySet);
160
- if (aActiveContextpromises.length > 0) {
161
- return Promise.all(aActiveContextpromises)
162
- .then(function(aData) {
163
- var aActiveContextPaths = [];
164
- var oPageEntitySet = oEntitySet;
165
- if (aData[0].indexOf("/") === 0) {
166
- aActiveContextPaths.push(aData[0].substring(1));
167
- } else {
168
- aActiveContextPaths.push(aData[0]);
169
- }
170
- // In the active context paths identify and replace the entitySet Name with corresponding navigation property name
171
- // Required to form the url pointing to active context
172
- // Example : SalesOrderItem --> _Item, MaterialDetails --> _MaterialDetails etc.,
173
- for (var i = 1; i < aData.length; i++) {
174
- var sActiveContextPath = aData[i];
175
- var sNavigatioProperty = "";
176
- var sEntitySetName = sActiveContextPath && sActiveContextPath.substr(0, sActiveContextPath.indexOf("("));
177
- if (sEntitySetName.indexOf("/") === 0) {
178
- sEntitySetName = sEntitySetName.substring(1);
179
- }
180
- if (sActiveContextPath.indexOf("/") === 0) {
181
- sActiveContextPath = sActiveContextPath.substring(1);
182
- }
183
- sNavigatioProperty = Object.keys(oPageEntitySet.$NavigationPropertyBinding)[
184
- Object.values(oPageEntitySet.$NavigationPropertyBinding).indexOf(sEntitySetName)
185
- ];
186
- if (sNavigatioProperty) {
187
- aActiveContextPaths.push(sActiveContextPath.replace(sEntitySetName, sNavigatioProperty));
188
- oPageEntitySet =
189
- oPageContext
190
- .getModel()
191
- .getMetaModel()
192
- .getObject("/" + sEntitySetName) || oEntitySet;
193
- } else {
194
- aActiveContextPaths.push(sActiveContextPath);
195
- }
196
- }
197
- return aActiveContextPaths;
198
- })
199
- .catch(function(oError) {
200
- Log.info("Failed to retrieve one or more active context path's", oError);
201
- });
202
- } else {
203
- return Promise.resolve();
204
- }
205
- }
206
- function fetchActiveContextPaths(oContext, oController) {
207
- var oPromise, aSemanticKeys;
208
- var sCurrentHashNoParams = HashChanger.getInstance()
209
- .getHash()
210
- .split("?")[0];
211
- if (oContext) {
212
- var oModel = oContext.getModel();
213
- var oMetaModel = oModel.getMetaModel();
214
- bIsStickySupported = ModelHelper.isStickySessionSupported(oMetaModel);
215
- var sRootEntityName = sCurrentHashNoParams && sCurrentHashNoParams.substr(0, sCurrentHashNoParams.indexOf("("));
216
- if (sRootEntityName.indexOf("/") === 0) {
217
- sRootEntityName = sRootEntityName.substring(1);
218
- }
219
- aSemanticKeys = SemanticKeyHelper.getSemanticKeys(oMetaModel, sRootEntityName);
220
- }
221
- // Fetch active context details incase of below scenario's(where page is not sticky supported(we do not have draft instance))
222
- // 1. In case of draft enabled Object page where semantic key based URL is not possible(like semantic keys are not modeled in the entity set)
223
- // 2. In case of draft enabled Sub Object Pages (where semantic bookmarking is not supported)
224
- var oViewData = oController.getView().getViewData();
225
- if (oContext && !bIsStickySupported && ((oViewData.viewLevel === 1 && !aSemanticKeys) || oViewData.viewLevel >= 2)) {
226
- oPromise = getActiveContextPaths(oContext, oController);
227
- return oPromise;
228
- } else {
229
- return Promise.resolve();
230
- }
231
- }
232
-
233
- // /**
234
- // * Get share URL.
235
- // * @param sEditMode
236
- // * @param bIsStickySupported
237
- // * @param aActiveContextPaths
238
- // * @returns {string} The share URL
239
- // * @protected
240
- // * @static
241
- // */
242
- function getShareUrl() {
243
- var oUShellContainer = sap.ushell && sap.ushell.Container;
244
- if (oUShellContainer) {
245
- return oUShellContainer
246
- .getFLPUrlAsync(true)
247
- .then(function(sFLPUrl) {
248
- return sFLPUrl;
249
- })
250
- .catch(function(sError) {
251
- Log.error("Could not retrieve cFLP URL for the sharing dialog (dialog will not be opened)", sError);
252
- });
253
- } else {
254
- return Promise.resolve(document.URL);
255
- }
256
- }
257
-
258
- function getJamUrl(sEditMode, bIsStickySupported, aActiveContextPaths) {
259
- var sJamUrl;
260
- var sHash = HashChanger.getInstance().getHash();
261
- var sBasePath = HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
262
- if (sEditMode === "Editable" && !bIsStickySupported && aActiveContextPaths) {
263
- sJamUrl = sBasePath + aActiveContextPaths.join("/");
264
- } else {
265
- sJamUrl = sHash ? sBasePath + sHash : window.location.hash;
266
- }
267
- // in case we are in cFLP scenario, the application is running
268
- // inside an iframe, and there for we need to get the cFLP URL
269
- // and not 'document.URL' that represents the iframe URL
270
- if (sap.ushell && sap.ushell.Container && sap.ushell.Container.runningInIframe && sap.ushell.Container.runningInIframe()) {
271
- sap.ushell.Container.getFLPUrl(true)
272
- .then(function(sUrl) {
273
- return sUrl.substr(0, sUrl.indexOf("#")) + sJamUrl;
274
- })
275
- .catch(function(sError) {
276
- Log.error("Could not retrieve cFLP URL for the sharing dialog (dialog will not be opened)", sError);
277
- });
278
- } else {
279
- return Promise.resolve(window.location.origin + window.location.pathname + sJamUrl);
280
- }
281
- }
282
-
283
- return {
284
- adaptShareMetadata: function(oShareMetadata) {
285
- var that = this;
286
- var oContext = this.base.getView().getBindingContext();
287
- oUIModel = this.base.getView().getModel("ui");
288
- sEditMode = oUIModel.getProperty("/editMode");
289
- return fetchActiveContextPaths(oContext, that.base.getView().getController()).then(function(aActiveContextPaths) {
290
- var oPageTitleInfo = that.base
291
- .getView()
292
- .getController()
293
- ._getPageTitleInformation();
294
-
295
- return Promise.all([getJamUrl(sEditMode, bIsStickySupported, aActiveContextPaths), getShareUrl()])
296
- .then(function(oData) {
297
- var sTitle = oPageTitleInfo.title;
298
- var sObjectSubtitle = oPageTitleInfo.subtitle.toString();
299
- if (sObjectSubtitle) {
300
- sTitle = sTitle + " - " + sObjectSubtitle;
301
- }
302
- oShareMetadata.tile = {
303
- title: oPageTitleInfo.title,
304
- subtitle: oPageTitleInfo.subtitle.toString()
305
- };
306
- oShareMetadata.email.title = sTitle;
307
- oShareMetadata.title = sTitle;
308
- oShareMetadata.jam.url = oData[0];
309
- oShareMetadata.url = oData[1];
310
-
311
- return oShareMetadata;
312
- })
313
- .catch(function(error) {
314
- Log.error(error);
315
- });
316
- });
317
- }
318
- };
319
- }
320
- );
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/ui/core/routing/HashChanger", "sap/ui/model/Filter", "sap/ui/model/FilterOperator"], function (Log, ModelHelper, SemanticKeyHelper, HashChanger, Filter, FilterOperator) {
6
+ "use strict";
7
+
8
+ var bIsStickySupported;
9
+
10
+ function createFilterToFetchActiveContext(mKeyValues, bIsActiveEntityDefined) {
11
+ var aKeys = Object.keys(mKeyValues);
12
+ var aFilters = aKeys.map(function (sKey) {
13
+ var sValue = mKeyValues[sKey];
14
+
15
+ if (sValue !== undefined) {
16
+ return new Filter(sKey, FilterOperator.EQ, sValue);
17
+ }
18
+ });
19
+
20
+ if (bIsActiveEntityDefined) {
21
+ var oActiveFilter = new Filter({
22
+ filters: [new Filter("SiblingEntity/IsActiveEntity", FilterOperator.EQ, true)],
23
+ and: false
24
+ });
25
+ aFilters.push(oActiveFilter);
26
+ }
27
+
28
+ var oCombinedFilter = new Filter(aFilters, true);
29
+ return oCombinedFilter;
30
+ }
31
+
32
+ function getActiveContextPath(oController, sPageEntityName, oFilter) {
33
+ var oListBinding = oController.getView().getBindingContext().getModel().bindList("/" + sPageEntityName, undefined, undefined, oFilter, {
34
+ "$$groupId": "$auto.Heroes"
35
+ });
36
+ return oListBinding.requestContexts(0, 2).then(function (oContexts) {
37
+ if (oContexts && oContexts.length) {
38
+ return oContexts[0].getPath();
39
+ }
40
+ });
41
+ }
42
+
43
+ function getActiveContextInstances(oContext, oController, oEntitySet) {
44
+ var aActiveContextpromises = [];
45
+ var aPages = [];
46
+ var sMetaPath = oContext.getModel().getMetaModel().getMetaPath(oContext.getPath());
47
+
48
+ if (sMetaPath.indexOf("/") === 0) {
49
+ sMetaPath = sMetaPath.substring(1);
50
+ }
51
+
52
+ var aMetaPathArray = sMetaPath.split("/");
53
+ var sCurrentHashNoParams = HashChanger.getInstance().getHash().split("?")[0];
54
+ var aCurrentHashArray = sCurrentHashNoParams.split("/"); // oPageMap - creating an object that contains map of metapath name and it's technical details
55
+ // which is required to create a filter to fetch the relavant/correct active context
56
+ // Example: {SalesOrderManage:{technicalID:technicalIDValue}, _Item:{technicalID:technicalIDValue}} etc.,
57
+
58
+ var oPageMap = {};
59
+ var aPageHashArray = [];
60
+ aCurrentHashArray.forEach(function (sPageHash) {
61
+ var aKeyValues = sPageHash.substring(sPageHash.indexOf("(") + 1, sPageHash.length - 1).split(",");
62
+ var mKeyValues = {};
63
+ var sPageHashName = sPageHash.split("(")[0];
64
+ oPageMap[sPageHashName] = {};
65
+ aPageHashArray.push(sPageHashName);
66
+ oPageMap[sPageHashName]["bIsActiveEntityDefined"] = true;
67
+
68
+ for (var i = 0; i < aKeyValues.length; i++) {
69
+ var sKeyAssignment = aKeyValues[i];
70
+ var aParts = sKeyAssignment.split("=");
71
+ var sKeyValue = aParts[1];
72
+ var sKey = aParts[0]; // In case if only one technical key is defined then the url just contains the technicalIDValue but not the technicalID
73
+ // Example: SalesOrderManage(ID=11111129-aaaa-bbbb-cccc-ddddeeeeffff,IsActiveEntity=false)/_Item(11111129-aaaa-bbbb-cccc-ddddeeeeffff)
74
+ // In above example SalesOrderItem has only one technical key defined, hence technicalID info is not present in the url
75
+ // Hence in such cases we get technical key and use them to fetch active context
76
+
77
+ if (sKeyAssignment.indexOf("=") === -1) {
78
+ var oMetaModel = oContext.getModel().getMetaModel();
79
+ var aTechnicalKeys = oMetaModel.getObject("/" + aPageHashArray.join("/") + "/$Type/$Key");
80
+ sKeyValue = aParts[0];
81
+ sKey = aTechnicalKeys[0];
82
+ oPageMap[sPageHash.split("(")[0]]["bIsActiveEntityDefined"] = false;
83
+ }
84
+
85
+ if (sKey !== "IsActiveEntity") {
86
+ if (sKeyValue.indexOf("'") === 0 && sKeyValue.lastIndexOf("'") === sKeyValue.length - 1) {
87
+ // Remove the quotes from the value and decode special chars
88
+ sKeyValue = decodeURIComponent(sKeyValue.substring(1, sKeyValue.length - 1));
89
+ }
90
+
91
+ mKeyValues[sKey] = sKeyValue;
92
+ }
93
+ }
94
+
95
+ oPageMap[sPageHashName].mKeyValues = mKeyValues;
96
+ });
97
+ var oPageEntitySet = oEntitySet;
98
+ aMetaPathArray.forEach(function (sNavigationPath) {
99
+ var oPageInfo = {};
100
+ var sPageEntitySetName = oPageEntitySet.$NavigationPropertyBinding && oPageEntitySet.$NavigationPropertyBinding[sNavigationPath];
101
+
102
+ if (sPageEntitySetName) {
103
+ oPageInfo.pageEntityName = oPageEntitySet.$NavigationPropertyBinding[sNavigationPath];
104
+ oPageEntitySet = oContext.getModel().getMetaModel().getObject("/" + sPageEntitySetName) || oEntitySet;
105
+ } else {
106
+ oPageInfo.pageEntityName = sNavigationPath;
107
+ }
108
+
109
+ oPageInfo.mKeyValues = oPageMap[sNavigationPath].mKeyValues;
110
+ oPageInfo.bIsActiveEntityDefined = oPageMap[sNavigationPath].bIsActiveEntityDefined;
111
+ aPages.push(oPageInfo);
112
+ });
113
+ aPages.forEach(function (oPageInfo) {
114
+ var oFilter = createFilterToFetchActiveContext(oPageInfo.mKeyValues, oPageInfo.bIsActiveEntityDefined);
115
+ aActiveContextpromises.push(getActiveContextPath(oController, oPageInfo.pageEntityName, oFilter));
116
+ });
117
+ return aActiveContextpromises;
118
+ }
119
+ /**
120
+ * Method to fetch active context path's.
121
+ * @param {sap.ui.model.odata.v4.Context} oContext The Page Context
122
+ * @param oController
123
+ * @returns {Promise} Promise which is resolved once the active context's are fetched
124
+ */
125
+
126
+
127
+ function getActiveContextPaths(oContext, oController) {
128
+ var sCurrentHashNoParams = HashChanger.getInstance().getHash().split("?")[0];
129
+ var sRootEntityName = sCurrentHashNoParams && sCurrentHashNoParams.substr(0, sCurrentHashNoParams.indexOf("("));
130
+
131
+ if (sRootEntityName.indexOf("/") === 0) {
132
+ sRootEntityName = sRootEntityName.substring(1);
133
+ }
134
+
135
+ var oEntitySet = oContext.getModel().getMetaModel().getObject("/" + sRootEntityName);
136
+ var oPageContext = oContext;
137
+ var aActiveContextpromises = getActiveContextInstances(oContext, oController, oEntitySet);
138
+
139
+ if (aActiveContextpromises.length > 0) {
140
+ return Promise.all(aActiveContextpromises).then(function (aData) {
141
+ var aActiveContextPaths = [];
142
+ var oPageEntitySet = oEntitySet;
143
+
144
+ if (aData[0].indexOf("/") === 0) {
145
+ aActiveContextPaths.push(aData[0].substring(1));
146
+ } else {
147
+ aActiveContextPaths.push(aData[0]);
148
+ } // In the active context paths identify and replace the entitySet Name with corresponding navigation property name
149
+ // Required to form the url pointing to active context
150
+ // Example : SalesOrderItem --> _Item, MaterialDetails --> _MaterialDetails etc.,
151
+
152
+
153
+ for (var i = 1; i < aData.length; i++) {
154
+ var sActiveContextPath = aData[i];
155
+ var sNavigatioProperty = "";
156
+ var sEntitySetName = sActiveContextPath && sActiveContextPath.substr(0, sActiveContextPath.indexOf("("));
157
+
158
+ if (sEntitySetName.indexOf("/") === 0) {
159
+ sEntitySetName = sEntitySetName.substring(1);
160
+ }
161
+
162
+ if (sActiveContextPath.indexOf("/") === 0) {
163
+ sActiveContextPath = sActiveContextPath.substring(1);
164
+ }
165
+
166
+ sNavigatioProperty = Object.keys(oPageEntitySet.$NavigationPropertyBinding)[Object.values(oPageEntitySet.$NavigationPropertyBinding).indexOf(sEntitySetName)];
167
+
168
+ if (sNavigatioProperty) {
169
+ aActiveContextPaths.push(sActiveContextPath.replace(sEntitySetName, sNavigatioProperty));
170
+ oPageEntitySet = oPageContext.getModel().getMetaModel().getObject("/" + sEntitySetName) || oEntitySet;
171
+ } else {
172
+ aActiveContextPaths.push(sActiveContextPath);
173
+ }
174
+ }
175
+
176
+ return aActiveContextPaths;
177
+ }).catch(function (oError) {
178
+ Log.info("Failed to retrieve one or more active context path's", oError);
179
+ });
180
+ } else {
181
+ return Promise.resolve();
182
+ }
183
+ }
184
+
185
+ function fetchActiveContextPaths(oContext, oController) {
186
+ var oPromise, aSemanticKeys;
187
+ var sCurrentHashNoParams = HashChanger.getInstance().getHash().split("?")[0];
188
+
189
+ if (oContext) {
190
+ var oModel = oContext.getModel();
191
+ var oMetaModel = oModel.getMetaModel();
192
+ bIsStickySupported = ModelHelper.isStickySessionSupported(oMetaModel);
193
+ var sRootEntityName = sCurrentHashNoParams && sCurrentHashNoParams.substr(0, sCurrentHashNoParams.indexOf("("));
194
+
195
+ if (sRootEntityName.indexOf("/") === 0) {
196
+ sRootEntityName = sRootEntityName.substring(1);
197
+ }
198
+
199
+ aSemanticKeys = SemanticKeyHelper.getSemanticKeys(oMetaModel, sRootEntityName);
200
+ } // Fetch active context details incase of below scenario's(where page is not sticky supported(we do not have draft instance))
201
+ // 1. In case of draft enabled Object page where semantic key based URL is not possible(like semantic keys are not modeled in the entity set)
202
+ // 2. In case of draft enabled Sub Object Pages (where semantic bookmarking is not supported)
203
+
204
+
205
+ var oViewData = oController.getView().getViewData();
206
+
207
+ if (oContext && !bIsStickySupported && (oViewData.viewLevel === 1 && !aSemanticKeys || oViewData.viewLevel >= 2)) {
208
+ oPromise = getActiveContextPaths(oContext, oController);
209
+ return oPromise;
210
+ } else {
211
+ return Promise.resolve();
212
+ }
213
+ } // /**
214
+ // * Get share URL.
215
+ // * @param bIsEditable
216
+ // * @param bIsStickySupported
217
+ // * @param aActiveContextPaths
218
+ // * @returns {string} The share URL
219
+ // * @protected
220
+ // * @static
221
+ // */
222
+
223
+
224
+ function getShareUrl(bIsEditable, bIsStickySupported, aActiveContextPaths) {
225
+ var sShareUrl;
226
+ var sHash = HashChanger.getInstance().getHash();
227
+ var sBasePath = HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
228
+
229
+ if (bIsEditable && !bIsStickySupported && aActiveContextPaths) {
230
+ sShareUrl = sBasePath + aActiveContextPaths.join("/");
231
+ } else {
232
+ sShareUrl = sHash ? sBasePath + sHash : window.location.hash;
233
+ }
234
+
235
+ return sShareUrl;
236
+ }
237
+
238
+ function getShareEmailUrl() {
239
+ var oUShellContainer = sap.ushell && sap.ushell.Container;
240
+
241
+ if (oUShellContainer) {
242
+ return oUShellContainer.getFLPUrlAsync(true).then(function (sFLPUrl) {
243
+ return sFLPUrl;
244
+ }).catch(function (sError) {
245
+ Log.error("Could not retrieve cFLP URL for the sharing dialog (dialog will not be opened)", sError);
246
+ });
247
+ } else {
248
+ return Promise.resolve(document.URL);
249
+ }
250
+ }
251
+
252
+ function getJamUrl(bIsEditMode, bIsStickySupported, aActiveContextPaths) {
253
+ var sJamUrl;
254
+ var sHash = HashChanger.getInstance().getHash();
255
+ var sBasePath = HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
256
+
257
+ if (bIsEditMode && !bIsStickySupported && aActiveContextPaths) {
258
+ sJamUrl = sBasePath + aActiveContextPaths.join("/");
259
+ } else {
260
+ sJamUrl = sHash ? sBasePath + sHash : window.location.hash;
261
+ } // in case we are in cFLP scenario, the application is running
262
+ // inside an iframe, and there for we need to get the cFLP URL
263
+ // and not 'document.URL' that represents the iframe URL
264
+
265
+
266
+ if (sap.ushell && sap.ushell.Container && sap.ushell.Container.runningInIframe && sap.ushell.Container.runningInIframe()) {
267
+ sap.ushell.Container.getFLPUrl(true).then(function (sUrl) {
268
+ return sUrl.substr(0, sUrl.indexOf("#")) + sJamUrl;
269
+ }).catch(function (sError) {
270
+ Log.error("Could not retrieve cFLP URL for the sharing dialog (dialog will not be opened)", sError);
271
+ });
272
+ } else {
273
+ return Promise.resolve(window.location.origin + window.location.pathname + sJamUrl);
274
+ }
275
+ }
276
+
277
+ var ShareExtensionOverride = {
278
+ adaptShareMetadata: function (oShareMetadata) {
279
+ var _this = this;
280
+
281
+ var oContext = this.base.getView().getBindingContext(),
282
+ oUIModel = this.base.getView().getModel("ui"),
283
+ bIsEditable = oUIModel.getProperty("/isEditable");
284
+ return fetchActiveContextPaths(oContext, this.base.getView().getController()).then(function (aActiveContextPaths) {
285
+ var oPageTitleInfo = _this.base.getView().getController()._getPageTitleInformation();
286
+
287
+ return Promise.all([getJamUrl(bIsEditable, bIsStickySupported, aActiveContextPaths), getShareUrl(bIsEditable, bIsStickySupported, aActiveContextPaths), getShareEmailUrl()]).then(function (oData) {
288
+ var sTitle = oPageTitleInfo.title;
289
+ var sObjectSubtitle = oPageTitleInfo.subtitle.toString();
290
+
291
+ if (sObjectSubtitle) {
292
+ sTitle = sTitle + " - " + sObjectSubtitle;
293
+ }
294
+
295
+ oShareMetadata.tile = {
296
+ title: oPageTitleInfo.title,
297
+ subtitle: oPageTitleInfo.subtitle.toString()
298
+ };
299
+ oShareMetadata.email.title = sTitle;
300
+ oShareMetadata.title = sTitle;
301
+ oShareMetadata.jam.url = oData[0];
302
+ oShareMetadata.url = oData[1];
303
+ oShareMetadata.email.url = oData[2];
304
+ return oShareMetadata;
305
+ }).catch(function (error) {
306
+ Log.error(error);
307
+ });
308
+ });
309
+ }
310
+ };
311
+ return ShareExtensionOverride;
312
+ }, false);
313
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNoYXJlLnRzIl0sIm5hbWVzIjpbImJJc1N0aWNreVN1cHBvcnRlZCIsImNyZWF0ZUZpbHRlclRvRmV0Y2hBY3RpdmVDb250ZXh0IiwibUtleVZhbHVlcyIsImJJc0FjdGl2ZUVudGl0eURlZmluZWQiLCJhS2V5cyIsIk9iamVjdCIsImtleXMiLCJhRmlsdGVycyIsIm1hcCIsInNLZXkiLCJzVmFsdWUiLCJ1bmRlZmluZWQiLCJGaWx0ZXIiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwib0FjdGl2ZUZpbHRlciIsImZpbHRlcnMiLCJhbmQiLCJwdXNoIiwib0NvbWJpbmVkRmlsdGVyIiwiZ2V0QWN0aXZlQ29udGV4dFBhdGgiLCJvQ29udHJvbGxlciIsInNQYWdlRW50aXR5TmFtZSIsIm9GaWx0ZXIiLCJvTGlzdEJpbmRpbmciLCJnZXRWaWV3IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJnZXRNb2RlbCIsImJpbmRMaXN0IiwicmVxdWVzdENvbnRleHRzIiwidGhlbiIsIm9Db250ZXh0cyIsImxlbmd0aCIsImdldFBhdGgiLCJnZXRBY3RpdmVDb250ZXh0SW5zdGFuY2VzIiwib0NvbnRleHQiLCJvRW50aXR5U2V0IiwiYUFjdGl2ZUNvbnRleHRwcm9taXNlcyIsImFQYWdlcyIsInNNZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsImFNZXRhUGF0aEFycmF5Iiwic3BsaXQiLCJzQ3VycmVudEhhc2hOb1BhcmFtcyIsIkhhc2hDaGFuZ2VyIiwiZ2V0SW5zdGFuY2UiLCJnZXRIYXNoIiwiYUN1cnJlbnRIYXNoQXJyYXkiLCJvUGFnZU1hcCIsImFQYWdlSGFzaEFycmF5IiwiZm9yRWFjaCIsInNQYWdlSGFzaCIsImFLZXlWYWx1ZXMiLCJzUGFnZUhhc2hOYW1lIiwiaSIsInNLZXlBc3NpZ25tZW50IiwiYVBhcnRzIiwic0tleVZhbHVlIiwib01ldGFNb2RlbCIsImFUZWNobmljYWxLZXlzIiwiZ2V0T2JqZWN0Iiwiam9pbiIsImxhc3RJbmRleE9mIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwib1BhZ2VFbnRpdHlTZXQiLCJzTmF2aWdhdGlvblBhdGgiLCJvUGFnZUluZm8iLCJzUGFnZUVudGl0eVNldE5hbWUiLCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZyIsInBhZ2VFbnRpdHlOYW1lIiwiZ2V0QWN0aXZlQ29udGV4dFBhdGhzIiwic1Jvb3RFbnRpdHlOYW1lIiwic3Vic3RyIiwib1BhZ2VDb250ZXh0IiwiUHJvbWlzZSIsImFsbCIsImFEYXRhIiwiYUFjdGl2ZUNvbnRleHRQYXRocyIsInNBY3RpdmVDb250ZXh0UGF0aCIsInNOYXZpZ2F0aW9Qcm9wZXJ0eSIsInNFbnRpdHlTZXROYW1lIiwidmFsdWVzIiwicmVwbGFjZSIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiaW5mbyIsInJlc29sdmUiLCJmZXRjaEFjdGl2ZUNvbnRleHRQYXRocyIsIm9Qcm9taXNlIiwiYVNlbWFudGljS2V5cyIsIm9Nb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJvVmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsImdldFNoYXJlVXJsIiwiYklzRWRpdGFibGUiLCJzU2hhcmVVcmwiLCJzSGFzaCIsInNCYXNlUGF0aCIsImhyZWZGb3JBcHBTcGVjaWZpY0hhc2giLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhhc2giLCJnZXRTaGFyZUVtYWlsVXJsIiwib1VTaGVsbENvbnRhaW5lciIsInNhcCIsInVzaGVsbCIsIkNvbnRhaW5lciIsImdldEZMUFVybEFzeW5jIiwic0ZMUFVybCIsInNFcnJvciIsImVycm9yIiwiZG9jdW1lbnQiLCJVUkwiLCJnZXRKYW1VcmwiLCJiSXNFZGl0TW9kZSIsInNKYW1VcmwiLCJydW5uaW5nSW5JZnJhbWUiLCJnZXRGTFBVcmwiLCJzVXJsIiwib3JpZ2luIiwicGF0aG5hbWUiLCJTaGFyZUV4dGVuc2lvbk92ZXJyaWRlIiwiYWRhcHRTaGFyZU1ldGFkYXRhIiwib1NoYXJlTWV0YWRhdGEiLCJiYXNlIiwib1VJTW9kZWwiLCJnZXRQcm9wZXJ0eSIsImdldENvbnRyb2xsZXIiLCJvUGFnZVRpdGxlSW5mbyIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9EYXRhIiwic1RpdGxlIiwidGl0bGUiLCJzT2JqZWN0U3VidGl0bGUiLCJzdWJ0aXRsZSIsInRvU3RyaW5nIiwidGlsZSIsImVtYWlsIiwiamFtIiwidXJsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBT0EsTUFBSUEsa0JBQUo7O0FBRUEsV0FBU0MsZ0NBQVQsQ0FBMENDLFVBQTFDLEVBQTJEQyxzQkFBM0QsRUFBd0Y7QUFDdkYsUUFBTUMsS0FBSyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWUosVUFBWixDQUFkO0FBRUEsUUFBTUssUUFBUSxHQUFHSCxLQUFLLENBQUNJLEdBQU4sQ0FBVSxVQUFVQyxJQUFWLEVBQXdCO0FBQ2xELFVBQU1DLE1BQU0sR0FBR1IsVUFBVSxDQUFDTyxJQUFELENBQXpCOztBQUNBLFVBQUlDLE1BQU0sS0FBS0MsU0FBZixFQUEwQjtBQUN6QixlQUFPLElBQUlDLE1BQUosQ0FBV0gsSUFBWCxFQUFpQkksY0FBYyxDQUFDQyxFQUFoQyxFQUFvQ0osTUFBcEMsQ0FBUDtBQUNBO0FBQ0QsS0FMZ0IsQ0FBakI7O0FBT0EsUUFBSVAsc0JBQUosRUFBNEI7QUFDM0IsVUFBTVksYUFBYSxHQUFHLElBQUlILE1BQUosQ0FBVztBQUNoQ0ksUUFBQUEsT0FBTyxFQUFFLENBQUMsSUFBSUosTUFBSixDQUFXLDhCQUFYLEVBQTJDQyxjQUFjLENBQUNDLEVBQTFELEVBQThELElBQTlELENBQUQsQ0FEdUI7QUFFaENHLFFBQUFBLEdBQUcsRUFBRTtBQUYyQixPQUFYLENBQXRCO0FBS0FWLE1BQUFBLFFBQVEsQ0FBQ1csSUFBVCxDQUFjSCxhQUFkO0FBQ0E7O0FBRUQsUUFBTUksZUFBZSxHQUFH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Q0EsY0FBSUYsZUFBSixFQUFxQjtBQUNwQkYsWUFBQUEsTUFBTSxHQUFHQSxNQUFNLEdBQUcsS0FBVCxHQUFpQkUsZUFBMUI7QUFDQTs7QUFDRFYsVUFBQUEsY0FBYyxDQUFDYSxJQUFmLEdBQXNCO0FBQ3JCSixZQUFBQSxLQUFLLEVBQUVKLGNBQWMsQ0FBQ0ksS0FERDtBQUVyQkUsWUFBQUEsUUFBUSxFQUFFTixjQUFjLENBQUNNLFFBQWYsQ0FBd0JDLFFBQXhCO0FBRlcsV0FBdEI7QUFJQVosVUFBQUEsY0FBYyxDQUFDYyxLQUFmLENBQXFCTCxLQUFyQixHQUE2QkQsTUFBN0I7QUFDQVIsVUFBQUEsY0FBYyxDQUFDUyxLQUFmLEdBQXVCRCxNQUF2QjtBQUNBUixVQUFBQSxjQUFjLENBQUNlLEdBQWYsQ0FBbUJDLEdBQW5CLEdBQXlCVCxLQUFLLENBQUMsQ0FBRCxDQUE5QjtBQUNBUCxVQUFBQSxjQUFjLENBQUNnQixHQUFmLEdBQXFCVCxLQUFLLENBQUMsQ0FBRCxDQUExQjtBQUNBUCxVQUFBQSxjQUFjLENBQUNjLEtBQWYsQ0FBcUJFLEdBQXJCLEdBQTJCVCxLQUFLLENBQUMsQ0FBRCxDQUFoQztBQUVBLGlCQUFPUCxjQUFQO0FBQ0EsU0F0QkssRUF1Qkw5QyxLQXZCSyxDQXVCQyxVQUFVaUMsS0FBVixFQUFzQjtBQUM1Qi9CLFVBQUFBLEdBQUcsQ0FBQytCLEtBQUosQ0FBVUEsS0FBVjtBQUNBLFNBekJLLENBQVA7QUEwQkEsT0E3Qk0sQ0FBUDtBQThCQTtBQW5DNkIsR0FBL0I7U0FzQ2VXLHNCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgT2JqZWN0UGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9PYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyXCI7XG5pbXBvcnQgSGFzaENoYW5nZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvSGFzaENoYW5nZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5cbmxldCBiSXNTdGlja3lTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlclRvRmV0Y2hBY3RpdmVDb250ZXh0KG1LZXlWYWx1ZXM6IGFueSwgYklzQWN0aXZlRW50aXR5RGVmaW5lZDogYW55KSB7XG5cdGNvbnN0IGFLZXlzID0gT2JqZWN0LmtleXMobUtleVZhbHVlcyk7XG5cblx0Y29uc3QgYUZpbHRlcnMgPSBhS2V5cy5tYXAoZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IHNWYWx1ZSA9IG1LZXlWYWx1ZXNbc0tleV07XG5cdFx0aWYgKHNWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbmV3IEZpbHRlcihzS2V5LCBGaWx0ZXJPcGVyYXRvci5FUSwgc1ZhbHVlKTtcblx0XHR9XG5cdH0pO1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHlEZWZpbmVkKSB7XG5cdFx0Y29uc3Qgb0FjdGl2ZUZpbHRlciA9IG5ldyBGaWx0ZXIoe1xuXHRcdFx0ZmlsdGVyczogW25ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIEZpbHRlck9wZXJhdG9yLkVRLCB0cnVlKV0sXG5cdFx0XHRhbmQ6IGZhbHNlXG5cdFx0fSk7XG5cblx0XHRhRmlsdGVycy5wdXNoKG9BY3RpdmVGaWx0ZXIpO1xuXHR9XG5cblx0Y29uc3Qgb0NvbWJpbmVkRmlsdGVyID0gbmV3IEZpbHRlcihhRmlsdGVycyBhcyBhbnksIHRydWUpO1xuXHRyZXR1cm4gb0NvbWJpbmVkRmlsdGVyO1xufVxuZnVuY3Rpb24gZ2V0QWN0aXZlQ29udGV4dFBhdGgob0NvbnRyb2xsZXI6IGFueSwgc1BhZ2VFbnRpdHlOYW1lOiBhbnksIG9GaWx0ZXI6IGFueSkge1xuXHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvQ29udHJvbGxlclxuXHRcdC5nZXRWaWV3KClcblx0XHQuZ2V0QmluZGluZ0NvbnRleHQoKVxuXHRcdC5nZXRNb2RlbCgpXG5cdFx0LmJpbmRMaXN0KFwiL1wiICsgc1BhZ2VFbnRpdHlOYW1lLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwgeyBcIiQkZ3JvdXBJZFwiOiBcIiRhdXRvLkhlcm9lc1wiIH0pO1xuXHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKS50aGVuKGZ1bmN0aW9uIChvQ29udGV4dHM6IGFueSkge1xuXHRcdGlmIChvQ29udGV4dHMgJiYgb0NvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0c1swXS5nZXRQYXRoKCk7XG5cdFx0fVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldEFjdGl2ZUNvbnRleHRJbnN0YW5jZXMob0NvbnRleHQ6IGFueSwgb0NvbnRyb2xsZXI6IGFueSwgb0VudGl0eVNldDogYW55KSB7XG5cdGNvbnN0IGFBY3RpdmVDb250ZXh0cHJvbWlzZXM6IGFueVtdID0gW107XG5cdGNvbnN0IGFQYWdlczogYW55W10gPSBbXTtcblx0bGV0IHNNZXRhUGF0aCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0aWYgKHNNZXRhUGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdHNNZXRhUGF0aCA9IHNNZXRhUGF0aC5zdWJzdHJpbmcoMSk7XG5cdH1cblx0Y29uc3QgYU1ldGFQYXRoQXJyYXkgPSBzTWV0YVBhdGguc3BsaXQoXCIvXCIpO1xuXHRjb25zdCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpLnNwbGl0KFwiP1wiKVswXTtcblx0Y29uc3QgYUN1cnJlbnRIYXNoQXJyYXkgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zcGxpdChcIi9cIik7XG5cblx0Ly8gb1BhZ2VNYXAgLSBjcmVhdGluZyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBtYXAgb2YgbWV0YXBhdGggbmFtZSBhbmQgaXQncyB0ZWNobmljYWwgZGV0YWlsc1xuXHQvLyB3aGljaCBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBmaWx0ZXIgdG8gZmV0Y2ggdGhlIHJlbGF2YW50L2NvcnJlY3QgYWN0aXZlIGNvbnRleHRcblx0Ly8gRXhhbXBsZToge1NhbGVzT3JkZXJNYW5hZ2U6e3RlY2huaWNhbElEOnRlY2huaWNhbElEVmFsdWV9LCBfSXRlbTp7dGVjaG5pY2FsSUQ6dGVjaG5pY2FsSURWYWx1ZX19IGV0Yy4sXG5cdGNvbnN0IG9QYWdlTWFwOiBhbnkgPSB7fTtcblx0Y29uc3QgYVBhZ2VIYXNoQXJyYXk6IGFueVtdID0gW107XG5cdGFDdXJyZW50SGFzaEFycmF5LmZvckVhY2goZnVuY3Rpb24gKHNQYWdlSGFzaDogYW55KSB7XG5cdFx0Y29uc3QgYUtleVZhbHVlcyA9IHNQYWdlSGFzaC5zdWJzdHJpbmcoc1BhZ2VIYXNoLmluZGV4T2YoXCIoXCIpICsgMSwgc1BhZ2VIYXNoLmxlbmd0aCAtIDEpLnNwbGl0KFwiLFwiKTtcblx0XHRjb25zdCBtS2V5VmFsdWVzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBzUGFnZUhhc2hOYW1lID0gc1BhZ2VIYXNoLnNwbGl0KFwiKFwiKVswXTtcblx0XHRvUGFnZU1hcFtzUGFnZUhhc2hOYW1lXSA9IHt9O1xuXHRcdGFQYWdlSGFzaEFycmF5LnB1c2goc1BhZ2VIYXNoTmFtZSk7XG5cdFx0b1BhZ2VNYXBbc1BhZ2VIYXNoTmFtZV1bXCJiSXNBY3RpdmVFbnRpdHlEZWZpbmVkXCJdID0gdHJ1ZTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFLZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNLZXlBc3NpZ25tZW50ID0gYUtleVZhbHVlc1tpXTtcblx0XHRcdGNvbnN0IGFQYXJ0cyA9IHNLZXlBc3NpZ25tZW50LnNwbGl0KFwiPVwiKTtcblx0XHRcdGxldCBzS2V5VmFsdWUgPSBhUGFydHNbMV07XG5cdFx0XHRsZXQgc0tleSA9IGFQYXJ0c1swXTtcblx0XHRcdC8vIEluIGNhc2UgaWYgb25seSBvbmUgdGVjaG5pY2FsIGtleSBpcyBkZWZpbmVkIHRoZW4gdGhlIHVybCBqdXN0IGNvbnRhaW5zIHRoZSB0ZWNobmljYWxJRFZhbHVlIGJ1dCBub3QgdGhlIHRlY2huaWNhbElEXG5cdFx0XHQvLyBFeGFtcGxlOiBTYWxlc09yZGVyTWFuYWdlKElEPTExMTExMTI5LWFhYWEtYmJiYi1jY2NjLWRkZGRlZWVlZmZmZixJc0FjdGl2ZUVudGl0eT1mYWxzZSkvX0l0ZW0oMTExMTExMjktYWFhYS1iYmJiLWNjY2MtZGRkZGVlZWVmZmZmKVxuXHRcdFx0Ly8gSW4gYWJvdmUgZXhhbXBsZSBTYWxlc09yZGVySXRlbSBoYXMgb25seSBvbmUgdGVjaG5pY2FsIGtleSBkZWZpbmVkLCBoZW5jZSB0ZWNobmljYWxJRCBpbmZvIGlzIG5vdCBwcmVzZW50IGluIHRoZSB1cmxcblx0XHRcdC8vIEhlbmNlIGluIHN1Y2ggY2FzZXMgd2UgZ2V0IHRlY2huaWNhbCBrZXkgYW5kIHVzZSB0aGVtIHRvIGZldGNoIGFjdGl2ZSBjb250ZXh0XG5cdFx0XHRpZiAoc0tleUFzc2lnbm1lbnQuaW5kZXhPZihcIj1cIikgPT09IC0xKSB7XG5cdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBhVGVjaG5pY2FsS2V5cyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgYVBhZ2VIYXNoQXJyYXkuam9pbihcIi9cIikgKyBcIi8kVHlwZS8kS2V5XCIpO1xuXHRcdFx0XHRzS2V5VmFsdWUgPSBhUGFydHNbMF07XG5cdFx0XHRcdHNLZXkgPSBhVGVjaG5pY2FsS2V5c1swXTtcblx0XHRcdFx0b1BhZ2VNYXBbc1BhZ2VIYXNoLnNwbGl0KFwiKFwiKVswXV1bXCJiSXNBY3RpdmVFbnRpdHlEZWZpbmVkXCJdID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzS2V5ICE9PSBcIklzQWN0aXZlRW50aXR5XCIpIHtcblx0XHRcdFx0aWYgKHNLZXlWYWx1ZS5pbmRleE9mKFwiJ1wiKSA9PT0gMCAmJiBzS2V5VmFsdWUubGFzdEluZGV4T2YoXCInXCIpID09PSBzS2V5VmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgcXVvdGVzIGZyb20gdGhlIHZhbHVlIGFuZCBkZWNvZGUgc3BlY2lhbCBjaGFyc1xuXHRcdFx0XHRcdHNLZXlWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChzS2V5VmFsdWUuc3Vic3RyaW5nKDEsIHNLZXlWYWx1ZS5sZW5ndGggLSAxKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bUtleVZhbHVlc1tzS2V5XSA9IHNLZXlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0b1BhZ2VNYXBbc1BhZ2VIYXNoTmFtZV0ubUtleVZhbHVlcyA9IG1LZXlWYWx1ZXM7XG5cdH0pO1xuXG5cdGxldCBvUGFnZUVudGl0eVNldCA9IG9FbnRpdHlTZXQ7XG5cdGFNZXRhUGF0aEFycmF5LmZvckVhY2goZnVuY3Rpb24gKHNOYXZpZ2F0aW9uUGF0aDogYW55KSB7XG5cdFx0Y29uc3Qgb1BhZ2VJbmZvOiBhbnkgPSB7fTtcblx0XHRjb25zdCBzUGFnZUVudGl0eVNldE5hbWUgPSBvUGFnZUVudGl0eVNldC4kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZyAmJiBvUGFnZUVudGl0eVNldC4kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tzTmF2aWdhdGlvblBhdGhdO1xuXHRcdGlmIChzUGFnZUVudGl0eVNldE5hbWUpIHtcblx0XHRcdG9QYWdlSW5mby5wYWdlRW50aXR5TmFtZSA9IG9QYWdlRW50aXR5U2V0LiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3NOYXZpZ2F0aW9uUGF0aF07XG5cdFx0XHRvUGFnZUVudGl0eVNldCA9XG5cdFx0XHRcdG9Db250ZXh0XG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiL1wiICsgc1BhZ2VFbnRpdHlTZXROYW1lKSB8fCBvRW50aXR5U2V0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUGFnZUluZm8ucGFnZUVudGl0eU5hbWUgPSBzTmF2aWdhdGlvblBhdGg7XG5cdFx0fVxuXHRcdG9QYWdlSW5mby5tS2V5VmFsdWVzID0gb1BhZ2VNYXBbc05hdmlnYXRpb25QYXRoXS5tS2V5VmFsdWVzO1xuXHRcdG9QYWdlSW5mby5iSXNBY3RpdmVFbnRpdHlEZWZpbmVkID0gb1BhZ2VNYXBbc05hdmlnYXRpb25QYXRoXS5iSXNBY3RpdmVFbnRpdHlEZWZpbmVkO1xuXHRcdGFQYWdlcy5wdXNoKG9QYWdlSW5mbyk7XG5cdH0pO1xuXG5cdGFQYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChvUGFnZUluZm86IGFueSkge1xuXHRcdGNvbnN0IG9GaWx0ZXIgPSBjcmVhdGVGaWx0ZXJUb0ZldGNoQWN0aXZlQ29udGV4dChvUGFnZUluZm8ubUtleVZhbHVlcywgb1BhZ2VJbmZvLmJJc0FjdGl2ZUVudGl0eURlZmluZWQpO1xuXHRcdGFBY3RpdmVDb250ZXh0cHJvbWlzZXMucHVzaChnZXRBY3RpdmVDb250ZXh0UGF0aChvQ29udHJvbGxlciwgb1BhZ2VJbmZvLnBhZ2VFbnRpdHlOYW1lLCBvRmlsdGVyKSk7XG5cdH0pO1xuXG5cdHJldHVybiBhQWN0aXZlQ29udGV4dHByb21pc2VzO1xufVxuXG4vKipcbiAqIE1ldGhvZCB0byBmZXRjaCBhY3RpdmUgY29udGV4dCBwYXRoJ3MuXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgUGFnZSBDb250ZXh0XG4gKiBAcGFyYW0gb0NvbnRyb2xsZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIGFjdGl2ZSBjb250ZXh0J3MgYXJlIGZldGNoZWRcbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aXZlQ29udGV4dFBhdGhzKG9Db250ZXh0OiBhbnksIG9Db250cm9sbGVyOiBhbnkpIHtcblx0Y29uc3Qgc0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKS5zcGxpdChcIj9cIilbMF07XG5cdGxldCBzUm9vdEVudGl0eU5hbWUgPSBzQ3VycmVudEhhc2hOb1BhcmFtcyAmJiBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHIoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMuaW5kZXhPZihcIihcIikpO1xuXHRpZiAoc1Jvb3RFbnRpdHlOYW1lLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0fVxuXHRjb25zdCBvRW50aXR5U2V0ID0gb0NvbnRleHRcblx0XHQuZ2V0TW9kZWwoKVxuXHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdC5nZXRPYmplY3QoXCIvXCIgKyBzUm9vdEVudGl0eU5hbWUpO1xuXHRjb25zdCBvUGFnZUNvbnRleHQgPSBvQ29udGV4dDtcblx0Y29uc3QgYUFjdGl2ZUNvbnRleHRwcm9taXNlcyA9IGdldEFjdGl2ZUNvbnRleHRJbnN0YW5jZXMob0NvbnRleHQsIG9Db250cm9sbGVyLCBvRW50aXR5U2V0KTtcblx0aWYgKGFBY3RpdmVDb250ZXh0cHJvbWlzZXMubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhQWN0aXZlQ29udGV4dHByb21pc2VzKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFEYXRhOiBhbnlbXSkge1xuXHRcdFx0XHRjb25zdCBhQWN0aXZlQ29udGV4dFBhdGhzID0gW107XG5cdFx0XHRcdGxldCBvUGFnZUVudGl0eVNldCA9IG9FbnRpdHlTZXQ7XG5cdFx0XHRcdGlmIChhRGF0YVswXS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0XHRcdGFBY3RpdmVDb250ZXh0UGF0aHMucHVzaChhRGF0YVswXS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFBY3RpdmVDb250ZXh0UGF0aHMucHVzaChhRGF0YVswXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gSW4gdGhlIGFjdGl2ZSBjb250ZXh0IHBhdGhzIGlkZW50aWZ5IGFuZCByZXBsYWNlIHRoZSBlbnRpdHlTZXQgTmFtZSB3aXRoIGNvcnJlc3BvbmRpbmcgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lXG5cdFx0XHRcdC8vIFJlcXVpcmVkIHRvIGZvcm0gdGhlIHVybCBwb2ludGluZyB0byBhY3RpdmUgY29udGV4dFxuXHRcdFx0XHQvLyBFeGFtcGxlIDogU2FsZXNPcmRlckl0ZW0gLS0+IF9JdGVtLCBNYXRlcmlhbERldGFpbHMgLS0+IF9NYXRlcmlhbERldGFpbHMgZXRjLixcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBhRGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGxldCBzQWN0aXZlQ29udGV4dFBhdGggPSBhRGF0YVtpXTtcblx0XHRcdFx0XHRsZXQgc05hdmlnYXRpb1Byb3BlcnR5ID0gXCJcIjtcblx0XHRcdFx0XHRsZXQgc0VudGl0eVNldE5hbWUgPSBzQWN0aXZlQ29udGV4dFBhdGggJiYgc0FjdGl2ZUNvbnRleHRQYXRoLnN1YnN0cigwLCBzQWN0aXZlQ29udGV4dFBhdGguaW5kZXhPZihcIihcIikpO1xuXHRcdFx0XHRcdGlmIChzRW50aXR5U2V0TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0c0VudGl0eVNldE5hbWUgPSBzRW50aXR5U2V0TmFtZS5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChzQWN0aXZlQ29udGV4dFBhdGguaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdFx0XHRcdHNBY3RpdmVDb250ZXh0UGF0aCA9IHNBY3RpdmVDb250ZXh0UGF0aC5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNOYXZpZ2F0aW9Qcm9wZXJ0eSA9IE9iamVjdC5rZXlzKG9QYWdlRW50aXR5U2V0LiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nKVtcblx0XHRcdFx0XHRcdE9iamVjdC52YWx1ZXMob1BhZ2VFbnRpdHlTZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcpLmluZGV4T2Yoc0VudGl0eVNldE5hbWUpXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRpZiAoc05hdmlnYXRpb1Byb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRhQWN0aXZlQ29udGV4dFBhdGhzLnB1c2goc0FjdGl2ZUNvbnRleHRQYXRoLnJlcGxhY2Uoc0VudGl0eVNldE5hbWUsIHNOYXZpZ2F0aW9Qcm9wZXJ0eSkpO1xuXHRcdFx0XHRcdFx0b1BhZ2VFbnRpdHlTZXQgPVxuXHRcdFx0XHRcdFx0XHRvUGFnZUNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHRcdC5nZXRPYmplY3QoXCIvXCIgKyBzRW50aXR5U2V0TmFtZSkgfHwgb0VudGl0eVNldDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YUFjdGl2ZUNvbnRleHRQYXRocy5wdXNoKHNBY3RpdmVDb250ZXh0UGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBhQWN0aXZlQ29udGV4dFBhdGhzO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmluZm8oXCJGYWlsZWQgdG8gcmV0cmlldmUgb25lIG9yIG1vcmUgYWN0aXZlIGNvbnRleHQgcGF0aCdzXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cbn1cbmZ1bmN0aW9uIGZldGNoQWN0aXZlQ29udGV4dFBhdGhzKG9Db250ZXh0OiBhbnksIG9Db250cm9sbGVyOiBhbnkpIHtcblx0bGV0IG9Qcm9taXNlLCBhU2VtYW50aWNLZXlzO1xuXHRjb25zdCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpLnNwbGl0KFwiP1wiKVswXTtcblx0aWYgKG9Db250ZXh0KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGJJc1N0aWNreVN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvTWV0YU1vZGVsKTtcblx0XHRsZXQgc1Jvb3RFbnRpdHlOYW1lID0gc0N1cnJlbnRIYXNoTm9QYXJhbXMgJiYgc0N1cnJlbnRIYXNoTm9QYXJhbXMuc3Vic3RyKDAsIHNDdXJyZW50SGFzaE5vUGFyYW1zLmluZGV4T2YoXCIoXCIpKTtcblx0XHRpZiAoc1Jvb3RFbnRpdHlOYW1lLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHRzUm9vdEVudGl0eU5hbWUgPSBzUm9vdEVudGl0eU5hbWUuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdH1cblx0Ly8gRmV0Y2ggYWN0aXZlIGNvbnRleHQgZGV0YWlscyBpbmNhc2Ugb2YgYmVsb3cgc2NlbmFyaW8ncyh3aGVyZSBwYWdlIGlzIG5vdCBzdGlja3kgc3VwcG9ydGVkKHdlIGRvIG5vdCBoYXZlIGRyYWZ0IGluc3RhbmNlKSlcblx0Ly8gMS4gSW4gY2FzZSBvZiBkcmFmdCBlbmFibGVkIE9iamVjdCBwYWdlIHdoZXJlIHNlbWFudGljIGtleSBiYXNlZCBVUkwgaXMgbm90IHBvc3NpYmxlKGxpa2Ugc2VtYW50aWMga2V5cyBhcmUgbm90IG1vZGVsZWQgaW4gdGhlIGVudGl0eSBzZXQpXG5cdC8vIDIuIEluIGNhc2Ugb2YgZHJhZnQgZW5hYmxlZCBTdWIgT2JqZWN0IFBhZ2VzICh3aGVyZSBzZW1hbnRpYyBib29rbWFya2luZyBpcyBub3Qgc3VwcG9ydGVkKVxuXHRjb25zdCBvVmlld0RhdGEgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKTtcblx0aWYgKG9Db250ZXh0ICYmICFiSXNTdGlja3lTdXBwb3J0ZWQgJiYgKChvVmlld0RhdGEudmlld0xldmVsID09PSAxICYmICFhU2VtYW50aWNLZXlzKSB8fCBvVmlld0RhdGEudmlld0xldmVsID49IDIpKSB7XG5cdFx0b1Byb21pc2UgPSBnZXRBY3RpdmVDb250ZXh0UGF0aHMob0NvbnRleHQsIG9Db250cm9sbGVyKTtcblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG59XG5cbi8vIC8qKlxuLy8gICogR2V0IHNoYXJlIFVSTC5cbi8vICAqIEBwYXJhbSBiSXNFZGl0YWJsZVxuLy8gICogQHBhcmFtIGJJc1N0aWNreVN1cHBvcnRlZFxuLy8gICogQHBhcmFtIGFBY3RpdmVDb250ZXh0UGF0aHNcbi8vICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzaGFyZSBVUkxcbi8vICAqIEBwcm90ZWN0ZWRcbi8vICAqIEBzdGF0aWNcbi8vICAqL1xuZnVuY3Rpb24gZ2V0U2hhcmVVcmwoYklzRWRpdGFibGU6IGFueSwgYklzU3RpY2t5U3VwcG9ydGVkOiBhbnksIGFBY3RpdmVDb250ZXh0UGF0aHM6IGFueSkge1xuXHRsZXQgc1NoYXJlVXJsO1xuXHRjb25zdCBzSGFzaCA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpO1xuXHRjb25zdCBzQmFzZVBhdGggPSAoSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKSBhcyBhbnkpLmhyZWZGb3JBcHBTcGVjaWZpY0hhc2hcblx0XHQ/IChIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpIGFzIGFueSkuaHJlZkZvckFwcFNwZWNpZmljSGFzaChcIlwiKVxuXHRcdDogXCJcIjtcblx0aWYgKGJJc0VkaXRhYmxlICYmICFiSXNTdGlja3lTdXBwb3J0ZWQgJiYgYUFjdGl2ZUNvbnRleHRQYXRocykge1xuXHRcdHNTaGFyZVVybCA9IHNCYXNlUGF0aCArIGFBY3RpdmVDb250ZXh0UGF0aHMuam9pbihcIi9cIik7XG5cdH0gZWxzZSB7XG5cdFx0c1NoYXJlVXJsID0gc0hhc2ggPyBzQmFzZVBhdGggKyBzSGFzaCA6IHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHR9XG5cdHJldHVybiBzU2hhcmVVcmw7XG59XG5mdW5jdGlvbiBnZXRTaGFyZUVtYWlsVXJsKCkge1xuXHRjb25zdCBvVVNoZWxsQ29udGFpbmVyID0gc2FwLnVzaGVsbCAmJiBzYXAudXNoZWxsLkNvbnRhaW5lcjtcblx0aWYgKG9VU2hlbGxDb250YWluZXIpIHtcblx0XHRyZXR1cm4gb1VTaGVsbENvbnRhaW5lclxuXHRcdFx0LmdldEZMUFVybEFzeW5jKHRydWUpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc0ZMUFVybDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBzRkxQVXJsO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoc0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ291bGQgbm90IHJldHJpZXZlIGNGTFAgVVJMIGZvciB0aGUgc2hhcmluZyBkaWFsb2cgKGRpYWxvZyB3aWxsIG5vdCBiZSBvcGVuZWQpXCIsIHNFcnJvcik7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRvY3VtZW50LlVSTCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0SmFtVXJsKGJJc0VkaXRNb2RlOiBib29sZWFuLCBiSXNTdGlja3lTdXBwb3J0ZWQ6IGFueSwgYUFjdGl2ZUNvbnRleHRQYXRoczogYW55KSB7XG5cdGxldCBzSmFtVXJsOiBzdHJpbmc7XG5cdGNvbnN0IHNIYXNoID0gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdGNvbnN0IHNCYXNlUGF0aCA9IChIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpIGFzIGFueSkuaHJlZkZvckFwcFNwZWNpZmljSGFzaFxuXHRcdD8gKEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkgYXMgYW55KS5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoKFwiXCIpXG5cdFx0OiBcIlwiO1xuXHRpZiAoYklzRWRpdE1vZGUgJiYgIWJJc1N0aWNreVN1cHBvcnRlZCAmJiBhQWN0aXZlQ29udGV4dFBhdGhzKSB7XG5cdFx0c0phbVVybCA9IHNCYXNlUGF0aCArIGFBY3RpdmVDb250ZXh0UGF0aHMuam9pbihcIi9cIik7XG5cdH0gZWxzZSB7XG5cdFx0c0phbVVybCA9IHNIYXNoID8gc0Jhc2VQYXRoICsgc0hhc2ggOiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0fVxuXHQvLyBpbiBjYXNlIHdlIGFyZSBpbiBjRkxQIHNjZW5hcmlvLCB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZ1xuXHQvLyBpbnNpZGUgYW4gaWZyYW1lLCBhbmQgdGhlcmUgZm9yIHdlIG5lZWQgdG8gZ2V0IHRoZSBjRkxQIFVSTFxuXHQvLyBhbmQgbm90ICdkb2N1bWVudC5VUkwnIHRoYXQgcmVwcmVzZW50cyB0aGUgaWZyYW1lIFVSTFxuXHRpZiAoc2FwLnVzaGVsbCAmJiBzYXAudXNoZWxsLkNvbnRhaW5lciAmJiBzYXAudXNoZWxsLkNvbnRhaW5lci5ydW5uaW5nSW5JZnJhbWUgJiYgc2FwLnVzaGVsbC5Db250YWluZXIucnVubmluZ0luSWZyYW1lKCkpIHtcblx0XHRzYXAudXNoZWxsLkNvbnRhaW5lci5nZXRGTFBVcmwodHJ1ZSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzVXJsOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHNVcmwuc3Vic3RyKDAsIHNVcmwuaW5kZXhPZihcIiNcIikpICsgc0phbVVybDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNvdWxkIG5vdCByZXRyaWV2ZSBjRkxQIFVSTCBmb3IgdGhlIHNoYXJpbmcgZGlhbG9nIChkaWFsb2cgd2lsbCBub3QgYmUgb3BlbmVkKVwiLCBzRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgc0phbVVybCk7XG5cdH1cbn1cblxuY29uc3QgU2hhcmVFeHRlbnNpb25PdmVycmlkZSA9IHtcblx0YWRhcHRTaGFyZU1ldGFkYXRhOiBmdW5jdGlvbiAodGhpczogU2hhcmUsIG9TaGFyZU1ldGFkYXRhOiBhbnkpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdG9VSU1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLFxuXHRcdFx0YklzRWRpdGFibGUgPSBvVUlNb2RlbC5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXHRcdHJldHVybiBmZXRjaEFjdGl2ZUNvbnRleHRQYXRocyhvQ29udGV4dCwgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkpLnRoZW4oKGFBY3RpdmVDb250ZXh0UGF0aHMpID0+IHtcblx0XHRcdGNvbnN0IG9QYWdlVGl0bGVJbmZvID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtcblx0XHRcdFx0Z2V0SmFtVXJsKGJJc0VkaXRhYmxlLCBiSXNTdGlja3lTdXBwb3J0ZWQsIGFBY3RpdmVDb250ZXh0UGF0aHMpLFxuXHRcdFx0XHRnZXRTaGFyZVVybChiSXNFZGl0YWJsZSwgYklzU3RpY2t5U3VwcG9ydGVkLCBhQWN0aXZlQ29udGV4dFBhdGhzKSxcblx0XHRcdFx0Z2V0U2hhcmVFbWFpbFVybCgpXG5cdFx0XHRdKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGEpIHtcblx0XHRcdFx0XHRsZXQgc1RpdGxlID0gb1BhZ2VUaXRsZUluZm8udGl0bGU7XG5cdFx0XHRcdFx0Y29uc3Qgc09iamVjdFN1YnRpdGxlID0gb1BhZ2VUaXRsZUluZm8uc3VidGl0bGUudG9TdHJpbmcoKTtcblx0XHRcdFx0XHRpZiAoc09iamVjdFN1YnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRzVGl0bGUgPSBzVGl0bGUgKyBcIiAtIFwiICsgc09iamVjdFN1YnRpdGxlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvU2hhcmVNZXRhZGF0YS50aWxlID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9QYWdlVGl0bGVJbmZvLnRpdGxlLFxuXHRcdFx0XHRcdFx0c3VidGl0bGU6IG9QYWdlVGl0bGVJbmZvLnN1YnRpdGxlLnRvU3RyaW5nKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9TaGFyZU1ldGFkYXRhLmVtYWlsLnRpdGxlID0gc1RpdGxlO1xuXHRcdFx0XHRcdG9TaGFyZU1ldGFkYXRhLnRpdGxlID0gc1RpdGxlO1xuXHRcdFx0XHRcdG9TaGFyZU1ldGFkYXRhLmphbS51cmwgPSBvRGF0YVswXTtcblx0XHRcdFx0XHRvU2hhcmVNZXRhZGF0YS51cmwgPSBvRGF0YVsxXTtcblx0XHRcdFx0XHRvU2hhcmVNZXRhZGF0YS5lbWFpbC51cmwgPSBvRGF0YVsyXTtcblxuXHRcdFx0XHRcdHJldHVybiBvU2hhcmVNZXRhZGF0YTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNoYXJlRXh0ZW5zaW9uT3ZlcnJpZGU7XG4iXX0=