@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
@@ -1,507 +1,721 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(
6
- [
7
- "sap/ui/core/mvc/ControllerExtension",
8
- "sap/ui/core/mvc/OverrideExecution",
9
- "sap/fe/core/actions/messageHandling",
10
- "sap/fe/core/TransactionHelper",
11
- "sap/base/Log",
12
- "sap/fe/core/CommonUtils",
13
- "sap/fe/core/BusyLocker",
14
- "sap/fe/core/library",
15
- "sap/fe/core/helpers/EditState"
16
- ],
17
- function(
18
- ControllerExtension,
19
- OverrideExecution,
20
- messageHandling,
21
- TransactionHelper,
22
- Log,
23
- CommonUtils,
24
- BusyLocker,
25
- FELibrary,
26
- EditState
27
- ) {
28
- "use strict";
29
-
30
- var ProgrammingModel = FELibrary.ProgrammingModel,
31
- DraftStatus = FELibrary.DraftStatus,
32
- EditMode = FELibrary.EditMode;
33
-
34
- var Extension = ControllerExtension.extend("sap.fe.core.controllerextensions.InternalEditFlow", {
35
- metadata: {
36
- methods: {
37
- createMultipleDocuments: { "public": true, "final": true },
38
- deleteMultipleDocuments: { "public": true, "final": true },
39
- computeEditMode: { "public": true, "final": true },
40
- setEditMode: { "public": true, "final": true },
41
- setDraftStatus: { "public": true, "final": true },
42
- getRoutingListener: { "public": true, "final": true },
43
- getGlobalUIModel: { "public": true, "final": true },
44
- syncTask: { "public": true, "final": true },
45
- getProgrammingModel: { "public": true, "final": true },
46
- deleteDocumentTransaction: { "public": true, "final": true },
47
- handleCreateEvents: { "public": true, "final": true },
48
- getTransactionHelper: { "public": true, "final": true },
49
- getInternalModel: { "public": true, "final": true },
50
- createActionPromise: { "public": true, "final": true },
51
- getCurrentActionPromise: { "public": true, "final": true },
52
- deleteCurrentActionPromise: { "public": true, "final": true },
53
- getActionResponseDataAndKeys: { "public": true, "final": true },
54
- setCreationMode: { "public": false, "final": false, "overrideExecution": OverrideExecution.After },
55
- getMessageHandler: { "public": true, "final": true }
56
- }
57
- },
58
-
59
- /**
60
- * Override to set the creation mode.
61
- *
62
- * @memberof sap.fe.core.controllerextensions.InternalEditFlow
63
- * @alias sap.fe.core.controllerextensions.InternalEditFlow#setCreationMode
64
- * @since 1.90.0
65
- */
66
- setCreationMode: function() {
67
- // to be overridden
68
- },
69
-
70
- createMultipleDocuments: function(oListBinding, aData, bCreateAtEnd, bFromCopyPaste) {
71
- var that = this,
72
- transactionHelper = this.getTransactionHelper(),
73
- oLockObject = this.getGlobalUIModel(),
74
- oResourceBundle = that.getView().getController().oResourceBundle;
75
-
76
- BusyLocker.lock(oLockObject);
77
- return this.syncTask()
78
- .then(function() {
79
- var oModel = oListBinding.getModel(),
80
- oMetaModel = oModel.getMetaModel(),
81
- sMetaPath;
82
-
83
- if (oListBinding.getContext()) {
84
- sMetaPath = oMetaModel.getMetaPath(oListBinding.getContext().getPath() + "/" + oListBinding.getPath());
85
- } else {
86
- sMetaPath = oMetaModel.getMetaPath(oListBinding.getPath());
87
- }
88
-
89
- that.handleCreateEvents(oListBinding);
90
-
91
- // Iterate on all items and store the corresponding creation promise
92
- var aCreationPromises = aData.map(function(mPropertyValues) {
93
- var mParameters = { data: {} };
94
-
95
- mParameters.keepTransientContextOnFailed = false; // currently not fully supported
96
- mParameters.busyMode = "None";
97
- mParameters.creationMode = "CreationRow";
98
- mParameters.parentControl = that.getView();
99
- mParameters.createAtEnd = bCreateAtEnd;
100
-
101
- // Remove navigation properties as we don't support deep create
102
- for (var sPropertyPath in mPropertyValues) {
103
- var oProperty = oMetaModel.getObject(sMetaPath + "/" + sPropertyPath);
104
- if (oProperty && oProperty.$kind !== "NavigationProperty" && mPropertyValues[sPropertyPath]) {
105
- mParameters.data[sPropertyPath] = mPropertyValues[sPropertyPath];
106
- }
107
- }
108
-
109
- return transactionHelper.createDocument(
110
- oListBinding,
111
- mParameters,
112
- oResourceBundle,
113
- that.getMessageHandler(),
114
- bFromCopyPaste
115
- );
116
- });
117
-
118
- return Promise.all(aCreationPromises);
119
- })
120
- .then(function(aContexts) {
121
- // transient contexts are reliably removed once oNewContext.created() is resolved
122
- return Promise.all(
123
- aContexts.map(function(oNewContext) {
124
- return oNewContext.created();
125
- })
126
- );
127
- })
128
- .then(function() {
129
- var oBindingContext = that.getView().getBindingContext();
130
-
131
- // if there are transient contexts, we must avoid requesting side effects
132
- // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
133
- // if list binding is refreshed, transient contexts might be lost
134
- if (!CommonUtils.hasTransientContext(oListBinding)) {
135
- that._oAppComponent
136
- .getSideEffectsService()
137
- .requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
138
- }
139
- })
140
- .catch(function(err) {
141
- Log.error("Error while creating multiple documents.");
142
- return Promise.reject(err);
143
- })
144
- .finally(function() {
145
- BusyLocker.unlock(oLockObject);
146
- });
147
- },
148
-
149
- deleteMultipleDocuments: function(aContexts, mParameters) {
150
- var that = this,
151
- oRoutingListener = this.getRoutingListener(),
152
- oLockObject = this.getGlobalUIModel();
153
- var oTable = that.getView().byId(mParameters.controlId);
154
- if (!oTable || !oTable.isA("sap.ui.mdc.Table")) {
155
- throw new Error("parameter controlId missing or incorrect");
156
- }
157
- var oListBinding = oTable.getRowBinding();
158
- mParameters.bFindActiveContexts = true;
159
- BusyLocker.lock(oLockObject);
160
- return this.deleteDocumentTransaction(aContexts, mParameters)
161
- .then(function() {
162
- var oResult;
163
-
164
- // Multiple object deletion is triggered from a list
165
- // First clear the selection in the table as it's not valid any more
166
- oTable.clearSelection();
167
-
168
- // Then refresh the list-binding (LR), or require side-effects (OP)
169
- var oBindingContext = that.getView().getBindingContext();
170
- if (oListBinding.isRoot()) {
171
- // keep promise chain pending until refresh of listbinding is completed
172
- oResult = new Promise(function(resolve) {
173
- oListBinding.attachEventOnce("dataReceived", function() {
174
- resolve();
175
- });
176
- });
177
- oListBinding.refresh();
178
- } else if (oBindingContext) {
179
- // if there are transient contexts, we must avoid requesting side effects
180
- // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
181
- // if list binding is refreshed, transient contexts might be lost
182
- if (!CommonUtils.hasTransientContext(oListBinding)) {
183
- that._oAppComponent
184
- .getSideEffectsService()
185
- .requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
186
- }
187
- }
188
-
189
- // deleting at least one object should also set the UI to dirty
190
- EditState.setEditStateDirty();
191
-
192
- // Finally, check if the current state can be impacted by the deletion, i.e. if there's
193
- // an OP displaying a deleted object. If yes navigate back to dismiss the OP
194
- for (var index = 0; index < aContexts.length; index++) {
195
- if (oRoutingListener.isCurrentStateImpactedBy(aContexts[index])) {
196
- oRoutingListener.navigateBackFromContext(aContexts[index]);
197
- break;
198
- }
199
- }
200
-
201
- return oResult;
202
- })
203
- .finally(function() {
204
- BusyLocker.unlock(oLockObject);
205
- });
206
- },
207
-
208
- /**
209
- * Decides if a document is to be shown in display or edit mode.
210
- *
211
- * @function
212
- * @name _computeEditMode
213
- * @memberof sap.fe.core.controllerextensions.InternalEditFlow
214
- * @param {sap.ui.model.odata.v4.Context} oContext The context to be displayed or edited
215
- * @returns {Promise} Promise resolves once the edit mode is computed
216
- */
217
-
218
- computeEditMode: function(oContext) {
219
- var that = this;
220
-
221
- return Promise.resolve(
222
- (function() {
223
- var sProgrammingModel = that.getProgrammingModel(oContext);
224
-
225
- if (sProgrammingModel === ProgrammingModel.Draft) {
226
- that.setDraftStatus(DraftStatus.Clear);
227
-
228
- return oContext
229
- .requestObject("IsActiveEntity")
230
- .then(function(bIsActiveEntity) {
231
- if (bIsActiveEntity === false) {
232
- // in case the document is draft set it in edit mode
233
- that.setEditMode(EditMode.Editable);
234
- return oContext.requestObject("HasActiveEntity").then(function(bHasActiveEntity) {
235
- that.setEditMode(undefined, !bHasActiveEntity);
236
- });
237
- } else {
238
- // active document, stay on display mode
239
- that.setEditMode(EditMode.Display, false);
240
- }
241
- })
242
- .catch(function(oError) {
243
- Log.error("Error while determining the editMode for draft", oError);
244
- throw oError;
245
- });
246
- }
247
- })()
248
- );
249
- },
250
-
251
- /**
252
- * Sets the edit mode.
253
- *
254
- * @param {string} sEditMode
255
- * @param {boolean} bCreationMode CreateMode flag to identify the creation mode
256
- */
257
- setEditMode: function(sEditMode, bCreationMode) {
258
- // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
259
- // rely on the global UI model to exist
260
- var oGlobalModel = this.getGlobalUIModel();
261
-
262
- if (sEditMode) {
263
- oGlobalModel.setProperty("/editMode", sEditMode, undefined, true);
264
- oGlobalModel.setProperty("/isEditable", sEditMode === "Editable", undefined, true);
265
- }
266
-
267
- if (bCreationMode !== undefined) {
268
- // Since setCreationMode is public in EditFlow and can be overriden, make sure to call it via the controller
269
- // to ensure any overrides are taken into account
270
- this.setCreationMode(bCreationMode);
271
- }
272
- },
273
-
274
- setDraftStatus: function(sDraftState) {
275
- // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
276
- // rely on the global UI model to exist
277
- this.base
278
- .getView()
279
- .getModel("ui")
280
- .setProperty("/draftStatus", sDraftState, undefined, true);
281
- },
282
-
283
- getRoutingListener: function() {
284
- // at this point of time it's not meant to release the edit flow for FPM custom pages and the routing
285
- // listener is not yet public therefore keep the logic here for now
286
-
287
- if (this.base._routing) {
288
- return this.base._routing;
289
- } else {
290
- throw new Error("Edit Flow works only with a given routing listener");
291
- }
292
- },
293
-
294
- getGlobalUIModel: function() {
295
- // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
296
- // rely on the global UI model to exist
297
- return this.base.getView().getModel("ui");
298
- },
299
-
300
- /**
301
- * Performs a task in sync with other tasks created via this function.
302
- * Returns the promise chain of the task.
303
- *
304
- * @function
305
- * @name sap.fe.core.controllerextensions.EditFlow#syncTask
306
- * @memberof sap.fe.core.controllerextensions.EditFlow
307
- * @static
308
- * @param {Promise|Function} [vTask] Optional, a promise or function to be executed synchronously
309
- * @returns {Promise} Promise resolves once the task is completed
310
- *
311
- * @ui5-restricted
312
- * @final
313
- */
314
- syncTask: function(vTask) {
315
- var fnNewTask;
316
- if (vTask instanceof Promise) {
317
- fnNewTask = function() {
318
- return vTask;
319
- };
320
- } else if (typeof vTask === "function") {
321
- fnNewTask = vTask;
322
- }
323
-
324
- this._pTasks = this._pTasks || Promise.resolve();
325
- if (!!fnNewTask) {
326
- this._pTasks = this._pTasks.then(fnNewTask).catch(function() {
327
- return Promise.resolve();
328
- });
329
- }
330
-
331
- return this._pTasks;
332
- },
333
-
334
- getProgrammingModel: function(oContext) {
335
- return this.getTransactionHelper().getProgrammingModel(oContext);
336
- },
337
-
338
- deleteDocumentTransaction: function(oContext, mParameters) {
339
- var that = this,
340
- oResourceBundle = this.getView().getController().oResourceBundle,
341
- transactionHelper = this.getTransactionHelper();
342
-
343
- mParameters = mParameters || {};
344
-
345
- // TODO: this setting and removing of contexts shouldn't be in the transaction helper at all
346
- // for the time being I kept it and provide the internal model context to not break something
347
- mParameters.internalModelContext = mParameters.controlId
348
- ? sap.ui
349
- .getCore()
350
- .byId(mParameters.controlId)
351
- .getBindingContext("internal")
352
- : null;
353
-
354
- return this.syncTask()
355
- .then(
356
- transactionHelper.deleteDocument.bind(
357
- transactionHelper,
358
- oContext,
359
- mParameters,
360
- oResourceBundle,
361
- that.getMessageHandler()
362
- )
363
- )
364
- .then(function() {
365
- that.getInternalModel().setProperty("/sessionOn", false);
366
- });
367
- },
368
-
369
- /**
370
- * Handles the create event: shows messages and in case of a draft, updates the draft indicator.
371
- *
372
- * @memberof sap.fe.core.controllerextensions.EditFlow
373
- * @param {object} oBinding OData list binding object
374
- */
375
- handleCreateEvents: function(oBinding) {
376
- var that = this,
377
- sProgrammingModel,
378
- transactionHelper = that.getTransactionHelper();
379
-
380
- that.setDraftStatus(DraftStatus.Clear);
381
-
382
- oBinding = (oBinding.getBinding && oBinding.getBinding()) || oBinding;
383
- sProgrammingModel = that.getProgrammingModel(oBinding);
384
-
385
- oBinding.attachEvent("createSent", function() {
386
- transactionHelper.handleDocumentModifications();
387
- if (sProgrammingModel === ProgrammingModel.Draft) {
388
- that.setDraftStatus(DraftStatus.Saving);
389
- }
390
- });
391
- oBinding.attachEvent("createCompleted", function(oEvent) {
392
- var bSuccess = oEvent.getParameter("success");
393
- if (sProgrammingModel === ProgrammingModel.Draft) {
394
- that.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
395
- }
396
- that.getMessageHandler().showMessageDialog();
397
- });
398
- },
399
-
400
- getTransactionHelper: function() {
401
- if (!this._oTransactionHelper) {
402
- // currently also the transaction helper is locking therefore passing lock object
403
- this._oTransactionHelper = new TransactionHelper(this._oAppComponent, this.getGlobalUIModel());
404
- }
405
-
406
- return this._oTransactionHelper;
407
- },
408
-
409
- getInternalModel: function() {
410
- return this.base.getView().getModel("internal");
411
- },
412
-
413
- /**
414
- * Creates a new promise to wait for an action to be executed
415
- * @function
416
- * @name _createActionPromise
417
- * @memberof sap.fe.core.controllerextensions.EditFlow
418
- *
419
- * @returns {Function} The resolver function which can be used to externally resolve the promise
420
- */
421
-
422
- createActionPromise: function(sActionName, sControlId) {
423
- var that = this,
424
- fResolver,
425
- fRejector;
426
- this.oActionPromise = new Promise(function(resolve, reject) {
427
- fResolver = resolve;
428
- fRejector = reject;
429
- }).then(function(oResponse) {
430
- return Object.assign({ controlId: sControlId }, that.getActionResponseDataAndKeys(sActionName, oResponse));
431
- });
432
- return { fResolver: fResolver, fRejector: fRejector };
433
- },
434
-
435
- /**
436
- * Gets the getCurrentActionPromise object.
437
- *
438
- * @function
439
- * @name _getCurrentActionPromise
440
- * @memberof sap.fe.core.controllerextensions.EditFlow
441
- *
442
- * @returns {Promise} Returns the promise
443
- */
444
- getCurrentActionPromise: function() {
445
- return this.oActionPromise;
446
- },
447
-
448
- deleteCurrentActionPromise: function() {
449
- this.oActionPromise = null;
450
- },
451
-
452
- /**
453
- * @function
454
- * @name getActionResponseDataAndKeys
455
- * @memberof sap.fe.core.controllerextensions.EditFlow
456
- * @param {string} sActionName The name of the action that is executed
457
- * @param {object} oResponse The bound action's response data or response context
458
- * @returns {object} Object with data and names of the key fields of the response
459
- */
460
- getActionResponseDataAndKeys: function(sActionName, oResponse) {
461
- if (Array.isArray(oResponse)) {
462
- if (oResponse.length === 1) {
463
- oResponse = oResponse[0];
464
- } else {
465
- return null;
466
- }
467
- }
468
- if (!oResponse) {
469
- return null;
470
- }
471
- var oView = this.getView(),
472
- oMetaModel = oView
473
- .getModel()
474
- .getMetaModel()
475
- .getData(),
476
- sActionReturnType =
477
- oMetaModel && oMetaModel[sActionName] && oMetaModel[sActionName][0] && oMetaModel[sActionName][0].$ReturnType
478
- ? oMetaModel[sActionName][0].$ReturnType.$Type
479
- : null,
480
- aKey = sActionReturnType && oMetaModel[sActionReturnType] ? oMetaModel[sActionReturnType].$Key : null;
481
-
482
- return {
483
- oData: oResponse.getObject(),
484
- keys: aKey
485
- };
486
- },
487
-
488
- getMessageHandler: function() {
489
- // at this point of time it's not meant to release the edit flow for FPM custom pages therefore keep
490
- // the logic here for now
491
-
492
- if (this.base.messageHandler) {
493
- return this.base.messageHandler;
494
- } else {
495
- throw new Error("Edit Flow works only with a given message handler");
496
- }
497
- },
498
- override: {
499
- onInit: function() {
500
- this._oAppComponent = this.base.getAppComponent();
501
- }
502
- }
503
- });
504
-
505
- return Extension;
506
- }
507
- );
5
+ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/fe/core/TransactionHelper", "sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/BusyLocker", "sap/fe/core/library", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/controllerextensions/ControllerExtensionMetadata", "sap/m/Dialog", "sap/m/Button", "sap/m/Text", "sap/fe/core/actions/sticky", "sap/fe/core/actions/collaboration/ActivitySync", "sap/fe/core/actions/collaboration/CollaborationCommon"], function (ControllerExtension, OverrideExecution, TransactionHelper, Log, CommonUtils, BusyLocker, FELibrary, EditState, ClassSupport, ControllerExtensionMetadata, Dialog, Button, Text, sticky, ActivitySync, CollaborationCommon) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _class, _class2;
9
+
10
+ var Activity = CollaborationCommon.Activity;
11
+ var send = ActivitySync.send;
12
+ var UI5Class = ClassSupport.UI5Class;
13
+ var Public = ClassSupport.Public;
14
+ var Private = ClassSupport.Private;
15
+ var Override = ClassSupport.Override;
16
+ var Final = ClassSupport.Final;
17
+ var Extensible = ClassSupport.Extensible;
18
+
19
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
20
+
21
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
22
+
23
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
24
+
25
+ var ProgrammingModel = FELibrary.ProgrammingModel,
26
+ DraftStatus = FELibrary.DraftStatus,
27
+ EditMode = FELibrary.EditMode,
28
+ CreationMode = FELibrary.CreationMode;
29
+ var InternalEditFlow = (_dec = UI5Class("sap.fe.core.controllerextensions.InternalEditFlow", ControllerExtensionMetadata), _dec2 = Override(), _dec3 = Extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
30
+ _inherits(InternalEditFlow, _ControllerExtension);
31
+
32
+ function InternalEditFlow() {
33
+ return _ControllerExtension.apply(this, arguments) || this;
34
+ }
35
+
36
+ var _proto = InternalEditFlow.prototype;
37
+
38
+ _proto.onInit = function onInit() {
39
+ this._oAppComponent = this.base.getAppComponent();
40
+ }
41
+ /**
42
+ * Override to set the creation mode.
43
+ *
44
+ * @param bCreationMode
45
+ * @memberof sap.fe.core.controllerextensions.InternalEditFlow
46
+ * @alias sap.fe.core.controllerextensions.InternalEditFlow#setCreationMode
47
+ * @since 1.90.0
48
+ */
49
+ ;
50
+
51
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
52
+ setCreationMode = function setCreationMode(bCreationMode) {// to be overridden
53
+ };
54
+
55
+ _proto.createMultipleDocuments = function createMultipleDocuments(oListBinding, aData, bCreateAtEnd, bFromCopyPaste, beforeCreateCallBack) {
56
+ var _this = this;
57
+
58
+ var transactionHelper = this.getTransactionHelper(),
59
+ oLockObject = this.getGlobalUIModel(),
60
+ oResourceBundle = this.getView().getController().oResourceBundle;
61
+ BusyLocker.lock(oLockObject);
62
+ return this.syncTask().then(function () {
63
+ var onBeforeCreatePromise = beforeCreateCallBack ? beforeCreateCallBack({
64
+ contextPath: oListBinding && oListBinding.getPath()
65
+ }) : Promise.resolve();
66
+ return onBeforeCreatePromise;
67
+ }).then(function () {
68
+ var oModel = oListBinding.getModel(),
69
+ oMetaModel = oModel.getMetaModel();
70
+ var sMetaPath;
71
+
72
+ if (oListBinding.getContext()) {
73
+ sMetaPath = oMetaModel.getMetaPath(oListBinding.getContext().getPath() + "/" + oListBinding.getPath());
74
+ } else {
75
+ sMetaPath = oMetaModel.getMetaPath(oListBinding.getPath());
76
+ }
77
+
78
+ _this.handleCreateEvents(oListBinding); // Iterate on all items and store the corresponding creation promise
79
+
80
+
81
+ var aCreationPromises = aData.map(function (mPropertyValues) {
82
+ var mParameters = {
83
+ data: {}
84
+ };
85
+ mParameters.keepTransientContextOnFailed = false; // currently not fully supported
86
+
87
+ mParameters.busyMode = "None";
88
+ mParameters.creationMode = CreationMode.CreationRow;
89
+ mParameters.parentControl = _this.getView();
90
+ mParameters.createAtEnd = bCreateAtEnd; // Remove navigation properties as we don't support deep create
91
+
92
+ for (var sPropertyPath in mPropertyValues) {
93
+ var oProperty = oMetaModel.getObject(sMetaPath + "/" + sPropertyPath);
94
+
95
+ if (oProperty && oProperty.$kind !== "NavigationProperty" && mPropertyValues[sPropertyPath]) {
96
+ mParameters.data[sPropertyPath] = mPropertyValues[sPropertyPath];
97
+ }
98
+ }
99
+
100
+ return transactionHelper.createDocument(oListBinding, mParameters, oResourceBundle, _this.getMessageHandler(), bFromCopyPaste, _this.getView());
101
+ });
102
+ return Promise.all(aCreationPromises);
103
+ }).then(function (aContexts) {
104
+ // transient contexts are reliably removed once oNewContext.created() is resolved
105
+ return Promise.all(aContexts.map(function (oNewContext) {
106
+ return oNewContext.created();
107
+ }));
108
+ }).then(function () {
109
+ var oBindingContext = _this.getView().getBindingContext(); // if there are transient contexts, we must avoid requesting side effects
110
+ // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
111
+ // if list binding is refreshed, transient contexts might be lost
112
+
113
+
114
+ if (!CommonUtils.hasTransientContext(oListBinding)) {
115
+ _this._oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
116
+ }
117
+ }).catch(function (err) {
118
+ Log.error("Error while creating multiple documents.");
119
+ return Promise.reject(err);
120
+ }).finally(function () {
121
+ BusyLocker.unlock(oLockObject);
122
+ });
123
+ };
124
+
125
+ _proto.deleteMultipleDocuments = function deleteMultipleDocuments(aContexts, mParameters) {
126
+ var _this2 = this;
127
+
128
+ var oRoutingListener = this.getRoutingListener(),
129
+ oLockObject = this.getGlobalUIModel();
130
+ var oTable = this.getView().byId(mParameters.controlId);
131
+
132
+ if (!oTable || !oTable.isA("sap.ui.mdc.Table")) {
133
+ throw new Error("parameter controlId missing or incorrect");
134
+ }
135
+
136
+ var oListBinding = oTable.getRowBinding();
137
+ mParameters.bFindActiveContexts = true;
138
+ BusyLocker.lock(oLockObject);
139
+ return this.deleteDocumentTransaction(aContexts, mParameters).then(function () {
140
+ var oResult; // Multiple object deletion is triggered from a list
141
+ // First clear the selection in the table as it's not valid any more
142
+
143
+ oTable.clearSelection(); // Then refresh the list-binding (LR), or require side-effects (OP)
144
+
145
+ var oBindingContext = _this2.getView().getBindingContext();
146
+
147
+ if (oListBinding.isRoot()) {
148
+ // keep promise chain pending until refresh of listbinding is completed
149
+ oResult = new Promise(function (resolve) {
150
+ oListBinding.attachEventOnce("dataReceived", function () {
151
+ resolve();
152
+ });
153
+ });
154
+ oListBinding.refresh();
155
+ } else if (oBindingContext) {
156
+ // if there are transient contexts, we must avoid requesting side effects
157
+ // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
158
+ // if list binding is refreshed, transient contexts might be lost
159
+ if (!CommonUtils.hasTransientContext(oListBinding)) {
160
+ _this2._oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
161
+ }
162
+ } // deleting at least one object should also set the UI to dirty
163
+
164
+
165
+ EditState.setEditStateDirty();
166
+ send(_this2.getView(), Activity.Delete, aContexts); // Finally, check if the current state can be impacted by the deletion, i.e. if there's
167
+ // an OP displaying a deleted object. If yes navigate back to dismiss the OP
168
+
169
+ for (var index = 0; index < aContexts.length; index++) {
170
+ if (oRoutingListener.isCurrentStateImpactedBy(aContexts[index])) {
171
+ oRoutingListener.navigateBackFromContext(aContexts[index]);
172
+ break;
173
+ }
174
+ }
175
+
176
+ return oResult;
177
+ }).catch(function (oError) {
178
+ Log.error("Error while deleting the document(s)", oError);
179
+ }).finally(function () {
180
+ BusyLocker.unlock(oLockObject);
181
+ });
182
+ }
183
+ /**
184
+ * Decides if a document is to be shown in display or edit mode.
185
+ *
186
+ * @function
187
+ * @name _computeEditMode
188
+ * @memberof sap.fe.core.controllerextensions.InternalEditFlow
189
+ * @param {sap.ui.model.odata.v4.Context} oContext The context to be displayed or edited
190
+ * @returns {Promise} Promise resolves once the edit mode is computed
191
+ */
192
+ ;
193
+
194
+ _proto.computeEditMode = function computeEditMode(oContext) {
195
+ var _this3 = this;
196
+
197
+ var sCustomAction = this.getInternalModel().getProperty("/sCustomAction");
198
+ return Promise.resolve(function () {
199
+ var sProgrammingModel = _this3.getProgrammingModel(oContext);
200
+
201
+ if (sProgrammingModel === ProgrammingModel.Draft) {
202
+ _this3.setDraftStatus(DraftStatus.Clear);
203
+
204
+ return oContext.requestObject("IsActiveEntity").then(function (bIsActiveEntity) {
205
+ if (bIsActiveEntity === false) {
206
+ // in case the document is draft set it in edit mode
207
+ _this3.setEditMode(EditMode.Editable);
208
+
209
+ return oContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
210
+ _this3.setEditMode(undefined, !bHasActiveEntity);
211
+ });
212
+ } else {
213
+ // active document, stay on display mode
214
+ _this3.setEditMode(EditMode.Display, false);
215
+ }
216
+ }).catch(function (oError) {
217
+ Log.error("Error while determining the editMode for draft", oError);
218
+ throw oError;
219
+ });
220
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
221
+ if (sCustomAction && sCustomAction !== "" && _this3._hasNewActionForSticky(oContext, _this3.getView(), sCustomAction)) {
222
+ _this3.getTransactionHelper()._bCreateMode = true;
223
+
224
+ _this3.getTransactionHelper().handleDocumentModifications();
225
+
226
+ _this3.setEditMode(EditMode.Editable, true);
227
+
228
+ EditState.setEditStateDirty();
229
+
230
+ _this3.handleStickyOn(oContext);
231
+
232
+ _this3.getInternalModel().setProperty("/sCustomAction", "");
233
+ }
234
+ }
235
+ }());
236
+ }
237
+ /**
238
+ * Sets the edit mode.
239
+ *
240
+ * @param {string} sEditMode
241
+ * @param {boolean} bCreationMode CreateMode flag to identify the creation mode
242
+ */
243
+ ;
244
+
245
+ _proto.setEditMode = function setEditMode(sEditMode) {
246
+ var bCreationMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
247
+ // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
248
+ // rely on the global UI model to exist
249
+ var oGlobalModel = this.getGlobalUIModel();
250
+
251
+ if (sEditMode) {
252
+ oGlobalModel.setProperty("/editMode", sEditMode, undefined, true);
253
+ oGlobalModel.setProperty("/isEditable", sEditMode === "Editable", undefined, true);
254
+ }
255
+
256
+ if (bCreationMode !== undefined) {
257
+ // Since setCreationMode is public in EditFlow and can be overriden, make sure to call it via the controller
258
+ // to ensure any overrides are taken into account
259
+ this.setCreationMode(bCreationMode);
260
+ }
261
+ };
262
+
263
+ _proto.setDraftStatus = function setDraftStatus(sDraftState) {
264
+ // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
265
+ // rely on the global UI model to exist
266
+ this.base.getView().getModel("ui").setProperty("/draftStatus", sDraftState, undefined, true);
267
+ };
268
+
269
+ _proto.getRoutingListener = function getRoutingListener() {
270
+ // at this point of time it's not meant to release the edit flow for FPM custom pages and the routing
271
+ // listener is not yet public therefore keep the logic here for now
272
+ if (this.base._routing) {
273
+ return this.base._routing;
274
+ } else {
275
+ throw new Error("Edit Flow works only with a given routing listener");
276
+ }
277
+ };
278
+
279
+ _proto.getGlobalUIModel = function getGlobalUIModel() {
280
+ // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
281
+ // rely on the global UI model to exist
282
+ return this.base.getView().getModel("ui");
283
+ }
284
+ /**
285
+ * Performs a task in sync with other tasks created via this function.
286
+ * Returns the promise chain of the task.
287
+ *
288
+ * @function
289
+ * @name sap.fe.core.controllerextensions.EditFlow#syncTask
290
+ * @memberof sap.fe.core.controllerextensions.EditFlow
291
+ * @static
292
+ * @param {Promise|Function} [vTask] Optional, a promise or function to be executed synchronously
293
+ * @returns {Promise} Promise resolves once the task is completed
294
+ *
295
+ * @ui5-restricted
296
+ * @final
297
+ */
298
+ ;
299
+
300
+ _proto.syncTask = function syncTask(vTask) {
301
+ var fnNewTask;
302
+
303
+ if (vTask instanceof Promise) {
304
+ fnNewTask = function () {
305
+ return vTask;
306
+ };
307
+ } else if (typeof vTask === "function") {
308
+ fnNewTask = vTask;
309
+ }
310
+
311
+ this._pTasks = this._pTasks || Promise.resolve();
312
+
313
+ if (!!fnNewTask) {
314
+ this._pTasks = this._pTasks.then(fnNewTask).catch(function () {
315
+ return Promise.resolve();
316
+ });
317
+ }
318
+
319
+ return this._pTasks;
320
+ };
321
+
322
+ _proto.getProgrammingModel = function getProgrammingModel(oContext) {
323
+ return this.getTransactionHelper().getProgrammingModel(oContext);
324
+ };
325
+
326
+ _proto.deleteDocumentTransaction = function deleteDocumentTransaction(oContext, mParameters) {
327
+ var _sap$ui$getCore$byId,
328
+ _this4 = this;
329
+
330
+ var oResourceBundle = this.getView().getController().oResourceBundle,
331
+ transactionHelper = this.getTransactionHelper();
332
+ mParameters = mParameters || {}; // TODO: this setting and removing of contexts shouldn't be in the transaction helper at all
333
+ // for the time being I kept it and provide the internal model context to not break something
334
+
335
+ mParameters.internalModelContext = mParameters.controlId ? (_sap$ui$getCore$byId = sap.ui.getCore().byId(mParameters.controlId)) === null || _sap$ui$getCore$byId === void 0 ? void 0 : _sap$ui$getCore$byId.getBindingContext("internal") : null;
336
+ return this.syncTask().then(transactionHelper.deleteDocument.bind(transactionHelper, oContext, mParameters, oResourceBundle, this.getMessageHandler())).then(function () {
337
+ _this4.getInternalModel().setProperty("/sessionOn", false);
338
+ }).catch(function (oError) {
339
+ return Promise.reject(oError);
340
+ });
341
+ }
342
+ /**
343
+ * Handles the create event: shows messages and in case of a draft, updates the draft indicator.
344
+ *
345
+ * @memberof sap.fe.core.controllerextensions.EditFlow
346
+ * @param {object} oBinding OData list binding object
347
+ */
348
+ ;
349
+
350
+ _proto.handleCreateEvents = function handleCreateEvents(oBinding) {
351
+ var _this5 = this;
352
+
353
+ var transactionHelper = this.getTransactionHelper();
354
+ this.setDraftStatus(DraftStatus.Clear);
355
+ oBinding = oBinding.getBinding && oBinding.getBinding() || oBinding;
356
+ var sProgrammingModel = this.getProgrammingModel(oBinding);
357
+ oBinding.attachEvent("createSent", function () {
358
+ transactionHelper.handleDocumentModifications();
359
+
360
+ if (sProgrammingModel === ProgrammingModel.Draft) {
361
+ _this5.setDraftStatus(DraftStatus.Saving);
362
+ }
363
+ });
364
+ oBinding.attachEvent("createCompleted", function (oEvent) {
365
+ var bSuccess = oEvent.getParameter("success");
366
+
367
+ if (sProgrammingModel === ProgrammingModel.Draft) {
368
+ _this5.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
369
+ }
370
+
371
+ _this5.getMessageHandler().showMessageDialog();
372
+ });
373
+ };
374
+
375
+ _proto.getTransactionHelper = function getTransactionHelper() {
376
+ if (!this._oTransactionHelper) {
377
+ // currently also the transaction helper is locking therefore passing lock object
378
+ this._oTransactionHelper = new TransactionHelper(this._oAppComponent, this.getGlobalUIModel());
379
+ }
380
+
381
+ return this._oTransactionHelper;
382
+ };
383
+
384
+ _proto.getInternalModel = function getInternalModel() {
385
+ return this.base.getView().getModel("internal");
386
+ }
387
+ /**
388
+ * Creates a new promise to wait for an action to be executed
389
+ * @function
390
+ * @name _createActionPromise
391
+ * @memberof sap.fe.core.controllerextensions.EditFlow
392
+ *
393
+ * @returns {Function} The resolver function which can be used to externally resolve the promise
394
+ */
395
+ ;
396
+
397
+ _proto.createActionPromise = function createActionPromise(sActionName, sControlId) {
398
+ var _this6 = this;
399
+
400
+ var fResolver, fRejector;
401
+ this.oActionPromise = new Promise(function (resolve, reject) {
402
+ fResolver = resolve;
403
+ fRejector = reject;
404
+ }).then(function (oResponse) {
405
+ return Object.assign({
406
+ controlId: sControlId
407
+ }, _this6.getActionResponseDataAndKeys(sActionName, oResponse));
408
+ });
409
+ return {
410
+ fResolver: fResolver,
411
+ fRejector: fRejector
412
+ };
413
+ }
414
+ /**
415
+ * Gets the getCurrentActionPromise object.
416
+ *
417
+ * @function
418
+ * @name _getCurrentActionPromise
419
+ * @memberof sap.fe.core.controllerextensions.EditFlow
420
+ *
421
+ * @returns {Promise} Returns the promise
422
+ */
423
+ ;
424
+
425
+ _proto.getCurrentActionPromise = function getCurrentActionPromise() {
426
+ return this.oActionPromise;
427
+ };
428
+
429
+ _proto.deleteCurrentActionPromise = function deleteCurrentActionPromise() {
430
+ this.oActionPromise = undefined;
431
+ }
432
+ /**
433
+ * @function
434
+ * @name getActionResponseDataAndKeys
435
+ * @memberof sap.fe.core.controllerextensions.EditFlow
436
+ * @param {string} sActionName The name of the action that is executed
437
+ * @param {object} oResponse The bound action's response data or response context
438
+ * @returns {object} Object with data and names of the key fields of the response
439
+ */
440
+ ;
441
+
442
+ _proto.getActionResponseDataAndKeys = function getActionResponseDataAndKeys(sActionName, oResponse) {
443
+ if (Array.isArray(oResponse)) {
444
+ if (oResponse.length === 1) {
445
+ oResponse = oResponse[0];
446
+ } else {
447
+ return null;
448
+ }
449
+ }
450
+
451
+ if (!oResponse) {
452
+ return null;
453
+ }
454
+
455
+ var oView = this.getView(),
456
+ oMetaModel = oView.getModel().getMetaModel().getData(),
457
+ sActionReturnType = oMetaModel && oMetaModel[sActionName] && oMetaModel[sActionName][0] && oMetaModel[sActionName][0].$ReturnType ? oMetaModel[sActionName][0].$ReturnType.$Type : null,
458
+ aKey = sActionReturnType && oMetaModel[sActionReturnType] ? oMetaModel[sActionReturnType].$Key : null;
459
+ return {
460
+ oData: oResponse.getObject(),
461
+ keys: aKey
462
+ };
463
+ };
464
+
465
+ _proto.getMessageHandler = function getMessageHandler() {
466
+ // at this point of time it's not meant to release the edit flow for FPM custom pages therefore keep
467
+ // the logic here for now
468
+ if (this.base.messageHandler) {
469
+ return this.base.messageHandler;
470
+ } else {
471
+ throw new Error("Edit Flow works only with a given message handler");
472
+ }
473
+ };
474
+
475
+ _proto.handleStickyOn = function handleStickyOn(oContext) {
476
+ var oAppComponent = CommonUtils.getAppComponent(this.getView());
477
+
478
+ try {
479
+ if (oAppComponent === undefined || oContext === undefined) {
480
+ throw new Error("undefined AppComponent or Context for function handleStickyOn");
481
+ }
482
+
483
+ if (!oAppComponent.getRouterProxy().hasNavigationGuard()) {
484
+ var sHashTracker = oAppComponent.getRouterProxy().getHash(),
485
+ oInternalModel = this.getInternalModel(); // Set a guard in the RouterProxy
486
+ // A timeout is necessary, as with deferred creation the hashChanger is not updated yet with
487
+ // the new hash, and the guard cannot be found in the managed history of the router proxy
488
+
489
+ setTimeout(function () {
490
+ oAppComponent.getRouterProxy().setNavigationGuard();
491
+ }, 0); // Setting back navigation on shell service, to get the dicard message box in case of sticky
492
+
493
+ oAppComponent.getShellServices().setBackNavigation(this.onBackNavigationInSession.bind(this));
494
+ this.fnDirtyStateProvider = this._registerDirtyStateProvider(oAppComponent, oInternalModel, sHashTracker);
495
+ oAppComponent.getShellServices().registerDirtyStateProvider(this.fnDirtyStateProvider); // handle session timeout
496
+
497
+ var i18nModel = this.getView().getModel("sap.fe.i18n");
498
+ this.fnHandleSessionTimeout = this._attachSessionTimeout(this, i18nModel);
499
+ this.getView().getModel().attachSessionTimeout(this.fnHandleSessionTimeout);
500
+ this.fnStickyDiscardAfterNavigation = this._attachRouteMatched(this, oContext, oAppComponent);
501
+ oAppComponent.getRoutingService().attachRouteMatched(this.fnStickyDiscardAfterNavigation);
502
+ }
503
+ } catch (error) {
504
+ Log.info(error);
505
+ return undefined;
506
+ }
507
+
508
+ return true;
509
+ };
510
+
511
+ _proto.handleStickyOff = function handleStickyOff() {
512
+ var oAppComponent = CommonUtils.getAppComponent(this.getView());
513
+
514
+ try {
515
+ if (oAppComponent === undefined) {
516
+ throw new Error("undefined AppComponent for function handleStickyOff");
517
+ }
518
+
519
+ if (oAppComponent && oAppComponent.getRouterProxy) {
520
+ // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
521
+ // sap.fe.core.AppComponent, hence the 'if' above
522
+ oAppComponent.getRouterProxy().discardNavigationGuard();
523
+ }
524
+
525
+ if (this.fnDirtyStateProvider) {
526
+ oAppComponent.getShellServices().deregisterDirtyStateProvider(this.fnDirtyStateProvider);
527
+ this.fnDirtyStateProvider = undefined;
528
+ }
529
+
530
+ if (this.getView().getModel() && this.fnHandleSessionTimeout) {
531
+ this.getView().getModel().detachSessionTimeout(this.fnHandleSessionTimeout);
532
+ }
533
+
534
+ oAppComponent.getRoutingService().detachRouteMatched(this.fnStickyDiscardAfterNavigation);
535
+ this.fnStickyDiscardAfterNavigation = undefined;
536
+ this.getTransactionHelper()._bCreateMode = false;
537
+ this.setEditMode(EditMode.Display, false);
538
+
539
+ if (oAppComponent) {
540
+ // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
541
+ // sap.fe.core.AppComponent, hence the 'if' above
542
+ oAppComponent.getShellServices().setBackNavigation();
543
+ }
544
+ } catch (error) {
545
+ Log.info(error);
546
+ return undefined;
547
+ }
548
+
549
+ return true;
550
+ }
551
+ /**
552
+ * @description Method to display a 'discard' popover when exiting a sticky session.
553
+ *
554
+ * @function
555
+ * @name onBackNavigationInSession
556
+ * @memberof sap.fe.core.controllerextensions.InternalEditFlow
557
+ */
558
+ ;
559
+
560
+ _proto.onBackNavigationInSession = function onBackNavigationInSession() {
561
+ var _this7 = this;
562
+
563
+ var oView = this.getView(),
564
+ oAppComponent = CommonUtils.getAppComponent(oView),
565
+ oRouterProxy = oAppComponent.getRouterProxy();
566
+
567
+ if (oRouterProxy.checkIfBackIsOutOfGuard()) {
568
+ var oBindingContext = oView && oView.getBindingContext();
569
+ CommonUtils.processDataLossConfirmation(function () {
570
+ _this7.discardStickySession(oBindingContext);
571
+
572
+ history.back();
573
+ }, oView, this.getProgrammingModel(oBindingContext));
574
+ return;
575
+ }
576
+
577
+ history.back();
578
+ };
579
+
580
+ _proto.discardStickySession = function discardStickySession(oContext) {
581
+ sticky.discardDocument(oContext);
582
+ this.handleStickyOff();
583
+ };
584
+
585
+ _proto._hasNewActionForSticky = function _hasNewActionForSticky(oContext, oView, sCustomAction) {
586
+ try {
587
+ if (oContext === undefined || oView === undefined) {
588
+ throw new Error("Invalid input parameters for function _hasNewActionForSticky");
589
+ }
590
+
591
+ var oMetaModel = oView.getModel().getMetaModel(),
592
+ sMetaPath = oContext.getPath().substring(0, oContext.getPath().indexOf("(")),
593
+ oStickySession = oMetaModel.getObject(sMetaPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported");
594
+
595
+ if (oStickySession && oStickySession.NewAction && oStickySession.NewAction === sCustomAction) {
596
+ return true;
597
+ } else if (oStickySession && oStickySession.AdditionalNewActions) {
598
+ return sCustomAction === oStickySession.AdditionalNewActions.find(function (sAdditionalAction) {
599
+ return sAdditionalAction === sCustomAction;
600
+ }) ? true : false;
601
+ } else {
602
+ return false;
603
+ }
604
+ } catch (error) {
605
+ Log.info(error);
606
+ return undefined;
607
+ }
608
+ };
609
+
610
+ _proto._registerDirtyStateProvider = function _registerDirtyStateProvider(oAppComponent, oInternalModel, sHashTracker) {
611
+ return function fnDirtyStateProvider(oNavigationContext) {
612
+ try {
613
+ if (oNavigationContext === undefined) {
614
+ throw new Error("Invalid input parameters for function fnDirtyStateProvider");
615
+ }
616
+
617
+ var sTargetHash = oNavigationContext.innerAppRoute,
618
+ oRouterProxy = oAppComponent.getRouterProxy();
619
+ var sLclHashTracker = "";
620
+ var bDirty;
621
+ var bSessionON = oInternalModel.getProperty("/sessionOn");
622
+
623
+ if (!bSessionON) {
624
+ // If the sticky session was terminated before hand.
625
+ // Eexample in case of navigating away from application using IBN.
626
+ return undefined;
627
+ }
628
+
629
+ if (!oRouterProxy.isNavigationFinalized()) {
630
+ // If navigation is currently happening in RouterProxy, it's a transient state
631
+ // (not dirty)
632
+ bDirty = false;
633
+ sLclHashTracker = sTargetHash;
634
+ } else if (sHashTracker === sTargetHash) {
635
+ // the hash didn't change so either the user attempts to refresh or to leave the app
636
+ bDirty = true;
637
+ } else if (oRouterProxy.checkHashWithGuard(sTargetHash) || oRouterProxy.isGuardCrossAllowedByUser()) {
638
+ // the user attempts to navigate within the root object
639
+ // or crossing the guard has already been allowed by the RouterProxy
640
+ sLclHashTracker = sTargetHash;
641
+ bDirty = false;
642
+ } else {
643
+ // the user attempts to navigate within the app, for example back to the list report
644
+ bDirty = true;
645
+ }
646
+
647
+ if (bDirty) {
648
+ // the FLP doesn't call the dirty state provider anymore once it's dirty, as they can't
649
+ // change this due to compatibility reasons we set it back to not-dirty
650
+ setTimeout(function () {
651
+ oAppComponent.getShellServices().setDirtyFlag(false);
652
+ }, 0);
653
+ } else {
654
+ sHashTracker = sLclHashTracker;
655
+ }
656
+
657
+ return bDirty;
658
+ } catch (error) {
659
+ Log.info(error);
660
+ return undefined;
661
+ }
662
+ };
663
+ };
664
+
665
+ _proto._attachSessionTimeout = function _attachSessionTimeout(oContext, i18nModel) {
666
+ var that = oContext;
667
+ return function fnHandleSessionTimeout() {
668
+ try {
669
+ if (oContext === undefined) {
670
+ throw new Error("Context missing for function fnHandleSessionTimeout");
671
+ } // remove transient messages since we will showing our own message
672
+
673
+
674
+ that.getMessageHandler().removeTransitionMessages();
675
+ var oDialog = new Dialog({
676
+ title: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_TITLE}",
677
+ state: "Warning",
678
+ content: new Text({
679
+ text: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_MESSAGE}"
680
+ }),
681
+ beginButton: new Button({
682
+ text: "{sap.fe.i18n>C_COMMON_DIALOG_OK}",
683
+ type: "Emphasized",
684
+ press: function () {
685
+ // remove sticky handling after navigation since session has already been terminated
686
+ that.handleStickyOff();
687
+ that.getRoutingListener().navigateBackFromContext(oContext);
688
+ }
689
+ }),
690
+ afterClose: function () {
691
+ oDialog.destroy();
692
+ }
693
+ });
694
+ oDialog.addStyleClass("sapUiContentPadding");
695
+ oDialog.setModel(i18nModel, "sap.fe.i18n");
696
+ that.getView().addDependent(oDialog);
697
+ oDialog.open();
698
+ } catch (error) {
699
+ Log.info(error);
700
+ return undefined;
701
+ }
702
+
703
+ return true;
704
+ };
705
+ };
706
+
707
+ _proto._attachRouteMatched = function _attachRouteMatched(oFnContext, oContext, oAppComponent) {
708
+ return function fnStickyDiscardAfterNavigation() {
709
+ var sCurrentHash = oAppComponent.getRouterProxy().getHash(); // either current hash is empty so the user left the app or he navigated away from the object
710
+
711
+ if (!sCurrentHash || !oAppComponent.getRouterProxy().checkHashWithGuard(sCurrentHash)) {
712
+ oFnContext.discardStickySession(oContext);
713
+ }
714
+ };
715
+ };
716
+
717
+ return InternalEditFlow;
718
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setCreationMode", [Private, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "setCreationMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createMultipleDocuments", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "createMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "computeEditMode", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "computeEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setEditMode", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "setEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setDraftStatus", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "setDraftStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRoutingListener", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getRoutingListener"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getGlobalUIModel", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getGlobalUIModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "syncTask", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "syncTask"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getProgrammingModel", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getProgrammingModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocumentTransaction", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocumentTransaction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleCreateEvents", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleCreateEvents"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getTransactionHelper", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getTransactionHelper"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getInternalModel", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getInternalModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createActionPromise", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "createActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getCurrentActionPromise", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteCurrentActionPromise", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getActionResponseDataAndKeys", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getActionResponseDataAndKeys"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getMessageHandler", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getMessageHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOn", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOn"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOff", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOff"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBackNavigationInSession", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "onBackNavigationInSession"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "discardStickySession", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "discardStickySession"), _class2.prototype)), _class2)) || _class);
719
+ return InternalEditFlow;
720
+ }, false);
721
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwibmFtZXMiOlsiUHJvZ3JhbW1pbmdNb2RlbCIsIkZFTGlicmFyeSIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJDcmVhdGlvbk1vZGUiLCJJbnRlcm5hbEVkaXRGbG93IiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50Iiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0xpc3RCaW5kaW5nIiwiYURhdGEiLCJiQ3JlYXRlQXRFbmQiLCJiRnJvbUNvcHlQYXN0ZSIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Mb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiQnVzeUxvY2tlciIsImxvY2siLCJzeW5jVGFzayIsInRoZW4iLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImdldFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldENvbnRleHQiLCJnZXRNZXRhUGF0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsImFDcmVhdGlvblByb21pc2VzIiwibWFwIiwibVByb3BlcnR5VmFsdWVzIiwibVBhcmFtZXRlcnMiLCJkYXRhIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJwYXJlbnRDb250cm9sIiwiY3JlYXRlQXRFbmQiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiZ2V0T2JqZWN0IiwiJGtpbmQiLCJjcmVhdGVEb2N1bWVudCIsImdldE1lc3NhZ2VIYW5kbGVyIiwiYWxsIiwiYUNvbnRleHRzIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwicmVqZWN0IiwiZmluYWxseSIsInVubG9jayIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwib1JvdXRpbmdMaXN0ZW5lciIsImdldFJvdXRpbmdMaXN0ZW5lciIsIm9UYWJsZSIsImJ5SWQiLCJjb250cm9sSWQiLCJpc0EiLCJFcnJvciIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsIm9SZXN1bHQiLCJjbGVhclNlbGVjdGlvbiIsImlzUm9vdCIsImF0dGFjaEV2ZW50T25jZSIsInJlZnJlc2giLCJFZGl0U3RhdGUiLCJzZXRFZGl0U3RhdGVEaXJ0eSIsInNlbmQiLCJBY3Rpdml0eSIsIkRlbGV0ZSIsImluZGV4IiwibGVuZ3RoIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJvRXJyb3IiLCJjb21wdXRlRWRpdE1vZGUiLCJvQ29udGV4dCIsInNDdXN0b21BY3Rpb24iLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0UHJvcGVydHkiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJEcmFmdCIsInNldERyYWZ0U3RhdHVzIiwiQ2xlYXIiLCJyZXF1ZXN0T2JqZWN0IiwiYklzQWN0aXZlRW50aXR5Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsImJIYXNBY3RpdmVFbnRpdHkiLCJ1bmRlZmluZWQiLCJEaXNwbGF5IiwiU3RpY2t5IiwiX2hhc05ld0FjdGlvbkZvclN0aWNreSIsIl9iQ3JlYXRlTW9kZSIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsImhhbmRsZVN0aWNreU9uIiwic2V0UHJvcGVydHkiLCJzRWRpdE1vZGUiLCJvR2xvYmFsTW9kZWwiLCJzRHJhZnRTdGF0ZSIsIl9yb3V0aW5nIiwidlRhc2siLCJmbk5ld1Rhc2siLCJfcFRhc2tzIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJkZWxldGVEb2N1bWVudCIsImJpbmQiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJhdHRhY2hFdmVudCIsIlNhdmluZyIsIm9FdmVudCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiU2F2ZWQiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9vVHJhbnNhY3Rpb25IZWxwZXIiLCJUcmFuc2FjdGlvbkhlbHBlciIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJzQWN0aW9uTmFtZSIsInNDb250cm9sSWQiLCJmUmVzb2x2ZXIiLCJmUmVqZWN0b3IiLCJvQWN0aW9uUHJvbWlzZSIsIm9SZXNwb25zZSIsIk9iamVjdCIsImFzc2lnbiIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiQXJyYXkiLCJpc0FycmF5Iiwib1ZpZXciLCJnZXREYXRhIiwic0FjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiYUtleSIsIiRLZXkiLCJvRGF0YSIsImtleXMiLCJtZXNzYWdlSGFuZGxlciIsIm9BcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsImhhc05hdmlnYXRpb25HdWFyZCIsInNIYXNoVHJhY2tlciIsImdldEhhc2giLCJvSW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZm5EaXJ0eVN0YXRlUHJvdmlkZXIiLCJfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsImZuSGFuZGxlU2Vzc2lvblRpbWVvdXQiLCJfYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJhdHRhY2hTZXNzaW9uVGltZW91dCIsImZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiIsIl9hdHRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImluZm8iLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwib1JvdXRlclByb3h5IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImhpc3RvcnkiLCJiYWNrIiwic3RpY2t5IiwiZGlzY2FyZERvY3VtZW50Iiwic3Vic3RyaW5nIiwiaW5kZXhPZiIsIm9TdGlja3lTZXNzaW9uIiwiTmV3QWN0aW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJmaW5kIiwic0FkZGl0aW9uYWxBY3Rpb24iLCJvTmF2aWdhdGlvbkNvbnRleHQiLCJzVGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJzTGNsSGFzaFRyYWNrZXIiLCJiRGlydHkiLCJiU2Vzc2lvbk9OIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsInRoYXQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwidGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwib0ZuQ29udGV4dCIsInNDdXJyZW50SGFzaCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQcml2YXRlIiwiUHVibGljIiwiRmluYWwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxNQUFNQSxnQkFBZ0IsR0FBR0MsU0FBUyxDQUFDRCxnQkFBbkM7QUFBQSxNQUNDRSxXQUFXLEdBQUdELFNBQVMsQ0FBQ0MsV0FEekI7QUFBQSxNQUVDQyxRQUFRLEdBQUdGLFNBQVMsQ0FBQ0UsUUFGdEI7QUFBQSxNQUdDQyxZQUFZLEdBQUdILFNBQVMsQ0FBQ0csWUFIMUI7TUFNTUMsZ0IsV0FETEMsUUFBUSxDQUFDLG1EQUFELEVBQXNEQywyQkFBdEQsQyxVQVVQQyxRQUFRLEUsVUFjUkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQzs7Ozs7Ozs7O1dBYlhDLE0sR0FEQSxrQkFDUztBQUNSLFdBQUtDLGNBQUwsR0FBc0IsS0FBS0MsSUFBTCxDQUFVQyxlQUFWLEVBQXRCO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7WUFHQztBQUNBQyxJQUFBQSxlLEdBSEEseUJBR2dCQyxhQUhoQixFQUd3QyxDQUN2QztBQUNBLEs7O1dBR0RDLHVCLEdBRkEsaUNBRXdCQyxZQUZ4QixFQUUyQ0MsS0FGM0MsRUFFdURDLFlBRnZELEVBRTBFQyxjQUYxRSxFQUUrRkMsb0JBRi9GLEVBRTBIO0FBQUE7O0FBQ3pILFVBQU1DLGlC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TSxFQUNBQyxLLDBKQWtCQUQsTSxFQUNBQyxLLGlLQU9BRCxNLEVBQ0FDLEssbUtBWUFELE0sRUFDQUMsSyx5SkFxQkFELE0sRUFDQUMsSyw0SkFxQkFELE0sRUFDQUMsSyw2S0FLQUQsTSxFQUNBQyxLLDRLQWtDQUQsTSxFQUNBQyxLLHVLQXdCQUQsTSxFQUNBQyxLLHFLQVVBRCxNLEVBQ0FDLEssb0tBY0FELE0sRUFDQUMsSywyS0FxQkFELE0sRUFDQUMsSyxrTEFLQUQsTSxFQUNBQyxLLHVMQWFBRCxNLEVBQ0FDLEssOEtBMEJBRCxNLEVBQ0FDLEssZ0tBWUFELE0sRUFDQUMsSyw4SkF5Q0FELE0sRUFDQUMsSyx5S0FnREFELE0sRUFDQUMsSyw4S0F1QkFELE0sRUFDQUMsSztTQTRJYTNQLGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHsgRXh0ZW5zaWJsZSwgRmluYWwsIE92ZXJyaWRlLCBQcml2YXRlLCBQdWJsaWMsIFVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGFcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvc3RpY2t5XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0Q3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcblxuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1wiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBJbnRlcm5hbEVkaXRGbG93IGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9wVGFza3M6IGFueTtcblx0cHJpdmF0ZSBvQWN0aW9uUHJvbWlzZT86IFByb21pc2U8YW55Pjtcblx0cHJpdmF0ZSBfb1RyYW5zYWN0aW9uSGVscGVyPzogVHJhbnNhY3Rpb25IZWxwZXI7XG5cdHByaXZhdGUgZm5EaXJ0eVN0YXRlUHJvdmlkZXI/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBmbkhhbmRsZVNlc3Npb25UaW1lb3V0PzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cdEBPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE92ZXJyaWRlIHRvIHNldCB0aGUgY3JlYXRpb24gbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3cjc2V0Q3JlYXRpb25Nb2RlXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBQcml2YXRlXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKG9MaXN0QmluZGluZzogYW55LCBhRGF0YTogYW55LCBiQ3JlYXRlQXRFbmQ6IGFueSwgYkZyb21Db3B5UGFzdGU6IGFueSwgYmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IGFueSkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBiZWZvcmVDcmVhdGVDYWxsQmFja1xuXHRcdFx0XHRcdD8gYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCkgfSlcblx0XHRcdFx0XHQ6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSArIFwiL1wiICsgb0xpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cblx0XHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdFx0Y29uc3QgYUNyZWF0aW9uUHJvbWlzZXMgPSBhRGF0YS5tYXAoKG1Qcm9wZXJ0eVZhbHVlczogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbVBhcmFtZXRlcnM6IGFueSA9IHsgZGF0YToge30gfTtcblxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSBiQ3JlYXRlQXRFbmQ7XG5cblx0XHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eVBhdGggaW4gbVByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9cIiArIHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbVByb3BlcnR5VmFsdWVzW3NQcm9wZXJ0eVBhdGhdKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0XHRiRnJvbUNvcHlQYXN0ZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFDcmVhdGlvblByb21pc2VzKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbihhQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFDb250ZXh0cy5tYXAoZnVuY3Rpb24ob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldFJvdXRpbmdMaXN0ZW5lcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgVGFibGU7XG5cdFx0aWYgKCFvVGFibGUgfHwgIW9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH1cblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpIGFzIGFueTtcblx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oYUNvbnRleHRzLCBtUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0bGV0IG9SZXN1bHQ7XG5cblx0XHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0XHQob1RhYmxlIGFzIGFueSkuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRcdG9SZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcblx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9MaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdFx0c2VuZCh0aGlzLmdldFZpZXcoKSwgQWN0aXZpdHkuRGVsZXRlLCBhQ29udGV4dHMpO1xuXG5cdFx0XHRcdC8vIEZpbmFsbHksIGNoZWNrIGlmIHRoZSBjdXJyZW50IHN0YXRlIGNhbiBiZSBpbXBhY3RlZCBieSB0aGUgZGVsZXRpb24sIGkuZS4gaWYgdGhlcmUnc1xuXHRcdFx0XHQvLyBhbiBPUCBkaXNwbGF5aW5nIGEgZGVsZXRlZCBvYmplY3QuIElmIHllcyBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhQ29udGV4dHMubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRcdFx0aWYgKG9Sb3V0aW5nTGlzdGVuZXIuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KGFDb250ZXh0c1tpbmRleF0pKSB7XG5cdFx0XHRcdFx0XHRvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGFDb250ZXh0c1tpbmRleF0pO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBvRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY29tcHV0ZUVkaXRNb2RlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGNvbXB1dGVFZGl0TW9kZShvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgc0N1c3RvbUFjdGlvbiA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIik7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKVxuXHRcdFx0XHRcdFx0LnRoZW4oKGJJc0FjdGl2ZUVudGl0eTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChiSXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQgc2V0IGl0IGluIGVkaXQgbW9kZVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpLnRoZW4oKGJIYXNBY3RpdmVFbnRpdHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFiSGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRpZiAoc0N1c3RvbUFjdGlvbiAmJiBzQ3VzdG9tQWN0aW9uICE9PSBcIlwiICYmIHRoaXMuX2hhc05ld0FjdGlvbkZvclN0aWNreShvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHNDdXN0b21BY3Rpb24pKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgXCJcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KSgpXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRWRpdE1vZGVcblx0ICogQHBhcmFtIHtib29sZWFufSBiQ3JlYXRpb25Nb2RlIENyZWF0ZU1vZGUgZmxhZyB0byBpZGVudGlmeSB0aGUgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0c2V0RWRpdE1vZGUoc0VkaXRNb2RlPzogc3RyaW5nLCBiQ3JlYXRpb25Nb2RlOiBib29sZWFuID0gZmFsc2UpIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IG9HbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKHNFZGl0TW9kZSkge1xuXHRcdFx0b0dsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2VkaXRNb2RlXCIsIHNFZGl0TW9kZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdG9HbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIHNFZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmIChiQ3JlYXRpb25Nb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZSk7XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0c2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGU6IGFueSkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIHNEcmFmdFN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0Um91dGluZ0xpc3RlbmVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgYW5kIHRoZSByb3V0aW5nXG5cdFx0Ly8gbGlzdGVuZXIgaXMgbm90IHlldCBwdWJsaWMgdGhlcmVmb3JlIGtlZXAgdGhlIGxvZ2ljIGhlcmUgZm9yIG5vd1xuXG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc3luY1Rhc2tcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtQcm9taXNlfEZ1bmN0aW9ufSBbdlRhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSB0YXNrIGlzIGNvbXBsZXRlZFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRzeW5jVGFzayh2VGFzaz86IEZ1bmN0aW9uIHwgUHJvbWlzZTxhbnk+KSB7XG5cdFx0bGV0IGZuTmV3VGFzaztcblx0XHRpZiAodlRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHZUYXNrO1xuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSB2VGFzaztcblx0XHR9XG5cblx0XHR0aGlzLl9wVGFza3MgPSB0aGlzLl9wVGFza3MgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKCEhZm5OZXdUYXNrKSB7XG5cdFx0XHR0aGlzLl9wVGFza3MgPSB0aGlzLl9wVGFza3MudGhlbihmbk5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fcFRhc2tzO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dDogYW55KTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyBzYXAudWlcblx0XHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdFx0LmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKVxuXHRcdFx0XHRcdD8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50LmJpbmQodHJhbnNhY3Rpb25IZWxwZXIsIG9Db250ZXh0LCBtUGFyYW1ldGVycywgb1Jlc291cmNlQnVuZGxlLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpXG5cdFx0XHQpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0JpbmRpbmcgT0RhdGEgbGlzdCBiaW5kaW5nIG9iamVjdFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0aGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0b0JpbmRpbmcgPSAob0JpbmRpbmcuZ2V0QmluZGluZyAmJiBvQmluZGluZy5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9CaW5kaW5nKTtcblxuXHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlci5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoYlN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0aWYgKCF0aGlzLl9vVHJhbnNhY3Rpb25IZWxwZXIpIHtcblx0XHRcdC8vIGN1cnJlbnRseSBhbHNvIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgbG9ja2luZyB0aGVyZWZvcmUgcGFzc2luZyBsb2NrIG9iamVjdFxuXHRcdFx0dGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyID0gbmV3IFRyYW5zYWN0aW9uSGVscGVyKHRoaXMuX29BcHBDb21wb25lbnQsIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jcmVhdGVBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKlxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Y3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZTogYW55LCBzQ29udHJvbElkOiBhbnkpIHtcblx0XHRsZXQgZlJlc29sdmVyLCBmUmVqZWN0b3I7XG5cdFx0dGhpcy5vQWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkOiBzQ29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiBmUmVzb2x2ZXIsIGZSZWplY3RvcjogZlJlamVjdG9yIH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2V0Q3VycmVudEFjdGlvblByb21pc2Ugb2JqZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyB0aGUgcHJvbWlzZVxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0Z2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMub0FjdGlvblByb21pc2U7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHR0aGlzLm9BY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWU6IHN0cmluZywgb1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShvUmVzcG9uc2UpKSB7XG5cdFx0XHRpZiAob1Jlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRvUmVzcG9uc2UgPSBvUmVzcG9uc2VbMF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFvUmVzcG9uc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b01ldGFNb2RlbCA9IChvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSkuZ2V0RGF0YSgpLFxuXHRcdFx0c0FjdGlvblJldHVyblR5cGUgPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdICYmIG9NZXRhTW9kZWxbc0FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZS4kVHlwZVxuXHRcdFx0XHRcdDogbnVsbCxcblx0XHRcdGFLZXkgPSBzQWN0aW9uUmV0dXJuVHlwZSAmJiBvTWV0YU1vZGVsW3NBY3Rpb25SZXR1cm5UeXBlXSA/IG9NZXRhTW9kZWxbc0FjdGlvblJldHVyblR5cGVdLiRLZXkgOiBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9EYXRhOiBvUmVzcG9uc2UuZ2V0T2JqZWN0KCksXG5cdFx0XHRrZXlzOiBhS2V5XG5cdFx0fTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGdldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIEZQTSBjdXN0b20gcGFnZXMgdGhlcmVmb3JlIGtlZXBcblx0XHQvLyB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGhhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkIHx8IG9Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBvciBDb250ZXh0IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3Qgc0hhc2hUcmFja2VyID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXG5cdFx0XHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdFx0XHQvLyB0aGUgbmV3IGhhc2gsIGFuZCB0aGUgZ3VhcmQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnkgb2YgdGhlIHJvdXRlciBwcm94eVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcykpO1xuXG5cdFx0XHRcdHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIgPSB0aGlzLl9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihvQXBwQ29tcG9uZW50LCBvSW50ZXJuYWxNb2RlbCwgc0hhc2hUcmFja2VyKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQgPSB0aGlzLl9hdHRhY2hTZXNzaW9uVGltZW91dCh0aGlzLCBpMThuTW9kZWwpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBhbnkpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuZm5IYW5kbGVTZXNzaW9uVGltZW91dCk7XG5cblx0XHRcdFx0dGhpcy5mblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24gPSB0aGlzLl9hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcywgb0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRoYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcikge1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpO1xuXHRcdFx0XHR0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSAmJiB0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgYW55KS5kZXRhY2hTZXNzaW9uVGltZW91dCh0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpO1xuXHRcdFx0fVxuXG5cdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKTtcblx0XHRcdHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0b25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0b0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyksXG5cdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAob1JvdXRlclByb3h5LmNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9WaWV3ICYmIG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdENvbW1vblV0aWxzLnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24ob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b1ZpZXcsXG5cdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQmluZGluZ0NvbnRleHQpXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0ZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdH1cblxuXHRfaGFzTmV3QWN0aW9uRm9yU3RpY2t5KG9Db250ZXh0OiBhbnksIG9WaWV3OiBWaWV3LCBzQ3VzdG9tQWN0aW9uOiBzdHJpbmcpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSB1bmRlZmluZWQgfHwgb1ZpZXcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIF9oYXNOZXdBY3Rpb25Gb3JTdGlja3lcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDAsIG9Db250ZXh0LmdldFBhdGgoKS5pbmRleE9mKFwiKFwiKSksXG5cdFx0XHRcdG9TdGlja3lTZXNzaW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXCIpO1xuXG5cdFx0XHRpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uTmV3QWN0aW9uICYmIG9TdGlja3lTZXNzaW9uLk5ld0FjdGlvbiA9PT0gc0N1c3RvbUFjdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1N0aWNreVNlc3Npb24gJiYgb1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHNDdXN0b21BY3Rpb24gPT09XG5cdFx0XHRcdFx0b1N0aWNreVNlc3Npb24uQWRkaXRpb25hbE5ld0FjdGlvbnMuZmluZChmdW5jdGlvbihzQWRkaXRpb25hbEFjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc0FkZGl0aW9uYWxBY3Rpb24gPT09IHNDdXN0b21BY3Rpb247XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvcik7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdF9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIHNIYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGZuRGlydHlTdGF0ZVByb3ZpZGVyKG9OYXZpZ2F0aW9uQ29udGV4dDogYW55KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAob05hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIGZuRGlydHlTdGF0ZVByb3ZpZGVyXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgc1RhcmdldEhhc2ggPSBvTmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZSxcblx0XHRcdFx0XHRvUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBzTGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgYkRpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBiU2Vzc2lvbk9OID0gb0ludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghYlNlc3Npb25PTikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFZXhhbXBsZSBpbiBjYXNlIG9mIG5hdmlnYXRpbmcgYXdheSBmcm9tIGFwcGxpY2F0aW9uIHVzaW5nIElCTi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFvUm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGJEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHRcdHNMY2xIYXNoVHJhY2tlciA9IHNUYXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNIYXNoVHJhY2tlciA9PT0gc1RhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRiRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9Sb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQoc1RhcmdldEhhc2gpIHx8IG9Sb3V0ZXJQcm94eS5pc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIHJvb3Qgb2JqZWN0XG5cdFx0XHRcdFx0Ly8gb3IgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCBieSB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0XHRzTGNsSGFzaFRyYWNrZXIgPSBzVGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRiRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGFwcCwgZm9yIGV4YW1wbGUgYmFjayB0byB0aGUgbGlzdCByZXBvcnRcblx0XHRcdFx0XHRiRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGJEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0hhc2hUcmFja2VyID0gc0xjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGJEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFNlc3Npb25UaW1lb3V0KG9Db250ZXh0OiBhbnksIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRjb25zdCB0aGF0ID0gb0NvbnRleHQ7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5IYW5kbGVTZXNzaW9uVGltZW91dCgpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBmdW5jdGlvbiBmbkhhbmRsZVNlc3Npb25UaW1lb3V0XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGF0LmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGF0LmdldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGF0LmdldFZpZXcoKS5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdF9hdHRhY2hSb3V0ZU1hdGNoZWQob0ZuQ29udGV4dDogYW55LCBvQ29udGV4dDogYW55LCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKCkge1xuXHRcdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFzQ3VycmVudEhhc2ggfHwgIW9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoc0N1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHRvRm5Db250ZXh0LmRpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsRWRpdEZsb3c7XG4iXX0=