@sapui5/sap.fe.core 1.111.1 → 1.112.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 (524) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime-dbg.js +4 -4
  4. package/src/sap/fe/core/ActionRuntime.js +1 -1
  5. package/src/sap/fe/core/ActionRuntime.js.map +1 -1
  6. package/src/sap/fe/core/ActionRuntime.ts +11 -11
  7. package/src/sap/fe/core/AppComponent-dbg.js +27 -5
  8. package/src/sap/fe/core/AppComponent.js +1 -1
  9. package/src/sap/fe/core/AppComponent.js.map +1 -1
  10. package/src/sap/fe/core/AppComponent.ts +58 -3
  11. package/src/sap/fe/core/AppStateHandler-dbg.js +5 -2
  12. package/src/sap/fe/core/AppStateHandler.js +1 -1
  13. package/src/sap/fe/core/AppStateHandler.js.map +1 -1
  14. package/src/sap/fe/core/AppStateHandler.ts +10 -1
  15. package/src/sap/fe/core/BaseController-dbg.js +1 -1
  16. package/src/sap/fe/core/BaseController.ts +2 -1
  17. package/src/sap/fe/core/CommonUtils-dbg.js +152 -365
  18. package/src/sap/fe/core/CommonUtils.js +1 -1
  19. package/src/sap/fe/core/CommonUtils.js.map +1 -1
  20. package/src/sap/fe/core/CommonUtils.ts +201 -478
  21. package/src/sap/fe/core/ExtensionAPI-dbg.js +2 -1
  22. package/src/sap/fe/core/ExtensionAPI.js +1 -1
  23. package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
  24. package/src/sap/fe/core/ExtensionAPI.ts +9 -1
  25. package/src/sap/fe/core/PageController-dbg.js +26 -31
  26. package/src/sap/fe/core/PageController.js +1 -1
  27. package/src/sap/fe/core/PageController.js.map +1 -1
  28. package/src/sap/fe/core/PageController.ts +17 -3
  29. package/src/sap/fe/core/ResourceModel-dbg.js +71 -0
  30. package/src/sap/fe/core/ResourceModel.js +6 -0
  31. package/src/sap/fe/core/ResourceModel.js.map +1 -0
  32. package/src/sap/fe/core/ResourceModel.ts +67 -0
  33. package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
  34. package/src/sap/fe/core/TemplateComponent.ts +1 -0
  35. package/src/sap/fe/core/TemplateModel-dbg.js +1 -1
  36. package/src/sap/fe/core/TemplateModel.ts +6 -1
  37. package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +5 -7
  38. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  39. package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -1
  40. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +6 -5
  41. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +163 -0
  42. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +6 -0
  43. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -0
  44. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +169 -0
  45. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +88 -0
  46. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +6 -0
  47. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -0
  48. package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +147 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +905 -0
  50. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +21 -0
  51. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -0
  52. package/src/sap/fe/core/buildingBlocks/{BuildingBlockRuntime.ts → BuildingBlockTemplateProcessor.ts} +290 -362
  53. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +79 -0
  54. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +15 -0
  55. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -0
  56. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +68 -0
  57. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +162 -0
  58. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +6 -0
  59. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -0
  60. package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +181 -0
  61. package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +4 -2
  62. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  63. package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -1
  64. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -3
  65. package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +890 -220
  66. package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
  67. package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
  68. package/src/sap/fe/core/controllerextensions/EditFlow.ts +974 -239
  69. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +24 -34
  70. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  71. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
  72. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +71 -61
  73. package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +14 -17
  74. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
  75. package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
  76. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +23 -17
  77. package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1 -1
  78. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -0
  79. package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +3 -3
  80. package/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -1
  82. package/src/sap/fe/core/controllerextensions/MassEdit.ts +2 -2
  83. package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +2 -1
  84. package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -1
  85. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +2 -0
  86. package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +1 -1
  87. package/src/sap/fe/core/controllerextensions/PageReady.ts +24 -0
  88. package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
  89. package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
  90. package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
  91. package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
  92. package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
  93. package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
  94. package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
  95. package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
  96. package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
  97. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  98. package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
  99. package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
  100. package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
  101. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  102. package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
  103. package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
  104. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
  105. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  106. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
  107. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
  108. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
  109. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
  110. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
  111. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
  112. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
  113. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
  114. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
  115. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
  116. package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +1 -1
  117. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
  118. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +2 -3
  119. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
  120. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
  121. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
  122. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
  123. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
  124. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +45 -31
  125. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
  126. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
  127. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +52 -42
  128. package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +44 -49
  129. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
  130. package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
  131. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +43 -63
  132. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
  133. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +77 -0
  134. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
  135. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
  136. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +114 -0
  137. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1505 -0
  138. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
  139. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
  140. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1985 -0
  141. package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
  142. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  143. package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
  144. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
  145. package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -11
  146. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
  147. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
  148. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -13
  149. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +43 -41
  150. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
  151. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
  152. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +44 -47
  153. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
  154. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
  155. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
  156. package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +12 -13
  157. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  158. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
  159. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +32 -13
  160. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
  161. package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
  162. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  163. package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
  164. package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
  165. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
  166. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  167. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
  168. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
  169. package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
  170. package/src/sap/fe/core/controls/FilterBar.ts +5 -0
  171. package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
  172. package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
  173. package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
  174. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
  175. package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
  176. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
  177. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
  178. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
  179. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
  180. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  181. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
  182. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
  183. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
  184. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
  185. package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
  186. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
  187. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
  188. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
  189. package/src/sap/fe/core/converters/ConverterContext-dbg.js +1 -1
  190. package/src/sap/fe/core/converters/ConverterContext.ts +2 -1
  191. package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
  192. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  193. package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
  194. package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
  195. package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +17 -1
  196. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  197. package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
  198. package/src/sap/fe/core/converters/ManifestWrapper.ts +16 -0
  199. package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +61 -49
  200. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  201. package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
  202. package/src/sap/fe/core/converters/MetaModelConverter.ts +65 -51
  203. package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
  204. package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
  205. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  206. package/src/sap/fe/core/converters/annotations/DataField-dbg.js +65 -16
  207. package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
  208. package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
  209. package/src/sap/fe/core/converters/annotations/DataField.ts +62 -18
  210. package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1010 -957
  211. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  212. package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
  213. package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +8 -8
  214. package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
  215. package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
  216. package/src/sap/fe/core/converters/controls/Common/Action.ts +28 -26
  217. package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
  218. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  219. package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
  220. package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
  221. package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
  222. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  223. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
  224. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
  225. package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +1 -1
  226. package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -3
  227. package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +6 -6
  228. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  229. package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
  230. package/src/sap/fe/core/converters/controls/Common/KPI.ts +15 -15
  231. package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +97 -69
  232. package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  233. package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
  234. package/src/sap/fe/core/converters/controls/Common/Table.ts +161 -137
  235. package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +3 -3
  236. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  237. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
  238. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +10 -9
  239. package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +48 -44
  240. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  241. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
  242. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +130 -86
  243. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +34 -26
  244. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
  245. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
  246. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +62 -45
  247. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
  248. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
  249. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
  250. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  251. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
  252. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
  253. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +34 -13
  254. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
  255. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
  256. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +54 -20
  257. package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +3 -1
  258. package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
  259. package/src/sap/fe/core/converters/helpers/Aggregation.ts +8 -0
  260. package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
  261. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  262. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
  263. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
  264. package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
  265. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
  266. package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
  267. package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
  268. package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +9 -8
  269. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  270. package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
  271. package/src/sap/fe/core/converters/helpers/IssueManager.ts +8 -7
  272. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +8 -7
  273. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  274. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
  275. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +9 -6
  276. package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +25 -33
  277. package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  278. package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
  279. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +35 -35
  280. package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +11 -4
  281. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  282. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
  283. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +7 -1
  284. package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
  285. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  286. package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
  287. package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
  288. package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -2
  289. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  290. package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
  291. package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
  292. package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -5
  293. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  294. package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
  295. package/src/sap/fe/core/formatters/ValueFormatter.ts +6 -4
  296. package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
  297. package/src/sap/fe/core/fpm/Component.ts +1 -0
  298. package/src/sap/fe/core/fpm/manifest.json +1 -1
  299. package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
  300. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  301. package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
  302. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  303. package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +6 -6
  304. package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
  305. package/src/sap/fe/core/helpers/BindingToolkit.ts +8 -8
  306. package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
  307. package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
  308. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  309. package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
  310. package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
  311. package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
  312. package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
  313. package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +20 -18
  314. package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  315. package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
  316. package/src/sap/fe/core/helpers/MassEditHelper.ts +22 -23
  317. package/src/sap/fe/core/helpers/MessageStrip-dbg.js +4 -5
  318. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  319. package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
  320. package/src/sap/fe/core/helpers/MessageStrip.ts +4 -4
  321. package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +354 -0
  322. package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
  323. package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
  324. package/src/sap/fe/core/helpers/MetaModelFunction.ts +408 -0
  325. package/src/sap/fe/core/helpers/ModelHelper-dbg.js +13 -13
  326. package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
  327. package/src/sap/fe/core/helpers/ModelHelper.ts +13 -13
  328. package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
  329. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  330. package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
  331. package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
  332. package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +26 -0
  333. package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
  334. package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
  335. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +19 -0
  336. package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +93 -18
  337. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  338. package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
  339. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +70 -17
  340. package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
  341. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  342. package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
  343. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  344. package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
  345. package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
  346. package/src/sap/fe/core/helpers/TypeGuards-dbg.js +5 -1
  347. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  348. package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
  349. package/src/sap/fe/core/helpers/TypeGuards.ts +12 -1
  350. package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
  351. package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
  352. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
  353. package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
  354. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
  355. package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
  356. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
  357. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
  358. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  359. package/src/sap/fe/core/library-dbg.js +2 -2
  360. package/src/sap/fe/core/library-preload.js +127 -125
  361. package/src/sap/fe/core/library-preload.js.map +1 -1
  362. package/src/sap/fe/core/library.js +1 -1
  363. package/src/sap/fe/core/library.ts +7 -0
  364. package/src/sap/fe/core/manifest.json +1 -1
  365. package/src/sap/fe/core/messagebundle.properties +33 -0
  366. package/src/sap/fe/core/messagebundle_ar.properties +12 -10
  367. package/src/sap/fe/core/messagebundle_bg.properties +11 -9
  368. package/src/sap/fe/core/messagebundle_ca.properties +11 -9
  369. package/src/sap/fe/core/messagebundle_cs.properties +11 -9
  370. package/src/sap/fe/core/messagebundle_cy.properties +11 -9
  371. package/src/sap/fe/core/messagebundle_da.properties +11 -9
  372. package/src/sap/fe/core/messagebundle_de.properties +3 -1
  373. package/src/sap/fe/core/messagebundle_el.properties +11 -9
  374. package/src/sap/fe/core/messagebundle_en.properties +3 -1
  375. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
  376. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
  377. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -0
  378. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -3
  379. package/src/sap/fe/core/messagebundle_es.properties +11 -9
  380. package/src/sap/fe/core/messagebundle_es_MX.properties +11 -9
  381. package/src/sap/fe/core/messagebundle_et.properties +11 -9
  382. package/src/sap/fe/core/messagebundle_fi.properties +11 -9
  383. package/src/sap/fe/core/messagebundle_fr.properties +11 -9
  384. package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
  385. package/src/sap/fe/core/messagebundle_hi.properties +2 -0
  386. package/src/sap/fe/core/messagebundle_hr.properties +11 -9
  387. package/src/sap/fe/core/messagebundle_hu.properties +11 -9
  388. package/src/sap/fe/core/messagebundle_id.properties +3 -1
  389. package/src/sap/fe/core/messagebundle_it.properties +11 -9
  390. package/src/sap/fe/core/messagebundle_iw.properties +11 -9
  391. package/src/sap/fe/core/messagebundle_ja.properties +11 -9
  392. package/src/sap/fe/core/messagebundle_kk.properties +11 -9
  393. package/src/sap/fe/core/messagebundle_ko.properties +2 -0
  394. package/src/sap/fe/core/messagebundle_lt.properties +11 -9
  395. package/src/sap/fe/core/messagebundle_lv.properties +2 -0
  396. package/src/sap/fe/core/messagebundle_ms.properties +12 -10
  397. package/src/sap/fe/core/messagebundle_nl.properties +12 -10
  398. package/src/sap/fe/core/messagebundle_no.properties +11 -9
  399. package/src/sap/fe/core/messagebundle_pl.properties +2 -0
  400. package/src/sap/fe/core/messagebundle_pt.properties +11 -9
  401. package/src/sap/fe/core/messagebundle_pt_PT.properties +11 -9
  402. package/src/sap/fe/core/messagebundle_ro.properties +3 -1
  403. package/src/sap/fe/core/messagebundle_ru.properties +3 -1
  404. package/src/sap/fe/core/messagebundle_sh.properties +11 -9
  405. package/src/sap/fe/core/messagebundle_sk.properties +11 -9
  406. package/src/sap/fe/core/messagebundle_sl.properties +11 -9
  407. package/src/sap/fe/core/messagebundle_sv.properties +2 -0
  408. package/src/sap/fe/core/messagebundle_th.properties +11 -9
  409. package/src/sap/fe/core/messagebundle_tr.properties +11 -9
  410. package/src/sap/fe/core/messagebundle_uk.properties +11 -9
  411. package/src/sap/fe/core/messagebundle_vi.properties +12 -10
  412. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
  413. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
  414. package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
  415. package/src/sap/fe/core/operationsHelper.js +1 -1
  416. package/src/sap/fe/core/operationsHelper.js.map +1 -1
  417. package/src/sap/fe/core/operationsHelper.ts +88 -63
  418. package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
  419. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
  420. package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
  421. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  422. package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
  423. package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
  424. package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +4 -3
  425. package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
  426. package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
  427. package/src/sap/fe/core/rootView/RootViewBaseController.ts +15 -5
  428. package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
  429. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  430. package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
  431. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
  432. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
  433. package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
  434. package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
  435. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
  436. package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
  437. package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
  438. package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
  439. package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
  440. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  441. package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
  442. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
  443. package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +3 -3
  444. package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
  445. package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
  446. package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -3
  447. package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
  448. package/src/sap/fe/core/services/ShellServicesFactory.ts +14 -2
  449. package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
  450. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  451. package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
  452. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +502 -333
  453. package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +18 -5
  454. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  455. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
  456. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +41 -12
  457. package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
  458. package/src/sap/fe/core/support/Diagnostics.ts +5 -0
  459. package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +185 -86
  460. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  461. package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
  462. package/src/sap/fe/core/templating/DataModelPathHelper.ts +190 -82
  463. package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +1 -1
  464. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
  465. package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +2 -3
  466. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
  467. package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
  468. package/src/sap/fe/core/templating/EntitySetHelper.ts +1 -3
  469. package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
  470. package/src/sap/fe/core/templating/FilterHelper.js +1 -1
  471. package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
  472. package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
  473. package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
  474. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  475. package/src/sap/fe/core/templating/UIFormatters-dbg.js +1 -1
  476. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
  477. package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
  478. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
  479. package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
  480. package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
  481. package/src/sap/fe/core/type/FiscalDate.ts +2 -1
  482. package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
  483. package/src/sap/fe/core/type/TypeUtil.js +1 -1
  484. package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
  485. package/src/sap/fe/core/type/TypeUtil.ts +3 -6
  486. package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
  487. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
  488. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
  489. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
  490. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
  491. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
  492. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
  493. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
  494. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -948
  495. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
  496. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
  497. package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
  498. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
  499. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
  500. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
  501. package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
  502. package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
  503. package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
  504. package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
  505. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
  506. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
  507. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
  508. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
  509. package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
  510. package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
  511. package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
  512. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
  513. package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
  514. package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
  515. package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
  516. package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
  517. package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
  518. package/src/sap/fe/core/controls/FileWrapper.js +0 -6
  519. package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
  520. package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
  521. package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
  522. package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
  523. package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
  524. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
@@ -0,0 +1,905 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/TypeGuards", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "./TraceInfo"], function (Log, deepClone, uid, AttributeModel, ConfigurableObject, BindingToolkit, TypeGuards, BindingParser, XMLPreprocessor, JSONModel, TraceInfo) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ var isFunctionArray = TypeGuards.isFunctionArray;
10
+ var isContext = TypeGuards.isContext;
11
+ var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
12
+ var compileExpression = BindingToolkit.compileExpression;
13
+ var Placement = ConfigurableObject.Placement;
14
+ const LOGGER_SCOPE = "sap.fe.core.buildingBlocks.BuildingBlockTemplateProcessor";
15
+ const XMLTEMPLATING_NS = "http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1";
16
+ const DOMParserInstance = new DOMParser();
17
+ function validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey) {
18
+ const oContext = mContexts[sKey];
19
+ const oContextObject = oContext === null || oContext === void 0 ? void 0 : oContext.getObject();
20
+ if (oContextSettings.required === true && (!oContext || oContextObject === null)) {
21
+ throw new Error(`${sName}: Required metadataContext '${sKey}' is missing`);
22
+ } else if (oContextObject) {
23
+ // If context object has $kind property, $Type should not be checked
24
+ // Therefore remove from context settings
25
+ if (oContextObject.hasOwnProperty("$kind") && oContextObject.$kind !== undefined && oContextSettings.$kind !== undefined) {
26
+ // Check if the $kind is part of the allowed ones
27
+ if (oContextSettings.$kind.indexOf(oContextObject.$kind) === -1) {
28
+ throw new Error(`${sName}: '${sKey}' must be '$kind' '${oContextSettings["$kind"]}' but is '${oContextObject.$kind}': ${oContext.getPath()}`);
29
+ }
30
+ } else if (oContextObject.hasOwnProperty("$Type") && oContextObject.$Type !== undefined && oContextSettings.$Type) {
31
+ // Check only $Type
32
+ if (oContextSettings.$Type.indexOf(oContextObject.$Type) === -1) {
33
+ throw new Error(`${sName}: '${sKey}' must be '$Type' '${oContextSettings["$Type"]}' but is '${oContextObject.$Type}': ${oContext.getPath()}`);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ function validateMacroSignature(sName, oMetadata, mContexts, oNode) {
39
+ const aMetadataContextKeys = oMetadata.metadataContexts && Object.keys(oMetadata.metadataContexts) || [],
40
+ aProperties = oMetadata.properties && Object.keys(oMetadata.properties) || [],
41
+ oAttributeNames = {};
42
+
43
+ // collect all attributes to find unchecked properties
44
+ const attributeNames = oNode.getAttributeNames();
45
+ for (const attributeName of attributeNames) {
46
+ oAttributeNames[attributeName] = true;
47
+ }
48
+
49
+ //Check metadataContexts
50
+ aMetadataContextKeys.forEach(function (sKey) {
51
+ const oContextSettings = oMetadata.metadataContexts[sKey];
52
+ validateMacroMetadataContext(sName, mContexts, oContextSettings, sKey);
53
+ delete oAttributeNames[sKey];
54
+ });
55
+ //Check properties
56
+ aProperties.forEach(function (sKey) {
57
+ const oPropertySettings = oMetadata.properties[sKey];
58
+ if (!oNode.hasAttribute(sKey)) {
59
+ if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
60
+ throw new Error(`${sName}: ` + `Required property '${sKey}' is missing`);
61
+ }
62
+ } else {
63
+ delete oAttributeNames[sKey];
64
+ }
65
+ });
66
+
67
+ // Unchecked properties
68
+ Object.keys(oAttributeNames).forEach(function (sKey) {
69
+ // no check for properties which contain a colon ":" (different namespace), e.g. xmlns:trace, trace:macroID, unittest:id
70
+ if (sKey.indexOf(":") < 0 && !sKey.startsWith("xmlns")) {
71
+ Log.warning(`Unchecked parameter: ${sName}: ${sKey}`, undefined, LOGGER_SCOPE);
72
+ }
73
+ });
74
+ }
75
+ _exports.validateMacroSignature = validateMacroSignature;
76
+ const SAP_UI_CORE_ELEMENT = "sap.ui.core.Element";
77
+ const SAP_UI_MODEL_CONTEXT = "sap.ui.model.Context";
78
+
79
+ /**
80
+ * Transforms the metadata of a building block by adding additional aggregations,
81
+ * and splitting properties into actual properties and metadata contexts.
82
+ *
83
+ * @param buildingBlockMetadata The metadata received from the input
84
+ * @returns The transformed metadata
85
+ */
86
+ _exports.SAP_UI_MODEL_CONTEXT = SAP_UI_MODEL_CONTEXT;
87
+ function transformMetadata(buildingBlockMetadata) {
88
+ const properties = {};
89
+ const aggregations = {
90
+ dependents: {
91
+ type: SAP_UI_CORE_ELEMENT,
92
+ slot: "dependents"
93
+ },
94
+ customData: {
95
+ type: SAP_UI_CORE_ELEMENT,
96
+ slot: "customData"
97
+ },
98
+ ...buildingBlockMetadata.aggregations
99
+ };
100
+ const metadataContexts = {};
101
+ for (const propertyName of Object.keys(buildingBlockMetadata.properties)) {
102
+ const propertyType = buildingBlockMetadata.properties[propertyName].type;
103
+ if (propertyType !== SAP_UI_MODEL_CONTEXT) {
104
+ properties[propertyName] = buildingBlockMetadata.properties[propertyName];
105
+ }
106
+ if ([SAP_UI_MODEL_CONTEXT, "object", "array"].includes(propertyType)) {
107
+ // Explicitly defined contexts, objects, and arrays may come from the metadataContext
108
+ metadataContexts[propertyName] = buildingBlockMetadata.properties[propertyName];
109
+ }
110
+ }
111
+ return {
112
+ ...buildingBlockMetadata,
113
+ properties,
114
+ metadataContexts,
115
+ aggregations
116
+ };
117
+ }
118
+
119
+ /**
120
+ * Checks the absolute or context paths and returns an appropriate MetaContext.
121
+ *
122
+ * @param oSettings Additional settings
123
+ * @param sAttributeValue The attribute value
124
+ * @returns The meta data context object
125
+ */
126
+ function _checkAbsoluteAndContextPaths(oSettings, sAttributeValue) {
127
+ let sMetaPath;
128
+ if (sAttributeValue && sAttributeValue.startsWith("/")) {
129
+ // absolute path - we just use this one
130
+ sMetaPath = sAttributeValue;
131
+ } else {
132
+ let sContextPath = oSettings.currentContextPath.getPath();
133
+ if (!sContextPath.endsWith("/")) {
134
+ sContextPath += "/";
135
+ }
136
+ sMetaPath = sContextPath + sAttributeValue;
137
+ }
138
+ return {
139
+ model: "metaModel",
140
+ path: sMetaPath
141
+ };
142
+ }
143
+
144
+ /**
145
+ * This method helps to create the metadata context in case it is not yet available in the store.
146
+ *
147
+ * @param oSettings Additional settings
148
+ * @param sAttributeName The attribute name
149
+ * @param sAttributeValue The attribute value
150
+ * @returns The meta data context object
151
+ */
152
+ function _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue) {
153
+ let returnContext;
154
+ if (sAttributeValue.startsWith("/uid--") && !oSettings.models.converterContext.getProperty(sAttributeValue)) {
155
+ const data = unstoreObjectValue(sAttributeValue);
156
+ oSettings.models.converterContext.setProperty(sAttributeValue, data);
157
+ returnContext = {
158
+ model: "converterContext",
159
+ path: sAttributeValue
160
+ };
161
+ } else if (sAttributeName === "metaPath" && oSettings.currentContextPath || sAttributeName === "contextPath") {
162
+ returnContext = _checkAbsoluteAndContextPaths(oSettings, sAttributeValue);
163
+ } else if (sAttributeValue && sAttributeValue.startsWith("/")) {
164
+ // absolute path - we just use this one
165
+ returnContext = {
166
+ model: "metaModel",
167
+ path: sAttributeValue
168
+ };
169
+ } else {
170
+ returnContext = {
171
+ model: "metaModel",
172
+ path: oSettings.bindingContexts.entitySet ? oSettings.bindingContexts.entitySet.getPath(sAttributeValue) : sAttributeValue
173
+ };
174
+ }
175
+ return returnContext;
176
+ }
177
+ function _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, isOpen) {
178
+ let oMetadataContext;
179
+ if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
180
+ const sAttributeValue = oNode.getAttribute(sAttributeName);
181
+ oMetadataContext = BindingParser.complexParser(sAttributeValue);
182
+ if (!oMetadataContext) {
183
+ oMetadataContext = _createInitialMetadataContext(oSettings, sAttributeName, sAttributeValue);
184
+ }
185
+ } else if (oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
186
+ oMetadataContext = {
187
+ model: sAttributeName,
188
+ path: ""
189
+ };
190
+ } else if (isOpen) {
191
+ try {
192
+ if (oVisitor.getContext(`${sAttributeName}>`)) {
193
+ oMetadataContext = {
194
+ model: sAttributeName,
195
+ path: ""
196
+ };
197
+ }
198
+ } catch (e) {
199
+ return undefined;
200
+ }
201
+ }
202
+ return oMetadataContext;
203
+ }
204
+
205
+ /**
206
+ * Parse the incoming XML node and try to resolve the properties defined there.
207
+ *
208
+ * @param oMetadata The metadata for the building block
209
+ * @param oNode The XML node to parse
210
+ * @param isPublic Whether the building block is used in a public context or not
211
+ * @param oVisitor The visitor instance
212
+ */
213
+ async function processProperties(oMetadata, oNode, isPublic, oVisitor) {
214
+ const oDefinitionProperties = oMetadata.properties;
215
+
216
+ // Retrieve properties values
217
+ const aDefinitionPropertiesKeys = Object.keys(oDefinitionProperties);
218
+ const propertyValues = {};
219
+ for (const sKeyValue of aDefinitionPropertiesKeys) {
220
+ if (oDefinitionProperties[sKeyValue].type === "object") {
221
+ propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue && deepClone(oDefinitionProperties[sKeyValue].defaultValue); // To avoid values being reused across macros
222
+ } else {
223
+ propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
224
+ }
225
+ if (oNode.hasAttribute(sKeyValue) && isPublic && oDefinitionProperties[sKeyValue].isPublic === false) {
226
+ Log.error(`Property ${sKeyValue} was ignored as it is not intended for public usage`);
227
+ } else if (oNode.hasAttribute(sKeyValue)) {
228
+ await oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue));
229
+ let value = oNode.getAttribute(sKeyValue);
230
+ if (value !== undefined && value !== null) {
231
+ if (typeof value === "string" && !value.startsWith("{")) {
232
+ switch (oDefinitionProperties[sKeyValue].type) {
233
+ case "boolean":
234
+ value = value === "true";
235
+ break;
236
+ case "number":
237
+ value = Number(value);
238
+ break;
239
+ }
240
+ }
241
+ value = value === null ? undefined : value;
242
+ propertyValues[sKeyValue] = value;
243
+ }
244
+ }
245
+ }
246
+ return propertyValues;
247
+ }
248
+
249
+ /**
250
+ * Parse the incoming XML node and try to resolve the binding contexts defined inside.
251
+ *
252
+ * @param oMetadata The metadata for the building block
253
+ * @param oSettings The settings object
254
+ * @param oNode The XML node to parse
255
+ * @param isPublic Whether the building block is used in a public context or not
256
+ * @param oVisitor The visitor instance
257
+ * @param mContexts The contexts to be used
258
+ * @param propertyValues The current property values
259
+ * @returns The processed and missing contexts
260
+ */
261
+ function processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, propertyValues) {
262
+ oSettings.currentContextPath = oSettings.bindingContexts.contextPath;
263
+ const mMissingContext = {};
264
+ const oDefinitionContexts = oMetadata.metadataContexts;
265
+ const aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
266
+ // Since the metaPath and other property can be relative to the contextPath we need to evaluate the current contextPath first
267
+ const contextPathIndex = aDefinitionContextsKeys.indexOf("contextPath");
268
+ if (contextPathIndex !== -1) {
269
+ // If it is defined we extract it and reinsert it in the first position of the array
270
+ const contextPathDefinition = aDefinitionContextsKeys.splice(contextPathIndex, 1);
271
+ aDefinitionContextsKeys.splice(0, 0, contextPathDefinition[0]);
272
+ }
273
+ for (const sAttributeName of aDefinitionContextsKeys) {
274
+ // If the context was resolved as a property (binding / xml aggregation) then we don't need to resolve it here.
275
+ const propertyValue = propertyValues[sAttributeName];
276
+ if (propertyValue !== undefined && typeof propertyValue === "object" && Object.keys(propertyValue).length > 0) {
277
+ delete oMetadata.metadataContexts[sAttributeName];
278
+ continue;
279
+ }
280
+ const bDoNotResolve = isPublic && oDefinitionContexts[sAttributeName].isPublic === false && oNode.hasAttribute(sAttributeName);
281
+ const oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen ?? false);
282
+ if (oMetadataContext) {
283
+ oMetadataContext.name = sAttributeName;
284
+ addSingleContext(mContexts, oVisitor, oMetadataContext);
285
+ if ((sAttributeName === "entitySet" || sAttributeName === "contextPath") && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
286
+ oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
287
+ }
288
+ if (sAttributeName === "contextPath") {
289
+ oSettings.currentContextPath = mContexts[sAttributeName];
290
+ }
291
+ if (mContexts[sAttributeName] !== undefined) {
292
+ propertyValues[sAttributeName] = mContexts[sAttributeName];
293
+ } else if (typeof propertyValues[sAttributeName] === "string") {
294
+ // If the binding couldn't be resolved consider that there was no value here
295
+ delete oMetadata.metadataContexts[sAttributeName];
296
+ }
297
+ } else {
298
+ mMissingContext[sAttributeName] = true;
299
+ }
300
+ }
301
+ return mMissingContext;
302
+ }
303
+ function parseAggregation(oAggregation, processAggregations) {
304
+ const oOutObjects = {};
305
+ if (oAggregation && oAggregation.children.length > 0) {
306
+ const children = oAggregation.children;
307
+ for (let childIdx = 0; childIdx < children.length; childIdx++) {
308
+ const childDefinition = children[childIdx];
309
+ let childKey = childDefinition.getAttribute("key") || childDefinition.getAttribute("id");
310
+ if (childKey) {
311
+ childKey = `InlineXML_${childKey}`;
312
+ childDefinition.setAttribute("key", childKey);
313
+ let aggregationObject = {
314
+ key: childKey,
315
+ position: {
316
+ placement: childDefinition.getAttribute("placement") || Placement.After,
317
+ anchor: childDefinition.getAttribute("anchor") || undefined
318
+ },
319
+ type: "Slot"
320
+ };
321
+ if (processAggregations) {
322
+ aggregationObject = processAggregations(childDefinition, aggregationObject);
323
+ }
324
+ oOutObjects[aggregationObject.key] = aggregationObject;
325
+ } else if (childDefinition.tagName !== "slot") {
326
+ Log.error(`The aggregation ${childDefinition.nodeName} is missing a Key attribute. It is not displayed`);
327
+ }
328
+ }
329
+ }
330
+ return oOutObjects;
331
+ }
332
+
333
+ /**
334
+ * Processes the child nodes of the building block and parses them as either aggregations or object-/array-based values.
335
+ *
336
+ * @param oNode The XML node for which to process the children
337
+ * @param oVisitor The visitor instance
338
+ * @param oMetadata The metadata for the building block
339
+ * @param isPublic Whether the building block is used in a public context or not
340
+ * @param propertyValues The values of already parsed property
341
+ */
342
+ async function processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues) {
343
+ const oAggregations = {};
344
+ if (oNode.firstElementChild !== null) {
345
+ let oFirstElementChild = oNode.firstElementChild;
346
+ while (oFirstElementChild !== null) {
347
+ if (oFirstElementChild.namespaceURI === XMLTEMPLATING_NS) {
348
+ // In case we encounter a templating tag, run the visitor on it and continue with the resulting child
349
+ const oParent = oFirstElementChild.parentNode;
350
+ if (oParent) {
351
+ const iChildIndex = Array.from(oParent.children).indexOf(oFirstElementChild);
352
+ await oVisitor.visitNode(oFirstElementChild);
353
+ oFirstElementChild = oParent.children[iChildIndex] ? oParent.children[iChildIndex] : null;
354
+ } else {
355
+ // Not sure how this could happen but I also don't want to create infinite loops
356
+ oFirstElementChild = oFirstElementChild.nextElementSibling;
357
+ }
358
+ } else {
359
+ const sChildName = oFirstElementChild.localName;
360
+ let sAggregationName = sChildName;
361
+ if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
362
+ // not a sub aggregation, go back to default Aggregation
363
+ sAggregationName = oMetadata.defaultAggregation || "";
364
+ }
365
+ const aggregationDefinition = oMetadata.aggregations[sAggregationName];
366
+ if (aggregationDefinition !== undefined && !aggregationDefinition.slot) {
367
+ const parsedAggregation = parseAggregation(oFirstElementChild, aggregationDefinition.processAggregations);
368
+ propertyValues[sAggregationName] = parsedAggregation;
369
+ for (const parsedAggregationKey in parsedAggregation) {
370
+ oMetadata.aggregations[parsedAggregationKey] = parsedAggregation[parsedAggregationKey];
371
+ }
372
+ }
373
+ oFirstElementChild = oFirstElementChild.nextElementSibling;
374
+ }
375
+ }
376
+ oFirstElementChild = oNode.firstElementChild;
377
+ while (oFirstElementChild !== null) {
378
+ const oNextChild = oFirstElementChild.nextElementSibling;
379
+ const sChildName = oFirstElementChild.localName;
380
+ let sAggregationName = sChildName;
381
+ if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
382
+ // not a sub aggregation, go back to default Aggregation
383
+ sAggregationName = oMetadata.defaultAggregation || "";
384
+ }
385
+ if (Object.keys(oMetadata.aggregations).indexOf(sAggregationName) !== -1 && (!isPublic || oMetadata.aggregations[sAggregationName].isPublic === true)) {
386
+ const aggregationDefinition = oMetadata.aggregations[sAggregationName];
387
+ if (!aggregationDefinition.slot && oFirstElementChild !== null && oFirstElementChild.children.length > 0) {
388
+ await oVisitor.visitNode(oFirstElementChild);
389
+ let childDefinition = oFirstElementChild.firstElementChild;
390
+ while (childDefinition) {
391
+ const nextChild = childDefinition.nextElementSibling;
392
+ if (!aggregationDefinition.hasVirtualNode) {
393
+ const childWrapper = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
394
+ childWrapper.appendChild(childDefinition);
395
+ oAggregations[childDefinition.getAttribute("key")] = childWrapper;
396
+ } else {
397
+ oAggregations[childDefinition.getAttribute("key")] = childDefinition;
398
+ }
399
+ childDefinition.removeAttribute("key");
400
+ childDefinition = nextChild;
401
+ }
402
+ } else if (aggregationDefinition.slot) {
403
+ await oVisitor.visitNode(oFirstElementChild);
404
+ if (sAggregationName !== sChildName) {
405
+ if (!oAggregations[sAggregationName]) {
406
+ const oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
407
+ oAggregations[sAggregationName] = oNewChild;
408
+ }
409
+ oAggregations[sAggregationName].appendChild(oFirstElementChild);
410
+ } else {
411
+ oAggregations[sAggregationName] = oFirstElementChild;
412
+ }
413
+ }
414
+ } else if (Object.keys(oMetadata.properties).indexOf(sAggregationName) !== -1) {
415
+ await oVisitor.visitNode(oFirstElementChild);
416
+ if (oMetadata.properties[sAggregationName].type === "object") {
417
+ // Object Type properties
418
+ const aggregationPropertyValues = {};
419
+ const attributeNames = oFirstElementChild.getAttributeNames();
420
+ for (const attributeName of attributeNames) {
421
+ aggregationPropertyValues[attributeName] = oFirstElementChild.getAttribute(attributeName);
422
+ }
423
+ if (oFirstElementChild.children.length) {
424
+ //retrieve one level subObject properties
425
+ for (let childIndex = 0; childIndex < oFirstElementChild.children.length; childIndex++) {
426
+ const subChild = oFirstElementChild.children[childIndex];
427
+ const subObjectKey = subChild.localName;
428
+ const subObject = {};
429
+ const subChildAttributeNames = subChild.getAttributeNames();
430
+ for (const subChildAttributeName of subChildAttributeNames) {
431
+ subObject[subChildAttributeName] = subChild.getAttribute(subChildAttributeName);
432
+ }
433
+ aggregationPropertyValues[subObjectKey] = subObject;
434
+ }
435
+ }
436
+ propertyValues[sAggregationName] = aggregationPropertyValues;
437
+ } else if (oMetadata.properties[sAggregationName].type === "array") {
438
+ if (oFirstElementChild !== null && oFirstElementChild.children.length > 0) {
439
+ const children = oFirstElementChild.children;
440
+ const oOutObjects = [];
441
+ for (let childIdx = 0; childIdx < children.length; childIdx++) {
442
+ const childDefinition = children[childIdx];
443
+ // non keyed child, just add it to the aggregation
444
+ const myChild = {};
445
+ const attributeNames = childDefinition.getAttributeNames();
446
+ for (const attributeName of attributeNames) {
447
+ myChild[attributeName] = childDefinition.getAttribute(attributeName);
448
+ }
449
+ oOutObjects.push(myChild);
450
+ }
451
+ propertyValues[sAggregationName] = oOutObjects;
452
+ }
453
+ }
454
+ }
455
+ oFirstElementChild = oNextChild;
456
+ }
457
+ }
458
+ return oAggregations;
459
+ }
460
+ function processSlots(oAggregations, oMetadataAggregations, oNode) {
461
+ let processCustomData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
462
+ if (Object.keys(oAggregations).length > 0) {
463
+ Object.keys(oAggregations).forEach(function (sAggregationName) {
464
+ const oAggregationElement = oAggregations[sAggregationName];
465
+ if (oNode !== null && oNode !== undefined && oAggregationElement) {
466
+ // slots can have :: as keys which is not a valid aggregation name therefore replacing them
467
+ const oElementChild = oAggregationElement.firstElementChild;
468
+ if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
469
+ const sSlotName = oMetadataAggregations[sAggregationName] !== undefined && oMetadataAggregations[sAggregationName].slot || sAggregationName;
470
+ const oTargetElement = oNode.querySelector(`slot[name='${sSlotName}']`);
471
+ if (oTargetElement !== null) {
472
+ const oNewChild = prepareAggregationElement(oNode, sAggregationName, oElementChild);
473
+ oTargetElement.replaceWith(...oNewChild.children); // Somehow TS doesn't like this but the documentation says is should work
474
+ }
475
+ } else if (processCustomData && oElementChild !== null) {
476
+ const oNewChild = prepareAggregationElement(oNode, sAggregationName, oElementChild);
477
+ oNode.appendChild(oNewChild);
478
+ }
479
+ }
480
+ });
481
+ }
482
+ }
483
+ function prepareAggregationElement(oNode, sAggregationName, oElementChild) {
484
+ const oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName.replace(/:/gi, "_"));
485
+ while (oElementChild) {
486
+ const oNextChild = oElementChild.nextElementSibling;
487
+ oNewChild.appendChild(oElementChild);
488
+ oElementChild = oNextChild;
489
+ }
490
+ return oNewChild;
491
+ }
492
+ async function processBuildingBlock(BuildingBlockClass, oNode, oVisitor) {
493
+ let isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
494
+ const oMetadata = transformMetadata(BuildingBlockClass.metadata);
495
+ const sFragmentName = oMetadata.fragment || `${oMetadata.namespace}.${oMetadata.xmlTag || oMetadata.name}`;
496
+ const mContexts = {};
497
+ const oSettings = oVisitor.getSettings();
498
+
499
+ // Add an empty converter context if there is none in order to have a place to store object values
500
+ oSettings.models.converterContext ??= new JSONModel();
501
+
502
+ //Inject storage for macros
503
+ if (!oSettings[sFragmentName]) {
504
+ oSettings[sFragmentName] = {};
505
+ }
506
+
507
+ // First of all we need to visit the attributes to resolve the properties and the metadata contexts
508
+ const propertyValues = await processProperties(oMetadata, oNode, isPublic, oVisitor);
509
+ const initialKeys = Object.keys(propertyValues);
510
+ const mMissingContext = processContexts(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, propertyValues);
511
+ try {
512
+ // Aggregation and complex type support
513
+ const oAggregations = await processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues);
514
+ let oControlConfig = {};
515
+ if (oSettings.models.viewData) {
516
+ // Only used in the Field macro and even then maybe not really useful
517
+ oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
518
+ }
519
+ let processedPropertyValues = propertyValues;
520
+ Object.keys(propertyValues).forEach(propName => {
521
+ var _BuildingBlockClass$m, _oData, _oData$isA;
522
+ let oData = propertyValues[propName];
523
+ //check for additional processing function to validate / overwrite parameters
524
+ const originalDefinition = BuildingBlockClass === null || BuildingBlockClass === void 0 ? void 0 : (_BuildingBlockClass$m = BuildingBlockClass.metadata) === null || _BuildingBlockClass$m === void 0 ? void 0 : _BuildingBlockClass$m.properties[propName];
525
+ if (originalDefinition !== null && originalDefinition !== void 0 && originalDefinition.validate) {
526
+ oData = originalDefinition.validate(oData) || oData;
527
+ }
528
+ if ((_oData = oData) !== null && _oData !== void 0 && (_oData$isA = _oData.isA) !== null && _oData$isA !== void 0 && _oData$isA.call(_oData, SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
529
+ propertyValues[propName] = oData.getObject();
530
+ }
531
+ });
532
+ propertyValues.isPublic = isPublic;
533
+ const oInstance = new BuildingBlockClass({
534
+ ...propertyValues,
535
+ ...oAggregations
536
+ }, oControlConfig, oSettings);
537
+ processedPropertyValues = oInstance.getProperties();
538
+ Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
539
+ if (processedPropertyValues.hasOwnProperty(sContextName)) {
540
+ const targetObject = processedPropertyValues[sContextName];
541
+ if (typeof targetObject === "object" && !isContext(targetObject)) {
542
+ const attributeValue = storeObjectValue(targetObject);
543
+ oSettings.models.converterContext.setProperty(attributeValue, targetObject);
544
+ const newContext = oSettings.models.converterContext.createBindingContext(attributeValue);
545
+ unstoreObjectValue(attributeValue);
546
+ mContexts[sContextName] = newContext;
547
+ } else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
548
+ mContexts[sContextName] = targetObject;
549
+ }
550
+ }
551
+ });
552
+ const oAttributesModel = new AttributeModel(oNode, processedPropertyValues, BuildingBlockClass);
553
+ mContexts["this"] = oAttributesModel.createBindingContext("/");
554
+ let oPreviousMacroInfo;
555
+
556
+ // Keep track
557
+ if (TraceInfo.isTraceInfoActive()) {
558
+ const oTraceInfo = TraceInfo.traceMacroCalls(sFragmentName, oMetadata, mContexts, oNode, oVisitor);
559
+ if (oTraceInfo !== null && oTraceInfo !== void 0 && oTraceInfo.macroInfo) {
560
+ oPreviousMacroInfo = oSettings["_macroInfo"];
561
+ oSettings["_macroInfo"] = oTraceInfo.macroInfo;
562
+ }
563
+ }
564
+ validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
565
+ const oContextVisitor = oVisitor.with(mContexts, oMetadata.isOpen !== undefined ? !oMetadata.isOpen : true);
566
+ const oParent = oNode.parentNode;
567
+ let iChildIndex;
568
+ let oPromise;
569
+ if (oParent) {
570
+ iChildIndex = Array.from(oParent.children).indexOf(oNode);
571
+ if (oMetadata.fragment) {
572
+ oPromise = oContextVisitor.insertFragment(sFragmentName, oNode);
573
+ } else {
574
+ const templateString = await oInstance.getTemplate(oNode);
575
+ if (BuildingBlockClass.isRuntime) {
576
+ // For runtime building blocks, we need to attach all objects to the converterContext directly, as the actual rendering takes place at runtime
577
+ for (const storeKey in temporaryObjectStore) {
578
+ const data = unstoreObjectValue(storeKey);
579
+ oSettings.models.converterContext.setProperty(storeKey, data);
580
+ }
581
+ }
582
+ let hasError = "";
583
+ if (templateString) {
584
+ let hasParseError = false;
585
+ let parsedTemplate = parseXMLString(templateString, true);
586
+ // For safety purpose we try to detect trailing text in between XML Tags
587
+ for (const element of parsedTemplate) {
588
+ const iter = document.createNodeIterator(element, NodeFilter.SHOW_TEXT);
589
+ let textnode = iter.nextNode();
590
+ if (element.localName === "parsererror") {
591
+ hasParseError = true;
592
+ }
593
+ while (textnode) {
594
+ if (textnode.textContent && textnode.textContent.trim().length > 0) {
595
+ hasError = textnode.textContent;
596
+ }
597
+ textnode = iter.nextNode();
598
+ }
599
+ }
600
+ if (hasParseError) {
601
+ // If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
602
+ // Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
603
+ // If an error is found it's returned instead of the normal fragment
604
+ Log.error(`Error while processing building block ${oMetadata.xmlTag || oMetadata.name}`);
605
+ parsedTemplate = await processXmlInTrace(async () => {
606
+ var _oInstance$getTemplat;
607
+ const initialTemplate = await ((_oInstance$getTemplat = oInstance.getTemplate) === null || _oInstance$getTemplat === void 0 ? void 0 : _oInstance$getTemplat.call(oInstance, oNode));
608
+ return parseXMLString(initialTemplate ?? "", true);
609
+ });
610
+ } else if (hasError.length > 0) {
611
+ // If there is trailing text we create a standard error and display it.
612
+ Log.error(`Error while processing building block ${oMetadata.xmlTag || oMetadata.name}`);
613
+ const oErrorText = createErrorXML([`Error while processing building block ${oMetadata.xmlTag || oMetadata.name}`, `Trailing text was found in the XML: ${hasError}`], parsedTemplate.map(template => template.outerHTML).join("\n"));
614
+ parsedTemplate = parseXMLString(oErrorText, true);
615
+ }
616
+ oNode.replaceWith(...parsedTemplate);
617
+ oNode = oParent.children[iChildIndex];
618
+ processSlots(oAggregations, oMetadata.aggregations, oNode, false);
619
+ oPromise = oContextVisitor.visitNode(oNode);
620
+ } else {
621
+ oNode.remove();
622
+ oPromise = Promise.resolve();
623
+ }
624
+ }
625
+ await oPromise;
626
+ const oMacroElement = oParent.children[iChildIndex];
627
+ processSlots(oAggregations, oMetadata.aggregations, oMacroElement, true);
628
+ if (oMacroElement !== undefined) {
629
+ const oRemainingSlots = oMacroElement.querySelectorAll("slot");
630
+ oRemainingSlots.forEach(function (oSlotElement) {
631
+ oSlotElement.remove();
632
+ });
633
+ }
634
+ }
635
+ if (oPreviousMacroInfo) {
636
+ //restore macro info if available
637
+ oSettings["_macroInfo"] = oPreviousMacroInfo;
638
+ } else {
639
+ delete oSettings["_macroInfo"];
640
+ }
641
+ } catch (e) {
642
+ // In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
643
+ const traceDetails = {
644
+ initialProperties: {},
645
+ resolvedProperties: {},
646
+ missingContexts: mMissingContext
647
+ };
648
+ for (const propertyName of initialKeys) {
649
+ const propertyValue = propertyValues[propertyName];
650
+ if (isContext(propertyValue)) {
651
+ traceDetails.initialProperties[propertyName] = {
652
+ path: propertyValue.getPath(),
653
+ value: propertyValue.getObject()
654
+ };
655
+ } else {
656
+ traceDetails.initialProperties[propertyName] = propertyValue;
657
+ }
658
+ }
659
+ for (const propertyName in propertyValues) {
660
+ const propertyValue = propertyValues[propertyName];
661
+ if (!initialKeys.includes(propertyName)) {
662
+ if (isContext(propertyValue)) {
663
+ traceDetails.resolvedProperties[propertyName] = {
664
+ path: propertyValue.getPath(),
665
+ value: propertyValue.getObject()
666
+ };
667
+ } else {
668
+ traceDetails.resolvedProperties[propertyName] = propertyValue;
669
+ }
670
+ }
671
+ }
672
+ Log.error(e);
673
+ const oError = createErrorXML([`Error while processing building block ${oMetadata.name}`], oNode.outerHTML, traceDetails, e.stack);
674
+ const oTemplate = parseXMLString(oError, true);
675
+ oNode.replaceWith(...oTemplate);
676
+ }
677
+ }
678
+ function addSingleContext(mContexts, oVisitor, oCtx) {
679
+ const sKey = oCtx.name || oCtx.model || undefined;
680
+ if (mContexts[sKey]) {
681
+ return; // do not add twice
682
+ }
683
+
684
+ try {
685
+ let sContextPath = oCtx.path;
686
+ if (oCtx.model !== null) {
687
+ sContextPath = `${oCtx.model}>${sContextPath}`;
688
+ }
689
+ const mSetting = oVisitor.getSettings();
690
+ if (oCtx.model === "converterContext" && oCtx.path.length > 0) {
691
+ mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path /*, mSetting.bindingContexts[oCtx.model]*/); // add the context to the visitor
692
+ } else if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
693
+ mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
694
+ } else {
695
+ mContexts[sKey] = oVisitor.getContext(sContextPath); // add the context to the visitor
696
+ }
697
+ } catch (ex) {
698
+ // ignore the context as this can only be the case if the model is not ready,
699
+ // i.e. not a preprocessing model but maybe a model for providing afterwards
700
+ }
701
+ }
702
+
703
+ /**
704
+ * Register a building block definition to be used inside the xml template processor.
705
+ *
706
+ * @param BuildingBlockClass The building block definition
707
+ */
708
+ function registerBuildingBlock(BuildingBlockClass) {
709
+ XMLPreprocessor.plugIn(async (oNode, oVisitor) => processBuildingBlock(BuildingBlockClass, oNode, oVisitor), BuildingBlockClass.metadata.namespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
710
+ if (BuildingBlockClass.metadata.publicNamespace) {
711
+ XMLPreprocessor.plugIn(async (oNode, oVisitor) => processBuildingBlock(BuildingBlockClass, oNode, oVisitor, true), BuildingBlockClass.metadata.publicNamespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
712
+ }
713
+ }
714
+
715
+ /**
716
+ * UnRegister a building block definition so that it is no longer used inside the xml template processor.
717
+ *
718
+ * @param BuildingBlockClass The building block definition
719
+ */
720
+ _exports.registerBuildingBlock = registerBuildingBlock;
721
+ function unregisterBuildingBlock(BuildingBlockClass) {
722
+ if (BuildingBlockClass.metadata.namespace !== undefined) {
723
+ XMLPreprocessor.plugIn(null, BuildingBlockClass.metadata.namespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
724
+ }
725
+ if (BuildingBlockClass.metadata.publicNamespace !== undefined) {
726
+ XMLPreprocessor.plugIn(null, BuildingBlockClass.metadata.publicNamespace, BuildingBlockClass.metadata.xmlTag || BuildingBlockClass.metadata.name);
727
+ }
728
+ }
729
+ _exports.unregisterBuildingBlock = unregisterBuildingBlock;
730
+ function createErrorXML(errorMessages, xmlFragment, additionalData, stack) {
731
+ const errorLabels = errorMessages.map(errorMessage => xml`<m:Label text="${escapeXMLAttributeValue(errorMessage)}"/>`);
732
+ let errorStack = "";
733
+ if (stack) {
734
+ const stackFormatted = btoa(`<pre>${stack}</pre>`);
735
+ errorStack = xml`<m:FormattedText htmlText="${`{= BBF.base64Decode('${stackFormatted}') }`}" />`;
736
+ }
737
+ let additionalText = "";
738
+ if (additionalData) {
739
+ additionalText = xml`<m:VBox>
740
+ <m:Label text="Trace Info"/>
741
+ <code:CodeEditor type="json" value="${`{= BBF.base64Decode('${btoa(JSON.stringify(additionalData, null, 4))}') }`}" height="300px" />
742
+ </m:VBox>`;
743
+ }
744
+ return xml`<controls:FormElementWrapper xmlns:controls="sap.fe.core.controls">
745
+ <m:VBox xmlns:m="sap.m" xmlns:code="sap.ui.codeeditor" core:require="{BBF:'sap/fe/core/buildingBlocks/BuildingBlockFormatter'}">
746
+ ${errorLabels}
747
+ ${errorStack}
748
+ <grid:CSSGrid gridTemplateRows="fr" gridTemplateColumns="repeat(2,1fr)" gridGap="1rem" xmlns:grid="sap.ui.layout.cssgrid" >
749
+ <m:VBox>
750
+ <m:Label text="How the building block was called"/>
751
+ <code:CodeEditor type="xml" value="${`{= BBF.base64Decode('${btoa(xmlFragment.replaceAll("&gt;", ">"))}') }`}" height="300px" />
752
+ </m:VBox>
753
+ ${additionalText}
754
+ </grid:CSSGrid>
755
+ </m:VBox>
756
+ </controls:FormElementWrapper>`;
757
+ }
758
+ const temporaryObjectStore = {};
759
+
760
+ /**
761
+ * Stores an object value in a temporary storage and returns an ID used to retrieve this value at a later point in time.
762
+ *
763
+ * Required as there is functionality like the xml` function, which might take objects as parameters but needs to return a serialized string.
764
+ *
765
+ * @param value Value to store
766
+ * @returns ID to retrieve this value
767
+ */
768
+ function storeObjectValue(value) {
769
+ const propertyUID = `/uid--${uid()}`;
770
+ temporaryObjectStore[propertyUID] = value;
771
+ return propertyUID;
772
+ }
773
+
774
+ /**
775
+ * Unstores an object from a temporary store by removing it and returning its object value.
776
+ *
777
+ * @param propertyUID ID to retrieve this value
778
+ * @returns Object value
779
+ */
780
+ function unstoreObjectValue(propertyUID) {
781
+ const value = temporaryObjectStore[propertyUID];
782
+ delete temporaryObjectStore[propertyUID];
783
+ return value;
784
+ }
785
+ let processNextXmlInTrace = false;
786
+ /**
787
+ * Makes sure that all xml` calls inside the given method are processed in trace mode.
788
+ *
789
+ * @param method The method to execute
790
+ * @returns The return value of the given method
791
+ */
792
+ const processXmlInTrace = function (method) {
793
+ processNextXmlInTrace = true;
794
+ let returnValue;
795
+ try {
796
+ returnValue = method();
797
+ } finally {
798
+ processNextXmlInTrace = false;
799
+ }
800
+ return returnValue;
801
+ };
802
+
803
+ /**
804
+ * Parse an XML string and return the associated document.
805
+ *
806
+ * @param xmlString The xml string
807
+ * @param [addDefaultNamespaces] Whether or not default namespaces should be added
808
+ * @returns The XML document.
809
+ */
810
+ function parseXMLString(xmlString) {
811
+ var _output2, _output3;
812
+ let addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
813
+ if (addDefaultNamespaces) {
814
+ xmlString = `<template
815
+ xmlns:template="http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1"
816
+ xmlns:m="sap.m"
817
+ xmlns:macros="sap.fe.macros"
818
+ xmlns:core="sap.ui.core"
819
+ xmlns:mdc="sap.ui.mdc"
820
+ xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1">${xmlString}</template>`;
821
+ }
822
+ const xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
823
+ let output = xmlDocument.firstElementChild;
824
+ while (((_output = output) === null || _output === void 0 ? void 0 : _output.localName) === "template") {
825
+ var _output;
826
+ output = output.firstElementChild;
827
+ }
828
+ const children = (_output2 = output) !== null && _output2 !== void 0 && _output2.parentElement ? (_output3 = output) === null || _output3 === void 0 ? void 0 : _output3.parentElement.children : [output];
829
+ return Array.from(children);
830
+ }
831
+
832
+ /**
833
+ * Escape an XML attribute value.
834
+ *
835
+ * @param value The attribute value to escape.
836
+ * @returns The escaped string.
837
+ */
838
+ _exports.parseXMLString = parseXMLString;
839
+ function escapeXMLAttributeValue(value) {
840
+ return value === null || value === void 0 ? void 0 : value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
841
+ }
842
+ _exports.escapeXMLAttributeValue = escapeXMLAttributeValue;
843
+ function renderInTraceMode(outStr) {
844
+ var _xmlResult$;
845
+ const xmlResult = parseXMLString(outStr, true);
846
+ if ((xmlResult === null || xmlResult === void 0 ? void 0 : xmlResult.length) > 0 && ((_xmlResult$ = xmlResult[0]) === null || _xmlResult$ === void 0 ? void 0 : _xmlResult$.localName) === "parsererror") {
847
+ const errorMessage = xmlResult[0].innerText || xmlResult[0].innerHTML;
848
+ return createErrorXML([errorMessage.split("\n")[0]], outStr);
849
+ } else {
850
+ return outStr;
851
+ }
852
+ }
853
+ /**
854
+ * Create a string representation of the template literal while handling special object case.
855
+ *
856
+ * @param strings The string parts of the template literal
857
+ * @param values The values part of the template literal
858
+ * @returns The XML string document representing the string that was used.
859
+ */
860
+ const xml = function (strings) {
861
+ let outStr = "";
862
+ let i;
863
+ for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
864
+ values[_key - 1] = arguments[_key];
865
+ }
866
+ for (i = 0; i < values.length; i++) {
867
+ outStr += strings[i];
868
+
869
+ // Handle the different case of object, if it's an array we join them, if it's a binding expression then we compile it.
870
+ const value = values[i];
871
+ if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
872
+ outStr += value.flat(5).join("\n").trim();
873
+ } else if (isFunctionArray(value)) {
874
+ outStr += value.map(valuefn => valuefn()).join("\n");
875
+ } else if (isBindingToolkitExpression(value)) {
876
+ const compiledExpression = compileExpression(value);
877
+ outStr += escapeXMLAttributeValue(compiledExpression);
878
+ } else if (typeof value === "undefined") {
879
+ outStr += "{this>undefinedValue}";
880
+ } else if (typeof value === "function") {
881
+ outStr += value();
882
+ } else if (typeof value === "object" && value !== null) {
883
+ if (isContext(value)) {
884
+ outStr += value.getPath();
885
+ } else {
886
+ const propertyUId = storeObjectValue(value);
887
+ outStr += `${propertyUId}`;
888
+ }
889
+ } else if (value && typeof value === "string" && !value.startsWith("<") && !value.startsWith("&lt;")) {
890
+ outStr += escapeXMLAttributeValue(value);
891
+ } else {
892
+ outStr += value;
893
+ }
894
+ }
895
+ outStr += strings[i];
896
+ outStr = outStr.trim();
897
+ if (processNextXmlInTrace) {
898
+ return renderInTraceMode(outStr);
899
+ }
900
+ return outStr;
901
+ };
902
+ _exports.xml = xml;
903
+ return _exports;
904
+ }, false);
905
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImluZGV4T2YiLCJnZXRQYXRoIiwiJFR5cGUiLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib01ldGFkYXRhIiwib05vZGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsIm1ldGFkYXRhQ29udGV4dHMiLCJPYmplY3QiLCJrZXlzIiwiYVByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiYXR0cmlidXRlTmFtZXMiLCJnZXRBdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWUiLCJmb3JFYWNoIiwib1Byb3BlcnR5U2V0dGluZ3MiLCJoYXNBdHRyaWJ1dGUiLCJzdGFydHNXaXRoIiwiTG9nIiwid2FybmluZyIsIlNBUF9VSV9DT1JFX0VMRU1FTlQiLCJTQVBfVUlfTU9ERUxfQ09OVEVYVCIsInRyYW5zZm9ybU1ldGFkYXRhIiwiYnVpbGRpbmdCbG9ja01ldGFkYXRhIiwiYWdncmVnYXRpb25zIiwiZGVwZW5kZW50cyIsInR5cGUiLCJzbG90IiwiY3VzdG9tRGF0YSIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VHlwZSIsImluY2x1ZGVzIiwiX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMiLCJvU2V0dGluZ3MiLCJzQXR0cmlidXRlVmFsdWUiLCJzTWV0YVBhdGgiLCJzQ29udGV4dFBhdGgiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGF0aCIsIl9jcmVhdGVJbml0aWFsTWV0YWRhdGFDb250ZXh0Iiwic0F0dHJpYnV0ZU5hbWUiLCJyZXR1cm5Db250ZXh0IiwibW9kZWxzIiwiY29udmVydGVyQ29udGV4dCIsImdldFByb3BlcnR5IiwiZGF0YSIsInVuc3RvcmVPYmplY3RWYWx1ZSIsInNldFByb3BlcnR5IiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5U2V0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsIm9WaXNpdG9yIiwiYkRvTm90UmVzb2x2ZSIsImlzT3BlbiIsIm9NZXRhZGF0YUNvbnRleHQiLCJnZXRBdHRyaWJ1dGUiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImdldENvbnRleHQiLCJlIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJpc1B1YmxpYyIsIm9EZWZpbml0aW9uUHJvcGVydGllcyIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJwcm9wZXJ0eVZhbHVlcyIsInNLZXlWYWx1ZSIsImRlZmF1bHRWYWx1ZSIsImRlZXBDbG9uZSIsImVycm9yIiwidmlzaXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVzIiwiZ2V0TmFtZWRJdGVtIiwidmFsdWUiLCJOdW1iZXIiLCJwcm9jZXNzQ29udGV4dHMiLCJjb250ZXh0UGF0aCIsIm1NaXNzaW5nQ29udGV4dCIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyIsImNvbnRleHRQYXRoSW5kZXgiLCJjb250ZXh0UGF0aERlZmluaXRpb24iLCJzcGxpY2UiLCJwcm9wZXJ0eVZhbHVlIiwibGVuZ3RoIiwibmFtZSIsImFkZFNpbmdsZUNvbnRleHQiLCJwYXJzZUFnZ3JlZ2F0aW9uIiwib0FnZ3JlZ2F0aW9uIiwicHJvY2Vzc0FnZ3JlZ2F0aW9ucyIsIm9PdXRPYmplY3RzIiwiY2hpbGRyZW4iLCJjaGlsZElkeCIsImNoaWxkRGVmaW5pdGlvbiIsImNoaWxkS2V5Iiwic2V0QXR0cmlidXRlIiwiYWdncmVnYXRpb25PYmplY3QiLCJrZXkiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwiYW5jaG9yIiwidGFnTmFtZSIsIm5vZGVOYW1lIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsImZpcnN0RWxlbWVudENoaWxkIiwib0ZpcnN0RWxlbWVudENoaWxkIiwibmFtZXNwYWNlVVJJIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIkFycmF5IiwiZnJvbSIsInZpc2l0Tm9kZSIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJsb2NhbE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJwYXJzZWRBZ2dyZWdhdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uS2V5Iiwib05leHRDaGlsZCIsIm5leHRDaGlsZCIsImhhc1ZpcnR1YWxOb2RlIiwiY2hpbGRXcmFwcGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUF0dHJpYnV0ZSIsIm9OZXdDaGlsZCIsImFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXMiLCJjaGlsZEluZGV4Iiwic3ViQ2hpbGQiLCJzdWJPYmplY3RLZXkiLCJzdWJPYmplY3QiLCJzdWJDaGlsZEF0dHJpYnV0ZU5hbWVzIiwic3ViQ2hpbGRBdHRyaWJ1dGVOYW1lIiwibXlDaGlsZCIsInB1c2giLCJwcm9jZXNzU2xvdHMiLCJvTWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJwcm9jZXNzQ3VzdG9tRGF0YSIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvRWxlbWVudENoaWxkIiwic1Nsb3ROYW1lIiwib1RhcmdldEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudCIsInJlcGxhY2VXaXRoIiwicmVwbGFjZSIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwibWV0YWRhdGEiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJ4bWxUYWciLCJnZXRTZXR0aW5ncyIsIkpTT05Nb2RlbCIsImluaXRpYWxLZXlzIiwib0NvbnRyb2xDb25maWciLCJ2aWV3RGF0YSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwicHJvcE5hbWUiLCJvRGF0YSIsIm9yaWdpbmFsRGVmaW5pdGlvbiIsInZhbGlkYXRlIiwiaXNBIiwiZ2V0TW9kZWwiLCJvSW5zdGFuY2UiLCJnZXRQcm9wZXJ0aWVzIiwic0NvbnRleHROYW1lIiwidGFyZ2V0T2JqZWN0IiwiaXNDb250ZXh0IiwiYXR0cmlidXRlVmFsdWUiLCJzdG9yZU9iamVjdFZhbHVlIiwibmV3Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0Iiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwib1ByZXZpb3VzTWFjcm9JbmZvIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9Qcm9taXNlIiwiaW5zZXJ0RnJhZ21lbnQiLCJ0ZW1wbGF0ZVN0cmluZyIsImdldFRlbXBsYXRlIiwiaXNSdW50aW1lIiwic3RvcmVLZXkiLCJ0ZW1wb3JhcnlPYmplY3RTdG9yZSIsImhhc0Vycm9yIiwiaGFzUGFyc2VFcnJvciIsInBhcnNlZFRlbXBsYXRlIiwicGFyc2VYTUxTdHJpbmciLCJlbGVtZW50IiwiaXRlciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwicHJvY2Vzc1htbEluVHJhY2UiLCJpbml0aWFsVGVtcGxhdGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJtYXAiLCJ0ZW1wbGF0ZSIsIm91dGVySFRNTCIsImpvaW4iLCJyZW1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9NYWNyb0VsZW1lbnQiLCJvUmVtYWluaW5nU2xvdHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwib1Nsb3RFbGVtZW50IiwidHJhY2VEZXRhaWxzIiwiaW5pdGlhbFByb3BlcnRpZXMiLCJyZXNvbHZlZFByb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJvRXJyb3IiLCJzdGFjayIsIm9UZW1wbGF0ZSIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwicHVibGljTmFtZXNwYWNlIiwidW5yZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlcnJvclN0YWNrIiwic3RhY2tGb3JtYXR0ZWQiLCJidG9hIiwiYWRkaXRpb25hbFRleHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZUFsbCIsInByb3BlcnR5VUlEIiwidWlkIiwicHJvY2Vzc05leHRYbWxJblRyYWNlIiwibWV0aG9kIiwicmV0dXJuVmFsdWUiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0IiwicGFyZW50RWxlbWVudCIsInJlbmRlckluVHJhY2VNb2RlIiwib3V0U3RyIiwieG1sUmVzdWx0IiwiaW5uZXJUZXh0IiwiaW5uZXJIVE1MIiwic3BsaXQiLCJzdHJpbmdzIiwiaSIsInZhbHVlcyIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tCYXNlXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgaXNDb250ZXh0LCBpc0Z1bmN0aW9uQXJyYXkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFjcm9JbmZvLCBUcmFjZU1ldGFkYXRhQ29udGV4dCB9IGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy5CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmNvbnN0IFhNTFRFTVBMQVRJTkdfTlMgPSBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgJiB7XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcbn07XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIG1ldGEgZGF0YSBjb250ZXh0XG4gKi9cbnR5cGUgTWV0YURhdGFDb250ZXh0ID0ge1xuXHRuYW1lPzogc3RyaW5nO1xuXHRtb2RlbDogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRjdXJyZW50Q29udGV4dFBhdGg6IENvbnRleHQ7XG5cdGlzUHVibGljOiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0bW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbD4gJiB7XG5cdFx0Y29udmVydGVyQ29udGV4dDogSlNPTk1vZGVsO1xuXHRcdHZpZXdEYXRhOiBKU09OTW9kZWw7XG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbDtcblx0XHRcInNhcC5mZS5pMThuXCI/OiBSZXNvdXJjZU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0gb05vZGVcblx0ICogICBUaGUgWE1MIERPTSBub2RlXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0ZyYWdtZW50XG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSBvV2l0aFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zXG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIFtlbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJuc1xuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlXG5cdCAqIEBwYXJhbSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sIGJSZXBsYWNlPzogYm9vbGVhbik6IElWaXNpdG9yQ2FsbGJhY2s7XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIHtcblx0XHQkVHlwZT86IHN0cmluZztcblx0XHQka2luZD86IHN0cmluZztcblx0fTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0T2JqZWN0LiRraW5kICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy4ka2luZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgJGtpbmQgaXMgcGFydCBvZiB0aGUgYWxsb3dlZCBvbmVzXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4ka2luZC5pbmRleE9mKG9Db250ZXh0T2JqZWN0LiRraW5kKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRraW5kJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJGtpbmRcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4ka2luZFxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmIG9Db250ZXh0T2JqZWN0LiRUeXBlICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy4kVHlwZSkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJFR5cGUuaW5kZXhPZihvQ29udGV4dE9iamVjdC4kVHlwZSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRUeXBlXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGVcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdG9Ob2RlOiBFbGVtZW50XG4pIHtcblx0Y29uc3QgYU1ldGFkYXRhQ29udGV4dEtleXMgPSAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpKSB8fCBbXSxcblx0XHRhUHJvcGVydGllcyA9IChvTWV0YWRhdGEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykpIHx8IFtdLFxuXHRcdG9BdHRyaWJ1dGVOYW1lczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuXHQvLyBjb2xsZWN0IGFsbCBhdHRyaWJ1dGVzIHRvIGZpbmQgdW5jaGVja2VkIHByb3BlcnRpZXNcblx0Y29uc3QgYXR0cmlidXRlTmFtZXMgPSBvTm9kZS5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuXHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXR0cmlidXRlTmFtZXMpIHtcblx0XHRvQXR0cmlidXRlTmFtZXNbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXHR9XG5cblx0Ly9DaGVjayBtZXRhZGF0YUNvbnRleHRzXG5cdGFNZXRhZGF0YUNvbnRleHRLZXlzLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHRjb25zdCBvQ29udGV4dFNldHRpbmdzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0tleV07XG5cblx0XHR2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KHNOYW1lLCBtQ29udGV4dHMsIG9Db250ZXh0U2V0dGluZ3MsIHNLZXkpO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdH0pO1xuXHQvL0NoZWNrIHByb3BlcnRpZXNcblx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0eVNldHRpbmdzID0gb01ldGFkYXRhLnByb3BlcnRpZXNbc0tleV07XG5cdFx0aWYgKCFvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleSkpIHtcblx0XHRcdGlmIChvUHJvcGVydHlTZXR0aW5ncy5yZXF1aXJlZCAmJiAhb1Byb3BlcnR5U2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogYCArIGBSZXF1aXJlZCBwcm9wZXJ0eSAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gVW5jaGVja2VkIHByb3BlcnRpZXNcblx0T2JqZWN0LmtleXMob0F0dHJpYnV0ZU5hbWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpIHtcblx0XHQvLyBubyBjaGVjayBmb3IgcHJvcGVydGllcyB3aGljaCBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBTQVBfVUlfTU9ERUxfQ09OVEVYVCA9IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIjtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBtZXRhZGF0YSBvZiBhIGJ1aWxkaW5nIGJsb2NrIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGFnZ3JlZ2F0aW9ucyxcbiAqIGFuZCBzcGxpdHRpbmcgcHJvcGVydGllcyBpbnRvIGFjdHVhbCBwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSBjb250ZXh0cy5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhKTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXHRjb25zdCBhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+ID0ge1xuXHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImRlcGVuZGVudHNcIlxuXHRcdH0sXG5cdFx0Y3VzdG9tRGF0YToge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwiY3VzdG9tRGF0YVwiXG5cdFx0fSxcblx0XHQuLi5idWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zXG5cdH07XG5cdGNvbnN0IG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXS50eXBlO1xuXG5cdFx0aWYgKHByb3BlcnR5VHlwZSAhPT0gU0FQX1VJX01PREVMX0NPTlRFWFQpIHtcblx0XHRcdHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0fVxuXG5cdFx0aWYgKFtTQVBfVUlfTU9ERUxfQ09OVEVYVCwgXCJvYmplY3RcIiwgXCJhcnJheVwiXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpKSB7XG5cdFx0XHQvLyBFeHBsaWNpdGx5IGRlZmluZWQgY29udGV4dHMsIG9iamVjdHMsIGFuZCBhcnJheXMgbWF5IGNvbWUgZnJvbSB0aGUgbWV0YWRhdGFDb250ZXh0XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzW3Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Li4uYnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRcdHByb3BlcnRpZXMsXG5cdFx0bWV0YWRhdGFDb250ZXh0cyxcblx0XHRhZ2dyZWdhdGlvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGFic29sdXRlIG9yIGNvbnRleHQgcGF0aHMgYW5kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgTWV0YUNvbnRleHQuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMob1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLCBzQXR0cmlidXRlVmFsdWU6IHN0cmluZyk6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRwYXRoOiBzTWV0YVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBoZWxwcyB0byBjcmVhdGUgdGhlIG1ldGFkYXRhIGNvbnRleHQgaW4gY2FzZSBpdCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0c0F0dHJpYnV0ZU5hbWU6IHN0cmluZyxcblx0c0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmdcbik6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSAmJiAhb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmdldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSkpIHtcblx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgZGF0YSk7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcImNvbnZlcnRlckNvbnRleHRcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pIHtcblx0bGV0IG9NZXRhZGF0YUNvbnRleHQ6IE1ldGFEYXRhQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBzQXR0cmlidXRlTmFtZSwgc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0cGF0aDogXCJcIlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoaXNPcGVuKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvVmlzaXRvci5nZXRDb250ZXh0KGAke3NBdHRyaWJ1dGVOYW1lfT5gKSkge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9NZXRhZGF0YUNvbnRleHQ7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIHRoZXJlLlxuICpcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2tcbikge1xuXHRjb25zdCBvRGVmaW5pdGlvblByb3BlcnRpZXMgPSBvTWV0YWRhdGEucHJvcGVydGllcztcblxuXHQvLyBSZXRyaWV2ZSBwcm9wZXJ0aWVzIHZhbHVlc1xuXHRjb25zdCBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMob0RlZmluaXRpb25Qcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+ID0ge307XG5cdGZvciAoY29uc3Qgc0tleVZhbHVlIG9mIGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMpIHtcblx0XHRpZiAob0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9XG5cdFx0XHRcdG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSAmJiBkZWVwQ2xvbmUob0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlKTsgLy8gVG8gYXZvaWQgdmFsdWVzIGJlaW5nIHJldXNlZCBhY3Jvc3MgbWFjcm9zXG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSBvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHR9XG5cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uaXNQdWJsaWMgPT09IGZhbHNlKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wZXJ0eVZhbHVlcztcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBiaW5kaW5nIGNvbnRleHRzIGRlZmluZWQgaW5zaWRlLlxuICpcbiAqIEBwYXJhbSBvTWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgYnVpbGRpbmcgYmxvY2tcbiAqIEBwYXJhbSBvU2V0dGluZ3MgVGhlIHNldHRpbmdzIG9iamVjdFxuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSB0byBwYXJzZVxuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHBhcmFtIG1Db250ZXh0cyBUaGUgY29udGV4dHMgdG8gYmUgdXNlZFxuICogQHBhcmFtIHByb3BlcnR5VmFsdWVzIFRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlc1xuICogQHJldHVybnMgVGhlIHByb2Nlc3NlZCBhbmQgbWlzc2luZyBjb250ZXh0c1xuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29udGV4dHMoXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0cHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPlxuKSB7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXHRjb25zdCBtTWlzc2luZ0NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0Y29uc3QgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Ly8gU2luY2UgdGhlIG1ldGFQYXRoIGFuZCBvdGhlciBwcm9wZXJ0eSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHRQYXRoIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGN1cnJlbnQgY29udGV4dFBhdGggZmlyc3Rcblx0Y29uc3QgY29udGV4dFBhdGhJbmRleCA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLmluZGV4T2YoXCJjb250ZXh0UGF0aFwiKTtcblx0aWYgKGNvbnRleHRQYXRoSW5kZXggIT09IC0xKSB7XG5cdFx0Ly8gSWYgaXQgaXMgZGVmaW5lZCB3ZSBleHRyYWN0IGl0IGFuZCByZWluc2VydCBpdCBpbiB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGFycmF5XG5cdFx0Y29uc3QgY29udGV4dFBhdGhEZWZpbml0aW9uID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKGNvbnRleHRQYXRoSW5kZXgsIDEpO1xuXHRcdGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNwbGljZSgwLCAwLCBjb250ZXh0UGF0aERlZmluaXRpb25bMF0pO1xuXHR9XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHQvLyBJZiB0aGUgY29udGV4dCB3YXMgcmVzb2x2ZWQgYXMgYSBwcm9wZXJ0eSAoYmluZGluZyAvIHhtbCBhZ2dyZWdhdGlvbikgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHJlc29sdmUgaXQgaGVyZS5cblx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdGlmIChwcm9wZXJ0eVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZSBhcyBvYmplY3QpLmxlbmd0aCA+IDApIHtcblx0XHRcdGRlbGV0ZSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Y29uc3QgYkRvTm90UmVzb2x2ZSA9IGlzUHVibGljICYmIG9EZWZpbml0aW9uQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdLmlzUHVibGljID09PSBmYWxzZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpO1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHQgPSBfZ2V0TWV0YWRhdGFDb250ZXh0KG9TZXR0aW5ncywgb05vZGUsIHNBdHRyaWJ1dGVOYW1lLCBvVmlzaXRvciwgYkRvTm90UmVzb2x2ZSwgb01ldGFkYXRhLmlzT3BlbiA/PyBmYWxzZSk7XG5cdFx0aWYgKG9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQubmFtZSA9IHNBdHRyaWJ1dGVOYW1lO1xuXHRcdFx0YWRkU2luZ2xlQ29udGV4dChtQ29udGV4dHMsIG9WaXNpdG9yLCBvTWV0YWRhdGFDb250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpICYmXG5cdFx0XHRcdCFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBiaW5kaW5nIGNvdWxkbid0IGJlIHJlc29sdmVkIGNvbnNpZGVyIHRoYXQgdGhlcmUgd2FzIG5vIHZhbHVlIGhlcmVcblx0XHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtTWlzc2luZ0NvbnRleHQ7XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbiA9IHtcblx0a2V5OiBzdHJpbmc7XG5cdHBvc2l0aW9uOiBQb3NpdGlvbjtcblx0dHlwZTogXCJTbG90XCI7XG59O1xuZnVuY3Rpb24gcGFyc2VBZ2dyZWdhdGlvbihvQWdncmVnYXRpb24/OiBFbGVtZW50LCBwcm9jZXNzQWdncmVnYXRpb25zPzogRnVuY3Rpb24pIHtcblx0Y29uc3Qgb091dE9iamVjdHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbj4gPSB7fTtcblx0aWYgKG9BZ2dyZWdhdGlvbiAmJiBvQWdncmVnYXRpb24uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkcmVuID0gb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuO1xuXHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IGNoaWxkcmVuW2NoaWxkSWR4XTtcblx0XHRcdGxldCBjaGlsZEtleSA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikgfHwgY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXHRcdFx0aWYgKGNoaWxkS2V5KSB7XG5cdFx0XHRcdGNoaWxkS2V5ID0gYElubGluZVhNTF8ke2NoaWxkS2V5fWA7XG5cdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5zZXRBdHRyaWJ1dGUoXCJrZXlcIiwgY2hpbGRLZXkpO1xuXHRcdFx0XHRsZXQgYWdncmVnYXRpb25PYmplY3Q6IEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbiA9IHtcblx0XHRcdFx0XHRrZXk6IGNoaWxkS2V5LFxuXHRcdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IChjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwicGxhY2VtZW50XCIpIGFzIFBsYWNlbWVudCkgfHwgUGxhY2VtZW50LkFmdGVyLFxuXHRcdFx0XHRcdFx0YW5jaG9yOiBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiYW5jaG9yXCIpIHx8IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHlwZTogXCJTbG90XCJcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHByb2Nlc3NBZ2dyZWdhdGlvbnMpIHtcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbk9iamVjdCA9IHByb2Nlc3NBZ2dyZWdhdGlvbnMoY2hpbGREZWZpbml0aW9uLCBhZ2dyZWdhdGlvbk9iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b091dE9iamVjdHNbYWdncmVnYXRpb25PYmplY3Qua2V5XSA9IGFnZ3JlZ2F0aW9uT2JqZWN0O1xuXHRcdFx0fSBlbHNlIGlmIChjaGlsZERlZmluaXRpb24udGFnTmFtZSAhPT0gXCJzbG90XCIpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBUaGUgYWdncmVnYXRpb24gJHtjaGlsZERlZmluaXRpb24ubm9kZU5hbWV9IGlzIG1pc3NpbmcgYSBLZXkgYXR0cmlidXRlLiBJdCBpcyBub3QgZGlzcGxheWVkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvT3V0T2JqZWN0cztcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBhbmQgcGFyc2VzIHRoZW0gYXMgZWl0aGVyIGFnZ3JlZ2F0aW9ucyBvciBvYmplY3QtL2FycmF5LWJhc2VkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIGZvciB3aGljaCB0byBwcm9jZXNzIHRoZSBjaGlsZHJlblxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIHByb3BlcnR5VmFsdWVzIFRoZSB2YWx1ZXMgb2YgYWxyZWFkeSBwYXJzZWQgcHJvcGVydHlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+XG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgRWxlbWVudD4gPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCBhcyBFbGVtZW50IHwgbnVsbDtcblxuXHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQubmFtZXNwYWNlVVJJID09PSBYTUxURU1QTEFUSU5HX05TKSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugd2UgZW5jb3VudGVyIGEgdGVtcGxhdGluZyB0YWcsIHJ1biB0aGUgdmlzaXRvciBvbiBpdCBhbmQgY29udGludWUgd2l0aCB0aGUgcmVzdWx0aW5nIGNoaWxkXG5cdFx0XHRcdGNvbnN0IG9QYXJlbnQgPSBvRmlyc3RFbGVtZW50Q2hpbGQucGFyZW50Tm9kZTtcblx0XHRcdFx0aWYgKG9QYXJlbnQpIHtcblx0XHRcdFx0XHRjb25zdCBpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdID8gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF0gOiBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE5vdCBzdXJlIGhvdyB0aGlzIGNvdWxkIGhhcHBlbiBidXQgSSBhbHNvIGRvbid0IHdhbnQgdG8gY3JlYXRlIGluZmluaXRlIGxvb3BzXG5cdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQgJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBwYXJzZUFnZ3JlZ2F0aW9uKG9GaXJzdEVsZW1lbnRDaGlsZCwgYWdncmVnYXRpb25EZWZpbml0aW9uLnByb2Nlc3NBZ2dyZWdhdGlvbnMpO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gcGFyc2VkQWdncmVnYXRpb247XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwYXJzZWRBZ2dyZWdhdGlvbktleSBpbiBwYXJzZWRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRcdFx0b01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twYXJzZWRBZ2dyZWdhdGlvbktleV0gPSBwYXJzZWRBZ2dyZWdhdGlvbltwYXJzZWRBZ2dyZWdhdGlvbktleV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgb05leHRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRsZXQgc0FnZ3JlZ2F0aW9uTmFtZSA9IHNDaGlsZE5hbWU7XG5cdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdC8vIG5vdCBhIHN1YiBhZ2dyZWdhdGlvbiwgZ28gYmFjayB0byBkZWZhdWx0IEFnZ3JlZ2F0aW9uXG5cdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUgPSBvTWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uIHx8IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmluZGV4T2Yoc0FnZ3JlZ2F0aW9uTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdCghaXNQdWJsaWMgfHwgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5pc1B1YmxpYyA9PT0gdHJ1ZSlcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZmluaXRpb24gPSBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90ICYmIG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGxldCBjaGlsZERlZmluaXRpb24gPSBvRmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdFx0d2hpbGUgKGNoaWxkRGVmaW5pdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dENoaWxkID0gY2hpbGREZWZpbml0aW9uLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0XHRcdGlmICghYWdncmVnYXRpb25EZWZpbml0aW9uLmhhc1ZpcnR1YWxOb2RlKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhKTtcblx0XHRcdFx0XHRcdFx0Y2hpbGRXcmFwcGVyLmFwcGVuZENoaWxkKGNoaWxkRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSFdID0gY2hpbGRXcmFwcGVyO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIV0gPSBjaGlsZERlZmluaXRpb247XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNoaWxkRGVmaW5pdGlvbi5yZW1vdmVBdHRyaWJ1dGUoXCJrZXlcIik7XG5cdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24gPSBuZXh0Q2hpbGQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IHNDaGlsZE5hbWUpIHtcblx0XHRcdFx0XHRcdGlmICghb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lKTtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uYXBwZW5kQ2hpbGQob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpLmluZGV4T2Yoc0FnZ3JlZ2F0aW9uTmFtZSkgIT09IC0xKSB7XG5cdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLnByb3BlcnRpZXNbc0FnZ3JlZ2F0aW9uTmFtZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vIE9iamVjdCBUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTIgfCBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+PiA9IHt9O1xuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gb0ZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzW2F0dHJpYnV0ZU5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vcmV0cmlldmUgb25lIGxldmVsIHN1Yk9iamVjdCBwcm9wZXJ0aWVzXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGg7IGNoaWxkSW5kZXgrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdWJDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbltjaGlsZEluZGV4XTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViT2JqZWN0S2V5ID0gc3ViQ2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdWJPYmplY3Q6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlMj4gPSB7fTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lcyA9IHN1YkNoaWxkLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3Qgc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lIG9mIHN1YkNoaWxkQXR0cmlidXRlTmFtZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRzdWJPYmplY3Rbc3ViQ2hpbGRBdHRyaWJ1dGVOYW1lXSA9IHN1YkNoaWxkLmdldEF0dHJpYnV0ZShzdWJDaGlsZEF0dHJpYnV0ZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXNbc3ViT2JqZWN0S2V5XSA9IHN1Yk9iamVjdDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwiYXJyYXlcIikge1xuXHRcdFx0XHRcdGlmIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkcmVuID0gb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb091dE9iamVjdHM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlMj5bXSA9IFtdO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGlsZERlZmluaXRpb24gPSBjaGlsZHJlbltjaGlsZElkeF07XG5cdFx0XHRcdFx0XHRcdC8vIG5vbiBrZXllZCBjaGlsZCwganVzdCBhZGQgaXQgdG8gdGhlIGFnZ3JlZ2F0aW9uXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG15Q2hpbGQ6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlMj4gPSB7fTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlTmFtZXMgPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlTmFtZXMoKTtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZU5hbWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0bXlDaGlsZFthdHRyaWJ1dGVOYW1lXSA9IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b091dE9iamVjdHMucHVzaChteUNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gb091dE9iamVjdHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvQWdncmVnYXRpb25zO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzU2xvdHMoXG5cdG9BZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEVsZW1lbnQ+LFxuXHRvTWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+LFxuXHRvTm9kZTogRWxlbWVudCxcblx0cHJvY2Vzc0N1c3RvbURhdGEgPSBmYWxzZVxuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdGlmIChvTm9kZSAhPT0gbnVsbCAmJiBvTm9kZSAhPT0gdW5kZWZpbmVkICYmIG9BZ2dyZWdhdGlvbkVsZW1lbnQpIHtcblx0XHRcdFx0Ly8gc2xvdHMgY2FuIGhhdmUgOjogYXMga2V5cyB3aGljaCBpcyBub3QgYSB2YWxpZCBhZ2dyZWdhdGlvbiBuYW1lIHRoZXJlZm9yZSByZXBsYWNpbmcgdGhlbVxuXHRcdFx0XHRjb25zdCBvRWxlbWVudENoaWxkID0gb0FnZ3JlZ2F0aW9uRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiY3VzdG9tRGF0YVwiICYmIHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiZGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdChvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uc2xvdCkgfHxcblx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTm9kZS5xdWVyeVNlbGVjdG9yKGBzbG90W25hbWU9JyR7c1Nsb3ROYW1lfSddYCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50KG9Ob2RlLCBzQWdncmVnYXRpb25OYW1lLCBvRWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRcdG9UYXJnZXRFbGVtZW50LnJlcGxhY2VXaXRoKC4uLihvTmV3Q2hpbGQuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBOb2RlW10pKTsgLy8gU29tZWhvdyBUUyBkb2Vzbid0IGxpa2UgdGhpcyBidXQgdGhlIGRvY3VtZW50YXRpb24gc2F5cyBpcyBzaG91bGQgd29ya1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwcm9jZXNzQ3VzdG9tRGF0YSAmJiBvRWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b05vZGUuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQob05vZGU6IEVsZW1lbnQsIHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZywgb0VsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwpIHtcblx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZS5yZXBsYWNlKC86L2dpLCBcIl9cIikpO1xuXHR3aGlsZSAob0VsZW1lbnRDaGlsZCkge1xuXHRcdGNvbnN0IG9OZXh0Q2hpbGQgPSBvRWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRvTmV3Q2hpbGQuYXBwZW5kQ2hpbGQob0VsZW1lbnRDaGlsZCk7XG5cdFx0b0VsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG9OZXdDaGlsZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0J1aWxkaW5nQmxvY2soXG5cdEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdGlzUHVibGljID0gZmFsc2Vcbikge1xuXHRjb25zdCBvTWV0YWRhdGEgPSB0cmFuc2Zvcm1NZXRhZGF0YShCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEpO1xuXG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBvTWV0YWRhdGEuZnJhZ21lbnQgfHwgYCR7b01ldGFkYXRhLm5hbWVzcGFjZX0uJHtvTWV0YWRhdGEueG1sVGFnIHx8IG9NZXRhZGF0YS5uYW1lfWA7XG5cblx0Y29uc3QgbUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0PiA9IHt9O1xuXHRjb25zdCBvU2V0dGluZ3MgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXG5cdC8vIEFkZCBhbiBlbXB0eSBjb252ZXJ0ZXIgY29udGV4dCBpZiB0aGVyZSBpcyBub25lIGluIG9yZGVyIHRvIGhhdmUgYSBwbGFjZSB0byBzdG9yZSBvYmplY3QgdmFsdWVzXG5cdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dCA/Pz0gbmV3IEpTT05Nb2RlbCgpO1xuXG5cdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRpZiAoIW9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSkge1xuXHRcdG9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSA9IHt9O1xuXHR9XG5cblx0Ly8gRmlyc3Qgb2YgYWxsIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGF0dHJpYnV0ZXMgdG8gcmVzb2x2ZSB0aGUgcHJvcGVydGllcyBhbmQgdGhlIG1ldGFkYXRhIGNvbnRleHRzXG5cdGNvbnN0IHByb3BlcnR5VmFsdWVzID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMob01ldGFkYXRhLCBvTm9kZSwgaXNQdWJsaWMsIG9WaXNpdG9yKTtcblx0Y29uc3QgaW5pdGlhbEtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcyk7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dCA9IHByb2Nlc3NDb250ZXh0cyhvTWV0YWRhdGEsIG9TZXR0aW5ncywgb05vZGUsIGlzUHVibGljLCBvVmlzaXRvciwgbUNvbnRleHRzLCBwcm9wZXJ0eVZhbHVlcyk7XG5cblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKG9Ob2RlLCBvVmlzaXRvciwgb01ldGFkYXRhLCBpc1B1YmxpYywgcHJvcGVydHlWYWx1ZXMpO1xuXHRcdGxldCBvQ29udHJvbENvbmZpZyA9IHt9O1xuXG5cdFx0aWYgKG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEpIHtcblx0XHRcdC8vIE9ubHkgdXNlZCBpbiB0aGUgRmllbGQgbWFjcm8gYW5kIGV2ZW4gdGhlbiBtYXliZSBub3QgcmVhbGx5IHVzZWZ1bFxuXHRcdFx0b0NvbnRyb2xDb25maWcgPSBvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhLmdldFByb3BlcnR5KFwiL2NvbnRyb2xDb25maWd1cmF0aW9uXCIpO1xuXHRcdH1cblx0XHRsZXQgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblxuXHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0bGV0IG9EYXRhID0gcHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdIGFzIHVua25vd24gYXMgQ29udGV4dDtcblx0XHRcdC8vY2hlY2sgZm9yIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byB2YWxpZGF0ZSAvIG92ZXJ3cml0ZSBwYXJhbWV0ZXJzXG5cdFx0XHRjb25zdCBvcmlnaW5hbERlZmluaXRpb24gPSBCdWlsZGluZ0Jsb2NrQ2xhc3M/Lm1ldGFkYXRhPy5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcblx0XHRcdGlmIChvcmlnaW5hbERlZmluaXRpb24/LnZhbGlkYXRlKSB7XG5cdFx0XHRcdG9EYXRhID0gb3JpZ2luYWxEZWZpbml0aW9uLnZhbGlkYXRlKG9EYXRhKSB8fCBvRGF0YTtcblx0XHRcdH1cblx0XHRcdGlmIChvRGF0YT8uaXNBPy4oU0FQX1VJX01PREVMX0NPTlRFWFQpICYmICFvRGF0YS5nZXRNb2RlbCgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFwiKSkge1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV0gPSBvRGF0YS5nZXRPYmplY3QoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRwcm9wZXJ0eVZhbHVlcy5pc1B1YmxpYyA9IGlzUHVibGljO1xuXG5cdFx0Y29uc3Qgb0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyh7IC4uLnByb3BlcnR5VmFsdWVzLCAuLi5vQWdncmVnYXRpb25zIH0sIG9Db250cm9sQ29uZmlnLCBvU2V0dGluZ3MpO1xuXHRcdHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gb0luc3RhbmNlLmdldFByb3BlcnRpZXMoKTtcblx0XHRPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoc0NvbnRleHROYW1lOiBzdHJpbmcpIHtcblx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdGNvbnN0IHRhcmdldE9iamVjdCA9IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzW3NDb250ZXh0TmFtZV07XG5cdFx0XHRcdGlmICh0eXBlb2YgdGFyZ2V0T2JqZWN0ID09PSBcIm9iamVjdFwiICYmICFpc0NvbnRleHQodGFyZ2V0T2JqZWN0KSkge1xuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gc3RvcmVPYmplY3RWYWx1ZSh0YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShhdHRyaWJ1dGVWYWx1ZSwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmNyZWF0ZUJpbmRpbmdDb250ZXh0KGF0dHJpYnV0ZVZhbHVlKSE7XG5cdFx0XHRcdFx0dW5zdG9yZU9iamVjdFZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcblx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IG5ld0NvbnRleHQ7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSB0YXJnZXRPYmplY3QgYXMgQ29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb0F0dHJpYnV0ZXNNb2RlbDogSlNPTk1vZGVsID0gbmV3IEF0dHJpYnV0ZU1vZGVsKG9Ob2RlLCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcywgQnVpbGRpbmdCbG9ja0NsYXNzKTtcblx0XHRtQ29udGV4dHNbXCJ0aGlzXCJdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogTWFjcm9JbmZvIHwgdW5kZWZpbmVkO1xuXG5cdFx0Ly8gS2VlcCB0cmFja1xuXHRcdGlmIChUcmFjZUluZm8uaXNUcmFjZUluZm9BY3RpdmUoKSkge1xuXHRcdFx0Y29uc3Qgb1RyYWNlSW5mbyA9IFRyYWNlSW5mby50cmFjZU1hY3JvQ2FsbHMoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlLCBvVmlzaXRvcik7XG5cdFx0XHRpZiAoKG9UcmFjZUluZm8gYXMgVHJhY2VNZXRhZGF0YUNvbnRleHQpPy5tYWNyb0luZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IChvVHJhY2VJbmZvIGFzIFRyYWNlTWV0YWRhdGFDb250ZXh0KS5tYWNyb0luZm87XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0VmlzaXRvciA9IG9WaXNpdG9yLndpdGgobUNvbnRleHRzLCBvTWV0YWRhdGEuaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhb01ldGFkYXRhLmlzT3BlbiA6IHRydWUpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChvTWV0YWRhdGEuZnJhZ21lbnQpIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdGVtcGxhdGVTdHJpbmcgPSBhd2FpdCBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUhKG9Ob2RlKTtcblxuXHRcdFx0XHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdC8vIEZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrcywgd2UgbmVlZCB0byBhdHRhY2ggYWxsIG9iamVjdHMgdG8gdGhlIGNvbnZlcnRlckNvbnRleHQgZGlyZWN0bHksIGFzIHRoZSBhY3R1YWwgcmVuZGVyaW5nIHRha2VzIHBsYWNlIGF0IHJ1bnRpbWVcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHN0b3JlS2V5IGluIHRlbXBvcmFyeU9iamVjdFN0b3JlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHN0b3JlS2V5KTtcblx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzdG9yZUtleSwgZGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKHRlbXBsYXRlU3RyaW5nKSB7XG5cdFx0XHRcdFx0bGV0IGhhc1BhcnNlRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgcGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyh0ZW1wbGF0ZVN0cmluZywgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHBhcnNlZFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKGVsZW1lbnQsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblx0XHRcdFx0XHRcdGxldCB0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRcdFx0XHRcdGhhc1BhcnNlRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGhhc1BhcnNlRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgcGFyc2VlcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBYTUwgaXQgbWVhbnMgdGhlIFhNTCBpdHNlbGYgaXMgbWFsZm9ybWVkLCBhcyBzdWNoIHdlIHJlcnVuIHRoZSB0ZW1wbGF0ZSBwcm9jZXNzXG5cdFx0XHRcdFx0XHQvLyBTZXR0aW5nIGlzVHJhY2VNb2RlIHRydWUgd2lsbCBtYWtlIGl0IHNvIHRoYXQgZWFjaCB4bWxgIGV4cHJlc3Npb24gaXMgY2hlY2tlZCBmb3IgdmFsaWRpdHkgZnJvbSBYTUwgcGVyc3BlY3RpdmVcblx0XHRcdFx0XHRcdC8vIElmIGFuIGVycm9yIGlzIGZvdW5kIGl0J3MgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZyYWdtZW50XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEueG1sVGFnIHx8IG9NZXRhZGF0YS5uYW1lfWApO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBhd2FpdCBwcm9jZXNzWG1sSW5UcmFjZShhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZT8uKG9Ob2RlKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSA/PyBcIlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlLm1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm91dGVySFRNTCkuam9pbihcIlxcblwiKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHBhcnNlZFRlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yVGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Ob2RlLnJlcGxhY2VXaXRoKC4uLnBhcnNlZFRlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBvTm9kZSwgZmFsc2UpO1xuXG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHRydWUpO1xuXHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9QcmV2aW91c01hY3JvSW5mbykge1xuXHRcdFx0Ly9yZXN0b3JlIG1hY3JvIGluZm8gaWYgYXZhaWxhYmxlXG5cdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGU6IHVua25vd24pIHtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIGEgZ2VuZXJpYyBlcnJvciAodXN1YWxseSBjb2RlIGVycm9yKSwgd2UgcmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgZGVkaWNhdGVkIGVycm9yIG1lc3NhZ2Vcblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZyk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9XG4pIHtcblx0Y29uc3Qgc0tleSA9IChvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQpIGFzIHN0cmluZztcblx0aWYgKG1Db250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LFxuXHRcdC8vIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3IgcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqXG4gKiBAcGFyYW0gQnVpbGRpbmdCbG9ja0NsYXNzIFRoZSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJ1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja0Jhc2UpOiB2b2lkIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRhc3luYyAob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhCdWlsZGluZ0Jsb2NrQ2xhc3MsIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSxcblx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdCk7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdGFzeW5jIChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzcywgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIFVuUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHNvIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBCdWlsZGluZ0Jsb2NrQ2xhc3MgVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKEJ1aWxkaW5nQmxvY2tDbGFzczogdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlKTogdm9pZCB7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0bnVsbCxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdG51bGwsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JYTUwoZXJyb3JNZXNzYWdlczogc3RyaW5nW10sIHhtbEZyYWdtZW50OiBzdHJpbmcsIGFkZGl0aW9uYWxEYXRhPzogb2JqZWN0LCBzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGVycm9yTGFiZWxzID0gZXJyb3JNZXNzYWdlcy5tYXAoKGVycm9yTWVzc2FnZSkgPT4geG1sYDxtOkxhYmVsIHRleHQ9XCIke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGVycm9yTWVzc2FnZSl9XCIvPmApO1xuXHRsZXQgZXJyb3JTdGFjayA9IFwiXCI7XG5cdGlmIChzdGFjaykge1xuXHRcdGNvbnN0IHN0YWNrRm9ybWF0dGVkID0gYnRvYShgPHByZT4ke3N0YWNrfTwvcHJlPmApO1xuXHRcdGVycm9yU3RhY2sgPSB4bWxgPG06Rm9ybWF0dGVkVGV4dCBodG1sVGV4dD1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7c3RhY2tGb3JtYXR0ZWR9JykgfWB9XCIgLz5gO1xuXHR9XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiAgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+YDtcblx0fVxuXHRyZXR1cm4geG1sYDxjb250cm9sczpGb3JtRWxlbWVudFdyYXBwZXIgeG1sbnM6Y29udHJvbHM9XCJzYXAuZmUuY29yZS5jb250cm9sc1wiPlxuXHRcdFx0XHRcdDxtOlZCb3ggeG1sbnM6bT1cInNhcC5tXCIgeG1sbnM6Y29kZT1cInNhcC51aS5jb2RlZWRpdG9yXCIgY29yZTpyZXF1aXJlPVwie0JCRjonc2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdDwvY29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyPmA7XG59XG5cbmNvbnN0IHRlbXBvcmFyeU9iamVjdFN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4vKipcbiAqIFN0b3JlcyBhbiBvYmplY3QgdmFsdWUgaW4gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBhbmQgcmV0dXJucyBhbiBJRCB1c2VkIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLlxuICpcbiAqIFJlcXVpcmVkIGFzIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aGUgeG1sYCBmdW5jdGlvbiwgd2hpY2ggbWlnaHQgdGFrZSBvYmplY3RzIGFzIHBhcmFtZXRlcnMgYnV0IG5lZWRzIHRvIHJldHVybiBhIHNlcmlhbGl6ZWQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzdG9yZVxuICogQHJldHVybnMgSUQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZVxuICovXG5mdW5jdGlvbiBzdG9yZU9iamVjdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG5cdGNvbnN0IHByb3BlcnR5VUlEID0gYC91aWQtLSR7dWlkKCl9YDtcblx0dGVtcG9yYXJ5T2JqZWN0U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWU7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBVbnN0b3JlcyBhbiBvYmplY3QgZnJvbSBhIHRlbXBvcmFyeSBzdG9yZSBieSByZW1vdmluZyBpdCBhbmQgcmV0dXJuaW5nIGl0cyBvYmplY3QgdmFsdWUuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5VUlEIElEIHRvIHJldHJpZXZlIHRoaXMgdmFsdWVcbiAqIEByZXR1cm5zIE9iamVjdCB2YWx1ZVxuICovXG5mdW5jdGlvbiB1bnN0b3JlT2JqZWN0VmFsdWUocHJvcGVydHlVSUQ6IHN0cmluZykge1xuXHRjb25zdCB2YWx1ZSA9IHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0ZGVsZXRlIHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0cmV0dXJuIHZhbHVlO1xufVxuXG5sZXQgcHJvY2Vzc05leHRYbWxJblRyYWNlID0gZmFsc2U7XG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCBhbGwgeG1sYCBjYWxscyBpbnNpZGUgdGhlIGdpdmVuIG1ldGhvZCBhcmUgcHJvY2Vzc2VkIGluIHRyYWNlIG1vZGUuXG4gKlxuICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIG1ldGhvZFxuICovXG5jb25zdCBwcm9jZXNzWG1sSW5UcmFjZSA9IGZ1bmN0aW9uIChtZXRob2Q6IEZ1bmN0aW9uKSB7XG5cdHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IHRydWU7XG5cdGxldCByZXR1cm5WYWx1ZTtcblx0dHJ5IHtcblx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZCgpO1xuXHR9IGZpbmFsbHkge1xuXHRcdHByb2Nlc3NOZXh0WG1sSW5UcmFjZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBbYWRkRGVmYXVsdE5hbWVzcGFjZXNdIFdoZXRoZXIgb3Igbm90IGRlZmF1bHQgbmFtZXNwYWNlcyBzaG91bGQgYmUgYWRkZWRcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZywgYWRkRGVmYXVsdE5hbWVzcGFjZXMgPSBmYWxzZSk6IEVsZW1lbnRbXSB7XG5cdGlmIChhZGREZWZhdWx0TmFtZXNwYWNlcykge1xuXHRcdHhtbFN0cmluZyA9IGA8dGVtcGxhdGVcblx0XHRcdFx0XHRcdHhtbG5zOnRlbXBsYXRlPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bT1cInNhcC5tXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1hY3Jvcz1cInNhcC5mZS5tYWNyb3NcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJcblx0XHRcdFx0XHRcdHhtbG5zOm1kYz1cInNhcC51aS5tZGNcIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIj4ke3htbFN0cmluZ308L3RlbXBsYXRlPmA7XG5cdH1cblx0Y29uc3QgeG1sRG9jdW1lbnQgPSBET01QYXJzZXJJbnN0YW5jZS5wYXJzZUZyb21TdHJpbmcoeG1sU3RyaW5nLCBcInRleHQveG1sXCIpO1xuXHRsZXQgb3V0cHV0ID0geG1sRG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdHdoaWxlIChvdXRwdXQ/LmxvY2FsTmFtZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG5cdFx0b3V0cHV0ID0gb3V0cHV0LmZpcnN0RWxlbWVudENoaWxkO1xuXHR9XG5cdGNvbnN0IGNoaWxkcmVuID0gb3V0cHV0Py5wYXJlbnRFbGVtZW50ID8gb3V0cHV0Py5wYXJlbnRFbGVtZW50LmNoaWxkcmVuIDogW291dHB1dCBhcyBFbGVtZW50XTtcblx0cmV0dXJuIEFycmF5LmZyb20oY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySW5UcmFjZU1vZGUob3V0U3RyOiBzdHJpbmcpIHtcblx0Y29uc3QgeG1sUmVzdWx0ID0gcGFyc2VYTUxTdHJpbmcob3V0U3RyLCB0cnVlKTtcblx0aWYgKHhtbFJlc3VsdD8ubGVuZ3RoID4gMCAmJiB4bWxSZXN1bHRbMF0/LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHRbMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTDtcblx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG91dFN0cjtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBYTUxQcm9jZXNzb3JUeXBlVmFsdWUgPVxuXHR8IHN0cmluZ1xuXHR8IGJvb2xlYW5cblx0fCBudW1iZXJcblx0fCB1bmRlZmluZWRcblx0fCBudWxsXG5cdHwgb2JqZWN0XG5cdHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0fCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj5cblx0fCBBcnJheTxzdHJpbmc+XG5cdHwgQXJyYXk8RnVuY3Rpb24+XG5cdHwgRnVuY3Rpb25cblx0fCBDb250ZXh0O1xuLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWwgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBvYmplY3QgY2FzZS5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyBUaGUgc3RyaW5nIHBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgcGFydCBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgdGhhdCB3YXMgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHhtbCA9IChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4udmFsdWVzOiBYTUxQcm9jZXNzb3JUeXBlVmFsdWVbXSkgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblxuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5mbGF0KDUpLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbkFycmF5KHZhbHVlKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLm1hcCgodmFsdWVmbikgPT4gdmFsdWVmbigpKS5qb2luKFwiXFxuXCIpO1xuXHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZSk7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0b3V0U3RyICs9IFwie3RoaXM+dW5kZWZpbmVkVmFsdWV9XCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGlmIChpc0NvbnRleHQodmFsdWUpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZS5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVVJZCA9IHN0b3JlT2JqZWN0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIjxcIikgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRvdXRTdHIgPSBvdXRTdHIudHJpbSgpO1xuXHRpZiAocHJvY2Vzc05leHRYbWxJblRyYWNlKSB7XG5cdFx0cmV0dXJuIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cik7XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7RUE4QkEsTUFBTUEsWUFBWSxHQUFHLDJEQUEyRDtFQUNoRixNQUFNQyxnQkFBZ0IsR0FBRyxnRUFBZ0U7RUFDekYsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsU0FBUyxFQUFFO0VBNEd6QyxTQUFTQyw0QkFBNEIsQ0FDcENDLEtBQWEsRUFDYkMsU0FBa0MsRUFDbENDLGdCQUF3RCxFQUN4REMsSUFBWSxFQUNYO0lBQ0QsTUFBTUMsUUFBUSxHQUFHSCxTQUFTLENBQUNFLElBQUksQ0FBQztJQUNoQyxNQUFNRSxjQUFjLEdBQUdELFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFRSxTQUFTLEVBR3pDO0lBRUQsSUFBSUosZ0JBQWdCLENBQUNLLFFBQVEsS0FBSyxJQUFJLEtBQUssQ0FBQ0gsUUFBUSxJQUFJQyxjQUFjLEtBQUssSUFBSSxDQUFDLEVBQUU7TUFDakYsTUFBTSxJQUFJRyxLQUFLLENBQUUsR0FBRVIsS0FBTSwrQkFBOEJHLElBQUssY0FBYSxDQUFDO0lBQzNFLENBQUMsTUFBTSxJQUFJRSxjQUFjLEVBQUU7TUFDMUI7TUFDQTtNQUNBLElBQUlBLGNBQWMsQ0FBQ0ksY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJSixjQUFjLENBQUNLLEtBQUssS0FBS0MsU0FBUyxJQUFJVCxnQkFBZ0IsQ0FBQ1EsS0FBSyxLQUFLQyxTQUFTLEVBQUU7UUFDekg7UUFDQSxJQUFJVCxnQkFBZ0IsQ0FBQ1EsS0FBSyxDQUFDRSxPQUFPLENBQUNQLGNBQWMsQ0FBQ0ssS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFD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