@sapui5/sap.fe.core 1.97.0 → 1.99.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/package.json +5 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +6 -3
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2379
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +16 -7
  14. package/src/sap/fe/core/PageController.js +84 -119
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -807
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -155
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +64 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1579
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +560 -581
  27. package/src/sap/fe/core/actions/draft.ts +594 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -511
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1211
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +229 -260
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -23
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +82 -46
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +113 -25
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +135 -44
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +22 -9
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
  50. package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +22 -8
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
  57. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  58. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  59. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  60. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
  61. package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
  62. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  63. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
  64. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  65. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  66. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  67. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  68. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  69. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  70. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  71. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  72. package/src/sap/fe/core/converters/ConverterContext.js +14 -2
  73. package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
  74. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  75. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  76. package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
  77. package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
  78. package/src/sap/fe/core/converters/MetaModelConverter.js +67 -6
  79. package/src/sap/fe/core/converters/MetaModelConverter.ts +70 -14
  80. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  81. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  82. package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
  83. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  84. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  85. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  86. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  87. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  88. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  89. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  90. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  91. package/src/sap/fe/core/converters/controls/Common/Form.js +20 -10
  92. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -4
  93. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  94. package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
  95. package/src/sap/fe/core/converters/controls/Common/Table.js +390 -398
  96. package/src/sap/fe/core/converters/controls/Common/Table.ts +497 -484
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
  101. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  102. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  107. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  108. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  113. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  114. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  118. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  119. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  120. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  121. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  122. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  123. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  124. package/src/sap/fe/core/fpm/Component.js +3 -2
  125. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  126. package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
  127. package/src/sap/fe/core/helpers/BindingExpression.js +484 -437
  128. package/src/sap/fe/core/helpers/BindingExpression.ts +480 -463
  129. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  130. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  131. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  132. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  133. package/src/sap/fe/core/helpers/EditState.js +81 -84
  134. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  135. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  136. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  137. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  138. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  139. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  140. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  141. package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
  142. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  143. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  144. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  145. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  146. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  147. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  148. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  149. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  150. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  151. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  152. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  153. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  154. package/src/sap/fe/core/library.js +30 -3
  155. package/src/sap/fe/core/library.support.js +12 -5
  156. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  157. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  158. package/src/sap/fe/core/messagebundle.properties +61 -13
  159. package/src/sap/fe/core/messagebundle_ar.properties +33 -2
  160. package/src/sap/fe/core/messagebundle_bg.properties +33 -2
  161. package/src/sap/fe/core/messagebundle_ca.properties +33 -2
  162. package/src/sap/fe/core/messagebundle_cs.properties +34 -3
  163. package/src/sap/fe/core/messagebundle_cy.properties +33 -2
  164. package/src/sap/fe/core/messagebundle_da.properties +33 -2
  165. package/src/sap/fe/core/messagebundle_de.properties +33 -2
  166. package/src/sap/fe/core/messagebundle_el.properties +33 -2
  167. package/src/sap/fe/core/messagebundle_en.properties +32 -1
  168. package/src/sap/fe/core/messagebundle_en_GB.properties +32 -1
  169. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +36 -1
  170. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +33 -2
  171. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +33 -2
  172. package/src/sap/fe/core/messagebundle_es.properties +33 -2
  173. package/src/sap/fe/core/messagebundle_es_MX.properties +33 -2
  174. package/src/sap/fe/core/messagebundle_et.properties +33 -2
  175. package/src/sap/fe/core/messagebundle_fi.properties +34 -3
  176. package/src/sap/fe/core/messagebundle_fr.properties +38 -7
  177. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -2
  178. package/src/sap/fe/core/messagebundle_hi.properties +33 -2
  179. package/src/sap/fe/core/messagebundle_hr.properties +33 -2
  180. package/src/sap/fe/core/messagebundle_hu.properties +34 -3
  181. package/src/sap/fe/core/messagebundle_id.properties +36 -5
  182. package/src/sap/fe/core/messagebundle_it.properties +33 -2
  183. package/src/sap/fe/core/messagebundle_iw.properties +33 -2
  184. package/src/sap/fe/core/messagebundle_ja.properties +33 -2
  185. package/src/sap/fe/core/messagebundle_kk.properties +33 -2
  186. package/src/sap/fe/core/messagebundle_ko.properties +33 -2
  187. package/src/sap/fe/core/messagebundle_lt.properties +33 -2
  188. package/src/sap/fe/core/messagebundle_lv.properties +33 -2
  189. package/src/sap/fe/core/messagebundle_ms.properties +33 -2
  190. package/src/sap/fe/core/messagebundle_nl.properties +33 -2
  191. package/src/sap/fe/core/messagebundle_no.properties +33 -2
  192. package/src/sap/fe/core/messagebundle_pl.properties +33 -2
  193. package/src/sap/fe/core/messagebundle_pt.properties +34 -3
  194. package/src/sap/fe/core/messagebundle_pt_PT.properties +33 -2
  195. package/src/sap/fe/core/messagebundle_ro.properties +33 -2
  196. package/src/sap/fe/core/messagebundle_ru.properties +33 -2
  197. package/src/sap/fe/core/messagebundle_sh.properties +33 -2
  198. package/src/sap/fe/core/messagebundle_sk.properties +33 -2
  199. package/src/sap/fe/core/messagebundle_sl.properties +33 -2
  200. package/src/sap/fe/core/messagebundle_sv.properties +34 -3
  201. package/src/sap/fe/core/messagebundle_th.properties +33 -2
  202. package/src/sap/fe/core/messagebundle_tr.properties +33 -2
  203. package/src/sap/fe/core/messagebundle_uk.properties +33 -2
  204. package/src/sap/fe/core/messagebundle_vi.properties +33 -2
  205. package/src/sap/fe/core/messagebundle_zh_CN.properties +33 -2
  206. package/src/sap/fe/core/messagebundle_zh_TW.properties +33 -2
  207. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  208. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  209. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  210. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  211. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  212. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
  213. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  214. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  215. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  216. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  217. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1152
  218. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  219. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  220. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
  221. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +42 -85
  222. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +57 -100
  223. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
  224. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  225. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  226. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  227. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  228. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  229. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  230. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  231. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  232. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  233. package/src/sap/fe/core/templating/DataModelPathHelper.js +10 -48
  234. package/src/sap/fe/core/templating/DataModelPathHelper.ts +14 -46
  235. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  236. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  237. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  238. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  239. package/src/sap/fe/core/templating/FilterHelper.js +139 -70
  240. package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
  241. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  242. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  243. package/src/sap/fe/core/templating/UIFormatters.js +45 -110
  244. package/src/sap/fe/core/templating/UIFormatters.ts +39 -75
  245. package/src/sap/fe/core/type/Email.js +1 -1
  246. package/src/sap/fe/core/type/Email.ts +4 -6
  247. package/ui5.yaml +0 -3
  248. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  249. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -1,227 +1,231 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 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([], function() {
6
- "use strict";
7
-
8
- /* This class contains helpers to be used at runtime to retrieve further information on the model */
9
-
10
- var ModelHelper = {
11
- /**
12
- * Method to determine if the programming model is sticky.
13
- *
14
- * @function
15
- * @name isStickySessionSupported
16
- * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel to check for sticky enabled entity
17
- * @returns {boolean} Returns true if sticky, else false
18
- */
19
- isStickySessionSupported: function(oMetaModel) {
20
- var oEntityContainer = oMetaModel.getObject("/");
21
- for (var sEntitySet in oEntityContainer) {
22
- if (
23
- oEntityContainer[sEntitySet].$kind === "EntitySet" &&
24
- oMetaModel.getObject("/" + sEntitySet + "@com.sap.vocabularies.Session.v1.StickySessionSupported")
25
- ) {
26
- return true;
27
- }
28
- }
29
- return false;
30
- },
31
-
32
- /**
33
- * Method to determine if the programming model is draft.
34
- *
35
- * @function
36
- * @name isDraftSupported
37
- * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel of the context for which draft support shall be checked
38
- * @param {string} sPath Path for which draft support shall be checked
39
- * @returns {boolean} Returns true if draft, else false
40
- */
41
- isDraftSupported: function(oMetaModel, sPath) {
42
- var oMetaContext = oMetaModel.getMetaContext(sPath),
43
- sTargetEntitySet = this.getTargetEntitySet(oMetaContext),
44
- oParentEntitySetContext,
45
- aParts;
46
-
47
- if (oMetaContext.getProperty && oMetaContext.getProperty() && oMetaContext.getProperty().$ContainsTarget === true) {
48
- aParts = oMetaModel
49
- .getMetaPath(sPath)
50
- .split("/")
51
- .filter(Boolean);
52
- if (aParts.length) {
53
- for (var i = aParts.length - 1; i >= 0; i--) {
54
- oParentEntitySetContext = oMetaModel.getMetaContext(oMetaModel.getMetaPath("/" + aParts[i]));
55
- if (oParentEntitySetContext.getObject("$kind") === "EntitySet") {
56
- sTargetEntitySet = this.getTargetEntitySet(oParentEntitySetContext);
57
- break;
58
- }
59
- }
60
- }
61
- } else {
62
- sTargetEntitySet = this.getTargetEntitySet(oMetaContext);
63
- }
64
- var oEntityContext = oMetaModel.getMetaContext(sTargetEntitySet);
65
- if (
66
- oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftRoot") ||
67
- oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftNode")
68
- ) {
69
- return true;
70
- }
71
- return false;
72
- },
73
-
74
- /**
75
- * Returns path to the target entity set via using navigation property binding.
76
- *
77
- * @function
78
- * @name getTargetEntitySet
79
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the target entity set shall be determined
80
- * @returns {string} Returns path to the target entity set
81
- */
82
- getTargetEntitySet: function(oContext) {
83
- var sPath = oContext.getPath();
84
- if (
85
- oContext.getObject("$kind") === "EntitySet" ||
86
- oContext.getObject("$kind") === "Action" ||
87
- oContext.getObject("0/$kind") === "Action"
88
- ) {
89
- return sPath;
90
- }
91
- var sEntitySetPath = ModelHelper.getEntitySetPath(sPath);
92
- return "/" + oContext.getObject(sEntitySetPath);
93
- },
94
-
95
- /**
96
- * Returns complete path to the entity set via using navigation property binding.
97
- *
98
- * @function
99
- * @name getEntitySetPath
100
- * @param {string} sPath Path for which complete entitySet path needs to be determined
101
- * @returns {string} Returns complete path to the entity set
102
- */
103
- getEntitySetPath: function(sPath) {
104
- return (
105
- "/" +
106
- sPath
107
- .split("/")
108
- .filter(ModelHelper.filterOutNavPropBinding)
109
- .join("/$NavigationPropertyBinding/")
110
- );
111
- },
112
-
113
- /**
114
- * Gets the path for the items property of MultiValueField parameters.
115
- *
116
- * @function
117
- * @name getActionParameterItemsModelPath
118
- * @param {object} oParameter Action Parameter
119
- * @returns {string} Returns the complete model path for the items property of MultiValueField parameters
120
- */
121
- getActionParameterItemsModelPath: function(oParameter) {
122
- return oParameter && oParameter.$Name ? "{path: 'mvfview>/" + oParameter.$Name + "'}" : undefined;
123
- },
124
-
125
- filterOutNavPropBinding: function(sPathPart) {
126
- return sPathPart !== "" && sPathPart !== "$NavigationPropertyBinding";
127
- },
128
-
129
- /**
130
- * Adds a setProperty to the created binding contexts of the internal JSON model.
131
- *
132
- * @function
133
- * @name enhanceInternalJSONModel
134
- * @param {sap.ui.model.json.JSONModel} Internal JSON Model which is enhanced
135
- */
136
-
137
- enhanceInternalJSONModel: function(oInternalModel) {
138
- var fnBindContext = oInternalModel.bindContext;
139
- oInternalModel.bindContext = function(sPath, oContext, mParameters) {
140
- var oContext = fnBindContext.apply(this, arguments);
141
- var fnGetBoundContext = oContext.getBoundContext;
142
-
143
- oContext.getBoundContext = function() {
144
- var oBoundContext = fnGetBoundContext.apply(this, arguments);
145
- if (oBoundContext && !oBoundContext.setProperty) {
146
- oBoundContext.setProperty = function(sPath, value) {
147
- if (this.getObject() === undefined) {
148
- // initialize
149
- this.getModel().setProperty(this.getPath(), {});
150
- }
151
- this.getModel().setProperty(sPath, value, this);
152
- };
153
- }
154
- return oBoundContext;
155
- };
156
- return oContext;
157
- };
158
- },
159
-
160
- /**
161
- * Returns whether filtering on the table is case sensitive.
162
- *
163
- * @param oMetaModel The instance of the meta model
164
- * @returns {boolean|undefined} Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
165
- */
166
- isFilteringCaseSensitive: function(oMetaModel) {
167
- if (!oMetaModel) {
168
- return undefined;
169
- }
170
- var aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions");
171
- // Get filter functions defined at EntityContainer and check for existence of 'tolower'
172
- return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
173
- },
174
-
175
- /**
176
- * Get MetaPath for the context.
177
- *
178
- * @param {Context} oContext Context to be used
179
- * @returns {string | undefined} Returns meta path for the context.
180
- */
181
- getMetaPathForContext: function(oContext) {
182
- var oModel = oContext.getModel(),
183
- oMetaModel = oModel.getMetaModel(),
184
- sPath = oContext.getPath();
185
- return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
186
- },
187
-
188
- /**
189
- * Get MetaPath for the listbinding.
190
- *
191
- * @param {View} oView View of the control using listBinding
192
- * @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
193
- * @returns {string | undefined} Returns meta path for the listbinding.
194
- */
195
- getAbsoluteMetaPathForListBinding: function(oView, vListBinding) {
196
- var oMetaModel = oView.getModel().getMetaModel();
197
- var sMetaPath;
198
-
199
- if (typeof vListBinding === "string") {
200
- if (vListBinding.startsWith("/")) {
201
- // absolute path
202
- sMetaPath = oMetaModel.getMetaPath(vListBinding);
203
- } else {
204
- // relative path
205
- var oBindingContext = oView.getBindingContext();
206
- var sRootContextPath = oBindingContext.getPath();
207
- sMetaPath = oMetaModel.getMetaPath(sRootContextPath + "/" + vListBinding);
208
- }
209
- } else {
210
- // we already get a list binding use this one
211
- var oBinding = vListBinding;
212
- var oRootBinding = oBinding.getRootBinding();
213
- if (oBinding === oRootBinding) {
214
- // absolute path
215
- sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
216
- } else {
217
- // relative path
218
- var sRootBindingPath = oRootBinding.getPath();
219
- var sRelativePath = oBinding.getPath();
220
- sMetaPath = oMetaModel.getMetaPath(sRootBindingPath + "/" + sRelativePath);
221
- }
222
- }
223
- return sMetaPath;
224
- }
225
- };
226
- return ModelHelper;
227
- });
5
+ sap.ui.define([], function () {
6
+ "use strict";
7
+
8
+ /* This class contains helpers to be used at runtime to retrieve further information on the model */
9
+ var ModelHelper = {
10
+ /**
11
+ * Method to determine if the programming model is sticky.
12
+ *
13
+ * @function
14
+ * @name isStickySessionSupported
15
+ * @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel ODataModelMetaModel to check for sticky enabled entity
16
+ * @returns {boolean} Returns true if sticky, else false
17
+ */
18
+ isStickySessionSupported: function (oMetaModel) {
19
+ var oEntityContainer = oMetaModel.getObject("/");
20
+
21
+ for (var sEntitySet in oEntityContainer) {
22
+ if (oEntityContainer[sEntitySet].$kind === "EntitySet" && oMetaModel.getObject("/".concat(sEntitySet, "@com.sap.vocabularies.Session.v1.StickySessionSupported"))) {
23
+ return true;
24
+ }
25
+ }
26
+
27
+ return false;
28
+ },
29
+
30
+ /**
31
+ * Method to determine if the programming model is draft.
32
+ *
33
+ * @function
34
+ * @name isDraftSupported
35
+ * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel of the context for which draft support shall be checked
36
+ * @param {string} sPath Path for which draft support shall be checked
37
+ * @returns {boolean} Returns true if draft, else false
38
+ */
39
+ isDraftSupported: function (oMetaModel, sPath) {
40
+ var oMetaContext = oMetaModel.getMetaContext(sPath);
41
+ var sTargetEntitySet = this.getTargetEntitySet(oMetaContext),
42
+ oParentEntitySetContext,
43
+ aParts;
44
+
45
+ if (oMetaContext.getProperty && oMetaContext.getProperty() && oMetaContext.getProperty().$ContainsTarget === true) {
46
+ aParts = oMetaModel.getMetaPath(sPath).split("/").filter(Boolean);
47
+
48
+ if (aParts.length) {
49
+ for (var i = aParts.length - 1; i >= 0; i--) {
50
+ oParentEntitySetContext = oMetaModel.getMetaContext(oMetaModel.getMetaPath("/" + aParts[i]));
51
+
52
+ if (oParentEntitySetContext.getObject("$kind") === "EntitySet") {
53
+ sTargetEntitySet = this.getTargetEntitySet(oParentEntitySetContext);
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ } else {
59
+ sTargetEntitySet = this.getTargetEntitySet(oMetaContext);
60
+ }
61
+
62
+ var oEntityContext = oMetaModel.getMetaContext(sTargetEntitySet);
63
+
64
+ if (oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftRoot") || oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftNode")) {
65
+ return true;
66
+ }
67
+
68
+ return false;
69
+ },
70
+
71
+ /**
72
+ * Returns path to the target entity set via using navigation property binding.
73
+ *
74
+ * @function
75
+ * @name getTargetEntitySet
76
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the target entity set shall be determined
77
+ * @returns {string} Returns path to the target entity set
78
+ */
79
+ getTargetEntitySet: function (oContext) {
80
+ var sPath = oContext.getPath();
81
+
82
+ if (oContext.getObject("$kind") === "EntitySet" || oContext.getObject("$kind") === "Action" || oContext.getObject("0/$kind") === "Action") {
83
+ return sPath;
84
+ }
85
+
86
+ var sEntitySetPath = ModelHelper.getEntitySetPath(sPath);
87
+ return "/" + oContext.getObject(sEntitySetPath);
88
+ },
89
+
90
+ /**
91
+ * Returns complete path to the entity set via using navigation property binding.
92
+ *
93
+ * @function
94
+ * @name getEntitySetPath
95
+ * @param {string} sPath Path for which complete entitySet path needs to be determined
96
+ * @returns {string} Returns complete path to the entity set
97
+ */
98
+ getEntitySetPath: function (sPath) {
99
+ return "/" + sPath.split("/").filter(ModelHelper.filterOutNavPropBinding).join("/$NavigationPropertyBinding/");
100
+ },
101
+
102
+ /**
103
+ * Gets the path for the items property of MultiValueField parameters.
104
+ *
105
+ * @function
106
+ * @name getActionParameterItemsModelPath
107
+ * @param {object} oParameter Action Parameter
108
+ * @returns {string} Returns the complete model path for the items property of MultiValueField parameters
109
+ */
110
+ getActionParameterItemsModelPath: function (oParameter) {
111
+ return oParameter && oParameter.$Name ? "{path: 'mvfview>/".concat(oParameter.$Name, "'}") : undefined;
112
+ },
113
+ filterOutNavPropBinding: function (sPathPart) {
114
+ return sPathPart !== "" && sPathPart !== "$NavigationPropertyBinding";
115
+ },
116
+
117
+ /**
118
+ * Adds a setProperty to the created binding contexts of the internal JSON model.
119
+ *
120
+ * @function
121
+ * @name enhanceInternalJSONModel
122
+ * @param {sap.ui.model.json.JSONModel} Internal JSON Model which is enhanced
123
+ */
124
+ enhanceInternalJSONModel: function (oInternalModel) {
125
+ var fnBindContext = oInternalModel.bindContext;
126
+
127
+ oInternalModel.bindContext = function (sPath, oContext, mParameters) {
128
+ for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
129
+ args[_key - 3] = arguments[_key];
130
+ }
131
+
132
+ oContext = fnBindContext.apply(this, [sPath, oContext, mParameters].concat(args));
133
+ var fnGetBoundContext = oContext.getBoundContext;
134
+
135
+ oContext.getBoundContext = function () {
136
+ for (var _len2 = arguments.length, subArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
137
+ subArgs[_key2] = arguments[_key2];
138
+ }
139
+
140
+ var oBoundContext = fnGetBoundContext.apply.apply(fnGetBoundContext, [this].concat(subArgs));
141
+
142
+ if (oBoundContext && !oBoundContext.setProperty) {
143
+ oBoundContext.setProperty = function (sSetPropPath, value) {
144
+ if (this.getObject() === undefined) {
145
+ // initialize
146
+ this.getModel().setProperty(this.getPath(), {});
147
+ }
148
+
149
+ this.getModel().setProperty(sSetPropPath, value, this);
150
+ };
151
+ }
152
+
153
+ return oBoundContext;
154
+ };
155
+
156
+ return oContext;
157
+ };
158
+ },
159
+
160
+ /**
161
+ * Returns whether filtering on the table is case sensitive.
162
+ *
163
+ * @param oMetaModel The instance of the meta model
164
+ * @returns {boolean|undefined} Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
165
+ */
166
+ isFilteringCaseSensitive: function (oMetaModel) {
167
+ if (!oMetaModel) {
168
+ return undefined;
169
+ }
170
+
171
+ var aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions"); // Get filter functions defined at EntityContainer and check for existence of 'tolower'
172
+
173
+ return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
174
+ },
175
+
176
+ /**
177
+ * Get MetaPath for the context.
178
+ *
179
+ * @param {Context} oContext Context to be used
180
+ * @returns {string | undefined} Returns meta path for the context.
181
+ */
182
+ getMetaPathForContext: function (oContext) {
183
+ var oModel = oContext.getModel(),
184
+ oMetaModel = oModel.getMetaModel(),
185
+ sPath = oContext.getPath();
186
+ return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
187
+ },
188
+
189
+ /**
190
+ * Get MetaPath for the listbinding.
191
+ *
192
+ * @param {View} oView View of the control using listBinding
193
+ * @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
194
+ * @returns {string | undefined} Returns meta path for the listbinding.
195
+ */
196
+ getAbsoluteMetaPathForListBinding: function (oView, vListBinding) {
197
+ var oMetaModel = oView.getModel().getMetaModel();
198
+ var sMetaPath;
199
+
200
+ if (typeof vListBinding === "string") {
201
+ if (vListBinding.startsWith("/")) {
202
+ // absolute path
203
+ sMetaPath = oMetaModel.getMetaPath(vListBinding);
204
+ } else {
205
+ // relative path
206
+ var oBindingContext = oView.getBindingContext();
207
+ var sRootContextPath = oBindingContext.getPath();
208
+ sMetaPath = oMetaModel.getMetaPath("".concat(sRootContextPath, "/").concat(vListBinding));
209
+ }
210
+ } else {
211
+ // we already get a list binding use this one
212
+ var oBinding = vListBinding;
213
+ var oRootBinding = oBinding.getRootBinding();
214
+
215
+ if (oBinding === oRootBinding) {
216
+ // absolute path
217
+ sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
218
+ } else {
219
+ // relative path
220
+ var sRootBindingPath = oRootBinding.getPath();
221
+ var sRelativePath = oBinding.getPath();
222
+ sMetaPath = oMetaModel.getMetaPath("".concat(sRootBindingPath, "/").concat(sRelativePath));
223
+ }
224
+ }
225
+
226
+ return sMetaPath;
227
+ }
228
+ };
229
+ return ModelHelper;
230
+ }, false);
231
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1vZGVsSGVscGVyLnRzIl0sIm5hbWVzIjpbIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwib01ldGFNb2RlbCIsIm9FbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJzRW50aXR5U2V0IiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwic1BhdGgiLCJvTWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsInNUYXJnZXRFbnRpdHlTZXQiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJvUGFyZW50RW50aXR5U2V0Q29udGV4dCIsImFQYXJ0cyIsImdldFByb3BlcnR5IiwiJENvbnRhaW5zVGFyZ2V0IiwiZ2V0TWV0YVBhdGgiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJsZW5ndGgiLCJpIiwib0VudGl0eUNvbnRleHQiLCJvQ29udGV4dCIsImdldFBhdGgiLCJzRW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImpvaW4iLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInVuZGVmaW5lZCIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5CaW5kQ29udGV4dCIsImJpbmRDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJhcmdzIiwiYXBwbHkiLCJmbkdldEJvdW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInN1YkFyZ3MiLCJvQm91bmRDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJzU2V0UHJvcFBhdGgiLCJ2YWx1ZSIsImdldE1vZGVsIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiYUZpbHRlckZ1bmN0aW9ucyIsImluZGV4T2YiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJvTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJvVmlldyIsInZMaXN0QmluZGluZyIsInNNZXRhUGF0aCIsInN0YXJ0c1dpdGgiLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNSb290Q29udGV4dFBhdGgiLCJvQmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwic1Jvb3RCaW5kaW5nUGF0aCIsInNSZWxhdGl2ZVBhdGgiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFGQTtBQUtBLE1BQU1BLFdBQVcsR0FBRztBQUNuQjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLHdCQUF3QixFQUFFLFVBQVNDLFVBQVQsRUFBcUM7QUFDOUQsVUFBTUMsZ0JBQWdCLEdBQUdELFVBQVUsQ0FBQ0UsU0FBWCxDQUFxQixHQUFyQixDQUF6Qjs7QUFDQSxXQUFLLElBQU1DLFVBQVgsSUFBeUJGLGdCQUF6QixFQUEyQztBQUMxQyxZQUNDQSxnQkFBZ0IsQ0FBQ0UsVUFBRCxDQUFoQixDQUE2QkMsS0FBN0IsS0FBdUMsV0FBdkMsSUFDQUosVUFBVSxDQUFDRSxTQUFYLFlBQXlCQyxVQUF6Qiw2REFGRCxFQUdFO0FBQ0QsaUJBQU8sSUFBUDtBQUNBO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFQO0FBQ0EsS0FwQmtCOztBQXNCbkI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NFLElBQUFBLGdCQUFnQixFQUFFLFVBQVNMLFVBQVQsRUFBMEJNLEtBQTFCLEVBQXlDO0FBQzFELFVBQU1DLFlBQVksR0FBR1AsVUFBVSxDQUFDUSxjQUFYLENBQTBCRixLQUExQixDQUFyQjtBQUNBLFVBQUlHLGdCQUFnQixHQUFHLEtBQUtDLGtCQUFMLENBQXdCSCxZQUF4QixDQUF2QjtBQUFBLFVBQ0NJLHVCQUREO0FBQUEsVUFFQ0MsTUFGRDs7QUFJQSxVQUFJTCxZQUFZLENBQUNNLFdBQWIsSUFBNEJOLFlBQVksQ0FBQ00sV0FB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eUMsWUFBdkIsQ0FBWjtBQUNBLFNBSEQsTUFHTztBQUNOO0FBQ0EsY0FBTUcsZUFBZSxHQUFHSixLQUFLLENBQUNLLGlCQUFOLEVBQXhCO0FBQ0EsY0FBTUMsZ0JBQWdCLEdBQUdGLGVBQWUsQ0FBQ3BDLE9BQWhCLEVBQXpCO0FBQ0FrQyxVQUFBQSxTQUFTLEdBQUd6RCxVQUFVLENBQUNlLFdBQVgsV0FBMEI4QyxnQkFBMUIsY0FBOENMLFlBQTlDLEVBQVo7QUFDQTtBQUNELE9BVkQsTUFVTztBQUNOO0FBQ0EsWUFBTU0sUUFBUSxHQUFHTixZQUFqQjtBQUNBLFlBQU1PLFlBQVksR0FBR0QsUUFBUSxDQUFDRSxjQUFULEVBQXJCOztBQUNBLFlBQUlGLFFBQVEsS0FBS0MsWUFBakIsRUFBK0I7QUFDOUI7QUFDQU4sVUFBQUEsU0FBUyxHQUFHekQsVUFBVSxDQUFDZSxXQUFYLENBQXVCK0MsUUFBUSxDQUFDdkMsT0FBVCxFQUF2QixDQUFaO0FBQ0EsU0FIRCxNQUdPO0FBQ047QUFDQSxjQUFNMEMsZ0JBQWdCLEdBQUdGLFlBQVksQ0FBQ3hDLE9BQWIsRUFBekI7QUFDQSxjQUFNMkMsYUFBYSxHQUFHSixRQUFRLENBQUN2QyxPQUFULEVBQXRCO0FBQ0FrQyxVQUFBQSxTQUFTLEdBQUd6RCxVQUFVLENBQUNlLFdBQVgsV0FBMEJrRCxnQkFBMUIsY0FBOENDLGFBQTlDLEVBQVo7QUFDQTtBQUNEOztBQUNELGFBQU9ULFNBQVA7QUFDQTtBQXROa0IsR0FBcEI7U0E2TmUzRCxXIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBhdCBydW50aW1lIHRvIHJldHJpZXZlIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1vZGVsICovXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBCYXNlQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5cbmNvbnN0IE1vZGVsSGVscGVyID0ge1xuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgdG8gY2hlY2sgZm9yIHN0aWNreSBlbmFibGVkIGVudGl0eVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHN0aWNreSwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkOiBmdW5jdGlvbihvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCkge1xuXHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0Zm9yIChjb25zdCBzRW50aXR5U2V0IGluIG9FbnRpdHlDb250YWluZXIpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c0VudGl0eVNldH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBkcmFmdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGlzRHJhZnRTdXBwb3J0ZWRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuTWV0YU1vZGVsfSBvTWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgb2YgdGhlIGNvbnRleHQgZm9yIHdoaWNoIGRyYWZ0IHN1cHBvcnQgc2hhbGwgYmUgY2hlY2tlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggUGF0aCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgZHJhZnQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uKG9NZXRhTW9kZWw6IGFueSwgc1BhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IG9NZXRhQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoc1BhdGgpO1xuXHRcdGxldCBzVGFyZ2V0RW50aXR5U2V0ID0gdGhpcy5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFDb250ZXh0KSxcblx0XHRcdG9QYXJlbnRFbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0YVBhcnRzO1xuXG5cdFx0aWYgKG9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eSAmJiBvTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoKSAmJiBvTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoKS4kQ29udGFpbnNUYXJnZXQgPT09IHRydWUpIHtcblx0XHRcdGFQYXJ0cyA9IG9NZXRhTW9kZWxcblx0XHRcdFx0LmdldE1ldGFQYXRoKHNQYXRoKVxuXHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5maWx0ZXIoQm9vbGVhbik7XG5cdFx0XHRpZiAoYVBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gYVBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRcdFx0b1BhcmVudEVudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoXCIvXCIgKyBhUGFydHNbaV0pKTtcblx0XHRcdFx0XHRpZiAob1BhcmVudEVudGl0eVNldENvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIpIHtcblx0XHRcdFx0XHRcdHNUYXJnZXRFbnRpdHlTZXQgPSB0aGlzLmdldFRhcmdldEVudGl0eVNldChvUGFyZW50RW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c1RhcmdldEVudGl0eVNldCA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhQ29udGV4dCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9FbnRpdHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzVGFyZ2V0RW50aXR5U2V0KTtcblx0XHRpZiAoXG5cdFx0XHRvRW50aXR5Q29udGV4dC5nZXRPYmplY3QoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKSB8fFxuXHRcdFx0b0VudGl0eUNvbnRleHQuZ2V0T2JqZWN0KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIilcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFRhcmdldEVudGl0eVNldFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgc2hhbGwgYmUgZGV0ZXJtaW5lZFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0aWYgKFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIgfHxcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkFjdGlvblwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIwLyRraW5kXCIpID09PSBcIkFjdGlvblwiXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzUGF0aCk7XG5cdFx0cmV0dXJuIFwiL1wiICsgb0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBjb21wbGV0ZSBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0IHZpYSB1c2luZyBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlTZXRQYXRoXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBQYXRoIGZvciB3aGljaCBjb21wbGV0ZSBlbnRpdHlTZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiAoXG5cdFx0XHRcIi9cIiArXG5cdFx0XHRzUGF0aFxuXHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpXG5cdFx0XHRcdC5qb2luKFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUGFyYW1ldGVyIEFjdGlvbiBQYXJhbWV0ZXJcblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcGxldGUgbW9kZWwgcGF0aCBmb3IgdGhlIGl0ZW1zIHByb3BlcnR5IG9mIE11bHRpVmFsdWVGaWVsZCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aDogZnVuY3Rpb24ob1BhcmFtZXRlcjogYW55KSB7XG5cdFx0cmV0dXJuIG9QYXJhbWV0ZXIgJiYgb1BhcmFtZXRlci4kTmFtZSA/IGB7cGF0aDogJ212ZnZpZXc+LyR7b1BhcmFtZXRlci4kTmFtZX0nfWAgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0ZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmc6IGZ1bmN0aW9uKHNQYXRoUGFydDogYW55KSB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBlbmhhbmNlSW50ZXJuYWxKU09OTW9kZWxcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwuanNvbi5KU09OTW9kZWx9IEludGVybmFsIEpTT04gTW9kZWwgd2hpY2ggaXMgZW5oYW5jZWRcblx0ICovXG5cblx0ZW5oYW5jZUludGVybmFsSlNPTk1vZGVsOiBmdW5jdGlvbihvSW50ZXJuYWxNb2RlbDogYW55KSB7XG5cdFx0Y29uc3QgZm5CaW5kQ29udGV4dCA9IG9JbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0ID0gZnVuY3Rpb24oc1BhdGg6IGFueSwgb0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgLi4uYXJnczogYW55W10pIHtcblx0XHRcdG9Db250ZXh0ID0gZm5CaW5kQ29udGV4dC5hcHBseSh0aGlzLCBbc1BhdGgsIG9Db250ZXh0LCBtUGFyYW1ldGVycywgLi4uYXJnc10pO1xuXHRcdFx0Y29uc3QgZm5HZXRCb3VuZENvbnRleHQgPSBvQ29udGV4dC5nZXRCb3VuZENvbnRleHQ7XG5cblx0XHRcdG9Db250ZXh0LmdldEJvdW5kQ29udGV4dCA9IGZ1bmN0aW9uKC4uLnN1YkFyZ3M6IGFueVtdKSB7XG5cdFx0XHRcdGNvbnN0IG9Cb3VuZENvbnRleHQgPSBmbkdldEJvdW5kQ29udGV4dC5hcHBseSh0aGlzLCAuLi5zdWJBcmdzKTtcblx0XHRcdFx0aWYgKG9Cb3VuZENvbnRleHQgJiYgIW9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRvQm91bmRDb250ZXh0LnNldFByb3BlcnR5ID0gZnVuY3Rpb24oc1NldFByb3BQYXRoOiBhbnksIHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmdldE9iamVjdCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkodGhpcy5nZXRQYXRoKCksIHt9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShzU2V0UHJvcFBhdGgsIHZhbHVlLCB0aGlzKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvQm91bmRDb250ZXh0O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cblx0ICpcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtib29sZWFufHVuZGVmaW5lZH0gUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcblx0ICovXG5cdGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZTogZnVuY3Rpb24ob01ldGFNb2RlbDogYW55KSB7XG5cdFx0aWYgKCFvTWV0YU1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBhRmlsdGVyRnVuY3Rpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyRnVuY3Rpb25zXCIpO1xuXHRcdC8vIEdldCBmaWx0ZXIgZnVuY3Rpb25zIGRlZmluZWQgYXQgRW50aXR5Q29udGFpbmVyIGFuZCBjaGVjayBmb3IgZXhpc3RlbmNlIG9mICd0b2xvd2VyJ1xuXHRcdHJldHVybiBhRmlsdGVyRnVuY3Rpb25zID8gYUZpbHRlckZ1bmN0aW9ucy5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0NvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBSZXR1cm5zIG1ldGEgcGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqL1xuXHRnZXRNZXRhUGF0aEZvckNvbnRleHQ6IGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHJldHVybiBvTWV0YU1vZGVsICYmIHNQYXRoICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBsaXN0YmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIHtWaWV3fSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB7T0RhdGFMaXN0QmluZGluZyB8IHN0cmluZ30gdkxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBSZXR1cm5zIG1ldGEgcGF0aCBmb3IgdGhlIGxpc3RiaW5kaW5nLlxuXHQgKi9cblx0Z2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nOiBmdW5jdGlvbihvVmlldzogYW55LCB2TGlzdEJpbmRpbmc6IGFueSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3NSb290QmluZGluZ1BhdGh9LyR7c1JlbGF0aXZlUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNNZXRhUGF0aDtcblx0fVxufTtcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxNb2RlbENvbnRleHQgPSBCYXNlQ29udGV4dCAmIHtcblx0c2V0UHJvcGVydHkoc1BhdGg6IHN0cmluZywgdlZhbHVlOiBhbnkpOiB2b2lkO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTW9kZWxIZWxwZXI7XG4iXX0=