@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
@@ -2,22 +2,23 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/Feedback", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/ui/core/Core", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding", "../ActionRuntime"], function (Log, CommonUtils, BusyLocker, ActivitySync, CollaborationCommon, draft, Feedback, MetaModelConverter, ClassSupport, EditState, ModelHelper, SemanticKeyHelper, FELibrary, Core, coreLibrary, Message, ControllerExtension, OverrideExecution, ODataListBinding, ActionRuntime) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/controllerextensions/Feedback", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MetaModelFunction", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/Text", "sap/ui/core/Core", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding", "../ActionRuntime"], function (Log, CommonUtils, BusyLocker, ActivitySync, CollaborationCommon, draft, sticky, TransactionHelper, Feedback, MetaModelConverter, ClassSupport, EditState, MetaModelFunction, ModelHelper, ResourceModelHelper, SemanticKeyHelper, FELibrary, Button, Dialog, Text, Core, coreLibrary, Message, ControllerExtension, OverrideExecution, ODataListBinding, ActionRuntime) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _class, _class2;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _class, _class2;
9
+ var getResourceModel = ResourceModelHelper.getResourceModel;
10
+ var getNonComputedVisibleFields = MetaModelFunction.getNonComputedVisibleFields;
9
11
  var publicExtension = ClassSupport.publicExtension;
10
12
  var finalExtension = ClassSupport.finalExtension;
11
13
  var extensible = ClassSupport.extensible;
12
14
  var defineUI5Class = ClassSupport.defineUI5Class;
13
15
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
16
+ var convertTypes = MetaModelConverter.convertTypes;
14
17
  var TriggerType = Feedback.TriggerType;
15
18
  var triggerConfiguredSurvey = Feedback.triggerConfiguredSurvey;
16
19
  var StandardActions = Feedback.StandardActions;
17
20
  var shareObject = CollaborationCommon.shareObject;
18
21
  var Activity = CollaborationCommon.Activity;
19
- var send = ActivitySync.send;
20
- var isConnected = ActivitySync.isConnected;
21
22
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
22
23
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
23
24
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
@@ -36,10 +37,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
36
37
  * @public
37
38
  * @since 1.90.0
38
39
  */
39
- let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = finalExtension(), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = finalExtension(), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = finalExtension(), _dec30 = publicExtension(), _dec31 = finalExtension(), _dec32 = publicExtension(), _dec33 = finalExtension(), _dec34 = publicExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
40
+ let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = finalExtension(), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = finalExtension(), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
40
41
  _inheritsLoose(EditFlow, _ControllerExtension);
41
42
  function EditFlow() {
42
- return _ControllerExtension.apply(this, arguments) || this;
43
+ var _this;
44
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
45
+ args[_key] = arguments[_key];
46
+ }
47
+ _this = _ControllerExtension.call(this, ...args) || this;
48
+ _this.syncTasks = Promise.resolve();
49
+ return _this;
43
50
  }
44
51
  var _proto = EditFlow.prototype;
45
52
  //////////////////////////////////////
@@ -48,14 +55,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
48
55
  _proto.getAppComponent = function getAppComponent() {
49
56
  return this.base.getAppComponent();
50
57
  }
51
- /**
52
- * Gets the InternalEditFlow extension.
53
- *
54
- * @returns The internalEditFlow controller extension
55
- */;
56
- _proto.getInternalEditFlow = function getInternalEditFlow() {
57
- return this.base.getView().getController()._editFlow;
58
- }
59
58
 
60
59
  /**
61
60
  * Creates a draft document for an existing active document.
@@ -69,12 +68,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
69
68
  */;
70
69
  _proto.editDocument = async function editDocument(oContext) {
71
70
  const bDraftNavigation = true;
72
- const transactionHelper = this._getTransactionHelper();
71
+ const transactionHelper = this.getTransactionHelper();
73
72
  const oRootViewController = this._getRootViewController();
74
73
  const model = oContext.getModel();
75
74
  let rightmostContext, siblingInfo;
76
75
  const oViewData = this.getView().getViewData();
77
- const sProgrammingModel = this._getProgrammingModel(oContext);
76
+ const sProgrammingModel = this.getProgrammingModel(oContext);
78
77
  let oRootContext = oContext;
79
78
  const oView = this.getView();
80
79
  try {
@@ -92,12 +91,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
92
91
  await this.base.editFlow.onBeforeEdit({
93
92
  context: oRootContext
94
93
  });
95
- const oNewDocumentContext = await transactionHelper.editDocument(oRootContext, this.getView(), this.getAppComponent(), this._getMessageHandler());
94
+ const oNewDocumentContext = await transactionHelper.editDocument(oRootContext, this.getView(), this.getAppComponent(), this.getMessageHandler());
96
95
  this._setStickySessionInternalProperties(sProgrammingModel, model);
97
96
  if (oNewDocumentContext) {
98
- this._setEditMode(EditMode.Editable, false);
99
- this._setDocumentModified(false);
100
- this._getMessageHandler().showMessageDialog();
97
+ this.setEditMode(EditMode.Editable, false);
98
+ this.setDocumentModified(false);
99
+ this.getMessageHandler().showMessageDialog();
101
100
  if (oNewDocumentContext !== oRootContext) {
102
101
  let contextToNavigate = oNewDocumentContext;
103
102
  if (this._isFclEnabled()) {
@@ -123,7 +122,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
123
122
  } else {
124
123
  stickyContext = oNewDocumentContext;
125
124
  }
126
- this._handleStickyOn(stickyContext);
125
+ this.handleStickyOn(stickyContext);
127
126
  } else if (ModelHelper.isCollaborationDraftSupported(model.getMetaModel())) {
128
127
  // according to UX in case of enabled collaboration draft we share the object immediately
129
128
  await shareObject(oNewDocumentContext);
@@ -133,16 +132,73 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
133
132
  } catch (oError) {
134
133
  Log.error("Error while editing the document", oError);
135
134
  }
136
- };
137
- _proto.deleteMultipleDocuments = function deleteMultipleDocuments(aContexts, mParameters) {
138
- if (mParameters) {
139
- mParameters.beforeDeleteCallBack = this.base.editFlow.onBeforeDelete;
135
+ }
136
+
137
+ /**
138
+ * Deletes several documents.
139
+ *
140
+ * @param contextsToDelete The contexts of the documents to delete
141
+ * @param parameters The parameters
142
+ * @returns Promise resolved once the documents are deleted
143
+ */;
144
+ _proto.deleteMultipleDocuments = async function deleteMultipleDocuments(contextsToDelete, parameters) {
145
+ if (parameters) {
146
+ parameters.beforeDeleteCallBack = this.base.editFlow.onBeforeDelete;
140
147
  } else {
141
- mParameters = {
148
+ parameters = {
142
149
  beforeDeleteCallBack: this.base.editFlow.onBeforeDelete
143
150
  };
144
151
  }
145
- return this.getInternalEditFlow().deleteMultipleDocuments(aContexts, mParameters);
152
+ const lockObject = this.getGlobalUIModel();
153
+ const parentControl = this.getView().byId(parameters.controlId);
154
+ if (!parentControl) {
155
+ throw new Error("parameter controlId missing or incorrect");
156
+ } else {
157
+ parameters.parentControl = parentControl;
158
+ }
159
+ const listBinding = parentControl.getBinding("items") || parentControl.getRowBinding();
160
+ parameters.bFindActiveContexts = true;
161
+ BusyLocker.lock(lockObject);
162
+ try {
163
+ await this.deleteDocumentTransaction(contextsToDelete, parameters);
164
+ let result;
165
+
166
+ // Multiple object deletion is triggered from a list
167
+ // First clear the selection in the table as it's not valid any more
168
+ if (parentControl.isA("sap.ui.mdc.Table")) {
169
+ parentControl.clearSelection();
170
+ }
171
+
172
+ // Then refresh the list-binding (LR), or require side-effects (OP)
173
+ const viewBindingContext = this.getView().getBindingContext();
174
+ if (listBinding.isRoot()) {
175
+ // keep promise chain pending until refresh of listbinding is completed
176
+ result = new Promise(resolve => {
177
+ listBinding.attachEventOnce("dataReceived", function () {
178
+ resolve();
179
+ });
180
+ });
181
+ listBinding.refresh();
182
+ } else if (viewBindingContext) {
183
+ // if there are transient contexts, we must avoid requesting side effects
184
+ // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
185
+ // if list binding is refreshed, transient contexts might be lost
186
+ if (!CommonUtils.hasTransientContext(listBinding)) {
187
+ this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(listBinding.getPath(), viewBindingContext);
188
+ }
189
+ }
190
+
191
+ // deleting at least one object should also set the UI to dirty
192
+ if (!this.getAppComponent()._isFclEnabled()) {
193
+ EditState.setEditStateDirty();
194
+ }
195
+ ActivitySync.send(this.getView(), Activity.Delete, contextsToDelete.map(context => context.getPath()));
196
+ return result;
197
+ } catch (error) {
198
+ Log.error("Error while deleting the document(s)", error);
199
+ } finally {
200
+ BusyLocker.unlock(lockObject);
201
+ }
146
202
  }
147
203
 
148
204
  /**
@@ -158,16 +214,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
158
214
  */;
159
215
  _proto.updateDocument = function updateDocument(updatedContext, updatePromise) {
160
216
  const originalBindingContext = this.getView().getBindingContext();
161
- const isDraft = this._getProgrammingModel(updatedContext) === ProgrammingModel.Draft;
162
- this._getMessageHandler().removeTransitionMessages();
163
- return this._syncTask(async () => {
217
+ const isDraft = this.getProgrammingModel(updatedContext) === ProgrammingModel.Draft;
218
+ this.getMessageHandler().removeTransitionMessages();
219
+ return this.syncTask(async () => {
164
220
  if (originalBindingContext) {
165
- this._setDocumentModified(true);
221
+ this.setDocumentModified(true);
166
222
  if (!this._isFclEnabled()) {
167
223
  EditState.setEditStateDirty();
168
224
  }
169
225
  if (isDraft) {
170
- this._setDraftStatus(DraftStatus.Saving);
226
+ this.setDraftStatus(DraftStatus.Saving);
171
227
  }
172
228
  }
173
229
  try {
@@ -191,14 +247,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
191
247
  await this._handleNewContext(currentBindingContext, true, false, true);
192
248
  }
193
249
  }
194
- this._setDraftStatus(DraftStatus.Saved);
250
+ this.setDraftStatus(DraftStatus.Saved);
195
251
  } catch (error) {
196
252
  Log.error("Error while updating the document", error);
197
253
  if (isDraft && originalBindingContext) {
198
- this._setDraftStatus(DraftStatus.Clear);
254
+ this.setDraftStatus(DraftStatus.Clear);
199
255
  }
200
256
  } finally {
201
- await this._getMessageHandler().showMessages();
257
+ await this.getMessageHandler().showMessages();
202
258
  }
203
259
  });
204
260
  }
@@ -229,18 +285,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
229
285
  * @since 1.90.0
230
286
  */;
231
287
  _proto.createDocument = async function createDocument(vListBinding, mInParameters) {
232
- const transactionHelper = this._getTransactionHelper(),
233
- oLockObject = this._getGlobalUIModel();
288
+ const transactionHelper = this.getTransactionHelper(),
289
+ oLockObject = this.getGlobalUIModel();
234
290
  let oTable; //should be Table but there are missing methods into the def
235
291
  let mParameters = mInParameters;
236
292
  const bShouldBusyLock = !mParameters || mParameters.creationMode !== CreationMode.Inline && mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.External;
237
293
  let oExecCustomValidation = Promise.resolve([]);
238
- const oAppComponent = CommonUtils.getAppComponent(this.getView());
294
+ const oAppComponent = this.getAppComponent();
239
295
  oAppComponent.getRouterProxy().removeIAppStateKey();
240
296
  if (mParameters.creationMode === CreationMode.External) {
241
297
  // Create by navigating to an external target
242
298
  // TODO: Call appropriate function (currently using the same as for outbound chevron nav, and without any context - 3rd param)
243
- await this._syncTask();
299
+ await this.syncTask();
244
300
  const oController = this.getView().getController();
245
301
  const sCreatePath = ModelHelper.getAbsoluteMetaPathForListBinding(this.getView(), vListBinding);
246
302
  oController.handlers.onChevronPressNavigateOutBound(oController, mParameters.outbound, undefined, sCreatePath);
@@ -250,10 +306,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
250
306
  const oCreationRowObjects = mParameters.creationRow.getBindingContext().getObject();
251
307
  delete oCreationRowObjects["@$ui5.context.isTransient"];
252
308
  oTable = mParameters.creationRow.getParent();
253
- oExecCustomValidation = transactionHelper.validateDocument(oTable.getBindingContext(), {
309
+ oExecCustomValidation = this.validateDocument(oTable.getBindingContext(), {
254
310
  data: oCreationRowObjects,
255
311
  customValidationFunction: oTable.getCreationRow().data("customValidationFunction")
256
- }, this.base.getView());
312
+ });
257
313
 
258
314
  // disableAddRowButtonForEmptyData is set to false in manifest converter (Table.ts) if customValidationFunction exists
259
315
  if (oTable.getCreationRow().data("disableAddRowButtonForEmptyData") === "true") {
@@ -280,7 +336,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
280
336
  // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
281
337
  // if list binding is refreshed, transient contexts might be lost
282
338
  if (!CommonUtils.hasTransientContext(oListBinding)) {
283
- const appComponent = CommonUtils.getAppComponent(this.getView());
339
+ const appComponent = this.getAppComponent();
284
340
  appComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
285
341
  }
286
342
  } catch (oError) {
@@ -343,7 +399,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
343
399
  }
344
400
  });
345
401
  if (aCustomMessages.length > 0) {
346
- this._getMessageHandler().showMessageDialog({
402
+ this.getMessageHandler().showMessageDialog({
347
403
  customMessages: aCustomMessages
348
404
  });
349
405
  }
@@ -368,7 +424,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
368
424
  }
369
425
  }
370
426
  const sMetaPath = oMetaModel.getMetaPath(oListBinding === null || oListBinding === void 0 ? void 0 : oListBinding.getHeaderContext().getPath());
371
- const aNonComputedVisibleKeyFields = CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, this.getView());
427
+ const aNonComputedVisibleKeyFields = getNonComputedVisibleFields(oMetaModel, sMetaPath, this.getAppComponent());
372
428
  if (aNonComputedVisibleKeyFields.length > 0) {
373
429
  return CreationMode.Deferred;
374
430
  }
@@ -379,7 +435,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
379
435
  BusyLocker.lock(oLockObject);
380
436
  }
381
437
  try {
382
- const aValidationMessages = await this._syncTask(oExecCustomValidation);
438
+ const aValidationMessages = await this.syncTask(oExecCustomValidation);
383
439
  if (aValidationMessages.length > 0) {
384
440
  createCustomValidationMessages(aValidationMessages);
385
441
  Log.error("Custom Validation failed");
@@ -399,7 +455,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
399
455
  throw new Error("Binding object or path expected");
400
456
  }
401
457
  const oModel = oListBinding.getModel();
402
- const sProgrammingModel = this._getProgrammingModel(oListBinding);
458
+ const sProgrammingModel = this.getProgrammingModel(oListBinding);
403
459
  const resolvedCreationMode = resolveCreationMode(mParameters.creationMode, sProgrammingModel, oListBinding, oModel.getMetaModel());
404
460
  let oCreation;
405
461
  let mArgs;
@@ -408,7 +464,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
408
464
  let oPayload;
409
465
  let sMetaPath;
410
466
  const oMetaModel = oModel.getMetaModel();
411
- const oRoutingListener = this._getRoutingListener();
467
+ const oRoutingListener = this.getInternalRouting();
412
468
  if (resolvedCreationMode !== CreationMode.Deferred) {
413
469
  if (resolvedCreationMode === CreationMode.CreationRow) {
414
470
  oCreationRowContext = oCreationRow.getBindingContext();
@@ -435,17 +491,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
435
491
 
436
492
  // take care on message handling, draft indicator (in case of draft)
437
493
  // Attach the create sent and create completed event to the object page binding so that we can react
438
- this._handleCreateEvents(oListBinding);
494
+ this.handleCreateEvents(oListBinding);
439
495
  }
440
496
  if (!mParameters.parentControl) {
441
497
  mParameters.parentControl = this.getView();
442
498
  }
443
- mParameters.beforeCreateCallBack = this.base.editFlow.onBeforeCreate;
499
+ mParameters.beforeCreateCallBack = this.onBeforeCreate;
444
500
 
445
501
  // In case the application was called with preferredMode=autoCreateWith, we want to skip the
446
502
  // action parameter dialog
447
503
  mParameters.skipParameterDialog = oAppComponent.getStartupMode() === StartupMode.AutoCreate;
448
- oCreation = transactionHelper.createDocument(oListBinding, mParameters, this.getAppComponent(), this._getMessageHandler(), false, this.getView());
504
+ oCreation = transactionHelper.createDocument(oListBinding, mParameters, this.getAppComponent(), this.getMessageHandler(), false);
505
+ // SideEffects on Create
506
+ // if Save is pressed directly after filling the CreationRow, no SideEffects request
507
+ if (!mParameters.bSkipSideEffects) {
508
+ handleSideEffects(oListBinding, oCreation);
509
+ }
449
510
  }
450
511
  let oNavigation;
451
512
  switch (resolvedCreationMode) {
@@ -486,17 +547,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
486
547
  });
487
548
  break;
488
549
  case CreationMode.Inline:
489
- handleSideEffects(oListBinding, oCreation);
490
- this._syncTask(oCreation);
550
+ this.syncTask(oCreation);
491
551
  break;
492
552
  case CreationMode.CreationRow:
493
553
  // the creation row shall be cleared once the validation check was successful and
494
554
  // therefore the POST can be sent async to the backend
495
555
  try {
496
556
  const oCreationRowListBinding = oCreationRowContext.getBinding();
497
- if (!mParameters.bSkipSideEffects) {
498
- handleSideEffects(oListBinding, oCreation);
499
- }
500
557
  const oNewTransientContext = oCreationRowListBinding.create();
501
558
  oCreationRow.setBindingContext(oNewTransientContext);
502
559
 
@@ -521,7 +578,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
521
578
  try {
522
579
  const aParams = await Promise.all([oCreation, oNavigation]);
523
580
  this._setStickySessionInternalProperties(sProgrammingModel, oModel);
524
- this._setEditMode(EditMode.Editable); // The createMode flag will be set in InternalEditFlow#computeEditMode
581
+ this.setEditMode(EditMode.Editable); // The createMode flag will be set in computeEditMode
525
582
  if (!oListBinding.isRelative() && sProgrammingModel === ProgrammingModel.Sticky) {
526
583
  var _entitySet$annotation, _entitySet$annotation2;
527
584
  // Workaround to tell the OP that we've created a new object from the LR
@@ -529,16 +586,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
529
586
  const metaContext = metaModel.bindContext(metaModel.getMetaPath(oListBinding.getPath()));
530
587
  const entitySet = getInvolvedDataModelObjects(metaContext).startingEntitySet;
531
588
  const newAction = entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation = entitySet.annotations.Session) === null || _entitySet$annotation === void 0 ? void 0 : (_entitySet$annotation2 = _entitySet$annotation.StickySessionSupported) === null || _entitySet$annotation2 === void 0 ? void 0 : _entitySet$annotation2.NewAction;
532
- this._getInternalModel().setProperty("/lastInvokedAction", newAction);
589
+ this.getInternalModel().setProperty("/lastInvokedAction", newAction);
533
590
  }
534
591
  const oNewDocumentContext = aParams[0];
535
592
  if (oNewDocumentContext) {
536
- this._setDocumentModifiedOnCreate(oListBinding);
593
+ this.setDocumentModifiedOnCreate(oListBinding);
537
594
  if (!this._isFclEnabled()) {
538
595
  EditState.setEditStateDirty();
539
596
  }
540
597
  this._sendActivity(Activity.Create, oNewDocumentContext);
541
- if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel())) {
598
+ if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel()) && !ActivitySync.isConnected(this.getView())) {
542
599
  // according to UX in case of enabled collaboration draft we share the object immediately
543
600
  await shareObject(oNewDocumentContext);
544
601
  }
@@ -564,6 +621,96 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
564
621
  }
565
622
  }
566
623
 
624
+ /**
625
+ * Validates a document.
626
+ *
627
+ * @returns Promise resolves with result of the custom validation function
628
+ */;
629
+ _proto.validateDocument = function validateDocument(context, parameters) {
630
+ return this.getTransactionHelper().validateDocument(context, parameters, this.getView());
631
+ }
632
+
633
+ /**
634
+ * Creates several documents.
635
+ *
636
+ * @param listBinding The listBinding used to create the documents
637
+ * @param dataForCreate The initial data for the new documents
638
+ * @param createAtEnd True if the new contexts need to be crated at the end of the list binding
639
+ * @param isFromCopyPaste True if the creation has been triggered by a paste action
640
+ * @param beforeCreateCallBack Callback to be called before the creation
641
+ * @param createAsInactive True if the contexts need to be created inactive
642
+ * @returns A Promise with the newly created contexts.
643
+ */;
644
+ _proto.createMultipleDocuments = async function createMultipleDocuments(listBinding, dataForCreate, createAtEnd, isFromCopyPaste, beforeCreateCallBack) {
645
+ let createAsInactive = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
646
+ const transactionHelper = this.getTransactionHelper();
647
+ const lockObject = this.getGlobalUIModel();
648
+ const targetListBinding = listBinding;
649
+ BusyLocker.lock(lockObject);
650
+ try {
651
+ await this.syncTask();
652
+ if (beforeCreateCallBack) {
653
+ await beforeCreateCallBack({
654
+ contextPath: targetListBinding.getPath()
655
+ });
656
+ }
657
+ const metaModel = targetListBinding.getModel().getMetaModel();
658
+ let metaPath;
659
+ if (targetListBinding.getContext()) {
660
+ metaPath = metaModel.getMetaPath(`${targetListBinding.getContext().getPath()}/${targetListBinding.getPath()}`);
661
+ } else {
662
+ metaPath = metaModel.getMetaPath(targetListBinding.getPath());
663
+ }
664
+ this.handleCreateEvents(targetListBinding);
665
+
666
+ // Iterate on all items and store the corresponding creation promise
667
+ const creationPromises = dataForCreate.map(propertyValues => {
668
+ const createParameters = {
669
+ data: {}
670
+ };
671
+ createParameters.keepTransientContextOnFailed = false; // currently not fully supported
672
+ createParameters.busyMode = "None";
673
+ createParameters.creationMode = CreationMode.CreationRow;
674
+ createParameters.parentControl = this.getView();
675
+ createParameters.createAtEnd = createAtEnd;
676
+ createParameters.inactive = createAsInactive;
677
+
678
+ // Remove navigation properties as we don't support deep create
679
+ for (const propertyPath in propertyValues) {
680
+ const property = metaModel.getObject(`${metaPath}/${propertyPath}`);
681
+ if (property && property.$kind !== "NavigationProperty" && propertyPath.indexOf("/") < 0 && propertyValues[propertyPath]) {
682
+ createParameters.data[propertyPath] = propertyValues[propertyPath];
683
+ }
684
+ }
685
+ return transactionHelper.createDocument(targetListBinding, createParameters, this.getAppComponent(), this.getMessageHandler(), isFromCopyPaste);
686
+ });
687
+ const createdContexts = await Promise.all(creationPromises);
688
+ if (!createAsInactive) {
689
+ this.setDocumentModifiedOnCreate(targetListBinding);
690
+ }
691
+ // transient contexts are reliably removed once oNewContext.created() is resolved
692
+ await Promise.all(createdContexts.map(newContext => {
693
+ if (!newContext.bInactive) {
694
+ return newContext.created();
695
+ }
696
+ }));
697
+ const viewBindingContext = this.getView().getBindingContext();
698
+
699
+ // if there are transient contexts, we must avoid requesting side effects
700
+ // this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
701
+ // if list binding is refreshed, transient contexts might be lost
702
+ if (!CommonUtils.hasTransientContext(targetListBinding)) {
703
+ this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(targetListBinding.getPath(), viewBindingContext);
704
+ }
705
+ return createdContexts;
706
+ } catch (err) {
707
+ Log.error("Error while creating multiple documents.");
708
+ throw err;
709
+ } finally {
710
+ BusyLocker.unlock(lockObject);
711
+ }
712
+ }
713
+
567
714
  /**
568
715
  * This function can be used to intercept the 'Save' action. You can execute custom coding in this function.
569
716
  * The framework waits for the returned promise to be resolved before continuing the 'Save' action.
@@ -584,6 +731,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
584
731
  // to be overridden
585
732
  return Promise.resolve();
586
733
  }
734
+
587
735
  /**
588
736
  * This function can be used to intercept the 'Create' action. You can execute custom coding in this function.
589
737
  * The framework waits for the returned promise to be resolved before continuing the 'Create' action.
@@ -605,6 +753,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
605
753
  // to be overridden
606
754
  return Promise.resolve();
607
755
  }
756
+
608
757
  /**
609
758
  * This function can be used to intercept the 'Edit' action. You can execute custom coding in this function.
610
759
  * The framework waits for the returned promise to be resolved before continuing the 'Edit' action.
@@ -625,6 +774,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
625
774
  // to be overridden
626
775
  return Promise.resolve();
627
776
  }
777
+
628
778
  /**
629
779
  * This function can be used to intercept the 'Discard' action. You can execute custom coding in this function.
630
780
  * The framework waits for the returned promise to be resolved before continuing the 'Discard' action.
@@ -645,6 +795,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
645
795
  // to be overridden
646
796
  return Promise.resolve();
647
797
  }
798
+
648
799
  /**
649
800
  * This function can be used to intercept the 'Delete' action. You can execute custom coding in this function.
650
801
  * The framework waits for the returned promise to be resolved before continuing the 'Delete' action.
@@ -687,30 +838,30 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
687
838
  mParameters = mParameters || {};
688
839
  const bExecuteSideEffectsOnError = mParameters.bExecuteSideEffectsOnError || undefined;
689
840
  const bDraftNavigation = true;
690
- const transactionHelper = this._getTransactionHelper();
691
- const oResourceBundle = this._getResourceBundle();
841
+ const transactionHelper = this.getTransactionHelper();
692
842
  const aBindings = mParameters.bindings;
693
843
  try {
694
- await this._syncTask();
844
+ await this.syncTask();
695
845
  await this._submitOpenChanges(oContext);
696
846
  await this._checkForValidationErrors();
697
847
  await this.base.editFlow.onBeforeSave({
698
848
  context: oContext
699
849
  });
700
- const sProgrammingModel = this._getProgrammingModel(oContext);
850
+ const sProgrammingModel = this.getProgrammingModel(oContext);
701
851
  const oRootViewController = this._getRootViewController();
702
852
  let siblingInfo;
703
853
  if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && oRootViewController.isFclEnabled()) {
704
854
  // No need to try to get rightmost context in case of a new object
705
855
  siblingInfo = await this._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel, true);
706
856
  }
707
- const activeDocumentContext = await transactionHelper.saveDocument(oContext, this.getAppComponent(), oResourceBundle, bExecuteSideEffectsOnError, aBindings, this._getMessageHandler(), this._getCreationMode());
857
+ const activeDocumentContext = await transactionHelper.saveDocument(oContext, this.getAppComponent(), this._getResourceModel(), bExecuteSideEffectsOnError, aBindings, this.getMessageHandler(), this.getCreationMode());
708
858
  this._removeStickySessionInternalProperties(sProgrammingModel);
709
859
  this._sendActivity(Activity.Activate, activeDocumentContext);
860
+ ActivitySync.disconnect(this.getView());
710
861
  this._triggerConfiguredSurvey(StandardActions.save, TriggerType.standardAction);
711
- this._setDocumentModified(false);
712
- this._setEditMode(EditMode.Display, false);
713
- this._getMessageHandler().showMessageDialog();
862
+ this.setDocumentModified(false);
863
+ this.setEditMode(EditMode.Display, false);
864
+ this.getMessageHandler().showMessageDialog();
714
865
  if (activeDocumentContext !== oContext) {
715
866
  let contextToNavigate = activeDocumentContext;
716
867
  if (oRootViewController.isFclEnabled()) {
@@ -728,11 +879,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
728
879
  }
729
880
  throw oError;
730
881
  }
731
- };
882
+ }
883
+
884
+ /**
885
+ * Switches the UI between draft and active document.
886
+ *
887
+ * @param oContext The context to switch from
888
+ * @returns Promise resolved once the switch is done
889
+ */;
732
890
  _proto.toggleDraftActive = async function toggleDraftActive(oContext) {
733
891
  const oContextData = oContext.getObject();
734
892
  let bEditable;
735
- const bIsDraft = oContext && this._getProgrammingModel(oContext) === ProgrammingModel.Draft;
893
+ const bIsDraft = oContext && this.getProgrammingModel(oContext) === ProgrammingModel.Draft;
736
894
 
737
895
  //toggle between draft and active document is only available for edit drafts and active documents with draft)
738
896
  if (!bIsDraft || !(!oContextData.IsActiveEntity && oContextData.HasActiveEntity || oContextData.IsActiveEntity && oContextData.HasDraftEntity)) {
@@ -750,7 +908,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
750
908
  const oRightmostContext = oRootViewController.isFclEnabled() ? oRootViewController.getRightmostContext() : oContext;
751
909
  const siblingInfo = await this._computeSiblingInformation(oContext, oRightmostContext, ProgrammingModel.Draft, false);
752
910
  if (siblingInfo) {
753
- this._setEditMode(bEditable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
911
+ this.setEditMode(bEditable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
754
912
 
755
913
  if (oRootViewController.isFclEnabled()) {
756
914
  const lastSemanticMapping = this._getSemanticMapping();
@@ -765,10 +923,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
765
923
  }
766
924
  await this._handleNewContext(siblingInfo.targetContext, bEditable, true, true, true);
767
925
  } else {
768
- return Promise.reject("Error in EditFlow.toggleDraftActive - Cannot find sibling");
926
+ throw new Error("Error in EditFlow.toggleDraftActive - Cannot find sibling");
769
927
  }
770
928
  } catch (oError) {
771
- return Promise.reject(`Error in EditFlow.toggleDraftActive:${oError}`);
929
+ throw new Error(`Error in EditFlow.toggleDraftActive:${oError}`);
772
930
  }
773
931
  }
774
932
 
@@ -790,39 +948,40 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
790
948
  * @since 1.90.0
791
949
  */;
792
950
  _proto.cancelDocument = async function cancelDocument(oContext, mParameters) {
793
- const transactionHelper = this._getTransactionHelper();
794
- const oResourceBundle = this._getResourceBundle();
951
+ const transactionHelper = this.getTransactionHelper();
795
952
  const mInParameters = mParameters;
796
953
  let siblingInfo;
797
954
  mInParameters.cancelButton = mParameters.control || mInParameters.cancelButton;
798
955
  mInParameters.beforeCancelCallBack = this.base.editFlow.onBeforeDiscard;
799
956
  try {
800
- await this._syncTask();
801
- const sProgrammingModel = this._getProgrammingModel(oContext);
957
+ await this.syncTask();
958
+ const sProgrammingModel = this.getProgrammingModel(oContext);
802
959
  if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && this._isFclEnabled()) {
803
960
  const oRootViewController = this._getRootViewController();
804
961
 
805
962
  // No need to try to get rightmost context in case of a new object
806
963
  siblingInfo = await this._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel, true);
807
964
  }
808
- const cancelResult = await transactionHelper.cancelDocument(oContext, mInParameters, this.getAppComponent(), oResourceBundle, this._getMessageHandler(), this._getCreationMode(), this._isDocumentModified());
965
+ const cancelResult = await transactionHelper.cancelDocument(oContext, mInParameters, this.getAppComponent(), this._getResourceModel(), this.getMessageHandler(), this.getCreationMode(), this.isDocumentModified());
809
966
  const bDraftNavigation = true;
810
967
  this._removeStickySessionInternalProperties(sProgrammingModel);
811
- this._setEditMode(EditMode.Display, false);
812
- this._setDocumentModified(false);
813
- this._setDraftStatus(DraftStatus.Clear);
968
+ this.setEditMode(EditMode.Display, false);
969
+ this.setDocumentModified(false);
970
+ this.setDraftStatus(DraftStatus.Clear);
814
971
  // we force the edit state even for FCL because the draft discard might not be implemented
815
972
  // and we may just delete the draft
816
973
  EditState.setEditStateDirty();
817
974
  if (!cancelResult) {
818
975
  this._sendActivity(Activity.Discard, undefined);
976
+ ActivitySync.disconnect(this.getView());
819
977
  //in case of a new document, no activeContext is returned --> navigate back.
820
978
  if (!mInParameters.skipBackNavigation) {
821
- await this._getRoutingListener().navigateBackFromContext(oContext);
979
+ await this.getInternalRouting().navigateBackFromContext(oContext);
822
980
  }
823
981
  } else {
824
982
  const oActiveDocumentContext = cancelResult;
825
983
  this._sendActivity(Activity.Discard, oActiveDocumentContext);
984
+ ActivitySync.disconnect(this.getView());
826
985
  let contextToNavigate = oActiveDocumentContext;
827
986
  if (this._isFclEnabled()) {
828
987
  siblingInfo = siblingInfo ?? this._createSiblingInfo(oContext, oActiveDocumentContext);
@@ -883,7 +1042,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
883
1042
  * @since 1.90.0
884
1043
  */;
885
1044
  _proto.deleteDocument = async function deleteDocument(oContext, mInParameters) {
886
- const oAppComponent = CommonUtils.getAppComponent(this.getView());
1045
+ const oAppComponent = this.getAppComponent();
887
1046
  let mParameters = mInParameters;
888
1047
  if (!mParameters) {
889
1048
  mParameters = {
@@ -911,7 +1070,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
911
1070
  }
912
1071
  };
913
1072
  }
914
- await this._deleteDocumentTransaction(oContext, mParameters);
1073
+ await this.deleteDocumentTransaction(oContext, mParameters);
915
1074
 
916
1075
  // Single objet deletion is triggered from an OP header button (not from a list)
917
1076
  // --> Mark UI dirty and navigate back to dismiss the OP
@@ -929,7 +1088,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
929
1088
  // to the app we came from (except for FCL, where we navigate to LR as usual)
930
1089
  oAppComponent.getRouterProxy().exitFromApp();
931
1090
  } else {
932
- this._getRoutingListener().navigateBackFromContext(oContext);
1091
+ this.getInternalRouting().navigateBackFromContext(oContext);
933
1092
  }
934
1093
  } catch (error) {
935
1094
  Log.error("Error while deleting the document", error);
@@ -947,14 +1106,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
947
1106
  * @since 1.90.0
948
1107
  */;
949
1108
  _proto.applyDocument = async function applyDocument(oContext) {
950
- const oLockObject = this._getGlobalUIModel();
1109
+ const oLockObject = this.getGlobalUIModel();
951
1110
  BusyLocker.lock(oLockObject);
952
1111
  try {
953
- await this._syncTask();
1112
+ await this.syncTask();
954
1113
  await this._submitOpenChanges(oContext);
955
1114
  await this._checkForValidationErrors();
956
- await this._getMessageHandler().showMessageDialog();
957
- await this._getRoutingListener().navigateBackFromContext(oContext);
1115
+ await this.getMessageHandler().showMessageDialog();
1116
+ await this.getInternalRouting().navigateBackFromContext(oContext);
958
1117
  } finally {
959
1118
  if (BusyLocker.isLocked(oLockObject)) {
960
1119
  BusyLocker.unlock(oLockObject);
@@ -990,9 +1149,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
990
1149
  * @final
991
1150
  */;
992
1151
  _proto.invokeAction = async function invokeAction(sActionName, mInParameters, mExtraParams) {
993
- var _model$getMetaModel;
1152
+ var _this$getView$getMode;
994
1153
  let oControl;
995
- const transactionHelper = this._getTransactionHelper();
1154
+ const transactionHelper = this.getTransactionHelper();
996
1155
  let aParts;
997
1156
  let sOverloadEntityType;
998
1157
  let oCurrentActionCallBacks;
@@ -1012,17 +1171,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1012
1171
  }
1013
1172
  mParameters.isNavigable = mParameters.requiresNavigation || mParameters.isNavigable;
1014
1173
 
1015
- // Determine if the action is bound or unbound
1016
- const model = this.getView().getModel();
1017
- const actionMetaData = model === null || model === void 0 ? void 0 : (_model$getMetaModel = model.getMetaModel()) === null || _model$getMetaModel === void 0 ? void 0 : _model$getMetaModel.getObject("/" + sActionName.split("(")[0]);
1018
- if (actionMetaData) {
1019
- if (!Array.isArray(actionMetaData)) {
1020
- mParameters.isBound = actionMetaData.$IsBound ? actionMetaData.$IsBound : false;
1021
- } else if (actionMetaData[0].$kind === "Action" && actionMetaData[0].$IsBound === true) {
1022
- mParameters.isBound = true;
1023
- }
1174
+ // Determine if the referenced action is bound or unbound
1175
+ const convertedMetadata = convertTypes((_this$getView$getMode = this.getView().getModel()) === null || _this$getView$getMode === void 0 ? void 0 : _this$getView$getMode.getMetaModel());
1176
+ // The EntityContainer may NOT be missing, so it should not be able to be undefined, but since in our converted Metadata
1177
+ // it can be undefined, I need this workaround here of adding "" since indexOf does not accept something that's
1178
+ // undefined.
1179
+ if (sActionName.indexOf("" + convertedMetadata.entityContainer.name) > -1) {
1180
+ // Unbound actions are always referenced via the action import and we found the EntityContainer in the sActionName so
1181
+ // an unbound action is referenced!
1182
+ mParameters.isBound = false;
1024
1183
  } else {
1025
- throw new Error("Error in EditFlow.invokeAction: The specified action could not be found");
1184
+ // No entity container in the sActionName, so either a bound or static action is referenced which is also bound!
1185
+ mParameters.isBound = true;
1026
1186
  }
1027
1187
  if (!mParameters.parentControl) {
1028
1188
  mParameters.parentControl = this.getView();
@@ -1057,19 +1217,26 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1057
1217
  mParameters.contexts = this._getActionOverloadContextFromMetadataPath(oControl.getBindingContext(), oControl.getRowBinding(), sOverloadEntityType);
1058
1218
  }
1059
1219
  if (mParameters.enableAutoScroll) {
1060
- oCurrentActionCallBacks = this._createActionPromise(sActionName, oControl.sId);
1220
+ oCurrentActionCallBacks = this.createActionPromise(sActionName, oControl.sId);
1061
1221
  }
1062
1222
  }
1063
1223
  mParameters.bGetBoundContext = this._getBoundContext(oView, mParameters);
1064
1224
  // Need to know that the action is called from ObjectPage for changeSet Isolated workaround
1065
1225
  mParameters.bObjectPage = oView.getViewData().converterType === "ObjectPage";
1066
1226
  try {
1067
- await this._syncTask();
1068
- const oResponse = await transactionHelper.callAction(sActionName, mParameters, this.getView(), this.getAppComponent(), this._getMessageHandler());
1227
+ await this.syncTask();
1228
+ const oResponse = await transactionHelper.callAction(sActionName, mParameters, this.getView(), this.getAppComponent(), this.getMessageHandler());
1229
+ let listRefreshed;
1069
1230
  if (mParameters.contexts && mParameters.isBound === true) {
1070
- await this._refreshListIfRequired(this._getActionResponseDataAndKeys(sActionName, oResponse), mParameters.contexts[0]);
1231
+ listRefreshed = await this._refreshListIfRequired(this.getActionResponseDataAndKeys(sActionName, oResponse), mParameters.contexts[0]);
1232
+ }
1233
+ if (ActivitySync.isConnected(this.getView())) {
1234
+ let actionRequestedProperties = [];
1235
+ if (oResponse) {
1236
+ actionRequestedProperties = Array.isArray(oResponse) ? Object.keys(oResponse[0].value.getObject()) : Object.keys(oResponse.getObject());
1237
+ }
1238
+ this._sendActivity(Activity.Action, mParameters.contexts, sActionName, listRefreshed, actionRequestedProperties);
1071
1239
  }
1072
- this._sendActivity(Activity.Action, mParameters.contexts, sActionName);
1073
1240
  this._triggerConfiguredSurvey(sActionName, TriggerType.action);
1074
1241
  if (oCurrentActionCallBacks) {
1075
1242
  oCurrentActionCallBacks.fResolver(oResponse);
@@ -1090,7 +1257,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1090
1257
  if (!this._isFclEnabled()) {
1091
1258
  EditState.setEditStateDirty();
1092
1259
  }
1093
- this._getInternalModel().setProperty("/lastInvokedAction", sActionName);
1260
+ this.getInternalModel().setProperty("/lastInvokedAction", sActionName);
1094
1261
  }
1095
1262
  if (mParameters.isNavigable) {
1096
1263
  let vContext = oResponse;
@@ -1112,7 +1279,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1112
1279
  const sActionContextMetaPath = oActionContext && oMetaModel.getMetaPath(oActionContext.getPath());
1113
1280
  if (sContextMetaPath != undefined && sContextMetaPath === sActionContextMetaPath) {
1114
1281
  if (oActionContext.getPath() !== vContext.getPath()) {
1115
- this._getRoutingListener().navigateForwardToContext(vContext, {
1282
+ this.getInternalRouting().navigateForwardToContext(vContext, {
1116
1283
  checkNoHashChange: true,
1117
1284
  noHistoryEntry: false
1118
1285
  });
@@ -1159,12 +1326,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1159
1326
  * @since 1.90.0
1160
1327
  */;
1161
1328
  _proto.securedExecution = function securedExecution(fnFunction, mParameters) {
1162
- const bBusySet = mParameters && mParameters.busy && mParameters.busy.set !== undefined ? mParameters.busy.set : true,
1163
- bBusyCheck = mParameters && mParameters.busy && mParameters.busy.check !== undefined ? mParameters.busy.check : true,
1164
- bUpdatesDocument = mParameters && mParameters.updatesDocument || false,
1165
- oLockObject = this._getGlobalUIModel(),
1166
- oContext = this.base.getView().getBindingContext(),
1167
- bIsDraft = oContext && this._getProgrammingModel(oContext) === ProgrammingModel.Draft;
1329
+ var _mParameters$busy, _mParameters$busy2;
1330
+ const bBusySet = (mParameters === null || mParameters === void 0 ? void 0 : (_mParameters$busy = mParameters.busy) === null || _mParameters$busy === void 0 ? void 0 : _mParameters$busy.set) ?? true,
1331
+ bBusyCheck = (mParameters === null || mParameters === void 0 ? void 0 : (_mParameters$busy2 = mParameters.busy) === null || _mParameters$busy2 === void 0 ? void 0 : _mParameters$busy2.check) ?? true,
1332
+ bUpdatesDocument = (mParameters === null || mParameters === void 0 ? void 0 : mParameters.updatesDocument) ?? false,
1333
+ oLockObject = this.getGlobalUIModel(),
1334
+ oContext = this.getView().getBindingContext(),
1335
+ bIsDraft = oContext && this.getProgrammingModel(oContext) === ProgrammingModel.Draft;
1168
1336
  if (bBusyCheck && BusyLocker.isLocked(oLockObject)) {
1169
1337
  return Promise.reject("Application already busy therefore execution rejected");
1170
1338
  }
@@ -1174,29 +1342,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1174
1342
  BusyLocker.lock(oLockObject);
1175
1343
  }
1176
1344
  if (bUpdatesDocument && bIsDraft) {
1177
- this._setDraftStatus(DraftStatus.Saving);
1345
+ this.setDraftStatus(DraftStatus.Saving);
1178
1346
  }
1179
- this._getMessageHandler().removeTransitionMessages();
1180
- return this._syncTask(fnFunction).then(() => {
1347
+ this.getMessageHandler().removeTransitionMessages();
1348
+ return this.syncTask(fnFunction).then(() => {
1181
1349
  if (bUpdatesDocument) {
1182
- this._setDocumentModified(true);
1350
+ this.setDocumentModified(true);
1183
1351
  if (!this._isFclEnabled()) {
1184
1352
  EditState.setEditStateDirty();
1185
1353
  }
1186
1354
  if (bIsDraft) {
1187
- this._setDraftStatus(DraftStatus.Saved);
1355
+ this.setDraftStatus(DraftStatus.Saved);
1188
1356
  }
1189
1357
  }
1190
1358
  }).catch(oError => {
1191
1359
  if (bUpdatesDocument && bIsDraft) {
1192
- this._setDraftStatus(DraftStatus.Clear);
1360
+ this.setDraftStatus(DraftStatus.Clear);
1193
1361
  }
1194
1362
  return Promise.reject(oError);
1195
1363
  }).finally(() => {
1196
1364
  if (bBusySet) {
1197
1365
  BusyLocker.unlock(oLockObject);
1198
1366
  }
1199
- this._getMessageHandler().showMessageDialog();
1367
+ this.getMessageHandler().showMessageDialog();
1200
1368
  });
1201
1369
  }
1202
1370
 
@@ -1208,11 +1376,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1208
1376
  _proto.handlePatchSent = function handlePatchSent(oEvent) {
1209
1377
  var _this$getView, _this$getView$getBind;
1210
1378
  // In collaborative draft, disable ETag check for PATCH requests
1211
- const isInCollaborativeDraft = isConnected(this.getView());
1379
+ const isInCollaborativeDraft = ActivitySync.isConnected(this.getView());
1212
1380
  if (isInCollaborativeDraft) {
1213
1381
  oEvent.getSource().getModel().setIgnoreETag(true);
1214
1382
  }
1215
1383
  if (!((_this$getView = this.getView()) !== null && _this$getView !== void 0 && (_this$getView$getBind = _this$getView.getBindingContext("internal")) !== null && _this$getView$getBind !== void 0 && _this$getView$getBind.getProperty("skipPatchHandlers"))) {
1384
+ const sourceBinding = oEvent.getSource();
1216
1385
  // Create a promise that will be resolved or rejected when the path is completed
1217
1386
  const oPatchPromise = new Promise((resolve, reject) => {
1218
1387
  oEvent.getSource().attachEventOnce("patchCompleted", patchCompletedEvent => {
@@ -1222,7 +1391,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1222
1391
  }
1223
1392
  if (oEvent.getSource().isA("sap.ui.model.odata.v4.ODataListBinding")) {
1224
1393
  var _this$getView2;
1225
- ActionRuntime.setActionEnablementAfterPatch(this.getView(), oEvent.getSource(), (_this$getView2 = this.getView()) === null || _this$getView2 === void 0 ? void 0 : _this$getView2.getBindingContext("internal"));
1394
+ ActionRuntime.setActionEnablementAfterPatch(this.getView(), sourceBinding, (_this$getView2 = this.getView()) === null || _this$getView2 === void 0 ? void 0 : _this$getView2.getBindingContext("internal"));
1226
1395
  }
1227
1396
  const bSuccess = patchCompletedEvent.getParameter("success");
1228
1397
  if (bSuccess) {
@@ -1232,7 +1401,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1232
1401
  }
1233
1402
  });
1234
1403
  });
1235
- this.updateDocument(oEvent.getSource(), oPatchPromise);
1404
+ this.updateDocument(sourceBinding, oPatchPromise);
1236
1405
  }
1237
1406
  }
1238
1407
 
@@ -1243,7 +1412,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1243
1412
  */;
1244
1413
  _proto.handleCreateActivate = async function handleCreateActivate(oEvent) {
1245
1414
  const oBinding = oEvent.getSource();
1246
- const transactionHelper = this._getTransactionHelper();
1415
+ const transactionHelper = this.getTransactionHelper();
1247
1416
  const bAtEnd = true;
1248
1417
  const bInactive = true;
1249
1418
  const oParams = {
@@ -1265,7 +1434,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1265
1434
  });
1266
1435
 
1267
1436
  // Create a new inactive context (empty row in the table)
1268
- const newInactiveContext = await transactionHelper.createDocument(oBinding, oParams, this.getAppComponent(), this._getMessageHandler(), false, this.getView());
1437
+ const newInactiveContext = await transactionHelper.createDocument(oBinding, oParams, this.getAppComponent(), this.getMessageHandler(), false);
1269
1438
  if (newInactiveContext) {
1270
1439
  if (!this._isFclEnabled()) {
1271
1440
  EditState.setEditStateDirty();
@@ -1276,109 +1445,618 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1276
1445
  }
1277
1446
  }
1278
1447
 
1448
+ /**
1449
+ * Performs a task in sync with other tasks created via this function.
1450
+ * Returns the promise chain of the task.
1451
+ *
1452
+ * @param [newTask] Optional, a promise or function to be executed synchronously
1453
+ * @returns Promise resolves once the task is completed
1454
+ * @private
1455
+ */;
1456
+ _proto.syncTask = function syncTask(newTask) {
1457
+ if (newTask) {
1458
+ if (typeof newTask === "function") {
1459
+ this.syncTasks = this.syncTasks.then(newTask).catch(function () {
1460
+ return Promise.resolve();
1461
+ });
1462
+ } else {
1463
+ this.syncTasks = this.syncTasks.then(() => newTask).catch(function () {
1464
+ return Promise.resolve();
1465
+ });
1466
+ }
1467
+ }
1468
+ return this.syncTasks;
1469
+ }
1470
+
1471
+ /**
1472
+ * Decides if a document is to be shown in display or edit mode.
1473
+ *
1474
+ * @param {sap.ui.model.odata.v4.Context} oContext The context to be displayed or edited
1475
+ * @returns {Promise} Promise resolves once the edit mode is computed
1476
+ */;
1477
+ _proto.computeEditMode = async function computeEditMode(context) {
1478
+ const programmingModel = this.getProgrammingModel(context);
1479
+ if (programmingModel === ProgrammingModel.Draft) {
1480
+ try {
1481
+ this.setDraftStatus(DraftStatus.Clear);
1482
+ const globalModel = this.getGlobalUIModel();
1483
+ globalModel.setProperty("/isEditablePending", true, undefined, true);
1484
+ const isActiveEntity = await context.requestObject("IsActiveEntity");
1485
+ if (isActiveEntity === false) {
1486
+ // in case the document is draft set it in edit mode
1487
+ this.setEditMode(EditMode.Editable);
1488
+ const hasActiveEntity = await context.requestObject("HasActiveEntity");
1489
+ this.setEditMode(undefined, !hasActiveEntity);
1490
+ } else {
1491
+ // active document, stay on display mode
1492
+ this.setEditMode(EditMode.Display, false);
1493
+ }
1494
+ globalModel.setProperty("/isEditablePending", false, undefined, true);
1495
+ } catch (error) {
1496
+ Log.error("Error while determining the editMode for draft", error);
1497
+ throw error;
1498
+ }
1499
+ } else if (programmingModel === ProgrammingModel.Sticky) {
1500
+ const lastInvokedActionName = this.getInternalModel().getProperty("/lastInvokedAction");
1501
+ if (lastInvokedActionName && this.isNewActionForSticky(lastInvokedActionName, context)) {
1502
+ this.setEditMode(EditMode.Editable, true);
1503
+ if (!this.getAppComponent()._isFclEnabled()) {
1504
+ EditState.setEditStateDirty();
1505
+ }
1506
+ this.handleStickyOn(context);
1507
+ this.getInternalModel().setProperty("/lastInvokedAction", undefined);
1508
+ }
1509
+ }
1510
+ }
1511
+
1279
1512
  //////////////////////////////////////
1280
1513
  // Private methods
1281
1514
  //////////////////////////////////////
1282
1515
 
1283
- /*
1284
- TO BE CHECKED / DISCUSSED
1285
- _createMultipleDocuments and deleteMultiDocument - couldn't we combine them with create and delete document?
1286
- _createActionPromise and deleteCurrentActionPromise -> next step
1287
- */;
1288
- _proto._setEditMode = function _setEditMode(sEditMode, bCreationMode) {
1289
- this.getInternalEditFlow().setEditMode(sEditMode, bCreationMode);
1290
- };
1291
- _proto._getCreationMode = function _getCreationMode() {
1292
- return this.getInternalEditFlow().getCreationMode();
1293
- };
1294
- _proto._isDocumentModified = function _isDocumentModified() {
1295
- return this.getInternalEditFlow().isDocumentModified();
1296
- };
1297
- _proto._setDocumentModified = function _setDocumentModified(modified) {
1298
- this.getInternalEditFlow().setDocumentModified(modified);
1299
- };
1300
- _proto._setDocumentModifiedOnCreate = function _setDocumentModifiedOnCreate(listBinding) {
1301
- this.getInternalEditFlow().setDocumentModifiedOnCreate(listBinding);
1302
- };
1303
- _proto._setDraftStatus = function _setDraftStatus(sDraftState) {
1304
- this.getInternalEditFlow().setDraftStatus(sDraftState);
1305
- };
1306
- _proto._getRoutingListener = function _getRoutingListener() {
1307
- return this.getInternalEditFlow().getRoutingListener();
1308
- };
1309
- _proto._getGlobalUIModel = function _getGlobalUIModel() {
1310
- return this.getInternalEditFlow().getGlobalUIModel();
1311
- };
1312
- _proto._syncTask = function _syncTask(vTask) {
1313
- return this.getInternalEditFlow().syncTask(vTask);
1516
+ /**
1517
+ * Internal method to delete a context or an array of contexts.
1518
+ *
1519
+ * @param contexts The context(s) to be deleted
1520
+ * @param parameters Parameters for deletion
1521
+ */;
1522
+ _proto.deleteDocumentTransaction = async function deleteDocumentTransaction(contexts, parameters) {
1523
+ var _sap$ui$getCore$byId;
1524
+ const resourceModel = getResourceModel(this);
1525
+ const transactionHelper = this.getTransactionHelper();
1526
+
1527
+ // TODO: this setting and removing of contexts shouldn't be in the transaction helper at all
1528
+ // for the time being I kept it and provide the internal model context to not break something
1529
+ parameters.internalModelContext = parameters.controlId ? (_sap$ui$getCore$byId = sap.ui.getCore().byId(parameters.controlId)) === null || _sap$ui$getCore$byId === void 0 ? void 0 : _sap$ui$getCore$byId.getBindingContext("internal") : null;
1530
+ await this.syncTask();
1531
+ await transactionHelper.deleteDocument(contexts, parameters, this.getAppComponent(), resourceModel, this.getMessageHandler());
1532
+ const internalModel = this.getInternalModel();
1533
+ internalModel.setProperty("/sessionOn", false);
1534
+ internalModel.setProperty("/stickySessionToken", undefined);
1314
1535
  };
1315
- _proto._getProgrammingModel = function _getProgrammingModel(oContext) {
1316
- return this.getInternalEditFlow().getProgrammingModel(oContext);
1536
+ _proto._getResourceModel = function _getResourceModel() {
1537
+ return getResourceModel(this.getView());
1317
1538
  };
1318
- _proto._deleteDocumentTransaction = function _deleteDocumentTransaction(oContext, mParameters) {
1319
- return this.getInternalEditFlow().deleteDocumentTransaction(oContext, mParameters);
1539
+ _proto.getTransactionHelper = function getTransactionHelper() {
1540
+ return TransactionHelper;
1320
1541
  };
1321
- _proto._handleCreateEvents = function _handleCreateEvents(oBinding) {
1322
- this.getInternalEditFlow().handleCreateEvents(oBinding);
1542
+ _proto.getMessageHandler = function getMessageHandler() {
1543
+ if (this.base.messageHandler) {
1544
+ return this.base.messageHandler;
1545
+ } else {
1546
+ throw new Error("Edit Flow works only with a given message handler");
1547
+ }
1323
1548
  };
1324
- _proto._getTransactionHelper = function _getTransactionHelper() {
1325
- return this.getInternalEditFlow().getTransactionHelper();
1549
+ _proto.getInternalModel = function getInternalModel() {
1550
+ return this.getView().getModel("internal");
1326
1551
  };
1327
- _proto._getInternalModel = function _getInternalModel() {
1328
- return this.getInternalEditFlow().getInternalModel();
1552
+ _proto.getGlobalUIModel = function getGlobalUIModel() {
1553
+ return this.getView().getModel("ui");
1554
+ }
1555
+
1556
+ /**
1557
+ * Sets that the current page contains a newly created object.
1558
+ *
1559
+ * @param bCreationMode True if the object is new
1560
+ */;
1561
+ _proto.setCreationMode = function setCreationMode(bCreationMode) {
1562
+ const uiModelContext = this.getView().getBindingContext("ui");
1563
+ this.getGlobalUIModel().setProperty("createMode", bCreationMode, uiModelContext, true);
1564
+ }
1565
+
1566
+ /**
1567
+ * Indicates whether the current page contains a newly created object or not.
1568
+ *
1569
+ * @returns True if the object is new
1570
+ */;
1571
+ _proto.getCreationMode = function getCreationMode() {
1572
+ const uiModelContext = this.getView().getBindingContext("ui");
1573
+ return !!this.getGlobalUIModel().getProperty("createMode", uiModelContext);
1574
+ }
1575
+
1576
+ /**
1577
+ * Indicates whether the object being edited (or one of its sub-objects) has been modified or not.
1578
+ *
1579
+ * @returns True if the object has been modified
1580
+ */;
1581
+ _proto.isDocumentModified = function isDocumentModified() {
1582
+ return !!this.getGlobalUIModel().getProperty("/isDocumentModified");
1583
+ }
1584
+
1585
+ /**
1586
+ * Sets that the object being edited (or one of its sub-objects) has been modified.
1587
+ *
1588
+ * @param modified True if the object has been modified
1589
+ */;
1590
+ _proto.setDocumentModified = function setDocumentModified(modified) {
1591
+ this.getGlobalUIModel().setProperty("/isDocumentModified", modified);
1592
+ }
1593
+
1594
+ /**
1595
+ * Sets that the object being edited has been modified by creating a sub-object.
1596
+ *
1597
+ * @param listBinding The list binding on which the object has been created
1598
+ */;
1599
+ _proto.setDocumentModifiedOnCreate = function setDocumentModifiedOnCreate(listBinding) {
1600
+ // Set the modified flag only on relative listBindings, i.e. when creating a sub-object
1601
+ // If the listBinding is not relative, then it's a creation from the ListReport, and by default a newly created root object isn't considered as modified
1602
+ if (listBinding.isRelative()) {
1603
+ this.setDocumentModified(true);
1604
+ }
1605
+ }
1606
+
1607
+ /**
1608
+ * Handles the create event: shows messages and in case of a draft, updates the draft indicator.
1609
+ *
1610
+ * @memberof sap.fe.core.controllerextensions.EditFlow
1611
+ * @param binding OData list binding object
1612
+ */;
1613
+ _proto.handleCreateEvents = function handleCreateEvents(binding) {
1614
+ this.setDraftStatus(DraftStatus.Clear);
1615
+ const programmingModel = this.getProgrammingModel(binding);
1616
+ binding.attachEvent("createSent", () => {
1617
+ if (programmingModel === ProgrammingModel.Draft) {
1618
+ this.setDraftStatus(DraftStatus.Saving);
1619
+ }
1620
+ });
1621
+ binding.attachEvent("createCompleted", oEvent => {
1622
+ const success = oEvent.getParameter("success");
1623
+ if (programmingModel === ProgrammingModel.Draft) {
1624
+ this.setDraftStatus(success ? DraftStatus.Saved : DraftStatus.Clear);
1625
+ }
1626
+ this.getMessageHandler().showMessageDialog();
1627
+ });
1628
+ }
1629
+
1630
+ /**
1631
+ * Updates the draft status message (displayed at the bottom of the page).
1632
+ *
1633
+ * @param draftStatus The draft status message
1634
+ */;
1635
+ _proto.setDraftStatus = function setDraftStatus(draftStatus) {
1636
+ this.getView().getModel("ui").setProperty("/draftStatus", draftStatus, undefined, true);
1637
+ }
1638
+
1639
+ /**
1640
+ * Gets the programming model from a binding or a context.
1641
+ *
1642
+ * @param source The binding or context
1643
+ * @returns The programming model
1644
+ */;
1645
+ _proto.getProgrammingModel = function getProgrammingModel(source) {
1646
+ return this.getTransactionHelper().getProgrammingModel(source);
1647
+ }
1648
+
1649
+ /**
1650
+ * Sets the edit mode.
1651
+ *
1652
+ * @param editMode The edit mode
1653
+ * @param isCreation True if the object has been newly created
1654
+ */;
1655
+ _proto.setEditMode = function setEditMode(editMode, isCreation) {
1656
+ // at this point of time it's not meant to release the edit flow for freestyle usage therefore we can
1657
+ // rely on the global UI model to exist
1658
+ const globalModel = this.getGlobalUIModel();
1659
+ if (editMode) {
1660
+ globalModel.setProperty("/isEditable", editMode === "Editable", undefined, true);
1661
+ }
1662
+ if (isCreation !== undefined) {
1663
+ // Since setCreationMode is public in EditFlow and can be overriden, make sure to call it via the controller
1664
+ // to ensure any overrides are taken into account
1665
+ this.setCreationMode(isCreation);
1666
+ }
1667
+ }
1668
+
1669
+ /**
1670
+ * Checks if an action corresponds to a create action for a sticky session.
1671
+ *
1672
+ * @param actionName The name of the action
1673
+ * @param context Context for the sticky session
1674
+ * @returns True if the action is a create action
1675
+ */;
1676
+ _proto.isNewActionForSticky = function isNewActionForSticky(actionName, context) {
1677
+ try {
1678
+ var _entitySet$annotation3;
1679
+ const metaModel = context.getModel().getMetaModel();
1680
+ const metaContext = metaModel.getMetaContext(context.getPath());
1681
+ const entitySet = getInvolvedDataModelObjects(metaContext).startingEntitySet;
1682
+ const stickySession = (_entitySet$annotation3 = entitySet.annotations.Session) === null || _entitySet$annotation3 === void 0 ? void 0 : _entitySet$annotation3.StickySessionSupported;
1683
+ if ((stickySession === null || stickySession === void 0 ? void 0 : stickySession.NewAction) === actionName) {
1684
+ return true;
1685
+ }
1686
+ if (stickySession !== null && stickySession !== void 0 && stickySession.AdditionalNewActions && (stickySession === null || stickySession === void 0 ? void 0 : stickySession.AdditionalNewActions.indexOf(actionName)) !== -1) {
1687
+ return true;
1688
+ }
1689
+ return false;
1690
+ } catch (error) {
1691
+ Log.info(error);
1692
+ return false;
1693
+ }
1694
+ }
1695
+
1696
+ // TODO Move all sticky-related below to a sticky session manager class
1697
+
1698
+ /**
1699
+ * Enables the sticky edit session.
1700
+ *
1701
+ * @param context The context being edited
1702
+ * @returns True in case of success, false otherwise
1703
+ */;
1704
+ _proto.handleStickyOn = function handleStickyOn(context) {
1705
+ const appComponent = this.getAppComponent();
1706
+ try {
1707
+ if (appComponent === undefined) {
1708
+ throw new Error("undefined AppComponent for function handleStickyOn");
1709
+ }
1710
+ if (!appComponent.getRouterProxy().hasNavigationGuard()) {
1711
+ const hashTracker = appComponent.getRouterProxy().getHash();
1712
+ const internalModel = this.getInternalModel();
1713
+
1714
+ // Set a guard in the RouterProxy
1715
+ // A timeout is necessary, as with deferred creation the hashChanger is not updated yet with
1716
+ // the new hash, and the guard cannot be found in the managed history of the router proxy
1717
+ setTimeout(function () {
1718
+ appComponent.getRouterProxy().setNavigationGuard(context.getPath().substring(1));
1719
+ }, 0);
1720
+
1721
+ // Setting back navigation on shell service, to get the dicard message box in case of sticky
1722
+ appComponent.getShellServices().setBackNavigation(this.onBackNavigationInSession.bind(this));
1723
+ this.dirtyStateProviderFunction = this.getDirtyStateProvider(appComponent, internalModel, hashTracker);
1724
+ appComponent.getShellServices().registerDirtyStateProvider(this.dirtyStateProviderFunction);
1725
+
1726
+ // handle session timeout
1727
+ const i18nModel = this.getView().getModel("sap.fe.i18n");
1728
+ this.sessionTimeoutFunction = this.getSessionTimeoutFunction(context, i18nModel);
1729
+ this.getView().getModel().attachSessionTimeout(this.sessionTimeoutFunction);
1730
+ this.stickyDiscardAfterNavigationFunction = this.getRouteMatchedFunction(context, appComponent);
1731
+ appComponent.getRoutingService().attachRouteMatched(this.stickyDiscardAfterNavigationFunction);
1732
+ }
1733
+ } catch (error) {
1734
+ Log.info(error);
1735
+ return false;
1736
+ }
1737
+ return true;
1738
+ }
1739
+
1740
+ /**
1741
+ * Disables the sticky edit session.
1742
+ *
1743
+ * @returns True in case of success, false otherwise
1744
+ */;
1745
+ _proto.handleStickyOff = function handleStickyOff() {
1746
+ const appComponent = this.getAppComponent();
1747
+ try {
1748
+ if (appComponent === undefined) {
1749
+ throw new Error("undefined AppComponent for function handleStickyOff");
1750
+ }
1751
+ if (appComponent.getRouterProxy) {
1752
+ // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
1753
+ // sap.fe.core.AppComponent, hence the 'if' above
1754
+ appComponent.getRouterProxy().discardNavigationGuard();
1755
+ }
1756
+ if (this.dirtyStateProviderFunction) {
1757
+ appComponent.getShellServices().deregisterDirtyStateProvider(this.dirtyStateProviderFunction);
1758
+ this.dirtyStateProviderFunction = undefined;
1759
+ }
1760
+ const model = this.getView().getModel();
1761
+ if (model && this.sessionTimeoutFunction) {
1762
+ model.detachSessionTimeout(this.sessionTimeoutFunction);
1763
+ }
1764
+ appComponent.getRoutingService().detachRouteMatched(this.stickyDiscardAfterNavigationFunction);
1765
+ this.stickyDiscardAfterNavigationFunction = undefined;
1766
+ this.setEditMode(EditMode.Display, false);
1767
+ if (appComponent.getShellServices) {
1768
+ // If we have exited from the app, CommonUtils.getAppComponent doesn't return a
1769
+ // sap.fe.core.AppComponent, hence the 'if' above
1770
+ appComponent.getShellServices().setBackNavigation();
1771
+ }
1772
+ } catch (error) {
1773
+ Log.info(error);
1774
+ return false;
1775
+ }
1776
+ return true;
1777
+ }
1778
+
1779
+ /**
1780
+ * Method to display a 'discard' popover when exiting a sticky session.
1781
+ */;
1782
+ _proto.onBackNavigationInSession = function onBackNavigationInSession() {
1783
+ const view = this.getView();
1784
+ const routerProxy = this.getAppComponent().getRouterProxy();
1785
+ if (routerProxy.checkIfBackIsOutOfGuard()) {
1786
+ const bindingContext = view.getBindingContext();
1787
+ sticky.processDataLossConfirmation(async () => {
1788
+ await this.discardStickySession(bindingContext);
1789
+ history.back();
1790
+ }, view, this.getProgrammingModel(bindingContext));
1791
+ return;
1792
+ }
1793
+ history.back();
1794
+ }
1795
+
1796
+ /**
1797
+ * Returns a callback function to be used as a DirtyStateProvider in the Shell.
1798
+ *
1799
+ * @param appComponent The app component
1800
+ * @param internalModel The model "internal"
1801
+ * @param hashTracker Hash tracker
1802
+ * @returns The callback function
1803
+ */;
1804
+ _proto.getDirtyStateProvider = function getDirtyStateProvider(appComponent, internalModel, hashTracker) {
1805
+ return navigationContext => {
1806
+ try {
1807
+ if (navigationContext === undefined) {
1808
+ throw new Error("Invalid input parameters for DirtyStateProvider function");
1809
+ }
1810
+ const targetHash = navigationContext.innerAppRoute;
1811
+ const routerProxy = appComponent.getRouterProxy();
1812
+ let lclHashTracker = "";
1813
+ let isDirty;
1814
+ const isSessionOn = internalModel.getProperty("/sessionOn");
1815
+ if (!isSessionOn) {
1816
+ // If the sticky session was terminated before hand.
1817
+ // Example in case of navigating away from application using IBN.
1818
+ return undefined;
1819
+ }
1820
+ if (!routerProxy.isNavigationFinalized()) {
1821
+ // If navigation is currently happening in RouterProxy, it's a transient state
1822
+ // (not dirty)
1823
+ isDirty = false;
1824
+ lclHashTracker = targetHash;
1825
+ } else if (hashTracker === targetHash) {
1826
+ // the hash didn't change so either the user attempts to refresh or to leave the app
1827
+ isDirty = true;
1828
+ } else if (routerProxy.checkHashWithGuard(targetHash) || routerProxy.isGuardCrossAllowedByUser()) {
1829
+ // the user attempts to navigate within the root object
1830
+ // or crossing the guard has already been allowed by the RouterProxy
1831
+ lclHashTracker = targetHash;
1832
+ isDirty = false;
1833
+ } else {
1834
+ // the user attempts to navigate within the app, for example back to the list report
1835
+ isDirty = true;
1836
+ }
1837
+ if (isDirty) {
1838
+ // the FLP doesn't call the dirty state provider anymore once it's dirty, as they can't
1839
+ // change this due to compatibility reasons we set it back to not-dirty
1840
+ setTimeout(function () {
1841
+ appComponent.getShellServices().setDirtyFlag(false);
1842
+ }, 0);
1843
+ } else {
1844
+ hashTracker = lclHashTracker;
1845
+ }
1846
+ return isDirty;
1847
+ } catch (error) {
1848
+ Log.info(error);
1849
+ return undefined;
1850
+ }
1851
+ };
1852
+ }
1853
+
1854
+ /**
1855
+ * Returns a callback function to be used when a sticky session times out.
1856
+ *
1857
+ * @param stickyContext The context for the sticky session
1858
+ * @param i18nModel
1859
+ * @returns The callback function
1860
+ */;
1861
+ _proto.getSessionTimeoutFunction = function getSessionTimeoutFunction(stickyContext, i18nModel) {
1862
+ return () => {
1863
+ try {
1864
+ if (stickyContext === undefined) {
1865
+ throw new Error("Context missing for SessionTimeout function");
1866
+ }
1867
+ // remove transient messages since we will showing our own message
1868
+ this.getMessageHandler().removeTransitionMessages();
1869
+ const warningDialog = new Dialog({
1870
+ title: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_TITLE}",
1871
+ state: "Warning",
1872
+ content: new Text({
1873
+ text: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_MESSAGE}"
1874
+ }),
1875
+ beginButton: new Button({
1876
+ text: "{sap.fe.i18n>C_COMMON_DIALOG_OK}",
1877
+ type: "Emphasized",
1878
+ press: () => {
1879
+ // remove sticky handling after navigation since session has already been terminated
1880
+ this.handleStickyOff();
1881
+ this.getInternalRouting().navigateBackFromContext(stickyContext);
1882
+ }
1883
+ }),
1884
+ afterClose: function () {
1885
+ warningDialog.destroy();
1886
+ }
1887
+ });
1888
+ warningDialog.addStyleClass("sapUiContentPadding");
1889
+ warningDialog.setModel(i18nModel, "sap.fe.i18n");
1890
+ this.getView().addDependent(warningDialog);
1891
+ warningDialog.open();
1892
+ } catch (error) {
1893
+ Log.info(error);
1894
+ return undefined;
1895
+ }
1896
+ return true;
1897
+ };
1898
+ }
1899
+
1900
+ /**
1901
+ * Returns a callback function for the onRouteMatched event in case of sticky edition.
1902
+ *
1903
+ * @param context The context being edited (root of the sticky session)
1904
+ * @param appComponent The app component
1905
+ * @returns The callback function
1906
+ */;
1907
+ _proto.getRouteMatchedFunction = function getRouteMatchedFunction(context, appComponent) {
1908
+ return () => {
1909
+ const currentHash = appComponent.getRouterProxy().getHash();
1910
+ // either current hash is empty so the user left the app or he navigated away from the object
1911
+ if (!currentHash || !appComponent.getRouterProxy().checkHashWithGuard(currentHash)) {
1912
+ this.discardStickySession(context);
1913
+ setTimeout(() => {
1914
+ //clear the session context to ensure the LR refreshes the list without a session
1915
+ context.getModel().clearSessionContext();
1916
+ }, 0);
1917
+ }
1918
+ };
1919
+ }
1920
+
1921
+ /**
1922
+ * Ends a sticky session by discarding changes.
1923
+ *
1924
+ * @param context The context being edited (root of the sticky session)
1925
+ */;
1926
+ _proto.discardStickySession = async function discardStickySession(context) {
1927
+ const discardedContext = await sticky.discardDocument(context);
1928
+ if (discardedContext !== null && discardedContext !== void 0 && discardedContext.hasPendingChanges()) {
1929
+ discardedContext.getBinding().resetChanges();
1930
+ }
1931
+ discardedContext === null || discardedContext === void 0 ? void 0 : discardedContext.refresh();
1932
+ this.handleStickyOff();
1933
+ }
1934
+
1935
+ /**
1936
+ * Gets the internal routing extension.
1937
+ *
1938
+ * @returns The internal routing extension
1939
+ */;
1940
+ _proto.getInternalRouting = function getInternalRouting() {
1941
+ if (this.base._routing) {
1942
+ return this.base._routing;
1943
+ } else {
1944
+ throw new Error("Edit Flow works only with a given routing listener");
1945
+ }
1329
1946
  };
1330
1947
  _proto._getRootViewController = function _getRootViewController() {
1331
1948
  return this.getAppComponent().getRootViewController();
1332
1949
  };
1333
- _proto._getResourceBundle = function _getResourceBundle() {
1334
- return this.getView().getController().oResourceBundle;
1335
- };
1336
1950
  _proto._getSemanticMapping = function _getSemanticMapping() {
1337
1951
  return this.getAppComponent().getRoutingService().getLastSemanticMapping();
1338
1952
  }
1339
1953
 
1340
1954
  /**
1341
- * Creates a new promise to wait for an action to be executed
1955
+ * Creates a new promise to wait for an action to be executed.
1342
1956
  *
1343
- * @function
1344
- * @name _createActionPromise
1345
- * @memberof sap.fe.core.controllerextensions.EditFlow
1957
+ * @param actionName The name of the action
1958
+ * @param controlId The ID of the control
1346
1959
  * @returns {Function} The resolver function which can be used to externally resolve the promise
1347
1960
  */;
1348
- _proto._createActionPromise = function _createActionPromise(sActionName, sControlId) {
1349
- return this.getInternalEditFlow().createActionPromise(sActionName, sControlId);
1961
+ _proto.createActionPromise = function createActionPromise(actionName, controlId) {
1962
+ let resolveFunction, rejectFunction;
1963
+ this.actionPromise = new Promise((resolve, reject) => {
1964
+ resolveFunction = resolve;
1965
+ rejectFunction = reject;
1966
+ }).then(oResponse => {
1967
+ return Object.assign({
1968
+ controlId
1969
+ }, this.getActionResponseDataAndKeys(actionName, oResponse));
1970
+ });
1971
+ return {
1972
+ fResolver: resolveFunction,
1973
+ fRejector: rejectFunction
1974
+ };
1975
+ }
1976
+
1977
+ /**
1978
+ *
1979
+ * @param actionName The name of the action that is executed
1980
+ * @param response The bound action's response data or response context
1981
+ * @returns Object with data and names of the key fields of the response
1982
+ */;
1983
+ _proto.getActionResponseDataAndKeys = function getActionResponseDataAndKeys(actionName, response) {
1984
+ if (Array.isArray(response)) {
1985
+ if (response.length === 1) {
1986
+ response = response[0].value;
1987
+ } else {
1988
+ return null;
1989
+ }
1990
+ }
1991
+ if (!response) {
1992
+ return null;
1993
+ }
1994
+ const currentView = this.getView();
1995
+ const metaModelData = currentView.getModel().getMetaModel().getData();
1996
+ const actionReturnType = metaModelData && metaModelData[actionName] && metaModelData[actionName][0] && metaModelData[actionName][0].$ReturnType ? metaModelData[actionName][0].$ReturnType.$Type : null;
1997
+ const keys = actionReturnType && metaModelData[actionReturnType] ? metaModelData[actionReturnType].$Key : null;
1998
+ return {
1999
+ oData: response.getObject(),
2000
+ keys
2001
+ };
2002
+ };
2003
+ _proto.getCurrentActionPromise = function getCurrentActionPromise() {
2004
+ return this.actionPromise;
1350
2005
  };
1351
- _proto._getCurrentActionPromise = function _getCurrentActionPromise() {
1352
- return this.getInternalEditFlow().getCurrentActionPromise();
2006
+ _proto.deleteCurrentActionPromise = function deleteCurrentActionPromise() {
2007
+ this.actionPromise = undefined;
1353
2008
  };
1354
- _proto._deleteCurrentActionPromise = function _deleteCurrentActionPromise() {
1355
- return this.getInternalEditFlow().deleteCurrentActionPromise();
2009
+ _proto._scrollAndFocusOnInactiveRow = function _scrollAndFocusOnInactiveRow(table) {
2010
+ const rowBinding = table.getRowBinding();
2011
+ const activeRowIndex = rowBinding.getCount() || 0;
2012
+ if (table.data("tableType") !== "ResponsiveTable") {
2013
+ if (activeRowIndex > 0) {
2014
+ table.scrollToIndex(activeRowIndex - 1);
2015
+ }
2016
+ table.focusRow(activeRowIndex, true);
2017
+ } else {
2018
+ /* In a responsive table, the empty rows appear at the beginning of the table. But when we create more, they appear below the new line.
2019
+ * So we check the first inactive row first, then we set the focus on it when we press the button.
2020
+ * This doesn't impact the GridTable because they appear at the end, and we already focus the before-the-last row (because 2 empty rows exist)
2021
+ */
2022
+ const allRowContexts = rowBinding.getContexts();
2023
+ if (!(allRowContexts !== null && allRowContexts !== void 0 && allRowContexts.length)) {
2024
+ table.focusRow(activeRowIndex, true);
2025
+ return;
2026
+ }
2027
+ let focusRow = activeRowIndex,
2028
+ index = 0;
2029
+ for (const singleContext of allRowContexts) {
2030
+ if (singleContext.isInactive() && index < focusRow) {
2031
+ focusRow = index;
2032
+ }
2033
+ index++;
2034
+ }
2035
+ if (focusRow > 0) {
2036
+ table.scrollToIndex(focusRow);
2037
+ }
2038
+ table.focusRow(focusRow, true);
2039
+ }
1356
2040
  };
1357
- _proto._getMessageHandler = function _getMessageHandler() {
1358
- return this.getInternalEditFlow().getMessageHandler();
2041
+ _proto.createEmptyRowsAndFocus = async function createEmptyRowsAndFocus(table) {
2042
+ var _tableAPI$tableDefini, _tableAPI$tableDefini2, _table$getBindingCont;
2043
+ const tableAPI = table.getParent();
2044
+ if (tableAPI !== null && tableAPI !== void 0 && (_tableAPI$tableDefini = tableAPI.tableDefinition) !== null && _tableAPI$tableDefini !== void 0 && (_tableAPI$tableDefini2 = _tableAPI$tableDefini.control) !== null && _tableAPI$tableDefini2 !== void 0 && _tableAPI$tableDefini2.inlineCreationRowsHiddenInEditMode && !((_table$getBindingCont = table.getBindingContext("ui")) !== null && _table$getBindingCont !== void 0 && _table$getBindingCont.getProperty("createMode"))) {
2045
+ // With the parameter, we don't have empty rows in Edit mode, so we need to create them before setting the focus on them
2046
+ await tableAPI.setUpEmptyRows(table, true);
2047
+ }
2048
+ this._scrollAndFocusOnInactiveRow(table);
1359
2049
  };
1360
- _proto._sendActivity = function _sendActivity(action, relatedContexts, actionName) {
2050
+ _proto._sendActivity = function _sendActivity(action, relatedContexts, actionName, refreshListBinding, actionRequestedProperties) {
1361
2051
  const content = Array.isArray(relatedContexts) ? relatedContexts.map(context => context.getPath()) : relatedContexts === null || relatedContexts === void 0 ? void 0 : relatedContexts.getPath();
1362
- send(this.getView(), action, content, actionName);
2052
+ ActivitySync.send(this.getView(), action, content, actionName, refreshListBinding, actionRequestedProperties);
1363
2053
  };
1364
2054
  _proto._triggerConfiguredSurvey = function _triggerConfiguredSurvey(sActionName, triggerType) {
1365
2055
  triggerConfiguredSurvey(this.getView(), sActionName, triggerType);
1366
- }
1367
-
1368
- /**
1369
- * @function
1370
- * @name _getActionResponseDataAndKeys
1371
- * @memberof sap.fe.core.controllerextensions.EditFlow
1372
- * @param sActionName The name of the action that is executed
1373
- * @param oResponse The bound action's response data or response context
1374
- * @returns Object with data and names of the key fields of the response
1375
- */;
1376
- _proto._getActionResponseDataAndKeys = function _getActionResponseDataAndKeys(sActionName, oResponse) {
1377
- return this.getInternalEditFlow().getActionResponseDataAndKeys(sActionName, oResponse);
1378
2056
  };
1379
2057
  _proto._submitOpenChanges = async function _submitOpenChanges(oContext) {
1380
2058
  const oModel = oContext.getModel(),
1381
- oLockObject = this._getGlobalUIModel();
2059
+ oLockObject = this.getGlobalUIModel();
1382
2060
  try {
1383
2061
  // Submit any leftover changes that are not yet submitted
1384
2062
  // Currently we are using only 1 updateGroupId, hence submitting the batch directly here
@@ -1399,28 +2077,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1399
2077
  }
1400
2078
  }
1401
2079
  };
1402
- _proto._handleStickyOn = function _handleStickyOn(oContext) {
1403
- return this.getInternalEditFlow().handleStickyOn(oContext);
1404
- };
1405
- _proto._handleStickyOff = function _handleStickyOff() {
1406
- return this.getInternalEditFlow().handleStickyOff();
1407
- };
1408
- _proto._onBackNavigationInSession = function _onBackNavigationInSession() {
1409
- return this.getInternalEditFlow().onBackNavigationInSession();
1410
- };
1411
2080
  _proto._setStickySessionInternalProperties = function _setStickySessionInternalProperties(programmingModel, model) {
1412
2081
  if (programmingModel === ProgrammingModel.Sticky) {
1413
- const internalModel = this._getInternalModel();
2082
+ const internalModel = this.getInternalModel();
1414
2083
  internalModel.setProperty("/sessionOn", true);
1415
2084
  internalModel.setProperty("/stickySessionToken", model.getHttpHeaders(true)["SAP-ContextId"]);
1416
2085
  }
1417
2086
  };
1418
2087
  _proto._removeStickySessionInternalProperties = function _removeStickySessionInternalProperties(programmingModel) {
1419
2088
  if (programmingModel === ProgrammingModel.Sticky) {
1420
- const internalModel = this._getInternalModel();
2089
+ const internalModel = this.getInternalModel();
1421
2090
  internalModel.setProperty("/sessionOn", false);
1422
2091
  internalModel.setProperty("/stickySessionToken", undefined);
1423
- this._handleStickyOff( /*oContext*/);
2092
+ this.handleStickyOff();
1424
2093
  }
1425
2094
  };
1426
2095
  _proto._handleNewContext = async function _handleNewContext(oContext, bEditable, bRecreateContext, bDraftNavigation) {
@@ -1428,7 +2097,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1428
2097
  if (!this._isFclEnabled()) {
1429
2098
  EditState.setEditStateDirty();
1430
2099
  }
1431
- await this._getRoutingListener().navigateToContext(oContext, {
2100
+ await this.getInternalRouting().navigateToContext(oContext, {
1432
2101
  checkNoHashChange: true,
1433
2102
  editable: bEditable,
1434
2103
  bPersistOPScroll: true,
@@ -1454,8 +2123,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1454
2123
  * @returns {Promise} Promise resolves if there are no validation errors, and rejects if there are validation errors
1455
2124
  */;
1456
2125
  _proto._checkForValidationErrors = function _checkForValidationErrors() {
1457
- return this._syncTask().then(() => {
1458
- const sViewId = this.base.getView().getId();
2126
+ return this.syncTask().then(() => {
2127
+ const sViewId = this.getView().getId();
1459
2128
  const aMessages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
1460
2129
  let oControl;
1461
2130
  let oMessage;
@@ -1487,7 +2156,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1487
2156
  */;
1488
2157
  _proto._refreshListIfRequired = function _refreshListIfRequired(oResponse, oContext) {
1489
2158
  if (!oContext || !oResponse || !oResponse.oData) {
1490
- return Promise.resolve();
2159
+ return Promise.resolve(undefined);
1491
2160
  }
1492
2161
  const oBinding = oContext.getBinding();
1493
2162
  // refresh only lists
@@ -1506,18 +2175,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1506
2175
  return new Promise(resolve => {
1507
2176
  if (oBinding.isRoot()) {
1508
2177
  oBinding.attachEventOnce("dataReceived", function () {
1509
- resolve();
2178
+ resolve(!bReturnedContextIsSame);
1510
2179
  });
1511
2180
  oBinding.refresh();
1512
2181
  } else {
1513
- const oAppComponent = CommonUtils.getAppComponent(this.getView());
2182
+ const oAppComponent = this.getAppComponent();
1514
2183
  oAppComponent.getSideEffectsService().requestSideEffects([{
1515
2184
  $NavigationPropertyPath: oBinding.getPath()
1516
2185
  }], oBinding.getContext()).then(function () {
1517
- resolve();
2186
+ resolve(!bReturnedContextIsSame);
1518
2187
  }, function () {
1519
2188
  Log.error("Error while refreshing the table");
1520
- resolve();
2189
+ resolve(!bReturnedContextIsSame);
1521
2190
  }).catch(function (e) {
1522
2191
  Log.error("Error while refreshing the table", e);
1523
2192
  });
@@ -1527,7 +2196,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1527
2196
  }
1528
2197
  }
1529
2198
  // resolve with oResponse to not disturb the promise chain afterwards
1530
- return Promise.resolve();
2199
+ return Promise.resolve(undefined);
1531
2200
  };
1532
2201
  _proto._fetchSemanticKeyValues = function _fetchSemanticKeyValues(oContext) {
1533
2202
  const oMetaModel = oContext.getModel().getMetaModel(),
@@ -1617,6 +2286,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1617
2286
  }
1618
2287
  return contextToNavigate;
1619
2288
  }
2289
+
1620
2290
  /**
1621
2291
  * This method creates a sibling context for a subobject page, and calculates a sibling path
1622
2292
  * for all intermediate paths between the object page and the subobject page.
@@ -1650,10 +2320,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1650
2320
  }
1651
2321
  };
1652
2322
  _proto._isFclEnabled = function _isFclEnabled() {
1653
- return CommonUtils.getAppComponent(this.getView())._isFclEnabled();
2323
+ return this.getAppComponent()._isFclEnabled();
1654
2324
  };
1655
2325
  return EditFlow;
1656
- }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "toggleDraftActive", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "toggleDraftActive"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePatchSent", [_dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePatchSent"), _class2.prototype)), _class2)) || _class);
2326
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype)), _class2)) || _class);
1657
2327
  return EditFlow;
1658
2328
  }, false);
1659
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZ2V0QXBwQ29tcG9uZW50IiwiYmFzZSIsImdldEludGVybmFsRWRpdEZsb3ciLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsIl9lZGl0RmxvdyIsImVkaXREb2N1bWVudCIsIm9Db250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsInRyYW5zYWN0aW9uSGVscGVyIiwiX2dldFRyYW5zYWN0aW9uSGVscGVyIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJtb2RlbCIsImdldE1vZGVsIiwicmlnaHRtb3N0Q29udGV4dCIsInNpYmxpbmdJbmZvIiwib1ZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsIl9nZXRQcm9ncmFtbWluZ01vZGVsIiwib1Jvb3RDb250ZXh0Iiwib1ZpZXciLCJ2aWV3TGV2ZWwiLCJEcmFmdCIsImRyYWZ0Um9vdFBhdGgiLCJNb2RlbEhlbHBlciIsImdldERyYWZ0Um9vdFBhdGgiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInJlcXVlc3RPYmplY3QiLCJTdGlja3kiLCJzU3RpY2t5Um9vdFBhdGgiLCJnZXRTdGlja3lSb290UGF0aCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsIm9OZXdEb2N1bWVudENvbnRleHQiLCJfZ2V0TWVzc2FnZUhhbmRsZXIiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIl9zZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwiX3NldERvY3VtZW50TW9kaWZpZWQiLCJzaG93TWVzc2FnZURpYWxvZyIsImNvbnRleHRUb05hdmlnYXRlIiwiX2lzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsIl91cGRhdGVQYXRoc0luSGlzdG9yeSIsInBhdGhNYXBwaW5nIiwidGFyZ2V0Q29udGV4dCIsImdldFBhdGgiLCJfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiX2hhbmRsZVN0aWNreU9uIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRNZXRhTW9kZWwiLCJzaGFyZU9iamVjdCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJhQ29udGV4dHMiLCJtUGFyYW1ldGVycyIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwib25CZWZvcmVEZWxldGUiLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImlzRHJhZnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJfc3luY1Rhc2siLCJFZGl0U3RhdGUiLCJzZXRFZGl0U3RhdGVEaXJ0eSIsIl9zZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIm1ldGFNb2RlbCIsImVudGl0eVNldE5hbWUiLCJnZXRNZXRhQ29udGV4dCIsImdldE9iamVjdCIsInNlbWFudGljS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwibGVuZ3RoIiwiY3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJjdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0IiwiX2dldEdsb2JhbFVJTW9kZWwiLCJvVGFibGUiLCJiU2hvdWxkQnVzeUxvY2siLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmUiLCJDcmVhdGlvblJvdyIsIkV4dGVybmFsIiwib0V4ZWNDdXN0b21WYWxpZGF0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsIm9Db250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNldFByb3BlcnR5IiwidGFibGVJZCIsImJ5SWQiLCJpc0EiLCJmbkZvY3VzT3JTY3JvbGwiLCJmb2N1c1JvdyIsImJpbmQiLCJzY3JvbGxUb0luZGV4IiwiZ2V0Um93QmluZGluZyIsImF0dGFjaEV2ZW50T25jZSIsImNyZWF0ZUF0RW5kIiwiZ2V0TGVuZ3RoIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJvTGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Qcm9taXNlIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwib0JpbmRpbmdDb250ZXh0IiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvRmllbGRDb250cm9sIiwic1RhcmdldCIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib01lc3NhZ2UiLCJjb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJvVmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0Q29udHJvbCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImZpbHRlciIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsInR5cGUiLCJFcnJvciIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImN1c3RvbU1lc3NhZ2VzIiwicmVzb2x2ZUNyZWF0aW9uTW9kZSIsImluaXRpYWxDcmVhdGlvbk1vZGUiLCJwcm9ncmFtbWluZ01vZGVsIiwib01ldGFNb2RlbCIsIk5ld1BhZ2UiLCJpc1JlbGF0aXZlIiwic1BhdGgiLCJzTmV3QWN0aW9uIiwiYVBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJBc3luYyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiT0RhdGFMaXN0QmluZGluZyIsIlN5bmMiLCJvTW9kZWwiLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsIm9DcmVhdGlvbiIsIm1BcmdzIiwib0NyZWF0aW9uUm93Iiwib0NyZWF0aW9uUm93Q29udGV4dCIsIm9QYXlsb2FkIiwib1JvdXRpbmdMaXN0ZW5lciIsIl9nZXRSb3V0aW5nTGlzdGVuZXIiLCJPYmplY3QiLCJrZXlzIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsIl9oYW5kbGVDcmVhdGVFdmVudHMiLCJwYXJlbnRDb250cm9sIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJvbkJlZm9yZUNyZWF0ZSIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJnZXRTdGFydHVwTW9kZSIsIkF1dG9DcmVhdGUiLCJvTmF2aWdhdGlvbiIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJlZGl0YWJsZSIsImJGb3JjZUZvY3VzIiwiYXN5bmNDb250ZXh0IiwiY3JlYXRlQWN0aW9uIiwidHJhbnNpZW50IiwidGhlbiIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiYkZyb21EZWZlcnJlZCIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiYlNraXBTaWRlRWZmZWN0cyIsIm9OZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJyZWplY3QiLCJhUGFyYW1zIiwiYWxsIiwibWV0YUNvbnRleHQiLCJlbnRpdHlTZXQiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJzdGFydGluZ0VudGl0eVNldCIsIm5ld0FjdGlvbiIsImFubm90YXRpb25zIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJOZXdBY3Rpb24iLCJfZ2V0SW50ZXJuYWxNb2RlbCIsIl9zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJDcmVhdGUiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDcmVhdGlvbkZhaWxlZCIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsIm9uQmVmb3JlU2F2ZSIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwib1Jlc291cmNlQnVuZGxlIiwiX2dldFJlc291cmNlQnVuZGxlIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJpc0ZjbEVuYWJsZWQiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZ2V0Q3JlYXRpb25Nb2RlIiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsImNhbmNlbGVkIiwidG9nZ2xlRHJhZnRBY3RpdmUiLCJvQ29udGV4dERhdGEiLCJiRWRpdGFibGUiLCJiSXNEcmFmdCIsIklzQWN0aXZlRW50aXR5IiwiSGFzQWN0aXZlRW50aXR5IiwiSGFzRHJhZnRFbnRpdHkiLCJvUmlnaHRtb3N0Q29udGV4dCIsImxhc3RTZW1hbnRpY01hcHBpbmciLCJ0ZWNobmljYWxQYXRoIiwidGFyZ2V0UGF0aCIsIm5ld1BhdGgiLCJvbGRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJjb250cm9sIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJfaXNEb2N1bWVudE1vZGlmaWVkIiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJpc0RyYWZ0Um9vdCIsInRhcmdldEVudGl0eVNldCIsImRlbGV0ZURvY3VtZW50IiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImdldEluZGV4IiwicGFyYW1ldGVycyIsInNpYmxpbmdDb250ZXh0IiwiZHJhZnRQYXRoIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJkcmFmdENvbnRleHRUb1JlbW92ZSIsInJlcGxhY2VXaXRoIiwiX2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJEZWxldGUiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsImludm9rZUFjdGlvbiIsInNBY3Rpb25OYW1lIiwibUV4dHJhUGFyYW1zIiwib0NvbnRyb2wiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJBcnJheSIsImlzQXJyYXkiLCJjb250ZXh0cyIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiYWN0aW9uTWV0YURhdGEiLCJzcGxpdCIsImlzQm91bmQiLCIkSXNCb3VuZCIsImNvbnRyb2xJZCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiaW5kZXhPZiIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwicGF0aCIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsIl9jcmVhdGVBY3Rpb25Qcm9taXNlIiwic0lkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImNvbnZlcnRlclR5cGUiLCJvUmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwiX3JlZnJlc2hMaXN0SWZSZXF1aXJlZCIsIl9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiQWN0aW9uIiwiYWN0aW9uIiwiZlJlc29sdmVyIiwidkNvbnRleHQiLCJ2YWx1ZSIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0IiwiYXBwbGljYWJsZUNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJub0hpc3RvcnlFbnRyeSIsImluZm8iLCJlcnIiLCJmUmVqZWN0b3IiLCJyZWplY3RlZEl0ZW1zIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImlzSW5Db2xsYWJvcmF0aXZlRHJhZnQiLCJpc0Nvbm5lY3RlZCIsImdldFNvdXJjZSIsInNldElnbm9yZUVUYWciLCJvUGF0Y2hQcm9taXNlIiwicGF0Y2hDb21wbGV0ZWRFdmVudCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlQWN0aXZhdGUiLCJvQmluZGluZyIsImJBdEVuZCIsImJJbmFjdGl2ZSIsIm9QYXJhbXMiLCJpbmFjdGl2ZSIsImFjdGl2YXRlZENvbnRleHQiLCJ3YXJuaW5nIiwibmV3SW5hY3RpdmVDb250ZXh0Iiwic0VkaXRNb2RlIiwiYkNyZWF0aW9uTW9kZSIsInNldEVkaXRNb2RlIiwiZ2V0Q3JlYXRpb25Nb2RlIiwiaXNEb2N1bWVudE1vZGlmaWVkIiwibW9kaWZpZWQiLCJzZXREb2N1bWVudE1vZGlmaWVkIiwibGlzdEJpbmRpbmciLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJzRHJhZnRTdGF0ZSIsInNldERyYWZ0U3RhdHVzIiwiZ2V0Um91dGluZ0xpc3RlbmVyIiwiZ2V0R2xvYmFsVUlNb2RlbCIsInZUYXNrIiwic3luY1Rhc2siLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsImdldFRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0SW50ZXJuYWxNb2RlbCIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDb250cm9sSWQiLCJjcmVhdGVBY3Rpb25Qcm9taXNlIiwiX2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJfZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImdldE1lc3NhZ2VIYW5kbGVyIiwicmVsYXRlZENvbnRleHRzIiwiYWN0aW9uTmFtZSIsImNvbnRlbnQiLCJtYXAiLCJzZW5kIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJzdWJtaXRCYXRjaCIsIm9SZXF1ZXN0b3IiLCJ3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJoYW5kbGVTdGlja3lPbiIsIl9oYW5kbGVTdGlja3lPZmYiLCJoYW5kbGVTdGlja3lPZmYiLCJfb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJpbnRlcm5hbE1vZGVsIiwiZ2V0SHR0cEhlYWRlcnMiLCJiUmVjcmVhdGVDb250ZXh0IiwiYlBlcnNpc3RPUFNjcm9sbCIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwidmlldyIsInBhcmFtcyIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJzVmlld0lkIiwiZ2V0SWQiLCJhTWVzc2FnZXMiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJpIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9EYXRhIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5IiwiaXNSb290IiwicmVmcmVzaCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0Q29udGV4dCIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsInBhcmVudENvbnRleHQiLCJuZXdDb250ZXh0IiwibWFwcGluZ3MiLCJzZXRQYXRoTWFwcGluZyIsIm5ld0RvY3VtZW50Q29udGV4dCIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IiwiZG9Ob3RDb21wdXRlSWZSb290Iiwic3RhcnRzV2l0aCIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IGlzQ29ubmVjdGVkLCBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSwgc2hhcmVPYmplY3QgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHsgU3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgVHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRmVlZGJhY2tcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhTGlzdEJpbmRpbmcgYXMgVjRMaXN0QmluZGluZyB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCIuLi9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxFZGl0RmxvdyBmcm9tIFwiLi9JbnRlcm5hbEVkaXRGbG93XCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGUsXG5cdFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXHQvKipcblx0ICogR2V0cyB0aGUgSW50ZXJuYWxFZGl0RmxvdyBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbEVkaXRGbG93IGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldEludGVybmFsRWRpdEZsb3coKTogSW50ZXJuYWxFZGl0RmxvdyB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZWRpdERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dCwgc2libGluZ0luZm87XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGxldCBvUm9vdENvbnRleHQ6IENvbnRleHQgPSBvQ29udGV4dDtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdGNvbnN0IGRyYWZ0Um9vdFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdG9Sb290Q29udGV4dCA9IG9WaWV3XG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KGRyYWZ0Um9vdFBhdGggYXMgc3RyaW5nKVxuXHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0YXdhaXQgb1Jvb3RDb250ZXh0LnJlcXVlc3RPYmplY3QoZHJhZnRSb290UGF0aCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1N0aWNreVJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdG9Sb290Q29udGV4dCA9IG9WaWV3XG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KHNTdGlja3lSb290UGF0aCBhcyBzdHJpbmcpXG5cdFx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0XHRhd2FpdCBvUm9vdENvbnRleHQucmVxdWVzdE9iamVjdChzU3RpY2t5Um9vdFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogb1Jvb3RDb250ZXh0IH0pO1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChcblx0XHRcdFx0b1Jvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLl9zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0ICE9PSBvUm9vdENvbnRleHQpIHtcblx0XHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Sb290Q29udGV4dCwgcmlnaHRtb3N0Q29udGV4dCwgc1Byb2dyYW1taW5nTW9kZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gb05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob1Jvb3RDb250ZXh0LCBvQ29udGV4dCwgc1Byb2dyYW1taW5nTW9kZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSB0aGlzLl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHRydWUsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgc3RpY2t5T24gaGFuZGxlciBtdXN0IGJlIHNldCBhZnRlciB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiBkb25lLFxuXHRcdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdFx0bGV0IHN0aWNreUNvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byB1c2UgdGhlIGtlcHQtYWxpdmUgY29udGV4dCB1c2VkIHRvIGJpbmQgdGhlIHBhZ2Vcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24oc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0XHRhd2FpdCBzaGFyZU9iamVjdChvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoYUNvbnRleHRzOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0cywgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB1cGRhdGVkQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSB1cGRhdGVQcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0dXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IG9iamVjdCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwodXBkYXRlZENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmICghaXNEcmFmdCB8fCAhY3VycmVudEJpbmRpbmdDb250ZXh0IHx8IGN1cnJlbnRCaW5kaW5nQ29udGV4dCAhPT0gb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdC8vIElmIGEgbmF2aWdhdGlvbiBoYXBwZW5lZCB3aGlsZSBvUHJvbWlzZSB3YXMgYmVpbmcgcmVzb2x2ZWQsIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgY2hhbmdlZFxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlJ3JlIHN0aWxsIG9uIHRoZSBzYW1lIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY3VycmVudEJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhtZXRhTW9kZWwsIGVudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRpZiAoc2VtYW50aWNLZXlzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljUGF0aCA9IGN1cnJlbnRTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChjdXJyZW50QmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdC8vIGN1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRpZiAoY3VycmVudFNlbWFudGljUGF0aCAmJiBjdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0IGFzIENvbnRleHQsIHRydWUsIGZhbHNlLCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycgb3IgJ0RlZmVycmVkJyBpcyB1c2VkXG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgKGluIGEgdGFibGUpXG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCB2aWEgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY3JlYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0dkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRsZXQgb1RhYmxlOiBhbnk7IC8vc2hvdWxkIGJlIFRhYmxlIGJ1dCB0aGVyZSBhcmUgbWlzc2luZyBtZXRob2RzIGludG8gdGhlIGRlZlxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycztcblx0XHRjb25zdCBiU2hvdWxkQnVzeUxvY2sgPVxuXHRcdFx0IW1QYXJhbWV0ZXJzIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKTtcblx0XHRsZXQgb0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdC8vIENyZWF0ZSBieSBuYXZpZ2F0aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldFxuXHRcdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBzQ3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmdldFZpZXcoKSwgdkxpc3RCaW5kaW5nKTtcblxuXHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0cmFuc2FjdGlvbkhlbHBlci52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KClcblx0XHRcdCk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmIChvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdGlmIChvVGFibGUgJiYgb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IGZuRm9jdXNPclNjcm9sbCA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSA/IG9UYWJsZS5mb2N1c1Jvdy5iaW5kKG9UYWJsZSkgOiBvVGFibGUuc2Nyb2xsVG9JbmRleC5iaW5kKG9UYWJsZSk7XG5cdFx0XHRvVGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhbmRsZVNpZGVFZmZlY3RzID0gYXN5bmMgKG9MaXN0QmluZGluZzogYW55LCBvQ3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9IGF3YWl0IG9DcmVhdGlvblByb21pc2U7XG5cdFx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBvTmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmNvZGUgPT09IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YVZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChvVmFsaWRhdGlvbk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdGlmIChvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRcdG9GaWVsZENvbnRyb2wgPSBDb3JlLmdldENvbnRyb2wobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRcdHNUYXJnZXQgPSBgJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBzVGFyZ2V0XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXIgcnVuYWJsZVxuXHRcdFx0XHRcdGNvbnN0IGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQ3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0dGV4dDogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGFDdXN0b21NZXNzYWdlc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgcmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChcblx0XHRcdGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHRcdHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsXG5cdFx0KTogc3RyaW5nID0+IHtcblx0XHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICYmIGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdFx0XHRcdDogb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKTtcblx0XHRcdFx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c05ld0FjdGlvbn0vQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyYCkgfHwgW107XG5cdFx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRcdGlmIChhUGFyYW1ldGVycy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nPy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdGlmIChhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuQXN5bmM7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmIChiU2hvdWxkQnVzeUxvY2spIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBhVmFsaWRhdGlvbk1lc3NhZ2VzID0gYXdhaXQgdGhpcy5fc3luY1Rhc2sob0V4ZWNDdXN0b21WYWxpZGF0aW9uKTtcblx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKGFWYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9MaXN0QmluZGluZzogYW55O1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0aWYgKHZMaXN0QmluZGluZyAmJiB0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0xpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gcmVzb2x2ZUNyZWF0aW9uTW9kZShcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRvTW9kZWwuZ2V0TWV0YU1vZGVsKClcblx0XHRcdCk7XG5cblx0XHRcdGxldCBvQ3JlYXRpb246IGFueTtcblx0XHRcdGxldCBtQXJnczogYW55O1xuXHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0XHRsZXQgb0NyZWF0aW9uUm93Q29udGV4dDogYW55O1xuXHRcdFx0bGV0IG9QYXlsb2FkOiBhbnk7XG5cdFx0XHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgb1JvdXRpbmdMaXN0ZW5lciA9IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpO1xuXG5cdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5EZWZlcnJlZCkge1xuXHRcdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdykge1xuXHRcdFx0XHRcdG9DcmVhdGlvblJvd0NvbnRleHQgPSBvQ3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHQvLyBwcmVmaWxsIGRhdGEgZnJvbSBjcmVhdGlvbiByb3dcblx0XHRcdFx0XHRvUGF5bG9hZCA9IG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSA9IHt9O1xuXHRcdFx0XHRcdE9iamVjdC5rZXlzKG9QYXlsb2FkKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdFx0Ly8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBvUGF5bG9hZFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoLypvQ3JlYXRpb25Sb3dDb250ZXh0Ki8pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93IHx8IHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTG9jYWxcIjtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5SWQgPSBvVGFibGU/LmdldFBhcmVudCgpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZDtcblxuXHRcdFx0XHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0XHRcdHRoaXMuX2hhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlO1xuXG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgPSBvQXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGU7XG5cblx0XHRcdFx0b0NyZWF0aW9uID0gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0YXN5bmNDb250ZXh0OiBvQ3JlYXRpb24sXG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRcdFx0bUFyZ3MgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgbVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRtQXJncy50cmFuc2llbnQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9DcmVhdGlvbi50aGVuKGZ1bmN0aW9uIChvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0Y29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHRcdFx0PyBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIG1BcmdzKVxuXHRcdFx0XHRcdFx0XHRcdDogb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdHRoaXMuX3N5bmNUYXNrKG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRcdC8vIHRoZSBjcmVhdGlvbiByb3cgc2hhbGwgYmUgY2xlYXJlZCBvbmNlIHRoZSB2YWxpZGF0aW9uIGNoZWNrIHdhcyBzdWNjZXNzZnVsIGFuZFxuXHRcdFx0XHRcdC8vIHRoZXJlZm9yZSB0aGUgUE9TVCBjYW4gYmUgc2VudCBhc3luYyB0byB0aGUgYmFja2VuZFxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpO1xuXG5cdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3VHJhbnNpZW50Q29udGV4dCA9IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9OZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdFx0XHRcdG9OZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBQcm9taXNlLnJlamVjdChgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0NyZWF0aW9uKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgYVBhcmFtcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvQ3JlYXRpb24sIG9OYXZpZ2F0aW9uXSk7XG5cdFx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb01vZGVsKTtcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBJbnRlcm5hbEVkaXRGbG93I2NvbXB1dGVFZGl0TW9kZVxuXHRcdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSAmJiBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5iaW5kQ29udGV4dChtZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0XHRcdHRoaXMuX2dldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYVBhcmFtc1swXTtcblx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob01vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdFx0XHRhd2FpdCBzaGFyZU9iamVjdChvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGVycm9yID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nIHx8XG5cdFx0XHRcdFx0XHRlcnJvciA9PT0gQ29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCB8fFxuXHRcdFx0XHRcdFx0ZXJyb3IgPT09IENvbnN0YW50cy5DcmVhdGlvbkZhaWxlZFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Ly8gY3JlYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHVzZXIgb3IgZmFpbGVkIGluIGJhY2tlbmQgPT4gaW4gY2FzZSB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0cmFuc2llbnQgY29udGV4dCBiZWZvcmUsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0XHRcdC8vIHRoZSBzd2l0Y2gtc3RhdGVtZW50IGFib3ZlIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgdGhpcyBoYXBwZW5zIGluIGNyZWF0aW9uTW9kZXMgZGVmZXJyZWQgYW5kIGFzeW5jLiBCdXQgaW4gZmFjdCwgaW4gdGhlc2UgY2FzZXMgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gZnJvbSByb3V0ZU1hdGNoZWQgaW4gT1AgY29tcG9uZW50XG5cdFx0XHRcdFx0XHQvLyBjcmVhdGVEZWZlcnJlZENvbnRleHQgaXMgdHJpZ2dlcmQsIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIChjcmVhdGVEb2N1bWVudCkgYWdhaW4gLSB0aGlzIHRpbWUgd2l0aCBjcmVhdGlvbk1vZGUgc3luYy4gVGhlcmVmb3JlLCBhbHNvIGluIHRoYXQgbW9kZSB3ZSBuZWVkIHRvIHRyaWdnZXIgYmFjayBuYXZpZ2F0aW9uLlxuXHRcdFx0XHRcdFx0Ly8gVGhlIG90aGVyIGNhc2VzIG1pZ2h0IHN0aWxsIGJlIG5lZWRlZCBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLlN5bmMgfHxcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5EZWZlcnJlZCB8fFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkFzeW5jXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0b1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGJTaG91bGRCdXN5TG9jaykge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnQ3JlYXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0UGF0aCBQYXRoIHBvaW50aW5nIHRvIHRoZSBjb250ZXh0IG9uIHdoaWNoIENyZWF0ZSBhY3Rpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVDcmVhdGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiBhbnlbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURpc2NhcmRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVEZWxldGVcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRGVsZXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBJbmRpY2F0ZXMgd2hldGhlciBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGlnbm9yZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiBTYXZlIGR1cmluZyBhbiBJbmxpbmUgY3JlYXRpb25cblx0Ly8gQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIExpc3QgYmluZGluZ3Mgb2YgdGhlIHRhYmxlcyBpbiB0aGUgdmlldy5cblx0Ly8gQm90aCBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgZm9yIHRoZSBzYW1lIHB1cnBvc2UuIFVzZXIgY2FuIGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNyZWF0aW9uIHJvdyhzKSBidXQgZG9lcyBub3QgJ0FkZCByb3cnLCBpbnN0ZWFkIGNsaWNrcyBTYXZlLlxuXHQvLyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBpbiB0aGUgdmlldy5cblxuXHQvKipcblx0ICogU2F2ZXMgYSBuZXcgZG9jdW1lbnQgYWZ0ZXIgY2hlY2tpbmcgaXQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzYXZlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncztcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLl9nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLl9zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGJFZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0Ly90b2dnbGUgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlZGl0IGRyYWZ0cyBhbmQgYWN0aXZlIGRvY3VtZW50cyB3aXRoIGRyYWZ0KVxuXHRcdGlmIChcblx0XHRcdCFiSXNEcmFmdCB8fFxuXHRcdFx0IShcblx0XHRcdFx0KCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkgfHxcblx0XHRcdFx0KG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0Ly9zdGFydCBQb2ludDogZWRpdCBkcmFmdFxuXHRcdFx0YkVkaXRhYmxlID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHN0YXJ0IHBvaW50IGFjdGl2ZSBkb2N1bWVudFxuXHRcdFx0YkVkaXRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRcdGNvbnN0IG9SaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb0NvbnRleHQ7XG5cdFx0XHRjb25zdCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoYkVkaXRhYmxlID8gRWRpdE1vZGUuRWRpdGFibGUgOiBFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7IC8vc3dpdGNoIHRvIGVkaXQgbW9kZSBvbmx5IGlmIGEgZHJhZnQgaXMgYXZhaWxhYmxlXG5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgYkVkaXRhYmxlLCB0cnVlLCB0cnVlLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY2FuY2VsRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiB7IGNvbnRyb2w6IG9iamVjdDsgc2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbiB9KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBtSW5QYXJhbWV0ZXJzOiBhbnkgPSBtUGFyYW1ldGVycztcblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuXHRcdG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY29udHJvbCB8fCBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbjtcblx0XHRtSW5QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZDtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5fZ2V0Q3JlYXRpb25Nb2RlKCksXG5cdFx0XHRcdHRoaXMuX2lzRG9jdW1lbnRNb2RpZmllZCgpXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5fc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblxuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdCBhcyBDb250ZXh0O1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCB0cnVlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vYWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnRcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgY29udGV4dCBjb3JyZXNwb25kcyB0byBhIGRyYWZ0IHJvb3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGEgZHJhZnQgcm9vdFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJvdGVjdGVkIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNkZWxldGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVyczogeyB0aXRsZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0aWYgKCFtUGFyYW1ldGVycykge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gZmFsc2U7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5fZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluayAmJiAhdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjYXBwbHlEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBhcHBseURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdGF3YWl0IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcyBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzLm5hbWUgTmFtZSBvZiB0aGUgcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcy52YWx1ZSBWYWx1ZSBvZiB0aGUgcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtIGluIHBhcmFtZXRlclZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBvbmNlIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQsIHByb3ZpZGluZyB0aGUgcmVzcG9uc2Vcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2ludm9rZUFjdGlvblxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgaW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH07XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IGFueVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0NvbnRyb2w6IGFueTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6IGFueTtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQobVBhcmFtZXRlcnMuaXNBICYmIG1QYXJhbWV0ZXJzLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IG1QYXJhbWV0ZXJzO1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIGlzIGJvdW5kIG9yIHVuYm91bmRcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgYWN0aW9uTWV0YURhdGEgPSBtb2RlbD8uZ2V0TWV0YU1vZGVsKCk/LmdldE9iamVjdChcIi9cIiArIHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKVswXSk7XG5cdFx0aWYgKGFjdGlvbk1ldGFEYXRhKSB7XG5cdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYWN0aW9uTWV0YURhdGEpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBhY3Rpb25NZXRhRGF0YS4kSXNCb3VuZCA/IGFjdGlvbk1ldGFEYXRhLiRJc0JvdW5kIDogZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKGFjdGlvbk1ldGFEYXRhWzBdLiRraW5kID09PSBcIkFjdGlvblwiICYmIGFjdGlvbk1ldGFEYXRhWzBdLiRJc0JvdW5kID09PSB0cnVlKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246IFRoZSBzcGVjaWZpZWQgYWN0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZFwiKTtcblx0XHR9XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSAoYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXSBhcyBhbnkpLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHNCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUgJiYgb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgoXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCkge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyA9IHRoaXMuX2NyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLnNJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBvUmVzcG9uc2UgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uKFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fcmVmcmVzaExpc3RJZlJlcXVpcmVkKHRoaXMuX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksIG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZSwgVHJpZ2dlclR5cGUuYWN0aW9uKTtcblxuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihvUmVzcG9uc2UpO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdFx0XHRXZSBzZXQgdGhlICh1cHBlcikgcGFnZXMgdG8gZGlydHkgYWZ0ZXIgYW4gZXhlY3V0aW9uIG9mIGFuIGFjdGlvblxuXHRcdFx0XHRcdFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0VGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHRPbmNlIHRoaXMgaXMgc3VwcG9ydGVkIHdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBwYWdlcyB0byBkaXJ0eSBhbnltb3JlIGFzIHRoZSBjb250ZXh0IGl0c2VsZlxuXHRcdFx0XHRcdGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0d2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHRhcyBpZiBpdCBpcyBjYWxsZWQgaW4gdGhlIGxpc3QgcmVwb3J0IGl0J3Mgbm90IG5lZWRlZCAtIGFzIHdlIGFueXdheSB3aWxsIHJlbW92ZSB0aGlzIGxvZ2ljXG5cdFx0XHRcdFx0d2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0d2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHRmaXJzdCBvbmUgYXMgdGhleSBhcmUgYW55d2F5IHNpYmxpbmdzXG5cdFx0XHRcdFx0Ki9cblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRsZXQgdkNvbnRleHQgPSBvUmVzcG9uc2U7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZDb250ZXh0KSAmJiB2Q29udGV4dC5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2Q29udGV4dCAmJiAhQXJyYXkuaXNBcnJheSh2Q29udGV4dCkpIHtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dE1ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aCh2Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9mblZhbGlkQ29udGV4dHMgPSAoY29udGV4dHM6IGFueSwgYXBwbGljYWJsZUNvbnRleHRzOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5maWx0ZXIoKGVsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYXBwbGljYWJsZUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFwcGxpY2FibGVDb250ZXh0cy5pbmRleE9mKGVsZW1lbnQpID4gLTE7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cylcblx0XHRcdFx0XHRcdD8gX2ZuVmFsaWRDb250ZXh0cyhtUGFyYW1ldGVycy5jb250ZXh0cywgbVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHQpWzBdXG5cdFx0XHRcdFx0XHQ6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkgIT09IHZDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRub0hpc3RvcnlFbnRyeTogZmFsc2Vcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzcG9uc2U7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdC8vIEZJWE1FOiBpbiBtb3N0IHNpdHVhdGlvbnMgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhlIHJlamVjdGVkIHByb21pc2VzIHJldHVybmVkcVxuXHRcdFx0aWYgKGVyciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHQvLyBUaGlzIGxlYWRzIHRvIGNvbnNvbGUgZXJyb3IuIEFjdHVhbGx5IHRoZSBlcnJvciBpcyBhbHJlYWR5IGhhbmRsZWQgKGN1cnJlbnRseSBkaXJlY3RseSBpbiBwcmVzcyBoYW5kbGVyIG9mIGVuZCBidXR0b24gaW4gZGlhbG9nKSwgc28gaXQgc2hvdWxkIG5vdCBiZSBmb3J3YXJkZWRcblx0XHRcdFx0Ly8gdXAgdG8gaGVyZS4gSG93ZXZlciwgd2hlbiBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWQsIGluZm9ybWF0aW9uIHdoZXRoZXIgZGlhbG9nIHdhcyBjYW5jZWxsZWQsIG9yIGJhY2tlbmQgZXhlY3V0aW9uIGhhcyBmYWlsZWQgbmVlZHNcblx0XHRcdFx0Ly8gdG8gYmUgdHJhbnNwb3J0ZWQgdG8gdGhlIHBsYWNlIHJlc3BvbnNpYmxlIGZvciBjb25uZWN0aW5nIHRoZXNlIHR3byB0aGluZ3MuXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9uZSBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWRcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH0gZWxzZSBpZiAoIShlcnIgJiYgKGVyci5jYW5jZWxlZCB8fCAoZXJyLnJlamVjdGVkSXRlbXMgJiYgZXJyLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKSkpIHtcblx0XHRcdFx0Ly8gVE9ETzogYW5hbHl6ZSwgd2hldGhlciB0aGlzIGlzIG9mIHRoZSBzYW1lIGNhdGVnb3J5IGFzIGFib3ZlXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cuaW52b2tlQWN0aW9uOiR7ZXJyfWApO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVE9ETzogQW55IHVuZXhwZWN0ZWQgZXJyb3JzIHByb2JhYmx5IHNob3VsZCBub3QgYmUgaWdub3JlZCFcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0ICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LnNldCA6IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LmNoZWNrICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LmNoZWNrIDogdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIGFueSkudXBkYXRlc0RvY3VtZW50KSB8fCBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhmbkZ1bmN0aW9uKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuX3NldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQsIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpc0luQ29sbGFib3JhdGl2ZURyYWZ0ID0gaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGlmIChpc0luQ29sbGFib3JhdGl2ZURyYWZ0KSB7XG5cdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIGFueSkuc2V0SWdub3JlRVRhZyh0cnVlKTtcblx0XHR9XG5cdFx0aWYgKCEodGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBhbnkpLnNldElnbm9yZUVUYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRXZlbnQuZ2V0U291cmNlKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkgYXMgVjRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KG9FdmVudC5nZXRTb3VyY2UoKSwgb1BhdGNoUHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIENyZWF0ZUFjdGl2YXRlIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRhc3luYyBoYW5kbGVDcmVhdGVBY3RpdmF0ZShvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGJBdEVuZCA9IHRydWU7XG5cdFx0Y29uc3QgYkluYWN0aXZlID0gdHJ1ZTtcblx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRjcmVhdGVBdEVuZDogYkF0RW5kLFxuXHRcdFx0aW5hY3RpdmU6IGJJbmFjdGl2ZSxcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0YnVzeU1vZGU6IFwiTm9uZVwiXG5cdFx0fTtcblx0XHR0cnkge1xuXHRcdFx0Ly8gU2VuZCBub3RpZmljYXRpb24gdG8gb3RoZXIgdXNlcnMgb25seSBhZnRlciB0aGUgY3JlYXRpb24gaGFzIGJlZW4gZmluYWxpemVkXG5cdFx0XHRjb25zdCBhY3RpdmF0ZWRDb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIikgYXMgQ29udGV4dDtcblx0XHRcdGFjdGl2YXRlZENvbnRleHRcblx0XHRcdFx0LmNyZWF0ZWQoKVxuXHRcdFx0XHQ/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2YXRlZENvbnRleHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKGBGYWlsZWQgdG8gYWN0aXZhdGUgY29udGV4dCAke2FjdGl2YXRlZENvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IGluYWN0aXZlIGNvbnRleHQgKGVtcHR5IHJvdyBpbiB0aGUgdGFibGUpXG5cdFx0XHRjb25zdCBuZXdJbmFjdGl2ZUNvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0b0JpbmRpbmcgYXMgVjRMaXN0QmluZGluZyxcblx0XHRcdFx0b1BhcmFtcyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKG5ld0luYWN0aXZlQ29udGV4dCkge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRmFpbGVkIHRvIGFjdGl2YXRlIG5ldyByb3cgLVwiLCBlcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qXG5cdFx0XHQgVE8gQkUgQ0hFQ0tFRCAvIERJU0NVU1NFRFxuXHRcdFx0IF9jcmVhdGVNdWx0aXBsZURvY3VtZW50cyBhbmQgZGVsZXRlTXVsdGlEb2N1bWVudCAtIGNvdWxkbid0IHdlIGNvbWJpbmUgdGhlbSB3aXRoIGNyZWF0ZSBhbmQgZGVsZXRlIGRvY3VtZW50P1xuXHRcdFx0IF9jcmVhdGVBY3Rpb25Qcm9taXNlIGFuZCBkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSAtPiBuZXh0IHN0ZXBcblxuXHRcdFx0ICovXG5cblx0X3NldEVkaXRNb2RlKHNFZGl0TW9kZTogYW55LCBiQ3JlYXRpb25Nb2RlPzogYm9vbGVhbikge1xuXHRcdHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLnNldEVkaXRNb2RlKHNFZGl0TW9kZSwgYkNyZWF0aW9uTW9kZSk7XG5cdH1cblxuXHRfZ2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5nZXRDcmVhdGlvbk1vZGUoKTtcblx0fVxuXG5cdF9pc0RvY3VtZW50TW9kaWZpZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmlzRG9jdW1lbnRNb2RpZmllZCgpO1xuXHR9XG5cblx0X3NldERvY3VtZW50TW9kaWZpZWQobW9kaWZpZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5zZXREb2N1bWVudE1vZGlmaWVkKG1vZGlmaWVkKTtcblx0fVxuXG5cdF9zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHR0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmcpO1xuXHR9XG5cblx0X3NldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlOiBhbnkpIHtcblx0XHR0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5zZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZSk7XG5cdH1cblxuXHRfZ2V0Um91dGluZ0xpc3RlbmVyKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblx0fVxuXG5cdF9nZXRHbG9iYWxVSU1vZGVsKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdH1cblx0X3N5bmNUYXNrKHZUYXNrPzogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLnN5bmNUYXNrKHZUYXNrKTtcblx0fVxuXG5cdF9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRJbnRlcm5hbEVkaXRGbG93KCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdH1cblxuXHRfZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdF9oYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmc6IGFueSkge1xuXHRcdHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmhhbmRsZUNyZWF0ZUV2ZW50cyhvQmluZGluZyk7XG5cdH1cblxuXHRfZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdH1cblxuXHRfZ2V0SW50ZXJuYWxNb2RlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRJbnRlcm5hbEVkaXRGbG93KCkuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZUJ1bmRsZSgpOiBSZXNvdXJjZUJ1bmRsZSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGUgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NyZWF0ZUFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblxuXHRfY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZTogYW55LCBzQ29udHJvbElkOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRJbnRlcm5hbEVkaXRGbG93KCkuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgc0NvbnRyb2xJZCk7XG5cdH1cblxuXHRfZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdH1cblxuXHRfZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdH1cblxuXHRfZ2V0TWVzc2FnZUhhbmRsZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0SW50ZXJuYWxFZGl0RmxvdygpLmdldE1lc3NhZ2VIYW5kbGVyKCk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KGFjdGlvbjogQWN0aXZpdHksIHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IHVuZGVmaW5lZCwgYWN0aW9uTmFtZT86IHN0cmluZykge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHRzZW5kKHRoaXMuZ2V0VmlldygpLCBhY3Rpb24sIGNvbnRlbnQsIGFjdGlvbk5hbWUpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5c1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvUmVzcG9uc2U6IG9iamVjdCkge1xuXHRcdHJldHVybiB0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBTdWJtaXQgYW55IGxlZnRvdmVyIGNoYW5nZXMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWRcblx0XHRcdC8vIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRcdGF3YWl0IG9Nb2RlbC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgY2hhbmdlc1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGFncmVlZCB3aXRoIHRoZSB2NCBtb2RlbCB0ZWFtIHRvIHVzZSBhbiBpbnRlcm5hbCBtZXRob2QuIFdlJ2xsIHJlcGxhY2UgaXQgb25jZVxuXHRcdFx0Ly8gYSBwdWJsaWMgb3IgcmVzdHJpY3RlZCBtZXRob2Qgd2FzIHByb3ZpZGVkXG5cdFx0XHRhd2FpdCBvTW9kZWwub1JlcXVlc3Rvci53YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIENoZWNrIGlmIGFsbCBjaGFuZ2VzIHdlcmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiB0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5oYW5kbGVTdGlja3lPbihvQ29udGV4dCk7XG5cdH1cblxuXHRfaGFuZGxlU3RpY2t5T2ZmKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdF9vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEludGVybmFsRWRpdEZsb3coKS5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCk7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBhbnksIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX2dldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPZmYoLypvQ29udGV4dCovKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRiRWRpdGFibGU6IGJvb2xlYW4sXG5cdFx0YlJlY3JlYXRlQ29udGV4dDogYm9vbGVhbixcblx0XHRiRHJhZnROYXZpZ2F0aW9uOiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzID0gZmFsc2Vcblx0KSB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBhbnksIHBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9yc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0X2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpIHtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXHRcdFx0bGV0IG9NZXNzYWdlO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTWVzc2FnZSA9IGFNZXNzYWdlc1tpXTtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChvTWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9yZWZyZXNoTGlzdElmUmVxdWlyZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0X3JlZnJlc2hMaXN0SWZSZXF1aXJlZChvUmVzcG9uc2U6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGlmICgob0JpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogb0JpbmRpbmcuZ2V0UGF0aCgpIH1dLCBvQmluZGluZy5nZXRDb250ZXh0KCkgYXMgQ29udGV4dClcblx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob0tleTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQ6IENvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCwgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZCkge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0fVxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSwgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGhcblx0ICogZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHMgYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0XG5cdCAqIEBwYXJhbSBzUHJvZ3JhbW1pbmdNb2RlbCBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHBhcmFtIGRvTm90Q29tcHV0ZUlmUm9vdCBJZiB0cnVlLCB3ZSBkb24ndCBjb21wdXRlIHNpYmxpbmdJbmZvIGlmIHRoZSByb290IGFuZCB0aGUgcmlnaHRtb3N0IGNvbnRleHRzIGFyZSB0aGUgc2FtZVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsXG5cdFx0ZG9Ob3RDb21wdXRlSWZSb290OiBib29sZWFuXG5cdCk6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dCA/PyByb290Q3VycmVudENvbnRleHQ7XG5cdFx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRpZiAoZG9Ob3RDb21wdXRlSWZSb290ICYmIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdF9pc0ZjbEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSkuX2lzRmNsRW5hYmxlZCgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXNDQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBWTtJQUMxQ0UsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCO0lBQzdDQyxTQUFTLEdBQUdGLFNBQVMsQ0FBQ0UsU0FBUztJQUMvQkMsV0FBVyxHQUFHSCxTQUFTLENBQUNHLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0osU0FBUyxDQUFDSSxRQUFRO0lBQzdCQyxXQUFXLEdBQUdMLFNBQVMsQ0FBQ0ssV0FBVztJQUNuQ0MsV0FBVyxHQUFHQyxXQUFXLENBQUNELFdBQVc7O0VBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkEsSUFRTUUsUUFBUSxXQURiQyxjQUFjLENBQUMsMkNBQTJDLENBQUMsVUFtQzFEQyxlQUFlLEVBQUUsVUFDakJDLGNBQWMsRUFBRSxVQWdGaEJELGVBQWUsRUFBRSxVQUNqQkMsY0FBYyxFQUFFLFVBdUJoQkQsZUFBZSxFQUFFLFVBQ2pCQyxjQUFjLEVBQUUsVUE2RWhCRCxlQUFl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
2329
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwic3luY1Rhc2tzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRBcHBDb21wb25lbnQiLCJiYXNlIiwiZWRpdERvY3VtZW50Iiwib0NvbnRleHQiLCJiRHJhZnROYXZpZ2F0aW9uIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJnZXRNb2RlbCIsInJpZ2h0bW9zdENvbnRleHQiLCJzaWJsaW5nSW5mbyIsIm9WaWV3RGF0YSIsImdldFZpZXciLCJnZXRWaWV3RGF0YSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIm9Sb290Q29udGV4dCIsIm9WaWV3Iiwidmlld0xldmVsIiwiRHJhZnQiLCJkcmFmdFJvb3RQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXREcmFmdFJvb3RQYXRoIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyZXF1ZXN0T2JqZWN0IiwiU3RpY2t5Iiwic1N0aWNreVJvb3RQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsInNldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzZXREb2N1bWVudE1vZGlmaWVkIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRNZXRhTW9kZWwiLCJzaGFyZU9iamVjdCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwicGFyYW1ldGVycyIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwib25CZWZvcmVEZWxldGUiLCJsb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsInBhcmVudENvbnRyb2wiLCJieUlkIiwiY29udHJvbElkIiwiRXJyb3IiLCJsaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImlzQSIsImNsZWFyU2VsZWN0aW9uIiwidmlld0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJpc1Jvb3QiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJBY3Rpdml0eVN5bmMiLCJzZW5kIiwiQWN0aXZpdHkiLCJEZWxldGUiLCJtYXAiLCJ1bmxvY2siLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJpc0RyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic3luY1Rhc2siLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIm1ldGFNb2RlbCIsImVudGl0eVNldE5hbWUiLCJnZXRNZXRhQ29udGV4dCIsImdldE9iamVjdCIsInNlbWFudGljS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwibGVuZ3RoIiwiY3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJjdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0Iiwib1RhYmxlIiwibVBhcmFtZXRlcnMiLCJiU2hvdWxkQnVzeUxvY2siLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmUiLCJDcmVhdGlvblJvdyIsIkV4dGVybmFsIiwib0V4ZWNDdXN0b21WYWxpZGF0aW9uIiwib0FwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwib0NvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNldFByb3BlcnR5IiwidGFibGVJZCIsImZuRm9jdXNPclNjcm9sbCIsImZvY3VzUm93IiwiYmluZCIsInNjcm9sbFRvSW5kZXgiLCJjcmVhdGVBdEVuZCIsImdldExlbmd0aCIsImhhbmRsZVNpZGVFZmZlY3RzIiwib0xpc3RCaW5kaW5nIiwib0NyZWF0aW9uUHJvbWlzZSIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsIm9CaW5kaW5nQ29udGV4dCIsImFwcENvbXBvbmVudCIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvRmllbGRDb250cm9sIiwic1RhcmdldCIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib01lc3NhZ2UiLCJjb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJvVmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0Q29udHJvbCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImZpbHRlciIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsInR5cGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiYUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJjdXN0b21NZXNzYWdlcyIsInJlc29sdmVDcmVhdGlvbk1vZGUiLCJpbml0aWFsQ3JlYXRpb25Nb2RlIiwicHJvZ3JhbW1pbmdNb2RlbCIsIm9NZXRhTW9kZWwiLCJOZXdQYWdlIiwiaXNSZWxhdGl2ZSIsInNQYXRoIiwic05ld0FjdGlvbiIsImFQYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiQXN5bmMiLCJPRGF0YUxpc3RCaW5kaW5nIiwiU3luYyIsIm9Nb2RlbCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwib0NyZWF0aW9uIiwibUFyZ3MiLCJvQ3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dDb250ZXh0Iiwib1BheWxvYWQiLCJvUm91dGluZ0xpc3RlbmVyIiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsImJTa2lwU2lkZUVmZmVjdHMiLCJvTmF2aWdhdGlvbiIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJlZGl0YWJsZSIsImJGb3JjZUZvY3VzIiwiYXN5bmNDb250ZXh0IiwiY3JlYXRlQWN0aW9uIiwidHJhbnNpZW50IiwidGhlbiIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiYkZyb21EZWZlcnJlZCIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJvTmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImlzTG9ja2VkIiwicmVqZWN0IiwiYVBhcmFtcyIsImFsbCIsIm1ldGFDb250ZXh0IiwiZW50aXR5U2V0IiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJhbm5vdGF0aW9ucyIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiTmV3QWN0aW9uIiwiZ2V0SW50ZXJuYWxNb2RlbCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIl9zZW5kQWN0aXZpdHkiLCJDcmVhdGUiLCJpc0Nvbm5lY3RlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwiY29udGV4dFBhdGgiLCJtZXRhUGF0aCIsImdldENvbnRleHQiLCJjcmVhdGlvblByb21pc2VzIiwicHJvcGVydHlWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiaW5hY3RpdmUiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eSIsImluZGV4T2YiLCJjcmVhdGVkQ29udGV4dHMiLCJuZXdDb250ZXh0IiwiYkluYWN0aXZlIiwiZXJyIiwib25CZWZvcmVTYXZlIiwiX21QYXJhbWV0ZXJzIiwib25CZWZvcmVEaXNjYXJkIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsIl9zdWJtaXRPcGVuQ2hhbmdlcyIsImlzRmNsRW5hYmxlZCIsImFjdGl2ZURvY3VtZW50Q29udGV4dCIsIl9nZXRSZXNvdXJjZU1vZGVsIiwiZ2V0Q3JlYXRpb25Nb2RlIiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsImRpc2Nvbm5lY3QiLCJfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJTdGFuZGFyZEFjdGlvbnMiLCJzYXZlIiwiVHJpZ2dlclR5cGUiLCJzdGFuZGFyZEFjdGlvbiIsIkRpc3BsYXkiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYkVkaXRhYmxlIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJuZXdQYXRoIiwib2xkUGF0aCIsImNhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY29udHJvbCIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJpc0RyYWZ0Um9vdCIsInRhcmdldEVudGl0eVNldCIsImRlbGV0ZURvY3VtZW50IiwiZ2V0SW5kZXgiLCJzaWJsaW5nQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50IiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJvQ29udHJvbCIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIkFycmF5IiwiaXNBcnJheSIsImNvbnRleHRzIiwiaXNOYXZpZ2FibGUiLCJyZXF1aXJlc05hdmlnYXRpb24iLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsImVudGl0eUNvbnRhaW5lciIsIm5hbWUiLCJpc0JvdW5kIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwicGF0aCIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJzSWQiLCJiR2V0Qm91bmRDb250ZXh0IiwiX2dldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiY29udmVydGVyVHlwZSIsIm9SZXNwb25zZSIsImNhbGxBY3Rpb24iLCJsaXN0UmVmcmVzaGVkIiwiX3JlZnJlc2hMaXN0SWZSZXF1aXJlZCIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwidmFsdWUiLCJBY3Rpb24iLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJ2Q29udGV4dCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0IiwiYXBwbGljYWJsZUNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJub0hpc3RvcnlFbnRyeSIsImluZm8iLCJmUmVqZWN0b3IiLCJyZWplY3RlZEl0ZW1zIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImlzSW5Db2xsYWJvcmF0aXZlRHJhZnQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwic291cmNlQmluZGluZyIsIm9QYXRjaFByb21pc2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVBY3RpdmF0ZSIsIm9CaW5kaW5nIiwiYkF0RW5kIiwib1BhcmFtcyIsImFjdGl2YXRlZENvbnRleHQiLCJ3YXJuaW5nIiwibmV3SW5hY3RpdmVDb250ZXh0IiwibmV3VGFzayIsImNvbXB1dGVFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiaXNBY3RpdmVFbnRpdHkiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiaW50ZXJuYWxNb2RlbCIsIlRyYW5zYWN0aW9uSGVscGVyIiwibWVzc2FnZUhhbmRsZXIiLCJzZXRDcmVhdGlvbk1vZGUiLCJiQ3JlYXRpb25Nb2RlIiwidWlNb2RlbENvbnRleHQiLCJtb2RpZmllZCIsImJpbmRpbmciLCJhdHRhY2hFdmVudCIsInN1Y2Nlc3MiLCJkcmFmdFN0YXR1cyIsInNvdXJjZSIsImVkaXRNb2RlIiwiaXNDcmVhdGlvbiIsImFjdGlvbk5hbWUiLCJzdGlja3lTZXNzaW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJzZXRUaW1lb3V0Iiwic2V0TmF2aWdhdGlvbkd1YXJkIiwic3Vic3RyaW5nIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsImRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJpMThuTW9kZWwiLCJzZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbiIsImF0dGFjaFNlc3Npb25UaW1lb3V0Iiwic3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uIiwiZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24iLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJ2aWV3Iiwicm91dGVyUHJveHkiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsImJpbmRpbmdDb250ZXh0Iiwic3RpY2t5IiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJoaXN0b3J5IiwiYmFjayIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJsY2xIYXNoVHJhY2tlciIsImlzRGlydHkiLCJpc1Nlc3Npb25PbiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJ3YXJuaW5nRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJjdXJyZW50SGFzaCIsImNsZWFyU2Vzc2lvbkNvbnRleHQiLCJkaXNjYXJkZWRDb250ZXh0IiwiZGlzY2FyZERvY3VtZW50IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJfcm91dGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJyZXNvbHZlRnVuY3Rpb24iLCJyZWplY3RGdW5jdGlvbiIsImFjdGlvblByb21pc2UiLCJhc3NpZ24iLCJyZXNwb25zZSIsImN1cnJlbnRWaWV3IiwibWV0YU1vZGVsRGF0YSIsImFjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiJEtleSIsIm9EYXRhIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsIl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3ciLCJ0YWJsZSIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImlzSW5hY3RpdmUiLCJjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyIsInRhYmxlQVBJIiwidGFibGVEZWZpbml0aW9uIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInNldFVwRW1wdHlSb3dzIiwicmVsYXRlZENvbnRleHRzIiwicmVmcmVzaExpc3RCaW5kaW5nIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsInN1Ym1pdEJhdGNoIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJnZXRIdHRwSGVhZGVycyIsImJSZWNyZWF0ZUNvbnRleHQiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJwYXJhbXMiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwic1ZpZXdJZCIsImdldElkIiwiYU1lc3NhZ2VzIiwiaSIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsInBhcmVudENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwibmV3RG9jdW1lbnRDb250ZXh0Iiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IFRyYW5zYWN0aW9uSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHsgU3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgVHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRmVlZGJhY2tcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgeyBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcIi4uL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGUsXG5cdFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHNlc3Npb25UaW1lb3V0RnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbj86IEZ1bmN0aW9uO1xuXG5cdHByaXZhdGUgc3luY1Rhc2tzOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRwcml2YXRlIGFjdGlvblByb21pc2U/OiBQcm9taXNlPGFueT47XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRBcHBDb21wb25lbnQoKTogQXBwQ29tcG9uZW50IHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZWRpdERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGxldCByaWdodG1vc3RDb250ZXh0LCBzaWJsaW5nSW5mbztcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRsZXQgb1Jvb3RDb250ZXh0OiBDb250ZXh0ID0gb0NvbnRleHQ7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKChvVmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRjb25zdCBkcmFmdFJvb3RQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHRvUm9vdENvbnRleHQgPSBvVmlld1xuXHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dChkcmFmdFJvb3RQYXRoIGFzIHN0cmluZylcblx0XHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdGF3YWl0IG9Sb290Q29udGV4dC5yZXF1ZXN0T2JqZWN0KGRyYWZ0Um9vdFBhdGgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdGNvbnN0IHNTdGlja3lSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldFN0aWNreVJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHRvUm9vdENvbnRleHQgPSBvVmlld1xuXHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dChzU3RpY2t5Um9vdFBhdGggYXMgc3RyaW5nKVxuXHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0YXdhaXQgb1Jvb3RDb250ZXh0LnJlcXVlc3RPYmplY3Qoc1N0aWNreVJvb3RQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IG9Sb290Q29udGV4dCB9KTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0ICE9PSBvUm9vdENvbnRleHQpIHtcblx0XHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Sb290Q29udGV4dCwgcmlnaHRtb3N0Q29udGV4dCwgc1Byb2dyYW1taW5nTW9kZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gb05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob1Jvb3RDb250ZXh0LCBvQ29udGV4dCwgc1Byb2dyYW1taW5nTW9kZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSB0aGlzLl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHRydWUsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgc3RpY2t5T24gaGFuZGxlciBtdXN0IGJlIHNldCBhZnRlciB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiBkb25lLFxuXHRcdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdFx0bGV0IHN0aWNreUNvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byB1c2UgdGhlIGtlcHQtYWxpdmUgY29udGV4dCB1c2VkIHRvIGJpbmQgdGhlIHBhZ2Vcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIFVYIGluIGNhc2Ugb2YgZW5hYmxlZCBjb2xsYWJvcmF0aW9uIGRyYWZ0IHdlIHNoYXJlIHRoZSBvYmplY3QgaW1tZWRpYXRlbHlcblx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0c1RvRGVsZXRlIFRoZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzIHRvIGRlbGV0ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoY29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLCBwYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAocGFyYW1ldGVycykge1xuXHRcdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0KHBhcmVudENvbnRyb2wgYXMgYW55KS5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKChsaXN0QmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHJlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdH0gZWxzZSBpZiAodmlld0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblxuXHRcdFx0QWN0aXZpdHlTeW5jLnNlbmQoXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRBY3Rpdml0eS5EZWxldGUsXG5cdFx0XHRcdGNvbnRleHRzVG9EZWxldGUubWFwKChjb250ZXh0OiBDb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50KHMpXCIsIGVycm9yKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB1cGRhdGVkQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSB1cGRhdGVQcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0dXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IG9iamVjdCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCBhcyBCaW5kaW5nIHwgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB1cGRhdGVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKHNlbWFudGljS2V5cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY1BhdGggPSBjdXJyZW50U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoY3VycmVudEJpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHQvLyBjdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRTZW1hbnRpY1BhdGggJiYgY3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0LCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKVxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NyZWF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGxldCBvVGFibGU6IGFueTsgLy9zaG91bGQgYmUgVGFibGUgYnV0IHRoZXJlIGFyZSBtaXNzaW5nIG1ldGhvZHMgaW50byB0aGUgZGVmXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IGJTaG91bGRCdXN5TG9jayA9XG5cdFx0XHQhbVBhcmFtZXRlcnMgfHxcblx0XHRcdChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpO1xuXHRcdGxldCBvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0Ly8gQ3JlYXRlIGJ5IG5hdmlnYXRpbmcgdG8gYW4gZXh0ZXJuYWwgdGFyZ2V0XG5cdFx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgc0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5nZXRWaWV3KCksIHZMaXN0QmluZGluZyk7XG5cblx0XHRcdChvQ29udHJvbGxlciBhcyBhbnkpLmhhbmRsZXJzLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgbVBhcmFtZXRlcnMub3V0Ym91bmQsIHVuZGVmaW5lZCwgc0NyZWF0ZVBhdGgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93KSB7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dPYmplY3RzID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKTtcblx0XHRcdGRlbGV0ZSBvQ3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdG9UYWJsZSA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpO1xuXHRcdFx0b0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZURvY3VtZW50KG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpLCB7XG5cdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogb1RhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmIChvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdGlmIChvVGFibGUgJiYgb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IGZuRm9jdXNPclNjcm9sbCA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSA/IG9UYWJsZS5mb2N1c1Jvdy5iaW5kKG9UYWJsZSkgOiBvVGFibGUuc2Nyb2xsVG9JbmRleC5iaW5kKG9UYWJsZSk7XG5cdFx0XHRvVGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhbmRsZVNpZGVFZmZlY3RzID0gYXN5bmMgKG9MaXN0QmluZGluZzogYW55LCBvQ3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9IGF3YWl0IG9DcmVhdGlvblByb21pc2U7XG5cdFx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBvTmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmNvZGUgPT09IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YVZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChvVmFsaWRhdGlvbk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdGlmIChvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRcdG9GaWVsZENvbnRyb2wgPSBDb3JlLmdldENvbnRyb2wobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRcdHNUYXJnZXQgPSBgJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBzVGFyZ2V0XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXIgcnVuYWJsZVxuXHRcdFx0XHRcdGNvbnN0IGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQ3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0dGV4dDogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRjdXN0b21NZXNzYWdlczogYUN1c3RvbU1lc3NhZ2VzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCByZXNvbHZlQ3JlYXRpb25Nb2RlID0gKFxuXHRcdFx0aW5pdGlhbENyZWF0aW9uTW9kZTogc3RyaW5nLFxuXHRcdFx0cHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWxcblx0XHQpOiBzdHJpbmcgPT4ge1xuXHRcdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgJiYgaW5pdGlhbENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5ld0FjdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTmF2aWdhdGlvblByb3BlcnR5IGNvbGxlY3Rpb25cblx0XHRcdFx0aWYgKCFvTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1BhdGggPSBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0XHRcdFx0OiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmApO1xuXHRcdFx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzTmV3QWN0aW9ufS9AJHVpNS5vdmVybG9hZC8wLyRQYXJhbWV0ZXJgKSB8fCBbXTtcblx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmc/LmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYVZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3luY1Rhc2sob0V4ZWNDdXN0b21WYWxpZGF0aW9uKTtcblx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKGFWYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9MaXN0QmluZGluZzogYW55O1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0aWYgKHZMaXN0QmluZGluZyAmJiB0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSByZXNvbHZlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG9Nb2RlbC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0KTtcblxuXHRcdFx0bGV0IG9DcmVhdGlvbjogYW55O1xuXHRcdFx0bGV0IG1BcmdzOiBhbnk7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3cgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRcdGxldCBvQ3JlYXRpb25Sb3dDb250ZXh0OiBhbnk7XG5cdFx0XHRsZXQgb1BheWxvYWQ6IGFueTtcblx0XHRcdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBvUm91dGluZ0xpc3RlbmVyID0gdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKTtcblxuXHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQpIHtcblx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRvQ3JlYXRpb25Sb3dDb250ZXh0ID0gb0NyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Ly8gcHJlZmlsbCBkYXRhIGZyb20gY3JlYXRpb24gcm93XG5cdFx0XHRcdFx0b1BheWxvYWQgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSB7fTtcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhvUGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhW3NQcm9wZXJ0eVBhdGhdID0gb1BheWxvYWRbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKC8qb0NyZWF0aW9uUm93Q29udGV4dCovKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyB8fCByZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHQvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIkxvY2FsXCI7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeUlkID0gb1RhYmxlPy5nZXRQYXJlbnQoKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQ7XG5cblx0XHRcdFx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdFx0XHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gdGhpcy5vbkJlZm9yZUNyZWF0ZTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nID0gb0FwcENvbXBvbmVudC5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlO1xuXG5cdFx0XHRcdG9DcmVhdGlvbiA9IHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHRcdFx0Ly8gaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93LCBubyBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuYlNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdGhhbmRsZVNpZGVFZmZlY3RzKG9MaXN0QmluZGluZywgb0NyZWF0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0YXN5bmNDb250ZXh0OiBvQ3JlYXRpb24sXG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRcdFx0bUFyZ3MgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgbVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRtQXJncy50cmFuc2llbnQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9DcmVhdGlvbi50aGVuKGZ1bmN0aW9uIChvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0Y29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHRcdFx0PyBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIG1BcmdzKVxuXHRcdFx0XHRcdFx0XHRcdDogb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdFx0dGhpcy5zeW5jVGFzayhvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRpb24gcm93IHNoYWxsIGJlIGNsZWFyZWQgb25jZSB0aGUgdmFsaWRhdGlvbiBjaGVjayB3YXMgc3VjY2Vzc2Z1bCBhbmRcblx0XHRcdFx0XHQvLyB0aGVyZWZvcmUgdGhlIFBPU1QgY2FuIGJlIHNlbnQgYXN5bmMgdG8gdGhlIGJhY2tlbmRcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdG9DcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChvTmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9DcmVhdGlvbikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFQYXJhbXMgPSBhd2FpdCBQcm9taXNlLmFsbChbb0NyZWF0aW9uLCBvTmF2aWdhdGlvbl0pO1xuXHRcdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG9Nb2RlbCk7XG5cblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlRWRpdE1vZGVcblx0XHRcdFx0XHRpZiAoIW9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgJiYgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHRvIHRlbGwgdGhlIE9QIHRoYXQgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgTFJcblx0XHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuYmluZENvbnRleHQobWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3QWN0aW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYVBhcmFtc1swXTtcblx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUob0xpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmICFBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZXJyb3IgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdGVycm9yID09PSBDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8XG5cdFx0XHRcdFx0XHRlcnJvciA9PT0gQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdFx0XHRcdC8vIGNyZWF0ZURlZmVycmVkQ29udGV4dCBpcyB0cmlnZ2VyZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHRcdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuU3luYyB8fFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkIHx8XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdHZhbGlkYXRlRG9jdW1lbnQoY29udGV4dDogQ29udGV4dCwgcGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgdXNlZCB0byBjcmVhdGUgdGhlIGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gZGF0YUZvckNyZWF0ZSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgbmV3IGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gY3JlYXRlQXRFbmQgVHJ1ZSBpZiB0aGUgbmV3IGNvbnRleHRzIG5lZWQgdG8gYmUgY3JhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGluYWN0aXZlXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogYW55W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlXG5cdCkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChiZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBiZWZvcmVDcmVhdGVDYWxsQmFjayh7IGNvbnRleHRQYXRoOiB0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkgfSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhcmdldExpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgbWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0aWYgKHRhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHt0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpfS8ke3RhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKHRhcmdldExpc3RCaW5kaW5nKTtcblxuXHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdGNvbnN0IGNyZWF0aW9uUHJvbWlzZXMgPSBkYXRhRm9yQ3JlYXRlLm1hcCgocHJvcGVydHlWYWx1ZXMpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVyczogYW55ID0geyBkYXRhOiB7fSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJOb25lXCI7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHByb3BlcnR5ICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpIDwgMCAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHR0YXJnZXRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdGNyZWF0ZWRDb250ZXh0cy5tYXAoKG5ld0NvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGlmICghbmV3Q29udGV4dC5iSW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzLlwiKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUVkaXRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURpc2NhcmRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NhdmVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGJFZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKGJFZGl0YWJsZSA/IEVkaXRNb2RlLkVkaXRhYmxlIDogRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpOyAvL3N3aXRjaCB0byBlZGl0IG1vZGUgb25seSBpZiBhIGRyYWZ0IGlzIGF2YWlsYWJsZVxuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLCBuZXdQYXRoOiB0YXJnZXRQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIGJFZGl0YWJsZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlOiR7b0Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY2FuY2VsRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiB7IGNvbnRyb2w6IG9iamVjdDsgc2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbiB9KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBtSW5QYXJhbWV0ZXJzOiBhbnkgPSBtUGFyYW1ldGVycztcblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuXHRcdG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY29udHJvbCB8fCBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbjtcblx0XHRtSW5QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZDtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRpZiAoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuY2VsUmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FuY2VsRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKSxcblx0XHRcdFx0dGhpcy5pc0RvY3VtZW50TW9kaWZpZWQoKVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRBY3Rpdml0eVN5bmMuZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gY2FuY2VsUmVzdWx0IGFzIENvbnRleHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgdHJ1ZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL2FjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByb3RlY3RlZCBpc0RyYWZ0Um9vdChjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlTZXQpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIEVudGl0eVNldCB0byB3aGljaCB0aGUgb2JqZWN0IGJlbG9uZ3NcblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZGVsZXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG9Db250ZXh0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gRGVsZXRpbmcgYW4gYWN0aXZlIGVudGl0eSB3aGljaCBoYXMgYSBkcmFmdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTGlzdFJlcG9ydCAoRkNMIGNhc2UpXG5cdFx0XHRcdC8vIC0tPiBuZWVkIHRvIHJlbW92ZSB0aGUgZHJhZnQgZnJvbSB0aGUgTFIgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0aXZlIHZlcnNpb24sIHNvIHRoYXQgdGhlIExpc3RCaW5kaW5nIGlzIHByb3Blcmx5IHJlZnJlc2hlZFxuXHRcdFx0XHQvLyBUaGUgY29uZGl0aW9uICdvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQnIG1ha2VzIHN1cmUgdGhlIGFjdGl2ZSB2ZXJzaW9uIGlzbid0IGFscmVhZHkgZGlzcGxheWVkIGluIHRoZSBMUlxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IGFzeW5jIChwYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlKHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdFBhdGggPSBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRDb250ZXh0VG9SZW1vdmUgPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0UGF0aCk7XG5cdFx0XHRcdFx0XHRkcmFmdENvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcGxhY2luZyB0aGUgZHJhZnQgaW5zdGFuY2UgaW4gdGhlIExSIE9ETEJcIiwgZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluayAmJiAhdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcy5uYW1lIE5hbWUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMudmFsdWUgVmFsdWUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbSBpbiBwYXJhbWV0ZXJWYWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCBwcm92aWRpbmcgdGhlIHJlc3BvbnNlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNpbnZva2VBY3Rpb25cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9O1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiBhbnlcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9Db250cm9sOiBhbnk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6IGFueTtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQobVBhcmFtZXRlcnMuaXNBICYmIG1QYXJhbWV0ZXJzLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IG1QYXJhbWV0ZXJzO1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5kZXhPZihcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpID4gLTEpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluZGV4T2YoXCIoXCIpID4gLTEpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gKGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0gYXMgYW55KS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbikge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KSh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLCBzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKFxuXHRcdFx0XHRcdG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLnNJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmIChBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdGxldCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRpZiAob1Jlc3BvbnNlKSB7XG5cdFx0XHRcdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKVxuXHRcdFx0XHRcdFx0PyBPYmplY3Qua2V5cyhvUmVzcG9uc2VbMF0udmFsdWUuZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdFx0XHQ6IE9iamVjdC5rZXlzKG9SZXNwb25zZS5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMsIHNBY3Rpb25OYW1lLCBsaXN0UmVmcmVzaGVkLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSB2Q29udGV4dFswXS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBhbnksIGFwcGxpY2FibGVDb250ZXh0czogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5kZXhPZihlbGVtZW50KSA+IC0xO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0KVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGlmIChzQ29udGV4dE1ldGFQYXRoICE9IHVuZGVmaW5lZCAmJiBzQ29udGV4dE1ldGFQYXRoID09PSBzQWN0aW9uQ29udGV4dE1ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRub0hpc3RvcnlFbnRyeTogZmFsc2Vcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzcG9uc2U7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdC8vIEZJWE1FOiBpbiBtb3N0IHNpdHVhdGlvbnMgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhlIHJlamVjdGVkIHByb21pc2VzIHJldHVybmVkcVxuXHRcdFx0aWYgKGVyciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHQvLyBUaGlzIGxlYWRzIHRvIGNvbnNvbGUgZXJyb3IuIEFjdHVhbGx5IHRoZSBlcnJvciBpcyBhbHJlYWR5IGhhbmRsZWQgKGN1cnJlbnRseSBkaXJlY3RseSBpbiBwcmVzcyBoYW5kbGVyIG9mIGVuZCBidXR0b24gaW4gZGlhbG9nKSwgc28gaXQgc2hvdWxkIG5vdCBiZSBmb3J3YXJkZWRcblx0XHRcdFx0Ly8gdXAgdG8gaGVyZS4gSG93ZXZlciwgd2hlbiBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWQsIGluZm9ybWF0aW9uIHdoZXRoZXIgZGlhbG9nIHdhcyBjYW5jZWxsZWQsIG9yIGJhY2tlbmQgZXhlY3V0aW9uIGhhcyBmYWlsZWQgbmVlZHNcblx0XHRcdFx0Ly8gdG8gYmUgdHJhbnNwb3J0ZWQgdG8gdGhlIHBsYWNlIHJlc3BvbnNpYmxlIGZvciBjb25uZWN0aW5nIHRoZXNlIHR3byB0aGluZ3MuXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9uZSBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWRcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH0gZWxzZSBpZiAoIShlcnIgJiYgKGVyci5jYW5jZWxlZCB8fCAoZXJyLnJlamVjdGVkSXRlbXMgJiYgZXJyLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKSkpIHtcblx0XHRcdFx0Ly8gVE9ETzogYW5hbHl6ZSwgd2hldGhlciB0aGlzIGlzIG9mIHRoZSBzYW1lIGNhdGVnb3J5IGFzIGFib3ZlXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cuaW52b2tlQWN0aW9uOiR7ZXJyfWApO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVE9ETzogQW55IHVuZXhwZWN0ZWQgZXJyb3JzIHByb2JhYmx5IHNob3VsZCBub3QgYmUgaWdub3JlZCFcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiBhbnkpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQsIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpc0luQ29sbGFib3JhdGl2ZURyYWZ0ID0gQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKTtcblx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBhbnkpLnNldElnbm9yZUVUYWcodHJ1ZSk7XG5cdFx0fVxuXHRcdGlmICghKHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlzSW5Db2xsYWJvcmF0aXZlRHJhZnQpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgYW55KS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBDcmVhdGVBY3RpdmF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0YXN5bmMgaGFuZGxlQ3JlYXRlQWN0aXZhdGUob0V2ZW50OiBFdmVudCkge1xuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGJBdEVuZCA9IHRydWU7XG5cdFx0Y29uc3QgYkluYWN0aXZlID0gdHJ1ZTtcblx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRjcmVhdGVBdEVuZDogYkF0RW5kLFxuXHRcdFx0aW5hY3RpdmU6IGJJbmFjdGl2ZSxcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0YnVzeU1vZGU6IFwiTm9uZVwiXG5cdFx0fTtcblx0XHR0cnkge1xuXHRcdFx0Ly8gU2VuZCBub3RpZmljYXRpb24gdG8gb3RoZXIgdXNlcnMgb25seSBhZnRlciB0aGUgY3JlYXRpb24gaGFzIGJlZW4gZmluYWxpemVkXG5cdFx0XHRjb25zdCBhY3RpdmF0ZWRDb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIikgYXMgQ29udGV4dDtcblx0XHRcdGFjdGl2YXRlZENvbnRleHRcblx0XHRcdFx0LmNyZWF0ZWQoKVxuXHRcdFx0XHQ/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2YXRlZENvbnRleHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKGBGYWlsZWQgdG8gYWN0aXZhdGUgY29udGV4dCAke2FjdGl2YXRlZENvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IGluYWN0aXZlIGNvbnRleHQgKGVtcHR5IHJvdyBpbiB0aGUgdGFibGUpXG5cdFx0XHRjb25zdCBuZXdJbmFjdGl2ZUNvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0b0JpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdFx0b1BhcmFtcyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KTtcblx0XHRcdGlmIChuZXdJbmFjdGl2ZUNvbnRleHQpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkZhaWxlZCB0byBhY3RpdmF0ZSBuZXcgcm93IC1cIiwgZXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRzeW5jVGFzayhuZXdUYXNrPzogKCgpID0+IGFueSkgfCBQcm9taXNlPGFueT4pIHtcblx0XHRpZiAobmV3VGFzaykge1xuXHRcdFx0aWYgKHR5cGVvZiBuZXdUYXNrID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrcy50aGVuKG5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrc1xuXHRcdFx0XHRcdC50aGVuKCgpID0+IG5ld1Rhc2spXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFza3M7XG5cdH1cblxuXHQvKipcblx0ICogRGVjaWRlcyBpZiBhIGRvY3VtZW50IGlzIHRvIGJlIHNob3duIGluIGRpc3BsYXkgb3IgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogSW50ZXJuYWwgbWV0aG9kIHRvIGRlbGV0ZSBhIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBUaGUgY29udGV4dChzKSB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIGRlbGV0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oY29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sIHBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKHRoaXMpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0XHRcdD8gc2FwLnVpLmdldENvcmUoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50KGNvbnRleHRzLCBwYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCByZXNvdXJjZU1vZGVsLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZU1vZGVsKCk6IFJlc291cmNlTW9kZWwge1xuXHRcdHJldHVybiBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKSB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIsIGJDcmVhdGlvbk1vZGUsIHVpTW9kZWxDb250ZXh0LCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Qgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIGdldENyZWF0aW9uTW9kZSgpOiBib29sZWFuIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIikgYXMgQ29udGV4dDtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIiwgdWlNb2RlbENvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZCBvciBub3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBpc0RvY3VtZW50TW9kaWZpZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvaXNEb2N1bWVudE1vZGlmaWVkXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbikge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiL2lzRG9jdW1lbnRNb2RpZmllZFwiLCBtb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGNyZWF0aW5nIGEgc3ViLW9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgb24gd2hpY2ggdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRcdC8vIFNldCB0aGUgbW9kaWZpZWQgZmxhZyBvbmx5IG9uIHJlbGF0aXZlIGxpc3RCaW5kaW5ncywgaS5lLiB3aGVuIGNyZWF0aW5nIGEgc3ViLW9iamVjdFxuXHRcdC8vIElmIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUsIHRoZW4gaXQncyBhIGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnQsIGFuZCBieSBkZWZhdWx0IGEgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBpc24ndCBjb25zaWRlcmVkIGFzIG1vZGlmaWVkXG5cdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoc3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2UgKGRpc3BsYXllZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlKS5cblx0ICpcblx0ICogQHBhcmFtIGRyYWZ0U3RhdHVzIFRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZVxuXHQgKi9cblx0c2V0RHJhZnRTdGF0dXMoZHJhZnRTdGF0dXM6IHN0cmluZykge1xuXHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvZHJhZnRTdGF0dXNcIiwgZHJhZnRTdGF0dXMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBhIGJpbmRpbmcgb3IgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBiaW5kaW5nIG9yIGNvbnRleHRcblx0ICogQHJldHVybnMgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqL1xuXHRwcml2YXRlIGdldFByb2dyYW1taW5nTW9kZWwoc291cmNlOiBDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwoc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBlZGl0TW9kZSBUaGUgZWRpdCBtb2RlXG5cdCAqIEBwYXJhbSBpc0NyZWF0aW9uIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBuZXdseSBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldEVkaXRNb2RlKGVkaXRNb2RlPzogc3RyaW5nLCBpc0NyZWF0aW9uPzogYm9vbGVhbikge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChlZGl0TW9kZSkge1xuXHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiLCBlZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmIChpc0NyZWF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoaXNDcmVhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5kZXhPZihhY3Rpb25OYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBUT0RPIE1vdmUgYWxsIHN0aWNreS1yZWxhdGVkIGJlbG93IHRvIGEgc3RpY2t5IHNlc3Npb24gbWFuYWdlciBjbGFzc1xuXG5cdC8qKlxuXHQgKiBFbmFibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPbihjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3QgaGFzaFRyYWNrZXIgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblxuXHRcdFx0XHQvLyBTZXQgYSBndWFyZCBpbiB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0Ly8gQSB0aW1lb3V0IGlzIG5lY2Vzc2FyeSwgYXMgd2l0aCBkZWZlcnJlZCBjcmVhdGlvbiB0aGUgaGFzaENoYW5nZXIgaXMgbm90IHVwZGF0ZWQgeWV0IHdpdGhcblx0XHRcdFx0Ly8gdGhlIG5ldyBoYXNoLCBhbmQgdGhlIGd1YXJkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IG9mIHRoZSByb3V0ZXIgcHJveHlcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0TmF2aWdhdGlvbkd1YXJkKGNvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdC8vIFNldHRpbmcgYmFjayBuYXZpZ2F0aW9uIG9uIHNoZWxsIHNlcnZpY2UsIHRvIGdldCB0aGUgZGljYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcykpO1xuXG5cdFx0XHRcdHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24gPSB0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKTtcblxuXHRcdFx0XHQvLyBoYW5kbGUgc2Vzc2lvbiB0aW1lb3V0XG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbiA9IHRoaXMuZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihjb250ZXh0LCBpMThuTW9kZWwpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBhbnkpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cblx0XHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T2ZmKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPZmZcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pIHtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRcdGlmIChtb2RlbCAmJiB0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pIHtcblx0XHRcdFx0bW9kZWwuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblx0XHRcdH1cblxuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKTtcblx0XHRcdHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICovXG5cdHByaXZhdGUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgcm91dGVyUHJveHkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAocm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblxuXHRcdFx0c3RpY2t5LnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0YXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oYmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZ0NvbnRleHQpXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgRGlydHlTdGF0ZVByb3ZpZGVyIGluIHRoZSBTaGVsbC5cblx0ICpcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgbW9kZWwgXCJpbnRlcm5hbFwiXG5cdCAqIEBwYXJhbSBoYXNoVHJhY2tlciBIYXNoIHRyYWNrZXJcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBoYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChuYXZpZ2F0aW9uQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAobmF2aWdhdGlvbkNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgRGlydHlTdGF0ZVByb3ZpZGVyIGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0SGFzaCA9IG5hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGU7XG5cdFx0XHRcdGNvbnN0IHJvdXRlclByb3h5ID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBsY2xIYXNoVHJhY2tlciA9IFwiXCI7XG5cdFx0XHRcdGxldCBpc0RpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBpc1Nlc3Npb25PbiA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghaXNTZXNzaW9uT24pIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgc3RpY2t5IHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGhhbmQuXG5cdFx0XHRcdFx0Ly8gRXhhbXBsZSBpbiBjYXNlIG9mIG5hdmlnYXRpbmcgYXdheSBmcm9tIGFwcGxpY2F0aW9uIHVzaW5nIElCTi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFyb3V0ZXJQcm94eS5pc05hdmlnYXRpb25GaW5hbGl6ZWQoKSkge1xuXHRcdFx0XHRcdC8vIElmIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGhhcHBlbmluZyBpbiBSb3V0ZXJQcm94eSwgaXQncyBhIHRyYW5zaWVudCBzdGF0ZVxuXHRcdFx0XHRcdC8vIChub3QgZGlydHkpXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0fSBlbHNlIGlmIChoYXNoVHJhY2tlciA9PT0gdGFyZ2V0SGFzaCkge1xuXHRcdFx0XHRcdC8vIHRoZSBoYXNoIGRpZG4ndCBjaGFuZ2Ugc28gZWl0aGVyIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHJlZnJlc2ggb3IgdG8gbGVhdmUgdGhlIGFwcFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJvdXRlclByb3h5LmNoZWNrSGFzaFdpdGhHdWFyZCh0YXJnZXRIYXNoKSB8fCByb3V0ZXJQcm94eS5pc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIHJvb3Qgb2JqZWN0XG5cdFx0XHRcdFx0Ly8gb3IgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCBieSB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgYXBwLCBmb3IgZXhhbXBsZSBiYWNrIHRvIHRoZSBsaXN0IHJlcG9ydFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXREaXJ0eUZsYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGhhc2hUcmFja2VyID0gbGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gaXNEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCB3aGVuIGEgc3RpY2t5IHNlc3Npb24gdGltZXMgb3V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc3RpY2t5Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEBwYXJhbSBpMThuTW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oc3RpY2t5Q29udGV4dDogQ29udGV4dCwgaTE4bk1vZGVsOiBNb2RlbCkge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoc3RpY2t5Q29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBTZXNzaW9uVGltZW91dCBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZW1vdmUgdHJhbnNpZW50IG1lc3NhZ2VzIHNpbmNlIHdlIHdpbGwgc2hvd2luZyBvdXIgb3duIG1lc3NhZ2Vcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRcdGNvbnN0IHdhcm5pbmdEaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX1RJVExFfVwiLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7IHRleHQ6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19NRVNTQUdFfVwiIH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IFwie3NhcC5mZS5pMThuPkNfQ09NTU9OX0RJQUxPR19PS31cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIHN0aWNreSBoYW5kbGluZyBhZnRlciBuYXZpZ2F0aW9uIHNpbmNlIHNlc3Npb24gaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkXG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0d2FybmluZ0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5zZXRNb2RlbChpMThuTW9kZWwsIFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmFkZERlcGVuZGVudCh3YXJuaW5nRGlhbG9nKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBvblJvdXRlTWF0Y2hlZCBldmVudCBpbiBjYXNlIG9mIHN0aWNreSBlZGl0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0OiBDb250ZXh0LCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50SGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFjdXJyZW50SGFzaCB8fCAhYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuY2hlY2tIYXNoV2l0aEd1YXJkKGN1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHR0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHQvL2NsZWFyIHRoZSBzZXNzaW9uIGNvbnRleHQgdG8gZW5zdXJlIHRoZSBMUiByZWZyZXNoZXMgdGhlIGxpc3Qgd2l0aG91dCBhIHNlc3Npb25cblx0XHRcdFx0XHQoY29udGV4dC5nZXRNb2RlbCgpIGFzIGFueSkuY2xlYXJTZXNzaW9uQ29udGV4dCgpO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuZHMgYSBzdGlja3kgc2Vzc2lvbiBieSBkaXNjYXJkaW5nIGNoYW5nZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChjb250ZXh0KTtcblx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxSb3V0aW5nKCk6IEludGVybmFsUm91dGluZyB7XG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpIHtcblx0XHRsZXQgcmVzb2x2ZUZ1bmN0aW9uLCByZWplY3RGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlRnVuY3Rpb24gPSByZXNvbHZlO1xuXHRcdFx0cmVqZWN0RnVuY3Rpb24gPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhhY3Rpb25OYW1lLCBvUmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IHJlc29sdmVGdW5jdGlvbiwgZlJlamVjdG9yOiByZWplY3RGdW5jdGlvbiB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhhY3Rpb25OYW1lOiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmVzcG9uc2UgPSByZXNwb25zZVswXS52YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIXJlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWxEYXRhID0gKGN1cnJlbnRWaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgYWN0aW9uUmV0dXJuVHlwZSA9XG5cdFx0XHRtZXRhTW9kZWxEYXRhICYmIG1ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV0gJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXSAmJiBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlXG5cdFx0XHRcdD8gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZS4kVHlwZVxuXHRcdFx0XHQ6IG51bGw7XG5cdFx0Y29uc3Qga2V5cyA9IGFjdGlvblJldHVyblR5cGUgJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSA/IG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0uJEtleSA6IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IHJlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5c1xuXHRcdH07XG5cdH1cblxuXHRnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0Y29uc3QgYWN0aXZlUm93SW5kZXg6IG51bWJlciA9IHJvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0XHRpZiAoYWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoYWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSW4gYSByZXNwb25zaXZlIHRhYmxlLCB0aGUgZW1wdHkgcm93cyBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGUuIEJ1dCB3aGVuIHdlIGNyZWF0ZSBtb3JlLCB0aGV5IGFwcGVhciBiZWxvdyB0aGUgbmV3IGxpbmUuXG5cdFx0XHQgKiBTbyB3ZSBjaGVjayB0aGUgZmlyc3QgaW5hY3RpdmUgcm93IGZpcnN0LCB0aGVuIHdlIHNldCB0aGUgZm9jdXMgb24gaXQgd2hlbiB3ZSBwcmVzcyB0aGUgYnV0dG9uLlxuXHRcdFx0ICogVGhpcyBkb2Vzbid0IGltcGFjdCB0aGUgR3JpZFRhYmxlIGJlY2F1c2UgdGhleSBhcHBlYXIgYXQgdGhlIGVuZCwgYW5kIHdlIGFscmVhZHkgZm9jdXMgdGhlIGJlZm9yZS10aGUtbGFzdCByb3cgKGJlY2F1c2UgMiBlbXB0eSByb3dzIGV4aXN0KVxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IHJvd0JpbmRpbmcuZ2V0Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXHRhc3luYyBjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmIChcblx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgJiZcblx0XHRcdCF0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IHVuZGVmaW5lZCxcblx0XHRhY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHRBY3Rpdml0eVN5bmMuc2VuZCh0aGlzLmdldFZpZXcoKSwgYWN0aW9uLCBjb250ZW50LCBhY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogYW55LCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YkVkaXRhYmxlOiBib29sZWFuLFxuXHRcdGJSZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW4sXG5cdFx0YkRyYWZ0TmF2aWdhdGlvbjogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cyA9IGZhbHNlXG5cdCkge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBhbnksIHBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9yc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0X2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpIHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXHRcdFx0bGV0IG9NZXNzYWdlO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTWVzc2FnZSA9IGFNZXNzYWdlc1tpXTtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChvTWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9yZWZyZXNoTGlzdElmUmVxdWlyZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0X3JlZnJlc2hMaXN0SWZSZXF1aXJlZChvUmVzcG9uc2U6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGlmICgob0JpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxuXG5cdF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob0tleTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQ6IENvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCwgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZCkge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aFxuXHQgKiBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRocyBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3Rcblx0ICogQHBhcmFtIHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcGFyYW0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0NBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFD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