@sapui5/sap.fe.core 1.102.2 → 1.104.1

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 (324) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +73 -30
  4. package/src/sap/fe/core/AppComponent.ts +65 -43
  5. package/src/sap/fe/core/AppStateHandler.js +82 -70
  6. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +227 -126
  10. package/src/sap/fe/core/CommonUtils.ts +240 -163
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +181 -43
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +101 -74
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +9 -9
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +170 -139
  52. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +11 -10
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  61. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  64. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  65. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
  66. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
  67. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
  68. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
  77. package/src/sap/fe/core/controls/Any.js +9 -5
  78. package/src/sap/fe/core/controls/Any.ts +10 -4
  79. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  80. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  81. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  87. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  88. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  89. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  91. package/src/sap/fe/core/controls/FileWrapper.js +7 -2
  92. package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
  93. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  94. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  97. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  98. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  100. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  101. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  102. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  103. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  104. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  105. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  106. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  107. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  108. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  110. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  111. package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
  112. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  113. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
  114. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  115. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  116. package/src/sap/fe/core/converters/MetaModelConverter.js +64 -35
  117. package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
  118. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  119. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  120. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  121. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  122. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
  127. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  128. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +30 -28
  130. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
  131. package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
  132. package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
  133. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  134. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  135. package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
  136. package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  138. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  140. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  142. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  143. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  144. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  146. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +77 -73
  148. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
  149. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  150. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  151. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  152. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  153. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  154. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  155. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  156. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  157. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  158. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  159. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  161. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  162. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  163. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  164. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  165. package/src/sap/fe/core/converters/templates/ListReportConverter.js +55 -42
  166. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
  167. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  168. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  169. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  170. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  171. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  172. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  173. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  174. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  175. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  176. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  177. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  178. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  179. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  180. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  181. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  182. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  183. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  184. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  185. package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
  186. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
  187. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  188. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  189. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  190. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  191. package/src/sap/fe/core/helpers/EditState.js +1 -6
  192. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  193. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  194. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  195. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  197. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  198. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  199. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  200. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  201. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  202. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  203. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  204. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  205. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  206. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  207. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  208. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  209. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  210. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  211. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  212. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  213. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  214. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  215. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  216. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  217. package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
  218. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
  219. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  220. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  221. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  222. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  223. package/src/sap/fe/core/library.js +42 -3
  224. package/src/sap/fe/core/library.ts +38 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  227. package/src/sap/fe/core/messagebundle.properties +39 -63
  228. package/src/sap/fe/core/messagebundle_ar.properties +25 -39
  229. package/src/sap/fe/core/messagebundle_bg.properties +25 -39
  230. package/src/sap/fe/core/messagebundle_ca.properties +25 -39
  231. package/src/sap/fe/core/messagebundle_cs.properties +25 -39
  232. package/src/sap/fe/core/messagebundle_cy.properties +25 -39
  233. package/src/sap/fe/core/messagebundle_da.properties +25 -39
  234. package/src/sap/fe/core/messagebundle_de.properties +25 -39
  235. package/src/sap/fe/core/messagebundle_el.properties +26 -40
  236. package/src/sap/fe/core/messagebundle_en.properties +25 -39
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
  241. package/src/sap/fe/core/messagebundle_es.properties +27 -41
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
  243. package/src/sap/fe/core/messagebundle_et.properties +25 -39
  244. package/src/sap/fe/core/messagebundle_fi.properties +25 -39
  245. package/src/sap/fe/core/messagebundle_fr.properties +26 -40
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
  247. package/src/sap/fe/core/messagebundle_hi.properties +25 -39
  248. package/src/sap/fe/core/messagebundle_hr.properties +25 -39
  249. package/src/sap/fe/core/messagebundle_hu.properties +25 -39
  250. package/src/sap/fe/core/messagebundle_id.properties +25 -39
  251. package/src/sap/fe/core/messagebundle_it.properties +41 -55
  252. package/src/sap/fe/core/messagebundle_iw.properties +25 -39
  253. package/src/sap/fe/core/messagebundle_ja.properties +25 -39
  254. package/src/sap/fe/core/messagebundle_kk.properties +25 -39
  255. package/src/sap/fe/core/messagebundle_ko.properties +30 -44
  256. package/src/sap/fe/core/messagebundle_lt.properties +25 -39
  257. package/src/sap/fe/core/messagebundle_lv.properties +25 -39
  258. package/src/sap/fe/core/messagebundle_ms.properties +25 -39
  259. package/src/sap/fe/core/messagebundle_nl.properties +27 -41
  260. package/src/sap/fe/core/messagebundle_no.properties +25 -39
  261. package/src/sap/fe/core/messagebundle_pl.properties +26 -40
  262. package/src/sap/fe/core/messagebundle_pt.properties +26 -40
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
  264. package/src/sap/fe/core/messagebundle_ro.properties +25 -39
  265. package/src/sap/fe/core/messagebundle_ru.properties +25 -39
  266. package/src/sap/fe/core/messagebundle_sh.properties +25 -39
  267. package/src/sap/fe/core/messagebundle_sk.properties +25 -39
  268. package/src/sap/fe/core/messagebundle_sl.properties +25 -39
  269. package/src/sap/fe/core/messagebundle_sv.properties +25 -39
  270. package/src/sap/fe/core/messagebundle_th.properties +25 -39
  271. package/src/sap/fe/core/messagebundle_tr.properties +25 -39
  272. package/src/sap/fe/core/messagebundle_uk.properties +25 -39
  273. package/src/sap/fe/core/messagebundle_vi.properties +25 -39
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +97 -69
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +224 -198
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
  294. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  295. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  296. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  297. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  298. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  299. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  300. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  301. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  302. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  303. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  304. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  305. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  307. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  308. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  309. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  310. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  311. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  312. package/src/sap/fe/core/templating/FilterHelper.js +16 -15
  313. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  314. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  315. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  316. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  317. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  318. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  319. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  320. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  321. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -51,7 +51,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
51
51
  var _proto = InternalRouting.prototype;
52
52
 
53
53
  _proto.onExit = function onExit() {
54
- this._oRoutingService && this._oRoutingService.detachRouteMatched(this._fnRouteMatchedBound);
54
+ if (this._oRoutingService) {
55
+ this._oRoutingService.detachRouteMatched(this._fnRouteMatchedBound);
56
+ }
55
57
  };
56
58
 
57
59
  _proto.onInit = function onInit() {
@@ -123,10 +125,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
123
125
  /**
124
126
  * Navigates to the specified navigation target.
125
127
  *
126
- * @param {sap.ui.model.odata.v4.Context} oContext Context instance
127
- * @param {string} sNavigationTargetName Navigation target name
128
- * @param {object} oSemanticObject Semantic object
129
- * @param {boolean} bPreserveHistory True to force the new URL to be added at the end of the browser history (no replace)
128
+ * @param oContext Context instance
129
+ * @param sNavigationTargetName Navigation target name
130
+ * @param oSemanticObject Semantic object
131
+ * @param bPreserveHistory True to force the new URL to be added at the end of the browser history (no replace)
130
132
  * @ui5-restricted
131
133
  */
132
134
  ;
@@ -149,9 +151,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
149
151
  /**
150
152
  * Navigates to the specified navigation target route.
151
153
  *
152
- * @param {string} sTargetRouteName Name of the target route
153
- * @param {object} [oParameters] Parameters to be used with route to create the target hash
154
- * @returns {Promise} Promise that is resolved when the navigation is finalized
154
+ * @param sTargetRouteName Name of the target route
155
+ * @param [oParameters] Parameters to be used with route to create the target hash
156
+ * @returns Promise that is resolved when the navigation is finalized
155
157
  * @ui5-restricted
156
158
  */
157
159
  ;
@@ -162,9 +164,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
162
164
  /**
163
165
  * Navigates to a specific context.
164
166
  *
165
- * @param {sap.ui.model.odata.v4.Context} oContext The context to be navigated to
166
- * @param {object} [mParameters] Optional navigation parameters
167
- * @returns {Promise} Promise resolved when the navigation has been triggered
167
+ * @param oContext The context to be navigated to
168
+ * @param [mParameters] Optional navigation parameters
169
+ * @returns Promise resolved when the navigation has been triggered
168
170
  * @ui5-restricted
169
171
  */
170
172
  ;
@@ -182,9 +184,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
182
184
  // the subsequent call to navigateToContext conflicts with the current one
183
185
  this._oRouterProxy.activateRouteMatchSynchronization();
184
186
 
185
- mParameters.asyncContext.then(function (oContext) {
187
+ mParameters.asyncContext.then(function (asyncContext) {
186
188
  // once the context is returned we navigate into it
187
- _this2.navigateToContext(oContext, {
189
+ _this2.navigateToContext(asyncContext, {
188
190
  checkNoHashChange: mParameters.checkNoHashChange,
189
191
  editable: mParameters.editable,
190
192
  bPersistOPScroll: mParameters.bPersistOPScroll,
@@ -227,9 +229,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
227
229
  /**
228
230
  * Navigates backwards from a context.
229
231
  *
230
- * @param {sap.ui.model.odata.v4.Context} oContext Context to be navigated from
231
- * @param {object} [mParameters] Optional navigation parameters
232
- * @returns {Promise} Promise resolved when the navigation has been triggered
232
+ * @param oContext Context to be navigated from
233
+ * @param [mParameters] Optional navigation parameters
234
+ * @returns Promise resolved when the navigation has been triggered
233
235
  * @ui5-restricted
234
236
  */
235
237
  ;
@@ -242,9 +244,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
242
244
  /**
243
245
  * Navigates forwards to a context.
244
246
  *
245
- * @param {sap.ui.model.odata.v4.Context} oContext Context to be navigated to
246
- * @param {object} mParameters Optional navigation parameters
247
- * @returns {Promise} Promise resolved when the navigation has been triggered
247
+ * @param oContext Context to be navigated to
248
+ * @param mParameters Optional navigation parameters
249
+ * @returns Promise resolved when the navigation has been triggered
248
250
  * @ui5-restricted
249
251
  */
250
252
  ;
@@ -287,8 +289,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
287
289
  /**
288
290
  * Checks if one of the current views on the screen is bound to a given context.
289
291
  *
290
- * @param {sap.ui.model.odata.v4.Context} oContext
291
- * @returns {boolean}
292
+ * @param oContext
293
+ * @returns `true` if the state is impacted by the context
292
294
  * @ui5-restricted
293
295
  */
294
296
  ;
@@ -358,7 +360,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
358
360
  * Called when a route is matched.
359
361
  * Builds the binding context from the navigation parameters, and bind the page accordingly.
360
362
  *
361
- * @param {object} oEvent
363
+ * @param oEvent
362
364
  * @ui5-restricted
363
365
  */
364
366
  ;
@@ -416,9 +418,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
416
418
  /**
417
419
  * Deferred binding (during object creation).
418
420
  *
419
- * @param {string} sTargetPath The path to the deffered context
420
- * @param {object} oNavigationParameters Navigation parameters
421
- * @returns {Promise}
421
+ * @param sTargetPath The path to the deffered context
422
+ * @param oNavigationParameters Navigation parameters
423
+ * @returns A Promise
422
424
  * @ui5-restricted
423
425
  */
424
426
  ;
@@ -455,10 +457,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
455
457
  /**
456
458
  * Sets the binding context of the page from a path.
457
459
  *
458
- * @param {string} sTargetPath The path to the context
459
- * @param {sap.ui.model.odata.v4.ODataModel} oModel The OData model
460
- * @param {object} oNavigationParameters Navigation parameters
461
- * @returns {Promise}
460
+ * @param sTargetPath The path to the context
461
+ * @param oModel The OData model
462
+ * @param oNavigationParameters Navigation parameters
463
+ * @returns A Promise resolved once the binding has been set on the page
462
464
  * @ui5-restricted
463
465
  */
464
466
  ;
@@ -485,10 +487,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
485
487
  /**
486
488
  * Creates the filter to retrieve a context corresponding to a semantic path.
487
489
  *
488
- * @param {string} sSemanticPath The semantic path
489
- * @param {Array} aSemanticKeys The semantic keys for the path
490
- * @param {object} oMetaModel The instance of the meta model
491
- * @returns {sap.ui.model.Filter} The filter
490
+ * @param sSemanticPath The semantic path
491
+ * @param aSemanticKeys The semantic keys for the path
492
+ * @param oMetaModel The instance of the meta model
493
+ * @returns The filter
492
494
  * @ui5-restricted
493
495
  */
494
496
  ;
@@ -561,16 +563,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
561
563
  and: false
562
564
  });
563
565
  aFilters.push(oDraftFilter);
564
- var oCombinedFilter = new Filter(aFilters, true);
565
- return oCombinedFilter;
566
+ return new Filter(aFilters, true);
566
567
  }
567
568
  /**
568
569
  * Converts a path with semantic keys to a path with technical keys.
569
570
  *
570
- * @param {string} sSemanticPath The path with semantic keys
571
- * @param {sap.ui.model.odata.v4.ODataModel} oModel The model for the path
572
- * @param {Array} aSemanticKeys The semantic keys for the path
573
- * @returns {Promise} A Promise containing the path with technical keys if sSemanticPath could be interpreted as a semantic path, null otherwise
571
+ * @param sSemanticPath The path with semantic keys
572
+ * @param oModel The model for the path
573
+ * @param aSemanticKeys The semantic keys for the path
574
+ * @returns A Promise containing the path with technical keys if sSemanticPath could be interpreted as a semantic path, null otherwise
574
575
  * @ui5-restricted
575
576
  */
576
577
  ;
@@ -596,7 +597,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
596
597
 
597
598
 
598
599
  if (!((_sEntitySetPath = sEntitySetPath) !== null && _sEntitySetPath !== void 0 && _sEntitySetPath.startsWith("/"))) {
599
- sEntitySetPath = "/" + sEntitySetPath;
600
+ sEntitySetPath = "/".concat(sEntitySetPath);
600
601
  }
601
602
 
602
603
  var oListBinding = oModel.bindList(sEntitySetPath, undefined, undefined, oFilter, {
@@ -614,9 +615,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
614
615
  /**
615
616
  * Checks if a path is eligible for semantic bookmarking.
616
617
  *
617
- * @param {string} sPath The path to test
618
- * @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel The associated metadata model
619
- * @returns {boolean} `true` if the path is eligible
618
+ * @param sPath The path to test
619
+ * @param oMetaModel The associated metadata model
620
+ * @returns `true` if the path is eligible
620
621
  * @ui5-restricted
621
622
  */
622
623
  ;
@@ -630,18 +631,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
630
631
  } // Get the entitySet name
631
632
 
632
633
 
633
- var sEntitySetPath = "/" + aMatches[1]; // Check the entity set supports draft (otherwise we don't support semantic bookmarking)
634
+ var sEntitySetPath = "/".concat(aMatches[1]); // Check the entity set supports draft (otherwise we don't support semantic bookmarking)
634
635
 
635
- var oDraftRoot = oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot");
636
- var oDraftNode = oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftNode");
636
+ var oDraftRoot = oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot"));
637
+ var oDraftNode = oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftNode"));
637
638
  return oDraftRoot || oDraftNode ? true : false;
638
639
  }
639
640
  /**
640
641
  * Builds a path with semantic keys from a path with technical keys.
641
642
  *
642
- * @param {string} sPathToResolve The path to be transformed
643
+ * @param sPathToResolve The path to be transformed
643
644
  * @param oModel The OData model
644
- * @returns {Promise} String promise for the new path. If sPathToResolved couldn't be interpreted as a semantic path, it is returned as is.
645
+ * @returns String promise for the new path. If sPathToResolved couldn't be interpreted as a semantic path, it is returned as is.
645
646
  * @ui5-restricted
646
647
  */
647
648
  ;
@@ -695,9 +696,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
695
696
  /**
696
697
  * Sets the binding context of the page from a path.
697
698
  *
698
- * @param {string} sTargetPath The path to build the context. Needs to contain technical keys only.
699
- * @param {sap.ui.model.odata.v4.ODataModel} oModel The OData model
700
- * @param {object} oNavigationParameters Navigation parameters
699
+ * @param sTargetPath The path to build the context. Needs to contain technical keys only.
700
+ * @param oModel The OData model
701
+ * @param oNavigationParameters Navigation parameters
701
702
  * @ui5-restricted
702
703
  */
703
704
  ;
@@ -730,9 +731,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
730
731
  /**
731
732
  * Binds the page to a context.
732
733
  *
733
- * @param {sap.ui.model.odata.v4.Context} oContext Context to be bound
734
- * @param {sap.ui.model.odata.v4.ODataModel} oModel The OData model
735
- * @param {object} oNavigationParameters Navigation parameters
734
+ * @param oContext Context to be bound
735
+ * @param oModel The OData model
736
+ * @param oNavigationParameters Navigation parameters
736
737
  * @ui5-restricted
737
738
  */
738
739
  ;
@@ -754,12 +755,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
754
755
  oContext = this._createContext(oContext.getPath(), oModel);
755
756
  }
756
757
 
757
- oContext.setKeepAlive(true, function () {
758
- // it is possible that the context is no longer kept alive
759
- if (oContext.isKeepAlive() && oRootViewController.isContextUsedInPages(oContext)) {
760
- _this6.navigateBackFromContext(oContext);
761
- }
762
- }, true);
758
+ try {
759
+ oContext.setKeepAlive(true, function () {
760
+ // it is possible that the context is no longer kept alive
761
+ if (oContext.isKeepAlive() && oRootViewController.isContextUsedInPages(oContext)) {
762
+ _this6.navigateBackFromContext(oContext);
763
+ }
764
+ }, true // Load messages, otherwise they don't get refreshed later, e.g. for side effects
765
+ );
766
+ } catch (oError) {
767
+ // setKeepAlive throws an exception if the parent listbinding doesn't have $$ownRequest=true
768
+ // This case for custom fragments is supported, but an error is logged to make the lack of synchronization apparent
769
+ Log.error("View for ".concat(oContext.getPath(), " won't be synchronized. Parent listBinding must have binding parameter $$ownRequest=true"));
770
+ }
763
771
  } else if (!oParentListBinding || oParentListBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
764
772
  // We need to recreate the context otherwise we get errors
765
773
  oContext = this._createContext(oContext.getPath(), oModel, oNavigationParameters.bNavigateToSiblingEntity);
@@ -782,10 +790,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
782
790
  /**
783
791
  * Creates a context from a path.
784
792
  *
785
- * @param {string} sPath The path
786
- * @param {sap.ui.model.odata.v4.ODataModel} oModel The OData model
787
- * @param {boolean} navigateToSiblingEntity A parameter that determines whether to navigate to the context on data received
788
- * @returns {sap.ui.model.odata.v4.Context} The created context
793
+ * @param sPath The path
794
+ * @param oModel The OData model
795
+ * @param navigateToSiblingEntity A parameter that determines whether to navigate to the context on data received
796
+ * @returns The created context
789
797
  * @ui5-restricted
790
798
  */
791
799
  ;
@@ -796,7 +804,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
796
804
  var navigateToSiblingEntity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
797
805
  var oPageComponent = this._oPageComponent,
798
806
  sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet(),
799
- sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/" + sEntitySet,
807
+ sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/".concat(sEntitySet),
800
808
  oMetaModel = oModel.getMetaModel(),
801
809
  mParameters = {
802
810
  $$groupId: "$auto.Heroes",
@@ -804,8 +812,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
804
812
  $$patchWithoutSideEffects: true
805
813
  }; // In case of draft: $select the state flags (HasActiveEntity, HasDraftEntity, and IsActiveEntity)
806
814
 
807
- var oDraftRoot = oMetaModel.getObject(sContextPath + "@com.sap.vocabularies.Common.v1.DraftRoot");
808
- var oDraftNode = oMetaModel.getObject(sContextPath + "@com.sap.vocabularies.Common.v1.DraftNode");
815
+ var oDraftRoot = oMetaModel.getObject("".concat(sContextPath, "@com.sap.vocabularies.Common.v1.DraftRoot"));
816
+ var oDraftNode = oMetaModel.getObject("".concat(sContextPath, "@com.sap.vocabularies.Common.v1.DraftNode"));
809
817
 
810
818
  var oRootViewController = this._oAppComponent.getRootViewController();
811
819
 
@@ -826,7 +834,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
826
834
  return oContext;
827
835
  } else {
828
836
  if (sEntitySet) {
829
- var sMessagesPath = oMetaModel.getObject(sContextPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
837
+ var sMessagesPath = oMetaModel.getObject("".concat(sContextPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
830
838
 
831
839
  if (sMessagesPath) {
832
840
  mParameters.$select = sMessagesPath;
@@ -876,7 +884,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
876
884
  };
877
885
  } else {
878
886
  mParams = {
879
- title: oResourceBundle.getText("SAPFE_ERROR"),
887
+ title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
880
888
  description: sErrorDescription,
881
889
  isDataReceivedError: true,
882
890
  shellBack: true
@@ -927,7 +935,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
927
935
  * therefore we get all dependent bindings (via private model method) to determine all paths and then
928
936
  * request them.
929
937
  *
930
- * @param {sap.ui.model.odata.v4.Context} oBindingContext Context to be refreshed
938
+ * @param oBindingContext Context to be refreshed
931
939
  * @ui5-restricted
932
940
  */
933
941
  ;
@@ -939,7 +947,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
939
947
 
940
948
  var sRootContextPath = oBindingContext.getPath();
941
949
  var sEntitySet = oPageComponent && oPageComponent.getEntitySet && oPageComponent.getEntitySet();
942
- var sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/" + sEntitySet;
950
+ var sContextPath = oPageComponent && oPageComponent.getContextPath && oPageComponent.getContextPath() || sEntitySet && "/".concat(sEntitySet);
943
951
 
944
952
  var oMetaModel = this._oView.getModel().getMetaModel();
945
953
 
@@ -955,7 +963,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
955
963
  var aDependentBindings;
956
964
  var sRelativePath = (oBinding.getContext() && oBinding.getContext().getPath() || "").replace(sRootContextPath, ""); // If no context, this is an absolute binding so no relative path
957
965
 
958
- var sPath = (sRelativePath ? sRelativePath.slice(1) + "/" : sRelativePath) + oBinding.getPath();
966
+ var sPath = (sRelativePath ? "".concat(sRelativePath.slice(1), "/") : sRelativePath) + oBinding.getPath();
959
967
 
960
968
  if (oBinding.isA("sap.ui.model.odata.v4.ODataContextBinding")) {
961
969
  // if (sPath === "") {
@@ -983,7 +991,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
983
991
  }
984
992
 
985
993
  if (sContextPath) {
986
- sMessagesPath = oMetaModel.getObject(sContextPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
994
+ sMessagesPath = oMetaModel.getObject("".concat(sContextPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
987
995
  } // binding of the context must have $$PatchWithoutSideEffects true, this bound context may be needed to be fetched from the dependent binding
988
996
 
989
997
 
@@ -1009,7 +1017,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1009
1017
  /**
1010
1018
  * Gets the binding context of the page or the component.
1011
1019
  *
1012
- * @returns {sap.ui.model.odata.v4.Context} The binding context
1020
+ * @returns The binding context
1013
1021
  * @ui5-restricted
1014
1022
  */
1015
1023
  ;
@@ -1024,7 +1032,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1024
1032
  /**
1025
1033
  * Sets the binding context of the page or the component.
1026
1034
  *
1027
- * @param {sap.ui.model.odata.v4.Context} oContext The binding context
1035
+ * @param oContext The binding context
1028
1036
  * @ui5-restricted
1029
1037
  */
1030
1038
  ;
@@ -1049,7 +1057,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1049
1057
  /**
1050
1058
  * Gets the flexible column layout (FCL) level corresponding to the view (-1 if the app is not FCL).
1051
1059
  *
1052
- * @returns {number} The level
1060
+ * @returns The level
1053
1061
  * @ui5-restricted
1054
1062
  */
1055
1063
  ;
@@ -1111,4 +1119,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
1111
1119
  }(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, "_createContext", [_dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "_createContext"), _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);
1112
1120
  return InternalRouting;
1113
1121
  }, false);
1114
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiSW50ZXJuYWxSb3V0aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsIm9TZW1hbnRpY09iamVjdCIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwiYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5Iiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsImlzRmNsRW5hYmxlZCIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGF0aCIsInJlcGxhY2UiLCJkZWZlcnJlZCIsInNLZXkiLCJzVmFsdWUiLCJiVGFyZ2V0RWRpdGFibGUiLCJoYXNPd25Qcm9wZXJ0eSIsImJBY3Rpb25DcmVhdGUiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwiYXJndW1lbnRzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwib01vZGVsIiwib091dCIsIl9iaW5kRGVmZXJyZWQiLCJfYmluZFBhZ2UiLCJmaW5hbGx5IiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJzVGFyZ2V0UGF0aCIsIm9Bc3luY0NvbnRleHQiLCJjcmVhdGVEZWZlcnJlZENvbnRleHQiLCJ1c2VDb250ZXh0IiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwiX3Jlc29sdmVTZW1hbnRpY1BhdGgiLCJzVGVjaG5pY2FsUGF0aCIsIl9iaW5kUGFnZVRvUGF0aCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm1lc3NhZ2UiLCJfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aCIsInNTZW1hbnRpY1BhdGgiLCJhU2VtYW50aWNLZXlzIiwib01ldGFNb2RlbCIsImZuVW5xdW90ZUFuZERlY29kZSIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyaW5nIiwiYUtleVZhbHVlcyIsInNwbGl0IiwiYUZpbHRlcnMiLCJiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwic0tleVZhbHVlIiwiRmlsdGVyIiwiJFByb3BlcnR5UGF0aCIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsInZhbHVlMSIsImNhc2VTZW5zaXRpdmUiLCJtS2V5VmFsdWVzIiwiZm9yRWFjaCIsInNLZXlBc3NpZ25tZW50IiwiYVBhcnRzIiwiYkZhaWxlZCIsIm1hcCIsIm9TZW1hbnRpY0tleSIsIm9EcmFmdEZpbHRlciIsImZpbHRlcnMiLCJhbmQiLCJwdXNoIiwib0NvbWJpbmVkRmlsdGVyIiwiX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJvRmlsdGVyIiwic3RhcnRzV2l0aCIsIm9MaXN0QmluZGluZyIsImJpbmRMaXN0IiwicmVxdWVzdENvbnRleHRzIiwib0NvbnRleHRzIiwiX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmciLCJzUGF0aCIsImFNYXRjaGVzIiwiZXhlYyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwic1BhdGhUb1Jlc29sdmUiLCJvTGFzdFNlbWFudGljTWFwcGluZyIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudEhhc2hOb1BhcmFtcyIsImdldEhhc2hDaGFuZ2VyIiwic1Jvb3RFbnRpdHlOYW1lIiwic3Vic3RyIiwiYkFsbG93U2VtYW50aWNCb29rbWFyayIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwic2VtYW50aWNQYXRoIiwidGVjaG5pY2FsUGF0aCIsInNldExhc3RTZW1hbnRpY01hcHBpbmciLCJvQ3VycmVudENvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsIm9UYXJnZXRDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJnZXRVcGRhdGVHcm91cElkIiwic2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJsaXN0QmluZGluZyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwibmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJvUGFnZUNvbXBvbmVudCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsIiQkZ3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwicmVxdWVzdE9iamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNNZXNzYWdlc1BhdGgiLCIkc2VsZWN0Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlciIsImdldEJvdW5kQ29udGV4dCIsInNFcnJvckRlc2NyaXB0aW9uIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsImNvbnRleHQiLCJnZXRTb3VyY2UiLCJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwicHJvZ3JhbW1pbmdNb2RlbCIsIl9lZGl0RmxvdyIsImdldFByb2dyYW1taW5nTW9kZWwiLCJ1bmxvY2siLCJEcmFmdCIsIkFjdGl2aXR5U3luYyIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwidGFyZ2V0Q29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsImkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0Iiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwiaXNEcmFmdFN1cHBvcnRlZCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFDckMsUUFBSTtBQUNILFVBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtBQUNBLEtBRkQsQ0FFRSxPQUFNRyxDQUFOLEVBQVM7QUFDVixhQUFPRixPQUFPLENBQUNFLENBQUQsQ0FBZDtBQUNBOztBQUNELFFBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtBQUMxQixhQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLLENBQWpCLEVBQW9CSCxPQUFwQixDQUFQO0FBQ0E7O0FBQ0QsV0FBT0MsTUFBUDtBQUNBOzs7Ozs7OztBQXpoQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUVNRyxlLFdBRExDLGNBQWMsQ0FBQyxrREFBRCxDLFVBWWJDLGNBQWMsRSxVQUtkQSxjQUFjLEUsVUFvQ2RDLGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBS1ZILGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBS1ZILGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBUVZILGVBQWUsRSxXQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBdUJWSCxlQUFlLEUsV0F5QmZBLGVBQWUsRSxXQWFmQSxlQUFlLEUsV0FDZkksY0FBYyxFLFdBOERkSixlQUFlLEUsV0FDZkksY0FBYyxFLFdBZ0JkSixlQUFlLEUsV0FDZkksY0FBYyxFLFdBY2RKLGVBQWUsRSxXQUNmSSxjQUFjLEUsV0FVZEosZUFBZSxFLFdBQ2ZJLGNBQWMsRSxXQW1CZEos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QyxFQUE0RztBQUMzR3NGLFFBQUFBLEtBQUssQ0FBQ3FDLHlDQUFOLENBQ0MsWUFBWTtBQUNYeFQsVUFBQUEsSUFBSSxDQUFDa1QsUUFBTCxDQUFjbk8sdUJBQWQsQ0FBc0M5QyxRQUF0QyxFQUFnRDtBQUFFd1IsWUFBQUEsbUJBQW1CLEVBQUU7QUFBdkIsV0FBaEQ7QUFDQSxTQUhGLEVBSUNDLFFBQVEsQ0FBQ0MsU0FKVixFQUtDMVIsUUFMRCxFQU1DNFEsT0FBTyxDQUFDbFIsYUFBUixFQU5ELEVBT0MsS0FQRCxFQVFDd1AsS0FBSyxDQUFDeUMsY0FBTixDQUFxQkMsY0FSdEI7QUFVQSxPQVhELE1BV087QUFDTjdULFFBQUFBLElBQUksQ0FBQ2tULFFBQUwsQ0FBY25PLHVCQUFkLENBQXNDOUMsUUFBdEMsRUFBZ0Q7QUFBRXdSLFVBQUFBLG1CQUFtQixFQUFFO0FBQXZCLFNBQWhEO0FBQ0E7QUFDRCxLOzs7SUE3K0I0QkssbUI7U0FnL0JmN1UsZSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0RW5oYW5jZVdpdGhVSTUsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRtZXRob2RPdmVycmlkZSxcblx0cHVibGljRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSb3V0aW5nU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbjogYW55O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgJiYgdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHR0aGlzLl9vUm91dGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAoIXRoaXMuX29BcHBDb21wb25lbnQgfHwgIXRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sZXIgZXh0ZW5zaW9uICdzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZXNpb25zLkludGVybmFsUm91dGluZ1wiKTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50ID09PSB0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXNuJ3QgaG9zdGVkIGluIGEgZGVkaWNhdGVkIFVJQ29tcG9uZW50LCBidXQgZGlyZWN0bHkgaW4gdGhlIGFwcFxuXHRcdFx0Ly8gLS0+IGp1c3Qga2VlcCB0aGUgdmlld1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIilcblx0XHRcdC50aGVuKChvUm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZSA9IG9Sb3V0aW5nU2VydmljZTtcblx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkFmdGVyQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYXZpZ2F0aW9uIHRhcmdldCBuYW1lXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2VtYW50aWNPYmplY3QgU2VtYW50aWMgb2JqZWN0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1RhcmdldChvQ29udGV4dDogYW55LCBzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZywgb1NlbWFudGljT2JqZWN0Pzogb2JqZWN0LCBiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbikge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH1cblx0XHR0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigob0NvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gb25jZSB0aGUgY29udGV4dCBpcyByZXR1cm5lZCB3ZSBuYXZpZ2F0ZSBpbnRvIGl0XG5cdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiBtUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IG1QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwsXG5cdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiBtUGFyYW1ldGVycy5iRm9yY2VGb2N1cyxcblx0XHRcdFx0XHRcdFx0Yk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBtUGFyYW1ldGVycy5iTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHlcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2l0aCB0aGUgYXN5bmMgY29udGV4dFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICghbVBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHQvLyBOYXZpZ2F0ZSB0byBhIGxpc3QgYmluZGluZyBub3QgeWV0IHN1cHBvcnRlZFxuXHRcdFx0XHR0aHJvdyBcIm5hdmlnYXRpb24gdG8gYSBsaXN0IGJpbmRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY2FsbEV4dGVuc2lvbikge1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXG5cdFx0XHRvQ29udGV4dEluZm8uc291cmNlQmluZGluZ0NvbnRleHQgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdG9Db250ZXh0SW5mby5iaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm9FdmVudCkge1xuXHRcdFx0XHRvQ29udGV4dEluZm8ub0V2ZW50ID0gbVBhcmFtZXRlcnMub0V2ZW50O1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3QgYk92ZXJyaWRlTmF2ID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24ob0NvbnRleHRJbmZvKTtcblx0XHRcdGlmIChiT3ZlcnJpZGVOYXYpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgb0NvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycywgdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCkge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5kZXhPZihcIiguLi4pXCIpICE9PSAtMSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWNyZWF0ZVwiKSA+IC0xKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvSGFzaCh0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0RGVmYXVsdENyZWF0ZUhhc2goKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdFx0cmV0dXJuICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheU1lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb246IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8IGFUYXJnZXRzLmluZGV4T2YodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpID09PSAtMSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm0gb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSB3aXRoIEZDTCwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGtlZXBBbGl2ZSBmbGFnLCB0byBhdm9pZCB0aGlzIGNvbnRleHQgdG8gYmUgbWFpbnRhaW5lZCBieVxuXHRcdFx0Ly8gdGhlIGxpc3QgYmluZGluZywgY2F1c2luZyBhZGRpdGlvbm5hbCBxdWVyaWVzIChlLmcuIGFmdGVyIGNsb3NpbmcgdGhlIE9QIGFuZCByZWZyZXNoaW5nIHRoZSBMUiB3aXRoIGEgbmV3IGZpbHRlciwgd2UgZG9uJ3Qgd2FudCB0aGVcblx0XHRcdC8vIGNvbnRleHQgb2YgdGhlIGNsb3NlZCBPUCB0byBiZSByZWxvYWRlZCBiZWNhdXNlIGl0J3Mga2VwdCBhbGl2ZSlcblx0XHRcdGlmIChcblx0XHRcdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHQodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSAmJlxuXHRcdFx0XHR0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpPy5pc0tlZXBBbGl2ZSgpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgocm91dGVBcmd1bWVudHM6IGFueSwgYmluZGluZ1BhdHRlcm46IHN0cmluZywgbmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluZGV4T2YoYHske3NLZXl9fWApID49IDApIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmIChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSAmJiByb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXS5oYXNPd25Qcm9wZXJ0eShcImktYWN0aW9uXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IChvRXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIGFueSkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKTtcblx0XHRsZXQgb091dDtcblx0XHRpZiAoZGVmZXJyZWQpIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuXG5cdFx0b091dC5maW5hbGx5KCgpID0+IHtcblx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdH0pO1xuXG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmZXJyZWQgYmluZGluZyAoZHVyaW5nIG9iamVjdCBjcmVhdGlvbikuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZERlZmVycmVkKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCwgeyBlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmIChvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dCB8fCAhb05hdmlnYXRpb25QYXJhbWV0ZXJzLm9Bc3luY0NvbnRleHQpIHtcblx0XHRcdC8vIGVpdGhlciB0aGUgY29udGV4dCBzaGFsbCBiZSBjcmVhdGVkIGluIHRoZSB0YXJnZXQgcGFnZSAoZGVmZXJyZWQgQ29udGV4dCkgb3IgaXQgc2hhbGxcblx0XHRcdC8vIGJlIGNyZWF0ZWQgYXN5bmMgYnV0IHRoZSB1c2VyIHJlZnJlc2hlZCB0aGUgcGFnZSAvIGJvb2ttYXJrZWQgdGhpcyBVUkxcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGUgdGFyZ2V0IGNvbXBvbmVudCBjcmVhdGVzIHRoaXMgZG9jdW1lbnQgYnV0IHdlIHNoYWxsIG1vdmUgdGhpcyB0b1xuXHRcdFx0Ly8gYSBjZW50cmFsIHBsYWNlXG5cdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dChcblx0XHRcdFx0XHRzVGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKGN1cnJlbnRCaW5kaW5nQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0Ly8gRm9yIG5vdyByZW1vdmUgdGhlIHBlbmRpbmcgY2hhbmdlcyB0byBhdm9pZCB0aGUgbW9kZWwgcmFpc2VzIGVycm9ycyBhbmQgdGhlIG9iamVjdCBwYWdlIGlzIGF0IGxlYXN0IGJvdW5kXG5cdFx0XHQvLyBJZGVhbGx5IHRoZSB1c2VyIHNob3VsZCBiZSBhc2tlZCBmb3Jcblx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMub25BZnRlckJpbmRpbmcobnVsbCk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IG9iamVjdCkge1xuXHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVzb2x2ZVNlbWFudGljUGF0aChzVGFyZ2V0UGF0aCwgb01vZGVsKVxuXHRcdFx0XHQudGhlbigoc1RlY2huaWNhbFBhdGg6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9QYXRoKHNUZWNobmljYWxQYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBFcnJvciBoYW5kbGluZyBmb3IgZXJyb25lb3VzIG1ldGFkYXRhIHJlcXVlc3Rcblx0XHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uob1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvRXJyb3IubWVzc2FnZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZmlsdGVyIHRvIHJldHJpZXZlIGEgY29udGV4dCBjb3JyZXNwb25kaW5nIHRvIGEgc2VtYW50aWMgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZW1hbnRpY1BhdGggVGhlIHNlbWFudGljIHBhdGhcblx0ICogQHBhcmFtIHtBcnJheX0gYVNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwuRmlsdGVyfSBUaGUgZmlsdGVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBhU2VtYW50aWNLZXlzOiBhbnlbXSwgb01ldGFNb2RlbDogb2JqZWN0KSB7XG5cdFx0Y29uc3QgZm5VbnF1b3RlQW5kRGVjb2RlID0gZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRpZiAoc1ZhbHVlLmluZGV4T2YoXCInXCIpID09PSAwICYmIHNWYWx1ZS5sYXN0SW5kZXhPZihcIidcIikgPT09IHNWYWx1ZS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgcXVvdGVzIGZyb20gdGhlIHZhbHVlIGFuZCBkZWNvZGUgc3BlY2lhbCBjaGFyc1xuXHRcdFx0XHRzVmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoc1ZhbHVlLnN1YnN0cmluZygxLCBzVmFsdWUubGVuZ3RoIC0gMSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNWYWx1ZTtcblx0XHR9O1xuXHRcdGNvbnN0IGFLZXlWYWx1ZXMgPSBzU2VtYW50aWNQYXRoLnN1YnN0cmluZyhzU2VtYW50aWNQYXRoLmluZGV4T2YoXCIoXCIpICsgMSwgc1NlbWFudGljUGF0aC5sZW5ndGggLSAxKS5zcGxpdChcIixcIik7XG5cdFx0bGV0IGFGaWx0ZXJzOiBGaWx0ZXJbXTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCAhPSBhS2V5VmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUob01ldGFNb2RlbCk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdC8vIFRha2UgdGhlIGZpcnN0IGtleSB2YWx1ZVxuXHRcdFx0Y29uc3Qgc0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFLZXlWYWx1ZXNbMF0pO1xuXHRcdFx0YUZpbHRlcnMgPSBbXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY0tleXNbMF0uJFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0dmFsdWUxOiBzS2V5VmFsdWUsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0fSlcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1LZXlWYWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBrZXkgdmFsdWVzXG5cdFx0XHRhS2V5VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXlBc3NpZ25tZW50OiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gc0tleUFzc2lnbm1lbnQuc3BsaXQoXCI9XCIpLFxuXHRcdFx0XHRcdHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhUGFydHNbMV0pO1xuXG5cdFx0XHRcdG1LZXlWYWx1ZXNbYVBhcnRzWzBdXSA9IHNLZXlWYWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgYkZhaWxlZCA9IGZhbHNlO1xuXHRcdFx0YUZpbHRlcnMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob1NlbWFudGljS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc0tleSA9IG9TZW1hbnRpY0tleS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHNWYWx1ZSA9IG1LZXlWYWx1ZXNbc0tleV07XG5cblx0XHRcdFx0aWYgKHNWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogc0tleSxcblx0XHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHRcdHZhbHVlMTogc1ZhbHVlLFxuXHRcdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRiRmFpbGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIlhYXCJcblx0XHRcdFx0XHR9KTsgLy8gd2lsbCBiZSBpZ25vcmUgYW55d2F5IHNpbmNlIHdlIHJldHVybiBhZnRlclxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGJGYWlsZWQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGEgZHJhZnQgZmlsdGVyIHRvIG1ha2Ugc3VyZSB3ZSB0YWtlIHRoZSBkcmFmdCBlbnRpdHkgaWYgdGhlcmUgaXMgb25lXG5cdFx0Ly8gT3IgdGhlIGFjdGl2ZSBlbnRpdHkgb3RoZXJ3aXNlXG5cdFx0Y29uc3Qgb0RyYWZ0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBbbmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgZmFsc2UpLCBuZXcgRmlsdGVyKFwiU2libGluZ0VudGl0eS9Jc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIG51bGwpXSxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0XHRhRmlsdGVycy5wdXNoKG9EcmFmdEZpbHRlcik7XG5cblx0XHRjb25zdCBvQ29tYmluZWRGaWx0ZXIgPSBuZXcgRmlsdGVyKGFGaWx0ZXJzLCB0cnVlKTtcblx0XHRyZXR1cm4gb0NvbWJpbmVkRmlsdGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgcGF0aCB3aXRoIHNlbWFudGljIGtleXMgdG8gYSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzU2VtYW50aWNQYXRoIFRoZSBwYXRoIHdpdGggc2VtYW50aWMga2V5c1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgVGhlIG1vZGVsIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBQcm9taXNlIGNvbnRhaW5pbmcgdGhlIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cyBpZiBzU2VtYW50aWNQYXRoIGNvdWxkIGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgbnVsbCBvdGhlcndpc2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBvTW9kZWw6IGFueSwgYVNlbWFudGljS2V5czogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoc1NlbWFudGljUGF0aCkuZ2V0UGF0aCgpO1xuXG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzIHx8IGFTZW1hbnRpY0tleXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHNldCBvZiBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIGtleXNcblx0XHRjb25zdCBvRmlsdGVyID0gdGhpcy5fY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoLCBhU2VtYW50aWNLZXlzLCBvTWV0YU1vZGVsKTtcblx0XHRpZiAob0ZpbHRlciA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgaW50ZXJwcmV0IHRoZSBwYXRoIGFzIGEgc2VtYW50aWMgb25lXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIExvYWQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0XG5cdFx0aWYgKCFzRW50aXR5U2V0UGF0aD8uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNFbnRpdHlTZXRQYXRoID0gXCIvXCIgKyBzRW50aXR5U2V0UGF0aDtcblx0XHR9XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KHNFbnRpdHlTZXRQYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwge1xuXHRcdFx0XCIkJGdyb3VwSWRcIjogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMikudGhlbihmdW5jdGlvbiAob0NvbnRleHRzOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udGV4dHMgJiYgb0NvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vIGRhdGEgY291bGQgYmUgbG9hZGVkXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHBhdGggaXMgZWxpZ2libGUgZm9yIHNlbWFudGljIGJvb2ttYXJraW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbH0gb01ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXRoIGlzIGVsaWdpYmxlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc1BhdGg6IHN0cmluZywgb01ldGFNb2RlbDogYW55KSB7XG5cdFx0Ly8gT25seSBwYXRoIG9uIHJvb3Qgb2JqZWN0cyBhbGxvdyBzZW1hbnRpYyBib29rbWFya2luZywgaS5lLiBzUGF0aCA9IHh4eCh5eXkpXG5cdFx0Y29uc3QgYU1hdGNoZXMgPSAvXltcXC9dPyhcXHcrKVxcKFteXFwvXStcXCkkLy5leGVjKHNQYXRoKTtcblx0XHRpZiAoIWFNYXRjaGVzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8vIEdldCB0aGUgZW50aXR5U2V0IG5hbWVcblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IFwiL1wiICsgYU1hdGNoZXNbMV07XG5cdFx0Ly8gQ2hlY2sgdGhlIGVudGl0eSBzZXQgc3VwcG9ydHMgZHJhZnQgKG90aGVyd2lzZSB3ZSBkb24ndCBzdXBwb3J0IHNlbWFudGljIGJvb2ttYXJraW5nKVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiKTtcblx0XHRyZXR1cm4gb0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlID8gdHJ1ZSA6IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIGZyb20gYSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aFRvUmVzb2x2ZSBUaGUgcGF0aCB0byBiZSB0cmFuc2Zvcm1lZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgc1BhdGhUb1Jlc29sdmVkIGNvdWxkbid0IGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3Jlc29sdmVTZW1hbnRpY1BhdGgoc1BhdGhUb1Jlc29sdmU6IHN0cmluZywgb01vZGVsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0xhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICcvJ1xuXHRcdFx0c0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0bGV0IHNSb290RW50aXR5TmFtZSA9IHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cigwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHNSb290RW50aXR5TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgYkFsbG93U2VtYW50aWNCb29rbWFyayA9IHRoaXMuX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9NZXRhTW9kZWwpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IGJBbGxvd1NlbWFudGljQm9va21hcmsgJiYgU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzIGF2YWlsYWJsZSAtLT4gdXNlIHRoZSBwYXRoIGFzIGlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNQYXRoVG9SZXNvbHZlKTtcblx0XHR9IGVsc2UgaWYgKG9MYXN0U2VtYW50aWNNYXBwaW5nICYmIG9MYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCA9PT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBuZWVkIHJlc29sdmUgdGhlIHNlbWFudGljIHBhdGggdG8gZ2V0IHRoZSB0ZWNobmljYWwga2V5c1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTW9kZWwsIGFTZW1hbnRpY0tleXMpLnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNUZWNobmljYWxQYXRoICYmIHNUZWNobmljYWxQYXRoICE9PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzZW1hbnRpYyBwYXRoIHdhcyByZXNvbHZlZCAob3RoZXJ3aXNlIGtlZXAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0YXJnZXQpXG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogc1RlY2huaWNhbFBhdGgsXG5cdFx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHNQYXRoVG9SZXNvbHZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIHNUZWNobmljYWxQYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFRvUmVzb2x2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0LiBOZWVkcyB0byBjb250YWluIHRlY2huaWNhbCBrZXlzIG9ubHkuXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dDtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpKSB7XG5cdFx0XHRsZXQgb1RhcmdldENvbnRleHQ7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZFxuXHRcdFx0XHRvVGFyZ2V0Q29udGV4dCA9IG9Vc2VDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gY3JlYXRlIGl0IGZyb20gc1RhcmdldFBhdGhcblx0XHRcdFx0b1RhcmdldENvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9UYXJnZXRDb250ZXh0ICE9PSBvQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1RhcmdldENvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlJlYXNvbklzSWFwcFN0YXRlICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgYm91bmRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvQ29udGV4dChvQ29udGV4dDogYW55LCBvTW9kZWw6IGFueSwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsKTtcblx0XHRcdHRoaXMub25BZnRlckJpbmRpbmcobnVsbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9QYXJlbnRMaXN0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCFvUGFyZW50TGlzdEJpbmRpbmcgfHxcblx0XHRcdFx0XHQhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpIHx8XG5cdFx0XHRcdFx0b1BhcmVudExpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSA9PT0gXCJzdWJtaXRMYXRlclwiXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nIG9yIHRoZSB0cmFuc2llbnQgb25lIGZyb20gdGhlIGNyZWF0ZSwgd2UgY3JlYXRlIGEgbmV3IGNvbnRleHRcblx0XHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbnRleHQgaXMgbm8gbG9uZ2VyIGtlcHQgYWxpdmVcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5pc0tlZXBBbGl2ZSgpICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8IG9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhvQ29udGV4dCwge1xuXHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0bGlzdEJpbmRpbmc6IG9QYXJlbnRMaXN0QmluZGluZyxcblx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhvQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5IEEgcGFyYW1ldGVyIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIG5hdmlnYXRlIHRvIHRoZSBjb250ZXh0IG9uIGRhdGEgcmVjZWl2ZWRcblx0ICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdF9jcmVhdGVDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBuYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYm9vbGVhbiA9IHRydWUpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBcIi9cIiArIHNFbnRpdHlTZXQpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoc0VudGl0eVNldCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0NvbnRleHRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IFwiSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSk7XG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgdGhpcy5fZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyLmJpbmQodGhpcywgbmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfZGF0YVJlY2VpdmVkRXZlbnRIYW5kbGVyKG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBib29sZWFuLCBvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3QgY29udGV4dCA9IG9FdmVudD8uZ2V0U291cmNlICYmIChvRXZlbnQ/LmdldFNvdXJjZSgpIGFzIGFueSk/LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdGNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gKHRoaXMuX29WaWV3Py5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpPy5fZWRpdEZsb3c/LmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRpZiAoXG5cdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRBY3Rpdml0eVN5bmMuaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCh0aGlzLl9vVmlldykgJiZcblx0XHRcdG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5ICYmXG5cdFx0XHRjb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgJiZcblx0XHRcdGNvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihjb250ZXh0LCBjb250ZXh0KTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9Db250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IGF3YWl0IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0XHRsZXQgbVBhcmFtcyA9IHt9O1xuXHRcdFx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24gJiYgc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA1MDMpIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0aXNJbml0aWFsTG9hZDUwM0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Vycm9yRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBcIi9cIiArIHNFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IGFueSA9IHtcblx0XHRcdFRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogYW55KSB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9ICgob0JpbmRpbmcuZ2V0Q29udGV4dCgpICYmIG9CaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpIHx8IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gc1JlbGF0aXZlUGF0aC5zbGljZSgxKSArIFwiL1wiIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoYURlcGVuZGVudEJpbmRpbmdzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFQcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNDb250ZXh0UGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhcIik7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGhcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMuY29uY2F0KG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzKSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBhbnkpIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQgJiYgb1ByZXZpb3VzQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICpcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIGxldmVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEZDTExldmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uRkNMTGV2ZWw7XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGwtc2NyZWVuIG1vZGUgd2hlbiBGQ0wgaXMgdXNlZC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBzTGF5b3V0OiBzTmV4dExheW91dCB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKSB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gb1NvdXJjZS5nZXRWaWV3RGF0YSgpIGFzIGFueTtcblx0XHRjb25zdCBvQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRpZiAob1ZpZXdEYXRhICYmIG9WaWV3RGF0YS52aWV3TGV2ZWwgPT09IDEgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBvQ29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGJhc2UuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIHsgbm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSB9KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b1NvdXJjZS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YmFzZS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlIH0pO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXX0=
1122
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiSW50ZXJuYWxSb3V0aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiZmluYWxFeHRlbnNpb24iLCJCZWZvcmUiLCJvbkV4aXQiLCJfb1JvdXRpbmdTZXJ2aWNlIiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuUm91dGVNYXRjaGVkQm91bmQiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1BhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIl9vUm91dGVyIiwiZ2V0Um91dGVyIiwiX29Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiRXJyb3IiLCJnZXRTZXJ2aWNlIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsIm9TZW1hbnRpY09iamVjdCIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwiYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5Iiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsImlzRmNsRW5hYmxlZCIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGF0aCIsInJlcGxhY2UiLCJkZWZlcnJlZCIsInNLZXkiLCJzVmFsdWUiLCJiVGFyZ2V0RWRpdGFibGUiLCJoYXNPd25Qcm9wZXJ0eSIsImJBY3Rpb25DcmVhdGUiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwiYXJndW1lbnRzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwib01vZGVsIiwib091dCIsIl9iaW5kRGVmZXJyZWQiLCJfYmluZFBhZ2UiLCJmaW5hbGx5IiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJzVGFyZ2V0UGF0aCIsIm9Bc3luY0NvbnRleHQiLCJjcmVhdGVEZWZlcnJlZENvbnRleHQiLCJ1c2VDb250ZXh0IiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwiX3Jlc29sdmVTZW1hbnRpY1BhdGgiLCJzVGVjaG5pY2FsUGF0aCIsIl9iaW5kUGFnZVRvUGF0aCIsIm9SZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm1lc3NhZ2UiLCJfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aCIsInNTZW1hbnRpY1BhdGgiLCJhU2VtYW50aWNLZXlzIiwib01ldGFNb2RlbCIsImZuVW5xdW90ZUFuZERlY29kZSIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyaW5nIiwiYUtleVZhbHVlcyIsInNwbGl0IiwiYUZpbHRlcnMiLCJiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwic0tleVZhbHVlIiwiRmlsdGVyIiwiJFByb3BlcnR5UGF0aCIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsInZhbHVlMSIsImNhc2VTZW5zaXRpdmUiLCJtS2V5VmFsdWVzIiwiZm9yRWFjaCIsInNLZXlBc3NpZ25tZW50IiwiYVBhcnRzIiwiYkZhaWxlZCIsIm1hcCIsIm9TZW1hbnRpY0tleSIsIm9EcmFmdEZpbHRlciIsImZpbHRlcnMiLCJhbmQiLCJwdXNoIiwiX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJvRmlsdGVyIiwic3RhcnRzV2l0aCIsIm9MaXN0QmluZGluZyIsImJpbmRMaXN0IiwicmVxdWVzdENvbnRleHRzIiwib0NvbnRleHRzIiwiX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmciLCJzUGF0aCIsImFNYXRjaGVzIiwiZXhlYyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwic1BhdGhUb1Jlc29sdmUiLCJvTGFzdFNlbWFudGljTWFwcGluZyIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudEhhc2hOb1BhcmFtcyIsImdldEhhc2hDaGFuZ2VyIiwic1Jvb3RFbnRpdHlOYW1lIiwic3Vic3RyIiwiYkFsbG93U2VtYW50aWNCb29rbWFyayIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwic2VtYW50aWNQYXRoIiwidGVjaG5pY2FsUGF0aCIsInNldExhc3RTZW1hbnRpY01hcHBpbmciLCJvQ3VycmVudENvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsIm9UYXJnZXRDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJnZXRVcGRhdGVHcm91cElkIiwic2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJsaXN0QmluZGluZyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwibmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJvUGFnZUNvbXBvbmVudCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsIiQkZ3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwicmVxdWVzdE9iamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNNZXNzYWdlc1BhdGgiLCIkc2VsZWN0Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlciIsImdldEJvdW5kQ29udGV4dCIsInNFcnJvckRlc2NyaXB0aW9uIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsImNvbnRleHQiLCJnZXRTb3VyY2UiLCJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwicHJvZ3JhbW1pbmdNb2RlbCIsIl9lZGl0RmxvdyIsImdldFByb2dyYW1taW5nTW9kZWwiLCJ1bmxvY2siLCJEcmFmdCIsIkFjdGl2aXR5U3luYyIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwidGFyZ2V0Q29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsImkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImNvbmNhdCIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0Iiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwiaXNEcmFmdFN1cHBvcnRlZCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFDckMsUUFBSTtBQUNILFVBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtBQUNBLEtBRkQsQ0FFRSxPQUFNRyxDQUFOLEVBQVM7QUFDVixhQUFPRixPQUFPLENBQUNFLENBQUQsQ0FBZDtBQUNBOztBQUNELFFBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtBQUMxQixhQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLLENBQWpCLEVBQW9CSCxPQUFwQixDQUFQO0FBQ0E7O0FBQ0QsV0FBT0MsTUFBUDtBQUNBOzs7Ozs7OztBQS9oQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtNQUVNRyxlLFdBRExDLGNBQWMsQ0FBQyxrREFBRCxDLFVBWWJDLGNBQWMsRSxVQU9kQSxjQUFjLEUsVUFvQ2RDLGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBS1ZILGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBS1ZILGVBQWUsRSxVQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBUVZILGVBQWUsRSxXQUNmQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBdUJWSCxlQUFlLEUsV0F5QmZBLGVBQWUsRSxXQWFmQSxlQUFlLEUsV0FDZkksY0FBYyxFLFdBOERkSixlQUFlLEUsV0FDZkksY0FBYyxFLFdBZ0JkSixlQUFlLEUsV0FDZkksY0FBYyxFLFdBY2RKLGVBQWUsRSxXQUNmSSxjQUFjLEUsV0FVZEosZUFBZSxFLFdBQ2ZJLGNBQWMsRSxXQW1CZEosZUFBZSxFLFdBQ2ZJLGNBQWMs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QUMySixPQUFULEVBQXpDLENBQTlDLEVBQTRHO0FBQzNHc0YsUUFBQUEsS0FBSyxDQUFDcUMseUNBQU4sQ0FDQyxZQUFZO0FBQ1h2VCxVQUFBQSxJQUFJLENBQUNpVCxRQUFMLENBQWNsTyx1QkFBZCxDQUFzQzlDLFFBQXRDLEVBQWdEO0FBQUV1UixZQUFBQSxtQkFBbUIsRUFBRTtBQUF2QixXQUFoRDtBQUNBLFNBSEYsRUFJQ0MsUUFBUSxDQUFDQyxTQUpWLEVBS0N6UixRQUxELEVBTUMyUSxPQUFPLENBQUNqUixhQUFSLEVBTkQsRUFPQyxLQVBELEVBUUN1UCxLQUFLLENBQUN5QyxjQUFOLENBQXFCQyxjQVJ0QjtBQVVBLE9BWEQsTUFXTztBQUNONVQsUUFBQUEsSUFBSSxDQUFDaVQsUUFBTCxDQUFjbE8sdUJBQWQsQ0FBc0M5QyxRQUF0QyxFQUFnRDtBQUFFdVIsVUFBQUEsbUJBQW1CLEVBQUU7QUFBdkIsU0FBaEQ7QUFDQTtBQUNELEs7OztJQXYvQjRCSyxtQjtTQTAvQmY1VSxlIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IEFjdGl2aXR5U3luYyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1xuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cdHByaXZhdGUgX29WaWV3ITogVmlldztcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXHRwcml2YXRlIF9vUm91dGluZ1NlcnZpY2UhOiBSb3V0aW5nU2VydmljZTtcblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblx0cHJvdGVjdGVkIF9vVGFyZ2V0SW5mb3JtYXRpb246IGFueTtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkV4aXQoKSB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0aW5nU2VydmljZSkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IodGhpcy5fb1BhZ2VDb21wb25lbnQgfHwgdGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udHJvbGxlciBleHRlbnNpb24gY2Fubm90IHdvcmsgd2l0aG91dCBhICdyb3V0aW5nU2VydmljZScgb24gdGhlIG1haW4gQXBwQ29tcG9uZW50XCIpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcmVkIGV2ZXJ5IHRpbWUgdGhpcyBjb250cm9sbGVyIGlzIGEgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0KHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5vbkNvbnRleHRCb3VuZFRvVmlldyhvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gYWZ0ZXIgYSB1c2VyIGFjdGlvblxuXHQvLyAoZS5nLiBjbGljayBvbiBhIHRhYmxlIHJvdywgYnV0dG9uLCBldGMuLi4pXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gc05hdmlnYXRpb25UYXJnZXROYW1lIE5hdmlnYXRpb24gdGFyZ2V0IG5hbWVcblx0ICogQHBhcmFtIG9TZW1hbnRpY09iamVjdCBTZW1hbnRpYyBvYmplY3Rcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9UYXJnZXQob0NvbnRleHQ6IGFueSwgc05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsIG9TZW1hbnRpY09iamVjdD86IG9iamVjdCwgYlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9XG5cdFx0dGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigoYXN5bmNDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChhc3luY0NvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IG1QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogbVBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IG1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzLFxuXHRcdFx0XHRcdFx0XHRiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk6IG1QYXJhbWV0ZXJzLmJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFtUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdC8vIE5hdmlnYXRlIHRvIGEgbGlzdCBiaW5kaW5nIG5vdCB5ZXQgc3VwcG9ydGVkXG5cdFx0XHRcdHRocm93IFwibmF2aWdhdGlvbiB0byBhIGxpc3QgYmluZGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jYWxsRXh0ZW5zaW9uKSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cblx0XHRcdG9Db250ZXh0SW5mby5zb3VyY2VCaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0b0NvbnRleHRJbmZvLmJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMub0V2ZW50KSB7XG5cdFx0XHRcdG9Db250ZXh0SW5mby5vRXZlbnQgPSBtUGFyYW1ldGVycy5vRXZlbnQ7XG5cdFx0XHR9XG5cdFx0XHQvLyBTdG9yaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVzZSBpdCBpbiBpbnRlcm5hbCByb3V0ZSBuYXZpZ2F0aW9uIGlmIG5lY2Nlc3NhcnkuXG5cdFx0XHRjb25zdCBiT3ZlcnJpZGVOYXYgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbihvQ29udGV4dEluZm8pO1xuXHRcdFx0aWYgKGJPdmVycmlkZU5hdikge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgZnJvbSBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgZm9yd2FyZHMgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrIGluIGhpc3RvcnkgaWYgdGhlIGN1cnJlbnQgaGFzaCBjb3JyZXNwb25kcyB0byBhIHRyYW5zaWVudCBzdGF0ZS5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpO1xuXG5cdFx0Ly8gaWYgdHJpZ2dlcmVkIHdoaWxlIG5hdmlnYXRpbmcgdG8gKC4uLiksIHdlIG5lZWQgdG8gbmF2aWdhdGUgYmFja1xuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwiKC4uLilcIikgIT09IC0xKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkubmF2QmFjaygpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmRleE9mKFwiaS1hY3Rpb249Y3JlYXRlXCIpID4gLTEpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0XHRyZXR1cm4gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZSwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uOiBhbnkpOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCBhVGFyZ2V0cy5pbmRleE9mKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSA9PT0gLTEpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2Ugd2l0aCBGQ0wsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0IGFuZCB0aGUgY29ycmVzcG9uZGluZyBrZWVwQWxpdmUgZmxhZywgdG8gYXZvaWQgdGhpcyBjb250ZXh0IHRvIGJlIG1haW50YWluZWQgYnlcblx0XHRcdC8vIHRoZSBsaXN0IGJpbmRpbmcsIGNhdXNpbmcgYWRkaXRpb25uYWwgcXVlcmllcyAoZS5nLiBhZnRlciBjbG9zaW5nIHRoZSBPUCBhbmQgcmVmcmVzaGluZyB0aGUgTFIgd2l0aCBhIG5ldyBmaWx0ZXIsIHdlIGRvbid0IHdhbnQgdGhlXG5cdFx0XHQvLyBjb250ZXh0IG9mIHRoZSBjbG9zZWQgT1AgdG8gYmUgcmVsb2FkZWQgYmVjYXVzZSBpdCdzIGtlcHQgYWxpdmUpXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0KHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkgJiZcblx0XHRcdFx0dGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKT8uaXNLZWVwQWxpdmUoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKHJvdXRlQXJndW1lbnRzOiBhbnksIGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmRleE9mKGB7JHtzS2V5fX1gKSA+PSAwKSB7XG5cdFx0XHRcdGRlZmVycmVkID0gdHJ1ZTtcblx0XHRcdFx0Ly8gU29tZXRpbWVzIGluIHByZWZlcnJlZE1vZGUgPSBjcmVhdGUsIHRoZSBlZGl0IGJ1dHRvbiBpcyBzaG93biBpbiBiYWNrZ3JvdW5kIHdoZW4gdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIHNob3dzIHVwLCBzZXR0aW5nIGJUYXJnZXRFZGl0YWJsZSBwYXNzZXMgZWRpdGFibGUgYXMgdHJ1ZVxuXHRcdFx0XHQvLyB0byBvbkJlZm9yZUJpbmRpbmcgaW4gX2JpbmRUYXJnZXRQYWdlIGZ1bmN0aW9uXG5cdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHtzS2V5fX1gLCBzVmFsdWUpO1xuXHRcdH1cblx0XHRpZiAocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gJiYgcm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0uaGFzT3duUHJvcGVydHkoXCJpLWFjdGlvblwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfb25Sb3V0ZU1hdGNoZWQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gfHwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSAob0V2ZW50LmdldFBhcmFtZXRlcnMoKSBhcyBhbnkpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIik7XG5cdFx0Y29uc3QgeyBwYXRoLCBkZWZlcnJlZCB9ID0gdGhpcy5fYnVpbGRCaW5kaW5nUGF0aChtQXJndW1lbnRzLCBiaW5kaW5nUGF0dGVybiwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0bGV0IG9PdXQ7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZERlZmVycmVkKHBhdGgsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kUGFnZShwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdG9PdXQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHR9KTtcblxuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkudXBkYXRlVUlTdGF0ZUZvclZpZXcodGhpcy5fb1ZpZXcsIHRoaXMuX2dldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmREZWZlcnJlZChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwsIHsgZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQgfHwgIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5vQXN5bmNDb250ZXh0KSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0c1RhcmdldFBhdGgsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChjdXJyZW50QmluZGluZ0NvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdC8vIEZvciBub3cgcmVtb3ZlIHRoZSBwZW5kaW5nIGNoYW5nZXMgdG8gYXZvaWQgdGhlIG1vZGVsIHJhaXNlcyBlcnJvcnMgYW5kIHRoZSBvYmplY3QgcGFnZSBpcyBhdCBsZWFzdCBib3VuZFxuXHRcdFx0Ly8gSWRlYWxseSB0aGUgdXNlciBzaG91bGQgYmUgYXNrZWQgZm9yXG5cdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBoYXMgYmVlbiBzZXQgb24gdGhlIHBhZ2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2Uoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogb2JqZWN0KSB7XG5cdFx0aWYgKHNUYXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXNvbHZlU2VtYW50aWNQYXRoKHNUYXJnZXRQYXRoLCBvTW9kZWwpXG5cdFx0XHRcdC50aGVuKChzVGVjaG5pY2FsUGF0aDogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgoc1RlY2huaWNhbFBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IG9FcnJvci5tZXNzYWdlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdG8gcmV0cmlldmUgYSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gYSBzZW1hbnRpYyBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljUGF0aCBUaGUgc2VtYW50aWMgcGF0aFxuXHQgKiBAcGFyYW0gYVNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBmaWx0ZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIGFTZW1hbnRpY0tleXM6IGFueVtdLCBvTWV0YU1vZGVsOiBvYmplY3QpIHtcblx0XHRjb25zdCBmblVucXVvdGVBbmREZWNvZGUgPSBmdW5jdGlvbiAoc1ZhbHVlOiBhbnkpIHtcblx0XHRcdGlmIChzVmFsdWUuaW5kZXhPZihcIidcIikgPT09IDAgJiYgc1ZhbHVlLmxhc3RJbmRleE9mKFwiJ1wiKSA9PT0gc1ZhbHVlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBxdW90ZXMgZnJvbSB0aGUgdmFsdWUgYW5kIGRlY29kZSBzcGVjaWFsIGNoYXJzXG5cdFx0XHRcdHNWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChzVmFsdWUuc3Vic3RyaW5nKDEsIHNWYWx1ZS5sZW5ndGggLSAxKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc1ZhbHVlO1xuXHRcdH07XG5cdFx0Y29uc3QgYUtleVZhbHVlcyA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKHNTZW1hbnRpY1BhdGguaW5kZXhPZihcIihcIikgKyAxLCBzU2VtYW50aWNQYXRoLmxlbmd0aCAtIDEpLnNwbGl0KFwiLFwiKTtcblx0XHRsZXQgYUZpbHRlcnM6IEZpbHRlcltdO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMubGVuZ3RoICE9IGFLZXlWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShvTWV0YU1vZGVsKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Ly8gVGFrZSB0aGUgZmlyc3Qga2V5IHZhbHVlXG5cdFx0XHRjb25zdCBzS2V5VmFsdWUgPSBmblVucXVvdGVBbmREZWNvZGUoYUtleVZhbHVlc1swXSk7XG5cdFx0XHRhRmlsdGVycyA9IFtcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0cGF0aDogYVNlbWFudGljS2V5c1swXS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHR2YWx1ZTE6IHNLZXlWYWx1ZSxcblx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbUtleVZhbHVlczogYW55ID0ge307XG5cdFx0XHQvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGtleSB2YWx1ZXNcblx0XHRcdGFLZXlWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleUFzc2lnbm1lbnQ6IHN0cmluZykge1xuXHRcdFx0XHRjb25zdCBhUGFydHMgPSBzS2V5QXNzaWdubWVudC5zcGxpdChcIj1cIiksXG5cdFx0XHRcdFx0c0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFQYXJ0c1sxXSk7XG5cblx0XHRcdFx0bUtleVZhbHVlc1thUGFydHNbMF1dID0gc0tleVZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGxldCBiRmFpbGVkID0gZmFsc2U7XG5cdFx0XHRhRmlsdGVycyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvU2VtYW50aWNLZXk6IGFueSkge1xuXHRcdFx0XHRjb25zdCBzS2V5ID0gb1NlbWFudGljS2V5LiRQcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0c1ZhbHVlID0gbUtleVZhbHVlc1tzS2V5XTtcblxuXHRcdFx0XHRpZiAoc1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBzS2V5LFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiBzVmFsdWUsXG5cdFx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJGYWlsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IFwiWFhcIlxuXHRcdFx0XHRcdH0pOyAvLyB3aWxsIGJlIGlnbm9yZSBhbnl3YXkgc2luY2Ugd2UgcmV0dXJuIGFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYkZhaWxlZCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgYSBkcmFmdCBmaWx0ZXIgdG8gbWFrZSBzdXJlIHdlIHRha2UgdGhlIGRyYWZ0IGVudGl0eSBpZiB0aGVyZSBpcyBvbmVcblx0XHQvLyBPciB0aGUgYWN0aXZlIGVudGl0eSBvdGhlcndpc2Vcblx0XHRjb25zdCBvRHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHRcdGFGaWx0ZXJzLnB1c2gob0RyYWZ0RmlsdGVyKTtcblxuXHRcdHJldHVybiBuZXcgRmlsdGVyKGFGaWx0ZXJzLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIHRvIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljUGF0aCBUaGUgcGF0aCB3aXRoIHNlbWFudGljIGtleXNcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgbW9kZWwgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSBhU2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgY29udGFpbmluZyB0aGUgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzIGlmIHNTZW1hbnRpY1BhdGggY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBudWxsIG90aGVyd2lzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBhU2VtYW50aWNLZXlzOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzU2VtYW50aWNQYXRoKS5nZXRQYXRoKCk7XG5cblx0XHRpZiAoIWFTZW1hbnRpY0tleXMgfHwgYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIHNlbWFudGljIGtleXNcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgc2V0IG9mIGZpbHRlcnMgY29ycmVzcG9uZGluZyB0byBhbGwga2V5c1xuXHRcdGNvbnN0IG9GaWx0ZXIgPSB0aGlzLl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoKHNTZW1hbnRpY1BhdGgsIGFTZW1hbnRpY0tleXMsIG9NZXRhTW9kZWwpO1xuXHRcdGlmIChvRmlsdGVyID09PSBudWxsKSB7XG5cdFx0XHQvLyBDb3VsZG4ndCBpbnRlcnByZXQgdGhlIHBhdGggYXMgYSBzZW1hbnRpYyBvbmVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCB0aGUgY29ycmVzcG9uZGluZyBvYmplY3Rcblx0XHRpZiAoIXNFbnRpdHlTZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0VudGl0eVNldFBhdGggPSBgLyR7c0VudGl0eVNldFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KHNFbnRpdHlTZXRQYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwge1xuXHRcdFx0XCIkJGdyb3VwSWRcIjogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMikudGhlbihmdW5jdGlvbiAob0NvbnRleHRzOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udGV4dHMgJiYgb0NvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vIGRhdGEgY291bGQgYmUgbG9hZGVkXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHBhdGggaXMgZWxpZ2libGUgZm9yIHNlbWFudGljIGJvb2ttYXJraW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgZWxpZ2libGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyhzUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsOiBhbnkpIHtcblx0XHQvLyBPbmx5IHBhdGggb24gcm9vdCBvYmplY3RzIGFsbG93IHNlbWFudGljIGJvb2ttYXJraW5nLCBpLmUuIHNQYXRoID0geHh4KHl5eSlcblx0XHRjb25zdCBhTWF0Y2hlcyA9IC9eW1xcL10/KFxcdyspXFwoW15cXC9dK1xcKSQvLmV4ZWMoc1BhdGgpO1xuXHRcdGlmICghYU1hdGNoZXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gR2V0IHRoZSBlbnRpdHlTZXQgbmFtZVxuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gYC8ke2FNYXRjaGVzWzFdfWA7XG5cdFx0Ly8gQ2hlY2sgdGhlIGVudGl0eSBzZXQgc3VwcG9ydHMgZHJhZnQgKG90aGVyd2lzZSB3ZSBkb24ndCBzdXBwb3J0IHNlbWFudGljIGJvb2ttYXJraW5nKVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdHJldHVybiBvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgcGF0aCB3aXRoIHNlbWFudGljIGtleXMgZnJvbSBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoVG9SZXNvbHZlIFRoZSBwYXRoIHRvIGJlIHRyYW5zZm9ybWVkXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFN0cmluZyBwcm9taXNlIGZvciB0aGUgbmV3IHBhdGguIElmIHNQYXRoVG9SZXNvbHZlZCBjb3VsZG4ndCBiZSBpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHBhdGgsIGl0IGlzIHJldHVybmVkIGFzIGlzLlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9yZXNvbHZlU2VtYW50aWNQYXRoKHNQYXRoVG9SZXNvbHZlOiBzdHJpbmcsIG9Nb2RlbDogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG9MYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRsZXQgc0N1cnJlbnRIYXNoTm9QYXJhbXMgPSB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGlmIChzQ3VycmVudEhhc2hOb1BhcmFtcyAmJiBzQ3VycmVudEhhc2hOb1BhcmFtcy5sYXN0SW5kZXhPZihcIi9cIikgPT09IHNDdXJyZW50SGFzaE5vUGFyYW1zLmxlbmd0aCAtIDEpIHtcblx0XHRcdC8vIFJlbW92ZSB0cmFpbGluZyAnLydcblx0XHRcdHNDdXJyZW50SGFzaE5vUGFyYW1zID0gc0N1cnJlbnRIYXNoTm9QYXJhbXMuc3Vic3RyaW5nKDAsIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxlbmd0aCAtIDEpO1xuXHRcdH1cblxuXHRcdGxldCBzUm9vdEVudGl0eU5hbWUgPSBzQ3VycmVudEhhc2hOb1BhcmFtcyAmJiBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHIoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMuaW5kZXhPZihcIihcIikpO1xuXHRcdGlmIChzUm9vdEVudGl0eU5hbWUuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdHNSb290RW50aXR5TmFtZSA9IHNSb290RW50aXR5TmFtZS5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IGJBbGxvd1NlbWFudGljQm9va21hcmsgPSB0aGlzLl9jaGVja1BhdGhGb3JTZW1hbnRpY0Jvb2ttYXJraW5nKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTWV0YU1vZGVsKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrICYmIFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzUm9vdEVudGl0eU5hbWUpO1xuXHRcdGlmICghYVNlbWFudGljS2V5cykge1xuXHRcdFx0Ly8gTm8gc2VtYW50aWMga2V5cyBhdmFpbGFibGUgLS0+IHVzZSB0aGUgcGF0aCBhcyBpc1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShzUGF0aFRvUmVzb2x2ZSk7XG5cdFx0fSBlbHNlIGlmIChvTGFzdFNlbWFudGljTWFwcGluZyAmJiBvTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGggPT09IHNQYXRoVG9SZXNvbHZlKSB7XG5cdFx0XHQvLyBUaGlzIHNlbWFudGljIHBhdGggaGFzIGJlZW4gcmVzb2x2ZWQgcHJldmlvdXNseVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShvTGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgbmVlZCByZXNvbHZlIHRoZSBzZW1hbnRpYyBwYXRoIHRvIGdldCB0aGUgdGVjaG5pY2FsIGtleXNcblx0XHRcdHJldHVybiB0aGlzLl9nZXRUZWNobmljYWxQYXRoRnJvbVNlbWFudGljUGF0aChzQ3VycmVudEhhc2hOb1BhcmFtcywgb01vZGVsLCBhU2VtYW50aWNLZXlzKS50aGVuKChzVGVjaG5pY2FsUGF0aDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzVGVjaG5pY2FsUGF0aCAmJiBzVGVjaG5pY2FsUGF0aCAhPT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdFx0XHQvLyBUaGUgc2VtYW50aWMgcGF0aCB3YXMgcmVzb2x2ZWQgKG90aGVyd2lzZSBrZWVwIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGFyZ2V0KVxuXHRcdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHtcblx0XHRcdFx0XHRcdHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLFxuXHRcdFx0XHRcdFx0c2VtYW50aWNQYXRoOiBzUGF0aFRvUmVzb2x2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBzVGVjaG5pY2FsUGF0aDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gc1BhdGhUb1Jlc29sdmU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dC4gTmVlZHMgdG8gY29udGFpbiB0ZWNobmljYWwga2V5cyBvbmx5LlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IGFueSwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvQ3VycmVudENvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c0N1cnJlbnRQYXRoID0gb0N1cnJlbnRDb250ZXh0ICYmIG9DdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvVXNlQ29udGV4dCA9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0O1xuXG5cdFx0Ly8gV2Ugc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdC8vIG9yIGlmIHdlIGhhdmUgYSBjb250ZXh0IGFscmVhZHkgc2VsZWN0ZWRcblx0XHRpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCB8fCAob1VzZUNvbnRleHQgJiYgb1VzZUNvbnRleHQuZ2V0UGF0aCgpID09PSBzVGFyZ2V0UGF0aCkpIHtcblx0XHRcdGxldCBvVGFyZ2V0Q29udGV4dDtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgY29udGV4dCB0byBiZSB1c2VkXG5cdFx0XHRcdG9UYXJnZXRDb250ZXh0ID0gb1VzZUNvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBjcmVhdGUgaXQgZnJvbSBzVGFyZ2V0UGF0aFxuXHRcdFx0XHRvVGFyZ2V0Q29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1RhcmdldENvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVGFyZ2V0Q29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUmVhc29uSXNJYXBwU3RhdGUgJiYgRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0dGhpcy5fcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9DdXJyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJpbmRzIHRoZSBwYWdlIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgYm91bmRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgb01vZGVsOiBhbnksIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQhb1BhcmVudExpc3RCaW5kaW5nIHx8XG5cdFx0XHRcdFx0IW9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSB8fFxuXHRcdFx0XHRcdG9QYXJlbnRMaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkgPT09IFwic3VibWl0TGF0ZXJcIlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBpZiB0aGUgcGFyZW50QmluZGluZyBpcyBub3QgYSBsaXN0QmluZGluZyBvciB0aGUgdHJhbnNpZW50IG9uZSBmcm9tIHRoZSBjcmVhdGUsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY29udGV4dCBpcyBubyBsb25nZXIga2VwdCBhbGl2ZVxuXHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaXNLZWVwQWxpdmUoKSAmJiBvUm9vdFZpZXdDb250cm9sbGVyLmlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0KSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHRcdC8vIFRoaXMgY2FzZSBmb3IgY3VzdG9tIGZyYWdtZW50cyBpcyBzdXBwb3J0ZWQsIGJ1dCBhbiBlcnJvciBpcyBsb2dnZWQgdG8gbWFrZSB0aGUgbGFjayBvZiBzeW5jaHJvbml6YXRpb24gYXBwYXJlbnRcblx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG9Db250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkgQSBwYXJhbWV0ZXIgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gbmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgb24gZGF0YSByZWNlaXZlZFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdF9jcmVhdGVDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBuYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYm9vbGVhbiA9IHRydWUpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIsXG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiLFxuXHRcdFx0XHQkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlXG5cdFx0XHR9O1xuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoc0VudGl0eVNldCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMuX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlci5iaW5kKHRoaXMsIG5hdmlnYXRlVG9TaWJsaW5nRW50aXR5KSk7XG5cdFx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2RhdGFSZWNlaXZlZEV2ZW50SGFuZGxlcihuYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYm9vbGVhbiwgb0V2ZW50OiBFdmVudCkge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBvRXZlbnQ/LmdldFNvdXJjZSAmJiAob0V2ZW50Py5nZXRTb3VyY2UoKSBhcyBhbnkpPy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRjb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9ICh0aGlzLl9vVmlldz8uZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKT8uX2VkaXRGbG93Py5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGNvbnN0IHNFcnJvckRlc2NyaXB0aW9uID0gb0V2ZW50ICYmIG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJlcnJvclwiKTtcblx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0aWYgKFxuXHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJlxuXHRcdFx0QWN0aXZpdHlTeW5jLmlzQ29sbGFib3JhdGlvbkVuYWJsZWQodGhpcy5fb1ZpZXcpICYmXG5cdFx0XHRuYXZpZ2F0ZVRvU2libGluZ0VudGl0eSAmJlxuXHRcdFx0Y29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpICYmXG5cdFx0XHRjb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBzaWJsaW5nSW5mbyA9IGF3YWl0IGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oY29udGV4dCwgY29udGV4dCk7XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBhd2FpdCAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uICYmIHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgY29yZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IGFueSA9IHtcblx0XHRcdFRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogYW55KSB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9ICgob0JpbmRpbmcuZ2V0Q29udGV4dCgpICYmIG9CaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpIHx8IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGFEZXBlbmRlbnRCaW5kaW5nc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0JFByb3BlcnR5UGF0aDogc01lc3NhZ2VzUGF0aFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcy5jb25jYXQob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMpLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogYW55KSB7XG5cdFx0bGV0IG9QcmV2aW91c0NvbnRleHQsIG9UYXJnZXRDb250cm9sO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0ICYmIG9QcmV2aW91c0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRGQ0xMZXZlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLkZDTExldmVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c3dpdGNoRnVsbFNjcmVlbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0ID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHR0aGlzLmJhc2UuX3JvdXRpbmcubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHsgc0xheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGNsb3NlQ29sdW1uKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IG9Tb3VyY2UuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBiYXNlID0gdGhpcy5iYXNlO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0aWYgKG9WaWV3RGF0YSAmJiBvVmlld0RhdGEudmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRiYXNlLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCB7IG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUgfSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9Tb3VyY2UuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJhc2UuX3JvdXRpbmcubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIHsgbm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSB9KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxSb3V0aW5nO1xuIl19