@sapui5/sap.fe.core 1.103.0 → 1.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +121 -0
  4. package/src/sap/fe/core/ActionRuntime.ts +122 -0
  5. package/src/sap/fe/core/AppComponent.js +24 -11
  6. package/src/sap/fe/core/AppComponent.ts +17 -5
  7. package/src/sap/fe/core/AppStateHandler.js +74 -62
  8. package/src/sap/fe/core/AppStateHandler.ts +24 -29
  9. package/src/sap/fe/core/BaseController.js +2 -2
  10. package/src/sap/fe/core/CommonUtils.js +147 -180
  11. package/src/sap/fe/core/CommonUtils.ts +166 -193
  12. package/src/sap/fe/core/ExtensionAPI.js +2 -2
  13. package/src/sap/fe/core/PageController.js +2 -2
  14. package/src/sap/fe/core/TemplateComponent.js +21 -10
  15. package/src/sap/fe/core/TemplateComponent.ts +3 -0
  16. package/src/sap/fe/core/TemplateModel.js +2 -2
  17. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
  18. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +7 -1
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +194 -43
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +162 -24
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -227
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +268 -119
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +111 -76
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +96 -76
  27. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  28. package/src/sap/fe/core/controllerextensions/EditFlow.js +723 -637
  29. package/src/sap/fe/core/controllerextensions/EditFlow.ts +361 -398
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +83 -55
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +42 -44
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +29 -27
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +35 -30
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +171 -74
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +167 -76
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +5 -21
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -17
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -3
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  43. package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -1
  44. package/src/sap/fe/core/controllerextensions/Paginator.js +13 -13
  45. package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -11
  46. package/src/sap/fe/core/controllerextensions/Placeholder.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +2 -2
  48. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  49. package/src/sap/fe/core/controllerextensions/Share.js +154 -123
  50. package/src/sap/fe/core/controllerextensions/Share.ts +93 -95
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +157 -97
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +151 -95
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +151 -80
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +95 -93
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +9 -9
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +6 -7
  58. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +26 -11
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +30 -11
  60. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -40
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +55 -47
  62. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +31 -32
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1376 -914
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +654 -714
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +372 -326
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +210 -276
  67. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
  68. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +670 -521
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +537 -535
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +85 -65
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +16 -21
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +25 -13
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +53 -43
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +18 -27
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +9 -15
  77. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +19 -3
  78. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
  79. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +26 -16
  80. package/src/sap/fe/core/controls/Any.js +1 -1
  81. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +5 -5
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -3
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FileWrapper.js +8 -3
  89. package/src/sap/fe/core/controls/FileWrapper.ts +5 -1
  90. package/src/sap/fe/core/controls/FilterBar.js +2 -2
  91. package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
  92. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  93. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  94. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +48 -17
  95. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +2 -2
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +2 -2
  98. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -3
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +2 -2
  100. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +2 -2
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +1 -1
  103. package/src/sap/fe/core/converters/ConverterContext.js +23 -2
  104. package/src/sap/fe/core/converters/ConverterContext.ts +34 -9
  105. package/src/sap/fe/core/converters/ManifestSettings.js +19 -18
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +53 -47
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  108. package/src/sap/fe/core/converters/MetaModelConverter.js +32 -10
  109. package/src/sap/fe/core/converters/MetaModelConverter.ts +42 -19
  110. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  111. package/src/sap/fe/core/converters/annotations/DataField.js +5 -2
  112. package/src/sap/fe/core/converters/annotations/DataField.ts +5 -1
  113. package/src/sap/fe/core/converters/common/AnnotationConverter.js +69 -23
  114. package/src/sap/fe/core/converters/controls/Common/Action.js +98 -51
  115. package/src/sap/fe/core/converters/controls/Common/Action.ts +121 -44
  116. package/src/sap/fe/core/converters/controls/Common/Chart.js +31 -34
  117. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -34
  118. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  119. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +43 -7
  120. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -33
  121. package/src/sap/fe/core/converters/controls/Common/Form.js +8 -6
  122. package/src/sap/fe/core/converters/controls/Common/Form.ts +11 -14
  123. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  124. package/src/sap/fe/core/converters/controls/Common/KPI.ts +16 -15
  125. package/src/sap/fe/core/converters/controls/Common/Table.js +188 -157
  126. package/src/sap/fe/core/converters/controls/Common/Table.ts +279 -230
  127. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  128. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +57 -21
  130. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +71 -18
  131. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +30 -8
  132. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +24 -7
  133. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  134. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +43 -34
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +37 -25
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +85 -49
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +74 -50
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +54 -4
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +56 -8
  140. package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
  141. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +6 -4
  142. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +10 -2
  143. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +182 -0
  144. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +167 -0
  145. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  146. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  147. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  148. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  149. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  150. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -3
  151. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  152. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +8 -14
  153. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +6 -9
  154. package/src/sap/fe/core/converters/templates/ListReportConverter.js +31 -31
  155. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +54 -47
  156. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +44 -15
  157. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +64 -30
  158. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  159. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  160. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  161. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  162. package/src/sap/fe/core/formatters/StandardFormatter.js +13 -6
  163. package/src/sap/fe/core/formatters/StandardFormatter.ts +20 -14
  164. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  166. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  167. package/src/sap/fe/core/fpm/Component.js +33 -7
  168. package/src/sap/fe/core/fpm/Component.ts +14 -0
  169. package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
  170. package/src/sap/fe/core/helpers/AppStartupHelper.js +5 -4
  171. package/src/sap/fe/core/helpers/AppStartupHelper.ts +4 -3
  172. package/src/sap/fe/core/helpers/BindingToolkit.js +56 -24
  173. package/src/sap/fe/core/helpers/BindingToolkit.ts +67 -21
  174. package/src/sap/fe/core/helpers/ClassSupport.js +31 -3
  175. package/src/sap/fe/core/helpers/ClassSupport.ts +24 -1
  176. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  177. package/src/sap/fe/core/helpers/EditState.js +1 -1
  178. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  179. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  181. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  182. package/src/sap/fe/core/helpers/LoaderUtils.js +39 -0
  183. package/src/sap/fe/core/helpers/LoaderUtils.ts +14 -0
  184. package/src/sap/fe/core/helpers/MassEditHelper.js +475 -99
  185. package/src/sap/fe/core/helpers/MassEditHelper.ts +468 -155
  186. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  187. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  188. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  189. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  190. package/src/sap/fe/core/helpers/SemanticDateOperators.js +82 -36
  191. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +52 -36
  192. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/SideEffectsHelper.js +146 -0
  194. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +128 -0
  195. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  197. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  198. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  199. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  200. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  201. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
  202. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
  203. package/src/sap/fe/core/jsx-runtime/jsx-control.js +119 -0
  204. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +98 -0
  205. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  206. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  207. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  208. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  209. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  210. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
  211. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
  212. package/src/sap/fe/core/library.js +2 -2
  213. package/src/sap/fe/core/library.support.js +1 -1
  214. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  215. package/src/sap/fe/core/messagebundle.properties +4 -41
  216. package/src/sap/fe/core/messagebundle_ar.properties +22 -45
  217. package/src/sap/fe/core/messagebundle_bg.properties +22 -45
  218. package/src/sap/fe/core/messagebundle_ca.properties +22 -45
  219. package/src/sap/fe/core/messagebundle_cs.properties +22 -45
  220. package/src/sap/fe/core/messagebundle_cy.properties +21 -44
  221. package/src/sap/fe/core/messagebundle_da.properties +22 -45
  222. package/src/sap/fe/core/messagebundle_de.properties +22 -45
  223. package/src/sap/fe/core/messagebundle_el.properties +22 -45
  224. package/src/sap/fe/core/messagebundle_en.properties +21 -44
  225. package/src/sap/fe/core/messagebundle_en_GB.properties +21 -44
  226. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +21 -42
  227. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -40
  228. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -42
  229. package/src/sap/fe/core/messagebundle_es.properties +22 -45
  230. package/src/sap/fe/core/messagebundle_es_MX.properties +22 -45
  231. package/src/sap/fe/core/messagebundle_et.properties +22 -45
  232. package/src/sap/fe/core/messagebundle_fi.properties +22 -45
  233. package/src/sap/fe/core/messagebundle_fr.properties +21 -44
  234. package/src/sap/fe/core/messagebundle_fr_CA.properties +20 -43
  235. package/src/sap/fe/core/messagebundle_hi.properties +22 -45
  236. package/src/sap/fe/core/messagebundle_hr.properties +22 -45
  237. package/src/sap/fe/core/messagebundle_hu.properties +22 -45
  238. package/src/sap/fe/core/messagebundle_id.properties +22 -45
  239. package/src/sap/fe/core/messagebundle_it.properties +22 -45
  240. package/src/sap/fe/core/messagebundle_iw.properties +22 -45
  241. package/src/sap/fe/core/messagebundle_ja.properties +22 -45
  242. package/src/sap/fe/core/messagebundle_kk.properties +22 -45
  243. package/src/sap/fe/core/messagebundle_ko.properties +27 -50
  244. package/src/sap/fe/core/messagebundle_lt.properties +22 -45
  245. package/src/sap/fe/core/messagebundle_lv.properties +22 -45
  246. package/src/sap/fe/core/messagebundle_ms.properties +22 -45
  247. package/src/sap/fe/core/messagebundle_nl.properties +24 -47
  248. package/src/sap/fe/core/messagebundle_no.properties +22 -45
  249. package/src/sap/fe/core/messagebundle_pl.properties +23 -46
  250. package/src/sap/fe/core/messagebundle_pt.properties +23 -46
  251. package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -45
  252. package/src/sap/fe/core/messagebundle_ro.properties +22 -45
  253. package/src/sap/fe/core/messagebundle_ru.properties +22 -45
  254. package/src/sap/fe/core/messagebundle_sh.properties +22 -45
  255. package/src/sap/fe/core/messagebundle_sk.properties +22 -45
  256. package/src/sap/fe/core/messagebundle_sl.properties +22 -45
  257. package/src/sap/fe/core/messagebundle_sv.properties +22 -45
  258. package/src/sap/fe/core/messagebundle_th.properties +20 -43
  259. package/src/sap/fe/core/messagebundle_tr.properties +22 -45
  260. package/src/sap/fe/core/messagebundle_uk.properties +22 -45
  261. package/src/sap/fe/core/messagebundle_vi.properties +22 -45
  262. package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -45
  263. package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -45
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +102 -74
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +62 -63
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
  268. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -8
  269. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -7
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ShellServicesFactory.js +22 -2
  273. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -0
  274. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +2 -2
  276. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +251 -200
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +160 -144
  278. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  279. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  280. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  281. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  282. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  285. package/src/sap/fe/core/templating/CommonFormatters.js +4 -3
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +5 -1
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  288. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  289. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -1
  290. package/src/sap/fe/core/templating/DataModelPathHelper.ts +5 -2
  291. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  292. package/src/sap/fe/core/templating/EntitySetHelper.js +4 -5
  293. package/src/sap/fe/core/templating/EntitySetHelper.ts +4 -3
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  295. package/src/sap/fe/core/templating/FilterHelper.js +34 -15
  296. package/src/sap/fe/core/templating/FilterHelper.ts +28 -12
  297. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  298. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  299. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  300. package/src/sap/fe/core/templating/UIFormatters.js +5 -3
  301. package/src/sap/fe/core/templating/UIFormatters.ts +7 -5
  302. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  303. package/src/sap/fe/core/type/Email.js +2 -2
@@ -16,9 +16,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
16
16
  var Activity = CollaborationCommon.Activity;
17
17
  var send = ActivitySync.send;
18
18
 
19
+ function _catch(body, recover) {
20
+ try {
21
+ var result = body();
22
+ } catch (e) {
23
+ return recover(e);
24
+ }
25
+
26
+ if (result && result.then) {
27
+ return result.then(void 0, recover);
28
+ }
29
+
30
+ return result;
31
+ }
32
+
19
33
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
20
34
 
21
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
35
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
22
36
 
23
37
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
24
38
 
@@ -137,11 +151,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
137
151
 
138
152
  if (!oTable || !oTable.isA("sap.ui.mdc.Table")) {
139
153
  throw new Error("parameter controlId missing or incorrect");
154
+ } else {
155
+ mParameters.parentControl = oTable;
140
156
  }
141
157
 
142
158
  var oListBinding = oTable.getRowBinding();
143
159
  mParameters.bFindActiveContexts = true;
144
- BusyLocker.lock(oLockObject);
160
+ BusyLocker.lock(oLockObject); // Check if a displayed view can be impacted by the deletion, i.e. if there's an OP displaying a deleted object.
161
+ // We have to check this before the contexts are deleted (after, the contexts are invalid)
162
+
163
+ var navigateBackFromContext = aContexts.find(function (context) {
164
+ return oRoutingListener.isCurrentStateImpactedBy(context);
165
+ });
145
166
  return this.deleteDocumentTransaction(aContexts, mParameters).then(function () {
146
167
  var oResult; // Multiple object deletion is triggered from a list
147
168
  // First clear the selection in the table as it's not valid any more
@@ -171,14 +192,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
171
192
  EditState.setEditStateDirty();
172
193
  send(_this2.getView(), Activity.Delete, aContexts.map(function (context) {
173
194
  return context.getPath();
174
- })); // Finally, check if the current state can be impacted by the deletion, i.e. if there's
175
- // an OP displaying a deleted object. If yes navigate back to dismiss the OP
195
+ })); // Navigate back from a deleted context if needed
176
196
 
177
- for (var index = 0; index < aContexts.length; index++) {
178
- if (oRoutingListener.isCurrentStateImpactedBy(aContexts[index])) {
179
- oRoutingListener.navigateBackFromContext(aContexts[index]);
180
- break;
181
- }
197
+ if (navigateBackFromContext) {
198
+ oRoutingListener.navigateBackFromContext(navigateBackFromContext);
182
199
  }
183
200
 
184
201
  return oResult;
@@ -200,47 +217,58 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
200
217
  ;
201
218
 
202
219
  _proto.computeEditMode = function computeEditMode(oContext) {
203
- var _this3 = this;
220
+ try {
221
+ var _this4 = this;
204
222
 
205
- var sCustomAction = this.getInternalModel().getProperty("/sCustomAction");
206
- return Promise.resolve(function () {
207
- var sProgrammingModel = _this3.getProgrammingModel(oContext);
223
+ var sCustomAction = _this4.getInternalModel().getProperty("/sCustomAction");
208
224
 
209
- if (sProgrammingModel === ProgrammingModel.Draft) {
210
- _this3.setDraftStatus(DraftStatus.Clear);
225
+ var sProgrammingModel = _this4.getProgrammingModel(oContext);
226
+
227
+ return Promise.resolve(function () {
228
+ if (sProgrammingModel === ProgrammingModel.Draft) {
229
+ return _catch(function () {
230
+ _this4.setDraftStatus(DraftStatus.Clear);
211
231
 
212
- return oContext.requestObject("IsActiveEntity").then(function (bIsActiveEntity) {
213
- if (bIsActiveEntity === false) {
214
- // in case the document is draft set it in edit mode
215
- _this3.setEditMode(EditMode.Editable);
232
+ return Promise.resolve(oContext.requestObject("IsActiveEntity")).then(function (bIsActiveEntity) {
233
+ var _temp = function () {
234
+ if (bIsActiveEntity === false) {
235
+ // in case the document is draft set it in edit mode
236
+ _this4.setEditMode(EditMode.Editable);
216
237
 
217
- return oContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
218
- _this3.setEditMode(undefined, !bHasActiveEntity);
238
+ return Promise.resolve(oContext.requestObject("HasActiveEntity")).then(function (bHasActiveEntity) {
239
+ _this4.setEditMode(undefined, !bHasActiveEntity);
240
+ });
241
+ } else {
242
+ // active document, stay on display mode
243
+ _this4.setEditMode(EditMode.Display, false);
244
+ }
245
+ }();
246
+
247
+ if (_temp && _temp.then) return _temp.then(function () {});
219
248
  });
220
- } else {
221
- // active document, stay on display mode
222
- _this3.setEditMode(EditMode.Display, false);
223
- }
224
- }).catch(function (oError) {
225
- Log.error("Error while determining the editMode for draft", oError);
226
- throw oError;
227
- });
228
- } else if (sProgrammingModel === ProgrammingModel.Sticky) {
229
- if (sCustomAction && sCustomAction !== "" && _this3._hasNewActionForSticky(oContext, _this3.getView(), sCustomAction)) {
230
- _this3.getTransactionHelper()._bCreateMode = true;
249
+ }, function (oError) {
250
+ Log.error("Error while determining the editMode for draft", oError);
251
+ throw oError;
252
+ });
253
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
254
+ if (sCustomAction && sCustomAction !== "" && _this4._hasNewActionForSticky(oContext, _this4.getView(), sCustomAction)) {
255
+ _this4.getTransactionHelper()._bCreateMode = true;
231
256
 
232
- _this3.getTransactionHelper().handleDocumentModifications();
257
+ _this4.getTransactionHelper().handleDocumentModifications();
233
258
 
234
- _this3.setEditMode(EditMode.Editable, true);
259
+ _this4.setEditMode(EditMode.Editable, true);
235
260
 
236
- EditState.setEditStateDirty();
261
+ EditState.setEditStateDirty();
237
262
 
238
- _this3.handleStickyOn(oContext);
263
+ _this4.handleStickyOn(oContext);
239
264
 
240
- _this3.getInternalModel().setProperty("/sCustomAction", "");
265
+ _this4.getInternalModel().setProperty("/sCustomAction", "");
266
+ }
241
267
  }
242
- }
243
- }());
268
+ }());
269
+ } catch (e) {
270
+ return Promise.reject(e);
271
+ }
244
272
  }
245
273
  /**
246
274
  * Sets the edit mode.
@@ -330,7 +358,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
330
358
 
331
359
  _proto.deleteDocumentTransaction = function deleteDocumentTransaction(oContext, mParameters) {
332
360
  var _sap$ui$getCore$byId,
333
- _this4 = this;
361
+ _this5 = this;
334
362
 
335
363
  var oResourceBundle = this.getView().getController().oResourceBundle,
336
364
  transactionHelper = this.getTransactionHelper();
@@ -339,7 +367,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
339
367
 
340
368
  mParameters.internalModelContext = mParameters.controlId ? (_sap$ui$getCore$byId = sap.ui.getCore().byId(mParameters.controlId)) === null || _sap$ui$getCore$byId === void 0 ? void 0 : _sap$ui$getCore$byId.getBindingContext("internal") : null;
341
369
  return this.syncTask().then(transactionHelper.deleteDocument.bind(transactionHelper, oContext, mParameters, oResourceBundle, this.getMessageHandler())).then(function () {
342
- var internalModel = _this4.getInternalModel();
370
+ var internalModel = _this5.getInternalModel();
343
371
 
344
372
  internalModel.setProperty("/sessionOn", false);
345
373
  internalModel.setProperty("/stickySessionToken", undefined);
@@ -356,7 +384,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
356
384
  ;
357
385
 
358
386
  _proto.handleCreateEvents = function handleCreateEvents(oBinding) {
359
- var _this5 = this;
387
+ var _this6 = this;
360
388
 
361
389
  var transactionHelper = this.getTransactionHelper();
362
390
  this.setDraftStatus(DraftStatus.Clear);
@@ -366,17 +394,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
366
394
  transactionHelper.handleDocumentModifications();
367
395
 
368
396
  if (sProgrammingModel === ProgrammingModel.Draft) {
369
- _this5.setDraftStatus(DraftStatus.Saving);
397
+ _this6.setDraftStatus(DraftStatus.Saving);
370
398
  }
371
399
  });
372
400
  oBinding.attachEvent("createCompleted", function (oEvent) {
373
401
  var bSuccess = oEvent.getParameter("success");
374
402
 
375
403
  if (sProgrammingModel === ProgrammingModel.Draft) {
376
- _this5.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
404
+ _this6.setDraftStatus(bSuccess ? DraftStatus.Saved : DraftStatus.Clear);
377
405
  }
378
406
 
379
- _this5.getMessageHandler().showMessageDialog();
407
+ _this6.getMessageHandler().showMessageDialog();
380
408
  });
381
409
  };
382
410
 
@@ -403,7 +431,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
403
431
  ;
404
432
 
405
433
  _proto.createActionPromise = function createActionPromise(sActionName, sControlId) {
406
- var _this6 = this;
434
+ var _this7 = this;
407
435
 
408
436
  var fResolver, fRejector;
409
437
  this.oActionPromise = new Promise(function (resolve, reject) {
@@ -412,7 +440,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
412
440
  }).then(function (oResponse) {
413
441
  return Object.assign({
414
442
  controlId: sControlId
415
- }, _this6.getActionResponseDataAndKeys(sActionName, oResponse));
443
+ }, _this7.getActionResponseDataAndKeys(sActionName, oResponse));
416
444
  });
417
445
  return {
418
446
  fResolver: fResolver,
@@ -564,7 +592,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
564
592
  ;
565
593
 
566
594
  _proto.onBackNavigationInSession = function onBackNavigationInSession() {
567
- var _this7 = this;
595
+ var _this8 = this;
568
596
 
569
597
  var oView = this.getView(),
570
598
  oAppComponent = CommonUtils.getAppComponent(oView),
@@ -573,7 +601,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
573
601
  if (oRouterProxy.checkIfBackIsOutOfGuard()) {
574
602
  var oBindingContext = oView && oView.getBindingContext();
575
603
  sticky.processDataLossConfirmation(function () {
576
- _this7.discardStickySession(oBindingContext);
604
+ _this8.discardStickySession(oBindingContext);
577
605
 
578
606
  history.back();
579
607
  }, oView, this.getProgrammingModel(oBindingContext));
@@ -669,7 +697,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
669
697
  };
670
698
 
671
699
  _proto._attachSessionTimeout = function _attachSessionTimeout(oContext, i18nModel) {
672
- var _this8 = this;
700
+ var _this9 = this;
673
701
 
674
702
  return function () {
675
703
  try {
@@ -678,7 +706,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
678
706
  } // remove transient messages since we will showing our own message
679
707
 
680
708
 
681
- _this8.getMessageHandler().removeTransitionMessages();
709
+ _this9.getMessageHandler().removeTransitionMessages();
682
710
 
683
711
  var oDialog = new Dialog({
684
712
  title: "{sap.fe.i18n>C_EDITFLOW_OBJECT_PAGE_SESSION_EXPIRED_DIALOG_TITLE}",
@@ -691,9 +719,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
691
719
  type: "Emphasized",
692
720
  press: function () {
693
721
  // remove sticky handling after navigation since session has already been terminated
694
- _this8.handleStickyOff();
722
+ _this9.handleStickyOff();
695
723
 
696
- _this8.getRoutingListener().navigateBackFromContext(oContext);
724
+ _this9.getRoutingListener().navigateBackFromContext(oContext);
697
725
  }
698
726
  }),
699
727
  afterClose: function () {
@@ -703,7 +731,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
703
731
  oDialog.addStyleClass("sapUiContentPadding");
704
732
  oDialog.setModel(i18nModel, "sap.fe.i18n");
705
733
 
706
- _this8.getView().addDependent(oDialog);
734
+ _this9.getView().addDependent(oDialog);
707
735
 
708
736
  oDialog.open();
709
737
  } catch (error) {
@@ -741,4 +769,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
741
769
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setCreationMode", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "setCreationMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createMultipleDocuments", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "createMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "computeEditMode", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "computeEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setEditMode", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "setEditMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setDraftStatus", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "setDraftStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRoutingListener", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "getRoutingListener"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getGlobalUIModel", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "getGlobalUIModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "syncTask", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "syncTask"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getProgrammingModel", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "getProgrammingModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocumentTransaction", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocumentTransaction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleCreateEvents", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "handleCreateEvents"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getTransactionHelper", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "getTransactionHelper"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getInternalModel", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "getInternalModel"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createActionPromise", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "createActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getCurrentActionPromise", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "getCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteCurrentActionPromise", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteCurrentActionPromise"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getActionResponseDataAndKeys", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "getActionResponseDataAndKeys"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getMessageHandler", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "getMessageHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOn", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOn"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleStickyOff", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "handleStickyOff"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBackNavigationInSession", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "onBackNavigationInSession"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "discardStickySession", [_dec47, _dec48], Object.getOwnPropertyDescriptor(_class2.prototype, "discardStickySession"), _class2.prototype)), _class2)) || _class);
742
770
  return InternalEditFlow;
743
771
  }, false);
744
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwibmFtZXMiOlsiUHJvZ3JhbW1pbmdNb2RlbCIsIkZFTGlicmFyeSIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJDcmVhdGlvbk1vZGUiLCJJbnRlcm5hbEVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50Iiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0xpc3RCaW5kaW5nIiwiYURhdGEiLCJiQ3JlYXRlQXRFbmQiLCJiRnJvbUNvcHlQYXN0ZSIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiYkluYWN0aXZlIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Mb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiQnVzeUxvY2tlciIsImxvY2siLCJhRmluYWxDb250ZXh0cyIsInN5bmNUYXNrIiwidGhlbiIsImNvbnRleHRQYXRoIiwiZ2V0UGF0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0Q29udGV4dCIsImdldE1ldGFQYXRoIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiYUNyZWF0aW9uUHJvbWlzZXMiLCJtYXAiLCJtUHJvcGVydHlWYWx1ZXMiLCJtUGFyYW1ldGVycyIsImRhdGEiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsInBhcmVudENvbnRyb2wiLCJjcmVhdGVBdEVuZCIsImluYWN0aXZlIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsImdldE9iamVjdCIsIiRraW5kIiwiY3JlYXRlRG9jdW1lbnQiLCJnZXRNZXNzYWdlSGFuZGxlciIsImFsbCIsImFDb250ZXh0cyIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsInJlamVjdCIsImZpbmFsbHkiLCJ1bmxvY2siLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJvVGFibGUiLCJieUlkIiwiY29udHJvbElkIiwiaXNBIiwiRXJyb3IiLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJvUmVzdWx0IiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJzZW5kIiwiQWN0aXZpdHkiLCJEZWxldGUiLCJjb250ZXh0IiwiaW5kZXgiLCJsZW5ndGgiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9FcnJvciIsImNvbXB1dGVFZGl0TW9kZSIsIm9Db250ZXh0Iiwic0N1c3RvbUFjdGlvbiIsImdldEludGVybmFsTW9kZWwiLCJnZXRQcm9wZXJ0eSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIkRyYWZ0Iiwic2V0RHJhZnRTdGF0dXMiLCJDbGVhciIsInJlcXVlc3RPYmplY3QiLCJiSXNBY3RpdmVFbnRpdHkiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwiYkhhc0FjdGl2ZUVudGl0eSIsInVuZGVmaW5lZCIsIkRpc3BsYXkiLCJTdGlja3kiLCJfaGFzTmV3QWN0aW9uRm9yU3RpY2t5IiwiX2JDcmVhdGVNb2RlIiwiaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zIiwiaGFuZGxlU3RpY2t5T24iLCJzZXRQcm9wZXJ0eSIsInNFZGl0TW9kZSIsIm9HbG9iYWxNb2RlbCIsInNEcmFmdFN0YXRlIiwiX3JvdXRpbmciLCJ2VGFzayIsImZuTmV3VGFzayIsIl9wVGFza3MiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImRlbGV0ZURvY3VtZW50IiwiYmluZCIsImludGVybmFsTW9kZWwiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJhdHRhY2hFdmVudCIsIlNhdmluZyIsIm9FdmVudCIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiU2F2ZWQiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9vVHJhbnNhY3Rpb25IZWxwZXIiLCJUcmFuc2FjdGlvbkhlbHBlciIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJzQWN0aW9uTmFtZSIsInNDb250cm9sSWQiLCJmUmVzb2x2ZXIiLCJmUmVqZWN0b3IiLCJvQWN0aW9uUHJvbWlzZSIsIm9SZXNwb25zZSIsIk9iamVjdCIsImFzc2lnbiIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiQXJyYXkiLCJpc0FycmF5Iiwib1ZpZXciLCJnZXREYXRhIiwic0FjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiYUtleSIsIiRLZXkiLCJvRGF0YSIsImtleXMiLCJtZXNzYWdlSGFuZGxlciIsIm9BcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsImhhc05hdmlnYXRpb25HdWFyZCIsInNIYXNoVHJhY2tlciIsImdldEhhc2giLCJvSW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZm5EaXJ0eVN0YXRlUHJvdmlkZXIiLCJfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsImZuSGFuZGxlU2Vzc2lvblRpbWVvdXQiLCJfYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJhdHRhY2hTZXNzaW9uVGltZW91dCIsImZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbiIsIl9hdHRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImluZm8iLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImRldGFjaFNlc3Npb25UaW1lb3V0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwib1JvdXRlclByb3h5IiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJzdGlja3kiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImhpc3RvcnkiLCJiYWNrIiwiZGlzY2FyZERvY3VtZW50IiwiaW5kZXhPZiIsIm9TdGlja3lTZXNzaW9uIiwiTmV3QWN0aW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJmaW5kIiwic0FkZGl0aW9uYWxBY3Rpb24iLCJvTmF2aWdhdGlvbkNvbnRleHQiLCJzVGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJzTGNsSGFzaFRyYWNrZXIiLCJiRGlydHkiLCJiU2Vzc2lvbk9OIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJvRm5Db250ZXh0Iiwic0N1cnJlbnRIYXNoIiwic2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwib1Jvd0JpbmRpbmciLCJpQWN0aXZlUm93SW5kZXgiLCJnZXRDb3VudCIsInNjcm9sbFRvSW5kZXgiLCJmb2N1c1JvdyIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxNQUFNQSxnQkFBZ0IsR0FBR0MsU0FBUyxDQUFDRCxnQkFBbkM7QUFBQSxNQUNDRSxXQUFXLEdBQUdELFNBQVMsQ0FBQ0MsV0FEekI7QUFBQSxNQUVDQyxRQUFRLEdBQUdGLFNBQVMsQ0FBQ0UsUUFGdEI7QUFBQSxNQUdDQyxZQUFZLEdBQUdILFNBQVMsQ0FBQ0csWUFIMUI7TUFNTUMsZ0IsV0FETEMsY0FBYyxDQUFDLG1EQUFELEMsVUFVYkMsY0FBYyxFLFVBYWRDLGdCQUFnQixFLFVBQ2hCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFVBS1ZDLGVBQWUsRSxVQUNmQyxjQUFjLEUsVUFtR2RELGVBQWUsRSxVQUNmQyxjQUFjLEUsVUE4RWRELGVBQWUsRSxXQUNmQyxjQUFjLEUsV0FnRGRELGVBQWUsRSxXQUNmQyxjQUFjLEUsV0FpQmRELGVBQWUsRSxXQUNmQyxjQUFjLEUsV0FPZEQsZUFB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VUFBTTBLLFdBQVcsR0FBRzFLLE1BQU0sQ0FBQ0ssYUFBUCxFQUFwQjtBQUNBLFVBQU1zSyxlQUFlLEdBQUdELFdBQVcsQ0FBQ0UsUUFBWixNQUEwQixDQUFsRDs7QUFDQSxVQUFJRCxlQUFlLEdBQUcsQ0FBdEIsRUFBeUI7QUFDeEIzSyxRQUFBQSxNQUFNLENBQUM2SyxhQUFQLENBQXFCRixlQUFlLEdBQUcsQ0FBdkM7QUFDQTNLLFFBQUFBLE1BQU0sQ0FBQzhLLFFBQVAsQ0FBZ0JILGVBQWhCLEVBQWlDLElBQWpDO0FBQ0EsT0FIRCxNQUdPO0FBQ04zSyxRQUFBQSxNQUFNLENBQUM4SyxRQUFQLENBQWdCSCxlQUFoQixFQUFpQyxJQUFqQztBQUNBO0FBQ0QsSzs7O0lBbHdCNkJJLG1CO1NBcXdCaEJuUSxnQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0ZXh0ZW5zaWJsZSxcblx0ZmluYWxFeHRlbnNpb24sXG5cdG1ldGhvZE92ZXJyaWRlLFxuXHRwcml2YXRlRXh0ZW5zaW9uLFxuXHRwdWJsaWNFeHRlbnNpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0Q3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1wiKVxuY2xhc3MgSW50ZXJuYWxFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9wVGFza3M6IGFueTtcblx0cHJpdmF0ZSBvQWN0aW9uUHJvbWlzZT86IFByb21pc2U8YW55Pjtcblx0cHJpdmF0ZSBfb1RyYW5zYWN0aW9uSGVscGVyPzogVHJhbnNhY3Rpb25IZWxwZXI7XG5cdHByaXZhdGUgZm5EaXJ0eVN0YXRlUHJvdmlkZXI/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBmbkhhbmRsZVNlc3Npb25UaW1lb3V0PzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE92ZXJyaWRlIHRvIHNldCB0aGUgY3JlYXRpb24gbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3cjc2V0Q3JlYXRpb25Nb2RlXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0c2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdG9MaXN0QmluZGluZzogYW55LFxuXHRcdGFEYXRhOiBhbnksXG5cdFx0YkNyZWF0ZUF0RW5kOiBhbnksXG5cdFx0YkZyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IGFueSxcblx0XHRiSW5hY3RpdmU/OiBib29sZWFuXG5cdCkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdGxldCBhRmluYWxDb250ZXh0czogYW55W10gPSBbXTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBiZWZvcmVDcmVhdGVDYWxsQmFja1xuXHRcdFx0XHRcdD8gYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCkgfSlcblx0XHRcdFx0XHQ6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHtvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXG5cdFx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRcdGNvbnN0IGFDcmVhdGlvblByb21pc2VzID0gYURhdGEubWFwKChtUHJvcGVydHlWYWx1ZXM6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSB7IGRhdGE6IHt9IH07XG5cblx0XHRcdFx0XHRtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIk5vbmVcIjtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gYkNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmluYWN0aXZlID0gYkluYWN0aXZlO1xuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzUHJvcGVydHlQYXRoIGluIG1Qcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF0pIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVtzUHJvcGVydHlQYXRoXSA9IG1Qcm9wZXJ0eVZhbHVlc1tzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRcdGJGcm9tQ29weVBhc3RlLFxuXHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYUNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChhQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0YUZpbmFsQ29udGV4dHMgPSBhQ29udGV4dHM7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvTmV3Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoIW9OZXdDb250ZXh0LmJJbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFGaW5hbENvbnRleHRzO1xuXHRcdFx0fSk7XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgb1JvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0Um91dGluZ0xpc3RlbmVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBUYWJsZTtcblx0XHRpZiAoIW9UYWJsZSB8fCAhb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fVxuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkgYXMgYW55O1xuXHRcdG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0cmV0dXJuIHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihhQ29udGV4dHMsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRsZXQgb1Jlc3VsdDtcblxuXHRcdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHRcdC8vIEZpcnN0IGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFzIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlXG5cdFx0XHRcdChvVGFibGUgYXMgYW55KS5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0XHRcdC8vIFRoZW4gcmVmcmVzaCB0aGUgbGlzdC1iaW5kaW5nIChMUiksIG9yIHJlcXVpcmUgc2lkZS1lZmZlY3RzIChPUClcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0aWYgKG9MaXN0QmluZGluZy5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdFx0b1Jlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSBlbHNlIGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KG9MaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblxuXHRcdFx0XHRzZW5kKFxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdEFjdGl2aXR5LkRlbGV0ZSxcblx0XHRcdFx0XHRhQ29udGV4dHMubWFwKChjb250ZXh0OiBDb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBGaW5hbGx5LCBjaGVjayBpZiB0aGUgY3VycmVudCBzdGF0ZSBjYW4gYmUgaW1wYWN0ZWQgYnkgdGhlIGRlbGV0aW9uLCBpLmUuIGlmIHRoZXJlJ3Ncblx0XHRcdFx0Ly8gYW4gT1AgZGlzcGxheWluZyBhIGRlbGV0ZWQgb2JqZWN0LiBJZiB5ZXMgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYUNvbnRleHRzLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0XHRcdGlmIChvUm91dGluZ0xpc3RlbmVyLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShhQ29udGV4dHNbaW5kZXhdKSkge1xuXHRcdFx0XHRcdFx0b1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChhQ29udGV4dHNbaW5kZXhdKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50KHMpXCIsIG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY29tcHV0ZUVkaXRNb2RlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbEVkaXRGbG93XG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjb21wdXRlRWRpdE1vZGUob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IHNDdXN0b21BY3Rpb24gPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9zQ3VzdG9tQWN0aW9uXCIpO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHQoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHRcblx0XHRcdFx0XHRcdC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIilcblx0XHRcdFx0XHRcdC50aGVuKChiSXNBY3RpdmVFbnRpdHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYklzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0IHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKS50aGVuKChiSGFzQWN0aXZlRW50aXR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhYkhhc0FjdGl2ZUVudGl0eSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWN0aXZlIGRvY3VtZW50LCBzdGF5IG9uIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdGlmIChzQ3VzdG9tQWN0aW9uICYmIHNDdXN0b21BY3Rpb24gIT09IFwiXCIgJiYgdGhpcy5faGFzTmV3QWN0aW9uRm9yU3RpY2t5KG9Db250ZXh0LCB0aGlzLmdldFZpZXcoKSwgc0N1c3RvbUFjdGlvbikpIHtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5fYkNyZWF0ZU1vZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24ob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvc0N1c3RvbUFjdGlvblwiLCBcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pKClcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIHNFZGl0TW9kZVxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBDcmVhdGVNb2RlIGZsYWcgdG8gaWRlbnRpZnkgdGhlIGNyZWF0aW9uIG1vZGVcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZXRFZGl0TW9kZShzRWRpdE1vZGU/OiBzdHJpbmcsIGJDcmVhdGlvbk1vZGU/OiBib29sZWFuKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBvR2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChzRWRpdE1vZGUpIHtcblx0XHRcdG9HbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIHNFZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmIChiQ3JlYXRpb25Nb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZSk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHNldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlOiBhbnkpIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBzRHJhZnRTdGF0ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRSb3V0aW5nTGlzdGVuZXIoKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgRlBNIGN1c3RvbSBwYWdlcyBhbmQgdGhlIHJvdXRpbmdcblx0XHQvLyBsaXN0ZW5lciBpcyBub3QgeWV0IHB1YmxpYyB0aGVyZWZvcmUga2VlcCB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc3luY1Rhc2tcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIFt2VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN5bmNUYXNrKHZUYXNrPzogRnVuY3Rpb24gfCBQcm9taXNlPGFueT4pIHtcblx0XHRsZXQgZm5OZXdUYXNrO1xuXHRcdGlmICh2VGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcblx0XHRcdGZuTmV3VGFzayA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHZUYXNrO1xuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSB2VGFzaztcblx0XHR9XG5cblx0XHR0aGlzLl9wVGFza3MgPSB0aGlzLl9wVGFza3MgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKGZuTmV3VGFzaykge1xuXHRcdFx0dGhpcy5fcFRhc2tzID0gdGhpcy5fcFRhc2tzLnRoZW4oZm5OZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9wVGFza3M7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dD86IGFueSk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdFx0XHQ/IHNhcC51aS5nZXRDb3JlKCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQuYmluZCh0cmFuc2FjdGlvbkhlbHBlciwgb0NvbnRleHQsIG1QYXJhbWV0ZXJzLCBvUmVzb3VyY2VCdW5kbGUsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSlcblx0XHRcdClcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9CaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmc6IGFueSkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRvQmluZGluZyA9IChvQmluZGluZy5nZXRCaW5kaW5nICYmIG9CaW5kaW5nLmdldEJpbmRpbmcoKSkgfHwgb0JpbmRpbmc7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0JpbmRpbmcpO1xuXG5cdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVTZW50XCIsICgpID0+IHtcblx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvQmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IGJTdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhiU3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0aWYgKCF0aGlzLl9vVHJhbnNhY3Rpb25IZWxwZXIpIHtcblx0XHRcdC8vIGN1cnJlbnRseSBhbHNvIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgbG9ja2luZyB0aGVyZWZvcmUgcGFzc2luZyBsb2NrIG9iamVjdFxuXHRcdFx0dGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyID0gbmV3IFRyYW5zYWN0aW9uSGVscGVyKHRoaXMuX29BcHBDb21wb25lbnQsIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdGxldCBmUmVzb2x2ZXIsIGZSZWplY3Rvcjtcblx0XHR0aGlzLm9BY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0ZlJlc29sdmVyID0gcmVzb2x2ZTtcblx0XHRcdGZSZWplY3RvciA9IHJlamVjdDtcblx0XHR9KS50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQ6IHNDb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IGZSZXNvbHZlciwgZlJlamVjdG9yOiBmUmVqZWN0b3IgfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSBvYmplY3QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0Q3VycmVudEFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHByb21pc2Vcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5vQWN0aW9uUHJvbWlzZTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHR0aGlzLm9BY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9SZXNwb25zZTogYW55KSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKSkge1xuXHRcdFx0aWYgKG9SZXNwb25zZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0b1Jlc3BvbnNlID0gb1Jlc3BvbnNlWzBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghb1Jlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSAob1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLmdldERhdGEoKSxcblx0XHRcdHNBY3Rpb25SZXR1cm5UeXBlID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXSAmJiBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXVswXSAmJiBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZVxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0uJFJldHVyblR5cGUuJFR5cGVcblx0XHRcdFx0XHQ6IG51bGwsXG5cdFx0XHRhS2V5ID0gc0FjdGlvblJldHVyblR5cGUgJiYgb01ldGFNb2RlbFtzQWN0aW9uUmV0dXJuVHlwZV0gPyBvTWV0YU1vZGVsW3NBY3Rpb25SZXR1cm5UeXBlXS4kS2V5IDogbnVsbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvRGF0YTogb1Jlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5czogYUtleVxuXHRcdH07XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0TWVzc2FnZUhhbmRsZXIoKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgRlBNIGN1c3RvbSBwYWdlcyB0aGVyZWZvcmUga2VlcFxuXHRcdC8vIHRoZSBsb2dpYyBoZXJlIGZvciBub3dcblxuXHRcdGlmICh0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiBtZXNzYWdlIGhhbmRsZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGhhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCB8fCBvQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgb3IgQ29udGV4dCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IHNIYXNoVHJhY2tlciA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCksXG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblxuXHRcdFx0XHQvLyBTZXQgYSBndWFyZCBpbiB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0Ly8gQSB0aW1lb3V0IGlzIG5lY2Vzc2FyeSwgYXMgd2l0aCBkZWZlcnJlZCBjcmVhdGlvbiB0aGUgaGFzaENoYW5nZXIgaXMgbm90IHVwZGF0ZWQgeWV0IHdpdGhcblx0XHRcdFx0Ly8gdGhlIG5ldyBoYXNoLCBhbmQgdGhlIGd1YXJkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IG9mIHRoZSByb3V0ZXIgcHJveHlcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChvQ29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcykpO1xuXG5cdFx0XHRcdHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIgPSB0aGlzLl9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihvQXBwQ29tcG9uZW50LCBvSW50ZXJuYWxNb2RlbCwgc0hhc2hUcmFja2VyKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQgPSB0aGlzLl9hdHRhY2hTZXNzaW9uVGltZW91dChvQ29udGV4dCwgaTE4bk1vZGVsKTtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgYW55KS5hdHRhY2hTZXNzaW9uVGltZW91dCh0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpO1xuXG5cdFx0XHRcdHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uID0gdGhpcy5fYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMsIG9Db250ZXh0LCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcikge1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpO1xuXHRcdFx0XHR0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSAmJiB0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgYW55KS5kZXRhY2hTZXNzaW9uVGltZW91dCh0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpO1xuXHRcdFx0fVxuXG5cdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKTtcblx0XHRcdHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb24gTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIG9uQmFja05hdmlnYXRpb25JblNlc3Npb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCkge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KSxcblx0XHRcdG9Sb3V0ZXJQcm94eSA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChvUm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcgJiYgb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0c3RpY2t5LnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24ob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b1ZpZXcsXG5cdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQmluZGluZ0NvbnRleHQpXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KTtcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X2hhc05ld0FjdGlvbkZvclN0aWNreShvQ29udGV4dDogYW55LCBvVmlldzogVmlldywgc0N1c3RvbUFjdGlvbjogc3RyaW5nKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQ29udGV4dCA9PT0gdW5kZWZpbmVkIHx8IG9WaWV3ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBfaGFzTmV3QWN0aW9uRm9yU3RpY2t5XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0c01ldGFQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygwLCBvQ29udGV4dC5nZXRQYXRoKCkuaW5kZXhPZihcIihcIikpLFxuXHRcdFx0XHRvU3RpY2t5U2Vzc2lvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYCk7XG5cblx0XHRcdGlmIChvU3RpY2t5U2Vzc2lvbiAmJiBvU3RpY2t5U2Vzc2lvbi5OZXdBY3Rpb24gJiYgb1N0aWNreVNlc3Npb24uTmV3QWN0aW9uID09PSBzQ3VzdG9tQWN0aW9uKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChvU3RpY2t5U2Vzc2lvbiAmJiBvU3RpY2t5U2Vzc2lvbi5BZGRpdGlvbmFsTmV3QWN0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gc0N1c3RvbUFjdGlvbiA9PT1cblx0XHRcdFx0XHRvU3RpY2t5U2Vzc2lvbi5BZGRpdGlvbmFsTmV3QWN0aW9ucy5maW5kKGZ1bmN0aW9uIChzQWRkaXRpb25hbEFjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc0FkZGl0aW9uYWxBY3Rpb24gPT09IHNDdXN0b21BY3Rpb247XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBvSW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBzSGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiBmdW5jdGlvbiBmbkRpcnR5U3RhdGVQcm92aWRlcihvTmF2aWdhdGlvbkNvbnRleHQ6IGFueSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBmbkRpcnR5U3RhdGVQcm92aWRlclwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRIYXNoID0gb05hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGUsXG5cdFx0XHRcdFx0b1JvdXRlclByb3h5ID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgc0xjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGJEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgYlNlc3Npb25PTiA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWJTZXNzaW9uT04pIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgc3RpY2t5IHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGhhbmQuXG5cdFx0XHRcdFx0Ly8gRWV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghb1JvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRiRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRzTGNsSGFzaFRyYWNrZXIgPSBzVGFyZ2V0SGFzaDtcblx0XHRcdFx0fSBlbHNlIGlmIChzSGFzaFRyYWNrZXIgPT09IHNUYXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0YkRpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChvUm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHNUYXJnZXRIYXNoKSB8fCBvUm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0c0xjbEhhc2hUcmFja2VyID0gc1RhcmdldEhhc2g7XG5cdFx0XHRcdFx0YkRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0YkRpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChiRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0RGlydHlGbGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzSGFzaFRyYWNrZXIgPSBzTGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gYkRpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFNlc3Npb25UaW1lb3V0KG9Db250ZXh0OiBhbnksIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG9Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIGZ1bmN0aW9uIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXRcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmVtb3ZlIHRyYW5zaWVudCBtZXNzYWdlcyBzaW5jZSB3ZSB3aWxsIHNob3dpbmcgb3VyIG93biBtZXNzYWdlXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19USVRMRX1cIixcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfTUVTU0FHRX1cIiB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0NPTU1PTl9ESUFMT0dfT0t9XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFJvdXRlTWF0Y2hlZChvRm5Db250ZXh0OiBhbnksIG9Db250ZXh0OiBhbnksIG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdHJldHVybiBmdW5jdGlvbiBmblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24oKSB7XG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIXNDdXJyZW50SGFzaCB8fCAhb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChzQ3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdG9GbkNvbnRleHQuZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0c2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KG9UYWJsZTogVGFibGUpIHtcblx0XHRjb25zdCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRjb25zdCBpQWN0aXZlUm93SW5kZXggPSBvUm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKGlBY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdG9UYWJsZS5zY3JvbGxUb0luZGV4KGlBY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0b1RhYmxlLmZvY3VzUm93KGlBY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpQWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbEVkaXRGbG93O1xuIl19
772
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkZFTGlicmFyeSIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJDcmVhdGlvbk1vZGUiLCJJbnRlcm5hbEVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50Iiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwib0xpc3RCaW5kaW5nIiwiYURhdGEiLCJiQ3JlYXRlQXRFbmQiLCJiRnJvbUNvcHlQYXN0ZSIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiYkluYWN0aXZlIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Mb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiQnVzeUxvY2tlciIsImxvY2siLCJhRmluYWxDb250ZXh0cyIsInN5bmNUYXNrIiwiY29udGV4dFBhdGgiLCJnZXRQYXRoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJnZXRDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJhQ3JlYXRpb25Qcm9taXNlcyIsIm1hcCIsIm1Qcm9wZXJ0eVZhbHVlcyIsIm1QYXJhbWV0ZXJzIiwiZGF0YSIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwicGFyZW50Q29udHJvbCIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiZ2V0T2JqZWN0IiwiJGtpbmQiLCJjcmVhdGVEb2N1bWVudCIsImdldE1lc3NhZ2VIYW5kbGVyIiwiYWxsIiwiYUNvbnRleHRzIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJDb21tb25VdGlscyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwicmVqZWN0IiwiZmluYWxseSIsInVubG9jayIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwib1JvdXRpbmdMaXN0ZW5lciIsImdldFJvdXRpbmdMaXN0ZW5lciIsIm9UYWJsZSIsImJ5SWQiLCJjb250cm9sSWQiLCJpc0EiLCJFcnJvciIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJmaW5kIiwiY29udGV4dCIsImlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeSIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJvUmVzdWx0IiwiY2xlYXJTZWxlY3Rpb24iLCJpc1Jvb3QiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJzZW5kIiwiQWN0aXZpdHkiLCJEZWxldGUiLCJvRXJyb3IiLCJjb21wdXRlRWRpdE1vZGUiLCJvQ29udGV4dCIsInNDdXN0b21BY3Rpb24iLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0UHJvcGVydHkiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImdldFByb2dyYW1taW5nTW9kZWwiLCJEcmFmdCIsInNldERyYWZ0U3RhdHVzIiwiQ2xlYXIiLCJyZXF1ZXN0T2JqZWN0IiwiYklzQWN0aXZlRW50aXR5Iiwic2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsImJIYXNBY3RpdmVFbnRpdHkiLCJ1bmRlZmluZWQiLCJEaXNwbGF5IiwiU3RpY2t5IiwiX2hhc05ld0FjdGlvbkZvclN0aWNreSIsIl9iQ3JlYXRlTW9kZSIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsImhhbmRsZVN0aWNreU9uIiwic2V0UHJvcGVydHkiLCJzRWRpdE1vZGUiLCJvR2xvYmFsTW9kZWwiLCJzRHJhZnRTdGF0ZSIsIl9yb3V0aW5nIiwidlRhc2siLCJmbk5ld1Rhc2siLCJfcFRhc2tzIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJkZWxldGVEb2N1bWVudCIsImJpbmQiLCJpbnRlcm5hbE1vZGVsIiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwiYXR0YWNoRXZlbnQiLCJTYXZpbmciLCJvRXZlbnQiLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsIlNhdmVkIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJfb1RyYW5zYWN0aW9uSGVscGVyIiwiVHJhbnNhY3Rpb25IZWxwZXIiLCJjcmVhdGVBY3Rpb25Qcm9taXNlIiwic0FjdGlvbk5hbWUiLCJzQ29udHJvbElkIiwiZlJlc29sdmVyIiwiZlJlamVjdG9yIiwib0FjdGlvblByb21pc2UiLCJvUmVzcG9uc2UiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsIm9WaWV3IiwiZ2V0RGF0YSIsInNBY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsImFLZXkiLCIkS2V5Iiwib0RhdGEiLCJrZXlzIiwibWVzc2FnZUhhbmRsZXIiLCJvQXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJzSGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwib0ludGVybmFsTW9kZWwiLCJzZXRUaW1lb3V0Iiwic2V0TmF2aWdhdGlvbkd1YXJkIiwic3Vic3RyaW5nIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsImZuRGlydHlTdGF0ZVByb3ZpZGVyIiwiX3JlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJpMThuTW9kZWwiLCJmbkhhbmRsZVNlc3Npb25UaW1lb3V0IiwiX2F0dGFjaFNlc3Npb25UaW1lb3V0IiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJmblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24iLCJfYXR0YWNoUm91dGVNYXRjaGVkIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJpbmZvIiwiaGFuZGxlU3RpY2t5T2ZmIiwiZGlzY2FyZE5hdmlnYXRpb25HdWFyZCIsImRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJkZXRhY2hTZXNzaW9uVGltZW91dCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIm9Sb3V0ZXJQcm94eSIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwic3RpY2t5IiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJoaXN0b3J5IiwiYmFjayIsImRpc2NhcmREb2N1bWVudCIsImluZGV4T2YiLCJvU3RpY2t5U2Vzc2lvbiIsIk5ld0FjdGlvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwic0FkZGl0aW9uYWxBY3Rpb24iLCJvTmF2aWdhdGlvbkNvbnRleHQiLCJzVGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJzTGNsSGFzaFRyYWNrZXIiLCJiRGlydHkiLCJiU2Vzc2lvbk9OIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJvRm5Db250ZXh0Iiwic0N1cnJlbnRIYXNoIiwic2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93Iiwib1Jvd0JpbmRpbmciLCJpQWN0aXZlUm93SW5kZXgiLCJnZXRDb3VudCIsInNjcm9sbFRvSW5kZXgiLCJmb2N1c1JvdyIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0ZXh0ZW5zaWJsZSxcblx0ZmluYWxFeHRlbnNpb24sXG5cdG1ldGhvZE92ZXJyaWRlLFxuXHRwcml2YXRlRXh0ZW5zaW9uLFxuXHRwdWJsaWNFeHRlbnNpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0Q3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1wiKVxuY2xhc3MgSW50ZXJuYWxFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9wVGFza3M6IGFueTtcblx0cHJpdmF0ZSBvQWN0aW9uUHJvbWlzZT86IFByb21pc2U8YW55Pjtcblx0cHJpdmF0ZSBfb1RyYW5zYWN0aW9uSGVscGVyPzogVHJhbnNhY3Rpb25IZWxwZXI7XG5cdHByaXZhdGUgZm5EaXJ0eVN0YXRlUHJvdmlkZXI/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBmbkhhbmRsZVNlc3Npb25UaW1lb3V0PzogRnVuY3Rpb247XG5cdHByaXZhdGUgZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE92ZXJyaWRlIHRvIHNldCB0aGUgY3JlYXRpb24gbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3cjc2V0Q3JlYXRpb25Nb2RlXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0c2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdG9MaXN0QmluZGluZzogYW55LFxuXHRcdGFEYXRhOiBhbnksXG5cdFx0YkNyZWF0ZUF0RW5kOiBhbnksXG5cdFx0YkZyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s6IGFueSxcblx0XHRiSW5hY3RpdmU/OiBib29sZWFuXG5cdCkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdGxldCBhRmluYWxDb250ZXh0czogYW55W10gPSBbXTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBiZWZvcmVDcmVhdGVDYWxsQmFja1xuXHRcdFx0XHRcdD8gYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogb0xpc3RCaW5kaW5nICYmIG9MaXN0QmluZGluZy5nZXRQYXRoKCkgfSlcblx0XHRcdFx0XHQ6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHtvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXG5cdFx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRcdGNvbnN0IGFDcmVhdGlvblByb21pc2VzID0gYURhdGEubWFwKChtUHJvcGVydHlWYWx1ZXM6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSB7IGRhdGE6IHt9IH07XG5cblx0XHRcdFx0XHRtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIk5vbmVcIjtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gYkNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmluYWN0aXZlID0gYkluYWN0aXZlO1xuXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzUHJvcGVydHlQYXRoIGluIG1Qcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiBtUHJvcGVydHlWYWx1ZXNbc1Byb3BlcnR5UGF0aF0pIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVtzUHJvcGVydHlQYXRoXSA9IG1Qcm9wZXJ0eVZhbHVlc1tzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRcdGJGcm9tQ29weVBhc3RlLFxuXHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYUNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChhQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0YUZpbmFsQ29udGV4dHMgPSBhQ29udGV4dHM7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvTmV3Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoIW9OZXdDb250ZXh0LmJJbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIG11bHRpcGxlIGRvY3VtZW50cy5cIik7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFGaW5hbENvbnRleHRzO1xuXHRcdFx0fSk7XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgb1JvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0Um91dGluZ0xpc3RlbmVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBUYWJsZTtcblx0XHRpZiAoIW9UYWJsZSB8fCAhb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBvVGFibGU7XG5cdFx0fVxuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkgYXMgYW55O1xuXHRcdG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cblx0XHQvLyBDaGVjayBpZiBhIGRpc3BsYXllZCB2aWV3IGNhbiBiZSBpbXBhY3RlZCBieSB0aGUgZGVsZXRpb24sIGkuZS4gaWYgdGhlcmUncyBhbiBPUCBkaXNwbGF5aW5nIGEgZGVsZXRlZCBvYmplY3QuXG5cdFx0Ly8gV2UgaGF2ZSB0byBjaGVjayB0aGlzIGJlZm9yZSB0aGUgY29udGV4dHMgYXJlIGRlbGV0ZWQgKGFmdGVyLCB0aGUgY29udGV4dHMgYXJlIGludmFsaWQpXG5cdFx0Y29uc3QgbmF2aWdhdGVCYWNrRnJvbUNvbnRleHQgPSBhQ29udGV4dHMuZmluZCgoY29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkoY29udGV4dCk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGFDb250ZXh0cywgbVBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGxldCBvUmVzdWx0O1xuXG5cdFx0XHRcdC8vIE11bHRpcGxlIG9iamVjdCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhIGxpc3Rcblx0XHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdFx0KG9UYWJsZSBhcyBhbnkpLmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAob0xpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0XHRvUmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZGVsZXRpbmcgYXQgbGVhc3Qgb25lIG9iamVjdCBzaG91bGQgYWxzbyBzZXQgdGhlIFVJIHRvIGRpcnR5XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXG5cdFx0XHRcdHNlbmQoXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0QWN0aXZpdHkuRGVsZXRlLFxuXHRcdFx0XHRcdGFDb250ZXh0cy5tYXAoKGNvbnRleHQ6IENvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIE5hdmlnYXRlIGJhY2sgZnJvbSBhIGRlbGV0ZWQgY29udGV4dCBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KSB7XG5cdFx0XHRcdFx0b1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gb1Jlc3VsdDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBvRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVjaWRlcyBpZiBhIGRvY3VtZW50IGlzIHRvIGJlIHNob3duIGluIGRpc3BsYXkgb3IgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NvbXB1dGVFZGl0TW9kZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxFZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY29tcHV0ZUVkaXRNb2RlKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzQ3VzdG9tQWN0aW9uID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvc0N1c3RvbUFjdGlvblwiKTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0XHRcdGNvbnN0IGJJc0FjdGl2ZUVudGl0eSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0aWYgKGJJc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgYkhhc0FjdGl2ZUVudGl0eSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFiSGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRpZiAoc0N1c3RvbUFjdGlvbiAmJiBzQ3VzdG9tQWN0aW9uICE9PSBcIlwiICYmIHRoaXMuX2hhc05ld0FjdGlvbkZvclN0aWNreShvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHNDdXN0b21BY3Rpb24pKSB7XG5cdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5fYkNyZWF0ZU1vZGUgPSB0cnVlO1xuXHRcdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgXCJcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIHNFZGl0TW9kZVxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBDcmVhdGVNb2RlIGZsYWcgdG8gaWRlbnRpZnkgdGhlIGNyZWF0aW9uIG1vZGVcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZXRFZGl0TW9kZShzRWRpdE1vZGU/OiBzdHJpbmcsIGJDcmVhdGlvbk1vZGU/OiBib29sZWFuKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBvR2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChzRWRpdE1vZGUpIHtcblx0XHRcdG9HbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIHNFZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmIChiQ3JlYXRpb25Nb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZSk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHNldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlOiBhbnkpIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBzRHJhZnRTdGF0ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRSb3V0aW5nTGlzdGVuZXIoKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgRlBNIGN1c3RvbSBwYWdlcyBhbmQgdGhlIHJvdXRpbmdcblx0XHQvLyBsaXN0ZW5lciBpcyBub3QgeWV0IHB1YmxpYyB0aGVyZWZvcmUga2VlcCB0aGUgbG9naWMgaGVyZSBmb3Igbm93XG5cblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc3luY1Rhc2tcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIFt2VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN5bmNUYXNrKHZUYXNrPzogRnVuY3Rpb24gfCBQcm9taXNlPGFueT4pIHtcblx0XHRsZXQgZm5OZXdUYXNrO1xuXHRcdGlmICh2VGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcblx0XHRcdGZuTmV3VGFzayA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHZUYXNrO1xuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRmbk5ld1Rhc2sgPSB2VGFzaztcblx0XHR9XG5cblx0XHR0aGlzLl9wVGFza3MgPSB0aGlzLl9wVGFza3MgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKGZuTmV3VGFzaykge1xuXHRcdFx0dGhpcy5fcFRhc2tzID0gdGhpcy5fcFRhc2tzLnRoZW4oZm5OZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9wVGFza3M7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dD86IGFueSk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9ICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHR0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdFx0XHQ/IHNhcC51aS5nZXRDb3JlKCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQuYmluZCh0cmFuc2FjdGlvbkhlbHBlciwgb0NvbnRleHQsIG1QYXJhbWV0ZXJzLCBvUmVzb3VyY2VCdW5kbGUsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSlcblx0XHRcdClcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9CaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmc6IGFueSkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRvQmluZGluZyA9IChvQmluZGluZy5nZXRCaW5kaW5nICYmIG9CaW5kaW5nLmdldEJpbmRpbmcoKSkgfHwgb0JpbmRpbmc7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0JpbmRpbmcpO1xuXG5cdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVTZW50XCIsICgpID0+IHtcblx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvQmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IGJTdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhiU3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0aWYgKCF0aGlzLl9vVHJhbnNhY3Rpb25IZWxwZXIpIHtcblx0XHRcdC8vIGN1cnJlbnRseSBhbHNvIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgaXMgbG9ja2luZyB0aGVyZWZvcmUgcGFzc2luZyBsb2NrIG9iamVjdFxuXHRcdFx0dGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyID0gbmV3IFRyYW5zYWN0aW9uSGVscGVyKHRoaXMuX29BcHBDb21wb25lbnQsIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1RyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdGxldCBmUmVzb2x2ZXIsIGZSZWplY3Rvcjtcblx0XHR0aGlzLm9BY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0ZlJlc29sdmVyID0gcmVzb2x2ZTtcblx0XHRcdGZSZWplY3RvciA9IHJlamVjdDtcblx0XHR9KS50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQ6IHNDb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IGZSZXNvbHZlciwgZlJlamVjdG9yOiBmUmVqZWN0b3IgfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSBvYmplY3QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0Q3VycmVudEFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHByb21pc2Vcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5vQWN0aW9uUHJvbWlzZTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHR0aGlzLm9BY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9SZXNwb25zZTogYW55KSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKSkge1xuXHRcdFx0aWYgKG9SZXNwb25zZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0b1Jlc3BvbnNlID0gb1Jlc3BvbnNlWzBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghb1Jlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSAob1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLmdldERhdGEoKSxcblx0XHRcdHNBY3Rpb25SZXR1cm5UeXBlID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXSAmJiBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXVswXSAmJiBvTWV0YU1vZGVsW3NBY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZVxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbFtzQWN0aW9uTmFtZV1bMF0uJFJldHVyblR5cGUuJFR5cGVcblx0XHRcdFx0XHQ6IG51bGwsXG5cdFx0XHRhS2V5ID0gc0FjdGlvblJldHVyblR5cGUgJiYgb01ldGFNb2RlbFtzQWN0aW9uUmV0dXJuVHlwZV0gPyBvTWV0YU1vZGVsW3NBY3Rpb25SZXR1cm5UeXBlXS4kS2V5IDogbnVsbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvRGF0YTogb1Jlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5czogYUtleVxuXHRcdH07XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0TWVzc2FnZUhhbmRsZXIoKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgRlBNIGN1c3RvbSBwYWdlcyB0aGVyZWZvcmUga2VlcFxuXHRcdC8vIHRoZSBsb2dpYyBoZXJlIGZvciBub3dcblxuXHRcdGlmICh0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiBtZXNzYWdlIGhhbmRsZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGhhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCB8fCBvQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgb3IgQ29udGV4dCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IHNIYXNoVHJhY2tlciA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCksXG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblxuXHRcdFx0XHQvLyBTZXQgYSBndWFyZCBpbiB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0Ly8gQSB0aW1lb3V0IGlzIG5lY2Vzc2FyeSwgYXMgd2l0aCBkZWZlcnJlZCBjcmVhdGlvbiB0aGUgaGFzaENoYW5nZXIgaXMgbm90IHVwZGF0ZWQgeWV0IHdpdGhcblx0XHRcdFx0Ly8gdGhlIG5ldyBoYXNoLCBhbmQgdGhlIGd1YXJkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IG9mIHRoZSByb3V0ZXIgcHJveHlcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChvQ29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcykpO1xuXG5cdFx0XHRcdHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIgPSB0aGlzLl9yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcihvQXBwQ29tcG9uZW50LCBvSW50ZXJuYWxNb2RlbCwgc0hhc2hUcmFja2VyKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQgPSB0aGlzLl9hdHRhY2hTZXNzaW9uVGltZW91dChvQ29udGV4dCwgaTE4bk1vZGVsKTtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgYW55KS5hdHRhY2hTZXNzaW9uVGltZW91dCh0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpO1xuXG5cdFx0XHRcdHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uID0gdGhpcy5fYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMsIG9Db250ZXh0LCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLmZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRoYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5mbkRpcnR5U3RhdGVQcm92aWRlcikge1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZm5EaXJ0eVN0YXRlUHJvdmlkZXIpO1xuXHRcdFx0XHR0aGlzLmZuRGlydHlTdGF0ZVByb3ZpZGVyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSAmJiB0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgYW55KS5kZXRhY2hTZXNzaW9uVGltZW91dCh0aGlzLmZuSGFuZGxlU2Vzc2lvblRpbWVvdXQpO1xuXHRcdFx0fVxuXG5cdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uKTtcblx0XHRcdHRoaXMuZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuX2JDcmVhdGVNb2RlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb24gTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIG9uQmFja05hdmlnYXRpb25JblNlc3Npb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsRWRpdEZsb3dcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCkge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KSxcblx0XHRcdG9Sb3V0ZXJQcm94eSA9IG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChvUm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcgJiYgb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0c3RpY2t5LnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24ob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b1ZpZXcsXG5cdFx0XHRcdHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQmluZGluZ0NvbnRleHQpXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KTtcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X2hhc05ld0FjdGlvbkZvclN0aWNreShvQ29udGV4dDogYW55LCBvVmlldzogVmlldywgc0N1c3RvbUFjdGlvbjogc3RyaW5nKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQ29udGV4dCA9PT0gdW5kZWZpbmVkIHx8IG9WaWV3ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBfaGFzTmV3QWN0aW9uRm9yU3RpY2t5XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0c01ldGFQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygwLCBvQ29udGV4dC5nZXRQYXRoKCkuaW5kZXhPZihcIihcIikpLFxuXHRcdFx0XHRvU3RpY2t5U2Vzc2lvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYCk7XG5cblx0XHRcdGlmIChvU3RpY2t5U2Vzc2lvbiAmJiBvU3RpY2t5U2Vzc2lvbi5OZXdBY3Rpb24gJiYgb1N0aWNreVNlc3Npb24uTmV3QWN0aW9uID09PSBzQ3VzdG9tQWN0aW9uKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChvU3RpY2t5U2Vzc2lvbiAmJiBvU3RpY2t5U2Vzc2lvbi5BZGRpdGlvbmFsTmV3QWN0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gc0N1c3RvbUFjdGlvbiA9PT1cblx0XHRcdFx0XHRvU3RpY2t5U2Vzc2lvbi5BZGRpdGlvbmFsTmV3QWN0aW9ucy5maW5kKGZ1bmN0aW9uIChzQWRkaXRpb25hbEFjdGlvbjogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc0FkZGl0aW9uYWxBY3Rpb24gPT09IHNDdXN0b21BY3Rpb247XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRfcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBvSW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBzSGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiBmdW5jdGlvbiBmbkRpcnR5U3RhdGVQcm92aWRlcihvTmF2aWdhdGlvbkNvbnRleHQ6IGFueSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBmbkRpcnR5U3RhdGVQcm92aWRlclwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRIYXNoID0gb05hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGUsXG5cdFx0XHRcdFx0b1JvdXRlclByb3h5ID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgc0xjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGJEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgYlNlc3Npb25PTiA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWJTZXNzaW9uT04pIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgc3RpY2t5IHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGhhbmQuXG5cdFx0XHRcdFx0Ly8gRWV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghb1JvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRiRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRzTGNsSGFzaFRyYWNrZXIgPSBzVGFyZ2V0SGFzaDtcblx0XHRcdFx0fSBlbHNlIGlmIChzSGFzaFRyYWNrZXIgPT09IHNUYXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0YkRpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChvUm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHNUYXJnZXRIYXNoKSB8fCBvUm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0c0xjbEhhc2hUcmFja2VyID0gc1RhcmdldEhhc2g7XG5cdFx0XHRcdFx0YkRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0YkRpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChiRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0RGlydHlGbGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzSGFzaFRyYWNrZXIgPSBzTGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gYkRpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFNlc3Npb25UaW1lb3V0KG9Db250ZXh0OiBhbnksIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG9Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIGZ1bmN0aW9uIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXRcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmVtb3ZlIHRyYW5zaWVudCBtZXNzYWdlcyBzaW5jZSB3ZSB3aWxsIHNob3dpbmcgb3VyIG93biBtZXNzYWdlXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19USVRMRX1cIixcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfTUVTU0FHRX1cIiB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0NPTU1PTl9ESUFMT0dfT0t9XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0X2F0dGFjaFJvdXRlTWF0Y2hlZChvRm5Db250ZXh0OiBhbnksIG9Db250ZXh0OiBhbnksIG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdHJldHVybiBmdW5jdGlvbiBmblN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb24oKSB7XG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIXNDdXJyZW50SGFzaCB8fCAhb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChzQ3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdG9GbkNvbnRleHQuZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0c2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KG9UYWJsZTogVGFibGUpIHtcblx0XHRjb25zdCBvUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRjb25zdCBpQWN0aXZlUm93SW5kZXggPSBvUm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKGlBY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdG9UYWJsZS5zY3JvbGxUb0luZGV4KGlBY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0b1RhYmxlLmZvY3VzUm93KGlBY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpQWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7RUFrakJPLGdCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0lBQ3JDLElBQUk7TUFDSCxJQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7SUFDQSxDQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO01BQ1YsT0FBT0YsT0FBTyxDQUFDRSxDQUFELENBQWQ7SUFDQTs7SUFDRCxJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7TUFDMUIsT0FBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkgsT0FBcEIsQ0FBUDtJQUNBOztJQUNELE9BQU9DLE1BQVA7RUFDQTs7Ozs7Ozs7RUE3aEJELElBQU1HLGdCQUFnQixHQUFHQyxTQUFTLENBQUNELGdCQUFuQztFQUFBLElBQ0NFLFdBQVcsR0FBR0QsU0FBUyxDQUFDQyxXQUR6QjtFQUFBLElBRUNDLFFBQVEsR0FBR0YsU0FBUyxDQUFDRSxRQUZ0QjtFQUFBLElBR0NDLFlBQVksR0FBR0gsU0FBUyxDQUFDRyxZQUgxQjtNQU1NQyxnQixXQURMQyxjQUFjLENBQUMsbURB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