@sapui5/sap.fe.core 1.100.0 → 1.102.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 (295) hide show
  1. package/package.json +4 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AppComponent.js +23 -30
  4. package/src/sap/fe/core/AppComponent.ts +35 -40
  5. package/src/sap/fe/core/AppStateHandler.js +8 -8
  6. package/src/sap/fe/core/AppStateHandler.ts +11 -11
  7. package/src/sap/fe/core/BaseController.js +9 -9
  8. package/src/sap/fe/core/BaseController.ts +3 -4
  9. package/src/sap/fe/core/CommonUtils.js +122 -101
  10. package/src/sap/fe/core/CommonUtils.ts +239 -193
  11. package/src/sap/fe/core/ExtensionAPI.js +12 -13
  12. package/src/sap/fe/core/ExtensionAPI.ts +21 -31
  13. package/src/sap/fe/core/PageController.js +19 -13
  14. package/src/sap/fe/core/PageController.ts +40 -34
  15. package/src/sap/fe/core/TemplateComponent.js +198 -123
  16. package/src/sap/fe/core/TemplateComponent.ts +109 -121
  17. package/src/sap/fe/core/TemplateModel.js +7 -9
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  27. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  28. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  29. package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
  30. package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
  33. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
  34. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
  35. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
  36. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
  37. package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
  38. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
  39. package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
  40. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
  41. package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
  42. package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
  43. package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
  44. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
  45. package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
  46. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
  47. package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
  48. package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
  50. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  51. package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
  52. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  53. package/src/sap/fe/core/controllerextensions/Share.js +34 -16
  54. package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
  55. package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
  56. package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
  57. package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
  58. package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  61. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
  63. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
  65. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
  67. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
  68. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  69. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
  70. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
  71. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
  73. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
  74. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
  75. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  77. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
  78. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
  79. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  80. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  82. package/src/sap/fe/core/controls/Any.js +28 -0
  83. package/src/sap/fe/core/controls/Any.ts +30 -0
  84. package/src/sap/fe/core/controls/CommandExecution.js +50 -16
  85. package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
  86. package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
  87. package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
  88. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
  89. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
  90. package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
  91. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
  93. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
  95. package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
  96. package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
  97. package/src/sap/fe/core/controls/FileWrapper.js +360 -0
  98. package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
  99. package/src/sap/fe/core/controls/FilterBar.js +154 -119
  100. package/src/sap/fe/core/controls/FilterBar.ts +128 -123
  101. package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
  102. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
  103. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  104. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  105. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
  106. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
  107. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
  108. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
  109. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
  110. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
  111. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  112. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  113. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
  114. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
  117. package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
  118. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  119. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  120. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  121. package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
  127. package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
  128. package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
  129. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  130. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
  131. package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
  132. package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
  133. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
  135. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
  137. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  138. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  139. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
  140. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
  141. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  142. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  143. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  144. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  145. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  147. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
  149. package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
  151. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
  153. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  154. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  155. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  156. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  157. package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
  158. package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  161. package/src/sap/fe/core/fpm/Component.js +46 -17
  162. package/src/sap/fe/core/fpm/Component.ts +11 -16
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
  165. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  166. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  167. package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
  168. package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
  169. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  170. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  171. package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
  172. package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
  173. package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
  174. package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
  175. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  176. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  177. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
  178. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
  179. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  181. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
  182. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
  183. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  184. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  185. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  186. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  187. package/src/sap/fe/core/library.js +13 -5
  188. package/src/sap/fe/core/library.ts +26 -17
  189. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  190. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
  191. package/src/sap/fe/core/messagebundle.properties +135 -180
  192. package/src/sap/fe/core/messagebundle_ar.properties +31 -64
  193. package/src/sap/fe/core/messagebundle_bg.properties +31 -64
  194. package/src/sap/fe/core/messagebundle_ca.properties +31 -64
  195. package/src/sap/fe/core/messagebundle_cs.properties +31 -64
  196. package/src/sap/fe/core/messagebundle_cy.properties +32 -65
  197. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  198. package/src/sap/fe/core/messagebundle_de.properties +29 -62
  199. package/src/sap/fe/core/messagebundle_el.properties +32 -65
  200. package/src/sap/fe/core/messagebundle_en.properties +32 -65
  201. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
  202. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
  203. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
  204. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
  205. package/src/sap/fe/core/messagebundle_es.properties +31 -64
  206. package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
  207. package/src/sap/fe/core/messagebundle_et.properties +31 -64
  208. package/src/sap/fe/core/messagebundle_fi.properties +29 -62
  209. package/src/sap/fe/core/messagebundle_fr.properties +36 -69
  210. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
  211. package/src/sap/fe/core/messagebundle_hi.properties +29 -62
  212. package/src/sap/fe/core/messagebundle_hr.properties +32 -65
  213. package/src/sap/fe/core/messagebundle_hu.properties +30 -63
  214. package/src/sap/fe/core/messagebundle_id.properties +32 -65
  215. package/src/sap/fe/core/messagebundle_it.properties +31 -64
  216. package/src/sap/fe/core/messagebundle_iw.properties +31 -64
  217. package/src/sap/fe/core/messagebundle_ja.properties +29 -62
  218. package/src/sap/fe/core/messagebundle_kk.properties +31 -64
  219. package/src/sap/fe/core/messagebundle_ko.properties +31 -64
  220. package/src/sap/fe/core/messagebundle_lt.properties +31 -64
  221. package/src/sap/fe/core/messagebundle_lv.properties +32 -65
  222. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  223. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  224. package/src/sap/fe/core/messagebundle_no.properties +31 -64
  225. package/src/sap/fe/core/messagebundle_pl.properties +34 -67
  226. package/src/sap/fe/core/messagebundle_pt.properties +32 -65
  227. package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
  228. package/src/sap/fe/core/messagebundle_ro.properties +33 -66
  229. package/src/sap/fe/core/messagebundle_ru.properties +33 -66
  230. package/src/sap/fe/core/messagebundle_sh.properties +31 -64
  231. package/src/sap/fe/core/messagebundle_sk.properties +31 -64
  232. package/src/sap/fe/core/messagebundle_sl.properties +29 -62
  233. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  234. package/src/sap/fe/core/messagebundle_th.properties +31 -64
  235. package/src/sap/fe/core/messagebundle_tr.properties +31 -64
  236. package/src/sap/fe/core/messagebundle_uk.properties +32 -65
  237. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  238. package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
  239. package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
  240. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
  241. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
  243. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
  244. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
  245. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
  246. package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
  247. package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
  248. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
  249. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
  251. package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
  252. package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
  253. package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
  254. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  255. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
  257. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
  258. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  259. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
  260. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  261. package/src/sap/fe/core/support/CommonHelper.ts +0 -3
  262. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
  263. package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
  264. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  265. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
  266. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  267. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  268. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  269. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  270. package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
  271. package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
  272. package/src/sap/fe/core/templating/UIFormatters.js +133 -22
  273. package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
  274. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  275. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  276. package/src/sap/fe/core/type/Email.js +26 -8
  277. package/src/sap/fe/core/type/Email.ts +8 -7
  278. package/src/sap/fe/core/AnnotationHelper.js +0 -312
  279. package/src/sap/fe/core/AnnotationHelper.ts +0 -315
  280. package/src/sap/fe/core/RouterProxy.js +0 -926
  281. package/src/sap/fe/core/TransactionHelper.js +0 -1562
  282. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
  283. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
  284. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
  285. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
  286. package/src/sap/fe/core/actions/draft.js +0 -523
  287. package/src/sap/fe/core/actions/messageHandling.js +0 -567
  288. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  289. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  290. package/src/sap/fe/core/actions/operations.js +0 -1096
  291. package/src/sap/fe/core/actions/sticky.js +0 -130
  292. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
  293. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
  294. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  295. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -0,0 +1,1149 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, CommonUtils, BusyLocker, messageHandling, FPMHelper, StableIdHelper, FELibrary, Button, Dialog, MessageBox, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
6
+ "use strict";
7
+
8
+ var generate = StableIdHelper.generate;
9
+
10
+ var Constants = FELibrary.Constants,
11
+ InvocationGrouping = FELibrary.InvocationGrouping;
12
+ var Action = MessageBox.Action;
13
+ /**
14
+ * Calls a bound action for one or multiple contexts.
15
+ *
16
+ * @function
17
+ * @static
18
+ * @name sap.fe.core.actions.operations.callBoundAction
19
+ * @memberof sap.fe.core.actions.operations
20
+ * @param {string} sActionName The name of the action to be called
21
+ * @param {sap.ui.model.odata.v4.Context} contexts Either one context or an array with contexts for which the action is to be be called
22
+ * @param {sap.ui.model.odata.v4.Model} oModel OData Model
23
+ * @param {object} oAppComponent The AppComponent
24
+ * @param {map} [mParameters] Optional, can contain the following attributes:
25
+ * @param {map} [mParameters.actionParameters] A map of parameters to be sent for every action call
26
+ * @param {map} [mParameters.mBindingParameters] A map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
27
+ * @param {Array} [mParameters.additionalSideEffect] Array of property paths to be requested in addition to actual target properties of the side effect
28
+ * @param {boolean} [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
29
+ * @param {string} [mParameters.label] A human-readable label for the action
30
+ * @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets, defaults to Isolated
31
+ * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
32
+ * @param {map} [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
33
+ * @param {sap.ui.core.Element} [mParameters.parentControl] If specified the dialogs are added as dependent of the parent control
34
+ * @param {boolean} [mParameters.bGetBoundContext] If specified the action promise returns the bound context
35
+ * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
36
+ * @private
37
+ * @ui5-restricted
38
+ */
39
+
40
+ function callBoundAction(sActionName, contexts, oModel, oAppComponent, mParameters) {
41
+ if (!contexts || contexts.length === 0) {
42
+ //In Freestyle apps bound actions can have no context
43
+ return Promise.reject("Bound actions always requires at least one context");
44
+ } // we expect either one context or an array of contexts
45
+
46
+
47
+ if (Array.isArray(contexts)) {
48
+ mParameters.bReturnAsArray = true;
49
+ } else {
50
+ //action needs to be called on this context from the dependent binding so UI fields are updated with response data
51
+ contexts = [contexts];
52
+ }
53
+
54
+ var oMetaModel = oModel.getMetaModel(),
55
+ sActionPath = oMetaModel.getMetaPath(contexts[0].getPath()) + "/" + sActionName,
56
+ oBoundAction = oMetaModel.createBindingContext(sActionPath + "/@$ui5.overload/0");
57
+ mParameters.aContexts = contexts;
58
+ mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath, contexts, oBoundAction);
59
+ return callAction(sActionName, oModel, oBoundAction, oAppComponent, mParameters);
60
+ }
61
+ /**
62
+ * Calls an action import.
63
+ *
64
+ * @function
65
+ * @static
66
+ * @name sap.fe.core.actions.operations.callActionImport
67
+ * @memberof sap.fe.core.actions.operations
68
+ * @param {string} sActionName The name of the action import to be called
69
+ * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
70
+ * @param {object} oAppComponent The AppComponent
71
+ * @param {map} [mParameters] Optional, can contain the following attributes:
72
+ * @param {map} [mParameters.actionParameters] A map of parameters to be sent with the action import
73
+ * @param {string} [mParameters.label] A human-readable label for the action
74
+ * @param {boolean} [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
75
+ * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
76
+ * @param {map} [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
77
+ * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
78
+ * @private
79
+ * @ui5-restricted
80
+ */
81
+
82
+
83
+ function callActionImport(sActionName, oModel, oAppComponent, mParameters) {
84
+ if (!oModel) {
85
+ return Promise.reject("Action expects a model/context for execution");
86
+ }
87
+
88
+ var oMetaModel = oModel.getMetaModel(),
89
+ sActionPath = oModel.bindContext("/" + sActionName).getPath(),
90
+ oActionImport = oMetaModel.createBindingContext("/" + oMetaModel.createBindingContext(sActionPath).getObject("$Action") + "/0");
91
+ mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath + "/@$ui5.overload");
92
+ return callAction(sActionName, oModel, oActionImport, oAppComponent, mParameters);
93
+ }
94
+
95
+ function callBoundFunction(sFunctionName, context, oModel) {
96
+ if (!context) {
97
+ return Promise.reject("Bound functions always requires a context");
98
+ }
99
+
100
+ var oMetaModel = oModel.getMetaModel(),
101
+ sFunctionPath = oMetaModel.getMetaPath(context.getPath()) + "/" + sFunctionName,
102
+ oBoundFunction = oMetaModel.createBindingContext(sFunctionPath);
103
+ return _executeFunction(sFunctionName, oModel, oBoundFunction, context);
104
+ }
105
+ /**
106
+ * Calls a function import.
107
+ *
108
+ * @function
109
+ * @static
110
+ * @name sap.fe.core.actions.operations.callFunctionImport
111
+ * @memberof sap.fe.core.actions.operations
112
+ * @param {string} sFunctionName The name of the function to be called
113
+ * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
114
+ * @returns {Promise} Promise resolves
115
+ * @private
116
+ */
117
+
118
+
119
+ function callFunctionImport(sFunctionName, oModel) {
120
+ if (!sFunctionName) {
121
+ return Promise.resolve();
122
+ }
123
+
124
+ var oMetaModel = oModel.getMetaModel(),
125
+ sFunctionPath = oModel.bindContext("/" + sFunctionName).getPath(),
126
+ oFunctionImport = oMetaModel.createBindingContext("/" + oMetaModel.createBindingContext(sFunctionPath).getObject("$Function") + "/0");
127
+ return _executeFunction(sFunctionName, oModel, oFunctionImport);
128
+ }
129
+
130
+ function _executeFunction(sFunctionName, oModel, oFunction, context) {
131
+ var sGroupId;
132
+
133
+ if (!oFunction || !oFunction.getObject()) {
134
+ return Promise.reject(new Error("Function " + sFunctionName + " not found"));
135
+ }
136
+
137
+ if (context) {
138
+ oFunction = oModel.bindContext(sFunctionName + "(...)", context);
139
+ sGroupId = "functionGroup";
140
+ } else {
141
+ oFunction = oModel.bindContext("/" + sFunctionName + "(...)");
142
+ sGroupId = "functionImport";
143
+ }
144
+
145
+ var oFunctionPromise = oFunction.execute(sGroupId);
146
+ oModel.submitBatch(sGroupId);
147
+ return oFunctionPromise.then(function () {
148
+ return oFunction.getBoundContext();
149
+ });
150
+ }
151
+
152
+ function callAction(sActionName, oModel, oAction, oAppComponent, mParameters) {
153
+ return new Promise(function (resolve, reject) {
154
+ var aActionParameters = mParameters.actionParameters || [];
155
+ var mActionExecutionParameters = {};
156
+ var fnDialog;
157
+ var oActionPromise;
158
+ var sActionLabel = mParameters.label;
159
+ var bShowActionParameterDialog = mParameters.showActionParameterDialog;
160
+ var aContexts = mParameters.aContexts;
161
+ var bIsCreateAction = mParameters.bIsCreateAction;
162
+ var bIsCriticalAction = mParameters.isCriticalAction;
163
+ var oMetaModel;
164
+ var sMetaPath;
165
+ var sMessagesPath;
166
+ var iMessageSideEffect;
167
+ var bIsSameEntity;
168
+ var oReturnType;
169
+ var bStaticAction;
170
+
171
+ if (!oAction || !oAction.getObject()) {
172
+ return reject(new Error("Action " + sActionName + " not found"));
173
+ }
174
+
175
+ if (bShowActionParameterDialog || aActionParameters.length > 0) {
176
+ aActionParameters = prepareActionParameters(oAction, aActionParameters);
177
+
178
+ if (!aActionParameters || aActionParameters.length === 0) {
179
+ bShowActionParameterDialog = false;
180
+ }
181
+ }
182
+
183
+ if (bShowActionParameterDialog) {
184
+ fnDialog = showActionParameterDialog;
185
+ } else if (bIsCriticalAction) {
186
+ fnDialog = confirmCriticalAction;
187
+ }
188
+
189
+ mActionExecutionParameters = {
190
+ fnOnSubmitted: mParameters.onSubmitted,
191
+ fnOnResponse: mParameters.onResponse,
192
+ actionName: sActionName,
193
+ model: oModel,
194
+ aActionParameters: aActionParameters,
195
+ bGetBoundContext: mParameters.bGetBoundContext,
196
+ defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction,
197
+ label: mParameters.label
198
+ };
199
+
200
+ if (oAction.getObject("$IsBound")) {
201
+ if (mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions) {
202
+ oMetaModel = oModel.getMetaModel();
203
+ sMetaPath = oMetaModel.getMetaPath(aContexts[0].getPath());
204
+ sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
205
+
206
+ if (sMessagesPath) {
207
+ iMessageSideEffect = mParameters.additionalSideEffect.pathExpressions.findIndex(function (exp) {
208
+ return typeof exp === "string" && exp === sMessagesPath;
209
+ }); // Add SAP_Messages by default if not annotated by side effects, action does not return a collection and
210
+ // the return type is the same as the bound type
211
+
212
+ oReturnType = oAction.getObject("$ReturnType");
213
+ bIsSameEntity = oReturnType && !oReturnType.$isCollection && oAction.getModel().getObject(sMetaPath).$Type === oReturnType.$Type;
214
+
215
+ if (iMessageSideEffect > -1 || bIsSameEntity) {
216
+ // the message path is annotated as side effect. As there's no binding for it and the model does currently not allow
217
+ // to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it.
218
+ mParameters.mBindingParameters = mParameters.mBindingParameters || {};
219
+
220
+ if (oAction.getObject("$ReturnType/$Type/" + sMessagesPath) && (!mParameters.mBindingParameters.$select || mParameters.mBindingParameters.$select.split(",").indexOf(sMessagesPath) === -1)) {
221
+ mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? mParameters.mBindingParameters.$select + "," + sMessagesPath : sMessagesPath;
222
+
223
+ if (mParameters.additionalSideEffect.triggerActions.length === 0 && iMessageSideEffect > -1) {
224
+ // no trigger action therefore no need to request messages again
225
+ mParameters.additionalSideEffect.pathExpressions.splice(iMessageSideEffect, 1);
226
+ }
227
+ }
228
+ }
229
+ }
230
+ }
231
+
232
+ mActionExecutionParameters.aContexts = aContexts;
233
+ mActionExecutionParameters.mBindingParameters = mParameters.mBindingParameters;
234
+ mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
235
+ mActionExecutionParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
236
+ mActionExecutionParameters.bReturnAsArray = mParameters.bReturnAsArray;
237
+ mActionExecutionParameters.internalModelContext = mParameters.internalModelContext;
238
+ mActionExecutionParameters.operationAvailableMap = mParameters.operationAvailableMap;
239
+ mActionExecutionParameters.bObjectPage = mParameters.bObjectPage;
240
+
241
+ if (mParameters.controlId) {
242
+ mActionExecutionParameters.control = mParameters.parentControl.byId(mParameters.controlId);
243
+ } else {
244
+ mActionExecutionParameters.control = mParameters.parentControl;
245
+ }
246
+ }
247
+
248
+ if (bIsCreateAction) {
249
+ mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
250
+ }
251
+
252
+ if (fnDialog) {
253
+ oActionPromise = fnDialog(sActionName, oAppComponent, sActionLabel, mActionExecutionParameters, aActionParameters, oAction, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler);
254
+ } else {
255
+ oActionPromise = _executeAction(oAppComponent, mActionExecutionParameters);
256
+ }
257
+
258
+ return oActionPromise.then(function (oOperationResult) {
259
+ if (mActionExecutionParameters.internalModelContext && mActionExecutionParameters.operationAvailableMap && mActionExecutionParameters.aContexts && mActionExecutionParameters.aContexts.length) {
260
+ var selectedContext = mActionExecutionParameters.aContexts.filter(function (oContext) {
261
+ var binding = oContext.getBinding();
262
+ return !binding.isA("sap.ui.model.odata.v4.ODataListBinding");
263
+ });
264
+
265
+ if (selectedContext && selectedContext.length) {
266
+ CommonUtils.setActionEnablement(mActionExecutionParameters.internalModelContext, JSON.parse(mActionExecutionParameters.operationAvailableMap), mActionExecutionParameters.aContexts);
267
+ }
268
+ }
269
+
270
+ resolve(oOperationResult);
271
+ }).catch(function (oOperationResult) {
272
+ reject(oOperationResult);
273
+ });
274
+ });
275
+ }
276
+
277
+ function confirmCriticalAction(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, oActionContext, oParentControl, entitySetName, messageHandler) {
278
+ return new Promise(function (resolve, reject) {
279
+ var boundActionName = sActionName ? sActionName : null;
280
+ boundActionName = boundActionName.indexOf(".") >= 0 ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
281
+ var suffixResourceKey = boundActionName && entitySetName ? entitySetName + "|" + boundActionName : "";
282
+ var oResourceBundle = oParentControl.getController().oResourceBundle;
283
+ var sConfirmationText = CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_CONFIRM_MESSAGE", oResourceBundle, null, suffixResourceKey);
284
+ MessageBox.confirm(sConfirmationText, {
285
+ onClose: function (sAction) {
286
+ if (sAction === Action.OK) {
287
+ return _executeAction(oAppComponent, mParameters).then(function (oOperation) {
288
+ resolve(oOperation);
289
+ }).catch(function (oError) {
290
+ messageHandler.showMessageDialog().then(function () {
291
+ reject(oError);
292
+ }).catch(function () {
293
+ reject(oError);
294
+ });
295
+ });
296
+ } else {
297
+ resolve();
298
+ }
299
+ }
300
+ });
301
+ });
302
+ }
303
+
304
+ function showActionParameterDialog(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, oActionContext, oParentControl, entitySetName, messageHandler) {
305
+ var sPath = _getPath(oActionContext, sActionName),
306
+ metaModel = oActionContext.getModel().oModel.getMetaModel(),
307
+ entitySetContext = metaModel.createBindingContext(sPath),
308
+ sActionNamePath = oActionContext.getObject("$IsBound") ? oActionContext.getPath().split("/@$ui5.overload/0")[0] : oActionContext.getPath().split("/0")[0],
309
+ actionNameContext = metaModel.createBindingContext(sActionNamePath),
310
+ sFragmentName = "sap/fe/core/controls/ActionParameterDialog";
311
+
312
+ return new Promise(function (resolve, reject) {
313
+ var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
314
+ var oParameterModel = new JSONModel({
315
+ $displayMode: {}
316
+ });
317
+ var aFieldInvalid = [];
318
+ var aFormElements = [];
319
+ var mFieldValueMap = {};
320
+
321
+ var validateRequiredProperties = function () {
322
+ return Promise.all(aFormElements.filter(function (oFormElement) {
323
+ var oField = oFormElement.getFields()[0];
324
+ return oField.getRequired() && oField.getValueState() !== "Error";
325
+ }).map(function (oFormElement) {
326
+ var value = oFormElement.getFields()[0].isA("sap.ui.mdc.MultiValueField") ? oFormElement.getFields()[0].getItems() : oFormElement.getFields()[0].getValue();
327
+
328
+ if (value === undefined || value === null || value === "" || Array.isArray(value) && !value.length) {
329
+ return oFormElement.getLabel().getText();
330
+ }
331
+ })).then(function (aResults) {
332
+ aResults = aResults.filter(function (result) {
333
+ return result !== undefined;
334
+ });
335
+ return aResults;
336
+ });
337
+ };
338
+
339
+ var _validateMessages = function (aActionParameters, aFieldInvalid, bClearTarget) {
340
+ var oMessageManager = Core.getMessageManager();
341
+ var aMessages = oMessageManager.getMessageModel().getData();
342
+ aFieldInvalid = aFieldInvalid || [];
343
+
344
+ if (!aMessages.length) {
345
+ aFieldInvalid = [];
346
+ }
347
+
348
+ aActionParameters.forEach(function (oActionParameters) {
349
+ var sParameter = oActionParameters.$Name;
350
+ aMessages.forEach(function (oMessage) {
351
+ var sParam = sParameter.replace("-inner", "");
352
+
353
+ if (oMessage.controlIds.length > 0 && (oMessage.getControlId().includes("APD_::" + sParameter) || oMessage.getControlId().includes("APD_::" + sParameter + "inner") && aFieldInvalid.indexOf("APD_::" + sParam) < 0)) {
354
+ if (bClearTarget) {
355
+ oMessageManager.removeMessages(oMessage);
356
+ } else {
357
+ aFieldInvalid.push("APD_::" + sParam);
358
+ }
359
+ } // Handle messages related to input with invalid token
360
+
361
+
362
+ if (oMessage.target.includes("APD_::" + sParameter)) {
363
+ aFieldInvalid.push("APD_::" + sParam);
364
+ oMessage.target = bClearTarget ? "" : oMessage.target;
365
+
366
+ if (bClearTarget) {
367
+ oMessageManager.removeMessages(oMessage);
368
+ }
369
+ }
370
+ });
371
+ });
372
+ return aFieldInvalid;
373
+ };
374
+
375
+ var oController = {
376
+ handleChange: function (oEvent) {
377
+ messageHandler.removeTransitionMessages();
378
+ var oField = oEvent.getSource();
379
+ var sFieldId = oEvent.getParameter("id");
380
+ var oFieldPromise = oEvent.getParameter("promise");
381
+
382
+ if (oFieldPromise) {
383
+ mFieldValueMap[sFieldId] = oFieldPromise.then(function () {
384
+ return oField.getValue();
385
+ });
386
+ }
387
+
388
+ _validateMessages(aActionParameters, aFieldInvalid);
389
+ }
390
+ };
391
+ return Promise.resolve(XMLPreprocessor.process(oFragment, {
392
+ name: sFragmentName
393
+ }, {
394
+ bindingContexts: {
395
+ action: oActionContext,
396
+ actionName: actionNameContext,
397
+ entitySet: entitySetContext
398
+ },
399
+ models: {
400
+ action: oActionContext.getModel(),
401
+ actionName: actionNameContext.getModel(),
402
+ entitySet: entitySetContext.getModel(),
403
+ metaModel: entitySetContext.getModel()
404
+ }
405
+ })).then(function (oFragment) {
406
+ // TODO: move the dialog into the fragment and move the handlers to the oController
407
+ var aContexts;
408
+ var aFunctionParams = [];
409
+ var oOperationBinding;
410
+ return CommonUtils.setUserDefaults(oAppComponent, aActionParameters, oParameterModel, true).then(function () {
411
+ // TODO: move the dialog into the fragment and move the handlers to the oController
412
+ return Fragment.load({
413
+ definition: oFragment,
414
+ controller: oController
415
+ }).then(function (oDialogContent) {
416
+ var oResourceBundle = oParentControl.getController().oResourceBundle;
417
+ var oDialog = new Dialog(undefined, {
418
+ title: sActionLabel || CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_TITLE", oResourceBundle),
419
+ content: [oDialogContent],
420
+ escapeHandler: function () {
421
+ oDialog.close();
422
+ messageHandler.removeTransitionMessages();
423
+ reject();
424
+ },
425
+ beginButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Ok"]), {
426
+ text: sActionLabel || CommonUtils.getTranslatedText("C_COMMON_DIALOG_OK", oResourceBundle),
427
+ type: "Emphasized",
428
+ press: function () {
429
+ validateRequiredProperties().then(function (aEmptyMandatoryFields) {
430
+ if (aEmptyMandatoryFields.length) {
431
+ var oMessages = [];
432
+
433
+ for (var i = 0; i < aEmptyMandatoryFields.length; i++) {
434
+ oMessages.push({
435
+ text: CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_MISSING_MANDATORY_MSG", oResourceBundle, aEmptyMandatoryFields[i]),
436
+ code: 200,
437
+ type: "Error"
438
+ });
439
+ }
440
+
441
+ messageHandler.showMessageDialog({
442
+ customMessages: oMessages
443
+ });
444
+ return;
445
+ }
446
+
447
+ aFieldInvalid = _validateMessages(aActionParameters, aFieldInvalid);
448
+
449
+ if (aFieldInvalid.length > 0) {
450
+ return messageHandling.showUnboundMessages();
451
+ }
452
+
453
+ BusyLocker.lock(oDialog);
454
+ return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
455
+ return mFieldValueMap[sKey];
456
+ })).then(function () {
457
+ // TODO: due to using the search and value helps on the action dialog transient messages could appear
458
+ // we need an UX design for those to show them to the user - for now remove them before continuing
459
+ messageHandler.removeTransitionMessages(); // move parameter values from Dialog (SimpleForm) to mParameters.actionParameters so that they are available in the operation bindings for all contexts
460
+
461
+ var vParameterValue;
462
+ var oParameterContext = oOperationBinding && oOperationBinding.getParameterContext();
463
+
464
+ for (var _i in aActionParameters) {
465
+ if (aActionParameters[_i].$isCollection) {
466
+ var aMVFContent = oDialog.getModel("mvfview").getProperty("/" + aActionParameters[_i].$Name),
467
+ aKeyValues = [];
468
+
469
+ for (var j in aMVFContent) {
470
+ aKeyValues.push(aMVFContent[j].Key);
471
+ }
472
+
473
+ vParameterValue = aKeyValues;
474
+ } else {
475
+ vParameterValue = oParameterContext.getProperty(aActionParameters[_i].$Name);
476
+ }
477
+
478
+ aActionParameters[_i].value = vParameterValue;
479
+ vParameterValue = undefined;
480
+ }
481
+
482
+ mParameters.label = sActionLabel;
483
+ return _executeAction(oAppComponent, mParameters).then(function (oOperation) {
484
+ oDialog.close();
485
+ resolve(oOperation);
486
+ }).catch(function (oError) {
487
+ var messages = messageHandling.getMessages();
488
+ messages = messages.concat(messageHandling.getMessages(true, true));
489
+
490
+ if (!mParameters.bGrouped && !(!mParameters.control.isA("sap.ui.mdc.Table") && aContexts.length === 1) && messages.length) {
491
+ oDialog.close();
492
+ }
493
+
494
+ throw oError;
495
+ });
496
+ }).catch(function () {
497
+ var oMessageManager = Core.getMessageManager();
498
+ var messages = oMessageManager.getMessageModel().getData();
499
+ var subtitleColumn = CommonUtils.getMessageColumn(mParameters.control);
500
+ var errorContext = undefined;
501
+ var errorTargetsInAPM = false;
502
+ messages.forEach(function (message) {
503
+ var messageTargets = message.getTargets();
504
+
505
+ if (messageTargets && messageTargets.length === 1 && messageTargets[0].length) {
506
+ errorContext = aContexts.find(function (oContext) {
507
+ return message.getTarget().indexOf(oContext.getPath()) !== -1;
508
+ });
509
+ message.additionalText = errorContext ? errorContext.getObject()[subtitleColumn] : undefined;
510
+ }
511
+
512
+ if (message.getTarget().indexOf(mParameters.actionName) !== -1 && message.getTarget().indexOf(mParameters.aActionParameters[0].$Name) !== -1 && errorTargetsInAPM === false) {
513
+ errorTargetsInAPM = true;
514
+ }
515
+ });
516
+ var bHasEtagMessage = messageHandling.modifyETagMessagesOnly(oMessageManager, oResourceBundle);
517
+ messageHandler.showMessages({
518
+ bHasEtagMessage: bHasEtagMessage,
519
+ context: mParameters.aContexts[0],
520
+ isActionParameterDialogOpen: oDialog.isOpen(),
521
+ messagePageNavigationCallback: function () {
522
+ oDialog.close();
523
+ },
524
+ errorTargetsInAPM: errorTargetsInAPM
525
+ });
526
+
527
+ if (oDialog && bHasEtagMessage && oDialog.isOpen()) {
528
+ oDialog.close(); //close the action parameter dialog after refresh of the context after etag mismatch
529
+ }
530
+ }).finally(function () {
531
+ BusyLocker.unlock(oDialog);
532
+ });
533
+ }).catch(function () {
534
+ return messageHandler.showMessageDialog();
535
+ });
536
+ }
537
+ }),
538
+ endButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Cancel"]), {
539
+ text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
540
+ press: function () {
541
+ _validateMessages(aActionParameters, aFieldInvalid, true);
542
+
543
+ oDialog.close();
544
+ messageHandler.removeTransitionMessages();
545
+ reject(Constants.CancelActionDialog);
546
+ }
547
+ }),
548
+ beforeOpen: function (oEvent) {
549
+ // clone event for actionWrapper as oEvent.oSource gets lost during processing of beforeOpen event handler
550
+ var oCloneEvent = Object.assign({}, oEvent);
551
+ messageHandler.removeTransitionMessages();
552
+
553
+ var getDefaultValuesFunction = function () {
554
+ var oMetaModel = oDialog.getModel().getMetaModel(),
555
+ sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
556
+ sDefaultValuesFunction = oMetaModel.getObject(sActionPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
557
+ return sDefaultValuesFunction;
558
+ };
559
+
560
+ var fnSetDefaultsAndOpenDialog = function (sBindingParameter) {
561
+ var sBoundFunctionName = getDefaultValuesFunction();
562
+
563
+ var prefillParameter = function (sParamName, vParamDefaultValue) {
564
+ return new Promise(function (resolve) {
565
+ // Case 1: There is a ParameterDefaultValue annotation
566
+ if (vParamDefaultValue !== undefined) {
567
+ if (aContexts.length > 0 && vParamDefaultValue.$Path) {
568
+ var oPromise = CommonUtils.requestSingletonProperty(vParamDefaultValue.$Path, oOperationBinding.getModel());
569
+ oPromise.then(function (oValue) {
570
+ if (oValue === null) {
571
+ return oOperationBinding.getParameterContext().requestProperty(vParamDefaultValue.$Path);
572
+ }
573
+
574
+ return oValue;
575
+ }).then(function (vParamValue) {
576
+ if (aContexts.length > 1) {
577
+ // For multi select, need to loop over aContexts (as contexts cannot be retrieved via binding parameter of the operation binding)
578
+ var sPathForContext = vParamDefaultValue.$Path;
579
+
580
+ if (sPathForContext.indexOf(sBindingParameter + "/") === 0) {
581
+ sPathForContext = sPathForContext.replace(sBindingParameter + "/", "");
582
+ }
583
+
584
+ for (var i = 1; i < aContexts.length; i++) {
585
+ if (aContexts[i].getProperty(sPathForContext) !== vParamValue) {
586
+ // if the values from the contexts are not all the same, do not prefill
587
+ resolve({
588
+ paramName: sParamName,
589
+ value: undefined,
590
+ bNoPossibleValue: true
591
+ });
592
+ }
593
+ }
594
+ }
595
+
596
+ resolve({
597
+ paramName: sParamName,
598
+ value: vParamValue
599
+ });
600
+ }).catch(function () {
601
+ // Simply clear parameter default if an error has occurred
602
+ Log.error("Error while reading default action parameter", sParamName, mParameters.actionName);
603
+ resolve({
604
+ paramName: sParamName,
605
+ value: undefined,
606
+ bLatePropertyError: true
607
+ });
608
+ });
609
+ } else {
610
+ // Case 1.2: ParameterDefaultValue defines a fixed string value (i.e. vParamDefaultValue = 'someString')
611
+ resolve({
612
+ paramName: sParamName,
613
+ value: vParamDefaultValue
614
+ });
615
+ }
616
+ } else {
617
+ // Case 2: There is no ParameterDefaultValue annotation (=> look into the FLP User Defaults)
618
+ if (oParameterModel && oParameterModel.oData[sParamName]) {
619
+ resolve({
620
+ paramName: sParamName,
621
+ value: oParameterModel.oData[sParamName]
622
+ });
623
+ } else {
624
+ resolve({
625
+ paramName: sParamName,
626
+ value: undefined
627
+ });
628
+ }
629
+ }
630
+ });
631
+ };
632
+
633
+ var getParameterDefaultValue = function (sParamName) {
634
+ var oMetaModel = oDialog.getModel().getMetaModel(),
635
+ sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
636
+ sActionParameterAnnotationTarget = sActionPath + "/" + sParamName + "@",
637
+ oParameterAnnotations = oMetaModel.getObject(sActionParameterAnnotationTarget),
638
+ oParameterDefaultValue = oParameterAnnotations && oParameterAnnotations["@com.sap.vocabularies.UI.v1.ParameterDefaultValue"]; // either { $Path: 'somePath' } or 'someString'
639
+
640
+ return oParameterDefaultValue;
641
+ };
642
+
643
+ var aCurrentParamDefaultValue = [];
644
+ var sParamName, vParameterDefaultValue;
645
+
646
+ for (var i in aActionParameters) {
647
+ sParamName = aActionParameters[i].$Name;
648
+ vParameterDefaultValue = getParameterDefaultValue(sParamName);
649
+ aCurrentParamDefaultValue.push(prefillParameter(sParamName, vParameterDefaultValue));
650
+ }
651
+
652
+ if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
653
+ if (sBoundFunctionName && sBoundFunctionName.length > 0 && typeof sBoundFunctionName === "string") {
654
+ for (var _i2 in aContexts) {
655
+ aFunctionParams.push(callBoundFunction(sBoundFunctionName, aContexts[_i2], mParameters.model));
656
+ }
657
+ }
658
+ }
659
+
660
+ var aPrefillParamPromises = Promise.all(aCurrentParamDefaultValue);
661
+ var aExecFunctionPromises = Promise.resolve([]);
662
+ var oExecFunctionFromManifestPromise;
663
+
664
+ if (aFunctionParams && aFunctionParams.length > 0) {
665
+ aExecFunctionPromises = Promise.all(aFunctionParams);
666
+ }
667
+
668
+ if (mParameters.defaultValuesExtensionFunction) {
669
+ var sModule = mParameters.defaultValuesExtensionFunction.substring(0, mParameters.defaultValuesExtensionFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
670
+ sFunctionName = mParameters.defaultValuesExtensionFunction.substring(mParameters.defaultValuesExtensionFunction.lastIndexOf(".") + 1, mParameters.defaultValuesExtensionFunction.length);
671
+ oExecFunctionFromManifestPromise = FPMHelper.actionWrapper(oCloneEvent, sModule, sFunctionName, {
672
+ "contexts": aContexts
673
+ });
674
+ }
675
+
676
+ Promise.all([aPrefillParamPromises, aExecFunctionPromises, oExecFunctionFromManifestPromise]).then(function (aPromises) {
677
+ var aCurrentParamDefaultValue = aPromises[0];
678
+ var aFunctionParams = aPromises[1];
679
+ var oFunctionParamsFromManifest = aPromises[2];
680
+ var sDialogParamName;
681
+
682
+ for (var _i3 in aActionParameters) {
683
+ sDialogParamName = aActionParameters[_i3].$Name;
684
+
685
+ if (oFunctionParamsFromManifest && oFunctionParamsFromManifest.hasOwnProperty(sDialogParamName)) {
686
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, oFunctionParamsFromManifest[sDialogParamName]);
687
+ } else if (aCurrentParamDefaultValue[_i3] && aCurrentParamDefaultValue[_i3].value !== undefined) {
688
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, aCurrentParamDefaultValue[_i3].value); // if the default value had not been previously determined due to different contexts, we do nothing else
689
+ } else if (sBoundFunctionName && !aCurrentParamDefaultValue[_i3].bNoPossibleValue) {
690
+ if (aContexts.length > 1) {
691
+ // we check if the function retrieves the same param value for all the contexts:
692
+ var j = 0;
693
+
694
+ while (j < aContexts.length - 1) {
695
+ if (aFunctionParams[j] && aFunctionParams[j + 1] && aFunctionParams[j].getObject(sDialogParamName) === aFunctionParams[j + 1].getObject(sDialogParamName)) {
696
+ j++;
697
+ } else {
698
+ break;
699
+ }
700
+ } //param values are all the same:
701
+
702
+
703
+ if (j === aContexts.length - 1) {
704
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, aFunctionParams[j].getObject(sDialogParamName));
705
+ }
706
+ } else {
707
+ //Only one context, then the default param values are to be verified from the function:
708
+ if (aFunctionParams[0] && aFunctionParams[0].getObject(sDialogParamName)) {
709
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, aFunctionParams[0].getObject(sDialogParamName));
710
+ }
711
+ }
712
+ }
713
+ }
714
+
715
+ var bErrorFound = aCurrentParamDefaultValue.some(function (oValue) {
716
+ if (oValue.bLatePropertyError) {
717
+ return oValue.bLatePropertyError;
718
+ }
719
+ }); // If at least one Default Property is a Late Property and an eTag error was raised.
720
+
721
+ if (bErrorFound) {
722
+ var sText = CommonUtils.getTranslatedText("C_APP_COMPONENT_SAPFE_ETAG_LATE_PROPERTY", oResourceBundle);
723
+ MessageBox.warning(sText, {
724
+ contentWidth: "25em"
725
+ });
726
+ }
727
+ }).catch();
728
+ };
729
+
730
+ if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
731
+ var aParameters = oActionContext.getObject("$Parameter"),
732
+ sBindingParameter = aParameters[0] && aParameters[0].$Name;
733
+ aContexts[0].requestObject().then(function (oContextObject) {
734
+ if (oContextObject) {
735
+ oOperationBinding.setParameter(sBindingParameter, oContextObject);
736
+ }
737
+
738
+ fnSetDefaultsAndOpenDialog(sBindingParameter);
739
+ }).catch(function (oError) {
740
+ Log.error("Error while retrieving the parameter", oError);
741
+ });
742
+ } else {
743
+ fnSetDefaultsAndOpenDialog();
744
+ }
745
+ },
746
+ afterClose: function () {
747
+ oDialog.destroy();
748
+ }
749
+ });
750
+ aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
751
+ oDialog.setModel(oActionContext.getModel().oModel);
752
+ oDialog.setModel(oParameterModel, "paramsModel");
753
+ oDialog.bindElement({
754
+ path: "/",
755
+ model: "paramsModel"
756
+ }); // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
757
+
758
+ var oMVFModel = new JSONModel({});
759
+ oDialog.setModel(oMVFModel, "mvfview");
760
+ var sActionPath = sActionName + "(...)";
761
+ aContexts = mParameters.aContexts || [];
762
+
763
+ if (!aContexts.length) {
764
+ sActionPath = "/" + sActionPath;
765
+ }
766
+
767
+ oDialog.bindElement({
768
+ path: sActionPath
769
+ });
770
+
771
+ if (oParentControl) {
772
+ // if there is a parent control specified add the dialog as dependent
773
+ oParentControl.addDependent(oDialog);
774
+ }
775
+
776
+ if (aContexts.length > 0) {
777
+ oDialog.setBindingContext(aContexts[0]); // use context of first selected line item
778
+ }
779
+
780
+ oOperationBinding = oDialog.getObjectBinding();
781
+ oDialog.open();
782
+ });
783
+ });
784
+ }).catch(reject);
785
+ });
786
+ }
787
+
788
+ function prepareActionParameters(oAction, aPredefinedParameters) {
789
+ // check if parameters exist at all
790
+ var aParameters = getActionParameters(oAction);
791
+ aPredefinedParameters = aPredefinedParameters || [];
792
+
793
+ if (aPredefinedParameters.length > 0) {// TODO: merge the predefined once with the real existing one
794
+ }
795
+
796
+ return aParameters;
797
+ }
798
+
799
+ function getActionParameters(oAction) {
800
+ var aParameters = oAction.getObject("$Parameter") || [];
801
+
802
+ if (aParameters && aParameters.length) {
803
+ if (oAction.getObject("$IsBound")) {
804
+ //in case of bound actions, ignore the first parameter and consider the rest
805
+ return aParameters.slice(1, aParameters.length) || [];
806
+ }
807
+ }
808
+
809
+ return aParameters;
810
+ }
811
+
812
+ function getIsActionCritical(oMetaModel, sPath, contexts, oBoundAction) {
813
+ var vActionCritical = oMetaModel.getObject(sPath + "@com.sap.vocabularies.Common.v1.IsActionCritical");
814
+ var sCriticalPath = vActionCritical && vActionCritical.$Path;
815
+
816
+ if (!sCriticalPath) {
817
+ // the static value scenario for isActionCritical
818
+ return !!vActionCritical;
819
+ }
820
+
821
+ var aBindingParams = oBoundAction && oBoundAction.getObject("$Parameter"),
822
+ aPaths = sCriticalPath && sCriticalPath.split("/"),
823
+ bCondition = aBindingParams && aBindingParams.length && typeof aBindingParams === "object" && sCriticalPath && contexts && contexts.length;
824
+
825
+ if (bCondition) {
826
+ //in case binding patameters are there in path need to remove eg: - _it/isVerified => need to remove _it and the path should be isVerified
827
+ aBindingParams.filter(function (oParams) {
828
+ var index = aPaths && aPaths.indexOf(oParams.$Name);
829
+
830
+ if (index > -1) {
831
+ aPaths.splice(index, 1);
832
+ }
833
+ });
834
+ sCriticalPath = aPaths.join("/");
835
+ return contexts[0].getObject(sCriticalPath);
836
+ } else if (sCriticalPath) {
837
+ //if scenario is path based return the path value
838
+ return contexts[0].getObject(sCriticalPath);
839
+ }
840
+ }
841
+
842
+ function executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId) {
843
+ var oActionPromise;
844
+
845
+ if (mParameters.internalModelContext && mParameters.internalModelContext.getObject().numberOfSelectedContexts > 1) {
846
+ oActionPromise = bGetBoundContext ? oAction.execute(sGroupId).then(function () {
847
+ return oAction.getBoundContext();
848
+ }) : oAction.execute(sGroupId);
849
+ } else {
850
+ oActionPromise = bGetBoundContext ? oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters.label, mParameters.model)).then(function () {
851
+ return oAction.getBoundContext();
852
+ }) : oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters.label, mParameters.model));
853
+ }
854
+
855
+ return oActionPromise;
856
+ }
857
+
858
+ function _executeAction(oAppComponent, mParameters) {
859
+ var aContexts = mParameters.aContexts || [];
860
+ var oModel = mParameters.model;
861
+ var iExistingMessages = messageHandling.getMessages().length || 0;
862
+ var aActionParameters = mParameters.aActionParameters || [];
863
+ var sActionName = mParameters.actionName;
864
+ var fnOnSubmitted = mParameters.fnOnSubmitted;
865
+ var fnOnResponse = mParameters.fnOnResponse;
866
+ var bIsCreateAction = mParameters.bIsCreateAction;
867
+ var oAction; // let contextIndex = 0;
868
+ // let aMessages: any[] = [];
869
+
870
+ function fnDifferentiate(promise) {
871
+ return promise.then(function (response) {
872
+ var aMessages = messageHandling.getMessages();
873
+ aMessages = aMessages.concat(messageHandling.getMessages(true, true)); // Action Dialog must remain open if there are response error-messages, because in the java stack the dialog would be closed immediately.
874
+
875
+ if (aMessages.length > iExistingMessages && aMessages[aMessages.length - 1].type === "Error") {
876
+ return {
877
+ response: response,
878
+ status: "rejected"
879
+ };
880
+ }
881
+
882
+ return {
883
+ response: response,
884
+ status: "resolved"
885
+ };
886
+ }, function (response) {
887
+ return {
888
+ response: response,
889
+ status: "rejected"
890
+ };
891
+ });
892
+ }
893
+
894
+ function setActionParameterDefaultValue() {
895
+ if (aActionParameters && aActionParameters.length) {
896
+ for (var j = 0; j < aActionParameters.length; j++) {
897
+ if (!aActionParameters[j].value) {
898
+ switch (aActionParameters[j].$Type) {
899
+ case "Edm.String":
900
+ aActionParameters[j].value = "";
901
+ break;
902
+
903
+ case "Edm.Boolean":
904
+ aActionParameters[j].value = false;
905
+ break;
906
+
907
+ case "Edm.Byte":
908
+ case "Edm.Int16":
909
+ case "Edm.Int32":
910
+ case "Edm.Int64":
911
+ aActionParameters[j].value = 0;
912
+ break;
913
+ // tbc
914
+
915
+ default:
916
+ break;
917
+ }
918
+ }
919
+
920
+ oAction.setParameter(aActionParameters[j].$Name, aActionParameters[j].value);
921
+ }
922
+ }
923
+ }
924
+
925
+ if (aContexts.length) {
926
+ return new Promise(function (resolve, reject) {
927
+ var mBindingParameters = mParameters.mBindingParameters;
928
+ var bGrouped = mParameters.bGrouped;
929
+ var bReturnAsArray = mParameters.bReturnAsArray;
930
+ var bGetBoundContext = mParameters.bGetBoundContext;
931
+ var aActionPromises = [];
932
+ var oActionPromise;
933
+ var i;
934
+ var sGroupId;
935
+
936
+ var fnExecuteAction = function (oAction, index, oSideEffect) {
937
+ setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
938
+
939
+ sGroupId = !bGrouped ? "$auto." + index : oAction.getUpdateGroupId();
940
+ oActionPromise = executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId);
941
+ aActionPromises.push(oActionPromise);
942
+ var oSideEffectsService = oAppComponent.getSideEffectsService(); // trigger actions from side effects
943
+
944
+ if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
945
+ oSideEffect.triggerActions.forEach(function (sTriggerAction) {
946
+ if (sTriggerAction) {
947
+ oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
948
+ }
949
+ });
950
+ } // request side effects for this action
951
+ // as we move the messages request to POST $select we need to be prepared for an empty array
952
+
953
+
954
+ if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
955
+ oSideEffectsService.requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId).then(function () {
956
+ if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
957
+ CommonUtils.setActionEnablement(mParameters.internalModelContext, JSON.parse(mParameters.operationAvailableMap), mParameters.aContexts);
958
+ }
959
+ }).catch(function (oError) {
960
+ Log.error("Error while requesting side effects", oError);
961
+ });
962
+ }
963
+ };
964
+
965
+ var fnExecuteSingleAction = function (oAction, index, oSideEffect) {
966
+ var oPromise = new Promise(function (resolve) {
967
+ var oLocalPromise;
968
+ var aLocalPromise = [];
969
+ setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
970
+
971
+ sGroupId = "apiMode" + index;
972
+ oActionPromise = executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId);
973
+ aActionPromises.push(oActionPromise);
974
+ aLocalPromise.push(oActionPromise);
975
+ var oSideEffectsService = oAppComponent.getSideEffectsService(); // trigger actions from side effects
976
+
977
+ if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
978
+ oSideEffect.triggerActions.forEach(function (sTriggerAction) {
979
+ if (sTriggerAction) {
980
+ oLocalPromise = oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
981
+ aLocalPromise.push(oLocalPromise);
982
+ }
983
+ });
984
+ } // request side effects for this action
985
+ // as we move the messages request to POST $select we need to be prepared for an empty array
986
+
987
+
988
+ if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
989
+ oLocalPromise = oSideEffectsService.requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId);
990
+ aLocalPromise.push(oLocalPromise);
991
+ oLocalPromise.then(function () {
992
+ if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
993
+ CommonUtils.setActionEnablement(mParameters.internalModelContext, JSON.parse(mParameters.operationAvailableMap), mParameters.aContexts);
994
+ }
995
+ }).catch(function (oError) {
996
+ Log.error("Error while requesting side effects", oError);
997
+ });
998
+ }
999
+
1000
+ oModel.submitBatch(sGroupId);
1001
+ Promise.all(aLocalPromise).then(function () {
1002
+ return resolve();
1003
+ }).catch(function () {
1004
+ return resolve();
1005
+ });
1006
+ });
1007
+ return oPromise;
1008
+ };
1009
+
1010
+ function fnExecuteSequentially(aContexts) {
1011
+ // One action and its side effects are completed before the next action is executed
1012
+ (fnOnSubmitted || function noop() {
1013
+ /**/
1014
+ })(aActionPromises);
1015
+
1016
+ function processOneAction(context, i) {
1017
+ oAction = oModel.bindContext(sActionName + "(...)", context, mBindingParameters);
1018
+ return fnExecuteSingleAction(oAction, i, {
1019
+ context: context,
1020
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1021
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1022
+ });
1023
+ }
1024
+
1025
+ var oActionAndSideEffectPromise = Promise.resolve();
1026
+ var j = 0;
1027
+ aContexts.forEach(function (context) {
1028
+ var id = ++j;
1029
+ oActionAndSideEffectPromise = oActionAndSideEffectPromise.then(function () {
1030
+ return processOneAction(context, id);
1031
+ });
1032
+ });
1033
+ oActionAndSideEffectPromise.then(function () {
1034
+ fnHandleResults();
1035
+ }).catch();
1036
+ }
1037
+
1038
+ if (!bGrouped) {
1039
+ // For invocation grouping "isolated", ensure that each action and matching side effects
1040
+ // are processed before the next set is submitted. Workaround until JSON batch is available.
1041
+ // Allow also for List Report.
1042
+ fnExecuteSequentially(aContexts);
1043
+ } else {
1044
+ for (i = 0; i < aContexts.length; i++) {
1045
+ oAction = oModel.bindContext(sActionName + "(...)", aContexts[i], mBindingParameters);
1046
+ fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
1047
+ context: aContexts[i],
1048
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1049
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1050
+ });
1051
+ }
1052
+
1053
+ (fnOnSubmitted || function noop() {
1054
+ /**/
1055
+ })(aActionPromises);
1056
+ fnHandleResults();
1057
+ }
1058
+
1059
+ function fnHandleResults() {
1060
+ Promise.all(aActionPromises.map(fnDifferentiate)).then(function (results) {
1061
+ var aRejectedItems = [];
1062
+ var aResolvedItems = [];
1063
+ var iResultCount;
1064
+
1065
+ for (iResultCount = 0; iResultCount < results.length; iResultCount++) {
1066
+ if (results[iResultCount].status === "rejected") {
1067
+ aRejectedItems.push(results[iResultCount].response);
1068
+ }
1069
+
1070
+ if (results[iResultCount].status === "resolved") {
1071
+ if (bIsCreateAction) {
1072
+ // removed the bActionParametersExist so that create new action can work in both cases - with and without dialog
1073
+ //only used for NewAction
1074
+ results[iResultCount].bConsiderDocumentModified = true;
1075
+ aResolvedItems.push(results[iResultCount]);
1076
+ } else {
1077
+ aResolvedItems.push(results[iResultCount].response);
1078
+ }
1079
+ }
1080
+ }
1081
+
1082
+ if (!results || results && results.length === 0) {
1083
+ reject(true);
1084
+ }
1085
+
1086
+ if (aRejectedItems.length === 0) {
1087
+ if (bReturnAsArray) {
1088
+ resolve(aResolvedItems);
1089
+ } else {
1090
+ // context is given directly without an array so also no array is expected
1091
+ resolve(aResolvedItems[0]);
1092
+ }
1093
+ } else {
1094
+ reject({
1095
+ resolvedItems: aResolvedItems,
1096
+ rejectedItems: aRejectedItems
1097
+ });
1098
+ }
1099
+ }).catch(reject);
1100
+ }
1101
+ }).finally(function () {
1102
+ (fnOnResponse || function noop() {
1103
+ /**/
1104
+ })();
1105
+ });
1106
+ } else {
1107
+ oAction = oModel.bindContext("/" + sActionName + "(...)");
1108
+ setActionParameterDefaultValue();
1109
+ var sGroupId = "actionImport";
1110
+ var oActionPromise = oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters.label, oModel));
1111
+ oModel.submitBatch(sGroupId); // trigger onSubmitted "event"
1112
+
1113
+ (fnOnSubmitted || function noop() {
1114
+ /**/
1115
+ })(oActionPromise);
1116
+ return oActionPromise.finally(function () {
1117
+ (fnOnResponse || function noop() {
1118
+ /**/
1119
+ })();
1120
+ });
1121
+ }
1122
+ }
1123
+
1124
+ function _getPath(oActionContext, sActionName) {
1125
+ var sPath = oActionContext.getPath();
1126
+ sPath = oActionContext.getObject("$IsBound") ? sPath.split("@$ui5.overload")[0] : sPath.split("/0")[0];
1127
+ return sPath.split("/" + sActionName)[0];
1128
+ }
1129
+ /**
1130
+ * Static functions to call OData actions (bound/import) and functions (bound/import)
1131
+ *
1132
+ * @namespace
1133
+ * @alias sap.fe.core.actions.operations
1134
+ * @private
1135
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
1136
+ * @since 1.56.0
1137
+ */
1138
+
1139
+
1140
+ var operations = {
1141
+ callBoundAction: callBoundAction,
1142
+ callActionImport: callActionImport,
1143
+ callBoundFunction: callBoundFunction,
1144
+ callFunctionImport: callFunctionImport,
1145
+ executeDependingOnSelectedContexts: executeDependingOnSelectedContexts
1146
+ };
1147
+ return operations;
1148
+ }, false);
1149
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOlsiQ29uc3RhbnRzIiwiRkVMaWJyYXJ5IiwiSW52b2NhdGlvbkdyb3VwaW5nIiwiQWN0aW9uIiwiTWVzc2FnZUJveCIsImNhbGxCb3VuZEFjdGlvbiIsInNBY3Rpb25OYW1lIiwiY29udGV4dHMiLCJvTW9kZWwiLCJvQXBwQ29tcG9uZW50IiwibVBhcmFtZXRlcnMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiYlJldHVybkFzQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0FjdGlvblBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJvQm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImFDb250ZXh0cyIsImlzQ3JpdGljYWxBY3Rpb24iLCJnZXRJc0FjdGlvbkNyaXRpY2FsIiwiY2FsbEFjdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9BY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0Iiwic0Z1bmN0aW9uUGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiX2V4ZWN1dGVGdW5jdGlvbiIsImNhbGxGdW5jdGlvbkltcG9ydCIsInJlc29sdmUiLCJvRnVuY3Rpb25JbXBvcnQiLCJvRnVuY3Rpb24iLCJzR3JvdXBJZCIsIkVycm9yIiwib0Z1bmN0aW9uUHJvbWlzZSIsImV4ZWN1dGUiLCJzdWJtaXRCYXRjaCIsInRoZW4iLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwiYUFjdGlvblBhcmFtZXRlcnMiLCJhY3Rpb25QYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJmbkRpYWxvZyIsIm9BY3Rpb25Qcm9taXNlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXRhUGF0aCIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJiSXNTYW1lRW50aXR5Iiwib1JldHVyblR5cGUiLCJiU3RhdGljQWN0aW9uIiwicHJlcGFyZUFjdGlvblBhcmFtZXRlcnMiLCJjb25maXJtQ3JpdGljYWxBY3Rpb24iLCJmbk9uU3VibWl0dGVkIiwib25TdWJtaXR0ZWQiLCJmbk9uUmVzcG9uc2UiLCJvblJlc3BvbnNlIiwiYWN0aW9uTmFtZSIsIm1vZGVsIiwiYkdldEJvdW5kQ29udGV4dCIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImFkZGl0aW9uYWxTaWRlRWZmZWN0IiwicGF0aEV4cHJlc3Npb25zIiwiZmluZEluZGV4IiwiZXhwIiwiJGlzQ29sbGVjdGlvbiIsImdldE1vZGVsIiwiJFR5cGUiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCIkc2VsZWN0Iiwic3BsaXQiLCJpbmRleE9mIiwidHJpZ2dlckFjdGlvbnMiLCJzcGxpY2UiLCJiR3JvdXBlZCIsImludm9jYXRpb25Hcm91cGluZyIsIkNoYW5nZVNldCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYk9iamVjdFBhZ2UiLCJjb250cm9sSWQiLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJlbnRpdHlTZXROYW1lIiwibWVzc2FnZUhhbmRsZXIiLCJfZXhlY3V0ZUFjdGlvbiIsIm9PcGVyYXRpb25SZXN1bHQiLCJzZWxlY3RlZENvbnRleHQiLCJmaWx0ZXIiLCJvQ29udGV4dCIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwiaXNBIiwiQ29tbW9uVXRpbHMiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiY2F0Y2giLCJvQWN0aW9uQ29udGV4dCIsIm9QYXJlbnRDb250cm9sIiwiYm91bmRBY3Rpb25OYW1lIiwic3VmZml4UmVzb3VyY2VLZXkiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRDb250cm9sbGVyIiwic0NvbmZpcm1hdGlvblRleHQiLCJnZXRUcmFuc2xhdGVkVGV4dCIsImNvbmZpcm0iLCJvbkNsb3NlIiwic0FjdGlvbiIsIk9LIiwib09wZXJhdGlvbiIsIm9FcnJvciIsInNob3dNZXNzYWdlRGlhbG9nIiwic1BhdGgiLCJfZ2V0UGF0aCIsIm1ldGFNb2RlbCIsImVudGl0eVNldENvbnRleHQiLCJzQWN0aW9uTmFtZVBhdGgiLCJhY3Rpb25OYW1lQ29udGV4dCIsInNGcmFnbWVudE5hbWUiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsIm9QYXJhbWV0ZXJNb2RlbCIsIkpTT05Nb2RlbCIsIiRkaXNwbGF5TW9kZSIsImFGaWVsZEludmFsaWQiLCJhRm9ybUVsZW1lbnRzIiwibUZpZWxkVmFsdWVNYXAiLCJ2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyIsImFsbCIsIm9Gb3JtRWxlbWVudCIsIm9GaWVsZCIsImdldEZpZWxkcyIsImdldFJlcXVpcmVkIiwiZ2V0VmFsdWVTdGF0ZSIsIm1hcCIsInZhbHVlIiwiZ2V0SXRlbXMiLCJnZXRWYWx1ZSIsInVuZGVmaW5lZCIsImdldExhYmVsIiwiZ2V0VGV4dCIsImFSZXN1bHRzIiwicmVzdWx0IiwiX3ZhbGlkYXRlTWVzc2FnZXMiLCJiQ2xlYXJUYXJnZXQiLCJvTWVzc2FnZU1hbmFnZXIiLCJDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJhTWVzc2FnZXMiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZm9yRWFjaCIsIm9BY3Rpb25QYXJhbWV0ZXJzIiwic1BhcmFtZXRlciIsIiROYW1lIiwib01lc3NhZ2UiLCJzUGFyYW0iLCJyZXBsYWNlIiwiY29udHJvbElkcyIsImdldENvbnRyb2xJZCIsImluY2x1ZGVzIiwicmVtb3ZlTWVzc2FnZXMiLCJwdXNoIiwidGFyZ2V0Iiwib0NvbnRyb2xsZXIiLCJoYW5kbGVDaGFuZ2UiLCJvRXZlbnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRTb3VyY2UiLCJzRmllbGRJZCIsImdldFBhcmFtZXRlciIsIm9GaWVsZFByb21pc2UiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwibmFtZSIsImJpbmRpbmdDb250ZXh0cyIsImFjdGlvbiIsImVudGl0eVNldCIsIm1vZGVscyIsImFGdW5jdGlvblBhcmFtcyIsIm9PcGVyYXRpb25CaW5kaW5nIiwic2V0VXNlckRlZmF1bHRzIiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJvRGlhbG9nQ29udGVudCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsImNvbnRlbnQiLCJlc2NhcGVIYW5kbGVyIiwiY2xvc2UiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsImdlbmVyYXRlIiwidGV4dCIsInR5cGUiLCJwcmVzcyIsImFFbXB0eU1hbmRhdG9yeUZpZWxkcyIsIm9NZXNzYWdlcyIsImkiLCJjb2RlIiwiY3VzdG9tTWVzc2FnZXMiLCJtZXNzYWdlSGFuZGxpbmciLCJzaG93VW5ib3VuZE1lc3NhZ2VzIiwiQnVzeUxvY2tlciIsImxvY2siLCJPYmplY3QiLCJrZXlzIiwic0tleSIsInZQYXJhbWV0ZXJWYWx1ZSIsIm9QYXJhbWV0ZXJDb250ZXh0IiwiZ2V0UGFyYW1ldGVyQ29udGV4dCIsImFNVkZDb250ZW50IiwiZ2V0UHJvcGVydHkiLCJhS2V5VmFsdWVzIiwiaiIsIktleSIsIm1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJjb25jYXQiLCJzdWJ0aXRsZUNvbHVtbiIsImdldE1lc3NhZ2VDb2x1bW4iLCJlcnJvckNvbnRleHQiLCJlcnJvclRhcmdldHNJbkFQTSIsIm1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0cyIsImdldFRhcmdldHMiLCJmaW5kIiwiZ2V0VGFyZ2V0IiwiYWRkaXRpb25hbFRleHQiLCJiSGFzRXRhZ01lc3NhZ2UiLCJtb2RpZnlFVGFnTWVzc2FnZXNPbmx5Iiwic2hvd01lc3NhZ2VzIiwiaXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2dPcGVuIiwiaXNPcGVuIiwibWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2siLCJmaW5hbGx5IiwidW5sb2NrIiwiZW5kQnV0dG9uIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiYmVmb3JlT3BlbiIsIm9DbG9uZUV2ZW50IiwiYXNzaWduIiwiZ2V0RGVmYXVsdFZhbHVlc0Z1bmN0aW9uIiwic0RlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsImZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nIiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJzQm91bmRGdW5jdGlvbk5hbWUiLCJwcmVmaWxsUGFyYW1ldGVyIiwic1BhcmFtTmFtZSIsInZQYXJhbURlZmF1bHRWYWx1ZSIsIiRQYXRoIiwib1Byb21pc2UiLCJyZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkiLCJvVmFsdWUiLCJyZXF1ZXN0UHJvcGVydHkiLCJ2UGFyYW1WYWx1ZSIsInNQYXRoRm9yQ29udGV4dCIsInBhcmFtTmFtZSIsImJOb1Bvc3NpYmxlVmFsdWUiLCJMb2ciLCJlcnJvciIsImJMYXRlUHJvcGVydHlFcnJvciIsIm9EYXRhIiwiZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwic0FjdGlvblBhcmFtZXRlckFubm90YXRpb25UYXJnZXQiLCJvUGFyYW1ldGVyQW5ub3RhdGlvbnMiLCJvUGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwiYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSIsInZQYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJhUHJlZmlsbFBhcmFtUHJvbWlzZXMiLCJhRXhlY0Z1bmN0aW9uUHJvbWlzZXMiLCJvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZSIsInNNb2R1bGUiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsIkZQTUhlbHBlciIsImFjdGlvbldyYXBwZXIiLCJhUHJvbWlzZXMiLCJvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QiLCJzRGlhbG9nUGFyYW1OYW1lIiwiaGFzT3duUHJvcGVydHkiLCJzZXRQYXJhbWV0ZXIiLCJiRXJyb3JGb3VuZCIsInNvbWUiLCJzVGV4dCIsIndhcm5pbmciLCJjb250ZW50V2lkdGgiLCJhUGFyYW1ldGVycyIsInJlcXVlc3RPYmplY3QiLCJvQ29udGV4dE9iamVjdCIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZ2V0QWdncmVnYXRpb24iLCJzZXRNb2RlbCIsImJpbmRFbGVtZW50IiwicGF0aCIsIm9NVkZNb2RlbCIsImFkZERlcGVuZGVudCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0QmluZGluZyIsIm9wZW4iLCJhUHJlZGVmaW5lZFBhcmFtZXRlcnMiLCJnZXRBY3Rpb25QYXJhbWV0ZXJzIiwic2xpY2UiLCJ2QWN0aW9uQ3JpdGljYWwiLCJzQ3JpdGljYWxQYXRoIiwiYUJpbmRpbmdQYXJhbXMiLCJhUGF0aHMiLCJiQ29uZGl0aW9uIiwib1BhcmFtcyIsImluZGV4Iiwiam9pbiIsImV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJmbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQiLCJiaW5kIiwib3BlcmF0aW9ucyIsImlFeGlzdGluZ01lc3NhZ2VzIiwiZm5EaWZmZXJlbnRpYXRlIiwicHJvbWlzZSIsInJlc3BvbnNlIiwic3RhdHVzIiwic2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwiYUFjdGlvblByb21pc2VzIiwiZm5FeGVjdXRlQWN0aW9uIiwib1NpZGVFZmZlY3QiLCJnZXRVcGRhdGVHcm91cElkIiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInNUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImZuRXhlY3V0ZVNpbmdsZUFjdGlvbiIsIm9Mb2NhbFByb21pc2UiLCJhTG9jYWxQcm9taXNlIiwiZm5FeGVjdXRlU2VxdWVudGlhbGx5Iiwibm9vcCIsInByb2Nlc3NPbmVBY3Rpb24iLCJvQWN0aW9uQW5kU2lkZUVmZmVjdFByb21pc2UiLCJpZCIsImZuSGFuZGxlUmVzdWx0cyIsInJlc3VsdHMiLCJhUmVqZWN0ZWRJdGVtcyIsImFSZXNvbHZlZEl0ZW1zIiwiaVJlc3VsdENvdW50IiwiYkNvbnNpZGVyRG9jdW1lbnRNb2RpZmllZCIsInJlc29sdmVkSXRlbXMiLCJyZWplY3RlZEl0ZW1zIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7QUFlQSxNQUFNQSxTQUFTLEdBQUdDLFNBQVMsQ0FBQ0QsU0FBNUI7QUFBQSxNQUNDRSxrQkFBa0IsR0FBR0QsU0FBUyxDQUFDQyxrQkFEaEM7QUFFQSxNQUFNQyxNQUFNLEdBQUlDLFVBQUQsQ0FBb0JELE1BQW5DO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxXQUFTRSxlQUFULENBQXlCQyxXQUF6QixFQUE4Q0MsUUFBOUMsRUFBNkRDLE1BQTdELEVBQTBFQyxhQUExRSxFQUFpR0MsV0FBakcsRUFBbUg7QUFDbEgsUUFBSSxDQUFDSCxRQUFELElBQWFBLFFBQVEsQ0FBQ0ksTUFBVCxLQUFvQixDQUFyQyxFQUF3QztBQUN2QztBQUNBLGFBQU9DLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLG9EQUFmLENBQVA7QUFDQSxLQUppSCxDQUtsSDs7O0FBQ0EsUUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNSLFFBQWQsQ0FBSixFQUE2QjtBQUM1QkcsTUFBQUEsV0FBVyxDQUFDTSxjQUFaLEdBQTZCLElBQTdCO0FBQ0EsS0FGRCxNQUVPO0FBQ047QUFDQVQsTUFBQUEsUUFBUSxHQUFHLENBQUNBLFFBQUQsQ0FBWDtBQUNBOztBQUNELFFBQU1VLFVBQVUsR0FBR1QsTUFBTSxDQUFDVSxZQUFQLEVBQW5CO0FBQUEs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NkcsSUFBQUEsS0FBSyxHQUFHZixjQUFjLENBQUNwRixTQUFmLENBQXlCLFVBQXpCLElBQXVDbUcsS0FBSyxDQUFDNUMsS0FBTixDQUFZLGdCQUFaLEVBQThCLENBQTlCLENBQXZDLEdBQTBFNEMsS0FBSyxDQUFDNUMsS0FBTixDQUFZLElBQVosRUFBa0IsQ0FBbEIsQ0FBbEY7QUFDQSxXQUFPNEMsS0FBSyxDQUFDNUMsS0FBTixDQUFZLE1BQU1oRixXQUFsQixFQUErQixDQUEvQixDQUFQO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLE1BQU00VSxVQUFVLEdBQUc7QUFDbEI3VSxJQUFBQSxlQUFlLEVBQUVBLGVBREM7QUFFbEJ1QixJQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBRkE7QUFHbEJJLElBQUFBLGlCQUFpQixFQUFFQSxpQkFIRDtBQUlsQk0sSUFBQUEsa0JBQWtCLEVBQUVBLGtCQUpGO0FBS2xCd1MsSUFBQUEsa0NBQWtDLEVBQUVBO0FBTGxCLEdBQW5CO1NBUWVJLFUiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHRJbnZvY2F0aW9uR3JvdXBpbmcgPSBGRUxpYnJhcnkuSW52b2NhdGlvbkdyb3VwaW5nO1xuY29uc3QgQWN0aW9uID0gKE1lc3NhZ2VCb3ggYXMgYW55KS5BY3Rpb247XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBhY3Rpb24gZm9yIG9uZSBvciBtdWx0aXBsZSBjb250ZXh0cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsQm91bmRBY3Rpb25cbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gY29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgYmUgY2FsbGVkXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Nb2RlbH0gb01vZGVsIE9EYXRhIE1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzXSBBIG1hcCBvZiBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgZm9yIGV2ZXJ5IGFjdGlvbiBjYWxsXG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVyc10gQSBtYXAgb2YgYmluZGluZyBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgcGFydCBvZiAkc2VsZWN0IGFuZCAkZXhwYW5kIGNvbWluZyBmcm9tIHNpZGUgZWZmZWN0cyBmb3IgYm91bmQgYWN0aW9uc1xuICogQHBhcmFtIHtBcnJheX0gW21QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0XSBBcnJheSBvZiBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgaW4gYWRkaXRpb24gdG8gYWN0dWFsIHRhcmdldCBwcm9wZXJ0aWVzIG9mIHRoZSBzaWRlIGVmZmVjdFxuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogQ2hhbmdlc2V0IHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgSXNvbGF0ZWQgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzLCBkZWZhdWx0cyB0byBJc29sYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW21QYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcGFyYW0ge3NhcC51aS5jb3JlLkVsZW1lbnR9IFttUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXSBJZiBzcGVjaWZpZWQgdGhlIGRpYWxvZ3MgYXJlIGFkZGVkIGFzIGRlcGVuZGVudCBvZiB0aGUgcGFyZW50IGNvbnRyb2xcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBjYWxsQm91bmRBY3Rpb24oc0FjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dHM6IGFueSwgb01vZGVsOiBhbnksIG9BcHBDb21wb25lbnQ6IG9iamVjdCwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAoIWNvbnRleHRzIHx8IGNvbnRleHRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vSW4gRnJlZXN0eWxlIGFwcHMgYm91bmQgYWN0aW9ucyBjYW4gaGF2ZSBubyBjb250ZXh0XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQm91bmQgYWN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbnRleHRcIik7XG5cdH1cblx0Ly8gd2UgZXhwZWN0IGVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0c1xuXHRpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0cykpIHtcblx0XHRtUGFyYW1ldGVycy5iUmV0dXJuQXNBcnJheSA9IHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly9hY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIG9uIHRoaXMgY29udGV4dCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZyBzbyBVSSBmaWVsZHMgYXJlIHVwZGF0ZWQgd2l0aCByZXNwb25zZSBkYXRhXG5cdFx0Y29udGV4dHMgPSBbY29udGV4dHNdO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0FjdGlvblBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHRzWzBdLmdldFBhdGgoKSkgKyBcIi9cIiArIHNBY3Rpb25OYW1lLFxuXHRcdG9Cb3VuZEFjdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvblBhdGggKyBcIi9AJHVpNS5vdmVybG9hZC8wXCIpO1xuXHRtUGFyYW1ldGVycy5hQ29udGV4dHMgPSBjb250ZXh0cztcblx0bVBhcmFtZXRlcnMuaXNDcml0aWNhbEFjdGlvbiA9IGdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGgsIGNvbnRleHRzLCBvQm91bmRBY3Rpb24pO1xuXHRyZXR1cm4gY2FsbEFjdGlvbihzQWN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRBY3Rpb24sIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcbn1cbi8qKlxuICogQ2FsbHMgYW4gYWN0aW9uIGltcG9ydC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBpbXBvcnQgdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgQW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgdjQgbW9kZWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzLmFjdGlvblBhcmFtZXRlcnNdIEEgbWFwIG9mIHBhcmFtZXRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSBhY3Rpb24gaW1wb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXSBJZiBzZXQgYW5kIGlmIHBhcmFtZXRlcnMgZXhpc3QgdGhlIHVzZXIgcmV0cmlldmVzIGEgZGlhbG9nIHRvIGZpbGwgaW4gcGFyYW1ldGVycywgaWYgYWN0aW9uUGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZXkgYXJlIHNob3duIHRvIHRoZSB1c2VyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbbVBhcmFtZXRlcnMub25TdWJtaXR0ZWRdIEZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBvbmNlIHRoZSBhY3Rpb25zIGFyZSBzdWJtaXR0ZWQgd2l0aCBhbiBhcnJheSBvZiBwcm9taXNlc1xuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IGFueSwgb0FwcENvbXBvbmVudDogb2JqZWN0LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdGlmICghb01vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQWN0aW9uIGV4cGVjdHMgYSBtb2RlbC9jb250ZXh0IGZvciBleGVjdXRpb25cIik7XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzQWN0aW9uUGF0aCA9IG9Nb2RlbC5iaW5kQ29udGV4dChcIi9cIiArIHNBY3Rpb25OYW1lKS5nZXRQYXRoKCksXG5cdFx0b0FjdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIgKyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBY3Rpb25QYXRoKS5nZXRPYmplY3QoXCIkQWN0aW9uXCIpICsgXCIvMFwiKTtcblx0bVBhcmFtZXRlcnMuaXNDcml0aWNhbEFjdGlvbiA9IGdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGggKyBcIi9AJHVpNS5vdmVybG9hZFwiKTtcblx0cmV0dXJuIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0FjdGlvbkltcG9ydCwgb0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpO1xufVxuZnVuY3Rpb24gY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBhbnksIG9Nb2RlbDogYW55KSB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpICsgXCIvXCIgKyBzRnVuY3Rpb25OYW1lLFxuXHRcdG9Cb3VuZEZ1bmN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKTtcblx0cmV0dXJuIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRGdW5jdGlvbiwgY29udGV4dCk7XG59XG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zLmNhbGxGdW5jdGlvbkltcG9ydFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIHY0IG1vZGVsXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2FsbEZ1bmN0aW9uSW1wb3J0KHNGdW5jdGlvbk5hbWU6IHN0cmluZywgb01vZGVsOiBhbnkpIHtcblx0aWYgKCFzRnVuY3Rpb25OYW1lKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IG9Nb2RlbC5iaW5kQ29udGV4dChcIi9cIiArIHNGdW5jdGlvbk5hbWUpLmdldFBhdGgoKSxcblx0XHRvRnVuY3Rpb25JbXBvcnQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFxuXHRcdFx0XCIvXCIgKyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdW5jdGlvblBhdGgpLmdldE9iamVjdChcIiRGdW5jdGlvblwiKSArIFwiLzBcIlxuXHRcdCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0Z1bmN0aW9uSW1wb3J0KTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogYW55LCBvTW9kZWw6IGFueSwgb0Z1bmN0aW9uOiBhbnksIGNvbnRleHQ/OiBhbnkpIHtcblx0bGV0IHNHcm91cElkO1xuXHRpZiAoIW9GdW5jdGlvbiB8fCAhb0Z1bmN0aW9uLmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZ1bmN0aW9uIFwiICsgc0Z1bmN0aW9uTmFtZSArIFwiIG5vdCBmb3VuZFwiKSk7XG5cdH1cblx0aWYgKGNvbnRleHQpIHtcblx0XHRvRnVuY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoc0Z1bmN0aW9uTmFtZSArIFwiKC4uLilcIiwgY29udGV4dCk7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uR3JvdXBcIjtcblx0fSBlbHNlIHtcblx0XHRvRnVuY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoXCIvXCIgKyBzRnVuY3Rpb25OYW1lICsgXCIoLi4uKVwiKTtcblx0XHRzR3JvdXBJZCA9IFwiZnVuY3Rpb25JbXBvcnRcIjtcblx0fVxuXHRjb25zdCBvRnVuY3Rpb25Qcm9taXNlID0gb0Z1bmN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRyZXR1cm4gb0Z1bmN0aW9uUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gb0Z1bmN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHR9KTtcbn1cbmZ1bmN0aW9uIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWU6IGFueSwgb01vZGVsOiBhbnksIG9BY3Rpb246IGFueSwgb0FwcENvbXBvbmVudDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdGxldCBhQWN0aW9uUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmFjdGlvblBhcmFtZXRlcnMgfHwgW107XG5cdFx0bGV0IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBhbnkgPSB7fTtcblx0XHRsZXQgZm5EaWFsb2c7XG5cdFx0bGV0IG9BY3Rpb25Qcm9taXNlO1xuXHRcdGNvbnN0IHNBY3Rpb25MYWJlbCA9IG1QYXJhbWV0ZXJzLmxhYmVsO1xuXHRcdGxldCBiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyA9IG1QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c7XG5cdFx0Y29uc3QgYUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzO1xuXHRcdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0XHRjb25zdCBiSXNDcml0aWNhbEFjdGlvbiA9IG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb247XG5cdFx0bGV0IG9NZXRhTW9kZWw7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDogYW55O1xuXHRcdGxldCBpTWVzc2FnZVNpZGVFZmZlY3Q7XG5cdFx0bGV0IGJJc1NhbWVFbnRpdHk7XG5cdFx0bGV0IG9SZXR1cm5UeXBlO1xuXHRcdGxldCBiU3RhdGljQWN0aW9uO1xuXHRcdGlmICghb0FjdGlvbiB8fCAhb0FjdGlvbi5nZXRPYmplY3QoKSkge1xuXHRcdFx0cmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJBY3Rpb24gXCIgKyBzQWN0aW9uTmFtZSArIFwiIG5vdCBmb3VuZFwiKSk7XG5cdFx0fVxuXHRcdGlmIChiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyB8fCBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhQWN0aW9uUGFyYW1ldGVycyA9IHByZXBhcmVBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb24sIGFBY3Rpb25QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghYUFjdGlvblBhcmFtZXRlcnMgfHwgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGJTaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0Zm5EaWFsb2cgPSBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdH0gZWxzZSBpZiAoYklzQ3JpdGljYWxBY3Rpb24pIHtcblx0XHRcdGZuRGlhbG9nID0gY29uZmlybUNyaXRpY2FsQWN0aW9uO1xuXHRcdH1cblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdGZuT25TdWJtaXR0ZWQ6IG1QYXJhbWV0ZXJzLm9uU3VibWl0dGVkLFxuXHRcdFx0Zm5PblJlc3BvbnNlOiBtUGFyYW1ldGVycy5vblJlc3BvbnNlLFxuXHRcdFx0YWN0aW9uTmFtZTogc0FjdGlvbk5hbWUsXG5cdFx0XHRtb2RlbDogb01vZGVsLFxuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnM6IGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLFxuXHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0fTtcblx0XHRpZiAob0FjdGlvbi5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucykge1xuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGFDb250ZXh0c1swXS5nZXRQYXRoKCkpO1xuXHRcdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcblxuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdGlNZXNzYWdlU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5maW5kSW5kZXgoZnVuY3Rpb24gKGV4cDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHlwZW9mIGV4cCA9PT0gXCJzdHJpbmdcIiAmJiBleHAgPT09IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQvLyBBZGQgU0FQX01lc3NhZ2VzIGJ5IGRlZmF1bHQgaWYgbm90IGFubm90YXRlZCBieSBzaWRlIGVmZmVjdHMsIGFjdGlvbiBkb2VzIG5vdCByZXR1cm4gYSBjb2xsZWN0aW9uIGFuZFxuXHRcdFx0XHRcdC8vIHRoZSByZXR1cm4gdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUgYm91bmQgdHlwZVxuXHRcdFx0XHRcdG9SZXR1cm5UeXBlID0gb0FjdGlvbi5nZXRPYmplY3QoXCIkUmV0dXJuVHlwZVwiKTtcblx0XHRcdFx0XHRiSXNTYW1lRW50aXR5ID1cblx0XHRcdFx0XHRcdG9SZXR1cm5UeXBlICYmICFvUmV0dXJuVHlwZS4kaXNDb2xsZWN0aW9uICYmIG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRPYmplY3Qoc01ldGFQYXRoKS4kVHlwZSA9PT0gb1JldHVyblR5cGUuJFR5cGU7XG5cblx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEgfHwgYklzU2FtZUVudGl0eSkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIG1lc3NhZ2UgcGF0aCBpcyBhbm5vdGF0ZWQgYXMgc2lkZSBlZmZlY3QuIEFzIHRoZXJlJ3Mgbm8gYmluZGluZyBmb3IgaXQgYW5kIHRoZSBtb2RlbCBkb2VzIGN1cnJlbnRseSBub3QgYWxsb3dcblx0XHRcdFx0XHRcdC8vIHRvIGFkZCBpdCBhdCBhIGxhdGVyIHBvaW50IG9mIHRpbWUgd2UgaGF2ZSB0byB0YWtlIGNhcmUgaXQncyBwYXJ0IG9mIHRoZSAkc2VsZWN0IG9mIHRoZSBQT1NULCB0aGVyZWZvcmUgbW92aW5nIGl0LlxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFJldHVyblR5cGUvJFR5cGUvXCIgKyBzTWVzc2FnZXNQYXRoKSAmJlxuXHRcdFx0XHRcdFx0XHQoIW1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0IHx8XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3Quc3BsaXQoXCIsXCIpLmluZGV4T2Yoc01lc3NhZ2VzUGF0aCkgPT09IC0xKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3Rcblx0XHRcdFx0XHRcdFx0XHQ/IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ICsgXCIsXCIgKyBzTWVzc2FnZXNQYXRoXG5cdFx0XHRcdFx0XHRcdFx0OiBzTWVzc2FnZXNQYXRoO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5sZW5ndGggPT09IDAgJiYgaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBubyB0cmlnZ2VyIGFjdGlvbiB0aGVyZWZvcmUgbm8gbmVlZCB0byByZXF1ZXN0IG1lc3NhZ2VzIGFnYWluXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLnNwbGljZShpTWVzc2FnZVNpZGVFZmZlY3QsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFDb250ZXh0cztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iR3JvdXBlZCA9IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyA9PT0gSW52b2NhdGlvbkdyb3VwaW5nLkNoYW5nZVNldDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiSXNDcmVhdGVBY3Rpb24pIHtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbiA9IGJJc0NyZWF0ZUFjdGlvbjtcblx0XHR9XG5cdFx0aWYgKGZuRGlhbG9nKSB7XG5cdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGZuRGlhbG9nKFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0c0FjdGlvbkxhYmVsLFxuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdG9BY3Rpb24sXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvQWN0aW9uUHJvbWlzZSA9IF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQsIG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9BY3Rpb25Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob09wZXJhdGlvblJlc3VsdDogYW55KSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCAmJlxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJlxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyAmJlxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cy5sZW5ndGhcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWRDb250ZXh0ID0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzLmZpbHRlcigob0NvbnRleHQ6IENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gIWJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKHNlbGVjdGVkQ29udGV4dCAmJiBzZWxlY3RlZENvbnRleHQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRDb21tb25VdGlscy5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHNcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc29sdmUob09wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvT3BlcmF0aW9uUmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0cmVqZWN0KG9PcGVyYXRpb25SZXN1bHQpO1xuXHRcdFx0fSk7XG5cdH0pO1xufVxuZnVuY3Rpb24gY29uZmlybUNyaXRpY2FsQWN0aW9uKFxuXHRzQWN0aW9uTmFtZTogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBhbnksXG5cdHNBY3Rpb25MYWJlbDogYW55LFxuXHRtUGFyYW1ldGVyczogYW55LFxuXHRhQWN0aW9uUGFyYW1ldGVyczogYW55LFxuXHRvQWN0aW9uQ29udGV4dDogYW55LFxuXHRvUGFyZW50Q29udHJvbDogYW55LFxuXHRlbnRpdHlTZXROYW1lOiBhbnksXG5cdG1lc3NhZ2VIYW5kbGVyOiBhbnlcbikge1xuXHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGxldCBib3VuZEFjdGlvbk5hbWUgPSBzQWN0aW9uTmFtZSA/IHNBY3Rpb25OYW1lIDogbnVsbDtcblx0XHRib3VuZEFjdGlvbk5hbWUgPVxuXHRcdFx0Ym91bmRBY3Rpb25OYW1lLmluZGV4T2YoXCIuXCIpID49IDAgPyBib3VuZEFjdGlvbk5hbWUuc3BsaXQoXCIuXCIpW2JvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIikubGVuZ3RoIC0gMV0gOiBib3VuZEFjdGlvbk5hbWU7XG5cdFx0Y29uc3Qgc3VmZml4UmVzb3VyY2VLZXkgPSBib3VuZEFjdGlvbk5hbWUgJiYgZW50aXR5U2V0TmFtZSA/IGVudGl0eVNldE5hbWUgKyBcInxcIiArIGJvdW5kQWN0aW9uTmFtZSA6IFwiXCI7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZTtcblx0XHRjb25zdCBzQ29uZmlybWF0aW9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XCJDX09QRVJBVElPTlNfQUNUSU9OX0NPTkZJUk1fTUVTU0FHRVwiLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0bnVsbCxcblx0XHRcdHN1ZmZpeFJlc291cmNlS2V5XG5cdFx0KTtcblxuXHRcdE1lc3NhZ2VCb3guY29uZmlybShzQ29uZmlybWF0aW9uVGV4dCwge1xuXHRcdFx0b25DbG9zZTogZnVuY3Rpb24gKHNBY3Rpb246IGFueSkge1xuXHRcdFx0XHRpZiAoc0FjdGlvbiA9PT0gQWN0aW9uLk9LKSB7XG5cdFx0XHRcdFx0cmV0dXJuIF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9PcGVyYXRpb246IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb24pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHRcdFx0XHQuc2hvd01lc3NhZ2VEaWFsb2coKVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuZnVuY3Rpb24gc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyhcblx0c0FjdGlvbk5hbWU6IGFueSxcblx0b0FwcENvbXBvbmVudDogYW55LFxuXHRzQWN0aW9uTGFiZWw6IGFueSxcblx0bVBhcmFtZXRlcnM6IGFueSxcblx0YUFjdGlvblBhcmFtZXRlcnM6IGFueSxcblx0b0FjdGlvbkNvbnRleHQ6IGFueSxcblx0b1BhcmVudENvbnRyb2w6IGFueSxcblx0ZW50aXR5U2V0TmFtZTogYW55LFxuXHRtZXNzYWdlSGFuZGxlcjogYW55XG4pIHtcblx0Y29uc3Qgc1BhdGggPSBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dCwgc0FjdGlvbk5hbWUpLFxuXHRcdG1ldGFNb2RlbCA9IG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCkub01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdGVudGl0eVNldENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdHNBY3Rpb25OYW1lUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpXG5cdFx0XHQ/IG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi9AJHVpNS5vdmVybG9hZC8wXCIpWzBdXG5cdFx0XHQ6IG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi8wXCIpWzBdLFxuXHRcdGFjdGlvbk5hbWVDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBY3Rpb25OYW1lUGF0aCksXG5cdFx0c0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQWN0aW9uUGFyYW1ldGVyRGlhbG9nXCI7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdGNvbnN0IG9QYXJhbWV0ZXJNb2RlbCA9IG5ldyBKU09OTW9kZWwoe1xuXHRcdFx0JGRpc3BsYXlNb2RlOiB7fVxuXHRcdH0pO1xuXHRcdGxldCBhRmllbGRJbnZhbGlkOiBhbnlbXSA9IFtdO1xuXHRcdGxldCBhRm9ybUVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG1GaWVsZFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRjb25zdCB2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0YUZvcm1FbGVtZW50c1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Gb3JtRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRmllbGQgPSBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF07XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFJlcXVpcmVkKCkgJiYgb0ZpZWxkLmdldFZhbHVlU3RhdGUoKSAhPT0gXCJFcnJvclwiO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Lm1hcChmdW5jdGlvbiAob0Zvcm1FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gb0Zvcm1FbGVtZW50LmdldEZpZWxkcygpWzBdLmlzQShcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpXG5cdFx0XHRcdFx0XHRcdD8gb0Zvcm1FbGVtZW50LmdldEZpZWxkcygpWzBdLmdldEl0ZW1zKClcblx0XHRcdFx0XHRcdFx0OiBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0Zvcm1FbGVtZW50LmdldExhYmVsKCkuZ2V0VGV4dCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHQpLnRoZW4oZnVuY3Rpb24gKGFSZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRhUmVzdWx0cyA9IGFSZXN1bHRzLmZpbHRlcihmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0ICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gYVJlc3VsdHM7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IF92YWxpZGF0ZU1lc3NhZ2VzID0gZnVuY3Rpb24gKGFBY3Rpb25QYXJhbWV0ZXJzOiBhbnksIGFGaWVsZEludmFsaWQ6IGFueSwgYkNsZWFyVGFyZ2V0PzogYm9vbGVhbikge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblxuXHRcdFx0YUZpZWxkSW52YWxpZCA9IGFGaWVsZEludmFsaWQgfHwgW107XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRhRmllbGRJbnZhbGlkID0gW107XG5cdFx0XHR9XG5cdFx0XHRhQWN0aW9uUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvQWN0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRcdGNvbnN0IHNQYXJhbWV0ZXIgPSBvQWN0aW9uUGFyYW1ldGVycy4kTmFtZTtcblx0XHRcdFx0YU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBzUGFyYW0gPSBzUGFyYW1ldGVyLnJlcGxhY2UoXCItaW5uZXJcIiwgXCJcIik7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2UuY29udHJvbElkcy5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHQob01lc3NhZ2UuZ2V0Q29udHJvbElkKCkuaW5jbHVkZXMoXCJBUERfOjpcIiArIHNQYXJhbWV0ZXIpIHx8XG5cdFx0XHRcdFx0XHRcdChvTWVzc2FnZS5nZXRDb250cm9sSWQoKS5pbmNsdWRlcyhcIkFQRF86OlwiICsgc1BhcmFtZXRlciArIFwiaW5uZXJcIikgJiZcblx0XHRcdFx0XHRcdFx0XHRhRmllbGRJbnZhbGlkLmluZGV4T2YoXCJBUERfOjpcIiArIHNQYXJhbSkgPCAwKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGlmIChiQ2xlYXJUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGFGaWVsZEludmFsaWQucHVzaChcIkFQRF86OlwiICsgc1BhcmFtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gaW5wdXQgd2l0aCBpbnZhbGlkIHRva2VuXG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLnRhcmdldC5pbmNsdWRlcyhcIkFQRF86OlwiICsgc1BhcmFtZXRlcikpIHtcblx0XHRcdFx0XHRcdGFGaWVsZEludmFsaWQucHVzaChcIkFQRF86OlwiICsgc1BhcmFtKTtcblx0XHRcdFx0XHRcdG9NZXNzYWdlLnRhcmdldCA9IGJDbGVhclRhcmdldCA/IFwiXCIgOiBvTWVzc2FnZS50YXJnZXQ7XG5cdFx0XHRcdFx0XHRpZiAoYkNsZWFyVGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFGaWVsZEludmFsaWQ7XG5cdFx0fTtcblx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRjb25zdCBvRmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0XHRcdGlmIChvRmllbGRQcm9taXNlKSB7XG5cdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gb0ZpZWxkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRfdmFsaWRhdGVNZXNzYWdlcyhhQWN0aW9uUGFyYW1ldGVycywgYUZpZWxkSW52YWxpZCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiBvQWN0aW9uQ29udGV4dCxcblx0XHRcdFx0XHRcdGFjdGlvbk5hbWU6IGFjdGlvbk5hbWVDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBlbnRpdHlTZXRDb250ZXh0XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGFjdGlvbjogb0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGFjdGlvbk5hbWU6IGFjdGlvbk5hbWVDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGVudGl0eVNldENvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbDogZW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRcdGxldCBhQ29udGV4dHM6IGFueVtdO1xuXHRcdFx0XHRjb25zdCBhRnVuY3Rpb25QYXJhbXM6IGFueVtdID0gW107XG5cdFx0XHRcdGxldCBvT3BlcmF0aW9uQmluZGluZzogYW55O1xuXHRcdFx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKG9BcHBDb21wb25lbnQsIGFBY3Rpb25QYXJhbWV0ZXJzLCBvUGFyYW1ldGVyTW9kZWwsIHRydWUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pLnRoZW4oZnVuY3Rpb24gKG9EaWFsb2dDb250ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IG9QYXJlbnRDb250cm9sLmdldENvbnRyb2xsZXIoKS5vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh1bmRlZmluZWQsIHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6XG5cdFx0XHRcdFx0XHRcdFx0c0FjdGlvbkxhYmVsIHx8XG5cdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX09QRVJBVElPTlNfQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0XHRcdFx0ZXNjYXBlSGFuZGxlcjogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oZ2VuZXJhdGUoW1wiZmVcIiwgXCJBUERfXCIsIHNBY3Rpb25OYW1lLCBcIkFjdGlvblwiLCBcIk9rXCJdKSwge1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IHNBY3Rpb25MYWJlbCB8fCBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfQ09NTU9OX0RJQUxPR19PS1wiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhRW1wdHlNYW5kYXRvcnlGaWVsZHM6IGFueVtdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFFbXB0eU1hbmRhdG9yeUZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXNzYWdlcyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRW1wdHlNYW5kYXRvcnlGaWVsZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b01lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX09QRVJBVElPTlNfQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfTUlTU0lOR19NQU5EQVRPUllfTVNHXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRW1wdHlNYW5kYXRvcnlGaWVsZHNbaV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvZGU6IDIwMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIkVycm9yXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBvTWVzc2FnZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGaWVsZEludmFsaWQgPSBfdmFsaWRhdGVNZXNzYWdlcyhhQWN0aW9uUGFyYW1ldGVycywgYUZpZWxkSW52YWxpZCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZpZWxkSW52YWxpZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsaW5nLnNob3dVbmJvdW5kTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKG1GaWVsZFZhbHVlTWFwKS5tYXAoZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbUZpZWxkVmFsdWVNYXBbc0tleV07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogZHVlIHRvIHVzaW5nIHRoZSBzZWFyY2ggYW5kIHZhbHVlIGhlbHBzIG9uIHRoZSBhY3Rpb24gZGlhbG9nIHRyYW5zaWVudCBtZXNzYWdlcyBjb3VsZCBhcHBlYXJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gd2UgbmVlZCBhbiBVWCBkZXNpZ24gZm9yIHRob3NlIHRvIHNob3cgdGhlbSB0byB0aGUgdXNlciAtIGZvciBub3cgcmVtb3ZlIHRoZW0gYmVmb3JlIGNvbnRpbnVpbmdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG1vdmUgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIERpYWxvZyAoU2ltcGxlRm9ybSkgdG8gbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVycyBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0aGUgb3BlcmF0aW9uIGJpbmRpbmdzIGZvciBhbGwgY29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHZQYXJhbWV0ZXJWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtZXRlckNvbnRleHQgPSBvT3BlcmF0aW9uQmluZGluZyAmJiBvT3BlcmF0aW9uQmluZGluZy5nZXRQYXJhbWV0ZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQWN0aW9uUGFyYW1ldGVyc1tpXS4kaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhTVZGQ29udGVudCA9IG9EaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZ2V0TW9kZWwoXCJtdmZ2aWV3XCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFByb3BlcnR5KFwiL1wiICsgYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhS2V5VmFsdWVzID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGogaW4gYU1WRkNvbnRlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUtleVZhbHVlcy5wdXNoKGFNVkZDb250ZW50W2pdLktleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyVmFsdWUgPSBhS2V5VmFsdWVzO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyVmFsdWUgPSBvUGFyYW1ldGVyQ29udGV4dC5nZXRQcm9wZXJ0eShhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLnZhbHVlID0gdlBhcmFtZXRlclZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5sYWJlbCA9IHNBY3Rpb25MYWJlbDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvT3BlcmF0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgbWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzID0gbWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCFtUGFyYW1ldGVycy5iR3JvdXBlZCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQhKCFtUGFyYW1ldGVycy5jb250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgJiYgYUNvbnRleHRzLmxlbmd0aCA9PT0gMSkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXMubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG1lc3NhZ2VzID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VidGl0bGVDb2x1bW4gPSBDb21tb25VdGlscy5nZXRNZXNzYWdlQ29sdW1uKG1QYXJhbWV0ZXJzLmNvbnRyb2wpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZXJyb3JDb250ZXh0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZXJyb3JUYXJnZXRzSW5BUE0gPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZVRhcmdldHMgPSBtZXNzYWdlLmdldFRhcmdldHMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobWVzc2FnZVRhcmdldHMgJiYgbWVzc2FnZVRhcmdldHMubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VUYXJnZXRzWzBdLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDb250ZXh0ID0gYUNvbnRleHRzLmZpbmQoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihvQ29udGV4dC5nZXRQYXRoKCkpICE9PSAtMTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGVycm9yQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IGVycm9yQ29udGV4dC5nZXRPYmplY3QoKVtzdWJ0aXRsZUNvbHVtbl1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5nZXRUYXJnZXQoKS5pbmRleE9mKG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWUpICE9PSAtMSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5nZXRUYXJnZXQoKS5pbmRleE9mKG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzWzBdLiROYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVGFyZ2V0c0luQVBNID09PSBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JUYXJnZXRzSW5BUE0gPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gbWVzc2FnZUhhbmRsaW5nLm1vZGlmeUVUYWdNZXNzYWdlc09ubHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ykhhc0V0YWdNZXNzYWdlOiBiSGFzRXRhZ01lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dDogbVBhcmFtZXRlcnMuYUNvbnRleHRzWzBdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nT3Blbjogb0RpYWxvZy5pc09wZW4oKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjazogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JUYXJnZXRzSW5BUE06IGVycm9yVGFyZ2V0c0luQVBNXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZyAmJiBiSGFzRXRhZ01lc3NhZ2UgJiYgb0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTsgLy9jbG9zZSB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgYWZ0ZXIgcmVmcmVzaCBvZiB0aGUgY29udGV4dCBhZnRlciBldGFnIG1pc21hdGNoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbihnZW5lcmF0ZShbXCJmZVwiLCBcIkFQRF9cIiwgc0FjdGlvbk5hbWUsIFwiQWN0aW9uXCIsIFwiQ2FuY2VsXCJdKSwge1xuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfQ0FOQ0VMXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGJlZm9yZU9wZW46IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGNsb25lIGV2ZW50IGZvciBhY3Rpb25XcmFwcGVyIGFzIG9FdmVudC5vU291cmNlIGdldHMgbG9zdCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBiZWZvcmVPcGVuIGV2ZW50IGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ2xvbmVFdmVudCA9IE9iamVjdC5hc3NpZ24oe30sIG9FdmVudCk7XG5cblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0RpYWxvZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uUGF0aCA9IG9BY3Rpb25Db250ZXh0LnNQYXRoICYmIG9BY3Rpb25Db250ZXh0LnNQYXRoLnNwbGl0KFwiL0BcIilbMF0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNEZWZhdWx0VmFsdWVzRnVuY3Rpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNEZWZhdWx0VmFsdWVzRnVuY3Rpb247XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyA9IGZ1bmN0aW9uIChzQmluZGluZ1BhcmFtZXRlcj86IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0JvdW5kRnVuY3Rpb25OYW1lID0gZ2V0RGVmYXVsdFZhbHVlc0Z1bmN0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBwcmVmaWxsUGFyYW1ldGVyID0gZnVuY3Rpb24gKHNQYXJhbU5hbWU6IGFueSwgdlBhcmFtRGVmYXVsdFZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAxOiBUaGVyZSBpcyBhIFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBhbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbURlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDAgJiYgdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gQ29tbW9uVXRpbHMucmVxdWVzdFNpbmdsZXRvblByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbURlZmF1bHRWYWx1ZS4kUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9taXNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1ZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uQmluZGluZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRQYXJhbWV0ZXJDb250ZXh0KClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFByb3BlcnR5KHZQYXJhbURlZmF1bHRWYWx1ZS4kUGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZQYXJhbVZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgbXVsdGkgc2VsZWN0LCBuZWVkIHRvIGxvb3Agb3ZlciBhQ29udGV4dHMgKGFzIGNvbnRleHRzIGNhbm5vdCBiZSByZXRyaWV2ZWQgdmlhIGJpbmRpbmcgcGFyYW1ldGVyIG9mIHRoZSBvcGVyYXRpb24gYmluZGluZylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNQYXRoRm9yQ29udGV4dCA9IHZQYXJhbURlZmF1bHRWYWx1ZS4kUGF0aDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNQYXRoRm9yQ29udGV4dC5pbmRleE9mKHNCaW5kaW5nUGFyYW1ldGVyICsgXCIvXCIpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhdGhGb3JDb250ZXh0ID0gc1BhdGhGb3JDb250ZXh0LnJlcGxhY2Uoc0JpbmRpbmdQYXJhbWV0ZXIgKyBcIi9cIiwgXCJcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzW2ldLmdldFByb3BlcnR5KHNQYXRoRm9yQ29udGV4dCkgIT09IHZQYXJhbVZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRleHRzIGFyZSBub3QgYWxsIHRoZSBzYW1lLCBkbyBub3QgcHJlZmlsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Yk5vUG9zc2libGVWYWx1ZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdlBhcmFtVmFsdWUgfSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2ltcGx5IGNsZWFyIHBhcmFtZXRlciBkZWZhdWx0IGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkVycm9yIHdoaWxlIHJlYWRpbmcgZGVmYXVsdCBhY3Rpb24gcGFyYW1ldGVyXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXJhbU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiTGF0ZVByb3BlcnR5RXJyb3I6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAxLjI6IFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBkZWZpbmVzIGEgZml4ZWQgc3RyaW5nIHZhbHVlIChpLmUuIHZQYXJhbURlZmF1bHRWYWx1ZSA9ICdzb21lU3RyaW5nJylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHZQYXJhbURlZmF1bHRWYWx1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAyOiBUaGVyZSBpcyBubyBQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgYW5ub3RhdGlvbiAoPT4gbG9vayBpbnRvIHRoZSBGTFAgVXNlciBEZWZhdWx0cylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1ldGVyTW9kZWwgJiYgKG9QYXJhbWV0ZXJNb2RlbCBhcyBhbnkpLm9EYXRhW3NQYXJhbU5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogKG9QYXJhbWV0ZXJNb2RlbCBhcyBhbnkpLm9EYXRhW3NQYXJhbU5hbWVdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlID0gZnVuY3Rpb24gKHNQYXJhbU5hbWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0RpYWxvZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuc1BhdGggJiYgb0FjdGlvbkNvbnRleHQuc1BhdGguc3BsaXQoXCIvQFwiKVswXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblRhcmdldCA9IHNBY3Rpb25QYXRoICsgXCIvXCIgKyBzUGFyYW1OYW1lICsgXCJAXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0FjdGlvblBhcmFtZXRlckFubm90YXRpb25UYXJnZXQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckFubm90YXRpb25zICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUGFyYW1ldGVyRGVmYXVsdFZhbHVlXCJdOyAvLyBlaXRoZXIgeyAkUGF0aDogJ3NvbWVQYXRoJyB9IG9yICdzb21lU3RyaW5nJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhcmFtZXRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBzUGFyYW1OYW1lLCB2UGFyYW1ldGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXJhbU5hbWUgPSBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlckRlZmF1bHRWYWx1ZSA9IGdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZShzUGFyYW1OYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZS5wdXNoKHByZWZpbGxQYXJhbWV0ZXIoc1BhcmFtTmFtZSwgdlBhcmFtZXRlckRlZmF1bHRWYWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIikgJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNCb3VuZEZ1bmN0aW9uTmFtZSAmJiBzQm91bmRGdW5jdGlvbk5hbWUubGVuZ3RoID4gMCAmJiB0eXBlb2Ygc0JvdW5kRnVuY3Rpb25OYW1lID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGxCb3VuZEZ1bmN0aW9uKHNCb3VuZEZ1bmN0aW9uTmFtZSwgYUNvbnRleHRzW2ldLCBtUGFyYW1ldGVycy5tb2RlbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQcmVmaWxsUGFyYW1Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGFFeGVjRnVuY3Rpb25Qcm9taXNlczogUHJvbWlzZTxhbnlbXT4gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFGdW5jdGlvblBhcmFtcyAmJiBhRnVuY3Rpb25QYXJhbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhRXhlY0Z1bmN0aW9uUHJvbWlzZXMgPSBQcm9taXNlLmFsbChhRnVuY3Rpb25QYXJhbXMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzTW9kdWxlID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc3Vic3RyaW5nKDAsIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZSA9IEZQTUhlbHBlci5hY3Rpb25XcmFwcGVyKG9DbG9uZUV2ZW50LCBzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJjb250ZXh0c1wiOiBhQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFByb21pc2UuYWxsKFthUHJlZmlsbFBhcmFtUHJvbWlzZXMsIGFFeGVjRnVuY3Rpb25Qcm9taXNlcywgb0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2VdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYVByb21pc2VzOiBbYW55W10sIGFueVtdLCBhbnldKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZTogYW55ID0gYVByb21pc2VzWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGdW5jdGlvblBhcmFtcyA9IGFQcm9taXNlc1sxXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QgPSBhUHJvbWlzZXNbMl07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNEaWFsb2dQYXJhbU5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzRGlhbG9nUGFyYW1OYW1lID0gYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QuaGFzT3duUHJvcGVydHkoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0W3NEaWFsb2dQYXJhbU5hbWVdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0udmFsdWUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldLnZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIHRoZSBkZWZhdWx0IHZhbHVlIGhhZCBub3QgYmVlbiBwcmV2aW91c2x5IGRldGVybWluZWQgZHVlIHRvIGRpZmZlcmVudCBjb250ZXh0cywgd2UgZG8gbm90aGluZyBlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHNCb3VuZEZ1bmN0aW9uTmFtZSAmJiAhYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS5iTm9Qb3NzaWJsZVZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHdlIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNhbWUgcGFyYW0gdmFsdWUgZm9yIGFsbCB0aGUgY29udGV4dHM6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGogPSAwO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlIChqIDwgYUNvbnRleHRzLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zW2pdICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtc1tqICsgMV0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zW2pdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbaiArIDFdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGorKztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL3BhcmFtIHZhbHVlcyBhcmUgYWxsIHRoZSBzYW1lOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChqID09PSBhQ29udGV4dHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zW2pdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9Pbmx5IG9uZSBjb250ZXh0LCB0aGVuIHRoZSBkZWZhdWx0IHBhcmFtIHZhbHVlcyBhcmUgdG8gYmUgdmVyaWZpZWQgZnJvbSB0aGUgZnVuY3Rpb246XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZ1bmN0aW9uUGFyYW1zWzBdICYmIGFGdW5jdGlvblBhcmFtc1swXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtc1swXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJFcnJvckZvdW5kID0gYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZS5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9WYWx1ZS5iTGF0ZVByb3BlcnR5RXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9WYWx1ZS5iTGF0ZVByb3BlcnR5RXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWYgYXQgbGVhc3Qgb25lIERlZmF1bHQgUHJvcGVydHkgaXMgYSBMYXRlIFByb3BlcnR5IGFuZCBhbiBlVGFnIGVycm9yIHdhcyByYWlzZWQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJFcnJvckZvdW5kKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfQVBQX0NPTVBPTkVOVF9TQVBGRV9FVEFHX0xBVEVfUFJPUEVSVFlcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC53YXJuaW5nKHNUZXh0LCB7IGNvbnRlbnRXaWR0aDogXCIyNWVtXCIgfSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkUGFyYW1ldGVyXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzQmluZGluZ1BhcmFtZXRlciA9IGFQYXJhbWV0ZXJzWzBdICYmIGFQYXJhbWV0ZXJzWzBdLiROYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzWzBdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Db250ZXh0T2JqZWN0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihzQmluZGluZ1BhcmFtZXRlciwgb0NvbnRleHRPYmplY3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyhzQmluZGluZ1BhcmFtZXRlcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBwYXJhbWV0ZXJcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0YUZvcm1FbGVtZW50cyA9IG9EaWFsb2dDb250ZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1cIilcblx0XHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUNvbnRhaW5lcnNcIilbMF1cblx0XHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUVsZW1lbnRzXCIpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpLm9Nb2RlbCk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9QYXJhbWV0ZXJNb2RlbCwgXCJwYXJhbXNNb2RlbFwiKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuYmluZEVsZW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIi9cIixcblx0XHRcdFx0XHRcdFx0bW9kZWw6IFwicGFyYW1zTW9kZWxcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBlbXB0eSBtb2RlbCB0byBhZGQgZWxlbWVudHMgZHluYW1pY2FsbHkgZGVwZW5kaW5nIG9uIG51bWJlciBvZiBNVkYgZmllbGRzIGRlZmluZWQgb24gdGhlIGRpYWxvZ1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01WRk1vZGVsID0gbmV3IEpTT05Nb2RlbCh7fSk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9NVkZNb2RlbCwgXCJtdmZ2aWV3XCIpO1xuXG5cdFx0XHRcdFx0XHRsZXQgc0FjdGlvblBhdGggPSBzQWN0aW9uTmFtZSArIFwiKC4uLilcIjtcblx0XHRcdFx0XHRcdGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyB8fCBbXTtcblx0XHRcdFx0XHRcdGlmICghYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRzQWN0aW9uUGF0aCA9IFwiL1wiICsgc0FjdGlvblBhdGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmJpbmRFbGVtZW50KHtcblx0XHRcdFx0XHRcdFx0cGF0aDogc0FjdGlvblBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKG9QYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChhQ29udGV4dHNbMF0pOyAvLyB1c2UgY29udGV4dCBvZiBmaXJzdCBzZWxlY3RlZCBsaW5lIGl0ZW1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nID0gb0RpYWxvZy5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gcHJlcGFyZUFjdGlvblBhcmFtZXRlcnMob0FjdGlvbjogYW55LCBhUHJlZGVmaW5lZFBhcmFtZXRlcnM6IGFueSkge1xuXHQvLyBjaGVjayBpZiBwYXJhbWV0ZXJzIGV4aXN0IGF0IGFsbFxuXHRjb25zdCBhUGFyYW1ldGVycyA9IGdldEFjdGlvblBhcmFtZXRlcnMob0FjdGlvbik7XG5cdGFQcmVkZWZpbmVkUGFyYW1ldGVycyA9IGFQcmVkZWZpbmVkUGFyYW1ldGVycyB8fCBbXTtcblxuXHRpZiAoYVByZWRlZmluZWRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHQvLyBUT0RPOiBtZXJnZSB0aGUgcHJlZGVmaW5lZCBvbmNlIHdpdGggdGhlIHJlYWwgZXhpc3Rpbmcgb25lXG5cdH1cblxuXHRyZXR1cm4gYVBhcmFtZXRlcnM7XG59XG5mdW5jdGlvbiBnZXRBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb246IGFueSkge1xuXHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFBhcmFtZXRlclwiKSB8fCBbXTtcblx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdGlmIChvQWN0aW9uLmdldE9iamVjdChcIiRJc0JvdW5kXCIpKSB7XG5cdFx0XHQvL2luIGNhc2Ugb2YgYm91bmQgYWN0aW9ucywgaWdub3JlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIGNvbnNpZGVyIHRoZSByZXN0XG5cdFx0XHRyZXR1cm4gYVBhcmFtZXRlcnMuc2xpY2UoMSwgYVBhcmFtZXRlcnMubGVuZ3RoKSB8fCBbXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFQYXJhbWV0ZXJzO1xufVxuZnVuY3Rpb24gZ2V0SXNBY3Rpb25Dcml0aWNhbChvTWV0YU1vZGVsOiBhbnksIHNQYXRoOiBhbnksIGNvbnRleHRzPzogYW55LCBvQm91bmRBY3Rpb24/OiBhbnkpIHtcblx0Y29uc3QgdkFjdGlvbkNyaXRpY2FsID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNBY3Rpb25Dcml0aWNhbFwiKTtcblx0bGV0IHNDcml0aWNhbFBhdGggPSB2QWN0aW9uQ3JpdGljYWwgJiYgdkFjdGlvbkNyaXRpY2FsLiRQYXRoO1xuXHRpZiAoIXNDcml0aWNhbFBhdGgpIHtcblx0XHQvLyB0aGUgc3RhdGljIHZhbHVlIHNjZW5hcmlvIGZvciBpc0FjdGlvbkNyaXRpY2FsXG5cdFx0cmV0dXJuICEhdkFjdGlvbkNyaXRpY2FsO1xuXHR9XG5cdGNvbnN0IGFCaW5kaW5nUGFyYW1zID0gb0JvdW5kQWN0aW9uICYmIG9Cb3VuZEFjdGlvbi5nZXRPYmplY3QoXCIkUGFyYW1ldGVyXCIpLFxuXHRcdGFQYXRocyA9IHNDcml0aWNhbFBhdGggJiYgc0NyaXRpY2FsUGF0aC5zcGxpdChcIi9cIiksXG5cdFx0YkNvbmRpdGlvbiA9XG5cdFx0XHRhQmluZGluZ1BhcmFtcyAmJiBhQmluZGluZ1BhcmFtcy5sZW5ndGggJiYgdHlwZW9mIGFCaW5kaW5nUGFyYW1zID09PSBcIm9iamVjdFwiICYmIHNDcml0aWNhbFBhdGggJiYgY29udGV4dHMgJiYgY29udGV4dHMubGVuZ3RoO1xuXHRpZiAoYkNvbmRpdGlvbikge1xuXHRcdC8vaW4gY2FzZSBiaW5kaW5nIHBhdGFtZXRlcnMgYXJlIHRoZXJlIGluIHBhdGggbmVlZCB0byByZW1vdmUgZWc6IC0gX2l0L2lzVmVyaWZpZWQgPT4gbmVlZCB0byByZW1vdmUgX2l0IGFuZCB0aGUgcGF0aCBzaG91bGQgYmUgaXNWZXJpZmllZFxuXHRcdGFCaW5kaW5nUGFyYW1zLmZpbHRlcihmdW5jdGlvbiAob1BhcmFtczogYW55KSB7XG5cdFx0XHRjb25zdCBpbmRleCA9IGFQYXRocyAmJiBhUGF0aHMuaW5kZXhPZihvUGFyYW1zLiROYW1lKTtcblx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdGFQYXRocy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHNDcml0aWNhbFBhdGggPSBhUGF0aHMuam9pbihcIi9cIik7XG5cdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldE9iamVjdChzQ3JpdGljYWxQYXRoKTtcblx0fSBlbHNlIGlmIChzQ3JpdGljYWxQYXRoKSB7XG5cdFx0Ly9pZiBzY2VuYXJpbyBpcyBwYXRoIGJhc2VkIHJldHVybiB0aGUgcGF0aCB2YWx1ZVxuXHRcdHJldHVybiBjb250ZXh0c1swXS5nZXRPYmplY3Qoc0NyaXRpY2FsUGF0aCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyhvQWN0aW9uOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnksIGJHZXRCb3VuZENvbnRleHQ6IGJvb2xlYW4sIHNHcm91cElkOiBzdHJpbmcpIHtcblx0bGV0IG9BY3Rpb25Qcm9taXNlO1xuXHRpZiAobVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID4gMSkge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0ICB9KVxuXHRcdFx0OiBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHR9IGVsc2Uge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uXG5cdFx0XHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKG9wZXJhdGlvbnMsIHNHcm91cElkLCBtUGFyYW1ldGVycy5sYWJlbCwgbVBhcmFtZXRlcnMubW9kZWwpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQ6IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIG1QYXJhbWV0ZXJzLmxhYmVsLCBtUGFyYW1ldGVycy5tb2RlbClcblx0XHRcdCAgKTtcblx0fVxuXG5cdHJldHVybiBvQWN0aW9uUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRjb25zdCBhQ29udGV4dHMgPSBtUGFyYW1ldGVycy5hQ29udGV4dHMgfHwgW107XG5cdGNvbnN0IG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRjb25zdCBpRXhpc3RpbmdNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmxlbmd0aCB8fCAwO1xuXHRjb25zdCBhQWN0aW9uUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRjb25zdCBzQWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWU7XG5cdGNvbnN0IGZuT25TdWJtaXR0ZWQgPSBtUGFyYW1ldGVycy5mbk9uU3VibWl0dGVkO1xuXHRjb25zdCBmbk9uUmVzcG9uc2UgPSBtUGFyYW1ldGVycy5mbk9uUmVzcG9uc2U7XG5cdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0bGV0IG9BY3Rpb246IGFueTtcblx0Ly8gbGV0IGNvbnRleHRJbmRleCA9IDA7XG5cdC8vIGxldCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cblx0ZnVuY3Rpb24gZm5EaWZmZXJlbnRpYXRlKHByb21pc2U6IGFueSkge1xuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oXG5cdFx0XHRmdW5jdGlvbiAocmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRsZXQgYU1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCk7XG5cdFx0XHRcdGFNZXNzYWdlcyA9IGFNZXNzYWdlcy5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTtcblx0XHRcdFx0Ly8gQWN0aW9uIERpYWxvZyBtdXN0IHJlbWFpbiBvcGVuIGlmIHRoZXJlIGFyZSByZXNwb25zZSBlcnJvci1tZXNzYWdlcywgYmVjYXVzZSBpbiB0aGUgamF2YSBzdGFjayB0aGUgZGlhbG9nIHdvdWxkIGJlIGNsb3NlZCBpbW1lZGlhdGVseS5cblx0XHRcdFx0aWYgKGFNZXNzYWdlcy5sZW5ndGggPiBpRXhpc3RpbmdNZXNzYWdlcyAmJiBhTWVzc2FnZXNbYU1lc3NhZ2VzLmxlbmd0aCAtIDFdLnR5cGUgPT09IFwiRXJyb3JcIikge1xuXHRcdFx0XHRcdHJldHVybiB7IHJlc3BvbnNlOiByZXNwb25zZSwgc3RhdHVzOiBcInJlamVjdGVkXCIgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyByZXNwb25zZTogcmVzcG9uc2UsIHN0YXR1czogXCJyZXNvbHZlZFwiIH07XG5cdFx0XHR9LFxuXHRcdFx0ZnVuY3Rpb24gKHJlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHsgcmVzcG9uc2U6IHJlc3BvbnNlLCBzdGF0dXM6IFwicmVqZWN0ZWRcIiB9O1xuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKSB7XG5cdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzICYmIGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAoIWFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChhQWN0aW9uUGFyYW1ldGVyc1tqXS4kVHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5TdHJpbmdcIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gdGJjXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0FjdGlvbi5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbal0uJE5hbWUsIGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0Y29uc3QgYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5iR3JvdXBlZDtcblx0XHRcdGNvbnN0IGJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRjb25zdCBiR2V0Qm91bmRDb250ZXh0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dDtcblx0XHRcdGNvbnN0IGFBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IHNHcm91cElkOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVBY3Rpb24gPSBmdW5jdGlvbiAob0FjdGlvbjogYW55LCBpbmRleDogYW55LCBvU2lkZUVmZmVjdDogYW55KSB7XG5cdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSAhYkdyb3VwZWQgPyBcIiRhdXRvLlwiICsgaW5kZXggOiBvQWN0aW9uLmdldFVwZGF0ZUdyb3VwSWQoKTtcblx0XHRcdFx0b0FjdGlvblByb21pc2UgPSBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKG9BY3Rpb24sIG1QYXJhbWV0ZXJzLCBiR2V0Qm91bmRDb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0XHRcdGFBY3Rpb25Qcm9taXNlcy5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRcdC8vIHRyaWdnZXIgYWN0aW9ucyBmcm9tIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0b1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc1RyaWdnZXJBY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb1NpZGVFZmZlY3QuY29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlcXVlc3Qgc2lkZSBlZmZlY3RzIGZvciB0aGlzIGFjdGlvblxuXHRcdFx0XHQvLyBhcyB3ZSBtb3ZlIHRoZSBtZXNzYWdlcyByZXF1ZXN0IHRvIFBPU1QgJHNlbGVjdCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBhbiBlbXB0eSBhcnJheVxuXHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlU2luZ2xlQWN0aW9uID0gZnVuY3Rpb24gKG9BY3Rpb246IGFueSwgaW5kZXg6IGFueSwgb1NpZGVFZmZlY3Q6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Mb2NhbFByb21pc2U7XG5cdFx0XHRcdFx0Y29uc3QgYUxvY2FsUHJvbWlzZSA9IFtdO1xuXHRcdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBuZWVkIGJhdGNoIGdyb3VwIHBlciBhY3Rpb24gY2FsbFxuXHRcdFx0XHRcdHNHcm91cElkID0gXCJhcGlNb2RlXCIgKyBpbmRleDtcblx0XHRcdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMob0FjdGlvbiwgbVBhcmFtZXRlcnMsIGJHZXRCb3VuZENvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRhQWN0aW9uUHJvbWlzZXMucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdFx0XHQvLyB0cmlnZ2VyIGFjdGlvbnMgZnJvbSBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzVHJpZ2dlckFjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdFx0XHRhTG9jYWxQcm9taXNlLnB1c2gob0xvY2FsUHJvbWlzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyByZXF1ZXN0IHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBhY3Rpb25cblx0XHRcdFx0XHQvLyBhcyB3ZSBtb3ZlIHRoZSBtZXNzYWdlcyByZXF1ZXN0IHRvIFBPU1QgJHNlbGVjdCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBhbiBlbXB0eSBhcnJheVxuXHRcdFx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvTG9jYWxQcm9taXNlKTtcblx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2Vcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRcdFx0XHRQcm9taXNlLmFsbChhTG9jYWxQcm9taXNlKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHRcdH07XG5cblx0XHRcdGZ1bmN0aW9uIGZuRXhlY3V0ZVNlcXVlbnRpYWxseShhQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHQvLyBPbmUgYWN0aW9uIGFuZCBpdHMgc2lkZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBuZXh0IGFjdGlvbiBpcyBleGVjdXRlZFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGZ1bmN0aW9uIHByb2Nlc3NPbmVBY3Rpb24oY29udGV4dDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiLCBjb250ZXh0LCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdHJldHVybiBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24ob0FjdGlvbiwgaSwge1xuXHRcdFx0XHRcdFx0Y29udGV4dDogY29udGV4dCxcblx0XHRcdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgb0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IGlkID0gKytqO1xuXHRcdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSA9IG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQsIGlkKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYkdyb3VwZWQpIHtcblx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiLCBlbnN1cmUgdGhhdCBlYWNoIGFjdGlvbiBhbmQgbWF0Y2hpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIGFyZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBuZXh0IHNldCBpcyBzdWJtaXR0ZWQuIFdvcmthcm91bmQgdW50aWwgSlNPTiBiYXRjaCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdC8vIEFsbG93IGFsc28gZm9yIExpc3QgUmVwb3J0LlxuXHRcdFx0XHRmbkV4ZWN1dGVTZXF1ZW50aWFsbHkoYUNvbnRleHRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiLCBhQ29udGV4dHNbaV0sIG1CaW5kaW5nUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0Zm5FeGVjdXRlQWN0aW9uKG9BY3Rpb24sIGFDb250ZXh0cy5sZW5ndGggPD0gMSA/IG51bGwgOiBpLCB7XG5cdFx0XHRcdFx0XHRjb250ZXh0OiBhQ29udGV4dHNbaV0sXG5cdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChcblx0XHRcdFx0XHRmbk9uU3VibWl0dGVkIHx8XG5cdFx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkoYUFjdGlvblByb21pc2VzKTtcblx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGZuSGFuZGxlUmVzdWx0cygpIHtcblx0XHRcdFx0UHJvbWlzZS5hbGwoYUFjdGlvblByb21pc2VzLm1hcChmbkRpZmZlcmVudGlhdGUpKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChyZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVJlamVjdGVkSXRlbXMgPSBbXTtcblx0XHRcdFx0XHRcdGNvbnN0IGFSZXNvbHZlZEl0ZW1zID0gW107XG5cdFx0XHRcdFx0XHRsZXQgaVJlc3VsdENvdW50O1xuXHRcdFx0XHRcdFx0Zm9yIChpUmVzdWx0Q291bnQgPSAwOyBpUmVzdWx0Q291bnQgPCByZXN1bHRzLmxlbmd0aDsgaVJlc3VsdENvdW50KyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdHNbaVJlc3VsdENvdW50XS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHRcdFx0XHRcdGFSZWplY3RlZEl0ZW1zLnB1c2gocmVzdWx0c1tpUmVzdWx0Q291bnRdLnJlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0c1tpUmVzdWx0Q291bnRdLnN0YXR1cyA9PT0gXCJyZXNvbHZlZFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlZCB0aGUgYkFjdGlvblBhcmFtZXRlcnNFeGlzdCBzbyB0aGF0IGNyZWF0ZSBuZXcgYWN0aW9uIGNhbiB3b3JrIGluIGJvdGggY2FzZXMgLSB3aXRoIGFuZCB3aXRob3V0IGRpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVzZWQgZm9yIE5ld0FjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0c1tpUmVzdWx0Q291bnRdLmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVkSXRlbXMucHVzaChyZXN1bHRzW2lSZXN1bHRDb3VudF0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZWRJdGVtcy5wdXNoKHJlc3VsdHNbaVJlc3VsdENvdW50XS5yZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXJlc3VsdHMgfHwgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDApKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhUmVqZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKGJSZXR1cm5Bc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhUmVzb2x2ZWRJdGVtcyk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY29udGV4dCBpcyBnaXZlbiBkaXJlY3RseSB3aXRob3V0IGFuIGFycmF5IHNvIGFsc28gbm8gYXJyYXkgaXMgZXhwZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKGFSZXNvbHZlZEl0ZW1zWzBdKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlZEl0ZW1zOiBhUmVzb2x2ZWRJdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRyZWplY3RlZEl0ZW1zOiBhUmVqZWN0ZWRJdGVtc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0fVxuXHRcdH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0KFxuXHRcdFx0XHRmbk9uUmVzcG9uc2UgfHxcblx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdH1cblx0XHRcdCkoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KFwiL1wiICsgc0FjdGlvbk5hbWUgKyBcIiguLi4pXCIpO1xuXHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJhY3Rpb25JbXBvcnRcIjtcblx0XHRjb25zdCBvQWN0aW9uUHJvbWlzZSA9IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIG1QYXJhbWV0ZXJzLmxhYmVsLCBvTW9kZWwpXG5cdFx0KTtcblx0XHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdC8vIHRyaWdnZXIgb25TdWJtaXR0ZWQgXCJldmVudFwiXG5cdFx0KFxuXHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0LyoqL1xuXHRcdFx0fVxuXHRcdCkob0FjdGlvblByb21pc2UpO1xuXHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdChcblx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHR9XG5cdFx0XHQpKCk7XG5cdFx0fSk7XG5cdH1cbn1cbmZ1bmN0aW9uIF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0OiBhbnksIHNBY3Rpb25OYW1lOiBhbnkpIHtcblx0bGV0IHNQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpO1xuXHRzUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpID8gc1BhdGguc3BsaXQoXCJAJHVpNS5vdmVybG9hZFwiKVswXSA6IHNQYXRoLnNwbGl0KFwiLzBcIilbMF07XG5cdHJldHVybiBzUGF0aC5zcGxpdChcIi9cIiArIHNBY3Rpb25OYW1lKVswXTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIHRvIGNhbGwgT0RhdGEgYWN0aW9ucyAoYm91bmQvaW1wb3J0KSBhbmQgZnVuY3Rpb25zIChib3VuZC9pbXBvcnQpXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxCb3VuZEFjdGlvbjogY2FsbEJvdW5kQWN0aW9uLFxuXHRjYWxsQWN0aW9uSW1wb3J0OiBjYWxsQWN0aW9uSW1wb3J0LFxuXHRjYWxsQm91bmRGdW5jdGlvbjogY2FsbEJvdW5kRnVuY3Rpb24sXG5cdGNhbGxGdW5jdGlvbkltcG9ydDogY2FsbEZ1bmN0aW9uSW1wb3J0LFxuXHRleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzOiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcGVyYXRpb25zO1xuIl19