@sap/open.fe 1.98.0 → 1.99.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 (916) hide show
  1. package/package.json +1 -1
  2. package/packages/sap.fe.common/src/sap/fe/common/.library +1 -1
  3. package/packages/sap.fe.common/src/sap/fe/common/.theming +1 -1
  4. package/packages/sap.fe.common/src/sap/fe/common/MessageButton-dbg.js +10 -8
  5. package/packages/sap.fe.common/src/sap/fe/common/MessageButton.js +1 -1
  6. package/packages/sap.fe.common/src/sap/fe/common/library-dbg.js +1 -1
  7. package/packages/sap.fe.common/src/sap/fe/common/library-h2-preload.js +2 -2
  8. package/packages/sap.fe.common/src/sap/fe/common/library-preload.js +3 -3
  9. package/packages/sap.fe.common/src/sap/fe/common/library-preload.js.map +3 -3
  10. package/packages/sap.fe.common/src/sap/fe/common/library.js +1 -1
  11. package/packages/sap.fe.common/src/sap/fe/common/manifest.json +3 -3
  12. package/packages/sap.fe.common/src/sap/fe/common/resources.json +4 -4
  13. package/packages/sap.fe.common/test/sap/fe/common/designtime/api.json +1 -1
  14. package/packages/sap.fe.common/test/sap/fe/common/designtime/apiref/api.json +1 -1
  15. package/packages/sap.fe.common/test/sap/fe/common/designtime/codeassistance/Library.xmlmeta.json +1 -1
  16. package/packages/sap.fe.common/test/sap/fe/common/relnotes/changes-1.99.json +18 -0
  17. package/packages/sap.fe.core/src/sap/fe/core/.library +1 -1
  18. package/packages/sap.fe.core/src/sap/fe/core/.theming +1 -1
  19. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper-dbg.js +376 -405
  20. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.js +2 -3
  21. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.ts +385 -0
  22. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler-dbg.js +228 -181
  23. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler.js +2 -3
  24. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler.ts +171 -0
  25. package/packages/sap.fe.core/src/sap/fe/core/BusyLocker-dbg.js +104 -121
  26. package/packages/sap.fe.core/src/sap/fe/core/BusyLocker.js +2 -3
  27. package/packages/sap.fe.core/src/sap/fe/core/BusyLocker.ts +98 -0
  28. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils-dbg.js +2072 -2399
  29. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.js +2 -3
  30. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.ts +2078 -0
  31. package/packages/sap.fe.core/src/sap/fe/core/PageController-dbg.js +83 -125
  32. package/packages/sap.fe.core/src/sap/fe/core/PageController.js +2 -3
  33. package/packages/sap.fe.core/src/sap/fe/core/PageController.ts +101 -0
  34. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy-dbg.js +985 -823
  35. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.js +2 -3
  36. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.ts +838 -0
  37. package/packages/sap.fe.core/src/sap/fe/core/Synchronization-dbg.js +50 -35
  38. package/packages/sap.fe.core/src/sap/fe/core/Synchronization.js +2 -3
  39. package/packages/sap.fe.core/src/sap/fe/core/Synchronization.ts +29 -0
  40. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent-dbg.js +172 -164
  41. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent.js +2 -3
  42. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent.ts +166 -0
  43. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel-dbg.js +96 -54
  44. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.js +2 -3
  45. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.ts +63 -0
  46. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper-dbg.js +1575 -1664
  47. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.js +2 -3
  48. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.ts +1706 -0
  49. package/packages/sap.fe.core/src/sap/fe/core/actions/draft-dbg.js +558 -608
  50. package/packages/sap.fe.core/src/sap/fe/core/actions/draft.js +2 -3
  51. package/packages/sap.fe.core/src/sap/fe/core/actions/draft.ts +593 -0
  52. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling-dbg.js +544 -514
  53. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.js +2 -3
  54. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.ts +532 -0
  55. package/packages/sap.fe.core/src/sap/fe/core/actions/nonDraft-dbg.js +16 -19
  56. package/packages/sap.fe.core/src/sap/fe/core/actions/nonDraft.js +2 -3
  57. package/packages/sap.fe.core/src/sap/fe/core/actions/nonDraft.ts +12 -0
  58. package/packages/sap.fe.core/src/sap/fe/core/actions/operations-dbg.js +1073 -1215
  59. package/packages/sap.fe.core/src/sap/fe/core/actions/operations.js +2 -3
  60. package/packages/sap.fe.core/src/sap/fe/core/actions/operations.ts +1162 -0
  61. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky-dbg.js +101 -105
  62. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.js +2 -3
  63. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.ts +102 -0
  64. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +51 -209
  65. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
  66. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +276 -9
  67. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow.js +1 -1
  68. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +5 -4
  69. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  70. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +44 -43
  71. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
  72. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +2 -3
  73. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
  74. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
  75. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +98 -6
  76. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
  77. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +14 -6
  78. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler.js +1 -1
  79. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady-dbg.js +2 -2
  80. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
  81. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  82. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing-dbg.js +6 -2
  83. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing.js +1 -1
  84. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +3 -3
  85. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  86. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
  87. package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper-dbg.js +8 -20
  88. package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper.js +1 -1
  89. package/packages/sap.fe.core/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  90. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +2 -2
  91. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  92. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext-dbg.js +2 -2
  93. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.js +1 -1
  94. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.ts +4 -3
  95. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -1
  96. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
  97. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper-dbg.js +39 -26
  98. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  99. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
  100. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter-dbg.js +11 -8
  101. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  102. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
  103. package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter-dbg.js +1 -1
  104. package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  105. package/packages/sap.fe.core/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +17 -13
  106. package/packages/sap.fe.core/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  107. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Action-dbg.js +2 -2
  108. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
  109. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
  110. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +5 -3
  111. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  112. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  113. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +3 -3
  114. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  115. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  116. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form-dbg.js +4 -2
  117. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
  118. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
  119. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table-dbg.js +250 -146
  120. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  121. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
  122. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +115 -56
  123. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  124. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
  125. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +467 -32
  126. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  127. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
  128. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +6 -6
  129. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
  130. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  131. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +13 -5
  132. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  133. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  134. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +4 -1
  135. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  136. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  137. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +4 -4
  138. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  139. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  140. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +13 -6
  141. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  142. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  143. package/packages/sap.fe.core/src/sap/fe/core/formatters/CriticalityFormatter-dbg.js +1 -1
  144. package/packages/sap.fe.core/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  145. package/packages/sap.fe.core/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
  146. package/packages/sap.fe.core/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  147. package/packages/sap.fe.core/src/sap/fe/core/formatters/KPIFormatter-dbg.js +1 -1
  148. package/packages/sap.fe.core/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  149. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter-dbg.js +39 -28
  150. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  151. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  152. package/packages/sap.fe.core/src/sap/fe/core/formatters/ValueFormatter-dbg.js +1 -1
  153. package/packages/sap.fe.core/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
  154. package/packages/sap.fe.core/src/sap/fe/core/fpm/manifest.json +2 -2
  155. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
  156. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  157. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
  158. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression-dbg.js +314 -355
  159. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.js +1 -1
  160. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
  161. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport-dbg.js +27 -15
  162. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.js +1 -1
  163. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  164. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper-dbg.js +62 -59
  165. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -3
  166. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  167. package/packages/sap.fe.core/src/sap/fe/core/helpers/EditState-dbg.js +80 -84
  168. package/packages/sap.fe.core/src/sap/fe/core/helpers/EditState.js +2 -3
  169. package/packages/sap.fe.core/src/sap/fe/core/helpers/EditState.ts +81 -0
  170. package/packages/sap.fe.core/src/sap/fe/core/helpers/ExcelFormatHelper-dbg.js +61 -48
  171. package/packages/sap.fe.core/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -3
  172. package/packages/sap.fe.core/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  173. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper-dbg.js +51 -56
  174. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper.js +2 -3
  175. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  176. package/packages/sap.fe.core/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +3 -4
  177. package/packages/sap.fe.core/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  178. package/packages/sap.fe.core/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  179. package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper-dbg.js +24 -16
  180. package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  181. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper-dbg.js +228 -225
  182. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.js +2 -3
  183. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  184. package/packages/sap.fe.core/src/sap/fe/core/helpers/PasteHelper-dbg.js +209 -132
  185. package/packages/sap.fe.core/src/sap/fe/core/helpers/PasteHelper.js +2 -3
  186. package/packages/sap.fe.core/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  187. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +331 -313
  188. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.js +2 -3
  189. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  190. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +65 -67
  191. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticKeyHelper.js +2 -3
  192. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  193. package/packages/sap.fe.core/src/sap/fe/core/helpers/StableIdHelper-dbg.js +1 -5
  194. package/packages/sap.fe.core/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  195. package/packages/sap.fe.core/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  196. package/packages/sap.fe.core/src/sap/fe/core/jsx-runtime/jsx-dbg.js +1 -1
  197. package/packages/sap.fe.core/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  198. package/packages/sap.fe.core/src/sap/fe/core/library-dbg.js +1 -1
  199. package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js +23 -26
  200. package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js.map +1 -1
  201. package/packages/sap.fe.core/src/sap/fe/core/library-preload.js +630 -649
  202. package/packages/sap.fe.core/src/sap/fe/core/library-preload.js.map +3 -3
  203. package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js +17 -5
  204. package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js.map +2 -2
  205. package/packages/sap.fe.core/src/sap/fe/core/library.js +1 -1
  206. package/packages/sap.fe.core/src/sap/fe/core/manifest.json +10 -10
  207. package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +1 -1
  208. package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
  209. package/packages/sap.fe.core/src/sap/fe/core/messagebundle.properties +23 -10
  210. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ar.properties +9 -0
  211. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_bg.properties +9 -0
  212. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ca.properties +9 -0
  213. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cs.properties +10 -1
  214. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cy.properties +9 -0
  215. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_da.properties +9 -0
  216. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_de.properties +9 -0
  217. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_el.properties +9 -0
  218. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en.properties +9 -0
  219. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
  220. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
  221. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
  222. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
  223. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es.properties +9 -0
  224. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
  225. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_et.properties +9 -0
  226. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fi.properties +9 -0
  227. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr.properties +13 -4
  228. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
  229. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hi.properties +15 -6
  230. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hr.properties +15 -6
  231. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hu.properties +9 -0
  232. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_id.properties +10 -1
  233. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_it.properties +9 -0
  234. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_iw.properties +9 -0
  235. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ja.properties +9 -0
  236. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_kk.properties +15 -6
  237. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ko.properties +9 -0
  238. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lt.properties +9 -0
  239. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lv.properties +15 -6
  240. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ms.properties +14 -5
  241. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_nl.properties +9 -0
  242. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_no.properties +9 -0
  243. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pl.properties +9 -0
  244. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt.properties +9 -0
  245. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
  246. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ro.properties +9 -0
  247. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ru.properties +9 -0
  248. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sh.properties +11 -2
  249. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sk.properties +9 -0
  250. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sl.properties +15 -6
  251. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sv.properties +9 -0
  252. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_th.properties +9 -0
  253. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_tr.properties +9 -0
  254. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_uk.properties +9 -0
  255. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_vi.properties +9 -0
  256. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
  257. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
  258. package/packages/sap.fe.core/src/sap/fe/core/resources.json +427 -341
  259. package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
  260. package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  261. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +268 -202
  262. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -3
  263. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  264. package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
  265. package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  266. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +405 -300
  267. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.js +2 -3
  268. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  269. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +148 -81
  270. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -3
  271. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  272. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +986 -899
  273. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.js +2 -3
  274. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  275. package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
  276. package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
  277. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +35 -81
  278. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  279. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
  280. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +460 -487
  281. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.js +2 -3
  282. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  283. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage-dbg.controller.js +9 -8
  284. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -3
  285. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  286. package/packages/sap.fe.core/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  287. package/packages/sap.fe.core/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  288. package/packages/sap.fe.core/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  289. package/packages/sap.fe.core/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  290. package/packages/sap.fe.core/src/sap/fe/core/templating/FieldControlHelper-dbg.js +8 -8
  291. package/packages/sap.fe.core/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  292. package/packages/sap.fe.core/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  293. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper-dbg.js +138 -72
  294. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.js +1 -1
  295. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.ts +139 -71
  296. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters-dbg.js +31 -1
  297. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.js +1 -1
  298. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.ts +33 -2
  299. package/packages/sap.fe.core/src/sap/fe/core/type/Email-dbg.js +1 -1
  300. package/packages/sap.fe.core/src/sap/fe/core/type/Email.ts +4 -6
  301. package/packages/sap.fe.core/test/sap/fe/core/designtime/api.json +1 -1
  302. package/packages/sap.fe.core/test/sap/fe/core/designtime/apiref/api.json +1 -1
  303. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jsmeta.json +1 -1
  304. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jstemplates.json +1 -1
  305. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.xmlmeta.json +1 -1
  306. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/controls/FileEditor.js +15 -1
  307. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/model/MacroNavigationModel.js +90 -0
  308. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/buildingBlockOverview.md +2 -0
  309. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/Component.js +36 -0
  310. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/chartFilterBar.controller.js +5 -0
  311. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/chartFilterBar.view.xml +22 -0
  312. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/ChildEntity.json +686 -0
  313. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/CreditLimitDetails.json +154 -0
  314. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/RootEntity.json +252 -0
  315. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/service.cds +141 -0
  316. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/status.json +11 -0
  317. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/manifest.json +69 -0
  318. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chartFilterBar.html +37 -0
  319. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldFormatOptions/FieldFormatOptions.view.xml +186 -122
  320. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldFormatOptions/localService/FieldFormatOptions.cds +5 -0
  321. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldFormatOptions/localService/RootEntity.json +2 -1
  322. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/filterBar/filterBarDefault/localService/service.cds +15 -1
  323. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/filterBar/filterBarSVandAnnotationDefaults/localService/service.cds +36 -5
  324. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/Component.js +33 -0
  325. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/FormSample.view.xml +10 -0
  326. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/localService/FormSample.cds +72 -0
  327. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/localService/RootEntity.json +13 -0
  328. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/manifest.json +68 -0
  329. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/formSample.html +37 -0
  330. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/guidance/guidanceFreestyle/EntryPage.controller.js +72 -43
  331. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/guidance/guidanceFreestyle/EntryPage.controller.ts +90 -0
  332. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/guidance/guidanceFreestyle/EntryPage.view.xml +12 -3
  333. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.controller.js +4 -0
  334. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.view.xml +9 -3
  335. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/Component.js +36 -0
  336. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/TableFilterBar.controller.js +5 -0
  337. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/TableFilterBar.view.xml +11 -0
  338. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/localService/RootEntity.json +102 -0
  339. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/localService/ValueHelpEntity.js +11 -0
  340. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/localService/service.cds +94 -0
  341. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/manifest.json +79 -0
  342. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/tableFilterBar.html +37 -0
  343. package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.js +694 -0
  344. package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.ts +819 -0
  345. package/packages/sap.fe.core/test/sap/fe/core/jest/AppStateHandler.spec.js +51 -0
  346. package/packages/sap.fe.core/test/sap/fe/core/jest/AppStateHandler.spec.ts +40 -0
  347. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression-AnnotationExpression.spec.js +1 -1
  348. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression-AnnotationExpression.spec.ts +1 -1
  349. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression.spec.js +26 -15
  350. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression.spec.ts +28 -15
  351. package/packages/sap.fe.core/test/sap/fe/core/jest/CommonUtils.spec.ts +202 -0
  352. package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.js +54 -0
  353. package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.ts +35 -0
  354. package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.js +5 -11
  355. package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.ts +8 -8
  356. package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.js +736 -619
  357. package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.ts +703 -0
  358. package/packages/sap.fe.core/test/sap/fe/core/jest/__snapshots__/TemplateConverter.spec.ts.snap +89 -85
  359. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.js +102 -0
  360. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.ts +97 -0
  361. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.js +492 -0
  362. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.ts +509 -0
  363. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.js +895 -0
  364. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.ts +908 -0
  365. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.js +209 -353
  366. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.ts +222 -362
  367. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.js +508 -0
  368. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.ts +440 -0
  369. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalRouting.spec.ts +90 -0
  370. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/KPIManagement.spec.js +1 -1
  371. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/KPIManagement.spec.ts +10 -10
  372. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.js +286 -0
  373. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.ts +179 -0
  374. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.js +200 -21
  375. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.ts +168 -17
  376. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.js +40 -0
  377. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.ts +26 -0
  378. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.js +1 -1
  379. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.ts +1 -1
  380. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.js +355 -0
  381. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.ts +287 -0
  382. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.js +1 -1
  383. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.ts +1 -1
  384. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.js +542 -0
  385. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.ts +588 -0
  386. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/HeaderFacet.spec.js +1 -2
  387. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/HeaderFacet.spec.ts +1 -2
  388. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.js +371 -7
  389. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.ts +469 -6
  390. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.js +2 -2
  391. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.ts +2 -2
  392. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ObjectPageAvatar.spec.js +2 -2
  393. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ObjectPageAvatar.spec.ts +1 -1
  394. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/SubSection.spec.js +12 -8
  395. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/SubSection.spec.ts +8 -7
  396. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.js +436 -45
  397. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.ts +565 -33
  398. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.js +136 -78
  399. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.ts +315 -199
  400. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/Filter.spec.ts.snap +307 -0
  401. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/MetaModelConverter.spec.ts.snap +49 -1
  402. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/Table.spec.ts.snap +1 -0
  403. package/packages/sap.fe.core/test/sap/fe/core/jest/data/AnalyticalService.cds +51 -4
  404. package/packages/sap.fe.core/test/sap/fe/core/jest/data/AnalyticalService2.cds +107 -0
  405. package/packages/sap.fe.core/test/sap/fe/core/jest/data/ComplexType.cds +39 -0
  406. package/packages/sap.fe.core/test/sap/fe/core/jest/data/Filter.cds +187 -0
  407. package/packages/sap.fe.core/test/sap/fe/core/jest/data/MassEditHelper.cds +226 -0
  408. package/packages/sap.fe.core/test/sap/fe/core/jest/data/SideEffects.cds +1 -1
  409. package/packages/sap.fe.core/test/sap/fe/core/jest/data/computedDefaultValueService.cds +99 -0
  410. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.js +25 -5
  411. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.ts +18 -7
  412. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.js +1 -1
  413. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.ts +4 -2
  414. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/DynamicAnnotationPathHelper.spec.js +40 -0
  415. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/DynamicAnnotationPathHelper.spec.ts +39 -0
  416. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ExcelFormatHelper.spec.js +20 -0
  417. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ExcelFormatHelper.spec.ts +13 -0
  418. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/KeepAliveHelper.spec.js +1 -1
  419. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/KeepAliveHelper.spec.ts +3 -3
  420. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.js +712 -0
  421. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.ts +613 -0
  422. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.js +344 -225
  423. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.ts +347 -0
  424. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.js +439 -0
  425. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.ts +378 -0
  426. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticDateOperators.spec.js +123 -0
  427. package/packages/sap.fe.core/test/sap/fe/core/{qunit/helpers/SemanticDateOperators.qunit.js → jest/helpers/SemanticDateOperators.spec.ts} +10 -21
  428. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticKeyHelper.spec.js +215 -0
  429. package/packages/sap.fe.core/test/sap/fe/core/{qunit/helpers/SemanticKeyHelper.qunit.js → jest/helpers/SemanticKeyHelper.spec.ts} +58 -55
  430. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.js +125 -0
  431. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.ts +142 -0
  432. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/__snapshots__/MassEditHelper.spec.ts.snap +263 -0
  433. package/packages/sap.fe.core/test/sap/fe/core/jest/services/CacheHandlerTest.spec.js +871 -0
  434. package/packages/sap.fe.core/test/sap/fe/core/jest/services/CacheHandlerTest.spec.ts +899 -0
  435. package/packages/sap.fe.core/test/sap/fe/core/jest/services/NavigationServiceFactory.spec.js +46 -0
  436. package/packages/sap.fe.core/test/sap/fe/core/jest/services/NavigationServiceFactory.spec.ts +37 -0
  437. package/packages/sap.fe.core/test/sap/fe/core/jest/services/RoutingServiceFactory.spec.js +120 -3
  438. package/packages/sap.fe.core/test/sap/fe/core/jest/services/RoutingServiceFactory.spec.ts +96 -7
  439. package/packages/sap.fe.core/test/sap/fe/core/jest/services/ShellServicesFactory.spec.js +86 -0
  440. package/packages/sap.fe.core/test/sap/fe/core/jest/services/ShellServicesFactory.spec.ts +72 -0
  441. package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.js +16 -44
  442. package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.ts +22 -60
  443. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.js +4 -4
  444. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.ts +9 -3
  445. package/packages/sap.fe.core/test/sap/fe/core/jest/type/ComplexType.spec.js +68 -0
  446. package/packages/sap.fe.core/test/sap/fe/core/jest/type/ComplexType.spec.ts +51 -0
  447. package/packages/sap.fe.core/test/sap/fe/core/qunit/TemplatingExpressions.qunit.js +2 -2
  448. package/packages/sap.fe.core/test/sap/fe/core/qunit/apps/generalTests.json +0 -105
  449. package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.98.json +0 -11
  450. package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.99.json +534 -0
  451. package/packages/sap.fe.macros/src/sap/fe/macros/.library +1 -1
  452. package/packages/sap.fe.macros/src/sap/fe/macros/.theming +1 -1
  453. package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata-dbg.js +14 -5
  454. package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata.js +1 -1
  455. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI-dbg.js +15 -6
  456. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.js +1 -1
  457. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.ts +9 -1
  458. package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate-dbg.js +37 -3
  459. package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate.js +1 -1
  460. package/packages/sap.fe.macros/src/sap/fe/macros/CommonHelper-dbg.js +27 -2
  461. package/packages/sap.fe.macros/src/sap/fe/macros/CommonHelper.js +1 -1
  462. package/packages/sap.fe.macros/src/sap/fe/macros/Field.fragment.xml +4 -0
  463. package/packages/sap.fe.macros/src/sap/fe/macros/Field.metadata-dbg.js +17 -1
  464. package/packages/sap.fe.macros/src/sap/fe/macros/Field.metadata.js +1 -1
  465. package/packages/sap.fe.macros/src/sap/fe/macros/Field.metadata.ts +17 -1
  466. package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI-dbg.js +1 -1
  467. package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI.ts +35 -9
  468. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.fragment.xml +1 -1
  469. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata-dbg.js +41 -10
  470. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata.js +1 -1
  471. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI-dbg.js +1 -1
  472. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI.ts +1 -1
  473. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate-dbg.js +50 -4
  474. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate.js +1 -1
  475. package/packages/sap.fe.macros/src/sap/fe/macros/Form.fragment.xml +65 -75
  476. package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata-dbg.js +55 -51
  477. package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata.js +1 -1
  478. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI-dbg.js +83 -0
  479. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI.js +5 -0
  480. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI.ts +29 -0
  481. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.fragment.xml +11 -10
  482. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.metadata-dbg.js +2 -4
  483. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.metadata.js +1 -1
  484. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI-dbg.js +99 -0
  485. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI.js +5 -0
  486. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI.ts +32 -0
  487. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI-dbg.js +67 -7
  488. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.js +1 -1
  489. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.ts +60 -10
  490. package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil-dbg.js +26 -34
  491. package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil.js +1 -1
  492. package/packages/sap.fe.macros/src/sap/fe/macros/Table.fragment.xml +6 -6
  493. package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata-dbg.js +38 -4
  494. package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata.js +1 -1
  495. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI-dbg.js +78 -92
  496. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.js +1 -1
  497. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.ts +55 -68
  498. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper-dbg.js +41 -39
  499. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper.js +1 -1
  500. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime-dbg.js +125 -31
  501. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime.js +1 -1
  502. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating-dbg.js +16 -42
  503. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.js +1 -1
  504. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.ts +13 -39
  505. package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate-dbg.js +0 -7
  506. package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate.js +1 -1
  507. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper-dbg.js +142 -129
  508. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper.js +1 -1
  509. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils-dbg.js +120 -61
  510. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils.js +1 -1
  511. package/packages/sap.fe.macros/src/sap/fe/macros/form/AddressSection.fragment.xml +4 -4
  512. package/packages/sap.fe.macros/src/sap/fe/macros/form/DataFieldCollection.fragment.xml +3 -3
  513. package/packages/sap.fe.macros/src/sap/fe/macros/form/FormHelper-dbg.js +1 -14
  514. package/packages/sap.fe.macros/src/sap/fe/macros/form/FormHelper.js +1 -1
  515. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.fragment.xml +1 -1
  516. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata-dbg.js +23 -8
  517. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.js +1 -1
  518. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.ts +29 -17
  519. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.fragment.xml +45 -54
  520. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata-dbg.js +16 -22
  521. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata.js +1 -1
  522. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.fragment.xml +1 -1
  523. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata-dbg.js +14 -5
  524. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata.js +1 -1
  525. package/packages/sap.fe.macros/src/sap/fe/macros/internal/FilterField.fragment.xml +1 -1
  526. package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator-dbg.js +3 -2
  527. package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator.ts +4 -3
  528. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/FieldStructure.fragment.xml +1 -1
  529. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWithQuickViewForm.fragment.xml +3 -1
  530. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWrapper.fragment.xml +3 -1
  531. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ObjectIdentifier.fragment.xml +4 -145
  532. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ObjectStatus.fragment.xml +32 -8
  533. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DatePicker.fragment.xml +1 -1
  534. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DateTimePicker.fragment.xml +1 -1
  535. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/File.fragment.xml +3 -3
  536. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/Input.fragment.xml +1 -1
  537. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithUnit.fragment.xml +2 -2
  538. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithValueHelp.fragment.xml +2 -2
  539. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/TextArea.fragment.xml +1 -1
  540. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/TimePicker.fragment.xml +1 -1
  541. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/fragments/ObjectIdentifierContent.fragment.xml +81 -0
  542. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating-dbg.js +64 -30
  543. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.js +1 -1
  544. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.ts +58 -36
  545. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Formatter-dbg.js +4 -2
  546. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Formatter.js +1 -1
  547. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Formatter.ts +19 -20
  548. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime-dbg.js +2 -3
  549. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.js +1 -1
  550. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.ts +13 -5
  551. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpContent.fragment.xml +3 -1
  552. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating-dbg.js +17 -7
  553. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating.js +1 -1
  554. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating.ts +10 -3
  555. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -1
  556. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper-dbg.js +53 -62
  557. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +1 -1
  558. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListTable.fragment.xml +2 -2
  559. package/packages/sap.fe.macros/src/sap/fe/macros/library-dbg.js +1 -1
  560. package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js +16 -14
  561. package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js.map +1 -1
  562. package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js +157 -178
  563. package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js.map +4 -4
  564. package/packages/sap.fe.macros/src/sap/fe/macros/library.js +1 -1
  565. package/packages/sap.fe.macros/src/sap/fe/macros/manifest.json +9 -9
  566. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle.properties +1 -1
  567. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ar.properties +14 -6
  568. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_bg.properties +14 -6
  569. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ca.properties +14 -6
  570. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cs.properties +14 -6
  571. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cy.properties +14 -6
  572. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_da.properties +14 -6
  573. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_de.properties +14 -6
  574. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_el.properties +14 -6
  575. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en.properties +14 -6
  576. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_GB.properties +14 -6
  577. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_sappsd.properties +14 -6
  578. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +14 -6
  579. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saptrc.properties +14 -6
  580. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es.properties +14 -6
  581. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es_MX.properties +14 -6
  582. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_et.properties +14 -6
  583. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fi.properties +14 -6
  584. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr.properties +14 -6
  585. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr_CA.properties +14 -6
  586. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hi.properties +14 -6
  587. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hr.properties +14 -6
  588. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hu.properties +14 -6
  589. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_id.properties +14 -6
  590. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_it.properties +14 -6
  591. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_iw.properties +14 -6
  592. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ja.properties +14 -6
  593. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_kk.properties +14 -6
  594. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ko.properties +14 -6
  595. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lt.properties +14 -6
  596. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lv.properties +14 -6
  597. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ms.properties +14 -6
  598. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_nl.properties +14 -6
  599. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_no.properties +14 -6
  600. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pl.properties +14 -6
  601. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt.properties +14 -6
  602. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt_PT.properties +14 -6
  603. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ro.properties +14 -6
  604. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ru.properties +14 -6
  605. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sh.properties +14 -6
  606. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sk.properties +14 -6
  607. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sl.properties +16 -8
  608. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sv.properties +14 -6
  609. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_th.properties +14 -6
  610. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_tr.properties +14 -6
  611. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_uk.properties +14 -6
  612. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_vi.properties +14 -6
  613. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_CN.properties +14 -6
  614. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_TW.properties +14 -6
  615. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/MicroChartHelper-dbg.js +2 -2
  616. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/MicroChartHelper.js +1 -1
  617. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/fragments/BulletMicroChart.fragment.xml +2 -2
  618. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/fragments/ComparisonMicroChart.fragment.xml +1 -1
  619. package/packages/sap.fe.macros/src/sap/fe/macros/resources.json +277 -209
  620. package/packages/sap.fe.macros/src/sap/fe/macros/table/Actions.fragment.xml +5 -16
  621. package/packages/sap.fe.macros/src/sap/fe/macros/table/ColumnContent.fragment.xml +17 -4
  622. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper-dbg.js +0 -2
  623. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper.js +1 -1
  624. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableRuntime-dbg.js +27 -18
  625. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableRuntime.js +1 -1
  626. package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate-dbg.js +196 -139
  627. package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate.js +1 -1
  628. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/InteractiveChartHelper-dbg.js +12 -14
  629. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/InteractiveChartHelper.js +1 -1
  630. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/VisualFilterRuntime-dbg.js +13 -15
  631. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +1 -1
  632. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/api.json +113 -2
  633. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/apiref/api.json +1 -1
  634. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.jsmeta.json +1 -1
  635. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.xmlmeta.json +1 -1
  636. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.js +1 -1
  637. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.ts +1 -1
  638. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartMacro.spec.js +32 -20
  639. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartMacro.spec.ts +24 -12
  640. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CollectionField.spec.js +15 -5
  641. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CollectionField.spec.ts +18 -3
  642. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonHelper.spec.js +69 -0
  643. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonHelper.spec.ts +32 -0
  644. package/packages/sap.fe.macros/test/sap/fe/macros/jest/DatapointMacro.spec.js +6 -180
  645. package/packages/sap.fe.macros/test/sap/fe/macros/jest/DatapointMacro.spec.ts +6 -177
  646. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroWithSemanticKey.spec.js +1 -1
  647. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroWithSemanticKey.spec.ts +1 -1
  648. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterField.spec.js +1 -1
  649. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterField.spec.ts +1 -2
  650. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.js +51 -0
  651. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.ts +48 -0
  652. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterUtils.spec.js +133 -0
  653. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormContainerAPI.spec.js +34 -0
  654. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormContainerAPI.spec.ts +23 -0
  655. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormMacro.spec.js +49 -0
  656. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormMacro.spec.ts +41 -0
  657. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.js +105 -0
  658. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.ts +53 -0
  659. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroComponent.spec.js +1 -1
  660. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroComponent.spec.ts +1 -1
  661. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MicroChart.spec.js +15 -1
  662. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MicroChart.spec.ts +13 -0
  663. package/packages/sap.fe.macros/test/sap/fe/macros/jest/PhantomUtil.spec.js +1 -1
  664. package/packages/sap.fe.macros/test/sap/fe/macros/jest/PhantomUtil.spec.ts +1 -1
  665. package/packages/sap.fe.macros/test/sap/fe/macros/jest/QuickViewForm.spec.js +2 -3
  666. package/packages/sap.fe.macros/test/sap/fe/macros/jest/QuickViewForm.spec.ts +3 -4
  667. package/packages/sap.fe.macros/test/sap/fe/macros/jest/SimpleFieldMacro.spec.js +14 -4
  668. package/packages/sap.fe.macros/test/sap/fe/macros/jest/SimpleFieldMacro.spec.ts +18 -4
  669. package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.js +140 -0
  670. package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.ts +144 -0
  671. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.js +445 -635
  672. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.ts +528 -719
  673. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.js +83 -4
  674. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.ts +101 -3
  675. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ValueHelpMacro.spec.js +1 -1
  676. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ValueHelpMacro.spec.ts +1 -1
  677. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/ChartMacro.spec.ts.snap +75 -7
  678. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/CollectionField.spec.ts.snap +26 -11
  679. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/DatapointMacro.spec.ts.snap +42 -304
  680. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroDataFieldTypes.spec.ts.snap +6 -6
  681. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterBarMacro.spec.ts.snap +12 -12
  682. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterField.spec.ts.snap +3 -3
  683. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FormMacro.spec.ts.snap +150 -0
  684. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/KPITag.spec.ts.snap +4 -4
  685. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/MicroChart.spec.ts.snap +39 -3
  686. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/QuickViewForm.spec.ts.snap +4 -4
  687. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/SimpleFieldMacro.spec.ts.snap +125 -51
  688. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/Table.spec.ts.snap +1455 -0
  689. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Chart.cds +56 -1
  690. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/FieldMacroDataFieldTypes.cds +12 -59
  691. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Form.cds +129 -0
  692. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/MicroChart.cds +14 -0
  693. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Table.cds +55 -2
  694. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/simpleFieldMacro.cds +10 -4
  695. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.js +2 -2
  696. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.ts +15 -8
  697. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.js +12 -34
  698. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.ts +21 -38
  699. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/Actions.spec.js +1 -1
  700. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/Actions.spec.ts +2 -2
  701. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/__snapshots__/columnWidth.spec.ts.snap +54 -14
  702. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.js +17 -7
  703. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.ts +18 -11
  704. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/data/columnWidth.cds +26 -3
  705. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.js +145 -17
  706. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.ts +176 -18
  707. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/__snapshots__/TableDelegate.spec.ts.snap +813 -111
  708. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/data/tabledelegate.cds +9 -2
  709. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FieldHelper.qunit.js +0 -56
  710. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FieldHelperTemplate.qunit.js +0 -321
  711. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormContainerTemplating.qunit.js +1 -0
  712. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormTemplating.qunit.js +10 -5
  713. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormTemplatingTs.qunit.js +1 -1
  714. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/MicroChartHelperForTemplate.qunit.js +1 -2
  715. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/TableRuntime.qunit.js +1 -1
  716. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/ValueListHelper.qunit.js +130 -1
  717. package/packages/sap.fe.macros/test/sap/fe/macros/relnotes/changes-1.99.json +343 -0
  718. package/packages/sap.fe.navigation/src/sap/fe/navigation/.library +1 -1
  719. package/packages/sap.fe.navigation/src/sap/fe/navigation/.theming +1 -1
  720. package/packages/sap.fe.navigation/src/sap/fe/navigation/NavigationHandler-dbg.js +0 -1
  721. package/packages/sap.fe.navigation/src/sap/fe/navigation/NavigationHandler.js +1 -1
  722. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-dbg.js +1 -1
  723. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-h2-preload.js +2 -2
  724. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js +3 -3
  725. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js.map +2 -2
  726. package/packages/sap.fe.navigation/src/sap/fe/navigation/library.js +1 -1
  727. package/packages/sap.fe.navigation/src/sap/fe/navigation/manifest.json +3 -3
  728. package/packages/sap.fe.navigation/src/sap/fe/navigation/resources.json +4 -4
  729. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/api.json +1 -1
  730. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/apiref/api.json +1 -1
  731. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/codeassistance/Library.xmlmeta.json +1 -1
  732. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.library +1 -1
  733. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.theming +1 -1
  734. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-dbg.js +1 -1
  735. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-h2-preload.js +2 -2
  736. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-preload.js +2 -2
  737. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library.js +1 -1
  738. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/manifest.json +3 -3
  739. package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/api.json +1 -1
  740. package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/apiref/api.json +1 -1
  741. package/packages/sap.fe.templates/src/sap/fe/templates/.library +1 -1
  742. package/packages/sap.fe.templates/src/sap/fe/templates/.theming +1 -1
  743. package/packages/sap.fe.templates/src/sap/fe/templates/AnalyticalListPage/manifest.json +2 -2
  744. package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent-dbg.js +1 -1
  745. package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent.js +1 -1
  746. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component-dbg.js +8 -0
  747. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component.js +1 -1
  748. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ExtensionAPI-dbg.js +8 -3
  749. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ExtensionAPI.js +1 -1
  750. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReport.view.xml +11 -6
  751. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController-dbg.controller.js +114 -29
  752. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController.controller.js +1 -1
  753. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/manifest.json +2 -2
  754. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation-dbg.js +10 -10
  755. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +1 -1
  756. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/Share-dbg.js +7 -6
  757. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/Share.js +1 -1
  758. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/ViewState-dbg.js +75 -53
  759. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/ViewState.js +1 -1
  760. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/resources.json +14 -23
  761. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +8 -0
  762. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper-dbg.js +3 -3
  763. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +1 -1
  764. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component-dbg.js +1 -1
  765. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component.js +1 -1
  766. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +8 -45
  767. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController-dbg.controller.js +17 -67
  768. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1 -1
  769. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/manifest.json +2 -2
  770. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/resources.json +24 -12
  771. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating-dbg.js +1 -1
  772. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +2 -2
  773. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +5 -1
  774. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +33 -0
  775. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +17 -0
  776. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +18 -0
  777. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +3 -3
  778. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +3 -3
  779. package/packages/sap.fe.templates/src/sap/fe/templates/library-dbg.js +1 -1
  780. package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js +7 -5
  781. package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js.map +1 -1
  782. package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js +24 -22
  783. package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js.map +4 -4
  784. package/packages/sap.fe.templates/src/sap/fe/templates/library.js +1 -1
  785. package/packages/sap.fe.templates/src/sap/fe/templates/manifest.json +13 -13
  786. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle.properties +14 -30
  787. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ar.properties +24 -6
  788. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_bg.properties +24 -6
  789. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ca.properties +24 -6
  790. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cs.properties +24 -6
  791. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cy.properties +24 -6
  792. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_da.properties +24 -6
  793. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_de.properties +24 -6
  794. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_el.properties +25 -7
  795. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en.properties +24 -6
  796. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_GB.properties +24 -6
  797. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +24 -6
  798. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +24 -6
  799. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +24 -6
  800. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es.properties +24 -6
  801. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es_MX.properties +24 -6
  802. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_et.properties +24 -6
  803. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fi.properties +24 -6
  804. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr.properties +24 -6
  805. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr_CA.properties +24 -6
  806. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hi.properties +24 -6
  807. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hr.properties +25 -7
  808. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hu.properties +24 -6
  809. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_id.properties +26 -8
  810. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_it.properties +24 -6
  811. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_iw.properties +24 -6
  812. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ja.properties +24 -6
  813. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_kk.properties +24 -6
  814. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ko.properties +24 -6
  815. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lt.properties +24 -6
  816. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lv.properties +24 -6
  817. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ms.properties +24 -6
  818. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_nl.properties +24 -6
  819. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_no.properties +24 -6
  820. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pl.properties +24 -6
  821. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt.properties +27 -9
  822. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt_PT.properties +25 -7
  823. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ro.properties +24 -6
  824. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ru.properties +24 -6
  825. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sh.properties +24 -6
  826. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sk.properties +24 -6
  827. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sl.properties +24 -6
  828. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sv.properties +25 -7
  829. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_th.properties +24 -6
  830. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_tr.properties +24 -6
  831. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_uk.properties +25 -7
  832. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_vi.properties +24 -6
  833. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_CN.properties +24 -6
  834. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_TW.properties +24 -6
  835. package/packages/sap.fe.templates/src/sap/fe/templates/resources.json +127 -113
  836. package/packages/sap.fe.templates/test/sap/fe/templates/demokit/apps/itelo/webapp/manifest.json +1 -1
  837. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/api.json +1 -1
  838. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/apiref/api.json +1 -1
  839. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/codeassistance/Library.xmlmeta.json +1 -1
  840. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.js +59 -0
  841. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.ts +54 -0
  842. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.js +85 -0
  843. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.ts +89 -0
  844. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.js +482 -259
  845. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.ts +442 -0
  846. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/AnnotationHelper.spec.js +99 -0
  847. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/AnnotationHelper.spec.ts +82 -0
  848. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/Heading.spec.js +50 -0
  849. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/Heading.spec.ts +32 -0
  850. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/__snapshots__/Heading.spec.ts.snap +43 -0
  851. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/__snapshots__/Sections.spec.ts.snap +9 -7
  852. package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.js +2 -2
  853. package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.ts +4 -3
  854. package/packages/sap.fe.templates/test/sap/fe/templates/relnotes/changes-1.99.json +335 -0
  855. package/packages/sap.fe.test/src/sap/fe/test/.library +1 -1
  856. package/packages/sap.fe.test/src/sap/fe/test/.theming +1 -1
  857. package/packages/sap.fe.test/src/sap/fe/test/FeMocks-dbg.js +66 -0
  858. package/packages/sap.fe.test/src/sap/fe/test/FeMocks.js +5 -0
  859. package/packages/sap.fe.test/src/sap/fe/test/FeMocks.ts +77 -0
  860. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper-dbg.js +78 -22
  861. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.js +1 -1
  862. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.ts +66 -22
  863. package/packages/sap.fe.test/src/sap/fe/test/ObjectPage-dbg.js +6 -4
  864. package/packages/sap.fe.test/src/sap/fe/test/ObjectPage.js +1 -1
  865. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper-dbg.js +44 -21
  866. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.js +1 -1
  867. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.ts +28 -8
  868. package/packages/sap.fe.test/src/sap/fe/test/api/BaseAPI-dbg.js +1 -0
  869. package/packages/sap.fe.test/src/sap/fe/test/api/DialogAPI-dbg.js +14 -2
  870. package/packages/sap.fe.test/src/sap/fe/test/api/DialogAPI.js +1 -1
  871. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateActions-dbg.js +1 -1
  872. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateActions.js +1 -1
  873. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateAssertions-dbg.js +1 -1
  874. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
  875. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageActions-dbg.js +16 -1
  876. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageActions.js +1 -1
  877. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageAssertions-dbg.js +1 -1
  878. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageAssertions.js +1 -1
  879. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpActions-dbg.js +1 -1
  880. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpActions.js +1 -1
  881. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpAssertions-dbg.js +1 -1
  882. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpAssertions.js +1 -1
  883. package/packages/sap.fe.test/src/sap/fe/test/api/TableActions-dbg.js +0 -19
  884. package/packages/sap.fe.test/src/sap/fe/test/api/TableActions.js +1 -1
  885. package/packages/sap.fe.test/src/sap/fe/test/api/TableAssertions-dbg.js +3 -4
  886. package/packages/sap.fe.test/src/sap/fe/test/api/TableAssertions.js +1 -1
  887. package/packages/sap.fe.test/src/sap/fe/test/builder/MdcTableBuilder-dbg.js +4 -0
  888. package/packages/sap.fe.test/src/sap/fe/test/builder/MdcTableBuilder.js +1 -1
  889. package/packages/sap.fe.test/src/sap/fe/test/internal/FEJourneyRunner-dbg.js +6 -3
  890. package/packages/sap.fe.test/src/sap/fe/test/internal/FEJourneyRunner.js +1 -1
  891. package/packages/sap.fe.test/src/sap/fe/test/library-dbg.js +1 -1
  892. package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js +3 -2
  893. package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js.map +1 -1
  894. package/packages/sap.fe.test/src/sap/fe/test/library-preload.js +39 -20
  895. package/packages/sap.fe.test/src/sap/fe/test/library-preload.js.map +4 -4
  896. package/packages/sap.fe.test/src/sap/fe/test/library.js +1 -1
  897. package/packages/sap.fe.test/src/sap/fe/test/manifest.json +3 -3
  898. package/packages/sap.fe.test/src/sap/fe/test/resources.json +65 -28
  899. package/packages/sap.fe.test/test/sap/fe/test/designtime/api.json +1 -1
  900. package/packages/sap.fe.test/test/sap/fe/test/designtime/apiref/api.json +1 -1
  901. package/packages/sap.fe.test/test/sap/fe/test/designtime/codeassistance/Library.jsmeta.json +1 -1
  902. package/packages/sap.fe.test/test/sap/fe/test/designtime/codeassistance/Library.xmlmeta.json +1 -1
  903. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandling.spec.js +0 -115
  904. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandling.spec.ts +0 -95
  905. package/packages/sap.fe.core/test/sap/fe/core/qunit/helpers/ExcelFormatHelper.qunit.js +0 -19
  906. package/packages/sap.fe.core/test/sap/fe/core/qunit/helpers/StableIdHelper.qunit.js +0 -301
  907. package/packages/sap.fe.core/test/sap/fe/core/qunit/services/CacheHandlerTest.qunit.js +0 -924
  908. package/packages/sap.fe.macros/src/sap/fe/macros/formcontainer/FormContainerRuntime-dbg.js +0 -46
  909. package/packages/sap.fe.macros/src/sap/fe/macros/formcontainer/FormContainerRuntime.js +0 -6
  910. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonUtils.spec.js +0 -94
  911. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonUtils.spec.ts +0 -70
  912. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableFieldLabel.spec.js +0 -68
  913. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableFieldLabel.spec.ts +0 -65
  914. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/TableFieldLabel.spec.ts.snap +0 -607
  915. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/MassEdit-dbg.js +0 -96
  916. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/MassEdit.js +0 -6
@@ -1,826 +1,988 @@
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
- /* eslint-disable no-alert */
7
- sap.ui.define(
8
- ["sap/base/Log", "sap/ui/base/Object", "sap/ui/base/EventProvider", "sap/fe/core/Synchronization", "sap/ui/thirdparty/URI"],
9
- function(Log, BaseObject, EventProvider, Synchronization, URI) {
10
- "use strict";
11
-
12
- var enumState = {
13
- EQUAL: 0,
14
- COMPATIBLE: 1,
15
- ANCESTOR: 2,
16
- DIFFERENT: 3
17
- };
18
-
19
- var enumURLParams = {
20
- LAYOUTPARAM: "layout",
21
- IAPPSTATEPARAM: "sap-iapp-state"
22
- };
23
-
24
- /**
25
- * Creates a HashGuard object.
26
- *
27
- * @param {string} sGuardHash The hash used for the guard
28
- * @returns {object} The created hash guard
29
- */
30
- function createGuardFromHash(sGuardHash) {
31
- return {
32
- _guardHash: sGuardHash.replace(/\?[^\?]*$/, ""), // Remove query part
33
- check: function(sHash) {
34
- return sHash.indexOf(this._guardHash) === 0;
35
- }
36
- };
37
- }
38
-
39
- /**
40
- * Returns the iAppState part from a hash (or null if not found).
41
- *
42
- * @param {string} sHash The hash
43
- * @returns {string} The iAppState part of the hash
44
- */
45
- function findAppStateInHash(sHash) {
46
- var aAppState = sHash.match(new RegExp("\\?.*" + enumURLParams.IAPPSTATEPARAM + "=([^&]*)"));
47
- return aAppState && aAppState.length > 1 ? aAppState[1] : null;
48
- }
49
-
50
- /**
51
- * Returns a hash without its iAppState part.
52
- *
53
- * @param {string} sHash The hash
54
- * @returns {string} The hash without the iAppState
55
- */
56
- function removeAppStateInHash(sHash) {
57
- return sHash.replace(new RegExp("[&?]*" + enumURLParams.IAPPSTATEPARAM + "=[^&]*"), "");
58
- }
59
-
60
- /**
61
- * Adds an iAppState inside a hash (or replaces an existing one).
62
- *
63
- * @param {*} sHash The hash
64
- * @param {*} sAppStateKey The iAppState to add
65
- * @returns {string} The hash with the app state
66
- */
67
- function setAppStateInHash(sHash, sAppStateKey) {
68
- var sNewHash;
69
-
70
- if (sHash.indexOf(enumURLParams.IAPPSTATEPARAM) >= 0) {
71
- // If there's already an iAppState parameter in the hash, replace it
72
- sNewHash = sHash.replace(
73
- new RegExp(enumURLParams.IAPPSTATEPARAM + "=[^&]*"),
74
- enumURLParams.IAPPSTATEPARAM + "=" + sAppStateKey
75
- );
76
- } else {
77
- // Add the iAppState parameter in the hash
78
- if (sHash.indexOf("?") < 0) {
79
- sNewHash = sHash + "?";
80
- } else {
81
- sNewHash = sHash + "&";
82
- }
83
- sNewHash += enumURLParams.IAPPSTATEPARAM + "=" + sAppStateKey;
84
- }
85
-
86
- return sNewHash;
87
- }
88
-
89
- return BaseObject.extend("sap.fe.core.RouterProxy", {
90
- bIsRebuildHistoryRunning: false,
91
- bIsComputingTitleHierachy: false,
92
- bIsGuardCrossAllowed: false,
93
- sIAppStateKey: null,
94
-
95
- init: function(oAppComponent, isfclEnabled) {
96
- // Save the name of the app (including startup parameters) for rebuilding full hashes later
97
- oAppComponent
98
- .getService("shellServices")
99
- .then(
100
- function() {
101
- this._oShellServices = oAppComponent.getShellServices();
102
-
103
- this.initRaw(oAppComponent.getRouter());
104
- // We want to wait until the initial routeMatched is done before doing any navigation
105
- this.waitForRouteMatchBeforeNavigation();
106
-
107
- // Set feLevel=0 for the first Application page in the history
108
- history.replaceState(
109
- Object.assign(
110
- {
111
- feLevel: 0
112
- },
113
- history.state
114
- ),
115
- "",
116
- window.location
117
- );
118
- this.fclEnabled = isfclEnabled;
119
-
120
- this._fnBlockingNavFilter = this._blockingNavigationFilter.bind(this);
121
- this._oShellServices.registerNavigationFilter(this._fnBlockingNavFilter);
122
- }.bind(this)
123
- )
124
- .catch(function(oError) {
125
- Log.error("Cannot retrieve the shell services", oError);
126
- });
127
- this._fnHashGuard = this.hashGuard.bind(this);
128
- window.addEventListener("popstate", this._fnHashGuard);
129
- this._bDisableOnHashChange = false;
130
- this._bIgnoreRestore = false;
131
- this._bCleanedRestore = false;
132
- this._bForceFocus = true; // Trigger the focus mechanism for the first view displayed by the app
133
- },
134
-
135
- destroy: function() {
136
- if (this._oShellServices) {
137
- this._oShellServices.unregisterNavigationFilter(this._fnBlockingNavFilter);
138
- }
139
- window.removeEventListener("popstate", this._fnHashGuard);
140
- },
141
-
142
- /**
143
- * Raw initialization (for unit tests).
144
- *
145
- * @param {sap.ui.core.routing.Router} oRouter The router used by this proxy
146
- */
147
- initRaw: function(oRouter) {
148
- this._oRouter = oRouter;
149
- this._oManagedHistory = [];
150
- this._oNavigationGuard = null;
151
-
152
- var sCurrentAppHash = this.getHash();
153
- this._oManagedHistory.push(this._extractStateFromHash(sCurrentAppHash));
154
-
155
- // Set the iAppState if the initial hash contains one
156
- this.sIAppStateKey = findAppStateInHash(sCurrentAppHash);
157
- },
158
-
159
- getHash: function() {
160
- return this._oRouter.getHashChanger().getHash();
161
- },
162
-
163
- isFocusForced: function() {
164
- return this._bForceFocus;
165
- },
166
-
167
- setFocusForced: function(bForced) {
168
- this._bForceFocus = bForced;
169
- },
170
-
171
- /**
172
- * Resets the internal variable sIAppStateKey.
173
- *
174
- * @function
175
- * @name sap.fe.core.RouterProxy#removeIAppStateKey
176
- *
177
- * @ui5-restricted
178
- */
179
- removeIAppStateKey: function() {
180
- this.sIAppStateKey = null;
181
- },
182
-
183
- /**
184
- * Navigates to a specific hash.
185
- *
186
- * @function
187
- * @name sap.fe.core.RouterProxy#navToHash
188
- * @memberof sap.fe.core.RouterProxy
189
- * @static
190
- * @param {string} sHash Hash to be navigated to
191
- * @param {boolean} bPreserveHistory If set to true, non-ancestor entries in history will be retained
192
- * @param {boolean} bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
193
- * @param {boolean} bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
194
- * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
195
- * @ui5-restricted
196
- */
197
- navToHash: function(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus) {
198
- var that = this;
199
-
200
- if (this._oRouteMatchSynchronization) {
201
- return this._oRouteMatchSynchronization.waitFor().then(function() {
202
- that._oRouteMatchSynchronization = null;
203
- return that._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
204
- });
205
- } else {
206
- if (this._bActivateRouteMatchSynchro) {
207
- this.waitForRouteMatchBeforeNavigation();
208
- }
209
- return that._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
210
- }
211
- },
212
-
213
- _internalNavToHash: function(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus) {
214
- // Add the app state in the hash if needed
215
- if (this.fclEnabled && this.sIAppStateKey && !findAppStateInHash(sHash)) {
216
- sHash = setAppStateInHash(sHash, this.sIAppStateKey);
217
- }
218
-
219
- if (!this.checkHashWithGuard(sHash)) {
220
- if (!this.oResourceBundle) {
221
- this.oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
222
- }
223
-
224
- // We have to use a confirm here for UI consistency reasons, as with some scenarios
225
- // in the EditFlow we rely on a UI5 mechanism that displays a confirm dialog.
226
- if (!confirm(this.oResourceBundle.getText("C_ROUTER_PROXY_SAPFE_EXIT_NOTSAVED_MESSAGE"))) {
227
- // The user clicked on Cancel --> cancel navigation
228
- return Promise.resolve(false);
229
- }
230
- this.bIsGuardCrossAllowed = true;
231
- }
232
-
233
- // In case the navigation will cause a new view to be displayed, we force the focus
234
- // I.e. if the keys for the hash we're navigating to is a superset of the current hash keys.
235
- var oNewState = this._extractStateFromHash(sHash);
236
- if (!this._bForceFocus) {
237
- // If the focus was already forced, keep it
238
- var aCurrentHashKeys = this._extractKeysFromHash(this.getHash());
239
- this._bForceFocus =
240
- bForceFocus ||
241
- (aCurrentHashKeys.length < oNewState.keys.length &&
242
- aCurrentHashKeys.every(function(key, index) {
243
- return key === oNewState.keys[index];
244
- }));
245
- }
246
-
247
- var oHistoryAction = this._pushNewState(oNewState, false, bPreserveHistory, bDisablePreservationCache);
248
-
249
- return this._rebuildBrowserHistory(oHistoryAction, false);
250
- },
251
-
252
- /**
253
- * Clears browser history if entries have been added without using the RouterProxy.
254
- * Updates the internal history accordingly.
255
- *
256
- * @returns {Promise} Promise that is resolved once the history is rebuilt
257
- */
258
- restoreHistory: function() {
259
- if (this._bApplyRestore) {
260
- this._bApplyRestore = false;
261
- var sTargetHash = this.getHash();
262
- sTargetHash = sTargetHash.replace(/(\?|&)restoreHistory=true/, "");
263
- var oNewState = this._extractStateFromHash(sTargetHash);
264
-
265
- var oHistoryAction = this._pushNewState(oNewState, true, false, true);
266
-
267
- return this._rebuildBrowserHistory(oHistoryAction, true);
268
- } else {
269
- return Promise.resolve();
270
- }
271
- },
272
-
273
- /**
274
- * Navigates back in the history.
275
- *
276
- * @returns {Promise} Promise that is resolved when the navigation is finalized
277
- */
278
- navBack: function() {
279
- var sCurrentHash = this.getHash(),
280
- sPreviousHash;
281
-
282
- // Look for the current hash in the managed history
283
- for (var i = this._oManagedHistory.length - 1; i > 0; i--) {
284
- if (this._oManagedHistory[i].hash === sCurrentHash) {
285
- sPreviousHash = this._oManagedHistory[i - 1].hash;
286
- break;
287
- }
288
- }
289
-
290
- if (sPreviousHash) {
291
- return this.navToHash(sPreviousHash);
292
- } else {
293
- // We couldn't find a previous hash in history
294
- // This can happen when navigating from a transient hash in a create app, and
295
- // in that case history.back would go back to the FLP
296
- window.history.back();
297
- return Promise.resolve();
298
- }
299
- },
300
-
301
- /**
302
- * Navigates to a route with parameters.
303
- *
304
- * @param {string} sRouteName The route name to be navigated to
305
- * @param {object} oParameters Parameters for the navigation
306
- * @returns {Promise} Promise that is resolved when the navigation is finalized
307
- * @ui5-restricted
308
- */
309
- navTo: function(sRouteName, oParameters) {
310
- var sHash = this._oRouter.getURL(sRouteName, oParameters);
311
- return this.navToHash(sHash, false, oParameters.noPreservationCache);
312
- },
313
-
314
- /**
315
- * Exits the current app by navigating back
316
- * to the previous app (if any) or the FLP.
317
- *
318
- * @returns {Promise} Promise that is resolved when we exit the app
319
- */
320
- exitFromApp: function() {
321
- return this._oShellServices.backToPreviousApp();
322
- },
323
-
324
- /**
325
- * Checks whether a given hash can have an impact on the current state
326
- * i.e. if the hash is equal, compatible or an ancestor of the current state.
327
- *
328
- * @param {*} sHash `true` if there is an impact
329
- * @returns {boolean} If there is an impact
330
- */
331
- isCurrentStateImpactedBy: function(sHash) {
332
- if (sHash[0] === "/") {
333
- sHash = sHash.substring(1);
334
- }
335
- var oLocalGuard = createGuardFromHash(sHash);
336
- return oLocalGuard.check(this.getHash());
337
- },
338
-
339
- /**
340
- * Checks if a navigation is currently being processed.
341
- *
342
- * @returns {boolean} `false` if a navigation has been triggered in the RouterProxy and is not yet finalized
343
- */
344
- isNavigationFinalized: function() {
345
- return !this.bIsRebuildHistoryRunning && !this._bDelayedRebuild;
346
- },
347
-
348
- /**
349
- * Sets the last state as a guard.
350
- * Each future navigation will be checked against this guard, and a confirmation dialog will
351
- * be displayed before the navigation crosses the guard (i.e. goes to an ancestor of the guard).
352
- */
353
- setNavigationGuard: function() {
354
- this._oNavigationGuard = createGuardFromHash(this.getHash());
355
- this.bIsGuardCrossAllowed = false;
356
- },
357
-
358
- /**
359
- * Disables the navigation guard.
360
- */
361
- discardNavigationGuard: function() {
362
- this._oNavigationGuard = null;
363
- },
364
-
365
- /**
366
- * Checks for the availability of the navigation guard.
367
- *
368
- * @returns {boolean} `true` if navigating guard is available
369
- */
370
- hasNavigationGuard: function() {
371
- return this._oNavigationGuard !== null;
372
- },
373
-
374
- /**
375
- * Tests a hash against the navigation guard.
376
- *
377
- * @param {string} sHash The hash to be tested
378
- * @returns {boolean} `true` if navigating to the hash doesn't cross the guard
379
- */
380
- checkHashWithGuard: function(sHash) {
381
- return this._oNavigationGuard === null || this._oNavigationGuard.check(sHash);
382
- },
383
-
384
- /**
385
- * Checks if the user allowed the navigation guard to be crossed.
386
- *
387
- * @returns {boolean} `true` if crossing the guard has been allowed by the user
388
- */
389
- isGuardCrossAllowedByUser: function() {
390
- return this.bIsGuardCrossAllowed;
391
- },
392
-
393
- /**
394
- * Activates the synchronization for routeMatchedEvent.
395
- * The next NavToHash call will create a Synchronization object that will be resolved
396
- * by the corresponding onRouteMatched event, preventing another NavToHash to happen in parallel.
397
- */
398
- activateRouteMatchSynchronization: function() {
399
- this._bActivateRouteMatchSynchro = true;
400
- },
401
-
402
- /**
403
- * Resolve the routeMatch synchronization object, unlocking potential pending NavToHash calls.
404
- */
405
- resolveRouteMatch: function() {
406
- if (this._oRouteMatchSynchronization) {
407
- this._oRouteMatchSynchronization.resolve();
408
- }
409
- },
410
-
411
- /**
412
- * Makes sure no navigation can happen before a routeMatch happened.
413
- */
414
- waitForRouteMatchBeforeNavigation: function() {
415
- this._oRouteMatchSynchronization = new Synchronization();
416
- this._bActivateRouteMatchSynchro = false;
417
- },
418
-
419
- _extractKeysFromHash: function(sHash) {
420
- if (sHash === undefined) {
421
- sHash = "";
422
- }
423
- var sHashNoParams = sHash.split("?")[0]; // remove params
424
- var aTokens = sHashNoParams.split("/");
425
- var aKeys = [];
426
-
427
- aTokens.forEach(function(sToken) {
428
- var regexKey = /[^\(\)]+\([^\(\)]+\)/; // abc(def)
429
- if (regexKey.test(sToken)) {
430
- aKeys.push(sToken.split("(")[0]);
431
- }
432
- });
433
-
434
- return aKeys;
435
- },
436
-
437
- /**
438
- * Builds a state from a hash.
439
- *
440
- * @param {string} sHash The hash to be used as entry
441
- * @returns {object} The state
442
- *
443
- * @ui5-restricted
444
- */
445
- _extractStateFromHash: function(sHash) {
446
- if (sHash === undefined) {
447
- sHash = "";
448
- }
449
-
450
- var oState = {
451
- keys: this._extractKeysFromHash(sHash)
452
- };
453
-
454
- // Retrieve layout (if any)
455
- var aLayout = sHash.match(new RegExp("\\?.*" + enumURLParams.LAYOUTPARAM + "=([^&]*)"));
456
- oState.sLayout = aLayout && aLayout.length > 1 ? aLayout[1] : null;
457
- if (oState.sLayout === "MidColumnFullScreen") {
458
- oState.screenMode = 1;
459
- } else if (oState.sLayout === "EndColumnFullScreen") {
460
- oState.screenMode = 2;
461
- } else {
462
- oState.screenMode = 0;
463
- }
464
-
465
- oState.hash = sHash;
466
- return oState;
467
- },
468
-
469
- /**
470
- * Adds a new state into the internal history structure.
471
- * Makes sure this new state is added after an ancestor.
472
- * Also sets the iAppState key in the whole history.
473
- *
474
- * @memberof sap.fe.core.RouterProxy
475
- * @param {object} oNewState The new state to be added
476
- * @param {boolean} bRebuildOnly `true` if we're rebuilding the history after a shell menu navigation
477
- * @param {boolean} bPreserveHistory If set to true, non-ancestor entries in history will be retained
478
- * @param {boolean} bDisableHistoryPreservation Disable the mechanism to retained marked entries in cache
479
- * @returns {object} The new state
480
- * @ui5-restricted
481
- * @final
482
- */
483
- _pushNewState: function(oNewState, bRebuildOnly, bPreserveHistory, bDisableHistoryPreservation) {
484
- var sCurrentHash = this.getHash(),
485
- lastIndex = this._oManagedHistory.length - 1,
486
- iPopCount = bRebuildOnly ? 1 : 0,
487
- that = this;
488
-
489
- // 1. Do some cleanup in the managed history : in case the user has navigated back in the browser history, we need to remove
490
- // the states ahead in history and make sure the top state corresponds to the current page
491
- // We don't do that when restoring the history, as the current state has been added on top of the browser history
492
- // and is not reflected in the managed history
493
- if (!bRebuildOnly) {
494
- while (lastIndex >= 0 && this._oManagedHistory[lastIndex].hash !== sCurrentHash) {
495
- this._oManagedHistory.pop();
496
- lastIndex--;
497
- }
498
-
499
- if (this._oManagedHistory.length === 0) {
500
- // We couldn't find the current location in the history. This can happen if a browser reload
501
- // happened, causing a reinitialization of the managed history.
502
- // In that case, we use the current location as the new starting point in the managed history
503
- this._oManagedHistory.push(this._extractStateFromHash(sCurrentHash));
504
- history.replaceState(Object.assign({ feLevel: 0 }, history.state), "");
505
- }
506
- }
507
-
508
- // 2. Mark the top state as preserved if required
509
- if (bPreserveHistory && !bDisableHistoryPreservation) {
510
- this._oManagedHistory[this._oManagedHistory.length - 1].preserved = true;
511
- }
512
-
513
- // 3. Then pop all states until we find an ancestor of the new state, or we find a state that need to be preserved
514
- var oLastRemovedItem;
515
- while (this._oManagedHistory.length > 0) {
516
- var oTopState = this._oManagedHistory[this._oManagedHistory.length - 1];
517
- if (
518
- (bDisableHistoryPreservation || !oTopState.preserved) &&
519
- this._compareCacheStates(oTopState, oNewState) !== enumState.ANCESTOR
520
- ) {
521
- // The top state is not an ancestor of oNewState and is not preserved --> we can pop it
522
- oLastRemovedItem = this._oManagedHistory.pop();
523
- iPopCount++;
524
- } else if (oTopState.preserved && removeAppStateInHash(oTopState.hash) === removeAppStateInHash(oNewState.hash)) {
525
- // We try to add a state that is already in cache (due to preserved flag) but with a different iapp-state
526
- // --> we should delete the previous entry (it will be later replaced by the new one) and stop popping
527
- oLastRemovedItem = this._oManagedHistory.pop();
528
- iPopCount++;
529
- oNewState.preserved = true;
530
- break;
531
- } else {
532
- break; // Ancestor or preserved state found --> we stop popping out states
533
- }
534
- }
535
-
536
- // 4. iAppState management
537
- this.sIAppStateKey = findAppStateInHash(oNewState.hash);
538
- if (this.fclEnabled && this.sIAppStateKey) {
539
- // In case of FCL, the new app state needs to be applied to the whole history
540
- this._oManagedHistory.forEach(function(oManagedState) {
541
- oManagedState.hash = setAppStateInHash(oManagedState.hash, that.sIAppStateKey);
542
- });
543
- } else if (!this.fclEnabled && oLastRemovedItem) {
544
- var sPreviousIAppStateKey = findAppStateInHash(oLastRemovedItem.hash);
545
- var oComparisonStateResult = this._compareCacheStates(oLastRemovedItem, oNewState);
546
- // if current state doesn't contain a i-appstate and this state should replace a state containing a iAppState
547
- // then the previous iAppState is preserved
548
- if (
549
- !this.sIAppStateKey &&
550
- sPreviousIAppStateKey &&
551
- (oComparisonStateResult === enumState.EQUAL || oComparisonStateResult === enumState.COMPATIBLE)
552
- ) {
553
- oNewState.hash = setAppStateInHash(oNewState.hash, sPreviousIAppStateKey);
554
- }
555
- }
556
-
557
- // 5. Now we can push the state at the top of the internal history
558
- var bHasSameHash = oLastRemovedItem && oNewState.hash === oLastRemovedItem.hash;
559
- if (this._oManagedHistory.length === 0 || this._oManagedHistory[this._oManagedHistory.length - 1].hash !== oNewState.hash) {
560
- this._oManagedHistory.push(oNewState);
561
- }
562
-
563
- // 6. Determine which actions to do on the history
564
- if (iPopCount === 0) {
565
- // No state was popped --> append
566
- return { type: "append" };
567
- } else if (iPopCount === 1) {
568
- // Only 1 state was popped --> replace current hash unless hash is the same (then nothing to do)
569
- return bHasSameHash ? { type: "none" } : { type: "replace" };
570
- } else {
571
- // More than 1 state was popped --> go bakc in history and replace hash if necessary
572
- return bHasSameHash ? { type: "back", steps: iPopCount - 1 } : { type: "back-replace", steps: iPopCount - 1 };
573
- }
574
- },
575
-
576
- _blockingNavigationFilter: function() {
577
- return this._bDisableOnHashChange ? "Custom" : "Continue";
578
- },
579
-
580
- /**
581
- * Disable the routing by calling the router stop method.
582
- *
583
- * @function
584
- * @memberof sap.fe.core.RouterProxy
585
- *
586
- * @ui5-restricted
587
- * @final
588
- */
589
- _disableEventOnHashChange: function() {
590
- this._bDisableOnHashChange = true;
591
- this._oRouter.stop();
592
- },
593
-
594
- /**
595
- * Enable the routing by calling the router initialize method.
596
- *
597
- * @function
598
- * @name sap.fe.core.RouterProxy#_enableEventOnHashChange
599
- * @memberof sap.fe.core.RouterProxy
600
- * @param {Array} [bIgnoreCurrentHash] Ignore the last hash event triggered before the router has initialized
601
- *
602
- * @ui5-restricted
603
- * @final
604
- */
605
- _enableEventOnHashChange: function(bIgnoreCurrentHash) {
606
- this._bDisableOnHashChange = false;
607
- this._oRouter.initialize(bIgnoreCurrentHash);
608
- },
609
-
610
- /**
611
- * Synchronizes the browser history with the internal history of the routerProxy, and triggers a navigation if needed.
612
- *
613
- * @memberof sap.fe.core.RouterProxy
614
- * @param {object} oHistoryAction Specifies the navigation action to be performed
615
- * @param {boolean} bRebuildOnly `true` if internal history is currently being rebuilt
616
- * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
617
- * @ui5-restricted
618
- * @final
619
- */
620
- _rebuildBrowserHistory: function(oHistoryAction, bRebuildOnly) {
621
- var that = this;
622
- return new Promise(function(resolve, reject) {
623
- that.bIsRebuildHistoryRunning = true;
624
- var oTargetState = that._oManagedHistory[that._oManagedHistory.length - 1],
625
- newLevel = that._oManagedHistory.length - 1;
626
-
627
- function replaceAsync() {
628
- if (!bRebuildOnly) {
629
- that._enableEventOnHashChange(true);
630
- }
631
-
632
- that._oRouter.getHashChanger().replaceHash(oTargetState.hash);
633
- history.replaceState(Object.assign({ feLevel: newLevel }, history.state), "");
634
-
635
- if (bRebuildOnly) {
636
- setTimeout(function() {
637
- // Timeout to let 'hashchange' event be processed before by the HashChanger, so that
638
- // onRouteMatched notification isn't raised
639
- that._enableEventOnHashChange(true);
640
- }, 0);
641
- }
642
-
643
- that.bIsRebuildHistoryRunning = false;
644
- resolve(true); // a navigation occurred
645
- }
646
-
647
- // Async callbacks when navigating back, in order to let all notifications and events get processed
648
- function backReplaceAsync() {
649
- window.removeEventListener("popstate", backReplaceAsync);
650
- setTimeout(function() {
651
- // Timeout to let 'hashchange' event be processed before by the HashChanger
652
- replaceAsync();
653
- }, 0);
654
- }
655
-
656
- function backAsync() {
657
- window.removeEventListener("popstate", backAsync);
658
- that.bIsRebuildHistoryRunning = false;
659
- resolve(true); // a navigation occurred
660
- }
661
-
662
- that._bIgnoreRestore = true;
663
-
664
- switch (oHistoryAction.type) {
665
- case "replace":
666
- that._oRouter.getHashChanger().replaceHash(oTargetState.hash);
667
- history.replaceState(Object.assign({ feLevel: newLevel }, history.state), "");
668
- that.bIsRebuildHistoryRunning = false;
669
- resolve(true); // a navigation occurred
670
- break;
671
-
672
- case "append":
673
- that._oRouter.getHashChanger().setHash(oTargetState.hash);
674
- history.replaceState(Object.assign({ feLevel: newLevel }, history.state), "");
675
- that.bIsRebuildHistoryRunning = false;
676
- resolve(true); // a navigation occurred
677
- break;
678
-
679
- case "back":
680
- window.addEventListener("popstate", backAsync);
681
- history.go(-oHistoryAction.steps);
682
- break;
683
-
684
- case "back-replace":
685
- that._disableEventOnHashChange();
686
- window.addEventListener("popstate", backReplaceAsync);
687
- history.go(-oHistoryAction.steps);
688
- break;
689
-
690
- default:
691
- // No navigation
692
- that.bIsRebuildHistoryRunning = false;
693
- resolve(false); // no navigation --> resolve to false
694
- }
695
- });
696
- },
697
-
698
- getLastHistoryEntry: function() {
699
- return this._oManagedHistory[this._oManagedHistory.length - 1];
700
- },
701
-
702
- hashGuard: function(oEvent) {
703
- if (this._bCleanedRestore) {
704
- this._bCleanedRestore = false;
705
- return;
706
- }
707
- var sHash = window.location.hash;
708
- if (sHash.indexOf("restoreHistory=true") !== -1) {
709
- this._bApplyRestore = true;
710
- } else if (!this.bIsRebuildHistoryRunning) {
711
- var aHashSplit = sHash.split("&/");
712
- var sAppHash = aHashSplit[1] ? aHashSplit[1] : "";
713
- if (this.checkHashWithGuard(sAppHash)) {
714
- this._bDelayedRebuild = true;
715
- var oNewState = this._extractStateFromHash(sAppHash);
716
- this._pushNewState(oNewState, false, false, true);
717
-
718
- var that = this;
719
- setTimeout(function() {
720
- that._bDelayedRebuild = false;
721
- }, 0);
722
- }
723
- }
724
- },
725
-
726
- /**
727
- * Compares 2 states.
728
- *
729
- * @param {object} oState1
730
- * @param {object} oState2
731
- * @returns {number} The result of the comparison:
732
- * - enumState.EQUAL if oState1 and oState2 are equal
733
- * - enumState.COMPATIBLE if oState1 and oState2 are compatible
734
- * - enumState.ANCESTOR if oState1 is an ancestor of oState2
735
- * - enumState.DIFFERENT if the 2 states are different
736
- */
737
-
738
- _compareCacheStates: function(oState1, oState2) {
739
- // First compare object keys
740
- if (oState1.keys.length > oState2.keys.length) {
741
- return enumState.DIFFERENT;
742
- }
743
- var equal = true;
744
- var index;
745
- for (index = 0; equal && index < oState1.keys.length; index++) {
746
- if (oState1.keys[index] !== oState2.keys[index]) {
747
- equal = false;
748
- }
749
- }
750
- if (!equal) {
751
- // Some objects keys are different
752
- return enumState.DIFFERENT;
753
- }
754
-
755
- // All keys from oState1 are in oState2 --> check if ancestor
756
- if (oState1.keys.length < oState2.keys.length || oState1.screenMode < oState2.screenMode) {
757
- return enumState.ANCESTOR;
758
- }
759
- if (oState1.screenMode > oState2.screenMode) {
760
- return enumState.DIFFERENT; // Not sure this case can happen...
761
- }
762
-
763
- // At this stage, the 2 states have the same object keys (in the same order) and same screenmode
764
- // They can be either compatible or equal
765
- return oState1.sLayout === oState2.sLayout ? enumState.EQUAL : enumState.COMPATIBLE;
766
- },
767
-
768
- /**
769
- * Checks if back exits the present guard set.
770
- *
771
- * @param {string} sPresentHash The current hash. Only used for unit tests.
772
- * @returns {boolean} `true` if back exits there is a guard exit on back
773
- */
774
- checkIfBackIsOutOfGuard: function(sPresentHash) {
775
- var that = this,
776
- sPrevHash;
777
-
778
- if (sPresentHash === undefined) {
779
- // We use window.location.hash instead of HashChanger.getInstance().getHash() because the latter
780
- // replaces characters in the URL (e.g. %24 replaced by $) and it causes issues when comparing
781
- // with the URLs in the managed history
782
- var oSplitHash = this._oShellServices.splitHash(window.location.hash);
783
- if (oSplitHash && oSplitHash.appSpecificRoute) {
784
- sPresentHash = oSplitHash.appSpecificRoute;
785
- if (sPresentHash.indexOf("&/") === 0) {
786
- sPresentHash = sPresentHash.substring(2);
787
- }
788
- } else {
789
- sPresentHash = window.location.hash.substring(1); // To remove the '#'
790
- if (sPresentHash[0] === "/") {
791
- sPresentHash = sPresentHash.substring(1);
792
- }
793
- }
794
- }
795
- sPresentHash = URI.decode(sPresentHash);
796
- if (that._oNavigationGuard) {
797
- for (var i = that._oManagedHistory.length - 1; i > 0; i--) {
798
- if (that._oManagedHistory[i].hash === sPresentHash) {
799
- sPrevHash = that._oManagedHistory[i - 1].hash;
800
- break;
801
- }
802
- }
803
-
804
- return !sPrevHash || !that.checkHashWithGuard(sPrevHash);
805
- }
806
- return false;
807
- },
808
-
809
- /**
810
- * Checks if the last 2 entries in the history share the same context.
811
- *
812
- * @returns {boolean} `true` if they share the same context.
813
- */
814
- checkIfBackHasSameContext: function() {
815
- if (this._oManagedHistory.length < 2) {
816
- return false;
817
- }
818
-
819
- var oCurrentState = this._oManagedHistory[this._oManagedHistory.length - 1];
820
- var oPreviousState = this._oManagedHistory[this._oManagedHistory.length - 2];
821
-
822
- return oCurrentState.hash.split("?")[0] === oPreviousState.hash.split("?")[0];
823
- }
824
- });
825
- }
826
- );
5
+ sap.ui.define(["sap/base/Log", "sap/ui/base/Object", "sap/fe/core/Synchronization", "sap/ui/thirdparty/URI", "sap/fe/core/helpers/ClassSupport"], function (Log, BaseObject, Synchronization, URI, ClassSupport) {
6
+ "use strict";
7
+
8
+ var _dec, _class;
9
+
10
+ var UI5Class = ClassSupport.UI5Class;
11
+
12
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
13
+
14
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
15
+
16
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
17
+
18
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
19
+
20
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
21
+
22
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
23
+
24
+ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
25
+
26
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
27
+
28
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
29
+
30
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
31
+
32
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
33
+
34
+ var enumState = {
35
+ EQUAL: 0,
36
+ COMPATIBLE: 1,
37
+ ANCESTOR: 2,
38
+ DIFFERENT: 3
39
+ };
40
+ var enumURLParams = {
41
+ LAYOUTPARAM: "layout",
42
+ IAPPSTATEPARAM: "sap-iapp-state"
43
+ };
44
+ /**
45
+ * Creates a HashGuard object.
46
+ *
47
+ * @param {string} sGuardHash The hash used for the guard
48
+ * @returns {object} The created hash guard
49
+ */
50
+
51
+ function createGuardFromHash(sGuardHash) {
52
+ return {
53
+ _guardHash: sGuardHash.replace(/\?[^\?]*$/, ""),
54
+ // Remove query part
55
+ check: function (sHash) {
56
+ return sHash.indexOf(this._guardHash) === 0;
57
+ }
58
+ };
59
+ }
60
+ /**
61
+ * Returns the iAppState part from a hash (or null if not found).
62
+ *
63
+ * @param {string} sHash The hash
64
+ * @returns {string} The iAppState part of the hash
65
+ */
66
+
67
+
68
+ function findAppStateInHash(sHash) {
69
+ var aAppState = sHash.match(new RegExp("\\?.*" + enumURLParams.IAPPSTATEPARAM + "=([^&]*)"));
70
+ return aAppState && aAppState.length > 1 ? aAppState[1] : null;
71
+ }
72
+ /**
73
+ * Returns a hash without its iAppState part.
74
+ *
75
+ * @param {string} sHash The hash
76
+ * @returns {string} The hash without the iAppState
77
+ */
78
+
79
+
80
+ function removeAppStateInHash(sHash) {
81
+ return sHash.replace(new RegExp("[&?]*" + enumURLParams.IAPPSTATEPARAM + "=[^&]*"), "");
82
+ }
83
+ /**
84
+ * Adds an iAppState inside a hash (or replaces an existing one).
85
+ *
86
+ * @param {*} sHash The hash
87
+ * @param {*} sAppStateKey The iAppState to add
88
+ * @returns {string} The hash with the app state
89
+ */
90
+
91
+
92
+ function setAppStateInHash(sHash, sAppStateKey) {
93
+ var sNewHash;
94
+
95
+ if (sHash.indexOf(enumURLParams.IAPPSTATEPARAM) >= 0) {
96
+ // If there's already an iAppState parameter in the hash, replace it
97
+ sNewHash = sHash.replace(new RegExp(enumURLParams.IAPPSTATEPARAM + "=[^&]*"), enumURLParams.IAPPSTATEPARAM + "=" + sAppStateKey);
98
+ } else {
99
+ // Add the iAppState parameter in the hash
100
+ if (sHash.indexOf("?") < 0) {
101
+ sNewHash = sHash + "?";
102
+ } else {
103
+ sNewHash = sHash + "&";
104
+ }
105
+
106
+ sNewHash += enumURLParams.IAPPSTATEPARAM + "=" + sAppStateKey;
107
+ }
108
+
109
+ return sNewHash;
110
+ }
111
+
112
+ var RouterProxy = (_dec = UI5Class("sap.fe.core.RouterProxy"), _dec(_class = /*#__PURE__*/function (_BaseObject) {
113
+ _inherits(RouterProxy, _BaseObject);
114
+
115
+ var _super = _createSuper(RouterProxy);
116
+
117
+ function RouterProxy() {
118
+ var _this;
119
+
120
+ _classCallCheck(this, RouterProxy);
121
+
122
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
123
+ args[_key] = arguments[_key];
124
+ }
125
+
126
+ _this = _super.call.apply(_super, [this].concat(args));
127
+
128
+ _defineProperty(_assertThisInitialized(_this), "bIsRebuildHistoryRunning", false);
129
+
130
+ _defineProperty(_assertThisInitialized(_this), "bIsComputingTitleHierachy", false);
131
+
132
+ _defineProperty(_assertThisInitialized(_this), "bIsGuardCrossAllowed", false);
133
+
134
+ _defineProperty(_assertThisInitialized(_this), "sIAppStateKey", null);
135
+
136
+ _defineProperty(_assertThisInitialized(_this), "_bActivateRouteMatchSynchro", false);
137
+
138
+ _defineProperty(_assertThisInitialized(_this), "_bApplyRestore", false);
139
+
140
+ _defineProperty(_assertThisInitialized(_this), "_bDelayedRebuild", false);
141
+
142
+ return _this;
143
+ }
144
+
145
+ _createClass(RouterProxy, [{
146
+ key: "init",
147
+ value: function init(oAppComponent, isfclEnabled) {
148
+ var _this2 = this;
149
+
150
+ // Save the name of the app (including startup parameters) for rebuilding full hashes later
151
+ oAppComponent.getService("shellServices").then(function () {
152
+ _this2._oShellServices = oAppComponent.getShellServices();
153
+
154
+ _this2.initRaw(oAppComponent.getRouter()); // We want to wait until the initial routeMatched is done before doing any navigation
155
+
156
+
157
+ _this2.waitForRouteMatchBeforeNavigation(); // Set feLevel=0 for the first Application page in the history
158
+
159
+
160
+ history.replaceState(Object.assign({
161
+ feLevel: 0
162
+ }, history.state), "", window.location);
163
+ _this2.fclEnabled = isfclEnabled;
164
+ _this2._fnBlockingNavFilter = _this2._blockingNavigationFilter.bind(_this2);
165
+
166
+ _this2._oShellServices.registerNavigationFilter(_this2._fnBlockingNavFilter);
167
+ }).catch(function (oError) {
168
+ Log.error("Cannot retrieve the shell services", oError);
169
+ });
170
+ this._fnHashGuard = this.hashGuard.bind(this);
171
+ window.addEventListener("popstate", this._fnHashGuard);
172
+ this._bDisableOnHashChange = false;
173
+ this._bIgnoreRestore = false;
174
+ this._bCleanedRestore = false;
175
+ this._bForceFocus = true; // Trigger the focus mechanism for the first view displayed by the app
176
+ }
177
+ }, {
178
+ key: "destroy",
179
+ value: function destroy() {
180
+ if (this._oShellServices) {
181
+ this._oShellServices.unregisterNavigationFilter(this._fnBlockingNavFilter);
182
+ }
183
+
184
+ window.removeEventListener("popstate", this._fnHashGuard);
185
+ }
186
+ /**
187
+ * Raw initialization (for unit tests).
188
+ *
189
+ * @param {sap.ui.core.routing.Router} oRouter The router used by this proxy
190
+ */
191
+
192
+ }, {
193
+ key: "initRaw",
194
+ value: function initRaw(oRouter) {
195
+ this._oRouter = oRouter;
196
+ this._oManagedHistory = [];
197
+ this._oNavigationGuard = null;
198
+ var sCurrentAppHash = this.getHash();
199
+
200
+ this._oManagedHistory.push(this._extractStateFromHash(sCurrentAppHash)); // Set the iAppState if the initial hash contains one
201
+
202
+
203
+ this.sIAppStateKey = findAppStateInHash(sCurrentAppHash);
204
+ }
205
+ }, {
206
+ key: "getHash",
207
+ value: function getHash() {
208
+ return this._oRouter.getHashChanger().getHash();
209
+ }
210
+ }, {
211
+ key: "isFocusForced",
212
+ value: function isFocusForced() {
213
+ return this._bForceFocus;
214
+ }
215
+ }, {
216
+ key: "setFocusForced",
217
+ value: function setFocusForced(bForced) {
218
+ this._bForceFocus = bForced;
219
+ }
220
+ /**
221
+ * Resets the internal variable sIAppStateKey.
222
+ *
223
+ * @function
224
+ * @name sap.fe.core.RouterProxy#removeIAppStateKey
225
+ *
226
+ * @ui5-restricted
227
+ */
228
+
229
+ }, {
230
+ key: "removeIAppStateKey",
231
+ value: function removeIAppStateKey() {
232
+ this.sIAppStateKey = null;
233
+ }
234
+ /**
235
+ * Navigates to a specific hash.
236
+ *
237
+ * @function
238
+ * @name sap.fe.core.RouterProxy#navToHash
239
+ * @memberof sap.fe.core.RouterProxy
240
+ * @static
241
+ * @param {string} sHash Hash to be navigated to
242
+ * @param {boolean} bPreserveHistory If set to true, non-ancestor entries in history will be retained
243
+ * @param {boolean} bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
244
+ * @param {boolean} bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
245
+ * @param {boolean} bPreserveShellBackNavigationHandler If not set to false, the back navigation is set to undefined
246
+ * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
247
+ * @ui5-restricted
248
+ */
249
+
250
+ }, {
251
+ key: "navToHash",
252
+ value: function navToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus, bPreserveShellBackNavigationHandler) {
253
+ var _this3 = this;
254
+
255
+ if (bPreserveShellBackNavigationHandler !== false) {
256
+ this._oShellServices.setBackNavigation();
257
+ }
258
+
259
+ if (this._oRouteMatchSynchronization) {
260
+ return this._oRouteMatchSynchronization.waitFor().then(function () {
261
+ _this3._oRouteMatchSynchronization = undefined;
262
+ return _this3._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
263
+ });
264
+ } else {
265
+ if (this._bActivateRouteMatchSynchro) {
266
+ this.waitForRouteMatchBeforeNavigation();
267
+ }
268
+
269
+ return this._internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus);
270
+ }
271
+ }
272
+ }, {
273
+ key: "_internalNavToHash",
274
+ value: function _internalNavToHash(sHash, bPreserveHistory, bDisablePreservationCache, bForceFocus) {
275
+ // Add the app state in the hash if needed
276
+ if (this.fclEnabled && this.sIAppStateKey && !findAppStateInHash(sHash)) {
277
+ sHash = setAppStateInHash(sHash, this.sIAppStateKey);
278
+ }
279
+
280
+ if (!this.checkHashWithGuard(sHash)) {
281
+ if (!this.oResourceBundle) {
282
+ this.oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
283
+ } // We have to use a confirm here for UI consistency reasons, as with some scenarios
284
+ // in the EditFlow we rely on a UI5 mechanism that displays a confirm dialog.
285
+ // eslint-disable-next-line no-alert
286
+
287
+
288
+ if (!confirm(this.oResourceBundle.getText("C_ROUTER_PROXY_SAPFE_EXIT_NOTSAVED_MESSAGE"))) {
289
+ // The user clicked on Cancel --> cancel navigation
290
+ return Promise.resolve(false);
291
+ }
292
+
293
+ this.bIsGuardCrossAllowed = true;
294
+ } // In case the navigation will cause a new view to be displayed, we force the focus
295
+ // I.e. if the keys for the hash we're navigating to is a superset of the current hash keys.
296
+
297
+
298
+ var oNewState = this._extractStateFromHash(sHash);
299
+
300
+ if (!this._bForceFocus) {
301
+ // If the focus was already forced, keep it
302
+ var aCurrentHashKeys = this._extractKeysFromHash(this.getHash());
303
+
304
+ this._bForceFocus = bForceFocus || aCurrentHashKeys.length < oNewState.keys.length && aCurrentHashKeys.every(function (key, index) {
305
+ return key === oNewState.keys[index];
306
+ });
307
+ }
308
+
309
+ var oHistoryAction = this._pushNewState(oNewState, false, bPreserveHistory, bDisablePreservationCache);
310
+
311
+ return this._rebuildBrowserHistory(oHistoryAction, false);
312
+ }
313
+ /**
314
+ * Clears browser history if entries have been added without using the RouterProxy.
315
+ * Updates the internal history accordingly.
316
+ *
317
+ * @returns {Promise} Promise that is resolved once the history is rebuilt
318
+ */
319
+
320
+ }, {
321
+ key: "restoreHistory",
322
+ value: function restoreHistory() {
323
+ if (this._bApplyRestore) {
324
+ this._bApplyRestore = false;
325
+ var sTargetHash = this.getHash();
326
+ sTargetHash = sTargetHash.replace(/(\?|&)restoreHistory=true/, "");
327
+
328
+ var oNewState = this._extractStateFromHash(sTargetHash);
329
+
330
+ var oHistoryAction = this._pushNewState(oNewState, true, false, true);
331
+
332
+ return this._rebuildBrowserHistory(oHistoryAction, true);
333
+ } else {
334
+ return Promise.resolve();
335
+ }
336
+ }
337
+ /**
338
+ * Navigates back in the history.
339
+ *
340
+ * @returns {Promise} Promise that is resolved when the navigation is finalized
341
+ */
342
+
343
+ }, {
344
+ key: "navBack",
345
+ value: function navBack() {
346
+ var sCurrentHash = this.getHash();
347
+ var sPreviousHash; // Look for the current hash in the managed history
348
+
349
+ for (var i = this._oManagedHistory.length - 1; i > 0; i--) {
350
+ if (this._oManagedHistory[i].hash === sCurrentHash) {
351
+ sPreviousHash = this._oManagedHistory[i - 1].hash;
352
+ break;
353
+ }
354
+ }
355
+
356
+ if (sPreviousHash) {
357
+ return this.navToHash(sPreviousHash);
358
+ } else {
359
+ // We couldn't find a previous hash in history
360
+ // This can happen when navigating from a transient hash in a create app, and
361
+ // in that case history.back would go back to the FLP
362
+ window.history.back();
363
+ return Promise.resolve();
364
+ }
365
+ }
366
+ /**
367
+ * Navigates to a route with parameters.
368
+ * @param {string} sRouteName The route name to be navigated to
369
+ * @param {object} oParameters Parameters for the navigation
370
+ * @returns {Promise} Promise that is resolved when the navigation is finalized
371
+ * @ui5-restricted
372
+ */
373
+
374
+ }, {
375
+ key: "navTo",
376
+ value: function navTo(sRouteName, oParameters) {
377
+ var sHash = this._oRouter.getURL(sRouteName, oParameters);
378
+
379
+ return this.navToHash(sHash, false, oParameters.noPreservationCache, false, !oParameters.bIsStickyMode);
380
+ }
381
+ /**
382
+ * Exits the current app by navigating back
383
+ * to the previous app (if any) or the FLP.
384
+ *
385
+ * @returns {Promise} Promise that is resolved when we exit the app
386
+ */
387
+
388
+ }, {
389
+ key: "exitFromApp",
390
+ value: function exitFromApp() {
391
+ return this._oShellServices.backToPreviousApp();
392
+ }
393
+ /**
394
+ * Checks whether a given hash can have an impact on the current state
395
+ * i.e. if the hash is equal, compatible or an ancestor of the current state.
396
+ *
397
+ * @param {*} sHash `true` if there is an impact
398
+ * @returns {boolean} If there is an impact
399
+ */
400
+
401
+ }, {
402
+ key: "isCurrentStateImpactedBy",
403
+ value: function isCurrentStateImpactedBy(sHash) {
404
+ if (sHash[0] === "/") {
405
+ sHash = sHash.substring(1);
406
+ }
407
+
408
+ var oLocalGuard = createGuardFromHash(sHash);
409
+ return oLocalGuard.check(this.getHash());
410
+ }
411
+ /**
412
+ * Checks if a navigation is currently being processed.
413
+ *
414
+ * @returns {boolean} `false` if a navigation has been triggered in the RouterProxy and is not yet finalized
415
+ */
416
+
417
+ }, {
418
+ key: "isNavigationFinalized",
419
+ value: function isNavigationFinalized() {
420
+ return !this.bIsRebuildHistoryRunning && !this._bDelayedRebuild;
421
+ }
422
+ /**
423
+ * Sets the last state as a guard.
424
+ * Each future navigation will be checked against this guard, and a confirmation dialog will
425
+ * be displayed before the navigation crosses the guard (i.e. goes to an ancestor of the guard).
426
+ */
427
+
428
+ }, {
429
+ key: "setNavigationGuard",
430
+ value: function setNavigationGuard() {
431
+ this._oNavigationGuard = createGuardFromHash(this.getHash());
432
+ this.bIsGuardCrossAllowed = false;
433
+ }
434
+ /**
435
+ * Disables the navigation guard.
436
+ */
437
+
438
+ }, {
439
+ key: "discardNavigationGuard",
440
+ value: function discardNavigationGuard() {
441
+ this._oNavigationGuard = null;
442
+ }
443
+ /**
444
+ * Checks for the availability of the navigation guard.
445
+ *
446
+ * @returns {boolean} `true` if navigating guard is available
447
+ */
448
+
449
+ }, {
450
+ key: "hasNavigationGuard",
451
+ value: function hasNavigationGuard() {
452
+ return this._oNavigationGuard !== null;
453
+ }
454
+ /**
455
+ * Tests a hash against the navigation guard.
456
+ *
457
+ * @param {string} sHash The hash to be tested
458
+ * @returns {boolean} `true` if navigating to the hash doesn't cross the guard
459
+ */
460
+
461
+ }, {
462
+ key: "checkHashWithGuard",
463
+ value: function checkHashWithGuard(sHash) {
464
+ return this._oNavigationGuard === null || this._oNavigationGuard.check(sHash);
465
+ }
466
+ /**
467
+ * Checks if the user allowed the navigation guard to be crossed.
468
+ *
469
+ * @returns {boolean} `true` if crossing the guard has been allowed by the user
470
+ */
471
+
472
+ }, {
473
+ key: "isGuardCrossAllowedByUser",
474
+ value: function isGuardCrossAllowedByUser() {
475
+ return this.bIsGuardCrossAllowed;
476
+ }
477
+ /**
478
+ * Activates the synchronization for routeMatchedEvent.
479
+ * The next NavToHash call will create a Synchronization object that will be resolved
480
+ * by the corresponding onRouteMatched event, preventing another NavToHash to happen in parallel.
481
+ */
482
+
483
+ }, {
484
+ key: "activateRouteMatchSynchronization",
485
+ value: function activateRouteMatchSynchronization() {
486
+ this._bActivateRouteMatchSynchro = true;
487
+ }
488
+ /**
489
+ * Resolve the routeMatch synchronization object, unlocking potential pending NavToHash calls.
490
+ */
491
+
492
+ }, {
493
+ key: "resolveRouteMatch",
494
+ value: function resolveRouteMatch() {
495
+ if (this._oRouteMatchSynchronization) {
496
+ this._oRouteMatchSynchronization.resolve();
497
+ }
498
+ }
499
+ /**
500
+ * Makes sure no navigation can happen before a routeMatch happened.
501
+ */
502
+
503
+ }, {
504
+ key: "waitForRouteMatchBeforeNavigation",
505
+ value: function waitForRouteMatchBeforeNavigation() {
506
+ this._oRouteMatchSynchronization = new Synchronization();
507
+ this._bActivateRouteMatchSynchro = false;
508
+ }
509
+ }, {
510
+ key: "_extractKeysFromHash",
511
+ value: function _extractKeysFromHash(sHash) {
512
+ if (sHash === undefined) {
513
+ sHash = "";
514
+ }
515
+
516
+ var sHashNoParams = sHash.split("?")[0]; // remove params
517
+
518
+ var aTokens = sHashNoParams.split("/");
519
+ var aKeys = [];
520
+ aTokens.forEach(function (sToken) {
521
+ var regexKey = /[^\(\)]+\([^\(\)]+\)/; // abc(def)
522
+
523
+ if (regexKey.test(sToken)) {
524
+ aKeys.push(sToken.split("(")[0]);
525
+ }
526
+ });
527
+ return aKeys;
528
+ }
529
+ /**
530
+ * Builds a state from a hash.
531
+ *
532
+ * @param {string} sHash The hash to be used as entry
533
+ * @returns {object} The state
534
+ *
535
+ * @ui5-restricted
536
+ */
537
+
538
+ }, {
539
+ key: "_extractStateFromHash",
540
+ value: function _extractStateFromHash(sHash) {
541
+ if (sHash === undefined) {
542
+ sHash = "";
543
+ }
544
+
545
+ var oState = {
546
+ keys: this._extractKeysFromHash(sHash)
547
+ }; // Retrieve layout (if any)
548
+
549
+ var aLayout = sHash.match(new RegExp("\\?.*" + enumURLParams.LAYOUTPARAM + "=([^&]*)"));
550
+ oState.sLayout = aLayout && aLayout.length > 1 ? aLayout[1] : null;
551
+
552
+ if (oState.sLayout === "MidColumnFullScreen") {
553
+ oState.screenMode = 1;
554
+ } else if (oState.sLayout === "EndColumnFullScreen") {
555
+ oState.screenMode = 2;
556
+ } else {
557
+ oState.screenMode = 0;
558
+ }
559
+
560
+ oState.hash = sHash;
561
+ return oState;
562
+ }
563
+ /**
564
+ * Adds a new state into the internal history structure.
565
+ * Makes sure this new state is added after an ancestor.
566
+ * Also sets the iAppState key in the whole history.
567
+ *
568
+ * @memberof sap.fe.core.RouterProxy
569
+ * @param {object} oNewState The new state to be added
570
+ * @param {boolean} bRebuildOnly `true` if we're rebuilding the history after a shell menu navigation
571
+ * @param {boolean} bPreserveHistory If set to true, non-ancestor entries in history will be retained
572
+ * @param {boolean} bDisableHistoryPreservation Disable the mechanism to retained marked entries in cache
573
+ * @returns {object} The new state
574
+ * @ui5-restricted
575
+ * @final
576
+ */
577
+
578
+ }, {
579
+ key: "_pushNewState",
580
+ value: function _pushNewState(oNewState, bRebuildOnly, bPreserveHistory, bDisableHistoryPreservation) {
581
+ var _this4 = this;
582
+
583
+ var sCurrentHash = this.getHash();
584
+ var lastIndex = this._oManagedHistory.length - 1;
585
+ var iPopCount = bRebuildOnly ? 1 : 0; // 1. Do some cleanup in the managed history : in case the user has navigated back in the browser history, we need to remove
586
+ // the states ahead in history and make sure the top state corresponds to the current page
587
+ // We don't do that when restoring the history, as the current state has been added on top of the browser history
588
+ // and is not reflected in the managed history
589
+
590
+ if (!bRebuildOnly) {
591
+ while (lastIndex >= 0 && this._oManagedHistory[lastIndex].hash !== sCurrentHash) {
592
+ this._oManagedHistory.pop();
593
+
594
+ lastIndex--;
595
+ }
596
+
597
+ if (this._oManagedHistory.length === 0) {
598
+ // We couldn't find the current location in the history. This can happen if a browser reload
599
+ // happened, causing a reinitialization of the managed history.
600
+ // In that case, we use the current location as the new starting point in the managed history
601
+ this._oManagedHistory.push(this._extractStateFromHash(sCurrentHash));
602
+
603
+ history.replaceState(Object.assign({
604
+ feLevel: 0
605
+ }, history.state), "");
606
+ }
607
+ } // 2. Mark the top state as preserved if required
608
+
609
+
610
+ if (bPreserveHistory && !bDisableHistoryPreservation) {
611
+ this._oManagedHistory[this._oManagedHistory.length - 1].preserved = true;
612
+ } // 3. Then pop all states until we find an ancestor of the new state, or we find a state that need to be preserved
613
+
614
+
615
+ var oLastRemovedItem;
616
+
617
+ while (this._oManagedHistory.length > 0) {
618
+ var oTopState = this._oManagedHistory[this._oManagedHistory.length - 1];
619
+
620
+ if ((bDisableHistoryPreservation || !oTopState.preserved) && this._compareCacheStates(oTopState, oNewState) !== enumState.ANCESTOR) {
621
+ // The top state is not an ancestor of oNewState and is not preserved --> we can pop it
622
+ oLastRemovedItem = this._oManagedHistory.pop();
623
+ iPopCount++;
624
+ } else if (oTopState.preserved && removeAppStateInHash(oTopState.hash) === removeAppStateInHash(oNewState.hash)) {
625
+ // We try to add a state that is already in cache (due to preserved flag) but with a different iapp-state
626
+ // --> we should delete the previous entry (it will be later replaced by the new one) and stop popping
627
+ oLastRemovedItem = this._oManagedHistory.pop();
628
+ iPopCount++;
629
+ oNewState.preserved = true;
630
+ break;
631
+ } else {
632
+ break; // Ancestor or preserved state found --> we stop popping out states
633
+ }
634
+ } // 4. iAppState management
635
+
636
+
637
+ this.sIAppStateKey = findAppStateInHash(oNewState.hash);
638
+
639
+ if (this.fclEnabled && this.sIAppStateKey) {
640
+ // In case of FCL, the new app state needs to be applied to the whole history
641
+ this._oManagedHistory.forEach(function (oManagedState) {
642
+ oManagedState.hash = setAppStateInHash(oManagedState.hash, _this4.sIAppStateKey);
643
+ });
644
+ } else if (!this.fclEnabled && oLastRemovedItem) {
645
+ var sPreviousIAppStateKey = findAppStateInHash(oLastRemovedItem.hash);
646
+
647
+ var oComparisonStateResult = this._compareCacheStates(oLastRemovedItem, oNewState); // if current state doesn't contain a i-appstate and this state should replace a state containing a iAppState
648
+ // then the previous iAppState is preserved
649
+
650
+
651
+ if (!this.sIAppStateKey && sPreviousIAppStateKey && (oComparisonStateResult === enumState.EQUAL || oComparisonStateResult === enumState.COMPATIBLE)) {
652
+ oNewState.hash = setAppStateInHash(oNewState.hash, sPreviousIAppStateKey);
653
+ }
654
+ } // 5. Now we can push the state at the top of the internal history
655
+
656
+
657
+ var bHasSameHash = oLastRemovedItem && oNewState.hash === oLastRemovedItem.hash;
658
+
659
+ if (this._oManagedHistory.length === 0 || this._oManagedHistory[this._oManagedHistory.length - 1].hash !== oNewState.hash) {
660
+ this._oManagedHistory.push(oNewState);
661
+ } // 6. Determine which actions to do on the history
662
+
663
+
664
+ if (iPopCount === 0) {
665
+ // No state was popped --> append
666
+ return {
667
+ type: "append"
668
+ };
669
+ } else if (iPopCount === 1) {
670
+ // Only 1 state was popped --> replace current hash unless hash is the same (then nothing to do)
671
+ return bHasSameHash ? {
672
+ type: "none"
673
+ } : {
674
+ type: "replace"
675
+ };
676
+ } else {
677
+ // More than 1 state was popped --> go bakc in history and replace hash if necessary
678
+ return bHasSameHash ? {
679
+ type: "back",
680
+ steps: iPopCount - 1
681
+ } : {
682
+ type: "back-replace",
683
+ steps: iPopCount - 1
684
+ };
685
+ }
686
+ }
687
+ }, {
688
+ key: "_blockingNavigationFilter",
689
+ value: function _blockingNavigationFilter() {
690
+ return this._bDisableOnHashChange ? "Custom" : "Continue";
691
+ }
692
+ /**
693
+ * Disable the routing by calling the router stop method.
694
+ *
695
+ * @function
696
+ * @memberof sap.fe.core.RouterProxy
697
+ *
698
+ * @ui5-restricted
699
+ * @final
700
+ */
701
+
702
+ }, {
703
+ key: "_disableEventOnHashChange",
704
+ value: function _disableEventOnHashChange() {
705
+ this._bDisableOnHashChange = true;
706
+
707
+ this._oRouter.stop();
708
+ }
709
+ /**
710
+ * Enable the routing by calling the router initialize method.
711
+ *
712
+ * @function
713
+ * @name sap.fe.core.RouterProxy#_enableEventOnHashChange
714
+ * @memberof sap.fe.core.RouterProxy
715
+ * @param {boolean} [bIgnoreCurrentHash] Ignore the last hash event triggered before the router has initialized
716
+ *
717
+ * @ui5-restricted
718
+ * @final
719
+ */
720
+
721
+ }, {
722
+ key: "_enableEventOnHashChange",
723
+ value: function _enableEventOnHashChange(bIgnoreCurrentHash) {
724
+ this._bDisableOnHashChange = false;
725
+
726
+ this._oRouter.initialize(bIgnoreCurrentHash);
727
+ }
728
+ /**
729
+ * Synchronizes the browser history with the internal history of the routerProxy, and triggers a navigation if needed.
730
+ *
731
+ * @memberof sap.fe.core.RouterProxy
732
+ * @param {object} oHistoryAction Specifies the navigation action to be performed
733
+ * @param {boolean} bRebuildOnly `true` if internal history is currently being rebuilt
734
+ * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
735
+ * @ui5-restricted
736
+ * @final
737
+ */
738
+
739
+ }, {
740
+ key: "_rebuildBrowserHistory",
741
+ value: function _rebuildBrowserHistory(oHistoryAction, bRebuildOnly) {
742
+ var _this5 = this;
743
+
744
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
745
+ var that = this;
746
+ return new Promise(function (resolve) {
747
+ _this5.bIsRebuildHistoryRunning = true;
748
+ var oTargetState = _this5._oManagedHistory[_this5._oManagedHistory.length - 1],
749
+ newLevel = _this5._oManagedHistory.length - 1;
750
+
751
+ function replaceAsync() {
752
+ if (!bRebuildOnly) {
753
+ that._enableEventOnHashChange(true);
754
+ }
755
+
756
+ that._oRouter.getHashChanger().replaceHash(oTargetState.hash);
757
+
758
+ history.replaceState(Object.assign({
759
+ feLevel: newLevel
760
+ }, history.state), "");
761
+
762
+ if (bRebuildOnly) {
763
+ setTimeout(function () {
764
+ // Timeout to let 'hashchange' event be processed before by the HashChanger, so that
765
+ // onRouteMatched notification isn't raised
766
+ that._enableEventOnHashChange(true);
767
+ }, 0);
768
+ }
769
+
770
+ that.bIsRebuildHistoryRunning = false;
771
+ resolve(true); // a navigation occurred
772
+ } // Async callbacks when navigating back, in order to let all notifications and events get processed
773
+
774
+
775
+ function backReplaceAsync() {
776
+ window.removeEventListener("popstate", backReplaceAsync);
777
+ setTimeout(function () {
778
+ // Timeout to let 'hashchange' event be processed before by the HashChanger
779
+ replaceAsync();
780
+ }, 0);
781
+ }
782
+
783
+ function backAsync() {
784
+ window.removeEventListener("popstate", backAsync);
785
+ that.bIsRebuildHistoryRunning = false;
786
+ resolve(true); // a navigation occurred
787
+ }
788
+
789
+ that._bIgnoreRestore = true;
790
+
791
+ switch (oHistoryAction.type) {
792
+ case "replace":
793
+ that._oRouter.getHashChanger().replaceHash(oTargetState.hash);
794
+
795
+ history.replaceState(Object.assign({
796
+ feLevel: newLevel
797
+ }, history.state), "");
798
+ that.bIsRebuildHistoryRunning = false;
799
+ resolve(true); // a navigation occurred
800
+
801
+ break;
802
+
803
+ case "append":
804
+ that._oRouter.getHashChanger().setHash(oTargetState.hash);
805
+
806
+ history.replaceState(Object.assign({
807
+ feLevel: newLevel
808
+ }, history.state), "");
809
+ that.bIsRebuildHistoryRunning = false;
810
+ resolve(true); // a navigation occurred
811
+
812
+ break;
813
+
814
+ case "back":
815
+ window.addEventListener("popstate", backAsync);
816
+ history.go(-oHistoryAction.steps);
817
+ break;
818
+
819
+ case "back-replace":
820
+ _this5._disableEventOnHashChange();
821
+
822
+ window.addEventListener("popstate", backReplaceAsync);
823
+ history.go(-oHistoryAction.steps);
824
+ break;
825
+
826
+ default:
827
+ // No navigation
828
+ _this5.bIsRebuildHistoryRunning = false;
829
+ resolve(false);
830
+ // no navigation --> resolve to false
831
+ }
832
+ });
833
+ }
834
+ }, {
835
+ key: "getLastHistoryEntry",
836
+ value: function getLastHistoryEntry() {
837
+ return this._oManagedHistory[this._oManagedHistory.length - 1];
838
+ }
839
+ }, {
840
+ key: "hashGuard",
841
+ value: function hashGuard() {
842
+ var _this6 = this;
843
+
844
+ if (this._bCleanedRestore) {
845
+ this._bCleanedRestore = false;
846
+ return;
847
+ }
848
+
849
+ var sHash = window.location.hash;
850
+
851
+ if (sHash.indexOf("restoreHistory=true") !== -1) {
852
+ this._bApplyRestore = true;
853
+ } else if (!this.bIsRebuildHistoryRunning) {
854
+ var aHashSplit = sHash.split("&/");
855
+ var sAppHash = aHashSplit[1] ? aHashSplit[1] : "";
856
+
857
+ if (this.checkHashWithGuard(sAppHash)) {
858
+ this._bDelayedRebuild = true;
859
+
860
+ var oNewState = this._extractStateFromHash(sAppHash);
861
+
862
+ this._pushNewState(oNewState, false, false, true);
863
+
864
+ setTimeout(function () {
865
+ _this6._bDelayedRebuild = false;
866
+ }, 0);
867
+ }
868
+ }
869
+ }
870
+ /**
871
+ * Compares 2 states.
872
+ *
873
+ * @param {object} oState1
874
+ * @param {object} oState2
875
+ * @returns {number} The result of the comparison:
876
+ * - enumState.EQUAL if oState1 and oState2 are equal
877
+ * - enumState.COMPATIBLE if oState1 and oState2 are compatible
878
+ * - enumState.ANCESTOR if oState1 is an ancestor of oState2
879
+ * - enumState.DIFFERENT if the 2 states are different
880
+ */
881
+
882
+ }, {
883
+ key: "_compareCacheStates",
884
+ value: function _compareCacheStates(oState1, oState2) {
885
+ // First compare object keys
886
+ if (oState1.keys.length > oState2.keys.length) {
887
+ return enumState.DIFFERENT;
888
+ }
889
+
890
+ var equal = true;
891
+ var index;
892
+
893
+ for (index = 0; equal && index < oState1.keys.length; index++) {
894
+ if (oState1.keys[index] !== oState2.keys[index]) {
895
+ equal = false;
896
+ }
897
+ }
898
+
899
+ if (!equal) {
900
+ // Some objects keys are different
901
+ return enumState.DIFFERENT;
902
+ } // All keys from oState1 are in oState2 --> check if ancestor
903
+
904
+
905
+ if (oState1.keys.length < oState2.keys.length || oState1.screenMode < oState2.screenMode) {
906
+ return enumState.ANCESTOR;
907
+ }
908
+
909
+ if (oState1.screenMode > oState2.screenMode) {
910
+ return enumState.DIFFERENT; // Not sure this case can happen...
911
+ } // At this stage, the 2 states have the same object keys (in the same order) and same screenmode
912
+ // They can be either compatible or equal
913
+
914
+
915
+ return oState1.sLayout === oState2.sLayout ? enumState.EQUAL : enumState.COMPATIBLE;
916
+ }
917
+ /**
918
+ * Checks if back exits the present guard set.
919
+ *
920
+ * @param {string} sPresentHash The current hash. Only used for unit tests.
921
+ * @returns {boolean} `true` if back exits there is a guard exit on back
922
+ */
923
+
924
+ }, {
925
+ key: "checkIfBackIsOutOfGuard",
926
+ value: function checkIfBackIsOutOfGuard(sPresentHash) {
927
+ var sPrevHash;
928
+
929
+ if (sPresentHash === undefined) {
930
+ // We use window.location.hash instead of HashChanger.getInstance().getHash() because the latter
931
+ // replaces characters in the URL (e.g. %24 replaced by $) and it causes issues when comparing
932
+ // with the URLs in the managed history
933
+ var oSplitHash = this._oShellServices.splitHash(window.location.hash);
934
+
935
+ if (oSplitHash && oSplitHash.appSpecificRoute) {
936
+ sPresentHash = oSplitHash.appSpecificRoute;
937
+
938
+ if (sPresentHash.indexOf("&/") === 0) {
939
+ sPresentHash = sPresentHash.substring(2);
940
+ }
941
+ } else {
942
+ sPresentHash = window.location.hash.substring(1); // To remove the '#'
943
+
944
+ if (sPresentHash[0] === "/") {
945
+ sPresentHash = sPresentHash.substring(1);
946
+ }
947
+ }
948
+ }
949
+
950
+ sPresentHash = URI.decode(sPresentHash);
951
+
952
+ if (this._oNavigationGuard) {
953
+ for (var i = this._oManagedHistory.length - 1; i > 0; i--) {
954
+ if (this._oManagedHistory[i].hash === sPresentHash) {
955
+ sPrevHash = this._oManagedHistory[i - 1].hash;
956
+ break;
957
+ }
958
+ }
959
+
960
+ return !sPrevHash || !this.checkHashWithGuard(sPrevHash);
961
+ }
962
+
963
+ return false;
964
+ }
965
+ /**
966
+ * Checks if the last 2 entries in the history share the same context.
967
+ *
968
+ * @returns {boolean} `true` if they share the same context.
969
+ */
970
+
971
+ }, {
972
+ key: "checkIfBackHasSameContext",
973
+ value: function checkIfBackHasSameContext() {
974
+ if (this._oManagedHistory.length < 2) {
975
+ return false;
976
+ }
977
+
978
+ var oCurrentState = this._oManagedHistory[this._oManagedHistory.length - 1];
979
+ var oPreviousState = this._oManagedHistory[this._oManagedHistory.length - 2];
980
+ return oCurrentState.hash.split("?")[0] === oPreviousState.hash.split("?")[0];
981
+ }
982
+ }]);
983
+
984
+ return RouterProxy;
985
+ }(BaseObject)) || _class);
986
+ return RouterProxy;
987
+ }, false);
988
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRlclByb3h5LnRzIl0sIm5hbWVzIjpbImVudW1TdGF0ZSIsIkVRVUFMIiwiQ09NUEFUSUJMRSIsIkFOQ0VTVE9SIiwiRElGRkVSRU5UIiwiZW51bVVSTFBhcmFtcyIsIkxBWU9VVFBBUkFNIiwiSUFQUFNUQVRFUEFSQU0iLCJjcmVhdGVHdWFyZEZyb21IYXNoIiwic0d1YXJkSGFzaCIsIl9ndWFyZEhhc2giLCJyZXBsYWNlIiwiY2hlY2siLCJzSGFzaCIsImluZGV4T2YiLCJmaW5kQXBwU3RhdGVJbkhhc2giLCJhQXBwU3RhdGUiLCJtYXRjaCIsIlJlZ0V4cCIsImxlbmd0aCIsInJlbW92ZUFwcFN0YXRlSW5IYXNoIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsIlJvdXRlclByb3h5IiwiVUk1Q2xhc3MiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJiaW5kIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9mbkhhc2hHdWFyZCIsImhhc2hHdWFyZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkNsZWFuZWRSZXN0b3JlIiwiX2JGb3JjZUZvY3VzIiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib1JvdXRlciIsIl9vUm91dGVyIiwiX29NYW5hZ2VkSGlzdG9yeSIsIl9vTmF2aWdhdGlvbkd1YXJkIiwic0N1cnJlbnRBcHBIYXNoIiwiZ2V0SGFzaCIsInB1c2giLCJfZXh0cmFjdFN0YXRlRnJvbUhhc2giLCJzSUFwcFN0YXRlS2V5IiwiZ2V0SGFzaENoYW5nZXIiLCJiRm9yY2VkIiwiYlByZXNlcnZlSGlzdG9yeSIsImJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUiLCJiRm9yY2VGb2N1cyIsImJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyIiwic2V0QmFja05hdmlnYXRpb24iLCJfb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJ3YWl0Rm9yIiwidW5kZWZpbmVkIiwiX2ludGVybmFsTmF2VG9IYXNoIiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwib1Jlc291cmNlQnVuZGxlIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiY29uZmlybSIsImdldFRleHQiLCJQcm9taXNlIiwicmVzb2x2ZSIsImJJc0d1YXJkQ3Jvc3NBbGxvd2VkIiwib05ld1N0YXRlIiwiYUN1cnJlbnRIYXNoS2V5cyIsIl9leHRyYWN0S2V5c0Zyb21IYXNoIiwia2V5cyIsImV2ZXJ5Iiwia2V5IiwiaW5kZXgiLCJvSGlzdG9yeUFjdGlvbiIsIl9wdXNoTmV3U3RhdGUiLCJfcmVidWlsZEJyb3dzZXJIaXN0b3J5IiwiX2JBcHBseVJlc3RvcmUiLCJzVGFyZ2V0SGFzaCIsInNDdXJyZW50SGFzaCIsInNQcmV2aW91c0hhc2giLCJpIiwiaGFzaCIsIm5hdlRvSGFzaCIsImJhY2siLCJzUm91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJnZXRVUkwiLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiYklzU3RpY2t5TW9kZSIsImJhY2tUb1ByZXZpb3VzQXBwIiwic3Vic3RyaW5nIiwib0xvY2FsR3VhcmQiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJfYkRlbGF5ZWRSZWJ1aWxkIiwiU3luY2hyb25pemF0aW9uIiwic0hhc2hOb1BhcmFtcyIsInNwbGl0IiwiYVRva2VucyIsImFLZXlzIiwiZm9yRWFjaCIsInNUb2tlbiIsInJlZ2V4S2V5IiwidGVzdCIsIm9TdGF0ZSIsImFMYXlvdXQiLCJzTGF5b3V0Iiwic2NyZWVuTW9kZSIsImJSZWJ1aWxkT25seSIsImJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiIsImxhc3RJbmRleCIsImlQb3BDb3VudCIsInBvcCIsInByZXNlcnZlZCIsIm9MYXN0UmVtb3ZlZEl0ZW0iLCJvVG9wU3RhdGUiLCJfY29tcGFyZUNhY2hlU3RhdGVzIiwib01hbmFnZWRTdGF0ZSIsInNQcmV2aW91c0lBcHBTdGF0ZUtleSIsIm9Db21wYXJpc29uU3RhdGVSZXN1bHQiLCJiSGFzU2FtZUhhc2giLCJ0eXBlIiwic3RlcHMiLCJzdG9wIiwiYklnbm9yZUN1cnJlbnRIYXNoIiwiaW5pdGlhbGl6ZSIsInRoYXQiLCJvVGFyZ2V0U3RhdGUiLCJuZXdMZXZlbCIsInJlcGxhY2VBc3luYyIsIl9lbmFibGVFdmVudE9uSGFzaENoYW5nZSIsInJlcGxhY2VIYXNoIiwic2V0VGltZW91dCIsImJhY2tSZXBsYWNlQXN5bmMiLCJiYWNrQXN5bmMiLCJzZXRIYXNoIiwiZ28iLCJfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwiYUhhc2hTcGxpdCIsInNBcHBIYXNoIiwib1N0YXRlMSIsIm9TdGF0ZTIiLCJlcXVhbCIsInNQcmVzZW50SGFzaCIsInNQcmV2SGFzaCIsIm9TcGxpdEhhc2giLCJzcGxpdEhhc2giLCJhcHBTcGVjaWZpY1JvdXRlIiwiVVJJIiwiZGVjb2RlIiwib0N1cnJlbnRTdGF0ZSIsIm9QcmV2aW91c1N0YXRlIiwiQmFzZU9iamVjdCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsTUFBTUEsU0FB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QUFMLENBQXNCNUMsTUFBdEIsR0FBK0IsQ0FBckQsQ0FBdEI7QUFDQSxZQUFNOEosY0FBYyxHQUFHLEtBQUtsSCxnQkFBTCxDQUFzQixLQUFLQSxnQkFBTCxDQUFzQjVDLE1BQXRCLEdBQStCLENBQXJELENBQXZCO0FBRUEsZUFBTzZKLGFBQWEsQ0FBQ3BFLElBQWQsQ0FBbUJlLEtBQW5CLENBQXlCLEdBQXpCLEVBQThCLENBQTlCLE1BQXFDc0QsY0FBYyxDQUFDckUsSUFBZixDQUFvQmUsS0FBcEIsQ0FBMEIsR0FBMUIsRUFBK0IsQ0FBL0IsQ0FBNUM7QUFDQTs7OztJQWx2QndCdUQsVTtTQXF2QlgxSixXIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBTeW5jaHJvbml6YXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL1N5bmNocm9uaXphdGlvblwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgeyBJU2hlbGxTZXJ2aWNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaGVsbFNlcnZpY2VzRmFjdG9yeVwiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCB7IFVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcblxuY29uc3QgZW51bVN0YXRlID0ge1xuXHRFUVVBTDogMCxcblx0Q09NUEFUSUJMRTogMSxcblx0QU5DRVNUT1I6IDIsXG5cdERJRkZFUkVOVDogM1xufTtcbmNvbnN0IGVudW1VUkxQYXJhbXMgPSB7XG5cdExBWU9VVFBBUkFNOiBcImxheW91dFwiLFxuXHRJQVBQU1RBVEVQQVJBTTogXCJzYXAtaWFwcC1zdGF0ZVwiXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBIYXNoR3VhcmQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzR3VhcmRIYXNoIFRoZSBoYXNoIHVzZWQgZm9yIHRoZSBndWFyZFxuICogQHJldHVybnMge29iamVjdH0gVGhlIGNyZWF0ZWQgaGFzaCBndWFyZFxuICovXG5mdW5jdGlvbiBjcmVhdGVHdWFyZEZyb21IYXNoKHNHdWFyZEhhc2g6IHN0cmluZykge1xuXHRyZXR1cm4ge1xuXHRcdF9ndWFyZEhhc2g6IHNHdWFyZEhhc2gucmVwbGFjZSgvXFw/W15cXD9dKiQvLCBcIlwiKSwgLy8gUmVtb3ZlIHF1ZXJ5IHBhcnRcblx0XHRjaGVjazogZnVuY3Rpb24oc0hhc2g6IGFueSkge1xuXHRcdFx0cmV0dXJuIHNIYXNoLmluZGV4T2YodGhpcy5fZ3VhcmRIYXNoKSA9PT0gMDtcblx0XHR9XG5cdH07XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGlBcHBTdGF0ZSBwYXJ0IGZyb20gYSBoYXNoIChvciBudWxsIGlmIG5vdCBmb3VuZCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNIYXNoIFRoZSBoYXNoXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaUFwcFN0YXRlIHBhcnQgb2YgdGhlIGhhc2hcbiAqL1xuZnVuY3Rpb24gZmluZEFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3QgYUFwcFN0YXRlID0gc0hhc2gubWF0Y2gobmV3IFJlZ0V4cChcIlxcXFw/LipcIiArIGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0gKyBcIj0oW14mXSopXCIpKTtcblx0cmV0dXJuIGFBcHBTdGF0ZSAmJiBhQXBwU3RhdGUubGVuZ3RoID4gMSA/IGFBcHBTdGF0ZVsxXSA6IG51bGw7XG59XG4vKipcbiAqIFJldHVybnMgYSBoYXNoIHdpdGhvdXQgaXRzIGlBcHBTdGF0ZSBwYXJ0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzSGFzaCBUaGUgaGFzaFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGhhc2ggd2l0aG91dCB0aGUgaUFwcFN0YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcpIHtcblx0cmV0dXJuIHNIYXNoLnJlcGxhY2UobmV3IFJlZ0V4cChcIlsmP10qXCIgKyBlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNICsgXCI9W14mXSpcIiksIFwiXCIpO1xufVxuLyoqXG4gKiBBZGRzIGFuIGlBcHBTdGF0ZSBpbnNpZGUgYSBoYXNoIChvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUpLlxuICpcbiAqIEBwYXJhbSB7Kn0gc0hhc2ggVGhlIGhhc2hcbiAqIEBwYXJhbSB7Kn0gc0FwcFN0YXRlS2V5IFRoZSBpQXBwU3RhdGUgdG8gYWRkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaGFzaCB3aXRoIHRoZSBhcHAgc3RhdGVcbiAqL1xuZnVuY3Rpb24gc2V0QXBwU3RhdGVJbkhhc2goc0hhc2g6IGFueSwgc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0bGV0IHNOZXdIYXNoO1xuXG5cdGlmIChzSGFzaC5pbmRleE9mKGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0pID49IDApIHtcblx0XHQvLyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaCwgcmVwbGFjZSBpdFxuXHRcdHNOZXdIYXNoID0gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0gKyBcIj1bXiZdKlwiKSwgZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTSArIFwiPVwiICsgc0FwcFN0YXRlS2V5KTtcblx0fSBlbHNlIHtcblx0XHQvLyBBZGQgdGhlIGlBcHBTdGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIGhhc2hcblx0XHRpZiAoc0hhc2guaW5kZXhPZihcIj9cIikgPCAwKSB7XG5cdFx0XHRzTmV3SGFzaCA9IHNIYXNoICsgXCI/XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdIYXNoID0gc0hhc2ggKyBcIiZcIjtcblx0XHR9XG5cdFx0c05ld0hhc2ggKz0gZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTSArIFwiPVwiICsgc0FwcFN0YXRlS2V5O1xuXHR9XG5cblx0cmV0dXJuIHNOZXdIYXNoO1xufVxuXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVwiKVxuY2xhc3MgUm91dGVyUHJveHkgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0YklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdGJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHkgPSBmYWxzZTtcblx0YklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblx0c0lBcHBTdGF0ZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdF9vU2hlbGxTZXJ2aWNlcyE6IElTaGVsbFNlcnZpY2VzO1xuXHRmY2xFbmFibGVkITogYm9vbGVhbjtcblx0X2ZuQmxvY2tpbmdOYXZGaWx0ZXIhOiBGdW5jdGlvbjtcblx0X2ZuSGFzaEd1YXJkITogRnVuY3Rpb247XG5cdF9iRGlzYWJsZU9uSGFzaENoYW5nZSE6IGJvb2xlYW47XG5cdF9iSWdub3JlUmVzdG9yZSE6IGJvb2xlYW47XG5cdF9iQ2xlYW5lZFJlc3RvcmUhOiBib29sZWFuO1xuXHRfYkZvcmNlRm9jdXMhOiBib29sZWFuO1xuXHRfb1JvdXRlciE6IFJvdXRlcjtcblx0X29NYW5hZ2VkSGlzdG9yeSE6IGFueVtdO1xuXHRfb05hdmlnYXRpb25HdWFyZDogYW55O1xuXHRvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblx0X29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uPzogU3luY2hyb25pemF0aW9uO1xuXHRfYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm86IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JBcHBseVJlc3RvcmU6IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JEZWxheWVkUmVidWlsZDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdGluaXQob0FwcENvbXBvbmVudDogYW55LCBpc2ZjbEVuYWJsZWQ6IGJvb2xlYW4pIHtcblx0XHQvLyBTYXZlIHRoZSBuYW1lIG9mIHRoZSBhcHAgKGluY2x1ZGluZyBzdGFydHVwIHBhcmFtZXRlcnMpIGZvciByZWJ1aWxkaW5nIGZ1bGwgaGFzaGVzIGxhdGVyXG5cdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJzaGVsbFNlcnZpY2VzXCIpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29TaGVsbFNlcnZpY2VzID0gb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cblx0XHRcdFx0dGhpcy5pbml0UmF3KG9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCkpO1xuXHRcdFx0XHQvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgdGhlIGluaXRpYWwgcm91dGVNYXRjaGVkIGlzIGRvbmUgYmVmb3JlIGRvaW5nIGFueSBuYXZpZ2F0aW9uXG5cdFx0XHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGZlTGV2ZWw9MCBmb3IgdGhlIGZpcnN0IEFwcGxpY2F0aW9uIHBhZ2UgaW4gdGhlIGhpc3Rvcnlcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZmVMZXZlbDogMFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGhpc3Rvcnkuc3RhdGVcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uIGFzIGFueVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR0aGlzLmZjbEVuYWJsZWQgPSBpc2ZjbEVuYWJsZWQ7XG5cblx0XHRcdFx0dGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlciA9IHRoaXMuX2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlci5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcy5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgc2hlbGwgc2VydmljZXNcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHRcdHRoaXMuX2ZuSGFzaEd1YXJkID0gdGhpcy5oYXNoR3VhcmQuYmluZCh0aGlzKTtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHRoaXMuX2ZuSGFzaEd1YXJkIGFzIGFueSk7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9iSWdub3JlUmVzdG9yZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JDbGVhbmVkUmVzdG9yZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JGb3JjZUZvY3VzID0gdHJ1ZTsgLy8gVHJpZ2dlciB0aGUgZm9jdXMgbWVjaGFuaXNtIGZvciB0aGUgZmlyc3QgdmlldyBkaXNwbGF5ZWQgYnkgdGhlIGFwcFxuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHRpZiAodGhpcy5fb1NoZWxsU2VydmljZXMpIHtcblx0XHRcdHRoaXMuX29TaGVsbFNlcnZpY2VzLnVucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIpO1xuXHRcdH1cblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHRoaXMuX2ZuSGFzaEd1YXJkIGFzIGFueSk7XG5cdH1cblxuXHQvKipcblx0ICogUmF3IGluaXRpYWxpemF0aW9uIChmb3IgdW5pdCB0ZXN0cykuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUucm91dGluZy5Sb3V0ZXJ9IG9Sb3V0ZXIgVGhlIHJvdXRlciB1c2VkIGJ5IHRoaXMgcHJveHlcblx0ICovXG5cdGluaXRSYXcob1JvdXRlcjogUm91dGVyKSB7XG5cdFx0dGhpcy5fb1JvdXRlciA9IG9Sb3V0ZXI7XG5cdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5ID0gW107XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cblx0XHRjb25zdCBzQ3VycmVudEFwcEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEFwcEhhc2gpKTtcblxuXHRcdC8vIFNldCB0aGUgaUFwcFN0YXRlIGlmIHRoZSBpbml0aWFsIGhhc2ggY29udGFpbnMgb25lXG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gZmluZEFwcFN0YXRlSW5IYXNoKHNDdXJyZW50QXBwSGFzaCk7XG5cdH1cblxuXHRnZXRIYXNoKCkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpO1xuXHR9XG5cblx0aXNGb2N1c0ZvcmNlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYkZvcmNlRm9jdXM7XG5cdH1cblxuXHRzZXRGb2N1c0ZvcmNlZChiRm9yY2VkOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSBiRm9yY2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgdmFyaWFibGUgc0lBcHBTdGF0ZUtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5I3JlbW92ZUlBcHBTdGF0ZUtleVxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdHJlbW92ZUlBcHBTdGF0ZUtleSgpIHtcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGhhc2guXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eSNuYXZUb0hhc2hcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5XG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNIYXNoIEhhc2ggdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSBJZiBzZXQgdG8gdHJ1ZSwgY2FjaGUgcHJlc2VydmF0aW9uIG1lY2hhbmlzbSBpcyBkaXNhYmxlZCBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJGb3JjZUZvY3VzIElmIHNldCB0byB0cnVlLCB0aGUgbG9naWMgdG8gc2V0IHRoZSBmb2N1cyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCB3aWxsIGJlIHRyaWdnZXJlZCAob25QYWdlUmVhZHkpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIgSWYgbm90IHNldCB0byBmYWxzZSwgdGhlIGJhY2sgbmF2aWdhdGlvbiBpcyBzZXQgdG8gdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0bmF2VG9IYXNoKFxuXHRcdHNIYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0YkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZT86IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyPzogYm9vbGVhblxuXHQpIHtcblx0XHRpZiAoYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIgIT09IGZhbHNlKSB7XG5cdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcy5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24pIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi53YWl0Rm9yKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8pIHtcblx0XHRcdFx0dGhpcy53YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMpO1xuXHRcdH1cblx0fVxuXG5cdF9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaDogYW55LCBiUHJlc2VydmVIaXN0b3J5OiBhbnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU6IGFueSwgYkZvcmNlRm9jdXM/OiBib29sZWFuKSB7XG5cdFx0Ly8gQWRkIHRoZSBhcHAgc3RhdGUgaW4gdGhlIGhhc2ggaWYgbmVlZGVkXG5cdFx0aWYgKHRoaXMuZmNsRW5hYmxlZCAmJiB0aGlzLnNJQXBwU3RhdGVLZXkgJiYgIWZpbmRBcHBTdGF0ZUluSGFzaChzSGFzaCkpIHtcblx0XHRcdHNIYXNoID0gc2V0QXBwU3RhdGVJbkhhc2goc0hhc2gsIHRoaXMuc0lBcHBTdGF0ZUtleSk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzSGFzaCkpIHtcblx0XHRcdGlmICghdGhpcy5vUmVzb3VyY2VCdW5kbGUpIHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBoYXZlIHRvIHVzZSBhIGNvbmZpcm0gaGVyZSBmb3IgVUkgY29uc2lzdGVuY3kgcmVhc29ucywgYXMgd2l0aCBzb21lIHNjZW5hcmlvc1xuXHRcdFx0Ly8gaW4gdGhlIEVkaXRGbG93IHdlIHJlbHkgb24gYSBVSTUgbWVjaGFuaXNtIHRoYXQgZGlzcGxheXMgYSBjb25maXJtIGRpYWxvZy5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuXHRcdFx0aWYgKCFjb25maXJtKHRoaXMub1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1JPVVRFUl9QUk9YWV9TQVBGRV9FWElUX05PVFNBVkVEX01FU1NBR0VcIikpKSB7XG5cdFx0XHRcdC8vIFRoZSB1c2VyIGNsaWNrZWQgb24gQ2FuY2VsIC0tPiBjYW5jZWwgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEluIGNhc2UgdGhlIG5hdmlnYXRpb24gd2lsbCBjYXVzZSBhIG5ldyB2aWV3IHRvIGJlIGRpc3BsYXllZCwgd2UgZm9yY2UgdGhlIGZvY3VzXG5cdFx0Ly8gSS5lLiBpZiB0aGUga2V5cyBmb3IgdGhlIGhhc2ggd2UncmUgbmF2aWdhdGluZyB0byBpcyBhIHN1cGVyc2V0IG9mIHRoZSBjdXJyZW50IGhhc2gga2V5cy5cblx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKCF0aGlzLl9iRm9yY2VGb2N1cykge1xuXHRcdFx0Ly8gSWYgdGhlIGZvY3VzIHdhcyBhbHJlYWR5IGZvcmNlZCwga2VlcCBpdFxuXHRcdFx0Y29uc3QgYUN1cnJlbnRIYXNoS2V5cyA9IHRoaXMuX2V4dHJhY3RLZXlzRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdFx0dGhpcy5fYkZvcmNlRm9jdXMgPVxuXHRcdFx0XHRiRm9yY2VGb2N1cyB8fFxuXHRcdFx0XHQoYUN1cnJlbnRIYXNoS2V5cy5sZW5ndGggPCBvTmV3U3RhdGUua2V5cy5sZW5ndGggJiZcblx0XHRcdFx0XHRhQ3VycmVudEhhc2hLZXlzLmV2ZXJ5KGZ1bmN0aW9uKGtleTogYW55LCBpbmRleDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ga2V5ID09PSBvTmV3U3RhdGUua2V5c1tpbmRleF07XG5cdFx0XHRcdFx0fSkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgZmFsc2UsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyBicm93c2VyIGhpc3RvcnkgaWYgZW50cmllcyBoYXZlIGJlZW4gYWRkZWQgd2l0aG91dCB1c2luZyB0aGUgUm91dGVyUHJveHkuXG5cdCAqIFVwZGF0ZXMgdGhlIGludGVybmFsIGhpc3RvcnkgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgaGlzdG9yeSBpcyByZWJ1aWx0XG5cdCAqL1xuXHRyZXN0b3JlSGlzdG9yeSgpIHtcblx0XHRpZiAodGhpcy5fYkFwcGx5UmVzdG9yZSkge1xuXHRcdFx0dGhpcy5fYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXHRcdFx0bGV0IHNUYXJnZXRIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0XHRzVGFyZ2V0SGFzaCA9IHNUYXJnZXRIYXNoLnJlcGxhY2UoLyhcXD98JilyZXN0b3JlSGlzdG9yeT10cnVlLywgXCJcIik7XG5cdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzVGFyZ2V0SGFzaCk7XG5cblx0XHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgaGlzdG9yeS5cblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0bmF2QmFjaygpIHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgc1ByZXZpb3VzSGFzaDtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBjdXJyZW50IGhhc2ggaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0c1ByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNQcmV2aW91c0hhc2gpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzUHJldmlvdXNIYXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCBhIHByZXZpb3VzIGhhc2ggaW4gaGlzdG9yeVxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgdHJhbnNpZW50IGhhc2ggaW4gYSBjcmVhdGUgYXBwLCBhbmRcblx0XHRcdC8vIGluIHRoYXQgY2FzZSBoaXN0b3J5LmJhY2sgd291bGQgZ28gYmFjayB0byB0aGUgRkxQXG5cdFx0XHR3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlIHdpdGggcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNSb3V0ZU5hbWUgVGhlIHJvdXRlIG5hbWUgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0bmF2VG8oc1JvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKHNIYXNoLCBmYWxzZSwgb1BhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZSwgZmFsc2UsICFvUGFyYW1ldGVycy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGl0cyB0aGUgY3VycmVudCBhcHAgYnkgbmF2aWdhdGluZyBiYWNrXG5cdCAqIHRvIHRoZSBwcmV2aW91cyBhcHAgKGlmIGFueSkgb3IgdGhlIEZMUC5cblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHdlIGV4aXQgdGhlIGFwcFxuXHQgKi9cblx0ZXhpdEZyb21BcHAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaGVsbFNlcnZpY2VzLmJhY2tUb1ByZXZpb3VzQXBwKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBoYXNoIGNhbiBoYXZlIGFuIGltcGFjdCBvbiB0aGUgY3VycmVudCBzdGF0ZVxuXHQgKiBpLmUuIGlmIHRoZSBoYXNoIGlzIGVxdWFsLCBjb21wYXRpYmxlIG9yIGFuIGFuY2VzdG9yIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IHNIYXNoIGB0cnVlYCBpZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICogQHJldHVybnMge2Jvb2xlYW59IElmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKi9cblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNIYXNoOiBhbnkpIHtcblx0XHRpZiAoc0hhc2hbMF0gPT09IFwiL1wiKSB7XG5cdFx0XHRzSGFzaCA9IHNIYXNoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0xvY2FsR3VhcmQgPSBjcmVhdGVHdWFyZEZyb21IYXNoKHNIYXNoKTtcblx0XHRyZXR1cm4gb0xvY2FsR3VhcmQuY2hlY2sodGhpcy5nZXRIYXNoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59IGBmYWxzZWAgaWYgYSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBpbiB0aGUgUm91dGVyUHJveHkgYW5kIGlzIG5vdCB5ZXQgZmluYWxpemVkXG5cdCAqL1xuXHRpc05hdmlnYXRpb25GaW5hbGl6ZWQoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyAmJiAhdGhpcy5fYkRlbGF5ZWRSZWJ1aWxkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxhc3Qgc3RhdGUgYXMgYSBndWFyZC5cblx0ICogRWFjaCBmdXR1cmUgbmF2aWdhdGlvbiB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGlzIGd1YXJkLCBhbmQgYSBjb25maXJtYXRpb24gZGlhbG9nIHdpbGxcblx0ICogYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgbmF2aWdhdGlvbiBjcm9zc2VzIHRoZSBndWFyZCAoaS5lLiBnb2VzIHRvIGFuIGFuY2VzdG9yIG9mIHRoZSBndWFyZCkuXG5cdCAqL1xuXHRzZXROYXZpZ2F0aW9uR3VhcmQoKSB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IGNyZWF0ZUd1YXJkRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICovXG5cdGRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKSB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIG5hdmlnYXRpbmcgZ3VhcmQgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRoYXNOYXZpZ2F0aW9uR3VhcmQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgIT09IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogVGVzdHMgYSBoYXNoIGFnYWluc3QgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSGFzaCBUaGUgaGFzaCB0byBiZSB0ZXN0ZWRcblx0ICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBuYXZpZ2F0aW5nIHRvIHRoZSBoYXNoIGRvZXNuJ3QgY3Jvc3MgdGhlIGd1YXJkXG5cdCAqL1xuXHRjaGVja0hhc2hXaXRoR3VhcmQoc0hhc2g6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID09PSBudWxsIHx8IHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQuY2hlY2soc0hhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdXNlciBhbGxvd2VkIHRoZSBuYXZpZ2F0aW9uIGd1YXJkIHRvIGJlIGNyb3NzZWQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBiZWVuIGFsbG93ZWQgYnkgdGhlIHVzZXJcblx0ICovXG5cdGlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQWN0aXZhdGVzIHRoZSBzeW5jaHJvbml6YXRpb24gZm9yIHJvdXRlTWF0Y2hlZEV2ZW50LlxuXHQgKiBUaGUgbmV4dCBOYXZUb0hhc2ggY2FsbCB3aWxsIGNyZWF0ZSBhIFN5bmNocm9uaXphdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIHJlc29sdmVkXG5cdCAqIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG9uUm91dGVNYXRjaGVkIGV2ZW50LCBwcmV2ZW50aW5nIGFub3RoZXIgTmF2VG9IYXNoIHRvIGhhcHBlbiBpbiBwYXJhbGxlbC5cblx0ICovXG5cdGFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpIHtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSB0aGUgcm91dGVNYXRjaCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCB1bmxvY2tpbmcgcG90ZW50aWFsIHBlbmRpbmcgTmF2VG9IYXNoIGNhbGxzLlxuXHQgKi9cblx0cmVzb2x2ZVJvdXRlTWF0Y2goKSB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2VzIHN1cmUgbm8gbmF2aWdhdGlvbiBjYW4gaGFwcGVuIGJlZm9yZSBhIHJvdXRlTWF0Y2ggaGFwcGVuZWQuXG5cdCAqL1xuXHR3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKSB7XG5cdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSBuZXcgU3luY2hyb25pemF0aW9uKCk7XG5cdFx0dGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblx0fVxuXG5cdF9leHRyYWN0S2V5c0Zyb21IYXNoKHNIYXNoOiBhbnkpIHtcblx0XHRpZiAoc0hhc2ggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c0hhc2ggPSBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBzSGFzaE5vUGFyYW1zID0gc0hhc2guc3BsaXQoXCI/XCIpWzBdOyAvLyByZW1vdmUgcGFyYW1zXG5cdFx0Y29uc3QgYVRva2VucyA9IHNIYXNoTm9QYXJhbXMuc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFLZXlzOiBhbnlbXSA9IFtdO1xuXG5cdFx0YVRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKHNUb2tlbjogYW55KSB7XG5cdFx0XHRjb25zdCByZWdleEtleSA9IC9bXlxcKFxcKV0rXFwoW15cXChcXCldK1xcKS87IC8vIGFiYyhkZWYpXG5cdFx0XHRpZiAocmVnZXhLZXkudGVzdChzVG9rZW4pKSB7XG5cdFx0XHRcdGFLZXlzLnB1c2goc1Rva2VuLnNwbGl0KFwiKFwiKVswXSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gYUtleXM7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgc3RhdGUgZnJvbSBhIGhhc2guXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzSGFzaCBUaGUgaGFzaCB0byBiZSB1c2VkIGFzIGVudHJ5XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBzdGF0ZVxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaDogc3RyaW5nKSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvU3RhdGU6IGFueSA9IHtcblx0XHRcdGtleXM6IHRoaXMuX2V4dHJhY3RLZXlzRnJvbUhhc2goc0hhc2gpXG5cdFx0fTtcblxuXHRcdC8vIFJldHJpZXZlIGxheW91dCAoaWYgYW55KVxuXHRcdGNvbnN0IGFMYXlvdXQgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKFwiXFxcXD8uKlwiICsgZW51bVVSTFBhcmFtcy5MQVlPVVRQQVJBTSArIFwiPShbXiZdKilcIikpO1xuXHRcdG9TdGF0ZS5zTGF5b3V0ID0gYUxheW91dCAmJiBhTGF5b3V0Lmxlbmd0aCA+IDEgPyBhTGF5b3V0WzFdIDogbnVsbDtcblx0XHRpZiAob1N0YXRlLnNMYXlvdXQgPT09IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiKSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDE7XG5cdFx0fSBlbHNlIGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAwO1xuXHRcdH1cblxuXHRcdG9TdGF0ZS5oYXNoID0gc0hhc2g7XG5cdFx0cmV0dXJuIG9TdGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgbmV3IHN0YXRlIGludG8gdGhlIGludGVybmFsIGhpc3Rvcnkgc3RydWN0dXJlLlxuXHQgKiBNYWtlcyBzdXJlIHRoaXMgbmV3IHN0YXRlIGlzIGFkZGVkIGFmdGVyIGFuIGFuY2VzdG9yLlxuXHQgKiBBbHNvIHNldHMgdGhlIGlBcHBTdGF0ZSBrZXkgaW4gdGhlIHdob2xlIGhpc3RvcnkuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05ld1N0YXRlIFRoZSBuZXcgc3RhdGUgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBiUmVidWlsZE9ubHkgYHRydWVgIGlmIHdlJ3JlIHJlYnVpbGRpbmcgdGhlIGhpc3RvcnkgYWZ0ZXIgYSBzaGVsbCBtZW51IG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVIaXN0b3J5IElmIHNldCB0byB0cnVlLCBub24tYW5jZXN0b3IgZW50cmllcyBpbiBoaXN0b3J5IHdpbGwgYmUgcmV0YWluZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gRGlzYWJsZSB0aGUgbWVjaGFuaXNtIHRvIHJldGFpbmVkIG1hcmtlZCBlbnRyaWVzIGluIGNhY2hlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBuZXcgc3RhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3B1c2hOZXdTdGF0ZShvTmV3U3RhdGU6IGFueSwgYlJlYnVpbGRPbmx5OiBib29sZWFuLCBiUHJlc2VydmVIaXN0b3J5OiBib29sZWFuLCBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb246IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgbGFzdEluZGV4ID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7XG5cdFx0bGV0IGlQb3BDb3VudCA9IGJSZWJ1aWxkT25seSA/IDEgOiAwO1xuXG5cdFx0Ly8gMS4gRG8gc29tZSBjbGVhbnVwIGluIHRoZSBtYW5hZ2VkIGhpc3RvcnkgOiBpbiBjYXNlIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQgYmFjayBpbiB0aGUgYnJvd3NlciBoaXN0b3J5LCB3ZSBuZWVkIHRvIHJlbW92ZVxuXHRcdC8vIHRoZSBzdGF0ZXMgYWhlYWQgaW4gaGlzdG9yeSBhbmQgbWFrZSBzdXJlIHRoZSB0b3Agc3RhdGUgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZVxuXHRcdC8vIFdlIGRvbid0IGRvIHRoYXQgd2hlbiByZXN0b3JpbmcgdGhlIGhpc3RvcnksIGFzIHRoZSBjdXJyZW50IHN0YXRlIGhhcyBiZWVuIGFkZGVkIG9uIHRvcCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5XG5cdFx0Ly8gYW5kIGlzIG5vdCByZWZsZWN0ZWQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHR3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgdGhpcy5fb01hbmFnZWRIaXN0b3J5W2xhc3RJbmRleF0uaGFzaCAhPT0gc0N1cnJlbnRIYXNoKSB7XG5cdFx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0bGFzdEluZGV4LS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGhpc3RvcnkuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIGJyb3dzZXIgcmVsb2FkXG5cdFx0XHRcdC8vIGhhcHBlbmVkLCBjYXVzaW5nIGEgcmVpbml0aWFsaXphdGlvbiBvZiB0aGUgbWFuYWdlZCBoaXN0b3J5LlxuXHRcdFx0XHQvLyBJbiB0aGF0IGNhc2UsIHdlIHVzZSB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50IGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2godGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0N1cnJlbnRIYXNoKSk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiAwIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyAyLiBNYXJrIHRoZSB0b3Agc3RhdGUgYXMgcHJlc2VydmVkIGlmIHJlcXVpcmVkXG5cdFx0aWYgKGJQcmVzZXJ2ZUhpc3RvcnkgJiYgIWJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbikge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIDMuIFRoZW4gcG9wIGFsbCBzdGF0ZXMgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciBvZiB0aGUgbmV3IHN0YXRlLCBvciB3ZSBmaW5kIGEgc3RhdGUgdGhhdCBuZWVkIHRvIGJlIHByZXNlcnZlZFxuXHRcdGxldCBvTGFzdFJlbW92ZWRJdGVtO1xuXHRcdHdoaWxlICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1RvcFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiB8fCAhb1RvcFN0YXRlLnByZXNlcnZlZCkgJiZcblx0XHRcdFx0dGhpcy5fY29tcGFyZUNhY2hlU3RhdGVzKG9Ub3BTdGF0ZSwgb05ld1N0YXRlKSAhPT0gZW51bVN0YXRlLkFOQ0VTVE9SXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhlIHRvcCBzdGF0ZSBpcyBub3QgYW4gYW5jZXN0b3Igb2Ygb05ld1N0YXRlIGFuZCBpcyBub3QgcHJlc2VydmVkIC0tPiB3ZSBjYW4gcG9wIGl0XG5cdFx0XHRcdG9MYXN0UmVtb3ZlZEl0ZW0gPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGlQb3BDb3VudCsrO1xuXHRcdFx0fSBlbHNlIGlmIChvVG9wU3RhdGUucHJlc2VydmVkICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9Ub3BTdGF0ZS5oYXNoKSA9PT0gcmVtb3ZlQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpKSB7XG5cdFx0XHRcdC8vIFdlIHRyeSB0byBhZGQgYSBzdGF0ZSB0aGF0IGlzIGFscmVhZHkgaW4gY2FjaGUgKGR1ZSB0byBwcmVzZXJ2ZWQgZmxhZykgYnV0IHdpdGggYSBkaWZmZXJlbnQgaWFwcC1zdGF0ZVxuXHRcdFx0XHQvLyAtLT4gd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcHJldmlvdXMgZW50cnkgKGl0IHdpbGwgYmUgbGF0ZXIgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUpIGFuZCBzdG9wIHBvcHBpbmdcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHRcdG9OZXdTdGF0ZS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJyZWFrOyAvLyBBbmNlc3RvciBvciBwcmVzZXJ2ZWQgc3RhdGUgZm91bmQgLS0+IHdlIHN0b3AgcG9wcGluZyBvdXQgc3RhdGVzXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNC4gaUFwcFN0YXRlIG1hbmFnZW1lbnRcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBmaW5kQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpO1xuXHRcdGlmICh0aGlzLmZjbEVuYWJsZWQgJiYgdGhpcy5zSUFwcFN0YXRlS2V5KSB7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgdGhlIG5ldyBhcHAgc3RhdGUgbmVlZHMgdG8gYmUgYXBwbGllZCB0byB0aGUgd2hvbGUgaGlzdG9yeVxuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LmZvckVhY2goKG9NYW5hZ2VkU3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRvTWFuYWdlZFN0YXRlLmhhc2ggPSBzZXRBcHBTdGF0ZUluSGFzaChvTWFuYWdlZFN0YXRlLmhhc2gsIHRoaXMuc0lBcHBTdGF0ZUtleSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmZjbEVuYWJsZWQgJiYgb0xhc3RSZW1vdmVkSXRlbSkge1xuXHRcdFx0Y29uc3Qgc1ByZXZpb3VzSUFwcFN0YXRlS2V5ID0gZmluZEFwcFN0YXRlSW5IYXNoKG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaCk7XG5cdFx0XHRjb25zdCBvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID0gdGhpcy5fY29tcGFyZUNhY2hlU3RhdGVzKG9MYXN0UmVtb3ZlZEl0ZW0sIG9OZXdTdGF0ZSk7XG5cdFx0XHQvLyBpZiBjdXJyZW50IHN0YXRlIGRvZXNuJ3QgY29udGFpbiBhIGktYXBwc3RhdGUgYW5kIHRoaXMgc3RhdGUgc2hvdWxkIHJlcGxhY2UgYSBzdGF0ZSBjb250YWluaW5nIGEgaUFwcFN0YXRlXG5cdFx0XHQvLyB0aGVuIHRoZSBwcmV2aW91cyBpQXBwU3RhdGUgaXMgcHJlc2VydmVkXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCF0aGlzLnNJQXBwU3RhdGVLZXkgJiZcblx0XHRcdFx0c1ByZXZpb3VzSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdChvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID09PSBlbnVtU3RhdGUuRVFVQUwgfHwgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkNPTVBBVElCTEUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b05ld1N0YXRlLmhhc2ggPSBzZXRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCwgc1ByZXZpb3VzSUFwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA1LiBOb3cgd2UgY2FuIHB1c2ggdGhlIHN0YXRlIGF0IHRoZSB0b3Agb2YgdGhlIGludGVybmFsIGhpc3Rvcnlcblx0XHRjb25zdCBiSGFzU2FtZUhhc2ggPSBvTGFzdFJlbW92ZWRJdGVtICYmIG9OZXdTdGF0ZS5oYXNoID09PSBvTGFzdFJlbW92ZWRJdGVtLmhhc2g7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDAgfHwgdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5oYXNoICE9PSBvTmV3U3RhdGUuaGFzaCkge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2gob05ld1N0YXRlKTtcblx0XHR9XG5cblx0XHQvLyA2LiBEZXRlcm1pbmUgd2hpY2ggYWN0aW9ucyB0byBkbyBvbiB0aGUgaGlzdG9yeVxuXHRcdGlmIChpUG9wQ291bnQgPT09IDApIHtcblx0XHRcdC8vIE5vIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGFwcGVuZFxuXHRcdFx0cmV0dXJuIHsgdHlwZTogXCJhcHBlbmRcIiB9O1xuXHRcdH0gZWxzZSBpZiAoaVBvcENvdW50ID09PSAxKSB7XG5cdFx0XHQvLyBPbmx5IDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gcmVwbGFjZSBjdXJyZW50IGhhc2ggdW5sZXNzIGhhc2ggaXMgdGhlIHNhbWUgKHRoZW4gbm90aGluZyB0byBkbylcblx0XHRcdHJldHVybiBiSGFzU2FtZUhhc2ggPyB7IHR5cGU6IFwibm9uZVwiIH0gOiB7IHR5cGU6IFwicmVwbGFjZVwiIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE1vcmUgdGhhbiAxIHN0YXRlIHdhcyBwb3BwZWQgLS0+IGdvIGJha2MgaW4gaGlzdG9yeSBhbmQgcmVwbGFjZSBoYXNoIGlmIG5lY2Vzc2FyeVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJiYWNrXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH0gOiB7IHR5cGU6IFwiYmFjay1yZXBsYWNlXCIsIHN0ZXBzOiBpUG9wQ291bnQgLSAxIH07XG5cdFx0fVxuXHR9XG5cblx0X2Jsb2NraW5nTmF2aWdhdGlvbkZpbHRlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPyBcIkN1c3RvbVwiIDogXCJDb250aW51ZVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGUgdGhlIHJvdXRpbmcgYnkgY2FsbGluZyB0aGUgcm91dGVyIHN0b3AgbWV0aG9kLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5XG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKSB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSB0cnVlO1xuXHRcdHRoaXMuX29Sb3V0ZXIuc3RvcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgaW5pdGlhbGl6ZSBtZXRob2QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eSNfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JJZ25vcmVDdXJyZW50SGFzaF0gSWdub3JlIHRoZSBsYXN0IGhhc2ggZXZlbnQgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgcm91dGVyIGhhcyBpbml0aWFsaXplZFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UoYklnbm9yZUN1cnJlbnRIYXNoOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9vUm91dGVyLmluaXRpYWxpemUoYklnbm9yZUN1cnJlbnRIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTeW5jaHJvbml6ZXMgdGhlIGJyb3dzZXIgaGlzdG9yeSB3aXRoIHRoZSBpbnRlcm5hbCBoaXN0b3J5IG9mIHRoZSByb3V0ZXJQcm94eSwgYW5kIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0hpc3RvcnlBY3Rpb24gU3BlY2lmaWVzIHRoZSBuYXZpZ2F0aW9uIGFjdGlvbiB0byBiZSBwZXJmb3JtZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBiUmVidWlsZE9ubHkgYHRydWVgIGlmIGludGVybmFsIGhpc3RvcnkgaXMgY3VycmVudGx5IGJlaW5nIHJlYnVpbHRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbjogYW55LCBiUmVidWlsZE9ubHk6IGJvb2xlYW4pIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IHRydWU7XG5cdFx0XHRjb25zdCBvVGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLFxuXHRcdFx0XHRuZXdMZXZlbCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxO1xuXG5cdFx0XHRmdW5jdGlvbiByZXBsYWNlQXN5bmMoKSB7XG5cdFx0XHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0dGhhdC5fZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UodHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXG5cdFx0XHRcdGlmIChiUmVidWlsZE9ubHkpIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyLCBzbyB0aGF0XG5cdFx0XHRcdFx0XHQvLyBvblJvdXRlTWF0Y2hlZCBub3RpZmljYXRpb24gaXNuJ3QgcmFpc2VkXG5cdFx0XHRcdFx0XHR0aGF0Ll9lbmFibGVFdmVudE9uSGFzaENoYW5nZSh0cnVlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdHJlc29sdmUodHJ1ZSk7IC8vIGEgbmF2aWdhdGlvbiBvY2N1cnJlZFxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBc3luYyBjYWxsYmFja3Mgd2hlbiBuYXZpZ2F0aW5nIGJhY2ssIGluIG9yZGVyIHRvIGxldCBhbGwgbm90aWZpY2F0aW9ucyBhbmQgZXZlbnRzIGdldCBwcm9jZXNzZWRcblx0XHRcdGZ1bmN0aW9uIGJhY2tSZXBsYWNlQXN5bmMoKSB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja1JlcGxhY2VBc3luYyk7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyXG5cdFx0XHRcdFx0cmVwbGFjZUFzeW5jKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiYWNrQXN5bmMoKSB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdHRoYXQuX2JJZ25vcmVSZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0c3dpdGNoIChvSGlzdG9yeUFjdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJyZXBsYWNlXCI6XG5cdFx0XHRcdFx0KHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImFwcGVuZFwiOlxuXHRcdFx0XHRcdHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5zZXRIYXNoKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2tcIjpcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrLXJlcGxhY2VcIjpcblx0XHRcdFx0XHR0aGlzLl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTtcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIE5vIG5hdmlnYXRpb25cblx0XHRcdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpOyAvLyBubyBuYXZpZ2F0aW9uIC0tPiByZXNvbHZlIHRvIGZhbHNlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRMYXN0SGlzdG9yeUVudHJ5KCkge1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0aGFzaEd1YXJkKCkge1xuXHRcdGlmICh0aGlzLl9iQ2xlYW5lZFJlc3RvcmUpIHtcblx0XHRcdHRoaXMuX2JDbGVhbmVkUmVzdG9yZSA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBzSGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwicmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nKSB7XG5cdFx0XHRjb25zdCBhSGFzaFNwbGl0ID0gc0hhc2guc3BsaXQoXCImL1wiKTtcblx0XHRcdGNvbnN0IHNBcHBIYXNoID0gYUhhc2hTcGxpdFsxXSA/IGFIYXNoU3BsaXRbMV0gOiBcIlwiO1xuXHRcdFx0aWYgKHRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNBcHBIYXNoKSkge1xuXHRcdFx0XHR0aGlzLl9iRGVsYXllZFJlYnVpbGQgPSB0cnVlO1xuXHRcdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQXBwSGFzaCk7XG5cdFx0XHRcdHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYkRlbGF5ZWRSZWJ1aWxkID0gZmFsc2U7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlcyAyIHN0YXRlcy5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTFcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTJcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbjpcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkVRVUFMIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGVxdWFsXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5DT01QQVRJQkxFIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGNvbXBhdGlibGVcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkFOQ0VTVE9SIGlmIG9TdGF0ZTEgaXMgYW4gYW5jZXN0b3Igb2Ygb1N0YXRlMlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRElGRkVSRU5UIGlmIHRoZSAyIHN0YXRlcyBhcmUgZGlmZmVyZW50XG5cdCAqL1xuXG5cdF9jb21wYXJlQ2FjaGVTdGF0ZXMob1N0YXRlMTogYW55LCBvU3RhdGUyOiBhbnkpIHtcblx0XHQvLyBGaXJzdCBjb21wYXJlIG9iamVjdCBrZXlzXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPiBvU3RhdGUyLmtleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cdFx0bGV0IGVxdWFsID0gdHJ1ZTtcblx0XHRsZXQgaW5kZXg7XG5cdFx0Zm9yIChpbmRleCA9IDA7IGVxdWFsICYmIGluZGV4IDwgb1N0YXRlMS5rZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKG9TdGF0ZTEua2V5c1tpbmRleF0gIT09IG9TdGF0ZTIua2V5c1tpbmRleF0pIHtcblx0XHRcdFx0ZXF1YWwgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFlcXVhbCkge1xuXHRcdFx0Ly8gU29tZSBvYmplY3RzIGtleXMgYXJlIGRpZmZlcmVudFxuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGtleXMgZnJvbSBvU3RhdGUxIGFyZSBpbiBvU3RhdGUyIC0tPiBjaGVjayBpZiBhbmNlc3RvclxuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoIDwgb1N0YXRlMi5rZXlzLmxlbmd0aCB8fCBvU3RhdGUxLnNjcmVlbk1vZGUgPCBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuQU5DRVNUT1I7XG5cdFx0fVxuXHRcdGlmIChvU3RhdGUxLnNjcmVlbk1vZGUgPiBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UOyAvLyBOb3Qgc3VyZSB0aGlzIGNhc2UgY2FuIGhhcHBlbi4uLlxuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgc3RhZ2UsIHRoZSAyIHN0YXRlcyBoYXZlIHRoZSBzYW1lIG9iamVjdCBrZXlzIChpbiB0aGUgc2FtZSBvcmRlcikgYW5kIHNhbWUgc2NyZWVubW9kZVxuXHRcdC8vIFRoZXkgY2FuIGJlIGVpdGhlciBjb21wYXRpYmxlIG9yIGVxdWFsXG5cdFx0cmV0dXJuIG9TdGF0ZTEuc0xheW91dCA9PT0gb1N0YXRlMi5zTGF5b3V0ID8gZW51bVN0YXRlLkVRVUFMIDogZW51bVN0YXRlLkNPTVBBVElCTEU7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGJhY2sgZXhpdHMgdGhlIHByZXNlbnQgZ3VhcmQgc2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ByZXNlbnRIYXNoIFRoZSBjdXJyZW50IGhhc2guIE9ubHkgdXNlZCBmb3IgdW5pdCB0ZXN0cy5cblx0ICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBiYWNrIGV4aXRzIHRoZXJlIGlzIGEgZ3VhcmQgZXhpdCBvbiBiYWNrXG5cdCAqL1xuXHRjaGVja0lmQmFja0lzT3V0T2ZHdWFyZChzUHJlc2VudEhhc2g6IHN0cmluZykge1xuXHRcdGxldCBzUHJldkhhc2g7XG5cblx0XHRpZiAoc1ByZXNlbnRIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFdlIHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBpbnN0ZWFkIG9mIEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpIGJlY2F1c2UgdGhlIGxhdHRlclxuXHRcdFx0Ly8gcmVwbGFjZXMgY2hhcmFjdGVycyBpbiB0aGUgVVJMIChlLmcuICUyNCByZXBsYWNlZCBieSAkKSBhbmQgaXQgY2F1c2VzIGlzc3VlcyB3aGVuIGNvbXBhcmluZ1xuXHRcdFx0Ly8gd2l0aCB0aGUgVVJMcyBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0XHRjb25zdCBvU3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXMuc3BsaXRIYXNoKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSBhcyBhbnk7XG5cdFx0XHRpZiAob1NwbGl0SGFzaCAmJiBvU3BsaXRIYXNoLmFwcFNwZWNpZmljUm91dGUpIHtcblx0XHRcdFx0c1ByZXNlbnRIYXNoID0gb1NwbGl0SGFzaC5hcHBTcGVjaWZpY1JvdXRlO1xuXHRcdFx0XHRpZiAoc1ByZXNlbnRIYXNoLmluZGV4T2YoXCImL1wiKSA9PT0gMCkge1xuXHRcdFx0XHRcdHNQcmVzZW50SGFzaCA9IHNQcmVzZW50SGFzaC5zdWJzdHJpbmcoMik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNQcmVzZW50SGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKTsgLy8gVG8gcmVtb3ZlIHRoZSAnIydcblx0XHRcdFx0aWYgKHNQcmVzZW50SGFzaFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdFx0XHRzUHJlc2VudEhhc2ggPSBzUHJlc2VudEhhc2guc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNQcmVzZW50SGFzaCA9IFVSSS5kZWNvZGUoc1ByZXNlbnRIYXNoKTtcblx0XHRpZiAodGhpcy5fb05hdmlnYXRpb25HdWFyZCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaV0uaGFzaCA9PT0gc1ByZXNlbnRIYXNoKSB7XG5cdFx0XHRcdFx0c1ByZXZIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W2kgLSAxXS5oYXNoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAhc1ByZXZIYXNoIHx8ICF0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzUHJldkhhc2gpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBsYXN0IDIgZW50cmllcyBpbiB0aGUgaGlzdG9yeSBzaGFyZSB0aGUgc2FtZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICovXG5cdGNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQoKSB7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPCAyKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3Qgb1ByZXZpb3VzU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDJdO1xuXG5cdFx0cmV0dXJuIG9DdXJyZW50U3RhdGUuaGFzaC5zcGxpdChcIj9cIilbMF0gPT09IG9QcmV2aW91c1N0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlclByb3h5O1xuIl19