@sapui5/sap.fe.core 1.111.1 → 1.113.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 (579) 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 +6 -5
  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 +12 -11
  7. package/src/sap/fe/core/AppComponent-dbg.js +35 -9
  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 +66 -9
  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 +202 -533
  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 +260 -681
  21. package/src/sap/fe/core/ExtensionAPI-dbg.js +4 -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 +11 -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 +164 -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 +170 -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 +142 -0
  49. package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +913 -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} +313 -373
  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 +183 -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 +936 -231
  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 +1023 -255
  69. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +48 -98
  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 +95 -129
  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 +3 -5
  87. package/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
  88. package/src/sap/fe/core/controllerextensions/PageReady.js.map +1 -1
  89. package/src/sap/fe/core/controllerextensions/PageReady.ts +26 -4
  90. package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
  91. package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
  92. package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
  93. package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
  94. package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
  95. package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
  96. package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
  97. package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
  98. package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
  99. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  100. package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
  101. package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
  102. package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
  103. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  104. package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
  105. package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
  106. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
  107. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  108. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
  109. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
  110. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
  111. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
  112. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
  113. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
  114. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
  115. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
  116. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
  117. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
  118. package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +4 -4
  119. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +1 -1
  120. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
  121. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +4 -5
  122. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
  123. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
  124. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
  125. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
  126. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
  127. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog-dbg.js +103 -0
  128. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +6 -0
  129. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -0
  130. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +124 -0
  131. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +78 -149
  132. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
  133. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
  134. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +85 -160
  135. package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +49 -49
  136. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
  137. package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
  138. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +52 -63
  139. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
  140. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +82 -0
  141. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
  142. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
  143. package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +123 -0
  144. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1508 -0
  145. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
  146. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
  147. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1993 -0
  148. package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
  149. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  150. package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
  151. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
  152. package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -18
  153. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
  154. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
  155. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -22
  156. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +53 -47
  157. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
  158. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
  159. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +55 -61
  160. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
  161. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
  162. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
  163. package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +78 -13
  164. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  165. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
  166. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +100 -13
  167. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
  168. package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
  169. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  170. package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
  171. package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
  172. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
  173. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  174. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
  175. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
  176. package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
  177. package/src/sap/fe/core/controls/FilterBar.ts +5 -0
  178. package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
  179. package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
  180. package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
  181. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
  182. package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
  183. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
  184. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
  185. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
  186. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
  187. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  188. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
  189. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
  190. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
  191. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
  192. package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
  193. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
  194. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
  195. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
  196. package/src/sap/fe/core/converters/ConverterContext-dbg.js +3 -5
  197. package/src/sap/fe/core/converters/ConverterContext.js +1 -1
  198. package/src/sap/fe/core/converters/ConverterContext.js.map +1 -1
  199. package/src/sap/fe/core/converters/ConverterContext.ts +4 -6
  200. package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
  201. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  202. package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
  203. package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
  204. package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +21 -3
  205. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  206. package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
  207. package/src/sap/fe/core/converters/ManifestWrapper.ts +23 -1
  208. package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +67 -62
  209. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  210. package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
  211. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -66
  212. package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
  213. package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
  214. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  215. package/src/sap/fe/core/converters/annotations/DataField-dbg.js +81 -20
  216. package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
  217. package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
  218. package/src/sap/fe/core/converters/annotations/DataField.ts +76 -22
  219. package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1027 -956
  220. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  221. package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
  222. package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +13 -19
  223. package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
  224. package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
  225. package/src/sap/fe/core/converters/controls/Common/Action.ts +37 -40
  226. package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
  227. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  228. package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
  229. package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
  230. package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
  231. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  232. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
  233. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
  234. package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +7 -6
  235. package/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
  236. package/src/sap/fe/core/converters/controls/Common/Form.js.map +1 -1
  237. package/src/sap/fe/core/converters/controls/Common/Form.ts +8 -14
  238. package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +9 -9
  239. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  240. package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
  241. package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -18
  242. package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +143 -93
  243. package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  244. package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
  245. package/src/sap/fe/core/converters/controls/Common/Table.ts +221 -177
  246. package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +23 -16
  247. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  248. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
  249. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -23
  250. package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +138 -75
  251. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  252. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
  253. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +223 -110
  254. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +38 -28
  255. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
  256. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
  257. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +67 -47
  258. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
  259. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
  260. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
  261. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
  262. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
  263. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
  264. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +54 -24
  265. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
  266. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
  267. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +84 -37
  268. package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +12 -14
  269. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  270. package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
  271. package/src/sap/fe/core/converters/helpers/Aggregation.ts +16 -11
  272. package/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +8 -6
  273. package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
  274. package/src/sap/fe/core/converters/helpers/BindingHelper.js.map +1 -1
  275. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +8 -6
  276. package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
  277. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  278. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
  279. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
  280. package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
  281. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
  282. package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
  283. package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
  284. package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +11 -9
  285. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  286. package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
  287. package/src/sap/fe/core/converters/helpers/IssueManager.ts +10 -8
  288. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +22 -20
  289. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  290. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
  291. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +19 -16
  292. package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +32 -35
  293. package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  294. package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
  295. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +42 -37
  296. package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +12 -5
  297. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  298. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
  299. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -2
  300. package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
  301. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  302. package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
  303. package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
  304. package/src/sap/fe/core/formatters/TableFormatter-dbg.js +3 -7
  305. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  306. package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
  307. package/src/sap/fe/core/formatters/TableFormatter.ts +2 -6
  308. package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +9 -5
  309. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  310. package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
  311. package/src/sap/fe/core/formatters/ValueFormatter.ts +11 -4
  312. package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
  313. package/src/sap/fe/core/fpm/Component.ts +1 -0
  314. package/src/sap/fe/core/fpm/manifest.json +1 -1
  315. package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
  316. package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  317. package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
  318. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  319. package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +7 -6
  320. package/src/sap/fe/core/helpers/BindingToolkit.js +1 -1
  321. package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
  322. package/src/sap/fe/core/helpers/BindingToolkit.ts +9 -9
  323. package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
  324. package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
  325. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  326. package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
  327. package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
  328. package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
  329. package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
  330. package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +23 -20
  331. package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  332. package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
  333. package/src/sap/fe/core/helpers/MassEditHelper.ts +26 -28
  334. package/src/sap/fe/core/helpers/MessageStrip-dbg.js +9 -9
  335. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  336. package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
  337. package/src/sap/fe/core/helpers/MessageStrip.ts +8 -8
  338. package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +517 -0
  339. package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
  340. package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
  341. package/src/sap/fe/core/helpers/MetaModelFunction.ts +610 -0
  342. package/src/sap/fe/core/helpers/ModelHelper-dbg.js +37 -73
  343. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  344. package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
  345. package/src/sap/fe/core/helpers/ModelHelper.ts +47 -74
  346. package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
  347. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  348. package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
  349. package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
  350. package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +39 -0
  351. package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
  352. package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
  353. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +35 -0
  354. package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +132 -23
  355. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  356. package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
  357. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +109 -22
  358. package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
  359. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  360. package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
  361. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  362. package/src/sap/fe/core/helpers/SizeHelper-dbg.js +53 -0
  363. package/src/sap/fe/core/helpers/SizeHelper.js +6 -0
  364. package/src/sap/fe/core/helpers/SizeHelper.js.map +1 -0
  365. package/src/sap/fe/core/helpers/SizeHelper.ts +51 -0
  366. package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +29 -25
  367. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  368. package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -1
  369. package/src/sap/fe/core/helpers/StableIdHelper.ts +26 -24
  370. package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
  371. package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
  372. package/src/sap/fe/core/helpers/TypeGuards-dbg.js +151 -1
  373. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  374. package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
  375. package/src/sap/fe/core/helpers/TypeGuards.ts +162 -1
  376. package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
  377. package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
  378. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
  379. package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
  380. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
  381. package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
  382. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
  383. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
  384. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  385. package/src/sap/fe/core/library-dbg.js +2 -2
  386. package/src/sap/fe/core/library-preload.js +156 -140
  387. package/src/sap/fe/core/library-preload.js.map +1 -1
  388. package/src/sap/fe/core/library.js +1 -1
  389. package/src/sap/fe/core/library.ts +7 -0
  390. package/src/sap/fe/core/manifest.json +1 -1
  391. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +67 -15
  392. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  393. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -1
  394. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -14
  395. package/src/sap/fe/core/messagebundle.properties +35 -0
  396. package/src/sap/fe/core/messagebundle_ar.properties +15 -12
  397. package/src/sap/fe/core/messagebundle_bg.properties +20 -17
  398. package/src/sap/fe/core/messagebundle_ca.properties +12 -9
  399. package/src/sap/fe/core/messagebundle_cs.properties +12 -9
  400. package/src/sap/fe/core/messagebundle_cy.properties +12 -9
  401. package/src/sap/fe/core/messagebundle_da.properties +12 -9
  402. package/src/sap/fe/core/messagebundle_de.properties +13 -10
  403. package/src/sap/fe/core/messagebundle_el.properties +14 -11
  404. package/src/sap/fe/core/messagebundle_en.properties +4 -1
  405. package/src/sap/fe/core/messagebundle_en_GB.properties +4 -1
  406. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
  407. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +21 -0
  408. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +23 -3
  409. package/src/sap/fe/core/messagebundle_es.properties +12 -9
  410. package/src/sap/fe/core/messagebundle_es_MX.properties +12 -9
  411. package/src/sap/fe/core/messagebundle_et.properties +12 -9
  412. package/src/sap/fe/core/messagebundle_fi.properties +12 -9
  413. package/src/sap/fe/core/messagebundle_fr.properties +12 -9
  414. package/src/sap/fe/core/messagebundle_fr_CA.properties +13 -10
  415. package/src/sap/fe/core/messagebundle_hi.properties +12 -9
  416. package/src/sap/fe/core/messagebundle_hr.properties +12 -9
  417. package/src/sap/fe/core/messagebundle_hu.properties +12 -9
  418. package/src/sap/fe/core/messagebundle_id.properties +13 -10
  419. package/src/sap/fe/core/messagebundle_it.properties +12 -9
  420. package/src/sap/fe/core/messagebundle_iw.properties +12 -9
  421. package/src/sap/fe/core/messagebundle_ja.properties +13 -10
  422. package/src/sap/fe/core/messagebundle_kk.properties +12 -9
  423. package/src/sap/fe/core/messagebundle_ko.properties +12 -9
  424. package/src/sap/fe/core/messagebundle_lt.properties +12 -9
  425. package/src/sap/fe/core/messagebundle_lv.properties +12 -9
  426. package/src/sap/fe/core/messagebundle_ms.properties +13 -10
  427. package/src/sap/fe/core/messagebundle_nl.properties +13 -10
  428. package/src/sap/fe/core/messagebundle_no.properties +12 -9
  429. package/src/sap/fe/core/messagebundle_pl.properties +12 -9
  430. package/src/sap/fe/core/messagebundle_pt.properties +12 -9
  431. package/src/sap/fe/core/messagebundle_pt_PT.properties +12 -9
  432. package/src/sap/fe/core/messagebundle_ro.properties +16 -13
  433. package/src/sap/fe/core/messagebundle_ru.properties +13 -10
  434. package/src/sap/fe/core/messagebundle_sh.properties +12 -9
  435. package/src/sap/fe/core/messagebundle_sk.properties +12 -9
  436. package/src/sap/fe/core/messagebundle_sl.properties +12 -9
  437. package/src/sap/fe/core/messagebundle_sv.properties +12 -9
  438. package/src/sap/fe/core/messagebundle_th.properties +12 -9
  439. package/src/sap/fe/core/messagebundle_tr.properties +12 -9
  440. package/src/sap/fe/core/messagebundle_uk.properties +12 -9
  441. package/src/sap/fe/core/messagebundle_vi.properties +13 -10
  442. package/src/sap/fe/core/messagebundle_zh_CN.properties +12 -9
  443. package/src/sap/fe/core/messagebundle_zh_TW.properties +12 -9
  444. package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
  445. package/src/sap/fe/core/operationsHelper.js +1 -1
  446. package/src/sap/fe/core/operationsHelper.js.map +1 -1
  447. package/src/sap/fe/core/operationsHelper.ts +88 -63
  448. package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
  449. package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
  450. package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
  451. package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
  452. package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
  453. package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
  454. package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +10 -5
  455. package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
  456. package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
  457. package/src/sap/fe/core/rootView/RootViewBaseController.ts +22 -8
  458. package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
  459. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  460. package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
  461. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
  462. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
  463. package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
  464. package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
  465. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
  466. package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
  467. package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
  468. package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
  469. package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
  470. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  471. package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
  472. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
  473. package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +9 -3
  474. package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
  475. package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
  476. package/src/sap/fe/core/services/RoutingServiceFactory.ts +35 -3
  477. package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +7 -1
  478. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  479. package/src/sap/fe/core/services/ShellServicesFactory.js.map +1 -1
  480. package/src/sap/fe/core/services/ShellServicesFactory.ts +24 -2
  481. package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
  482. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  483. package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
  484. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +497 -333
  485. package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +26 -6
  486. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  487. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
  488. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +54 -13
  489. package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
  490. package/src/sap/fe/core/support/Diagnostics.ts +5 -0
  491. package/src/sap/fe/core/templating/CommonFormatters-dbg.js +4 -3
  492. package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
  493. package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
  494. package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
  495. package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +195 -95
  496. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  497. package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
  498. package/src/sap/fe/core/templating/DataModelPathHelper.ts +210 -96
  499. package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +5 -5
  500. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  501. package/src/sap/fe/core/templating/DisplayModeFormatter.js.map +1 -1
  502. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -2
  503. package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +19 -29
  504. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
  505. package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
  506. package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -26
  507. package/src/sap/fe/core/templating/EntityTypeHelper-dbg.js +48 -0
  508. package/src/sap/fe/core/templating/EntityTypeHelper.js +6 -0
  509. package/src/sap/fe/core/templating/EntityTypeHelper.js.map +1 -0
  510. package/src/sap/fe/core/templating/EntityTypeHelper.ts +37 -0
  511. package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
  512. package/src/sap/fe/core/templating/FilterHelper.js +1 -1
  513. package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
  514. package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
  515. package/src/sap/fe/core/templating/FilterTemplating-dbg.js +7 -8
  516. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  517. package/src/sap/fe/core/templating/FilterTemplating.js.map +1 -1
  518. package/src/sap/fe/core/templating/FilterTemplating.ts +5 -8
  519. package/src/sap/fe/core/templating/PropertyFormatters-dbg.js +1 -6
  520. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  521. package/src/sap/fe/core/templating/PropertyFormatters.js.map +1 -1
  522. package/src/sap/fe/core/templating/PropertyFormatters.ts +0 -5
  523. package/src/sap/fe/core/templating/PropertyHelper-dbg.js +13 -46
  524. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  525. package/src/sap/fe/core/templating/PropertyHelper.js.map +1 -1
  526. package/src/sap/fe/core/templating/PropertyHelper.ts +14 -43
  527. package/src/sap/fe/core/templating/UIFormatters-dbg.js +32 -26
  528. package/src/sap/fe/core/templating/UIFormatters.js +1 -1
  529. package/src/sap/fe/core/templating/UIFormatters.js.map +1 -1
  530. package/src/sap/fe/core/templating/UIFormatters.ts +47 -32
  531. package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
  532. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
  533. package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
  534. package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
  535. package/src/sap/fe/core/type/FiscalDate.ts +2 -1
  536. package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
  537. package/src/sap/fe/core/type/TypeUtil.js +1 -1
  538. package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
  539. package/src/sap/fe/core/type/TypeUtil.ts +3 -6
  540. package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
  541. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
  542. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
  543. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
  544. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
  545. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
  546. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
  547. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
  548. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -948
  549. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
  550. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
  551. package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
  552. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
  553. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
  554. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
  555. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +0 -91
  556. package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
  557. package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
  558. package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
  559. package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
  560. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
  561. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
  562. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
  563. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
  564. package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
  565. package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
  566. package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
  567. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
  568. package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
  569. package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
  570. package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
  571. package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
  572. package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
  573. package/src/sap/fe/core/controls/FileWrapper.js +0 -6
  574. package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
  575. package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
  576. package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
  577. package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
  578. package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
  579. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
@@ -517,7 +517,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
517
517
  */;
518
518
  _proto._checkPathForSemanticBookmarking = function _checkPathForSemanticBookmarking(sPath, oMetaModel) {
519
519
  // Only path on root objects allow semantic bookmarking, i.e. sPath = xxx(yyy)
520
- const aMatches = /^[\/]?(\w+)\([^\/]+\)$/.exec(sPath);
520
+ const aMatches = /^[/]?(\w+)\([^/]+\)$/.exec(sPath);
521
521
  if (!aMatches) {
522
522
  return false;
523
523
  }
@@ -800,8 +800,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
800
800
  const aNavigationPropertyPaths = [];
801
801
  const aPropertyPaths = [];
802
802
  const oSideEffects = {
803
- TargetProperties: [],
804
- TargetEntities: []
803
+ targetProperties: [],
804
+ targetEntities: []
805
805
  };
806
806
  function getBindingPaths(oBinding) {
807
807
  let aDependentBindings;
@@ -838,27 +838,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
838
838
  getBindingPaths(oBindingContext.getBinding());
839
839
  let i;
840
840
  for (i = 0; i < aNavigationPropertyPaths.length; i++) {
841
- oSideEffects.TargetEntities.push({
841
+ oSideEffects.targetEntities.push({
842
842
  $NavigationPropertyPath: aNavigationPropertyPaths[i]
843
843
  });
844
844
  }
845
- oSideEffects.TargetProperties = aPropertyPaths;
845
+ oSideEffects.targetProperties = aPropertyPaths;
846
846
  if (sMessagesPath) {
847
- oSideEffects.TargetProperties.push(sMessagesPath);
847
+ oSideEffects.targetProperties.push(sMessagesPath);
848
848
  }
849
849
  //all this logic to be replaced with a SideEffects request for an empty path (refresh everything), after testing transient contexts
850
- oSideEffects.TargetProperties = oSideEffects.TargetProperties.map(sTargetProperty => {
851
- if (sTargetProperty) {
852
- const index = sTargetProperty.indexOf("/");
853
- if (index > 0) {
854
- // only request the navigation path and not the property paths further
855
- return sTargetProperty.slice(0, index);
856
- }
857
- return sTargetProperty;
850
+ oSideEffects.targetProperties = oSideEffects.targetProperties.reduce((targets, targetProperty) => {
851
+ if (targetProperty) {
852
+ const index = targetProperty.indexOf("/");
853
+ targets.push(index > 0 ? targetProperty.slice(0, index) : targetProperty);
858
854
  }
859
- });
855
+ return targets;
856
+ }, []);
860
857
  // OData model will take care of duplicates
861
- oSideEffectsService.requestSideEffects(oSideEffects.TargetEntities.concat(oSideEffects.TargetProperties), oBindingContext);
858
+ oSideEffectsService.requestSideEffects([...oSideEffects.targetEntities, ...oSideEffects.targetProperties], oBindingContext);
862
859
  }
863
860
 
864
861
  /**
@@ -981,4 +978,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
981
978
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
982
979
  return InternalRouting;
983
980
  }, false);
984
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJfcmVzb2x2ZVNlbWFudGljUGF0aCIsInNUZWNobmljYWxQYXRoIiwiX2JpbmRQYWdlVG9QYXRoIiwib1Jlc291cmNlQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsIl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoIiwic1NlbWFudGljUGF0aCIsImFTZW1hbnRpY0tleXMiLCJvTWV0YU1vZGVsIiwiZm5VbnF1b3RlQW5kRGVjb2RlIiwibGFzdEluZGV4T2YiLCJsZW5ndGgiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzdWJzdHJpbmciLCJhS2V5VmFsdWVzIiwic3BsaXQiLCJhRmlsdGVycyIsImJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJzS2V5VmFsdWUiLCJGaWx0ZXIiLCIkUHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJiRmFpbGVkIiwibWFwIiwib1NlbWFudGljS2V5Iiwib0RyYWZ0RmlsdGVyIiwiZmlsdGVycyIsImFuZCIsInB1c2giLCJfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsIm9GaWx0ZXIiLCJzdGFydHNXaXRoIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJyZXF1ZXN0Q29udGV4dHMiLCJvQ29udGV4dHMiLCJfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyIsInNQYXRoIiwiYU1hdGNoZXMiLCJleGVjIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJzUGF0aFRvUmVzb2x2ZSIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50SGFzaE5vUGFyYW1zIiwiZ2V0SGFzaENoYW5nZXIiLCJzUm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJzZW1hbnRpY1BhdGgiLCJ0ZWNobmljYWxQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9DdXJyZW50Q29udGV4dCIsInNDdXJyZW50UGF0aCIsIm9Vc2VDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1ldGFNb2RlbCIsInJlZnJlc2giLCJpc0Nvbm5lY3RlZCIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsIl9jcmVhdGVDb250ZXh0IiwiQXBwU3RhdGVDaGFuZ2VkIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJsaXN0QmluZGluZyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCIkJHVwZGF0ZUdyb3VwSWQiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic01lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvUHJldmlvdXNCaW5kaW5nIiwiZGVzdHJveSIsIm9IaWRkZW5CaW5kaW5nIiwiYmluZENvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJpc0xvY2tlZCIsInVubG9jayIsIm1lc3NhZ2VIYW5kbGVyIiwibVBhcmFtcyIsInN0YXR1cyIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJzaG93TWVzc2FnZXMiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1Jvb3RDb250ZXh0UGF0aCIsImFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocyIsImFQcm9wZXJ0eVBhdGhzIiwib1NpZGVFZmZlY3RzIiwiVGFyZ2V0UHJvcGVydGllcyIsIlRhcmdldEVudGl0aWVzIiwiZ2V0QmluZGluZ1BhdGhzIiwib0JpbmRpbmciLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwiZ2V0Q29udGV4dCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzVGFyZ2V0UHJvcGVydHkiLCJpbmRleCIsImNvbmNhdCIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0IiwiaXNLZWVwQWxpdmUiLCJiS2VlcEFsaXZlIiwiZm5CZWZvcmVEZXN0cm95IiwiYlJlcXVlc3RNZXNzYWdlcyIsImVuZHNXaXRoIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJzZXRLZWVwQWxpdmUiLCJrZXB0QWxpdmVTZWdtZW50cyIsImFkZGl0aW9ubmFsU2VnbWVudHMiLCJwb3AiLCJrZXB0QWxpdmVQYXRoIiwiam9pbiIsIm9LZWVwQWxpdmVDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJldmVyc2UiLCJhZGRpdGlvbm5hbFBhdGgiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfcm91dGluZyIsInNMYXlvdXQiLCJ3YXJuaW5nIiwiY2xvc2VDb2x1bW4iLCJvVmlld0RhdGEiLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHsgaXNDb25uZWN0ZWQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1xuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cdHByaXZhdGUgX29WaWV3ITogVmlldztcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXHRwcml2YXRlIF9vUm91dGluZ1NlcnZpY2UhOiBSb3V0aW5nU2VydmljZTtcblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblx0cHJvdGVjdGVkIF9vVGFyZ2V0SW5mb3JtYXRpb246IGFueTtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKSB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0aW5nU2VydmljZSkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IodGhpcy5fb1BhZ2VDb21wb25lbnQgfHwgdGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udHJvbGxlciBleHRlbnNpb24gY2Fubm90IHdvcmsgd2l0aG91dCBhICdyb3V0aW5nU2VydmljZScgb24gdGhlIG1haW4gQXBwQ29tcG9uZW50XCIpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcmVkIGV2ZXJ5IHRpbWUgdGhpcyBjb250cm9sbGVyIGlzIGEgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5vbkNvbnRleHRCb3VuZFRvVmlldyhvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gYWZ0ZXIgYSB1c2VyIGFjdGlvblxuXHQvLyAoZS5nLiBjbGljayBvbiBhIHRhYmxlIHJvdywgYnV0dG9uLCBldGMuLi4pXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gc05hdmlnYXRpb25UYXJnZXROYW1lIE5hbWUgb2YgdGhlIG5hdmlnYXRpb24gdGFyZ2V0XG5cdCAqIEBwYXJhbSBiUHJlc2VydmVIaXN0b3J5IFRydWUgdG8gZm9yY2UgdGhlIG5ldyBVUkwgdG8gYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5IChubyByZXBsYWNlKVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvVGFyZ2V0KG9Db250ZXh0OiBhbnksIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLCBiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbikge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH1cblx0XHR0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWU6IHN0cmluZywgb1BhcmFtZXRlcnM/OiBvYmplY3QpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IG9Db250ZXh0SW5mbzogYW55ID0ge307XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdGlmIChvQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dCkge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dFxuXHRcdFx0XHRcdC50aGVuKChhc3luY0NvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gb25jZSB0aGUgY29udGV4dCBpcyByZXR1cm5lZCB3ZSBuYXZpZ2F0ZSBpbnRvIGl0XG5cdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGFzeW5jQ29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogbVBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBtUGFyYW1ldGVycy5lZGl0YWJsZSxcblx0XHRcdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdFx0XHRcdFx0dXBkYXRlRkNMTGV2ZWw6IG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsLFxuXHRcdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogbVBhcmFtZXRlcnMuYkZvcmNlRm9jdXNcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2l0aCB0aGUgYXN5bmMgY29udGV4dFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICghbVBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHQvLyBOYXZpZ2F0ZSB0byBhIGxpc3QgYmluZGluZyBub3QgeWV0IHN1cHBvcnRlZFxuXHRcdFx0XHR0aHJvdyBcIm5hdmlnYXRpb24gdG8gYSBsaXN0IGJpbmRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY2FsbEV4dGVuc2lvbikge1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXG5cdFx0XHRvQ29udGV4dEluZm8uc291cmNlQmluZGluZ0NvbnRleHQgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdG9Db250ZXh0SW5mby5iaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm9FdmVudCkge1xuXHRcdFx0XHRvQ29udGV4dEluZm8ub0V2ZW50ID0gbVBhcmFtZXRlcnMub0V2ZW50O1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3QgYk92ZXJyaWRlTmF2ID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24ob0NvbnRleHRJbmZvKTtcblx0XHRcdGlmIChiT3ZlcnJpZGVOYXYpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgb0NvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycywgdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCkge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5kZXhPZihcIiguLi4pXCIpICE9PSAtMSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmRleE9mKFwiaS1hY3Rpb249Y3JlYXRlXCIpID4gLTEgfHxcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWF1dG9DcmVhdGVcIikgPiAtMVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRcdHJldHVybiAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmRpc3BsYXlFcnJvclBhZ2Uoc0Vycm9yTWVzc2FnZSwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uOiBhbnkpOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCBhVGFyZ2V0cy5pbmRleE9mKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSA9PT0gLTEpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtcyBvZiBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB3ZSByZW1vdmUgaXRzIGJpbmRpbmcgY29udGV4dCwgdG8gYXZvaWQgdGhpcyB2aWV3IHRvIGhhdmUgZGF0YSBpZiB3ZSBuYXZpZ2F0ZSB0byBpdCBsYXRlciBvblxuXHRcdFx0aWYgKCh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udmlld0xldmVsID8/IDApID49IChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID8/IDApKSB7XG5cdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKHJvdXRlQXJndW1lbnRzOiBhbnksIGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmRleE9mKGB7JHtzS2V5fX1gKSA+PSAwKSB7XG5cdFx0XHRcdGRlZmVycmVkID0gdHJ1ZTtcblx0XHRcdFx0Ly8gU29tZXRpbWVzIGluIHByZWZlcnJlZE1vZGUgPSBjcmVhdGUsIHRoZSBlZGl0IGJ1dHRvbiBpcyBzaG93biBpbiBiYWNrZ3JvdW5kIHdoZW4gdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIHNob3dzIHVwLCBzZXR0aW5nIGJUYXJnZXRFZGl0YWJsZSBwYXNzZXMgZWRpdGFibGUgYXMgdHJ1ZVxuXHRcdFx0XHQvLyB0byBvbkJlZm9yZUJpbmRpbmcgaW4gX2JpbmRUYXJnZXRQYWdlIGZ1bmN0aW9uXG5cdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHtzS2V5fX1gLCBzVmFsdWUpO1xuXHRcdH1cblx0XHRpZiAocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gJiYgcm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0uaGFzT3duUHJvcGVydHkoXCJpLWFjdGlvblwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfb25Sb3V0ZU1hdGNoZWQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gfHwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSAob0V2ZW50LmdldFBhcmFtZXRlcnMoKSBhcyBhbnkpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIik7XG5cdFx0Y29uc3QgeyBwYXRoLCBkZWZlcnJlZCB9ID0gdGhpcy5fYnVpbGRCaW5kaW5nUGF0aChtQXJndW1lbnRzLCBiaW5kaW5nUGF0dGVybiwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRsZXQgb091dDtcblx0XHRpZiAoZGVmZXJyZWQpIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0b091dC5maW5hbGx5KCgpID0+IHtcblx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdH0pO1xuXG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmZXJyZWQgYmluZGluZyAoZHVyaW5nIG9iamVjdCBjcmVhdGlvbikuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZERlZmVycmVkKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCwgeyBlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmIChvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCB8fCAhb05hdmlnYXRpb25QYXJhbWV0ZXJzLm9Bc3luY0NvbnRleHQpIHtcblx0XHRcdC8vIGVpdGhlciB0aGUgY29udGV4dCBzaGFsbCBiZSBjcmVhdGVkIGluIHRoZSB0YXJnZXQgcGFnZSAoZGVmZXJyZWQgQ29udGV4dCkgb3IgaXQgc2hhbGxcblx0XHRcdC8vIGJlIGNyZWF0ZWQgYXN5bmMgYnV0IHRoZSB1c2VyIHJlZnJlc2hlZCB0aGUgcGFnZSAvIGJvb2ttYXJrZWQgdGhpcyBVUkxcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGUgdGFyZ2V0IGNvbXBvbmVudCBjcmVhdGVzIHRoaXMgZG9jdW1lbnQgYnV0IHdlIHNoYWxsIG1vdmUgdGhpcyB0b1xuXHRcdFx0Ly8gYSBjZW50cmFsIHBsYWNlXG5cdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dChcblx0XHRcdFx0XHRzVGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMub25BZnRlckJpbmRpbmcobnVsbCk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIGhhcyBiZWVuIHNldCBvbiB0aGUgcGFnZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZShzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogb2JqZWN0KSB7XG5cdFx0aWYgKHNUYXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXNvbHZlU2VtYW50aWNQYXRoKHNUYXJnZXRQYXRoLCBvTW9kZWwpXG5cdFx0XHRcdC50aGVuKChzVGVjaG5pY2FsUGF0aDogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgoc1RlY2huaWNhbFBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IG9FcnJvci5tZXNzYWdlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdG8gcmV0cmlldmUgYSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gYSBzZW1hbnRpYyBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljUGF0aCBUaGUgc2VtYW50aWMgcGF0aFxuXHQgKiBAcGFyYW0gYVNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBmaWx0ZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIGFTZW1hbnRpY0tleXM6IGFueVtdLCBvTWV0YU1vZGVsOiBvYmplY3QpIHtcblx0XHRjb25zdCBmblVucXVvdGVBbmREZWNvZGUgPSBmdW5jdGlvbiAoc1ZhbHVlOiBhbnkpIHtcblx0XHRcdGlmIChzVmFsdWUuaW5kZXhPZihcIidcIikgPT09IDAgJiYgc1ZhbHVlLmxhc3RJbmRleE9mKFwiJ1wiKSA9PT0gc1ZhbHVlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBxdW90ZXMgZnJvbSB0aGUgdmFsdWUgYW5kIGRlY29kZSBzcGVjaWFsIGNoYXJzXG5cdFx0XHRcdHNWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChzVmFsdWUuc3Vic3RyaW5nKDEsIHNWYWx1ZS5sZW5ndGggLSAxKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1ZhbHVlO1xuXHRcdH07XG5cdFx0Y29uc3QgYUtleVZhbHVlcyA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKHNTZW1hbnRpY1BhdGguaW5kZXhPZihcIihcIikgKyAxLCBzU2VtYW50aWNQYXRoLmxlbmd0aCAtIDEpLnNwbGl0KFwiLFwiKTtcblx0XHRsZXQgYUZpbHRlcnM6IEZpbHRlcltdO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMubGVuZ3RoICE9IGFLZXlWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShvTWV0YU1vZGVsKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Ly8gVGFrZSB0aGUgZmlyc3Qga2V5IHZhbHVlXG5cdFx0XHRjb25zdCBzS2V5VmFsdWUgPSBmblVucXVvdGVBbmREZWNvZGUoYUtleVZhbHVlc1swXSk7XG5cdFx0XHRhRmlsdGVycyA9IFtcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0cGF0aDogYVNlbWFudGljS2V5c1swXS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHR2YWx1ZTE6IHNLZXlWYWx1ZSxcblx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbUtleVZhbHVlczogYW55ID0ge307XG5cdFx0XHQvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGtleSB2YWx1ZXNcblx0XHRcdGFLZXlWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleUFzc2lnbm1lbnQ6IHN0cmluZykge1xuXHRcdFx0XHRjb25zdCBhUGFydHMgPSBzS2V5QXNzaWdubWVudC5zcGxpdChcIj1cIiksXG5cdFx0XHRcdFx0c0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFQYXJ0c1sxXSk7XG5cblx0XHRcdFx0bUtleVZhbHVlc1thUGFydHNbMF1dID0gc0tleVZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGxldCBiRmFpbGVkID0gZmFsc2U7XG5cdFx0XHRhRmlsdGVycyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvU2VtYW50aWNLZXk6IGFueSkge1xuXHRcdFx0XHRjb25zdCBzS2V5ID0gb1NlbWFudGljS2V5LiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0c1ZhbHVlID0gbUtleVZhbHVlc1tzS2V5XTtcblxuXHRcdFx0XHRpZiAoc1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBzS2V5LFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiBzVmFsdWUsXG5cdFx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJGYWlsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IFwiWFhcIlxuXHRcdFx0XHRcdH0pOyAvLyB3aWxsIGJlIGlnbm9yZSBhbnl3YXkgc2luY2Ugd2UgcmV0dXJuIGFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYkZhaWxlZCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgYSBkcmFmdCBmaWx0ZXIgdG8gbWFrZSBzdXJlIHdlIHRha2UgdGhlIGRyYWZ0IGVudGl0eSBpZiB0aGVyZSBpcyBvbmVcblx0XHQvLyBPciB0aGUgYWN0aXZlIGVudGl0eSBvdGhlcndpc2Vcblx0XHRjb25zdCBvRHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHRcdGFGaWx0ZXJzLnB1c2gob0RyYWZ0RmlsdGVyKTtcblxuXHRcdHJldHVybiBuZXcgRmlsdGVyKGFGaWx0ZXJzLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIHRvIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljUGF0aCBUaGUgcGF0aCB3aXRoIHNlbWFudGljIGtleXNcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgbW9kZWwgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgY29udGFpbmluZyB0aGUgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzIGlmIHNTZW1hbnRpY1BhdGggY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBudWxsIG90aGVyd2lzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBhU2VtYW50aWNLZXlzOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzU2VtYW50aWNQYXRoKS5nZXRQYXRoKCk7XG5cblx0XHRpZiAoIWFTZW1hbnRpY0tleXMgfHwgYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIHNlbWFudGljIGtleXNcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgc2V0IG9mIGZpbHRlcnMgY29ycmVzcG9uZGluZyB0byBhbGwga2V5c1xuXHRcdGNvbnN0IG9GaWx0ZXIgPSB0aGlzLl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGgsIGFTZW1hbnRpY0tleXMsIG9NZXRhTW9kZWwpO1xuXHRcdGlmIChvRmlsdGVyID09PSBudWxsKSB7XG5cdFx0XHQvLyBDb3VsZG4ndCBpbnRlcnByZXQgdGhlIHBhdGggYXMgYSBzZW1hbnRpYyBvbmVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3Rcblx0XHRpZiAoIXNFbnRpdHlTZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0VudGl0eVNldFBhdGggPSBgLyR7c0VudGl0eVNldFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KHNFbnRpdHlTZXRQYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwge1xuXHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKS50aGVuKGZ1bmN0aW9uIChvQ29udGV4dHM6IGFueSkge1xuXHRcdFx0aWYgKG9Db250ZXh0cyAmJiBvQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dHNbMF0uZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gTm8gZGF0YSBjb3VsZCBiZSBsb2FkZWRcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBlbGlnaWJsZSBmb3Igc2VtYW50aWMgYm9va21hcmtpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aCB0byB0ZXN0XG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBlbGlnaWJsZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jaGVja1BhdGhGb3JTZW1hbnRpY0Jvb2ttYXJraW5nKHNQYXRoOiBzdHJpbmcsIG9NZXRhTW9kZWw6IGFueSkge1xuXHRcdC8vIE9ubHkgcGF0aCBvbiByb290IG9iamVjdHMgYWxsb3cgc2VtYW50aWMgYm9va21hcmtpbmcsIGkuZS4gc1BhdGggPSB4eHgoeXl5KVxuXHRcdGNvbnN0IGFNYXRjaGVzID0gL15bXFwvXT8oXFx3KylcXChbXlxcL10rXFwpJC8uZXhlYyhzUGF0aCk7XG5cdFx0aWYgKCFhTWF0Y2hlcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBHZXQgdGhlIGVudGl0eVNldCBuYW1lXG5cdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBgLyR7YU1hdGNoZXNbMV19YDtcblx0XHQvLyBDaGVjayB0aGUgZW50aXR5IHNldCBzdXBwb3J0cyBkcmFmdCAob3RoZXJ3aXNlIHdlIGRvbid0IHN1cHBvcnQgc2VtYW50aWMgYm9va21hcmtpbmcpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0cmV0dXJuIG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyBmcm9tIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGhUb1Jlc29sdmUgVGhlIHBhdGggdG8gYmUgdHJhbnNmb3JtZWRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgc1BhdGhUb1Jlc29sdmVkIGNvdWxkbid0IGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3Jlc29sdmVTZW1hbnRpY1BhdGgoc1BhdGhUb1Jlc29sdmU6IHN0cmluZywgb01vZGVsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0xhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICcvJ1xuXHRcdFx0c0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0bGV0IHNSb290RW50aXR5TmFtZSA9IHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cigwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHNSb290RW50aXR5TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgYkFsbG93U2VtYW50aWNCb29rbWFyayA9IHRoaXMuX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9NZXRhTW9kZWwpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IGJBbGxvd1NlbWFudGljQm9va21hcmsgJiYgU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzIGF2YWlsYWJsZSAtLT4gdXNlIHRoZSBwYXRoIGFzIGlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNQYXRoVG9SZXNvbHZlKTtcblx0XHR9IGVsc2UgaWYgKG9MYXN0U2VtYW50aWNNYXBwaW5nICYmIG9MYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCA9PT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBuZWVkIHJlc29sdmUgdGhlIHNlbWFudGljIHBhdGggdG8gZ2V0IHRoZSB0ZWNobmljYWwga2V5c1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTW9kZWwsIGFTZW1hbnRpY0tleXMpLnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNUZWNobmljYWxQYXRoICYmIHNUZWNobmljYWxQYXRoICE9PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzZW1hbnRpYyBwYXRoIHdhcyByZXNvbHZlZCAob3RoZXJ3aXNlIGtlZXAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0YXJnZXQpXG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogc1RlY2huaWNhbFBhdGgsXG5cdFx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHNQYXRoVG9SZXNvbHZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIHNUZWNobmljYWxQYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFRvUmVzb2x2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0LiBOZWVkcyB0byBjb250YWluIHRlY2huaWNhbCBrZXlzIG9ubHkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0aXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0KSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWUgLy8gTG9hZCBtZXNzYWdlcywgb3RoZXJ3aXNlIHRoZXkgZG9uJ3QgZ2V0IHJlZnJlc2hlZCBsYXRlciwgZS5nLiBmb3Igc2lkZSBlZmZlY3RzXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0Ly8gc2V0S2VlcEFsaXZlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHBhcmVudCBsaXN0YmluZGluZyBkb2Vzbid0IGhhdmUgJCRvd25SZXF1ZXN0PXRydWVcblx0XHRcdFx0Ly8gVGhpcyBjYXNlIGZvciBjdXN0b20gZnJhZ21lbnRzIGlzIHN1cHBvcnRlZCwgYnV0IGFuIGVycm9yIGlzIGxvZ2dlZCB0byBtYWtlIHRoZSBsYWNrIG9mIHN5bmNocm9uaXphdGlvbiBhcHBhcmVudFxuXHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0YFZpZXcgZm9yICR7b0NvbnRleHQuZ2V0UGF0aCgpfSB3b24ndCBiZSBzeW5jaHJvbml6ZWQuIFBhcmVudCBsaXN0QmluZGluZyBtdXN0IGhhdmUgYmluZGluZyBwYXJhbWV0ZXIgJCRvd25SZXF1ZXN0PXRydWVgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8IG9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgY29udGV4dCBvdGhlcndpc2Ugd2UgZ2V0IGVycm9yc1xuXHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIHRoZSBwcm9wZXIgYmVmb3JlL2FmdGVyIGNhbGxiYWNrc1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlNob3dQbGFjZWhvbGRlclxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcob0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jcmVhdGVDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQsXG5cdFx0XHRzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpLFxuXHRcdFx0c0NvbnRleHRQYXRoID1cblx0XHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsLCBzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGtlZXBBbGl2ZSBjb250ZXh0ICR7c1BhdGh9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdG9EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0PyBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCIsIFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl1cblx0XHRcdFx0XHRcdFx0OiBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChzRW50aXR5U2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IFwiSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9ICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIGFueSk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0b1ByZXZpb3VzQmluZGluZ1xuXHRcdFx0XHRcdD8ucmVzZXRDaGFuZ2VzKClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlc2V0aW5nIHRoZSBjaGFuZ2VzIHRvIHRoZSBiaW5kaW5nXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBhd2FpdCBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgY29yZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IGFueSA9IHtcblx0XHRcdFRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogYW55KSB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9ICgob0JpbmRpbmcuZ2V0Q29udGV4dCgpICYmIG9CaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpIHx8IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGFEZXBlbmRlbnRCaW5kaW5nc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHQvL2FsbCB0aGlzIGxvZ2ljIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBTaWRlRWZmZWN0cyByZXF1ZXN0IGZvciBhbiBlbXB0eSBwYXRoIChyZWZyZXNoIGV2ZXJ5dGhpbmcpLCBhZnRlciB0ZXN0aW5nIHRyYW5zaWVudCBjb250ZXh0c1xuXHRcdG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzID0gb1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMubWFwKChzVGFyZ2V0UHJvcGVydHk6IFN0cmluZykgPT4ge1xuXHRcdFx0aWYgKHNUYXJnZXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHNUYXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0aWYgKGluZGV4ID4gMCkge1xuXHRcdFx0XHRcdC8vIG9ubHkgcmVxdWVzdCB0aGUgbmF2aWdhdGlvbiBwYXRoIGFuZCBub3QgdGhlIHByb3BlcnR5IHBhdGhzIGZ1cnRoZXJcblx0XHRcdFx0XHRyZXR1cm4gc1RhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc1RhcmdldFByb3BlcnR5O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE9EYXRhIG1vZGVsIHdpbGwgdGFrZSBjYXJlIG9mIGR1cGxpY2F0ZXNcblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMuY29uY2F0KG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzKSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRCaW5kaW5nQ29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IGFueSkge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dD8uaXNLZWVwQWxpdmUoKSAmJiBvUHJldmlvdXNDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKG9QcmV2aW91c0NvbnRleHQsIGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgbGV2ZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUob0NvbnRleHQ6IENvbnRleHQsIGJLZWVwQWxpdmU6IGJvb2xlYW4sIGZuQmVmb3JlRGVzdHJveT86IEZ1bmN0aW9uLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbikge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbDogT0RhdGFNb2RlbCwgcGF0aDogc3RyaW5nLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbiwgcGFyYW1ldGVycz86IGFueSk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIGNvbnRleHQgdGhhdCBpcyByZWFsbHkga2VwdCBhbGl2ZSAocGFydCBvZiBhIGNvbGxlY3Rpb24pXG5cdFx0Ly8gaS5lLiByZW1vdmUgYWxsIHNlZ21lbnRzIG5vdCBlbmRpbmcgd2l0aCBhICcpJ1xuXHRcdGNvbnN0IGtlcHRBbGl2ZVNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgYWRkaXRpb25uYWxTZWdtZW50czogc3RyaW5nW10gPSBbXTtcblx0XHR3aGlsZSAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoICYmICFrZXB0QWxpdmVTZWdtZW50c1trZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggLSAxXS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucHVzaChrZXB0QWxpdmVTZWdtZW50cy5wb3AoKSEpO1xuXHRcdH1cblxuXHRcdGlmIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2VwdEFsaXZlUGF0aCA9IGtlcHRBbGl2ZVNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdGNvbnN0IG9LZWVwQWxpdmVDb250ZXh0ID0gb01vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoa2VwdEFsaXZlUGF0aCwgYlJlcXVlc3RNZXNzYWdlcywgcGFyYW1ldGVycyk7XG5cblx0XHRpZiAoYWRkaXRpb25uYWxTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBvS2VlcEFsaXZlQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5yZXZlcnNlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbm5hbFBhdGggPSBhZGRpdGlvbm5hbFNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0cmV0dXJuIG9Nb2RlbC5iaW5kQ29udGV4dChhZGRpdGlvbm5hbFBhdGgsIG9LZWVwQWxpdmVDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGwtc2NyZWVuIG1vZGUgd2hlbiBGQ0wgaXMgdXNlZC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBzTGF5b3V0OiBzTmV4dExheW91dCB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKSB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7RUE4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBLElBU01BLGVBQWUsV0FEcEJDLGNBQWMsQ0FBQyxrREFBa0QsQ0FBQyxVQVlqRUMsY0FBYyxFQUFFLFVBT2hCQSxjQUFjLEVBQUUsVUFvQ2hCQyxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxVQUtuQ0gsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsVUFLbkNILGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBUW5DSCxlQUFlLEVBQUUsV0FDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQXNCbkNILGVBQWUsRUFBRSxXQXlCakJBLGVBQWUsRUFBRSxXQWFqQkEsZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUs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
981
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJfcmVzb2x2ZVNlbWFudGljUGF0aCIsInNUZWNobmljYWxQYXRoIiwiX2JpbmRQYWdlVG9QYXRoIiwib1Jlc291cmNlQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsIl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoIiwic1NlbWFudGljUGF0aCIsImFTZW1hbnRpY0tleXMiLCJvTWV0YU1vZGVsIiwiZm5VbnF1b3RlQW5kRGVjb2RlIiwibGFzdEluZGV4T2YiLCJsZW5ndGgiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzdWJzdHJpbmciLCJhS2V5VmFsdWVzIiwic3BsaXQiLCJhRmlsdGVycyIsImJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJzS2V5VmFsdWUiLCJGaWx0ZXIiLCIkUHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJiRmFpbGVkIiwibWFwIiwib1NlbWFudGljS2V5Iiwib0RyYWZ0RmlsdGVyIiwiZmlsdGVycyIsImFuZCIsInB1c2giLCJfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsIm9GaWx0ZXIiLCJzdGFydHNXaXRoIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJyZXF1ZXN0Q29udGV4dHMiLCJvQ29udGV4dHMiLCJfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyIsInNQYXRoIiwiYU1hdGNoZXMiLCJleGVjIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJzUGF0aFRvUmVzb2x2ZSIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50SGFzaE5vUGFyYW1zIiwiZ2V0SGFzaENoYW5nZXIiLCJzUm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJzZW1hbnRpY1BhdGgiLCJ0ZWNobmljYWxQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9DdXJyZW50Q29udGV4dCIsInNDdXJyZW50UGF0aCIsIm9Vc2VDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1ldGFNb2RlbCIsInJlZnJlc2giLCJpc0Nvbm5lY3RlZCIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsIl9jcmVhdGVDb250ZXh0IiwiQXBwU3RhdGVDaGFuZ2VkIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJsaXN0QmluZGluZyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCIkJHVwZGF0ZUdyb3VwSWQiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic01lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvUHJldmlvdXNCaW5kaW5nIiwiZGVzdHJveSIsIm9IaWRkZW5CaW5kaW5nIiwiYmluZENvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJpc0xvY2tlZCIsInVubG9jayIsIm1lc3NhZ2VIYW5kbGVyIiwibVBhcmFtcyIsInN0YXR1cyIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJzaG93TWVzc2FnZXMiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1Jvb3RDb250ZXh0UGF0aCIsImFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocyIsImFQcm9wZXJ0eVBhdGhzIiwib1NpZGVFZmZlY3RzIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwiZ2V0QmluZGluZ1BhdGhzIiwib0JpbmRpbmciLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwiZ2V0Q29udGV4dCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4Iiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwiYWRkaXRpb25uYWxTZWdtZW50cyIsInBvcCIsImtlcHRBbGl2ZVBhdGgiLCJqb2luIiwib0tlZXBBbGl2ZUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwic0xheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBpc0Nvbm5lY3RlZCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyUHJveHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvUm91dGVyUHJveHlcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1xuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0cHJpdmF0ZSBfb1JvdXRpbmdTZXJ2aWNlITogUm91dGluZ1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBfb1RhcmdldEluZm9ybWF0aW9uOiBhbnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCkge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHR0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kID0gdGhpcy5fb25Sb3V0ZU1hdGNoZWQuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1RhcmdldChvQ29udGV4dDogYW55LCBzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZywgYlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9XG5cdFx0dGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigoYXN5bmNDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChhc3luY0NvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IG1QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogbVBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IG1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoIW1QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0b0NvbnRleHRJbmZvLnNvdXJjZUJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRvQ29udGV4dEluZm8uYmluZGluZ0NvbnRleHQgPSBvQ29udGV4dDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5vRXZlbnQpIHtcblx0XHRcdFx0b0NvbnRleHRJbmZvLm9FdmVudCA9IG1QYXJhbWV0ZXJzLm9FdmVudDtcblx0XHRcdH1cblx0XHRcdC8vIFN0b3JpbmcgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXNlIGl0IGluIGludGVybmFsIHJvdXRlIG5hdmlnYXRpb24gaWYgbmVjY2Vzc2FyeS5cblx0XHRcdGNvbnN0IGJPdmVycmlkZU5hdiA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKG9Db250ZXh0SW5mbyk7XG5cdFx0XHRpZiAoYk92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIGZyb21cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluZGV4T2YoXCIoLi4uKVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9NZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGlmIChcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWNyZWF0ZVwiKSA+IC0xIHx8XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1hdXRvQ3JlYXRlXCIpID4gLTFcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0XHRyZXR1cm4gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5RXJyb3JQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdGUgaXMgaW1wYWN0ZWQgYnkgdGhlIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHRfaXNWaWV3UGFydE9mUm91dGUocm91dGVJbmZvcm1hdGlvbjogYW55KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYVRhcmdldHMgPSByb3V0ZUluZm9ybWF0aW9uPy50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgYVRhcmdldHMuaW5kZXhPZih0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkgPT09IC0xKSB7XG5cdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaGFzIGEgdmlldyBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHJvdXRlIGxldmVsLCBpdCBtZWFucyB0aGlzIHZpZXcgY29tZXMgXCJhZnRlclwiIHRoZSByb3V0ZVxuXHRcdFx0Ly8gaW4gdGVybXMgb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQsIHRvIGF2b2lkIHRoaXMgdmlldyB0byBoYXZlIGRhdGEgaWYgd2UgbmF2aWdhdGUgdG8gaXQgbGF0ZXIgb25cblx0XHRcdGlmICgodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSkge1xuXHRcdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTsgLy8gVGhpcyBhbHNvIGNhbGwgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfYnVpbGRCaW5kaW5nUGF0aChyb3V0ZUFyZ3VtZW50czogYW55LCBiaW5kaW5nUGF0dGVybjogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KTogeyBwYXRoOiBzdHJpbmc7IGRlZmVycmVkOiBib29sZWFuIH0ge1xuXHRcdGxldCBwYXRoID0gYmluZGluZ1BhdHRlcm4ucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdGxldCBkZWZlcnJlZCA9IGZhbHNlO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIHJvdXRlQXJndW1lbnRzKSB7XG5cdFx0XHRjb25zdCBzVmFsdWUgPSByb3V0ZUFyZ3VtZW50c1tzS2V5XTtcblx0XHRcdGlmIChzVmFsdWUgPT09IFwiLi4uXCIgJiYgYmluZGluZ1BhdHRlcm4uaW5kZXhPZihgeyR7c0tleX19YCkgPj0gMCkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKHJvdXRlQXJndW1lbnRzW1wiP3F1ZXJ5XCJdICYmIHJvdXRlQXJndW1lbnRzW1wiP3F1ZXJ5XCJdLmhhc093blByb3BlcnR5KFwiaS1hY3Rpb25cIikpIHtcblx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIHRoZSBiaW5kaW5nIHBhdGggaXMgYWx3YXlzIGFic29sdXRlXG5cdFx0aWYgKHBhdGggJiYgcGF0aFswXSAhPT0gXCIvXCIpIHtcblx0XHRcdHBhdGggPSBgLyR7cGF0aH1gO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IHBhdGgsIGRlZmVycmVkIH07XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRvIGJpbmQgdGhlIHBhZ2Ugd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWRcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBCdWlsZHMgdGhlIGJpbmRpbmcgY29udGV4dCBmcm9tIHRoZSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMsIGFuZCBiaW5kIHRoZSBwYWdlIGFjY29yZGluZ2x5LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKG9FdmVudDogRXZlbnQpIHtcblx0XHQvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaXMgcGFydCBvZiB0aGUgZXZlbnQgdGFyZ2V0cyAoaS5lLiBpcyBhIHRhcmdldCBmb3IgdGhlIGN1cnJlbnQgcm91dGUpLlxuXHRcdC8vIElmIG5vdCwgd2UgZG9uJ3QgbmVlZCB0byBiaW5kIGl0IC0tPiByZXR1cm5cblx0XHRpZiAoIXRoaXMuX2lzVmlld1BhcnRPZlJvdXRlKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZUluZm9ybWF0aW9uXCIpKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHJpZXZlIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGxldCBiaW5kaW5nUGF0dGVybjtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKSB7XG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybigpO1xuXHRcdH1cblx0XHRiaW5kaW5nUGF0dGVybiA9IGJpbmRpbmdQYXR0ZXJuIHx8IHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5jb250ZXh0UGF0dGVybjtcblxuXHRcdGlmIChiaW5kaW5nUGF0dGVybiA9PT0gbnVsbCB8fCBiaW5kaW5nUGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBEb24ndCBkbyB0aGlzIGlmIHdlIGFscmVhZHkgZ290IHNUYXJnZXQgPT0gJycsIHdoaWNoIGlzIGEgdmFsaWQgdGFyZ2V0IHBhdHRlcm5cblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlUGF0dGVyblwiKTtcblx0XHR9XG5cblx0XHQvLyBSZXBsYWNlIHRoZSBwYXJhbWV0ZXJzIGJ5IHRoZWlyIHZhbHVlcyBpbiB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRjb25zdCBtQXJndW1lbnRzID0gKG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkgYXMgYW55KS5hcmd1bWVudHM7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25QYXJhbWV0ZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcIm5hdmlnYXRpb25JbmZvXCIpO1xuXHRcdGNvbnN0IHsgcGF0aCwgZGVmZXJyZWQgfSA9IHRoaXMuX2J1aWxkQmluZGluZ1BhdGgobUFyZ3VtZW50cywgYmluZGluZ1BhdHRlcm4sIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cblx0XHR0aGlzLm9uUm91dGVNYXRjaGVkKCk7XG5cblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0bGV0IG9PdXQ7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZERlZmVycmVkKHBhdGgsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kUGFnZShwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdG9PdXQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHR9KTtcblxuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkudXBkYXRlVUlTdGF0ZUZvclZpZXcodGhpcy5fb1ZpZXcsIHRoaXMuX2dldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmREZWZlcnJlZChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwsIHsgZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQgfHwgIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5vQXN5bmNDb250ZXh0KSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0c1RhcmdldFBhdGgsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChjdXJyZW50QmluZGluZ0NvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdC8vIEZvciBub3cgcmVtb3ZlIHRoZSBwZW5kaW5nIGNoYW5nZXMgdG8gYXZvaWQgdGhlIG1vZGVsIHJhaXNlcyBlcnJvcnMgYW5kIHRoZSBvYmplY3QgcGFnZSBpcyBhdCBsZWFzdCBib3VuZFxuXHRcdFx0Ly8gSWRlYWxseSB0aGUgdXNlciBzaG91bGQgYmUgYXNrZWQgZm9yXG5cdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBoYXMgYmVlbiBzZXQgb24gdGhlIHBhZ2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2Uoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IG9iamVjdCkge1xuXHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVzb2x2ZVNlbWFudGljUGF0aChzVGFyZ2V0UGF0aCwgb01vZGVsKVxuXHRcdFx0XHQudGhlbigoc1RlY2huaWNhbFBhdGg6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9QYXRoKHNUZWNobmljYWxQYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBFcnJvciBoYW5kbGluZyBmb3IgZXJyb25lb3VzIG1ldGFkYXRhIHJlcXVlc3Rcblx0XHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uob1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvRXJyb3IubWVzc2FnZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZmlsdGVyIHRvIHJldHJpZXZlIGEgY29udGV4dCBjb3JyZXNwb25kaW5nIHRvIGEgc2VtYW50aWMgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNTZW1hbnRpY1BhdGggVGhlIHNlbWFudGljIHBhdGhcblx0ICogQHBhcmFtIGFTZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBpbnN0YW5jZSBvZiB0aGUgbWV0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBhU2VtYW50aWNLZXlzOiBhbnlbXSwgb01ldGFNb2RlbDogb2JqZWN0KSB7XG5cdFx0Y29uc3QgZm5VbnF1b3RlQW5kRGVjb2RlID0gZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRpZiAoc1ZhbHVlLmluZGV4T2YoXCInXCIpID09PSAwICYmIHNWYWx1ZS5sYXN0SW5kZXhPZihcIidcIikgPT09IHNWYWx1ZS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgcXVvdGVzIGZyb20gdGhlIHZhbHVlIGFuZCBkZWNvZGUgc3BlY2lhbCBjaGFyc1xuXHRcdFx0XHRzVmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoc1ZhbHVlLnN1YnN0cmluZygxLCBzVmFsdWUubGVuZ3RoIC0gMSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNWYWx1ZTtcblx0XHR9O1xuXHRcdGNvbnN0IGFLZXlWYWx1ZXMgPSBzU2VtYW50aWNQYXRoLnN1YnN0cmluZyhzU2VtYW50aWNQYXRoLmluZGV4T2YoXCIoXCIpICsgMSwgc1NlbWFudGljUGF0aC5sZW5ndGggLSAxKS5zcGxpdChcIixcIik7XG5cdFx0bGV0IGFGaWx0ZXJzOiBGaWx0ZXJbXTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCAhPSBhS2V5VmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUob01ldGFNb2RlbCk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdC8vIFRha2UgdGhlIGZpcnN0IGtleSB2YWx1ZVxuXHRcdFx0Y29uc3Qgc0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFLZXlWYWx1ZXNbMF0pO1xuXHRcdFx0YUZpbHRlcnMgPSBbXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY0tleXNbMF0uJFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0dmFsdWUxOiBzS2V5VmFsdWUsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0fSlcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1LZXlWYWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBrZXkgdmFsdWVzXG5cdFx0XHRhS2V5VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXlBc3NpZ25tZW50OiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gc0tleUFzc2lnbm1lbnQuc3BsaXQoXCI9XCIpLFxuXHRcdFx0XHRcdHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhUGFydHNbMV0pO1xuXG5cdFx0XHRcdG1LZXlWYWx1ZXNbYVBhcnRzWzBdXSA9IHNLZXlWYWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgYkZhaWxlZCA9IGZhbHNlO1xuXHRcdFx0YUZpbHRlcnMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob1NlbWFudGljS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc0tleSA9IG9TZW1hbnRpY0tleS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHNWYWx1ZSA9IG1LZXlWYWx1ZXNbc0tleV07XG5cblx0XHRcdFx0aWYgKHNWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogc0tleSxcblx0XHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHRcdHZhbHVlMTogc1ZhbHVlLFxuXHRcdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRiRmFpbGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIlhYXCJcblx0XHRcdFx0XHR9KTsgLy8gd2lsbCBiZSBpZ25vcmUgYW55d2F5IHNpbmNlIHdlIHJldHVybiBhZnRlclxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGJGYWlsZWQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGEgZHJhZnQgZmlsdGVyIHRvIG1ha2Ugc3VyZSB3ZSB0YWtlIHRoZSBkcmFmdCBlbnRpdHkgaWYgdGhlcmUgaXMgb25lXG5cdFx0Ly8gT3IgdGhlIGFjdGl2ZSBlbnRpdHkgb3RoZXJ3aXNlXG5cdFx0Y29uc3Qgb0RyYWZ0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBbbmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgZmFsc2UpLCBuZXcgRmlsdGVyKFwiU2libGluZ0VudGl0eS9Jc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIG51bGwpXSxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0XHRhRmlsdGVycy5wdXNoKG9EcmFmdEZpbHRlcik7XG5cblx0XHRyZXR1cm4gbmV3IEZpbHRlcihhRmlsdGVycywgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyB0byBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHNTZW1hbnRpY1BhdGggVGhlIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIG1vZGVsIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0gYVNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHJldHVybnMgQSBQcm9taXNlIGNvbnRhaW5pbmcgdGhlIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cyBpZiBzU2VtYW50aWNQYXRoIGNvdWxkIGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgbnVsbCBvdGhlcndpc2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBvTW9kZWw6IGFueSwgYVNlbWFudGljS2V5czogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoc1NlbWFudGljUGF0aCkuZ2V0UGF0aCgpO1xuXG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzIHx8IGFTZW1hbnRpY0tleXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHNldCBvZiBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIGtleXNcblx0XHRjb25zdCBvRmlsdGVyID0gdGhpcy5fY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoLCBhU2VtYW50aWNLZXlzLCBvTWV0YU1vZGVsKTtcblx0XHRpZiAob0ZpbHRlciA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgaW50ZXJwcmV0IHRoZSBwYXRoIGFzIGEgc2VtYW50aWMgb25lXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIExvYWQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0XG5cdFx0aWYgKCFzRW50aXR5U2V0UGF0aD8uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNFbnRpdHlTZXRQYXRoID0gYC8ke3NFbnRpdHlTZXRQYXRofWA7XG5cdFx0fVxuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9Nb2RlbC5iaW5kTGlzdChzRW50aXR5U2V0UGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9GaWx0ZXIsIHtcblx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMikudGhlbihmdW5jdGlvbiAob0NvbnRleHRzOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udGV4dHMgJiYgb0NvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vIGRhdGEgY291bGQgYmUgbG9hZGVkXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHBhdGggaXMgZWxpZ2libGUgZm9yIHNlbWFudGljIGJvb2ttYXJraW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgZWxpZ2libGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyhzUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsOiBhbnkpIHtcblx0XHQvLyBPbmx5IHBhdGggb24gcm9vdCBvYmplY3RzIGFsbG93IHNlbWFudGljIGJvb2ttYXJraW5nLCBpLmUuIHNQYXRoID0geHh4KHl5eSlcblx0XHRjb25zdCBhTWF0Y2hlcyA9IC9eWy9dPyhcXHcrKVxcKFteL10rXFwpJC8uZXhlYyhzUGF0aCk7XG5cdFx0aWYgKCFhTWF0Y2hlcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBHZXQgdGhlIGVudGl0eVNldCBuYW1lXG5cdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBgLyR7YU1hdGNoZXNbMV19YDtcblx0XHQvLyBDaGVjayB0aGUgZW50aXR5IHNldCBzdXBwb3J0cyBkcmFmdCAob3RoZXJ3aXNlIHdlIGRvbid0IHN1cHBvcnQgc2VtYW50aWMgYm9va21hcmtpbmcpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0cmV0dXJuIG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyBmcm9tIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGhUb1Jlc29sdmUgVGhlIHBhdGggdG8gYmUgdHJhbnNmb3JtZWRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgc1BhdGhUb1Jlc29sdmVkIGNvdWxkbid0IGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3Jlc29sdmVTZW1hbnRpY1BhdGgoc1BhdGhUb1Jlc29sdmU6IHN0cmluZywgb01vZGVsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0xhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICcvJ1xuXHRcdFx0c0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0bGV0IHNSb290RW50aXR5TmFtZSA9IHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cigwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHNSb290RW50aXR5TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgYkFsbG93U2VtYW50aWNCb29rbWFyayA9IHRoaXMuX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9NZXRhTW9kZWwpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IGJBbGxvd1NlbWFudGljQm9va21hcmsgJiYgU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzIGF2YWlsYWJsZSAtLT4gdXNlIHRoZSBwYXRoIGFzIGlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNQYXRoVG9SZXNvbHZlKTtcblx0XHR9IGVsc2UgaWYgKG9MYXN0U2VtYW50aWNNYXBwaW5nICYmIG9MYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCA9PT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBuZWVkIHJlc29sdmUgdGhlIHNlbWFudGljIHBhdGggdG8gZ2V0IHRoZSB0ZWNobmljYWwga2V5c1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTW9kZWwsIGFTZW1hbnRpY0tleXMpLnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNUZWNobmljYWxQYXRoICYmIHNUZWNobmljYWxQYXRoICE9PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzZW1hbnRpYyBwYXRoIHdhcyByZXNvbHZlZCAob3RoZXJ3aXNlIGtlZXAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0YXJnZXQpXG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogc1RlY2huaWNhbFBhdGgsXG5cdFx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHNQYXRoVG9SZXNvbHZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIHNUZWNobmljYWxQYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFRvUmVzb2x2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0LiBOZWVkcyB0byBjb250YWluIHRlY2huaWNhbCBrZXlzIG9ubHkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0aXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0KSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWUgLy8gTG9hZCBtZXNzYWdlcywgb3RoZXJ3aXNlIHRoZXkgZG9uJ3QgZ2V0IHJlZnJlc2hlZCBsYXRlciwgZS5nLiBmb3Igc2lkZSBlZmZlY3RzXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0Ly8gc2V0S2VlcEFsaXZlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHBhcmVudCBsaXN0YmluZGluZyBkb2Vzbid0IGhhdmUgJCRvd25SZXF1ZXN0PXRydWVcblx0XHRcdFx0Ly8gVGhpcyBjYXNlIGZvciBjdXN0b20gZnJhZ21lbnRzIGlzIHN1cHBvcnRlZCwgYnV0IGFuIGVycm9yIGlzIGxvZ2dlZCB0byBtYWtlIHRoZSBsYWNrIG9mIHN5bmNocm9uaXphdGlvbiBhcHBhcmVudFxuXHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0YFZpZXcgZm9yICR7b0NvbnRleHQuZ2V0UGF0aCgpfSB3b24ndCBiZSBzeW5jaHJvbml6ZWQuIFBhcmVudCBsaXN0QmluZGluZyBtdXN0IGhhdmUgYmluZGluZyBwYXJhbWV0ZXIgJCRvd25SZXF1ZXN0PXRydWVgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8IG9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgY29udGV4dCBvdGhlcndpc2Ugd2UgZ2V0IGVycm9yc1xuXHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIHRoZSBwcm9wZXIgYmVmb3JlL2FmdGVyIGNhbGxiYWNrc1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlNob3dQbGFjZWhvbGRlclxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcob0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jcmVhdGVDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQsXG5cdFx0XHRzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpLFxuXHRcdFx0c0NvbnRleHRQYXRoID1cblx0XHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsLCBzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGtlZXBBbGl2ZSBjb250ZXh0ICR7c1BhdGh9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdG9EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0PyBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCIsIFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl1cblx0XHRcdFx0XHRcdFx0OiBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChzRW50aXR5U2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IFwiSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9ICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIGFueSk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0b1ByZXZpb3VzQmluZGluZ1xuXHRcdFx0XHRcdD8ucmVzZXRDaGFuZ2VzKClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlc2V0aW5nIHRoZSBjaGFuZ2VzIHRvIHRoZSBiaW5kaW5nXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBhd2FpdCBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgY29yZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogYW55KSB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9ICgob0JpbmRpbmcuZ2V0Q29udGV4dCgpICYmIG9CaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpIHx8IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGFEZXBlbmRlbnRCaW5kaW5nc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHQvL2FsbCB0aGlzIGxvZ2ljIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBTaWRlRWZmZWN0cyByZXF1ZXN0IGZvciBhbiBlbXB0eSBwYXRoIChyZWZyZXNoIGV2ZXJ5dGhpbmcpLCBhZnRlciB0ZXN0aW5nIHRyYW5zaWVudCBjb250ZXh0c1xuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gb1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucmVkdWNlKCh0YXJnZXRzOiBzdHJpbmdbXSwgdGFyZ2V0UHJvcGVydHkpID0+IHtcblx0XHRcdGlmICh0YXJnZXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHRhcmdldFByb3BlcnR5LmluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHR0YXJnZXRzLnB1c2goaW5kZXggPiAwID8gdGFyZ2V0UHJvcGVydHkuc2xpY2UoMCwgaW5kZXgpIDogdGFyZ2V0UHJvcGVydHkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhcmdldHM7XG5cdFx0fSwgW10pO1xuXHRcdC8vIE9EYXRhIG1vZGVsIHdpbGwgdGFrZSBjYXJlIG9mIGR1cGxpY2F0ZXNcblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbLi4ub1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLCAuLi5vU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllc10sIG9CaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBhbnkpIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQ/LmlzS2VlcEFsaXZlKCkgJiYgb1ByZXZpb3VzQ29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShvUHJldmlvdXNDb250ZXh0LCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEZDTExldmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uRkNMTGV2ZWw7XG5cdH1cblxuXHRfc2V0S2VlcEFsaXZlKG9Db250ZXh0OiBDb250ZXh0LCBiS2VlcEFsaXZlOiBib29sZWFuLCBmbkJlZm9yZURlc3Ryb3k/OiBGdW5jdGlvbiwgYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pIHtcblx0XHRpZiAob0NvbnRleHQuZ2V0UGF0aCgpLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0Ly8gV2Uga2VlcCB0aGUgY29udGV4dCBhbGl2ZSBvbmx5IGlmIHRoZXkncmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIGkuZS4gaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgJyknXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShiS2VlcEFsaXZlLCBmbkJlZm9yZURlc3Ryb3ksICEhc01lc3NhZ2VzUGF0aCAmJiBiUmVxdWVzdE1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWw6IE9EYXRhTW9kZWwsIHBhdGg6IHN0cmluZywgYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sIHBhcmFtZXRlcnM/OiBhbnkpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c3dpdGNoRnVsbFNjcmVlbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0ID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHR0aGlzLmJhc2UuX3JvdXRpbmcubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHsgc0xheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGNsb3NlQ29sdW1uKCkge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55O1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0bm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSxcblx0XHRcdHNMYXlvdXQ6IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Nsb3NlQ29sdW1uXCIpXG5cdFx0fTtcblxuXHRcdGlmIChvVmlld0RhdGE/LnZpZXdMZXZlbCA9PT0gMSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9NZXRhTW9kZWwsIG9Db250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLl9vVmlldy5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0VBK0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQSxJQVNNQSxlQUFlLFdBRHBCQyxjQUFjLENBQUMsa0RBQWtELENBQUMsVUFvQmpFQyxjQUFjLEVBQUUsVUFPaEJBLGNBQWMsRUFBRSxVQW9DaEJDLGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBS25DSCxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxVQUtuQ0gsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FRbkNILGVBQWUsRUFBRSxXQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBc0JuQ0gsZUFBZSxFQUFFLFdBeUJqQkEsZUFBZSxFQUFFLFdB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