@sapui5/sap.fe.core 1.97.0 → 1.100.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 (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +68 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -237,6 +237,43 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
237
237
  }
238
238
  }
239
239
 
240
+ function getNavigationInfoFromProperty(property) {
241
+ var annotations = property.annotations["Common"] || {}; // Look for the semanticObject annotation (if any)
242
+
243
+ var semanticObjectAnnotation;
244
+ Object.keys(annotations).forEach(function (annotationKey) {
245
+ var annotation = annotations[annotationKey];
246
+
247
+ if (annotation.term === "com.sap.vocabularies.Common.v1.SemanticObject") {
248
+ if (!annotation.qualifier || !semanticObjectAnnotation) {
249
+ // We always take the annotation without qualifier if there's one, otherwise we take the first one
250
+ semanticObjectAnnotation = annotation;
251
+ }
252
+ }
253
+ });
254
+
255
+ if (semanticObjectAnnotation) {
256
+ var result = {
257
+ semanticObject: semanticObjectAnnotation.toString(),
258
+ unavailableActions: []
259
+ }; // Look for the unavailable actions (if any)
260
+
261
+ var annotationKey = Object.keys(annotations).find(function (key) {
262
+ var _semanticObjectAnnota;
263
+
264
+ return annotations[key].term === "com.sap.vocabularies.Common.v1.SemanticObjectUnavailableActions" && annotations[key].qualifier === ((_semanticObjectAnnota = semanticObjectAnnotation) === null || _semanticObjectAnnota === void 0 ? void 0 : _semanticObjectAnnota.qualifier);
265
+ });
266
+
267
+ if (annotationKey) {
268
+ result.unavailableActions = annotations[annotationKey];
269
+ }
270
+
271
+ return result;
272
+ } else {
273
+ return undefined;
274
+ }
275
+ }
276
+
240
277
  function createKPIDefinition(kpiName, kpiConfig, converterContext) {
241
278
  var _datapointAnnotation$, _datapointAnnotation$2;
242
279
 
@@ -252,7 +289,8 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
252
289
  var selectionVariantAnnotation;
253
290
  var datapointAnnotation;
254
291
  var presentationVariantAnnotation;
255
- var chartAnnotation; // Search for a KPI with the qualifier frmo the manifest
292
+ var chartAnnotation;
293
+ var navigationInfo; // Search for a KPI with the qualifier frmo the manifest
256
294
 
257
295
  var aKPIAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.KPI");
258
296
  var targetKPI = aKPIAnnotations.find(function (kpi) {
@@ -260,7 +298,7 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
260
298
  });
261
299
 
262
300
  if (targetKPI) {
263
- var _targetKPI$Detail, _presentationVariantA3, _presentationVariantA4, _presentationVariantA5;
301
+ var _targetKPI$Detail, _presentationVariantA3, _presentationVariantA4, _presentationVariantA5, _targetKPI$Detail2;
264
302
 
265
303
  datapointAnnotation = targetKPI.DataPoint;
266
304
  selectionVariantAnnotation = targetKPI.SelectionVariant;
@@ -268,6 +306,16 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
268
306
  chartAnnotation = (_presentationVariantA3 = presentationVariantAnnotation) === null || _presentationVariantA3 === void 0 ? void 0 : (_presentationVariantA4 = _presentationVariantA3.Visualizations) === null || _presentationVariantA4 === void 0 ? void 0 : (_presentationVariantA5 = _presentationVariantA4.find(function (viz) {
269
307
  return viz.$target.$Type === "com.sap.vocabularies.UI.v1.ChartDefinitionType";
270
308
  })) === null || _presentationVariantA5 === void 0 ? void 0 : _presentationVariantA5.$target;
309
+
310
+ if ((_targetKPI$Detail2 = targetKPI.Detail) !== null && _targetKPI$Detail2 !== void 0 && _targetKPI$Detail2.SemanticObject) {
311
+ var _targetKPI$Detail$Act;
312
+
313
+ navigationInfo = {
314
+ semanticObject: targetKPI.Detail.SemanticObject.toString(),
315
+ action: (_targetKPI$Detail$Act = targetKPI.Detail.Action) === null || _targetKPI$Detail$Act === void 0 ? void 0 : _targetKPI$Detail$Act.toString(),
316
+ unavailableActions: []
317
+ };
318
+ }
271
319
  } else {
272
320
  // Fallback: try to find a SPV with the same qualifier
273
321
  var aSPVAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.SelectionPresentationVariant");
@@ -325,7 +373,24 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
325
373
  },
326
374
  selectionVariantFilterDefinitions: selectionVariantAnnotation ? getFilterDefinitionsFromSelectionVariant(selectionVariantAnnotation) : undefined,
327
375
  chart: chartDef
328
- };
376
+ }; // Navigation
377
+
378
+ if (!navigationInfo) {
379
+ // No navigationInfo was found in the KPI annotation --> try the outbound navigation from the manifest
380
+ if (kpiConfig.detailNavigation) {
381
+ navigationInfo = {
382
+ outboundNavigation: kpiConfig.detailNavigation
383
+ };
384
+ } else {
385
+ // No outbound navigation in the manifest --> try the semantic object on the Datapoint value
386
+ navigationInfo = getNavigationInfoFromProperty(datapointProperty);
387
+ }
388
+ }
389
+
390
+ if (navigationInfo) {
391
+ kpiDef.navigation = navigationInfo;
392
+ }
393
+
329
394
  updateCurrency(datapointAnnotation, kpiDef);
330
395
  updateCriticality(datapointAnnotation, aggregationHelper, kpiDef);
331
396
  updateTrend(datapointAnnotation, aggregationHelper, kpiDef);
@@ -356,4 +421,4 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
356
421
  _exports.getKPIDefinitions = getKPIDefinitions;
357
422
  return _exports;
358
423
  }, false);
359
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSS50cyJdLCJuYW1lcyI6WyJEZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwiS1BJQ2hhcnRUeXBlRnJvbVVJIiwiY29udmVydEtQSUNoYXJ0IiwiY2hhcnRBbm5vdGF0aW9uIiwicHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24iLCJNZWFzdXJlcyIsInVuZGVmaW5lZCIsImNoYXJEaW1lbnNpb25zIiwiRGltZW5zaW9ucyIsIm1hcCIsInByb3BlcnR5UGF0aCIsImRpbUF0dHJpYnV0ZSIsIkRpbWVuc2lvbkF0dHJpYnV0ZXMiLCJmaW5kIiwiYXR0cmlidXRlIiwiRGltZW5zaW9uIiwidmFsdWUiLCJuYW1lIiwibGFiZWwiLCIkdGFyZ2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJMYWJlbCIsInRvU3RyaW5nIiwicm9sZSIsIlJvbGUiLCJyZXBsYWNlIiwiY2hhcnRNZWFzdXJlcyIsIm1lYXN1cmVBdHRyaWJ1dGUiLCJNZWFzdXJlQXR0cmlidXRlcyIsIk1lYXN1cmUiLCJjaGFydFR5cGUiLCJDaGFydFR5cGUiLCJkaW1lbnNpb25zIiwibWVhc3VyZXMiLCJzb3J0T3JkZXIiLCJTb3J0T3JkZXIiLCJQcm9wZXJ0eSIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwibWF4SXRlbXMiLCJNYXhJdGVtcyIsInZhbHVlT2YiLCJ1cGRhdGVDdXJyZW5jeSIsImRhdGFwb2ludEFubm90YXRpb24iLCJrcGlEZWYiLCJ0YXJnZXRWYWx1ZVByb3BlcnR5IiwiVmFsdWUiLCJJU09DdXJyZW5jeSIsImN1cnJlbmN5IiwiaXNQYXRoRXhwcmVzc2lvbiIsImRhdGFwb2ludCIsInVuaXQiLCJpc0N1cnJlbmN5IiwiaXNQYXRoIiwiVW5pdCIsInVwZGF0ZUNyaXRpY2FsaXR5IiwiYWdncmVnYXRpb25IZWxwZXIiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJpc1Byb3BlcnR5QWdncmVnYXRhYmxlIiwiY3JpdGljYWxpdHlQYXRoIiwicGF0aCIsImNyaXRpY2FsaXR5VmFsdWUiLCJNZXNzYWdlVHlwZSIsIk5vbmUiLCJnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUiLCJDcml0aWNhbGl0eUNhbGN1bGF0aW9uIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJJbXByb3ZlbWVudERpcmVjdGlvbiIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwicHVzaCIsIkRldmlhdGlvblJhbmdlTG93VmFsdWUiLCJUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIiwiQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUiLCJBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUiLCJUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSIsIkRldmlhdGlvblJhbmdlSGlnaFZhbHVlIiwidXBkYXRlVHJlbmQiLCJUcmVuZCIsInRyZW5kUHJvcGVydHkiLCJ0cmVuZFBhdGgiLCJ0cmVuZFZhbHVlIiwiVHJlbmRDYWxjdWxhdGlvbiIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwiSXNSZWxhdGl2ZURpZmZlcmVuY2UiLCJSZWZlcmVuY2VWYWx1ZSIsInJlZmVyZW5jZVByb3BlcnR5IiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwiU3Ryb25nRG93bkRpZmZlcmVuY2UiLCJEb3duRGlmZmVyZW5jZSIsIlVwRGlmZmVyZW5jZSIsIlN0cm9uZ1VwRGlmZmVyZW5jZSIsInVwZGF0ZVRhcmdldCIsIlRhcmdldFZhbHVlIiwidGFyZ2V0UHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwidGFyZ2V0VmFsdWUiLCJjcmVhdGVLUElEZWZpbml0aW9uIiwia3BpTmFtZSIsImtwaUNvbmZpZyIsImNvbnZlcnRlckNvbnRleHQiLCJrcGlDb252ZXJ0ZXJDb250ZXh0IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImVudGl0eVNldCIsIkFnZ3JlZ2F0aW9uSGVscGVyIiwiZ2V0RW50aXR5VHlwZSIsImlzQW5hbHl0aWNzU3VwcG9ydGVkIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJBbm5vdGF0aW9uIiwiSXNzdWVTZXZlcml0eSIsIk1lZGl1bSIsIklzc3VlVHlwZSIsIktQSV9JU1NVRVMiLCJOT19BTkFMWVRJQ1MiLCJzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbiIsImFLUElBbm5vdGF0aW9ucyIsImdldEFubm90YXRpb25zQnlUZXJtIiwidGFyZ2V0S1BJIiwia3BpIiwicXVhbGlmaWVyIiwiRGF0YVBvaW50IiwiU2VsZWN0aW9uVmFyaWFudCIsIkRldGFpbCIsIkRlZmF1bHRQcmVzZW50YXRpb25WYXJpYW50IiwiVmlzdWFsaXphdGlvbnMiLCJ2aXoiLCIkVHlwZSIsImFTUFZBbm5vdGF0aW9ucyIsInRhcmdldFNQViIsInNwdiIsIlByZXNlbnRhdGlvblZhcmlhbnQiLCJLUElfTk9UX0ZPVU5EIiwiS1BJX0RFVEFJTF9OT1RfRk9VTkQiLCJkYXRhcG9pbnRQcm9wZXJ0eSIsIk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSIsImNoYXJ0RGVmIiwiaWQiLCJLUElJRCIsImFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRpdGxlIiwiVGl0bGUiLCJkZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImNoYXJ0IiwiZ2V0S1BJRGVmaW5pdGlvbnMiLCJrcGlDb25maWdzIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0S1BJQ29uZmlndXJhdGlvbiIsImtwaURlZnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsIm9EZWYiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7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LE9BQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS1BJQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRBbm5vdGF0aW9uVGVybSxcblx0VUlBbm5vdGF0aW9uVGVybXMsXG5cdFVJQW5ub3RhdGlvblR5cGVzLFxuXHRQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdENyaXRpY2FsaXR5VHlwZSxcblx0SW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHtcblx0S1BJVHlwZSxcblx0U2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFR5cGUsXG5cdFByZXNlbnRhdGlvblZhcmlhbnQsXG5cdFNlbGVjdGlvblZhcmlhbnQsXG5cdERhdGFQb2ludCxcblx0Q2hhcnQsXG5cdFRyZW5kVHlwZVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvVUlcIjtcbmltcG9ydCB7IFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L0VkbVwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHsgS1BJSUQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9JRFwiO1xuaW1wb3J0IHsgaXNQYXRoRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyVHlwZXNcIjtcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uSGVscGVyIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB7IElzc3VlQ2F0ZWdvcnksIElzc3VlU2V2ZXJpdHksIElzc3VlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUgfSBmcm9tIFwiLi9Dcml0aWNhbGl0eVwiO1xuaW1wb3J0IHsgZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCwgRmlsdGVyRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvU2VsZWN0aW9uVmFyaWFudEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBLUElDaGFydERlZmluaXRpb24gPSB7XG5cdGNoYXJ0VHlwZTogc3RyaW5nO1xuXHRkaW1lbnNpb25zOiB7IG5hbWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgcm9sZT86IHN0cmluZyB9W107XG5cdG1lYXN1cmVzOiB7IG5hbWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgcm9sZT86IHN0cmluZyB9W107XG5cdHNvcnRPcmRlcj86IHsgbmFtZTogc3RyaW5nOyBkZXNjZW5kaW5nOiBib29sZWFuIH1bXTtcblx0bWF4SXRlbXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBLUElEZWZpbml0aW9uID0ge1xuXHRpZDogc3RyaW5nO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcblx0ZGF0YXBvaW50OiB7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0XHR1bml0Pzoge1xuXHRcdFx0dmFsdWU6IHN0cmluZztcblx0XHRcdGlzUGF0aDogYm9vbGVhbjtcblx0XHRcdGlzQ3VycmVuY3k6IGJvb2xlYW47XG5cdFx0fTtcblx0XHRjcml0aWNhbGl0eVBhdGg/OiBzdHJpbmc7XG5cdFx0Y3JpdGljYWxpdHlWYWx1ZT86IE1lc3NhZ2VUeXBlO1xuXHRcdGNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlPzogSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlO1xuXHRcdGNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzPzogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW107XG5cdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0dHJlbmRQYXRoPzogc3RyaW5nO1xuXHRcdHRyZW5kVmFsdWU/OiBzdHJpbmc7XG5cdFx0dHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlPzogbnVtYmVyO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoPzogc3RyaW5nO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHM/OiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXTtcblx0XHR0cmVuZENhbGN1bGF0aW9uSXNSZWxhdGl2ZT86IGJvb2xlYW47XG5cdFx0dGFyZ2V0VmFsdWU/OiBudW1iZXI7XG5cdFx0dGFyZ2V0UGF0aD86IHN0cmluZztcblx0fTtcblx0Y2hhcnQ6IEtQSUNoYXJ0RGVmaW5pdGlvbjtcblx0c2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPzogRmlsdGVyRGVmaW5pdGlvbltdO1xufTtcblxuY29uc3QgRGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcblx0XCJVSS5UcmVuZFR5cGUvU3Ryb25nVXBcIjogXCJVcFwiLFxuXHRcIlVJLlRyZW5kVHlwZS9VcFwiOiBcIlVwXCIsXG5cdFwiVUkuVHJlbmRUeXBlL1N0cm9uZ0Rvd25cIjogXCJEb3duXCIsXG5cdFwiVUkuVHJlbmRUeXBlL0Rvd25cIjogXCJEb3duXCIsXG5cdFwiVUkuVHJlbmRUeXBlL1NpZGV3YXlzXCI6IFwiTm9uZVwiXG59O1xuXG5jb25zdCBLUElDaGFydFR5cGVGcm9tVUk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG5cdFwiVUkuQ2hhcnRUeXBlL0NvbHVtblN0YWNrZWRcIjogXCJTdGFja2VkQ29sdW1uXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0JhclN0YWNrZWRcIjogXCJTdGFja2VkQmFyXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0RvbnV0XCI6IFwiRG9udXRcIixcblx0XCJVSS5DaGFydFR5cGUvTGluZVwiOiBcIkxpbmVcIixcblx0XCJVSS5DaGFydFR5cGUvQnViYmxlXCI6IFwiYnViYmxlXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0NvbHVtblwiOiBcImNvbHVtblwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9CYXJcIjogXCJiYXJcIixcblx0XCJVSS5DaGFydFR5cGUvVmVydGljYWxCdWxsZXRcIjogXCJ2ZXJ0aWNhbF9idWxsZXRcIixcblx0XCJVSS5DaGFydFR5cGUvQ29tYmluYXRpb25cIjogXCJjb21iaW5hdGlvblwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9TY2F0dGVyXCI6IFwic2NhdHRlclwiXG59O1xuXG5mdW5jdGlvbiBjb252ZXJ0S1BJQ2hhcnQoY2hhcnRBbm5vdGF0aW9uOiBDaGFydCwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnQpOiBLUElDaGFydERlZmluaXRpb24gfCB1bmRlZmluZWQge1xuXHRpZiAoY2hhcnRBbm5vdGF0aW9uLk1lYXN1cmVzID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBXZSBuZWVkIGF0IGxlYXN0IDEgbWVhc3VyZSAoYnV0IG5vIGRpbWVuc2lvbiBpcyBhbGxvd2VkLCBlLmcuIGZvciBidWJibGUgY2hhcnQpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IGNoYXJEaW1lbnNpb25zID0gY2hhcnRBbm5vdGF0aW9uLkRpbWVuc2lvbnNcblx0XHQ/IChjaGFydEFubm90YXRpb24uRGltZW5zaW9ucyBhcyBQcm9wZXJ0eVBhdGhbXSkubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRcdGNvbnN0IGRpbUF0dHJpYnV0ZSA9IGNoYXJ0QW5ub3RhdGlvbi5EaW1lbnNpb25BdHRyaWJ1dGVzPy5maW5kKGF0dHJpYnV0ZSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHJpYnV0ZS5EaW1lbnNpb24/LnZhbHVlID09PSBwcm9wZXJ0eVBhdGgudmFsdWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG5hbWU6IHByb3BlcnR5UGF0aC52YWx1ZSxcblx0XHRcdFx0XHRsYWJlbDogcHJvcGVydHlQYXRoLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSB8fCBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRcdFx0cm9sZTogZGltQXR0cmlidXRlPy5Sb2xlPy5yZXBsYWNlKFwiVUkuQ2hhcnREaW1lbnNpb25Sb2xlVHlwZS9cIiwgXCJcIilcblx0XHRcdFx0fTtcblx0XHQgIH0pXG5cdFx0OiBbXTtcblxuXHRjb25zdCBjaGFydE1lYXN1cmVzID0gKGNoYXJ0QW5ub3RhdGlvbi5NZWFzdXJlcyBhcyBQcm9wZXJ0eVBhdGhbXSkubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0Y29uc3QgbWVhc3VyZUF0dHJpYnV0ZSA9IGNoYXJ0QW5ub3RhdGlvbi5NZWFzdXJlQXR0cmlidXRlcz8uZmluZChhdHRyaWJ1dGUgPT4ge1xuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZS5NZWFzdXJlPy52YWx1ZSA9PT0gcHJvcGVydHlQYXRoLnZhbHVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRsYWJlbDogcHJvcGVydHlQYXRoLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSB8fCBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRyb2xlOiBtZWFzdXJlQXR0cmlidXRlPy5Sb2xlPy5yZXBsYWNlKFwiVUkuQ2hhcnRNZWFzdXJlUm9sZVR5cGUvXCIsIFwiXCIpXG5cdFx0fTtcblx0fSk7XG5cblx0cmV0dXJuIHtcblx0XHRjaGFydFR5cGU6IEtQSUNoYXJ0VHlwZUZyb21VSVtjaGFydEFubm90YXRpb24uQ2hhcnRUeXBlXSB8fCBcIkxpbmVcIixcblx0XHRkaW1lbnNpb25zOiBjaGFyRGltZW5zaW9ucyxcblx0XHRtZWFzdXJlczogY2hhcnRNZWFzdXJlcyxcblx0XHRzb3J0T3JkZXI6IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXI/Lm1hcChzb3J0T3JkZXIgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbmFtZTogc29ydE9yZGVyLlByb3BlcnR5Py52YWx1ZSB8fCBcIlwiLCBkZXNjZW5kaW5nOiAhIXNvcnRPcmRlci5EZXNjZW5kaW5nIH07XG5cdFx0fSksXG5cdFx0bWF4SXRlbXM6IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5NYXhJdGVtcz8udmFsdWVPZigpIGFzIG51bWJlclxuXHR9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdXJyZW5jeShkYXRhcG9pbnRBbm5vdGF0aW9uOiBEYXRhUG9pbnQsIGtwaURlZjogS1BJRGVmaW5pdGlvbik6IHZvaWQge1xuXHRjb25zdCB0YXJnZXRWYWx1ZVByb3BlcnR5ID0gZGF0YXBvaW50QW5ub3RhdGlvbi5WYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRpZiAodGFyZ2V0VmFsdWVQcm9wZXJ0eS5hbm5vdGF0aW9ucy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kpIHtcblx0XHRjb25zdCBjdXJyZW5jeSA9IHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKGN1cnJlbmN5KSkge1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC51bml0ID0ge1xuXHRcdFx0XHR2YWx1ZTogKChjdXJyZW5jeS4kdGFyZ2V0IGFzIHVua25vd24pIGFzIFByb3BlcnR5KS5uYW1lLFxuXHRcdFx0XHRpc0N1cnJlbmN5OiB0cnVlLFxuXHRcdFx0XHRpc1BhdGg6IHRydWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6IGN1cnJlbmN5LnRvU3RyaW5nKCksXG5cdFx0XHRcdGlzQ3VycmVuY3k6IHRydWUsXG5cdFx0XHRcdGlzUGF0aDogZmFsc2Vcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LlVuaXQpIHtcblx0XHRjb25zdCB1bml0ID0gdGFyZ2V0VmFsdWVQcm9wZXJ0eS5hbm5vdGF0aW9ucy5NZWFzdXJlcz8uVW5pdDtcblx0XHRpZiAoaXNQYXRoRXhwcmVzc2lvbih1bml0KSkge1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC51bml0ID0ge1xuXHRcdFx0XHR2YWx1ZTogKCh1bml0LiR0YXJnZXQgYXMgdW5rbm93bikgYXMgUHJvcGVydHkpLm5hbWUsXG5cdFx0XHRcdGlzQ3VycmVuY3k6IGZhbHNlLFxuXHRcdFx0XHRpc1BhdGg6IHRydWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6IHVuaXQudG9TdHJpbmcoKSxcblx0XHRcdFx0aXNDdXJyZW5jeTogZmFsc2UsXG5cdFx0XHRcdGlzUGF0aDogZmFsc2Vcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNyaXRpY2FsaXR5KGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHkpIHtcblx0XHRpZiAodHlwZW9mIGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHkgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCBjcml0aWNhbGl0eVByb3BlcnR5ID0gKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHkgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPENyaXRpY2FsaXR5VHlwZT4pLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUFnZ3JlZ2F0YWJsZShjcml0aWNhbGl0eVByb3BlcnR5KSkge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5IGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+KS5wYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gVGhlIHByb3BlcnR5IGlzbid0IGFnZ3JlZ2F0YWJsZSAtLT4gd2UgaWdub3JlIGl0XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGFuIGVudW0gVmFsdWUgLS0+IGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdmFsdWVcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSA9IGdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZShkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5KTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uKSB7XG5cdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSA9IGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5JbXByb3ZlbWVudERpcmVjdGlvbjtcblx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzID0gW107XG5cdFx0c3dpdGNoIChrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL1RhcmdldFwiOlxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlTG93VmFsdWUpO1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLlRvbGVyYW5jZVJhbmdlTG93VmFsdWUpO1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLlRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5EZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01pbmltaXplXCI6XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NYXhpbWl6ZVwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5EZXZpYXRpb25SYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVHJlbmQoZGF0YXBvaW50QW5ub3RhdGlvbjogRGF0YVBvaW50LCBhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsIGtwaURlZjogS1BJRGVmaW5pdGlvbik6IHZvaWQge1xuXHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCkge1xuXHRcdGlmICh0eXBlb2YgZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Ly8gVHJlbmQgaXMgYSBwYXRoIC0tPiBjaGVjayBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBhZ2dyZWdhdGFibGVcblx0XHRcdGNvbnN0IHRyZW5kUHJvcGVydHkgPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248VHJlbmRUeXBlPikuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKHRyZW5kUHJvcGVydHkpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRQYXRoID0gKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPFRyZW5kVHlwZT4pLnBhdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBUaGUgcHJvcGVydHkgaXNuJ3QgYWdncmVnYXRhYmxlIC0tPiB3ZSBpZ25vcmUgaXRcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyZW5kIGlzIGFuIGVudW0gVmFsdWUgLS0+IGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdmFsdWVcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IERldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGVbZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZF0gfHwgXCJOb25lXCI7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbikge1xuXHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uSXNSZWxhdGl2ZURpZmZlcmVuY2UgPyB0cnVlIDogZmFsc2U7XG5cdFx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5SZWZlcmVuY2VWYWx1ZS4kdGFyZ2V0KSB7XG5cdFx0XHQvLyBSZWZlcmVuY2UgdmFsdWUgaXMgYSBwYXRoIC0tPiBjaGVjayBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBhZ2dyZWdhdGFibGVcblx0XHRcdGNvbnN0IHJlZmVyZW5jZVByb3BlcnR5ID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUFnZ3JlZ2F0YWJsZShyZWZlcmVuY2VQcm9wZXJ0eSkpIHtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCA9IGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5SZWZlcmVuY2VWYWx1ZS5wYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gVGhlIHByb3BlcnR5IGlzbid0IGFnZ3JlZ2F0YWJsZSAtLT4gd2UgaWdub3JlIGl0IGFuZCBzd2l0Y2ggYmFjayB0byB0cmVuZCAnTm9uZSdcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFJlZmVyZW5jZSB2YWx1ZSBpcyBhIHN0YXRpYyB2YWx1ZVxuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWU7XG5cdFx0fVxuXHRcdGlmIChrcGlEZWYuZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoICE9PSB1bmRlZmluZWQgfHwga3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzID0gW1xuXHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uU3Ryb25nRG93bkRpZmZlcmVuY2UudmFsdWVPZigpIGFzIG51bWJlcixcblx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLkRvd25EaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXIsXG5cdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5VcERpZmZlcmVuY2UudmFsdWVPZigpIGFzIG51bWJlcixcblx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlN0cm9uZ1VwRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyXG5cdFx0XHRdO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kVmFsdWUgPSBcIk5vbmVcIjtcblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVUYXJnZXQoZGF0YXBvaW50QW5ub3RhdGlvbjogRGF0YVBvaW50LCBhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsIGtwaURlZjogS1BJRGVmaW5pdGlvbik6IHZvaWQge1xuXHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZSkge1xuXHRcdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRhcmdldFZhbHVlLiR0YXJnZXQpIHtcblx0XHRcdC8vIFRhcmdldCB2YWx1ZSBpcyBhIHBhdGggLS0+IGNoZWNrIGlmIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGlzIGFnZ3JlZ2F0YWJsZSAob3RoZXJ3aXNlIGlnbm9yZSlcblx0XHRcdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUodGFyZ2V0UHJvcGVydHkpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudGFyZ2V0UGF0aCA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUucGF0aDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVGFyZ2V0IHZhbHVlIGlzIGEgc3RhdGljIHZhbHVlXG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRhcmdldFZhbHVlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS1BJRGVmaW5pdGlvbihrcGlOYW1lOiBzdHJpbmcsIGtwaUNvbmZpZzogS1BJQ29uZmlndXJhdGlvbiwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEtQSURlZmluaXRpb24gfCB1bmRlZmluZWQge1xuXHRjb25zdCBrcGlDb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKFwiL1wiICsga3BpQ29uZmlnLmVudGl0eVNldCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBrcGlDb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRpZiAoIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHQvLyBUaGUgZW50aXR5IGRvZXNuJ3Qgc3VwcG9ydCBhbmFseXRpY2FsIHF1ZXJpZXNcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLk5PX0FOQUxZVElDUyArIGtwaUNvbmZpZy5lbnRpdHlTZXQpO1xuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGxldCBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbjogU2VsZWN0aW9uVmFyaWFudCB8IHVuZGVmaW5lZDtcblx0bGV0IGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCB8IHVuZGVmaW5lZDtcblx0bGV0IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50IHwgdW5kZWZpbmVkO1xuXHRsZXQgY2hhcnRBbm5vdGF0aW9uOiBDaGFydCB8IHVuZGVmaW5lZDtcblxuXHQvLyBTZWFyY2ggZm9yIGEgS1BJIHdpdGggdGhlIHF1YWxpZmllciBmcm1vIHRoZSBtYW5pZmVzdFxuXHRjb25zdCBhS1BJQW5ub3RhdGlvbnMgPSBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuS1BJKSBhcyBBbm5vdGF0aW9uVGVybTxLUElUeXBlPltdO1xuXHRjb25zdCB0YXJnZXRLUEkgPSBhS1BJQW5ub3RhdGlvbnMuZmluZChrcGkgPT4ge1xuXHRcdHJldHVybiBrcGkucXVhbGlmaWVyID09PSBrcGlDb25maWcucXVhbGlmaWVyO1xuXHR9KTtcblx0aWYgKHRhcmdldEtQSSkge1xuXHRcdGRhdGFwb2ludEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGF0YVBvaW50O1xuXHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gdGFyZ2V0S1BJLlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGV0YWlsPy5EZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRjaGFydEFubm90YXRpb24gPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVmlzdWFsaXphdGlvbnM/LmZpbmQoKHZpejogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGU7XG5cdFx0fSk/LiR0YXJnZXQgYXMgQ2hhcnQ7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gRmFsbGJhY2s6IHRyeSB0byBmaW5kIGEgU1BWIHdpdGggdGhlIHNhbWUgcXVhbGlmaWVyXG5cdFx0Y29uc3QgYVNQVkFubm90YXRpb25zID0ga3BpQ29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcblx0XHRcdFwiVUlcIixcblx0XHRcdFVJQW5ub3RhdGlvblRlcm1zLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRcblx0XHQpIGFzIEFubm90YXRpb25UZXJtPFNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRUeXBlPltdO1xuXHRcdGNvbnN0IHRhcmdldFNQViA9IGFTUFZBbm5vdGF0aW9ucy5maW5kKHNwdiA9PiB7XG5cdFx0XHRyZXR1cm4gc3B2LnF1YWxpZmllciA9PT0ga3BpQ29uZmlnLnF1YWxpZmllcjtcblx0XHR9KTtcblx0XHRpZiAodGFyZ2V0U1BWKSB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbiA9IHRhcmdldFNQVi5TZWxlY3Rpb25WYXJpYW50O1xuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gPSB0YXJnZXRTUFYuUHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRcdGRhdGFwb2ludEFubm90YXRpb24gPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVmlzdWFsaXphdGlvbnM/LmZpbmQoKHZpejogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiB2aXouJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTtcblx0XHRcdH0pPy4kdGFyZ2V0IGFzIERhdGFQb2ludDtcblx0XHRcdGNoYXJ0QW5ub3RhdGlvbiA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5WaXN1YWxpemF0aW9ucz8uZmluZCgodml6OiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHZpei4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5DaGFydERlZmluaXRpb25UeXBlO1xuXHRcdFx0fSk/LiR0YXJnZXQgYXMgQ2hhcnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENvdWxkbid0IGZpbmQgYSBLUEkgb3IgYSBTUFYgYW5ub3RhdGlvbiB3aXRoIHRoZSBxdWFsaWZpZXIgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLktQSV9OT1RfRk9VTkQgKyBrcGlDb25maWcucXVhbGlmaWVyKTtcblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRpZiAoIXByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIHx8ICFkYXRhcG9pbnRBbm5vdGF0aW9uIHx8ICFjaGFydEFubm90YXRpb24pIHtcblx0XHQvLyBDb3VsZG4ndCBmaW5kIGEgY2hhcnQgb3IgZGF0YXBvaW50IGRlZmluaXRpb25cblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLktQSV9ERVRBSUxfTk9UX0ZPVU5EICsga3BpQ29uZmlnLnF1YWxpZmllcik7XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3QgZGF0YXBvaW50UHJvcGVydHkgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdGlmICghYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUFnZ3JlZ2F0YWJsZShkYXRhcG9pbnRQcm9wZXJ0eSkpIHtcblx0XHQvLyBUaGUgbWFpbiBwcm9wZXJ0eSBvZiB0aGUgS1BJIGlzIG5vdCBhZ2dyZWdhdGFibGUgLS0+IFdlIGNhbid0IGNhbGN1bGF0ZSBpdHMgdmFsdWUgc28gd2UgaWdub3JlIHRoZSBLUElcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0LmFkZElzc3VlKFxuXHRcdFx0XHRJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sXG5cdFx0XHRcdElzc3VlU2V2ZXJpdHkuTWVkaXVtLFxuXHRcdFx0XHRJc3N1ZVR5cGUuS1BJX0lTU1VFUy5NQUlOX1BST1BFUlRZX05PVF9BR0dSRUdBVEFCTEUgKyBrcGlDb25maWcucXVhbGlmaWVyXG5cdFx0XHQpO1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBDaGFydCBkZWZpbml0aW9uXG5cdGNvbnN0IGNoYXJ0RGVmID0gY29udmVydEtQSUNoYXJ0KGNoYXJ0QW5ub3RhdGlvbiwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24pO1xuXHRpZiAoIWNoYXJ0RGVmKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IGtwaURlZjogS1BJRGVmaW5pdGlvbiA9IHtcblx0XHRpZDogS1BJSUQoa3BpTmFtZSksXG5cdFx0ZW50aXR5U2V0OiBrcGlDb25maWcuZW50aXR5U2V0LFxuXHRcdGRhdGFwb2ludDoge1xuXHRcdFx0cHJvcGVydHlQYXRoOiBkYXRhcG9pbnRBbm5vdGF0aW9uLlZhbHVlLnBhdGgsXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDoga3BpQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFwb2ludEFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdHRpdGxlOiBkYXRhcG9pbnRBbm5vdGF0aW9uLlRpdGxlPy50b1N0cmluZygpLFxuXHRcdFx0ZGVzY3JpcHRpb246IGRhdGFwb2ludEFubm90YXRpb24uRGVzY3JpcHRpb24/LnRvU3RyaW5nKClcblx0XHR9LFxuXHRcdHNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9uczogc2VsZWN0aW9uVmFyaWFudEFubm90YXRpb25cblx0XHRcdD8gZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudChzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbilcblx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGNoYXJ0OiBjaGFydERlZlxuXHR9O1xuXG5cdHVwZGF0ZUN1cnJlbmN5KGRhdGFwb2ludEFubm90YXRpb24sIGtwaURlZik7XG5cdHVwZGF0ZUNyaXRpY2FsaXR5KGRhdGFwb2ludEFubm90YXRpb24sIGFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWYpO1xuXHR1cGRhdGVUcmVuZChkYXRhcG9pbnRBbm5vdGF0aW9uLCBhZ2dyZWdhdGlvbkhlbHBlciwga3BpRGVmKTtcblx0dXBkYXRlVGFyZ2V0KGRhdGFwb2ludEFubm90YXRpb24sIGFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWYpO1xuXG5cdHJldHVybiBrcGlEZWY7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgS1BJIGRlZmluaXRpb25zIGZyb20gdGhlIG1hbmlmZXN0IGFuZCB0aGUgYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dCBmb3IgdGhlIHBhZ2VcbiAqIEByZXR1cm5zIHtLUElEZWZpbml0aW9uW119IFJldHVybnMgYW4gYXJyYXkgb2YgS1BJIGRlZmluaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRLUElEZWZpbml0aW9ucyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogS1BJRGVmaW5pdGlvbltdIHtcblx0Y29uc3Qga3BpQ29uZmlncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0S1BJQ29uZmlndXJhdGlvbigpLFxuXHRcdGtwaURlZnM6IEtQSURlZmluaXRpb25bXSA9IFtdO1xuXG5cdE9iamVjdC5rZXlzKGtwaUNvbmZpZ3MpLmZvckVhY2goa3BpTmFtZSA9PiB7XG5cdFx0Y29uc3Qgb0RlZiA9IGNyZWF0ZUtQSURlZmluaXRpb24oa3BpTmFtZSwga3BpQ29uZmlnc1trcGlOYW1lXSwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0aWYgKG9EZWYpIHtcblx0XHRcdGtwaURlZnMucHVzaChvRGVmKTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBrcGlEZWZzO1xufVxuIl19
424
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSS50cyJdLCJuYW1lcyI6WyJEZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwiS1BJQ2hhcnRUeXBlRnJvbVVJIiwiY29udmVydEtQSUNoYXJ0IiwiY2hhcnRBbm5vdGF0aW9uIiwicHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24iLCJNZWFzdXJlcyIsInVuZGVmaW5lZCIsImNoYXJEaW1lbnNpb25zIiwiRGltZW5zaW9ucyIsIm1hcCIsInByb3BlcnR5UGF0aCIsImRpbUF0dHJpYnV0ZSIsIkRpbWVuc2lvbkF0dHJpYnV0ZXMiLCJmaW5kIiwiYXR0cmlidXRlIiwiRGltZW5zaW9uIiwidmFsdWUiLCJuYW1lIiwibGFiZWwiLCIkdGFyZ2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJMYWJlbCIsInRvU3RyaW5nIiwicm9sZSIsIlJvbGUiLCJyZXBsYWNlIiwiY2hhcnRNZWFzdXJlcyIsIm1lYXN1cmVBdHRyaWJ1dGUiLCJNZWFzdXJlQXR0cmlidXRlcyIsIk1lYXN1cmUiLCJjaGFydFR5cGUiLCJDaGFydFR5cGUiLCJkaW1lbnNpb25zIiwibWVhc3VyZXMiLCJzb3J0T3JkZXIiLCJTb3J0T3JkZXIiLCJQcm9wZXJ0eSIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwibWF4SXRlbXMiLCJNYXhJdGVtcyIsInZhbHVlT2YiLCJ1cGRhdGVDdXJyZW5jeSIsImRhdGFwb2ludEFubm90YXRpb24iLCJrcGlEZWYiLCJ0YXJnZXRWYWx1ZVByb3BlcnR5IiwiVmFsdWUiLCJJU09DdXJyZW5jeSIsImN1cnJlbmN5IiwiaXNQYXRoRXhwcmVzc2lvbiIsImRhdGFwb2ludCIsInVuaXQiLCJpc0N1cnJlbmN5IiwiaXNQYXRoIiwiVW5pdCIsInVwZGF0ZUNyaXRpY2FsaXR5IiwiYWdncmVnYXRpb25IZWxwZXIiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJpc1Byb3BlcnR5QWdncmVnYXRhYmxlIiwiY3JpdGljYWxpdHlQYXRoIiwicGF0aCIsImNyaXRpY2FsaXR5VmFsdWUiLCJNZXNzYWdlVHlwZSIsIk5vbmUiLCJnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUiLCJDcml0aWNhbGl0eUNhbGN1bGF0aW9uIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJJbXByb3ZlbWVudERpcmVjdGlvbiIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwicHVzaCIsIkRldmlhdGlvblJhbmdlTG93VmFsdWUiLCJUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIiwiQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUiLCJBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUiLCJUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSIsIkRldmlhdGlvblJhbmdlSGlnaFZhbHVlIiwidXBkYXRlVHJlbmQiLCJUcmVuZCIsInRyZW5kUHJvcGVydHkiLCJ0cmVuZFBhdGgiLCJ0cmVuZFZhbHVlIiwiVHJlbmRDYWxjdWxhdGlvbiIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwiSXNSZWxhdGl2ZURpZmZlcmVuY2UiLCJSZWZlcmVuY2VWYWx1ZSIsInJlZmVyZW5jZVByb3BlcnR5IiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwiU3Ryb25nRG93bkRpZmZlcmVuY2UiLCJEb3duRGlmZmVyZW5jZSIsIlVwRGlmZmVyZW5jZSIsIlN0cm9uZ1VwRGlmZmVyZW5jZSIsInVwZGF0ZVRhcmdldCIsIlRhcmdldFZhbHVlIiwidGFyZ2V0UHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwidGFyZ2V0VmFsdWUiLCJnZXROYXZpZ2F0aW9uSW5mb0Zyb21Qcm9wZXJ0eSIsInByb3BlcnR5Iiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJhbm5vdGF0aW9uS2V5IiwiYW5ub3RhdGlvbiIsInRlcm0iLCJxdWFsaWZpZXIiLCJyZXN1bHQiLCJzZW1hbnRpY09iamVjdCIsInVuYXZhaWxhYmxlQWN0aW9ucyIsImtleSIsImNyZWF0ZUtQSURlZmluaXRpb24iLCJrcGlOYW1lIiwia3BpQ29uZmlnIiwiY29udmVydGVyQ29udGV4dCIsImtwaUNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwiZW50aXR5U2V0IiwiQWdncmVnYXRpb25IZWxwZXIiLCJnZXRFbnRpdHlUeXBlIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiTWVkaXVtIiwiSXNzdWVUeXBlIiwiS1BJX0lTU1VFUyIsIk5PX0FOQUxZVElDUyIsInNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwibmF2aWdhdGlvbkluZm8iLCJhS1BJQW5ub3RhdGlvbnMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsInRhcmdldEtQSSIsImtwaSIsIkRhdGFQb2ludCIsIlNlbGVjdGlvblZhcmlhbnQiLCJEZXRhaWwiLCJEZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudCIsIlZpc3VhbGl6YXRpb25zIiwidml6IiwiJFR5cGUiLCJTZW1hbnRpY09iamVjdCIsImFjdGlvbiIsIkFjdGlvbiIsImFTUFZBbm5vdGF0aW9ucyIsInRhcmdldFNQViIsInNwdiIsIlByZXNlbnRhdGlvblZhcmlhbnQiLCJLUElfTk9UX0ZPVU5EIiwiS1BJX0RFVEFJTF9OT1RfRk9VTkQiLCJkYXRhcG9pbnRQcm9wZXJ0eSIsIk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSIsImNoYXJ0RGVmIiwiaWQiLCJLUElJRCIsImFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRpdGxlIiwiVGl0bGUiLCJkZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImNoYXJ0IiwiZGV0YWlsTmF2aWdhdGlvbiIsIm91dGJvdW5kTmF2aWdhdGlvbiIsIm5hdmlnYXRpb24iLCJnZXRLUElEZWZpbml0aW9ucyIsImtwaUNvbmZpZ3MiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRLUElDb25maWd1cmF0aW9uIiwia3BpRGVmcyIsIm9EZWYiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQTBFQSxNQUFNQSwrQkFBdUQsR0FBRztBQUMvRCw2QkFBeUIsSUFEc0M7QUFFL0QsdUJBQW1CLElBRjRDO0FBRy9ELCtCQUEyQixNQUhvQztBQUkvRCx5QkFBcUIsTUFKMEM7QUFLL0QsNkJBQXlCO0FBTHNDLEdBQWhFO0FBUUEsTUFBTUMsa0JBQTBDLEdBQUc7QUFDbEQsa0NBQThCLGVBRG9CO0FBRWxELCtCQUEyQixZQUZ1QjtBQUdsRCwwQkFBc0IsT0FINEI7QUFJbEQseUJBQXFCLE1BSjZCO0FBS2xELDJCQUF1QixRQUwyQjtBQU1sRCwyQkFBdUIsUUFOMkI7QUFPbEQsd0JBQW9CLEtBUDhCO0FBUWxELG1DQUErQixpQkFSbUI7QUFTbEQsZ0NBQTRCLGFBVHNCO0FBVWxELDRCQUF3QjtBQVYwQixHQUFuRDs7QUFhQSxXQUFTQyxlQUFULENBQXlCQyxlQUF6QixFQUFpREMsNkJBQWpELEVBQXFJO0FBQUE7O0FBQ3BJLFFBQUlELGVBQWUsQ0FBQ0UsUUFBaEIsS0FBNkJDLFNBQWpDLEVBQTRDO0FBQzNDO0FBQ0EsYUFBT0EsU0FBUDtBQUNBOztBQUVELFFBQU1DLGNBQWMsR0FBR0osZUFBZSxDQUFDSyxVQUFoQixHQUNuQkwsZUFBZSxDQUFDSyxVQUFqQixDQUErQ0MsR0FBL0MsQ0FBbUQsVUFBQUMsWUFBWSxFQUFJO0FBQUE7O0FBQ25FLFVBQU1DLFlBQVksNEJBQUdSLGVBQWUsQ0FBQ1MsbUJBQW5C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QUFDQTtBQUNELEtBTEQ7QUFPQSxXQUFPRCxPQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtQSUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHtcblx0QW5ub3RhdGlvblRlcm0sXG5cdFVJQW5ub3RhdGlvblRlcm1zLFxuXHRVSUFubm90YXRpb25UeXBlcyxcblx0UGF0aEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRDcml0aWNhbGl0eVR5cGUsXG5cdEltcHJvdmVtZW50RGlyZWN0aW9uVHlwZVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7XG5cdEtQSVR5cGUsXG5cdFNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRUeXBlLFxuXHRQcmVzZW50YXRpb25WYXJpYW50LFxuXHRTZWxlY3Rpb25WYXJpYW50LFxuXHREYXRhUG9pbnQsXG5cdENoYXJ0LFxuXHRUcmVuZFR5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9FZG1cIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEtQSUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7IGlzUGF0aEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5LCBJc3N1ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7IGdldEZpbHRlckRlZmluaXRpb25zRnJvbVNlbGVjdGlvblZhcmlhbnQsIEZpbHRlckRlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL1NlbGVjdGlvblZhcmlhbnRIZWxwZXJcIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcywgU2VtYW50aWNPYmplY3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIE5hdmlnYXRpb25JbmZvID0ge1xuXHRzZW1hbnRpY09iamVjdD86IHN0cmluZztcblx0YWN0aW9uPzogc3RyaW5nO1xuXHR1bmF2YWlsYWJsZUFjdGlvbnM/OiBzdHJpbmdbXTtcblx0b3V0Ym91bmROYXZpZ2F0aW9uPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgS1BJQ2hhcnREZWZpbml0aW9uID0ge1xuXHRjaGFydFR5cGU6IHN0cmluZztcblx0ZGltZW5zaW9uczogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHJvbGU/OiBzdHJpbmcgfVtdO1xuXHRtZWFzdXJlczogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHJvbGU/OiBzdHJpbmcgfVtdO1xuXHRzb3J0T3JkZXI/OiB7IG5hbWU6IHN0cmluZzsgZGVzY2VuZGluZzogYm9vbGVhbiB9W107XG5cdG1heEl0ZW1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgS1BJRGVmaW5pdGlvbiA9IHtcblx0aWQ6IHN0cmluZztcblx0ZW50aXR5U2V0OiBzdHJpbmc7XG5cdGRhdGFwb2ludDoge1xuXHRcdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdFx0dW5pdD86IHtcblx0XHRcdHZhbHVlOiBzdHJpbmc7XG5cdFx0XHRpc1BhdGg6IGJvb2xlYW47XG5cdFx0XHRpc0N1cnJlbmN5OiBib29sZWFuO1xuXHRcdH07XG5cdFx0Y3JpdGljYWxpdHlQYXRoPzogc3RyaW5nO1xuXHRcdGNyaXRpY2FsaXR5VmFsdWU/OiBNZXNzYWdlVHlwZTtcblx0XHRjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZT86IEltcHJvdmVtZW50RGlyZWN0aW9uVHlwZTtcblx0XHRjcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcz86IChudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKVtdO1xuXHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRcdHRyZW5kUGF0aD86IHN0cmluZztcblx0XHR0cmVuZFZhbHVlPzogc3RyaW5nO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZT86IG51bWJlcjtcblx0XHR0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aD86IHN0cmluZztcblx0XHR0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzPzogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW107XG5cdFx0dHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmU/OiBib29sZWFuO1xuXHRcdHRhcmdldFZhbHVlPzogbnVtYmVyO1xuXHRcdHRhcmdldFBhdGg/OiBzdHJpbmc7XG5cdH07XG5cdGNoYXJ0OiBLUElDaGFydERlZmluaXRpb247XG5cdHNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz86IEZpbHRlckRlZmluaXRpb25bXTtcblx0bmF2aWdhdGlvbj86IE5hdmlnYXRpb25JbmZvO1xufTtcblxuY29uc3QgRGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcblx0XCJVSS5UcmVuZFR5cGUvU3Ryb25nVXBcIjogXCJVcFwiLFxuXHRcIlVJLlRyZW5kVHlwZS9VcFwiOiBcIlVwXCIsXG5cdFwiVUkuVHJlbmRUeXBlL1N0cm9uZ0Rvd25cIjogXCJEb3duXCIsXG5cdFwiVUkuVHJlbmRUeXBlL0Rvd25cIjogXCJEb3duXCIsXG5cdFwiVUkuVHJlbmRUeXBlL1NpZGV3YXlzXCI6IFwiTm9uZVwiXG59O1xuXG5jb25zdCBLUElDaGFydFR5cGVGcm9tVUk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG5cdFwiVUkuQ2hhcnRUeXBlL0NvbHVtblN0YWNrZWRcIjogXCJTdGFja2VkQ29sdW1uXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0JhclN0YWNrZWRcIjogXCJTdGFja2VkQmFyXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0RvbnV0XCI6IFwiRG9udXRcIixcblx0XCJVSS5DaGFydFR5cGUvTGluZVwiOiBcIkxpbmVcIixcblx0XCJVSS5DaGFydFR5cGUvQnViYmxlXCI6IFwiYnViYmxlXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0NvbHVtblwiOiBcImNvbHVtblwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9CYXJcIjogXCJiYXJcIixcblx0XCJVSS5DaGFydFR5cGUvVmVydGljYWxCdWxsZXRcIjogXCJ2ZXJ0aWNhbF9idWxsZXRcIixcblx0XCJVSS5DaGFydFR5cGUvQ29tYmluYXRpb25cIjogXCJjb21iaW5hdGlvblwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9TY2F0dGVyXCI6IFwic2NhdHRlclwiXG59O1xuXG5mdW5jdGlvbiBjb252ZXJ0S1BJQ2hhcnQoY2hhcnRBbm5vdGF0aW9uOiBDaGFydCwgcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb246IFByZXNlbnRhdGlvblZhcmlhbnQpOiBLUElDaGFydERlZmluaXRpb24gfCB1bmRlZmluZWQge1xuXHRpZiAoY2hhcnRBbm5vdGF0aW9uLk1lYXN1cmVzID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBXZSBuZWVkIGF0IGxlYXN0IDEgbWVhc3VyZSAoYnV0IG5vIGRpbWVuc2lvbiBpcyBhbGxvd2VkLCBlLmcuIGZvciBidWJibGUgY2hhcnQpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IGNoYXJEaW1lbnNpb25zID0gY2hhcnRBbm5vdGF0aW9uLkRpbWVuc2lvbnNcblx0XHQ/IChjaGFydEFubm90YXRpb24uRGltZW5zaW9ucyBhcyBQcm9wZXJ0eVBhdGhbXSkubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRcdGNvbnN0IGRpbUF0dHJpYnV0ZSA9IGNoYXJ0QW5ub3RhdGlvbi5EaW1lbnNpb25BdHRyaWJ1dGVzPy5maW5kKGF0dHJpYnV0ZSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHJpYnV0ZS5EaW1lbnNpb24/LnZhbHVlID09PSBwcm9wZXJ0eVBhdGgudmFsdWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG5hbWU6IHByb3BlcnR5UGF0aC52YWx1ZSxcblx0XHRcdFx0XHRsYWJlbDogcHJvcGVydHlQYXRoLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSB8fCBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRcdFx0cm9sZTogZGltQXR0cmlidXRlPy5Sb2xlPy5yZXBsYWNlKFwiVUkuQ2hhcnREaW1lbnNpb25Sb2xlVHlwZS9cIiwgXCJcIilcblx0XHRcdFx0fTtcblx0XHQgIH0pXG5cdFx0OiBbXTtcblxuXHRjb25zdCBjaGFydE1lYXN1cmVzID0gKGNoYXJ0QW5ub3RhdGlvbi5NZWFzdXJlcyBhcyBQcm9wZXJ0eVBhdGhbXSkubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0Y29uc3QgbWVhc3VyZUF0dHJpYnV0ZSA9IGNoYXJ0QW5ub3RhdGlvbi5NZWFzdXJlQXR0cmlidXRlcz8uZmluZChhdHRyaWJ1dGUgPT4ge1xuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZS5NZWFzdXJlPy52YWx1ZSA9PT0gcHJvcGVydHlQYXRoLnZhbHVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRsYWJlbDogcHJvcGVydHlQYXRoLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSB8fCBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRyb2xlOiBtZWFzdXJlQXR0cmlidXRlPy5Sb2xlPy5yZXBsYWNlKFwiVUkuQ2hhcnRNZWFzdXJlUm9sZVR5cGUvXCIsIFwiXCIpXG5cdFx0fTtcblx0fSk7XG5cblx0cmV0dXJuIHtcblx0XHRjaGFydFR5cGU6IEtQSUNoYXJ0VHlwZUZyb21VSVtjaGFydEFubm90YXRpb24uQ2hhcnRUeXBlXSB8fCBcIkxpbmVcIixcblx0XHRkaW1lbnNpb25zOiBjaGFyRGltZW5zaW9ucyxcblx0XHRtZWFzdXJlczogY2hhcnRNZWFzdXJlcyxcblx0XHRzb3J0T3JkZXI6IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXI/Lm1hcChzb3J0T3JkZXIgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbmFtZTogc29ydE9yZGVyLlByb3BlcnR5Py52YWx1ZSB8fCBcIlwiLCBkZXNjZW5kaW5nOiAhIXNvcnRPcmRlci5EZXNjZW5kaW5nIH07XG5cdFx0fSksXG5cdFx0bWF4SXRlbXM6IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5NYXhJdGVtcz8udmFsdWVPZigpIGFzIG51bWJlclxuXHR9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDdXJyZW5jeShkYXRhcG9pbnRBbm5vdGF0aW9uOiBEYXRhUG9pbnQsIGtwaURlZjogS1BJRGVmaW5pdGlvbik6IHZvaWQge1xuXHRjb25zdCB0YXJnZXRWYWx1ZVByb3BlcnR5ID0gZGF0YXBvaW50QW5ub3RhdGlvbi5WYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRpZiAodGFyZ2V0VmFsdWVQcm9wZXJ0eS5hbm5vdGF0aW9ucy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kpIHtcblx0XHRjb25zdCBjdXJyZW5jeSA9IHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKGN1cnJlbmN5KSkge1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC51bml0ID0ge1xuXHRcdFx0XHR2YWx1ZTogKChjdXJyZW5jeS4kdGFyZ2V0IGFzIHVua25vd24pIGFzIFByb3BlcnR5KS5uYW1lLFxuXHRcdFx0XHRpc0N1cnJlbmN5OiB0cnVlLFxuXHRcdFx0XHRpc1BhdGg6IHRydWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6IGN1cnJlbmN5LnRvU3RyaW5nKCksXG5cdFx0XHRcdGlzQ3VycmVuY3k6IHRydWUsXG5cdFx0XHRcdGlzUGF0aDogZmFsc2Vcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LlVuaXQpIHtcblx0XHRjb25zdCB1bml0ID0gdGFyZ2V0VmFsdWVQcm9wZXJ0eS5hbm5vdGF0aW9ucy5NZWFzdXJlcz8uVW5pdDtcblx0XHRpZiAoaXNQYXRoRXhwcmVzc2lvbih1bml0KSkge1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC51bml0ID0ge1xuXHRcdFx0XHR2YWx1ZTogKCh1bml0LiR0YXJnZXQgYXMgdW5rbm93bikgYXMgUHJvcGVydHkpLm5hbWUsXG5cdFx0XHRcdGlzQ3VycmVuY3k6IGZhbHNlLFxuXHRcdFx0XHRpc1BhdGg6IHRydWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6IHVuaXQudG9TdHJpbmcoKSxcblx0XHRcdFx0aXNDdXJyZW5jeTogZmFsc2UsXG5cdFx0XHRcdGlzUGF0aDogZmFsc2Vcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNyaXRpY2FsaXR5KGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHkpIHtcblx0XHRpZiAodHlwZW9mIGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHkgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCBjcml0aWNhbGl0eVByb3BlcnR5ID0gKChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5IGFzIGFueSkgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPENyaXRpY2FsaXR5VHlwZT4pXG5cdFx0XHRcdC4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUoY3JpdGljYWxpdHlQcm9wZXJ0eSkpIHtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGggPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Q3JpdGljYWxpdHlUeXBlPikucGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdFxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbikge1xuXHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uSW1wcm92ZW1lbnREaXJlY3Rpb247XG5cdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyA9IFtdO1xuXHRcdHN3aXRjaCAoa3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9UYXJnZXRcIjpcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5EZXZpYXRpb25SYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NaW5pbWl6ZVwiOlxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyZW5kKGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQpIHtcblx0XHRpZiAodHlwZW9mIGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCB0cmVuZFByb3BlcnR5ID0gKChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kIGFzIGFueSkgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPFRyZW5kVHlwZT4pLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUFnZ3JlZ2F0YWJsZSh0cmVuZFByb3BlcnR5KSkge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kUGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUcmVuZFR5cGU+KS5wYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gVGhlIHByb3BlcnR5IGlzbid0IGFnZ3JlZ2F0YWJsZSAtLT4gd2UgaWdub3JlIGl0XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmVuZCBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kVmFsdWUgPSBEZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlW2RhdGFwb2ludEFubm90YXRpb24uVHJlbmRdIHx8IFwiTm9uZVwiO1xuXHRcdH1cblx0fSBlbHNlIGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24pIHtcblx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLklzUmVsYXRpdmVEaWZmZXJlbmNlID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly8gUmVmZXJlbmNlIHZhbHVlIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5SZWZlcmVuY2VWYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUocmVmZXJlbmNlUHJvcGVydHkpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUucGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdCBhbmQgc3dpdGNoIGJhY2sgdG8gdHJlbmQgJ05vbmUnXG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZWZlcmVuY2UgdmFsdWUgaXMgYSBzdGF0aWMgdmFsdWVcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlO1xuXHRcdH1cblx0XHRpZiAoa3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCAhPT0gdW5kZWZpbmVkIHx8IGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyA9IFtcblx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlN0cm9uZ0Rvd25EaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXIsXG5cdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5Eb3duRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyLFxuXHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uVXBEaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXIsXG5cdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5TdHJvbmdVcERpZmZlcmVuY2UudmFsdWVPZigpIGFzIG51bWJlclxuXHRcdFx0XTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVGFyZ2V0KGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUpIHtcblx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZS4kdGFyZ2V0KSB7XG5cdFx0XHQvLyBUYXJnZXQgdmFsdWUgaXMgYSBwYXRoIC0tPiBjaGVjayBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBhZ2dyZWdhdGFibGUgKG90aGVyd2lzZSBpZ25vcmUpXG5cdFx0XHRjb25zdCB0YXJnZXRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKHRhcmdldFByb3BlcnR5KSkge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRhcmdldFBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRhcmdldFZhbHVlLnBhdGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRhcmdldCB2YWx1ZSBpcyBhIHN0YXRpYyB2YWx1ZVxuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWU7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25JbmZvRnJvbVByb3BlcnR5KHByb3BlcnR5OiBQcm9wZXJ0eSk6IE5hdmlnYXRpb25JbmZvIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25UZXJtPGFueT4+ID0gcHJvcGVydHkuYW5ub3RhdGlvbnNbXCJDb21tb25cIl0gfHwge307XG5cblx0Ly8gTG9vayBmb3IgdGhlIHNlbWFudGljT2JqZWN0IGFubm90YXRpb24gKGlmIGFueSlcblx0bGV0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvbjogQW5ub3RhdGlvblRlcm08U2VtYW50aWNPYmplY3Q+IHwgdW5kZWZpbmVkO1xuXHRPYmplY3Qua2V5cyhhbm5vdGF0aW9ucykuZm9yRWFjaChhbm5vdGF0aW9uS2V5ID0+IHtcblx0XHRjb25zdCBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbktleV07XG5cdFx0aWYgKGFubm90YXRpb24udGVybSA9PT0gQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRpZiAoIWFubm90YXRpb24ucXVhbGlmaWVyIHx8ICFzZW1hbnRpY09iamVjdEFubm90YXRpb24pIHtcblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHRha2UgdGhlIGFubm90YXRpb24gd2l0aG91dCBxdWFsaWZpZXIgaWYgdGhlcmUncyBvbmUsIG90aGVyd2lzZSB3ZSB0YWtlIHRoZSBmaXJzdCBvbmVcblx0XHRcdFx0c2VtYW50aWNPYmplY3RBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChzZW1hbnRpY09iamVjdEFubm90YXRpb24pIHtcblx0XHRjb25zdCByZXN1bHQgPSB7XG5cdFx0XHRzZW1hbnRpY09iamVjdDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uLnRvU3RyaW5nKCksXG5cdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IFtdXG5cdFx0fTtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSB1bmF2YWlsYWJsZSBhY3Rpb25zIChpZiBhbnkpXG5cdFx0Y29uc3QgYW5ub3RhdGlvbktleSA9IE9iamVjdC5rZXlzKGFubm90YXRpb25zKS5maW5kKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhbm5vdGF0aW9uc1trZXldLnRlcm0gPT09IENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyAmJlxuXHRcdFx0XHRhbm5vdGF0aW9uc1trZXldLnF1YWxpZmllciA9PT0gc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uPy5xdWFsaWZpZXJcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0aWYgKGFubm90YXRpb25LZXkpIHtcblx0XHRcdHJlc3VsdC51bmF2YWlsYWJsZUFjdGlvbnMgPSBhbm5vdGF0aW9uc1thbm5vdGF0aW9uS2V5XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS1BJRGVmaW5pdGlvbihrcGlOYW1lOiBzdHJpbmcsIGtwaUNvbmZpZzogS1BJQ29uZmlndXJhdGlvbiwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEtQSURlZmluaXRpb24gfCB1bmRlZmluZWQge1xuXHRjb25zdCBrcGlDb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKFwiL1wiICsga3BpQ29uZmlnLmVudGl0eVNldCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBrcGlDb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRpZiAoIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHQvLyBUaGUgZW50aXR5IGRvZXNuJ3Qgc3VwcG9ydCBhbmFseXRpY2FsIHF1ZXJpZXNcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLk5PX0FOQUxZVElDUyArIGtwaUNvbmZpZy5lbnRpdHlTZXQpO1xuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGxldCBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbjogU2VsZWN0aW9uVmFyaWFudCB8IHVuZGVmaW5lZDtcblx0bGV0IGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCB8IHVuZGVmaW5lZDtcblx0bGV0IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50IHwgdW5kZWZpbmVkO1xuXHRsZXQgY2hhcnRBbm5vdGF0aW9uOiBDaGFydCB8IHVuZGVmaW5lZDtcblx0bGV0IG5hdmlnYXRpb25JbmZvOiBOYXZpZ2F0aW9uSW5mbyB8IHVuZGVmaW5lZDtcblxuXHQvLyBTZWFyY2ggZm9yIGEgS1BJIHdpdGggdGhlIHF1YWxpZmllciBmcm1vIHRoZSBtYW5pZmVzdFxuXHRjb25zdCBhS1BJQW5ub3RhdGlvbnMgPSBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuS1BJKSBhcyBBbm5vdGF0aW9uVGVybTxLUElUeXBlPltdO1xuXHRjb25zdCB0YXJnZXRLUEkgPSBhS1BJQW5ub3RhdGlvbnMuZmluZChrcGkgPT4ge1xuXHRcdHJldHVybiBrcGkucXVhbGlmaWVyID09PSBrcGlDb25maWcucXVhbGlmaWVyO1xuXHR9KTtcblx0aWYgKHRhcmdldEtQSSkge1xuXHRcdGRhdGFwb2ludEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGF0YVBvaW50O1xuXHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gdGFyZ2V0S1BJLlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGV0YWlsPy5EZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRjaGFydEFubm90YXRpb24gPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVmlzdWFsaXphdGlvbnM/LmZpbmQoKHZpejogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGU7XG5cdFx0fSk/LiR0YXJnZXQgYXMgQ2hhcnQ7XG5cblx0XHRpZiAodGFyZ2V0S1BJLkRldGFpbD8uU2VtYW50aWNPYmplY3QpIHtcblx0XHRcdG5hdmlnYXRpb25JbmZvID0ge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdDogdGFyZ2V0S1BJLkRldGFpbC5TZW1hbnRpY09iamVjdC50b1N0cmluZygpLFxuXHRcdFx0XHRhY3Rpb246IHRhcmdldEtQSS5EZXRhaWwuQWN0aW9uPy50b1N0cmluZygpLFxuXHRcdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBGYWxsYmFjazogdHJ5IHRvIGZpbmQgYSBTUFYgd2l0aCB0aGUgc2FtZSBxdWFsaWZpZXJcblx0XHRjb25zdCBhU1BWQW5ub3RhdGlvbnMgPSBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFxuXHRcdFx0XCJVSVwiLFxuXHRcdFx0VUlBbm5vdGF0aW9uVGVybXMuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFxuXHRcdCkgYXMgQW5ub3RhdGlvblRlcm08U2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFR5cGU+W107XG5cdFx0Y29uc3QgdGFyZ2V0U1BWID0gYVNQVkFubm90YXRpb25zLmZpbmQoc3B2ID0+IHtcblx0XHRcdHJldHVybiBzcHYucXVhbGlmaWVyID09PSBrcGlDb25maWcucXVhbGlmaWVyO1xuXHRcdH0pO1xuXHRcdGlmICh0YXJnZXRTUFYpIHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gdGFyZ2V0U1BWLlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiA9IHRhcmdldFNQVi5QcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbiA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5WaXN1YWxpemF0aW9ucz8uZmluZCgodml6OiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHZpei4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlO1xuXHRcdFx0fSk/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdFx0Y2hhcnRBbm5vdGF0aW9uID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlZpc3VhbGl6YXRpb25zPy5maW5kKCh2aXo6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGU7XG5cdFx0XHR9KT8uJHRhcmdldCBhcyBDaGFydDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQ291bGRuJ3QgZmluZCBhIEtQSSBvciBhIFNQViBhbm5vdGF0aW9uIHdpdGggdGhlIHF1YWxpZmllciBmcm9tIHRoZSBtYW5pZmVzdFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX05PVF9GT1VORCArIGtwaUNvbmZpZy5xdWFsaWZpZXIpO1xuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICghcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gfHwgIWRhdGFwb2ludEFubm90YXRpb24gfHwgIWNoYXJ0QW5ub3RhdGlvbikge1xuXHRcdC8vIENvdWxkbid0IGZpbmQgYSBjaGFydCBvciBkYXRhcG9pbnQgZGVmaW5pdGlvblxuXHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX0RFVEFJTF9OT1RfRk9VTkQgKyBrcGlDb25maWcucXVhbGlmaWVyKTtcblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBkYXRhcG9pbnRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKGRhdGFwb2ludFByb3BlcnR5KSkge1xuXHRcdC8vIFRoZSBtYWluIHByb3BlcnR5IG9mIHRoZSBLUEkgaXMgbm90IGFnZ3JlZ2F0YWJsZSAtLT4gV2UgY2FuJ3QgY2FsY3VsYXRlIGl0cyB2YWx1ZSBzbyB3ZSBpZ25vcmUgdGhlIEtQSVxuXHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbixcblx0XHRcdFx0SXNzdWVTZXZlcml0eS5NZWRpdW0sXG5cdFx0XHRcdElzc3VlVHlwZS5LUElfSVNTVUVTLk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSArIGtwaUNvbmZpZy5xdWFsaWZpZXJcblx0XHRcdCk7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIENoYXJ0IGRlZmluaXRpb25cblx0Y29uc3QgY2hhcnREZWYgPSBjb252ZXJ0S1BJQ2hhcnQoY2hhcnRBbm5vdGF0aW9uLCBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbik7XG5cdGlmICghY2hhcnREZWYpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3Qga3BpRGVmOiBLUElEZWZpbml0aW9uID0ge1xuXHRcdGlkOiBLUElJRChrcGlOYW1lKSxcblx0XHRlbnRpdHlTZXQ6IGtwaUNvbmZpZy5lbnRpdHlTZXQsXG5cdFx0ZGF0YXBvaW50OiB7XG5cdFx0XHRwcm9wZXJ0eVBhdGg6IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUucGF0aCxcblx0XHRcdGFubm90YXRpb25QYXRoOiBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YXBvaW50QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0dGl0bGU6IGRhdGFwb2ludEFubm90YXRpb24uVGl0bGU/LnRvU3RyaW5nKCksXG5cdFx0XHRkZXNjcmlwdGlvbjogZGF0YXBvaW50QW5ub3RhdGlvbi5EZXNjcmlwdGlvbj8udG9TdHJpbmcoKVxuXHRcdH0sXG5cdFx0c2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zOiBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvblxuXHRcdFx0PyBnZXRGaWx0ZXJEZWZpbml0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uKVxuXHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0Y2hhcnQ6IGNoYXJ0RGVmXG5cdH07XG5cblx0Ly8gTmF2aWdhdGlvblxuXHRpZiAoIW5hdmlnYXRpb25JbmZvKSB7XG5cdFx0Ly8gTm8gbmF2aWdhdGlvbkluZm8gd2FzIGZvdW5kIGluIHRoZSBLUEkgYW5ub3RhdGlvbiAtLT4gdHJ5IHRoZSBvdXRib3VuZCBuYXZpZ2F0aW9uIGZyb20gdGhlIG1hbmlmZXN0XG5cdFx0aWYgKGtwaUNvbmZpZy5kZXRhaWxOYXZpZ2F0aW9uKSB7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbyA9IHtcblx0XHRcdFx0b3V0Ym91bmROYXZpZ2F0aW9uOiBrcGlDb25maWcuZGV0YWlsTmF2aWdhdGlvblxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gb3V0Ym91bmQgbmF2aWdhdGlvbiBpbiB0aGUgbWFuaWZlc3QgLS0+IHRyeSB0aGUgc2VtYW50aWMgb2JqZWN0IG9uIHRoZSBEYXRhcG9pbnQgdmFsdWVcblx0XHRcdG5hdmlnYXRpb25JbmZvID0gZ2V0TmF2aWdhdGlvbkluZm9Gcm9tUHJvcGVydHkoZGF0YXBvaW50UHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXHRpZiAobmF2aWdhdGlvbkluZm8pIHtcblx0XHRrcGlEZWYubmF2aWdhdGlvbiA9IG5hdmlnYXRpb25JbmZvO1xuXHR9XG5cblx0dXBkYXRlQ3VycmVuY3koZGF0YXBvaW50QW5ub3RhdGlvbiwga3BpRGVmKTtcblx0dXBkYXRlQ3JpdGljYWxpdHkoZGF0YXBvaW50QW5ub3RhdGlvbiwgYWdncmVnYXRpb25IZWxwZXIsIGtwaURlZik7XG5cdHVwZGF0ZVRyZW5kKGRhdGFwb2ludEFubm90YXRpb24sIGFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWYpO1xuXHR1cGRhdGVUYXJnZXQoZGF0YXBvaW50QW5ub3RhdGlvbiwgYWdncmVnYXRpb25IZWxwZXIsIGtwaURlZik7XG5cblx0cmV0dXJuIGtwaURlZjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBLUEkgZGVmaW5pdGlvbnMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIHRoZSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0IGZvciB0aGUgcGFnZVxuICogQHJldHVybnMge0tQSURlZmluaXRpb25bXX0gUmV0dXJucyBhbiBhcnJheSBvZiBLUEkgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEtQSURlZmluaXRpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBLUElEZWZpbml0aW9uW10ge1xuXHRjb25zdCBrcGlDb25maWdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRLUElDb25maWd1cmF0aW9uKCksXG5cdFx0a3BpRGVmczogS1BJRGVmaW5pdGlvbltdID0gW107XG5cblx0T2JqZWN0LmtleXMoa3BpQ29uZmlncykuZm9yRWFjaChrcGlOYW1lID0+IHtcblx0XHRjb25zdCBvRGVmID0gY3JlYXRlS1BJRGVmaW5pdGlvbihrcGlOYW1lLCBrcGlDb25maWdzW2twaU5hbWVdLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRpZiAob0RlZikge1xuXHRcdFx0a3BpRGVmcy5wdXNoKG9EZWYpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGtwaURlZnM7XG59XG4iXX0=
@@ -26,6 +26,14 @@ import { AggregationHelper } from "../../helpers/Aggregation";
26
26
  import { IssueCategory, IssueSeverity, IssueType } from "sap/fe/core/converters/helpers/IssueManager";
27
27
  import { getMessageTypeFromCriticalityType } from "./Criticality";
28
28
  import { getFilterDefinitionsFromSelectionVariant, FilterDefinition } from "sap/fe/core/converters/helpers/SelectionVariantHelper";
29
+ import { CommonAnnotationTerms, SemanticObject } from "@sap-ux/vocabularies-types/dist/generated/Common";
30
+
31
+ export type NavigationInfo = {
32
+ semanticObject?: string;
33
+ action?: string;
34
+ unavailableActions?: string[];
35
+ outboundNavigation?: string;
36
+ };
29
37
 
30
38
  export type KPIChartDefinition = {
31
39
  chartType: string;
@@ -63,6 +71,7 @@ export type KPIDefinition = {
63
71
  };
64
72
  chart: KPIChartDefinition;
65
73
  selectionVariantFilterDefinitions?: FilterDefinition[];
74
+ navigation?: NavigationInfo;
66
75
  };
67
76
 
68
77
  const DeviationIndicatorFromTrendType: Record<string, string> = {
@@ -166,7 +175,8 @@ function updateCriticality(datapointAnnotation: DataPoint, aggregationHelper: Ag
166
175
  if (datapointAnnotation.Criticality) {
167
176
  if (typeof datapointAnnotation.Criticality === "object") {
168
177
  // Criticality is a path --> check if the corresponding property is aggregatable
169
- const criticalityProperty = (datapointAnnotation.Criticality as PathAnnotationExpression<CriticalityType>).$target as Property;
178
+ const criticalityProperty = ((datapointAnnotation.Criticality as any) as PathAnnotationExpression<CriticalityType>)
179
+ .$target as Property;
170
180
  if (aggregationHelper.isPropertyAggregatable(criticalityProperty)) {
171
181
  kpiDef.datapoint.criticalityPath = (datapointAnnotation.Criticality as PathAnnotationExpression<CriticalityType>).path;
172
182
  } else {
@@ -211,7 +221,7 @@ function updateTrend(datapointAnnotation: DataPoint, aggregationHelper: Aggregat
211
221
  if (datapointAnnotation.Trend) {
212
222
  if (typeof datapointAnnotation.Trend === "object") {
213
223
  // Trend is a path --> check if the corresponding property is aggregatable
214
- const trendProperty = (datapointAnnotation.Trend as PathAnnotationExpression<TrendType>).$target as Property;
224
+ const trendProperty = ((datapointAnnotation.Trend as any) as PathAnnotationExpression<TrendType>).$target as Property;
215
225
  if (aggregationHelper.isPropertyAggregatable(trendProperty)) {
216
226
  kpiDef.datapoint.trendPath = (datapointAnnotation.Trend as PathAnnotationExpression<TrendType>).path;
217
227
  } else {
@@ -265,6 +275,44 @@ function updateTarget(datapointAnnotation: DataPoint, aggregationHelper: Aggrega
265
275
  }
266
276
  }
267
277
 
278
+ function getNavigationInfoFromProperty(property: Property): NavigationInfo | undefined {
279
+ const annotations: Record<string, AnnotationTerm<any>> = property.annotations["Common"] || {};
280
+
281
+ // Look for the semanticObject annotation (if any)
282
+ let semanticObjectAnnotation: AnnotationTerm<SemanticObject> | undefined;
283
+ Object.keys(annotations).forEach(annotationKey => {
284
+ const annotation = annotations[annotationKey];
285
+ if (annotation.term === CommonAnnotationTerms.SemanticObject) {
286
+ if (!annotation.qualifier || !semanticObjectAnnotation) {
287
+ // We always take the annotation without qualifier if there's one, otherwise we take the first one
288
+ semanticObjectAnnotation = annotation;
289
+ }
290
+ }
291
+ });
292
+
293
+ if (semanticObjectAnnotation) {
294
+ const result = {
295
+ semanticObject: semanticObjectAnnotation.toString(),
296
+ unavailableActions: []
297
+ };
298
+
299
+ // Look for the unavailable actions (if any)
300
+ const annotationKey = Object.keys(annotations).find(key => {
301
+ return (
302
+ annotations[key].term === CommonAnnotationTerms.SemanticObjectUnavailableActions &&
303
+ annotations[key].qualifier === semanticObjectAnnotation?.qualifier
304
+ );
305
+ });
306
+ if (annotationKey) {
307
+ result.unavailableActions = annotations[annotationKey];
308
+ }
309
+
310
+ return result;
311
+ } else {
312
+ return undefined;
313
+ }
314
+ }
315
+
268
316
  function createKPIDefinition(kpiName: string, kpiConfig: KPIConfiguration, converterContext: ConverterContext): KPIDefinition | undefined {
269
317
  const kpiConverterContext = converterContext.getConverterContextFor("/" + kpiConfig.entitySet);
270
318
  const aggregationHelper = new AggregationHelper(kpiConverterContext.getEntityType(), kpiConverterContext);
@@ -282,6 +330,7 @@ function createKPIDefinition(kpiName: string, kpiConfig: KPIConfiguration, conve
282
330
  let datapointAnnotation: DataPoint | undefined;
283
331
  let presentationVariantAnnotation: PresentationVariant | undefined;
284
332
  let chartAnnotation: Chart | undefined;
333
+ let navigationInfo: NavigationInfo | undefined;
285
334
 
286
335
  // Search for a KPI with the qualifier frmo the manifest
287
336
  const aKPIAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", UIAnnotationTerms.KPI) as AnnotationTerm<KPIType>[];
@@ -295,6 +344,14 @@ function createKPIDefinition(kpiName: string, kpiConfig: KPIConfiguration, conve
295
344
  chartAnnotation = presentationVariantAnnotation?.Visualizations?.find((viz: any) => {
296
345
  return viz.$target.$Type === UIAnnotationTypes.ChartDefinitionType;
297
346
  })?.$target as Chart;
347
+
348
+ if (targetKPI.Detail?.SemanticObject) {
349
+ navigationInfo = {
350
+ semanticObject: targetKPI.Detail.SemanticObject.toString(),
351
+ action: targetKPI.Detail.Action?.toString(),
352
+ unavailableActions: []
353
+ };
354
+ }
298
355
  } else {
299
356
  // Fallback: try to find a SPV with the same qualifier
300
357
  const aSPVAnnotations = kpiConverterContext.getAnnotationsByTerm(
@@ -366,6 +423,22 @@ function createKPIDefinition(kpiName: string, kpiConfig: KPIConfiguration, conve
366
423
  chart: chartDef
367
424
  };
368
425
 
426
+ // Navigation
427
+ if (!navigationInfo) {
428
+ // No navigationInfo was found in the KPI annotation --> try the outbound navigation from the manifest
429
+ if (kpiConfig.detailNavigation) {
430
+ navigationInfo = {
431
+ outboundNavigation: kpiConfig.detailNavigation
432
+ };
433
+ } else {
434
+ // No outbound navigation in the manifest --> try the semantic object on the Datapoint value
435
+ navigationInfo = getNavigationInfoFromProperty(datapointProperty);
436
+ }
437
+ }
438
+ if (navigationInfo) {
439
+ kpiDef.navigation = navigationInfo;
440
+ }
441
+
369
442
  updateCurrency(datapointAnnotation, kpiDef);
370
443
  updateCriticality(datapointAnnotation, aggregationHelper, kpiDef);
371
444
  updateTrend(datapointAnnotation, aggregationHelper, kpiDef);