@sapui5/sap.fe.core 1.102.2 → 1.104.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/package.json +6 -6
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +73 -30
  4. package/src/sap/fe/core/AppComponent.ts +65 -43
  5. package/src/sap/fe/core/AppStateHandler.js +82 -70
  6. package/src/sap/fe/core/AppStateHandler.ts +32 -37
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +227 -126
  10. package/src/sap/fe/core/CommonUtils.ts +240 -163
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +181 -43
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +101 -74
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +9 -9
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +170 -139
  52. package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +200 -131
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +11 -10
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
  61. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  64. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  65. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +190 -141
  66. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
  67. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
  68. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +71 -41
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
  77. package/src/sap/fe/core/controls/Any.js +9 -5
  78. package/src/sap/fe/core/controls/Any.ts +10 -4
  79. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  80. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  81. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  87. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  88. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  89. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  91. package/src/sap/fe/core/controls/FileWrapper.js +7 -2
  92. package/src/sap/fe/core/controls/FileWrapper.ts +15 -11
  93. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  94. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  97. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  98. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  100. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  101. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  102. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  103. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  104. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
  105. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
  106. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  107. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  108. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  110. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  111. package/src/sap/fe/core/converters/ConverterContext.ts +52 -61
  112. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  113. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
  114. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  115. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  116. package/src/sap/fe/core/converters/MetaModelConverter.js +64 -35
  117. package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
  118. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  119. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  120. package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
  121. package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
  122. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -33
  127. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  128. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +30 -28
  130. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
  131. package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
  132. package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
  133. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  134. package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
  135. package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
  136. package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  138. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  140. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +65 -59
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  142. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  143. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  144. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  146. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +77 -73
  148. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
  149. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  150. package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
  151. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  152. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  153. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  154. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  155. package/src/sap/fe/core/converters/helpers/ID.js +48 -46
  156. package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
  157. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  158. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  159. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
  161. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  162. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  163. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  164. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  165. package/src/sap/fe/core/converters/templates/ListReportConverter.js +55 -42
  166. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
  167. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  168. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  169. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  170. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  171. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  172. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  173. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  174. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  175. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  176. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  177. package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
  178. package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
  179. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  180. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  181. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  182. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  183. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  184. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  185. package/src/sap/fe/core/helpers/BindingToolkit.js +1832 -0
  186. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
  187. package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
  188. package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
  189. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  190. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  191. package/src/sap/fe/core/helpers/EditState.js +1 -6
  192. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  193. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  194. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  195. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  197. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  198. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  199. package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
  200. package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
  201. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  202. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  203. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  204. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  205. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  206. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  207. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  208. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  209. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  210. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  211. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  212. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  213. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  214. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  215. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  216. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  217. package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
  218. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
  219. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  220. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  221. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  222. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  223. package/src/sap/fe/core/library.js +42 -3
  224. package/src/sap/fe/core/library.ts +38 -0
  225. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  226. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  227. package/src/sap/fe/core/messagebundle.properties +39 -63
  228. package/src/sap/fe/core/messagebundle_ar.properties +25 -39
  229. package/src/sap/fe/core/messagebundle_bg.properties +25 -39
  230. package/src/sap/fe/core/messagebundle_ca.properties +25 -39
  231. package/src/sap/fe/core/messagebundle_cs.properties +25 -39
  232. package/src/sap/fe/core/messagebundle_cy.properties +25 -39
  233. package/src/sap/fe/core/messagebundle_da.properties +25 -39
  234. package/src/sap/fe/core/messagebundle_de.properties +25 -39
  235. package/src/sap/fe/core/messagebundle_el.properties +26 -40
  236. package/src/sap/fe/core/messagebundle_en.properties +25 -39
  237. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
  238. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
  239. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
  240. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
  241. package/src/sap/fe/core/messagebundle_es.properties +27 -41
  242. package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
  243. package/src/sap/fe/core/messagebundle_et.properties +25 -39
  244. package/src/sap/fe/core/messagebundle_fi.properties +25 -39
  245. package/src/sap/fe/core/messagebundle_fr.properties +26 -40
  246. package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
  247. package/src/sap/fe/core/messagebundle_hi.properties +25 -39
  248. package/src/sap/fe/core/messagebundle_hr.properties +25 -39
  249. package/src/sap/fe/core/messagebundle_hu.properties +25 -39
  250. package/src/sap/fe/core/messagebundle_id.properties +25 -39
  251. package/src/sap/fe/core/messagebundle_it.properties +41 -55
  252. package/src/sap/fe/core/messagebundle_iw.properties +25 -39
  253. package/src/sap/fe/core/messagebundle_ja.properties +25 -39
  254. package/src/sap/fe/core/messagebundle_kk.properties +25 -39
  255. package/src/sap/fe/core/messagebundle_ko.properties +30 -44
  256. package/src/sap/fe/core/messagebundle_lt.properties +25 -39
  257. package/src/sap/fe/core/messagebundle_lv.properties +25 -39
  258. package/src/sap/fe/core/messagebundle_ms.properties +25 -39
  259. package/src/sap/fe/core/messagebundle_nl.properties +27 -41
  260. package/src/sap/fe/core/messagebundle_no.properties +25 -39
  261. package/src/sap/fe/core/messagebundle_pl.properties +26 -40
  262. package/src/sap/fe/core/messagebundle_pt.properties +26 -40
  263. package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
  264. package/src/sap/fe/core/messagebundle_ro.properties +25 -39
  265. package/src/sap/fe/core/messagebundle_ru.properties +25 -39
  266. package/src/sap/fe/core/messagebundle_sh.properties +25 -39
  267. package/src/sap/fe/core/messagebundle_sk.properties +25 -39
  268. package/src/sap/fe/core/messagebundle_sl.properties +25 -39
  269. package/src/sap/fe/core/messagebundle_sv.properties +25 -39
  270. package/src/sap/fe/core/messagebundle_th.properties +25 -39
  271. package/src/sap/fe/core/messagebundle_tr.properties +25 -39
  272. package/src/sap/fe/core/messagebundle_uk.properties +25 -39
  273. package/src/sap/fe/core/messagebundle_vi.properties +25 -39
  274. package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
  275. package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
  276. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  278. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +97 -69
  279. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
  280. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  281. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  282. package/src/sap/fe/core/services/NavigationServiceFactory.js +61 -49
  283. package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
  284. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  285. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  286. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  287. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  288. package/src/sap/fe/core/services/ShellServicesFactory.js +92 -76
  289. package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
  290. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  291. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  292. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +224 -198
  293. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
  294. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  295. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  296. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  297. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  298. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  299. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  300. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  301. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  302. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  303. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  304. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  305. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  306. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  307. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  308. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  309. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  310. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  311. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  312. package/src/sap/fe/core/templating/FilterHelper.js +16 -15
  313. package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
  314. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  315. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  316. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  317. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  318. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  319. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  320. package/src/sap/fe/core/templating/UIFormatters.js +152 -95
  321. package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -26,8 +26,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
26
26
  /**
27
27
  * Creates a HashGuard object.
28
28
  *
29
- * @param {string} sGuardHash The hash used for the guard
30
- * @returns {object} The created hash guard
29
+ * @param sGuardHash The hash used for the guard
30
+ * @returns The created hash guard
31
31
  */
32
32
 
33
33
  function createGuardFromHash(sGuardHash) {
@@ -42,32 +42,32 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
42
42
  /**
43
43
  * Returns the iAppState part from a hash (or null if not found).
44
44
  *
45
- * @param {string} sHash The hash
46
- * @returns {string} The iAppState part of the hash
45
+ * @param sHash The hash
46
+ * @returns The iAppState part of the hash
47
47
  */
48
48
 
49
49
 
50
50
  function findAppStateInHash(sHash) {
51
- var aAppState = sHash.match(new RegExp("\\?.*" + enumURLParams.IAPPSTATEPARAM + "=([^&]*)"));
51
+ var aAppState = sHash.match(new RegExp("\\?.*".concat(enumURLParams.IAPPSTATEPARAM, "=([^&]*)")));
52
52
  return aAppState && aAppState.length > 1 ? aAppState[1] : null;
53
53
  }
54
54
  /**
55
55
  * Returns a hash without its iAppState part.
56
56
  *
57
- * @param {string} sHash The hash
58
- * @returns {string} The hash without the iAppState
57
+ * @param sHash The hash
58
+ * @returns The hash without the iAppState
59
59
  */
60
60
 
61
61
 
62
62
  function removeAppStateInHash(sHash) {
63
- return sHash.replace(new RegExp("[&?]*" + enumURLParams.IAPPSTATEPARAM + "=[^&]*"), "");
63
+ return sHash.replace(new RegExp("[&?]*".concat(enumURLParams.IAPPSTATEPARAM, "=[^&]*")), "");
64
64
  }
65
65
  /**
66
66
  * Adds an iAppState inside a hash (or replaces an existing one).
67
67
  *
68
- * @param {*} sHash The hash
69
- * @param {*} sAppStateKey The iAppState to add
70
- * @returns {string} The hash with the app state
68
+ * @param sHash The hash
69
+ * @param sAppStateKey The iAppState to add
70
+ * @returns The hash with the app state
71
71
  */
72
72
 
73
73
 
@@ -76,16 +76,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
76
76
 
77
77
  if (sHash.indexOf(enumURLParams.IAPPSTATEPARAM) >= 0) {
78
78
  // If there's already an iAppState parameter in the hash, replace it
79
- sNewHash = sHash.replace(new RegExp(enumURLParams.IAPPSTATEPARAM + "=[^&]*"), enumURLParams.IAPPSTATEPARAM + "=" + sAppStateKey);
79
+ sNewHash = sHash.replace(new RegExp("".concat(enumURLParams.IAPPSTATEPARAM, "=[^&]*")), "".concat(enumURLParams.IAPPSTATEPARAM, "=").concat(sAppStateKey));
80
80
  } else {
81
81
  // Add the iAppState parameter in the hash
82
82
  if (sHash.indexOf("?") < 0) {
83
- sNewHash = sHash + "?";
83
+ sNewHash = "".concat(sHash, "?");
84
84
  } else {
85
- sNewHash = sHash + "&";
85
+ sNewHash = "".concat(sHash, "&");
86
86
  }
87
87
 
88
- sNewHash += enumURLParams.IAPPSTATEPARAM + "=" + sAppStateKey;
88
+ sNewHash += "".concat(enumURLParams.IAPPSTATEPARAM, "=").concat(sAppStateKey);
89
89
  }
90
90
 
91
91
  return sNewHash;
@@ -155,7 +155,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
155
155
  /**
156
156
  * Raw initialization (for unit tests).
157
157
  *
158
- * @param {sap.ui.core.routing.Router} oRouter The router used by this proxy
158
+ * @param oRouter The router used by this proxy
159
159
  */
160
160
  ;
161
161
 
@@ -187,7 +187,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
187
187
  *
188
188
  * @function
189
189
  * @name sap.fe.core.RouterProxy#removeIAppStateKey
190
- *
191
190
  * @ui5-restricted
192
191
  */
193
192
  ;
@@ -202,12 +201,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
202
201
  * @name sap.fe.core.RouterProxy#navToHash
203
202
  * @memberof sap.fe.core.RouterProxy
204
203
  * @static
205
- * @param {string} sHash Hash to be navigated to
206
- * @param {boolean} bPreserveHistory If set to true, non-ancestor entries in history will be retained
207
- * @param {boolean} bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
208
- * @param {boolean} bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
209
- * @param {boolean} bPreserveShellBackNavigationHandler If not set to false, the back navigation is set to undefined
210
- * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
204
+ * @param sHash Hash to be navigated to
205
+ * @param bPreserveHistory If set to true, non-ancestor entries in history will be retained
206
+ * @param bDisablePreservationCache If set to true, cache preservation mechanism is disabled for the current navigation
207
+ * @param bForceFocus If set to true, the logic to set the focus once the navigation is finalized will be triggered (onPageReady)
208
+ * @param bPreserveShellBackNavigationHandler If not set to false, the back navigation is set to undefined
209
+ * @returns Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
211
210
  * @ui5-restricted
212
211
  */
213
212
  ;
@@ -276,7 +275,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
276
275
  * Clears browser history if entries have been added without using the RouterProxy.
277
276
  * Updates the internal history accordingly.
278
277
  *
279
- * @returns {Promise} Promise that is resolved once the history is rebuilt
278
+ * @returns Promise that is resolved once the history is rebuilt
280
279
  */
281
280
  ;
282
281
 
@@ -298,7 +297,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
298
297
  /**
299
298
  * Navigates back in the history.
300
299
  *
301
- * @returns {Promise} Promise that is resolved when the navigation is finalized
300
+ * @returns Promise that is resolved when the navigation is finalized
302
301
  */
303
302
  ;
304
303
 
@@ -325,9 +324,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
325
324
  }
326
325
  /**
327
326
  * Navigates to a route with parameters.
328
- * @param {string} sRouteName The route name to be navigated to
329
- * @param {object} oParameters Parameters for the navigation
330
- * @returns {Promise} Promise that is resolved when the navigation is finalized
327
+ *
328
+ * @param sRouteName The route name to be navigated to
329
+ * @param oParameters Parameters for the navigation
330
+ * @returns Promise that is resolved when the navigation is finalized
331
331
  * @ui5-restricted
332
332
  */
333
333
  ;
@@ -341,7 +341,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
341
341
  * Exits the current app by navigating back
342
342
  * to the previous app (if any) or the FLP.
343
343
  *
344
- * @returns {Promise} Promise that is resolved when we exit the app
344
+ * @returns Promise that is resolved when we exit the app
345
345
  */
346
346
  ;
347
347
 
@@ -352,8 +352,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
352
352
  * Checks whether a given hash can have an impact on the current state
353
353
  * i.e. if the hash is equal, compatible or an ancestor of the current state.
354
354
  *
355
- * @param {*} sHash `true` if there is an impact
356
- * @returns {boolean} If there is an impact
355
+ * @param sHash `true` if there is an impact
356
+ * @returns If there is an impact
357
357
  */
358
358
  ;
359
359
 
@@ -368,7 +368,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
368
368
  /**
369
369
  * Checks if a navigation is currently being processed.
370
370
  *
371
- * @returns {boolean} `false` if a navigation has been triggered in the RouterProxy and is not yet finalized
371
+ * @returns `false` if a navigation has been triggered in the RouterProxy and is not yet finalized
372
372
  */
373
373
  ;
374
374
 
@@ -399,7 +399,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
399
399
  /**
400
400
  * Checks for the availability of the navigation guard.
401
401
  *
402
- * @returns {boolean} `true` if navigating guard is available
402
+ * @returns `true` if navigating guard is available
403
403
  */
404
404
  ;
405
405
 
@@ -409,8 +409,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
409
409
  /**
410
410
  * Tests a hash against the navigation guard.
411
411
  *
412
- * @param {string} sHash The hash to be tested
413
- * @returns {boolean} `true` if navigating to the hash doesn't cross the guard
412
+ * @param sHash The hash to be tested
413
+ * @returns `true` if navigating to the hash doesn't cross the guard
414
414
  */
415
415
  ;
416
416
 
@@ -420,7 +420,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
420
420
  /**
421
421
  * Checks if the user allowed the navigation guard to be crossed.
422
422
  *
423
- * @returns {boolean} `true` if crossing the guard has been allowed by the user
423
+ * @returns `true` if crossing the guard has been allowed by the user
424
424
  */
425
425
  ;
426
426
 
@@ -478,9 +478,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
478
478
  /**
479
479
  * Builds a state from a hash.
480
480
  *
481
- * @param {string} sHash The hash to be used as entry
482
- * @returns {object} The state
483
- *
481
+ * @param sHash The hash to be used as entry
482
+ * @returns The state
484
483
  * @ui5-restricted
485
484
  */
486
485
  ;
@@ -494,7 +493,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
494
493
  keys: this._extractKeysFromHash(sHash)
495
494
  }; // Retrieve layout (if any)
496
495
 
497
- var aLayout = sHash.match(new RegExp("\\?.*" + enumURLParams.LAYOUTPARAM + "=([^&]*)"));
496
+ var aLayout = sHash.match(new RegExp("\\?.*".concat(enumURLParams.LAYOUTPARAM, "=([^&]*)")));
498
497
  oState.sLayout = aLayout && aLayout.length > 1 ? aLayout[1] : null;
499
498
 
500
499
  if (oState.sLayout === "MidColumnFullScreen") {
@@ -514,19 +513,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
514
513
  * Also sets the iAppState key in the whole history.
515
514
  *
516
515
  * @memberof sap.fe.core.RouterProxy
517
- * @param {object} oNewState The new state to be added
518
- * @param {boolean} bRebuildOnly `true` if we're rebuilding the history after a shell menu navigation
519
- * @param {boolean} bPreserveHistory If set to true, non-ancestor entries in history will be retained
520
- * @param {boolean} bDisableHistoryPreservation Disable the mechanism to retained marked entries in cache
521
- * @returns {object} The new state
516
+ * @param oNewState The new state to be added
517
+ * @param bRebuildOnly `true` if we're rebuilding the history after a shell menu navigation
518
+ * @param bPreserveHistory If set to true, non-ancestor entries in history will be retained
519
+ * @param bDisableHistoryPreservation Disable the mechanism to retained marked entries in cache
520
+ * @returns The new state
522
521
  * @ui5-restricted
523
522
  * @final
524
523
  */
525
524
  ;
526
525
 
527
526
  _proto._pushNewState = function _pushNewState(oNewState, bRebuildOnly, bPreserveHistory, bDisableHistoryPreservation) {
528
- var _this4 = this;
529
-
530
527
  var sCurrentHash = this.getHash();
531
528
  var lastIndex = this._oManagedHistory.length - 1;
532
529
  var iPopCount = bRebuildOnly ? 1 : 0; // 1. Do some cleanup in the managed history : in case the user has navigated back in the browser history, we need to remove
@@ -583,12 +580,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
583
580
 
584
581
  this.sIAppStateKey = findAppStateInHash(oNewState.hash);
585
582
 
586
- if (this.fclEnabled && this.sIAppStateKey) {
587
- // In case of FCL, the new app state needs to be applied to the whole history
588
- this._oManagedHistory.forEach(function (oManagedState) {
589
- oManagedState.hash = setAppStateInHash(oManagedState.hash, _this4.sIAppStateKey);
590
- });
591
- } else if (!this.fclEnabled && oLastRemovedItem) {
583
+ if (!this.fclEnabled && oLastRemovedItem) {
592
584
  var sPreviousIAppStateKey = findAppStateInHash(oLastRemovedItem.hash);
593
585
 
594
586
  var oComparisonStateResult = this._compareCacheStates(oLastRemovedItem, oNewState); // if current state doesn't contain a i-appstate and this state should replace a state containing a iAppState
@@ -640,7 +632,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
640
632
  *
641
633
  * @function
642
634
  * @memberof sap.fe.core.RouterProxy
643
- *
644
635
  * @ui5-restricted
645
636
  * @final
646
637
  */
@@ -657,8 +648,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
657
648
  * @function
658
649
  * @name sap.fe.core.RouterProxy#_enableEventOnHashChange
659
650
  * @memberof sap.fe.core.RouterProxy
660
- * @param {boolean} [bIgnoreCurrentHash] Ignore the last hash event triggered before the router has initialized
661
- *
651
+ * @param [bIgnoreCurrentHash] Ignore the last hash event triggered before the router has initialized
662
652
  * @ui5-restricted
663
653
  * @final
664
654
  */
@@ -673,23 +663,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
673
663
  * Synchronizes the browser history with the internal history of the routerProxy, and triggers a navigation if needed.
674
664
  *
675
665
  * @memberof sap.fe.core.RouterProxy
676
- * @param {object} oHistoryAction Specifies the navigation action to be performed
677
- * @param {boolean} bRebuildOnly `true` if internal history is currently being rebuilt
678
- * @returns {Promise} Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
666
+ * @param oHistoryAction Specifies the navigation action to be performed
667
+ * @param bRebuildOnly `true` if internal history is currently being rebuilt
668
+ * @returns Promise (resolved when the navigation is finalized) that returns 'true' if a navigation took place, 'false' if the navigation didn't happen
679
669
  * @ui5-restricted
680
670
  * @final
681
671
  */
682
672
  ;
683
673
 
684
674
  _proto._rebuildBrowserHistory = function _rebuildBrowserHistory(oHistoryAction, bRebuildOnly) {
685
- var _this5 = this;
675
+ var _this4 = this;
686
676
 
687
677
  // eslint-disable-next-line @typescript-eslint/no-this-alias
688
678
  var that = this;
689
679
  return new Promise(function (resolve) {
690
- _this5.bIsRebuildHistoryRunning = true;
691
- var oTargetState = _this5._oManagedHistory[_this5._oManagedHistory.length - 1],
692
- newLevel = _this5._oManagedHistory.length - 1;
680
+ _this4.bIsRebuildHistoryRunning = true;
681
+ var oTargetState = _this4._oManagedHistory[_this4._oManagedHistory.length - 1],
682
+ newLevel = _this4._oManagedHistory.length - 1;
693
683
 
694
684
  function replaceAsync() {
695
685
  if (!bRebuildOnly) {
@@ -760,7 +750,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
760
750
  break;
761
751
 
762
752
  case "back-replace":
763
- _this5._disableEventOnHashChange();
753
+ _this4._disableEventOnHashChange();
764
754
 
765
755
  window.addEventListener("popstate", backReplaceAsync);
766
756
  history.go(-oHistoryAction.steps);
@@ -768,7 +758,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
768
758
 
769
759
  default:
770
760
  // No navigation
771
- _this5.bIsRebuildHistoryRunning = false;
761
+ _this4.bIsRebuildHistoryRunning = false;
772
762
  resolve(false);
773
763
  // no navigation --> resolve to false
774
764
  }
@@ -786,7 +776,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
786
776
  };
787
777
 
788
778
  _proto.hashGuard = function hashGuard() {
789
- var _this6 = this;
779
+ var _this5 = this;
790
780
 
791
781
  var sHash = window.location.hash;
792
782
 
@@ -814,7 +804,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
814
804
  this._pushNewState(oNewState, false, false, true);
815
805
 
816
806
  setTimeout(function () {
817
- _this6._bDelayedRebuild = false;
807
+ _this5._bDelayedRebuild = false;
818
808
  }, 0);
819
809
  }
820
810
  }
@@ -869,8 +859,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
869
859
  /**
870
860
  * Checks if back exits the present guard set.
871
861
  *
872
- * @param {string} sPresentHash The current hash. Only used for unit tests.
873
- * @returns {boolean} `true` if back exits there is a guard exit on back
862
+ * @param sPresentHash The current hash. Only used for unit tests.
863
+ * @returns `true` if back exits there is a guard exit on back
874
864
  */
875
865
  ;
876
866
 
@@ -919,7 +909,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
919
909
  /**
920
910
  * Checks if the last 2 entries in the history share the same context.
921
911
  *
922
- * @returns {boolean} `true` if they share the same context.
912
+ * @returns `true` if they share the same context.
923
913
  */
924
914
  ;
925
915
 
@@ -937,4 +927,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
937
927
  }(BaseObject)) || _class);
938
928
  return RouterProxy;
939
929
  }, false);
940
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRlclByb3h5LnRzIl0sIm5hbWVzIjpbImVudW1TdGF0ZSIsIkVRVUFMIiwiQ09NUEFUSUJMRSIsIkFOQ0VTVE9SIiwiRElGRkVSRU5UIiwiZW51bVVSTFBhcmFtcyIsIkxBWU9VVFBBUkFNIiwiSUFQUFNUQVRFUEFSQU0iLCJjcmVhdGVHdWFyZEZyb21IYXNoIiwic0d1YXJkSGFzaCIsIl9ndWFyZEhhc2giLCJyZXBsYWNlIiwiY2hlY2siLCJzSGFzaCIsImluZGV4T2YiLCJmaW5kQXBwU3RhdGVJbkhhc2giLCJhQXBwU3RhdGUiLCJtYXRjaCIsIlJlZ0V4cCIsImxlbmd0aCIsInJlbW92ZUFwcFN0YXRlSW5IYXNoIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsIlJvdXRlclByb3h5IiwiZGVmaW5lVUk1Q2xhc3MiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5IiwiYklzR3VhcmRDcm9zc0FsbG93ZWQiLCJzSUFwcFN0YXRlS2V5IiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiX2JBcHBseVJlc3RvcmUiLCJfYkRlbGF5ZWRSZWJ1aWxkIiwiX3BhdGhNYXBwaW5ncyIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJiaW5kIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9mbkhhc2hHdWFyZCIsImhhc2hHdWFyZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib1JvdXRlciIsIl9vUm91dGVyIiwiX29NYW5hZ2VkSGlzdG9yeSIsIl9vTmF2aWdhdGlvbkd1YXJkIiwic0N1cnJlbnRBcHBIYXNoIiwiZ2V0SGFzaCIsInB1c2giLCJfZXh0cmFjdFN0YXRlRnJvbUhhc2giLCJnZXRIYXNoQ2hhbmdlciIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZWQiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJuYXZUb0hhc2giLCJiUHJlc2VydmVIaXN0b3J5IiwiYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSIsImJGb3JjZUZvY3VzIiwiYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsIndhaXRGb3IiLCJ1bmRlZmluZWQiLCJfaW50ZXJuYWxOYXZUb0hhc2giLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiY29uZmlybSIsImdldFRleHQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9OZXdTdGF0ZSIsImFDdXJyZW50SGFzaEtleXMiLCJfZXh0cmFjdEtleXNGcm9tSGFzaCIsImtleXMiLCJldmVyeSIsImtleSIsImluZGV4Iiwib0hpc3RvcnlBY3Rpb24iLCJfcHVzaE5ld1N0YXRlIiwiX3JlYnVpbGRCcm93c2VySGlzdG9yeSIsInJlc3RvcmVIaXN0b3J5Iiwic1RhcmdldEhhc2giLCJuYXZCYWNrIiwic0N1cnJlbnRIYXNoIiwic1ByZXZpb3VzSGFzaCIsImkiLCJoYXNoIiwiYmFjayIsIm5hdlRvIiwic1JvdXRlTmFtZSIsIm9QYXJhbWV0ZXJzIiwiZ2V0VVJMIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJJc1N0aWNreU1vZGUiLCJleGl0RnJvbUFwcCIsImJhY2tUb1ByZXZpb3VzQXBwIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwic3Vic3RyaW5nIiwib0xvY2FsR3VhcmQiLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsInJlc29sdmVSb3V0ZU1hdGNoIiwiU3luY2hyb25pemF0aW9uIiwic0hhc2hOb1BhcmFtcyIsInNwbGl0IiwiYVRva2VucyIsImFLZXlzIiwiZm9yRWFjaCIsInNUb2tlbiIsInJlZ2V4S2V5IiwidGVzdCIsIm9TdGF0ZSIsImFMYXlvdXQiLCJzTGF5b3V0Iiwic2NyZWVuTW9kZSIsImJSZWJ1aWxkT25seSIsImJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiIsImxhc3RJbmRleCIsImlQb3BDb3VudCIsInBvcCIsInByZXNlcnZlZCIsIm9MYXN0UmVtb3ZlZEl0ZW0iLCJvVG9wU3RhdGUiLCJfY29tcGFyZUNhY2hlU3RhdGVzIiwib01hbmFnZWRTdGF0ZSIsInNQcmV2aW91c0lBcHBTdGF0ZUtleSIsIm9Db21wYXJpc29uU3RhdGVSZXN1bHQiLCJiSGFzU2FtZUhhc2giLCJ0eXBlIiwic3RlcHMiLCJfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwic3RvcCIsIl9lbmFibGVFdmVudE9uSGFzaENoYW5nZSIsImJJZ25vcmVDdXJyZW50SGFzaCIsImluaXRpYWxpemUiLCJ0aGF0Iiwib1RhcmdldFN0YXRlIiwibmV3TGV2ZWwiLCJyZXBsYWNlQXN5bmMiLCJyZXBsYWNlSGFzaCIsInNldFRpbWVvdXQiLCJiYWNrUmVwbGFjZUFzeW5jIiwiYmFja0FzeW5jIiwic2V0SGFzaCIsImdvIiwiZ2V0TGFzdEhpc3RvcnlFbnRyeSIsInNldFBhdGhNYXBwaW5nIiwibWFwcGluZ3MiLCJmaWx0ZXIiLCJtYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJmaW5kIiwibSIsImFIYXNoU3BsaXQiLCJzQXBwSGFzaCIsIm9TdGF0ZTEiLCJvU3RhdGUyIiwiZXF1YWwiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInNQcmVzZW50SGFzaCIsInNQcmV2SGFzaCIsIm9TcGxpdEhhc2giLCJzcGxpdEhhc2giLCJhcHBTcGVjaWZpY1JvdXRlIiwiVVJJIiwiZGVjb2RlIiwiY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCIsIm9DdXJyZW50U3RhdGUiLCJvUHJldmlvdXNTdGF0ZSIsIkJhc2VPYmplY3QiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVNBLE1BQU1BLFNBQVMsR0FBRztBQUNqQkMsSUFBQUEsS0FBSyxFQUFFLENBRFU7QUFFakJDLElBQUFBLFVBQVUsRUFBRSxDQUZLO0FBR2pCQyxJQUFBQSxRQUFRLEVBQUUsQ0FITztBQUlqQkMsSUFBQUEsU0FBUyxFQUFFO0FBSk0sR0FBbEI7QUFNQSxNQUFNQyxhQUFhLEdBQUc7QUFDckJDLElBQUFBLFdBQVcsRUFBRSxRQURRO0FBRXJCQyxJQUFBQSxjQUFjLEVBQUU7QUFGSyxHQUF0QjtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxXQUFTQyxtQkFBVCxDQUE2QkMsVUFBN0IsRUFBaUQ7QUFDaEQsV0FBTztBQUNOQyxNQUFBQSxVQUFVLEVBQUVELFVBQVUsQ0FBQ0UsT0FBWCxDQUFtQixXQUFuQixFQUFnQyxFQUFoQyxDQUROO0FBQzJDO0FBQ2pEQyxNQUFBQSxLQUFLLEVBQUUsVUFBVUMsS0FBVixFQUFzQjtBQUM1QixlQUFPQSxLQUFLLENBQUNDLE9B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LENBQTVDLEVBQStDaUcsQ0FBQyxHQUFHLENBQW5ELEVBQXNEQSxDQUFDLEVBQXZELEVBQTJEO0FBQzFELGNBQUksS0FBSzVDLGdCQUFMLENBQXNCNEMsQ0FBdEIsRUFBeUJDLElBQXpCLEtBQWtDOEUsWUFBdEMsRUFBb0Q7QUFDbkRDLFlBQUFBLFNBQVMsR0FBRyxLQUFLNUgsZ0JBQUwsQ0FBc0I0QyxDQUFDLEdBQUcsQ0FBMUIsRUFBNkJDLElBQXpDO0FBQ0E7QUFDQTtBQUNEOztBQUVELGVBQU8sQ0FBQytFLFNBQUQsSUFBYyxDQUFDLEtBQUt2RyxrQkFBTCxDQUF3QnVHLFNBQXhCLENBQXRCO0FBQ0E7O0FBQ0QsYUFBTyxLQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ00seUIsR0FBQSxxQ0FBNEI7QUFDM0IsVUFBSSxLQUFLbEksZ0JBQUwsQ0FBc0JyRCxNQUF0QixHQUErQixDQUFuQyxFQUFzQztBQUNyQyxlQUFPLEtBQVA7QUFDQTs7QUFFRCxVQUFNd0wsYUFBYSxHQUFHLEtBQUtuSSxnQkFBTCxDQUFzQixLQUFLQSxnQkFBTCxDQUFzQnJELE1BQXRCLEdBQStCLENBQXJELENBQXRCO0FBQ0EsVUFBTXlMLGNBQWMsR0FBRyxLQUFLcEksZ0JBQUwsQ0FBc0IsS0FBS0EsZ0JBQUwsQ0FBc0JyRCxNQUF0QixHQUErQixDQUFyRCxDQUF2QjtBQUVBLGFBQU93TCxhQUFhLENBQUN0RixJQUFkLENBQW1Cc0IsS0FBbkIsQ0FBeUIsR0FBekIsRUFBOEIsQ0FBOUIsTUFBcUNpRSxjQUFjLENBQUN2RixJQUFmLENBQW9Cc0IsS0FBcEIsQ0FBMEIsR0FBMUIsRUFBK0IsQ0FBL0IsQ0FBNUM7QUFDQSxLOzs7SUFsd0J3QmtFLFU7U0Fxd0JYckwsVyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgU3luY2hyb25pemF0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N5bmNocm9uaXphdGlvblwiO1xuaW1wb3J0IHsgSVNoZWxsU2VydmljZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2hlbGxTZXJ2aWNlc0ZhY3RvcnlcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmNvbnN0IGVudW1TdGF0ZSA9IHtcblx0RVFVQUw6IDAsXG5cdENPTVBBVElCTEU6IDEsXG5cdEFOQ0VTVE9SOiAyLFxuXHRESUZGRVJFTlQ6IDNcbn07XG5jb25zdCBlbnVtVVJMUGFyYW1zID0ge1xuXHRMQVlPVVRQQVJBTTogXCJsYXlvdXRcIixcblx0SUFQUFNUQVRFUEFSQU06IFwic2FwLWlhcHAtc3RhdGVcIlxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgSGFzaEd1YXJkIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc0d1YXJkSGFzaCBUaGUgaGFzaCB1c2VkIGZvciB0aGUgZ3VhcmRcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBjcmVhdGVkIGhhc2ggZ3VhcmRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlR3VhcmRGcm9tSGFzaChzR3VhcmRIYXNoOiBzdHJpbmcpIHtcblx0cmV0dXJuIHtcblx0XHRfZ3VhcmRIYXNoOiBzR3VhcmRIYXNoLnJlcGxhY2UoL1xcP1teXFw/XSokLywgXCJcIiksIC8vIFJlbW92ZSBxdWVyeSBwYXJ0XG5cdFx0Y2hlY2s6IGZ1bmN0aW9uIChzSGFzaDogYW55KSB7XG5cdFx0XHRyZXR1cm4gc0hhc2guaW5kZXhPZih0aGlzLl9ndWFyZEhhc2gpID09PSAwO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaUFwcFN0YXRlIHBhcnQgZnJvbSBhIGhhc2ggKG9yIG51bGwgaWYgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc0hhc2ggVGhlIGhhc2hcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBpQXBwU3RhdGUgcGFydCBvZiB0aGUgaGFzaFxuICovXG5mdW5jdGlvbiBmaW5kQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRjb25zdCBhQXBwU3RhdGUgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKFwiXFxcXD8uKlwiICsgZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTSArIFwiPShbXiZdKilcIikpO1xuXHRyZXR1cm4gYUFwcFN0YXRlICYmIGFBcHBTdGF0ZS5sZW5ndGggPiAxID8gYUFwcFN0YXRlWzFdIDogbnVsbDtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhc2ggd2l0aG91dCBpdHMgaUFwcFN0YXRlIHBhcnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNIYXNoIFRoZSBoYXNoXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaGFzaCB3aXRob3V0IHRoZSBpQXBwU3RhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZykge1xuXHRyZXR1cm4gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKFwiWyY/XSpcIiArIGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0gKyBcIj1bXiZdKlwiKSwgXCJcIik7XG59XG4vKipcbiAqIEFkZHMgYW4gaUFwcFN0YXRlIGluc2lkZSBhIGhhc2ggKG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSkuXG4gKlxuICogQHBhcmFtIHsqfSBzSGFzaCBUaGUgaGFzaFxuICogQHBhcmFtIHsqfSBzQXBwU3RhdGVLZXkgVGhlIGlBcHBTdGF0ZSB0byBhZGRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBoYXNoIHdpdGggdGhlIGFwcCBzdGF0ZVxuICovXG5mdW5jdGlvbiBzZXRBcHBTdGF0ZUluSGFzaChzSGFzaDogYW55LCBzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRsZXQgc05ld0hhc2g7XG5cblx0aWYgKHNIYXNoLmluZGV4T2YoZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTSkgPj0gMCkge1xuXHRcdC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBpQXBwU3RhdGUgcGFyYW1ldGVyIGluIHRoZSBoYXNoLCByZXBsYWNlIGl0XG5cdFx0c05ld0hhc2ggPSBzSGFzaC5yZXBsYWNlKG5ldyBSZWdFeHAoZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTSArIFwiPVteJl0qXCIpLCBlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNICsgXCI9XCIgKyBzQXBwU3RhdGVLZXkpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEFkZCB0aGUgaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaFxuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwiP1wiKSA8IDApIHtcblx0XHRcdHNOZXdIYXNoID0gc0hhc2ggKyBcIj9cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0hhc2ggPSBzSGFzaCArIFwiJlwiO1xuXHRcdH1cblx0XHRzTmV3SGFzaCArPSBlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNICsgXCI9XCIgKyBzQXBwU3RhdGVLZXk7XG5cdH1cblxuXHRyZXR1cm4gc05ld0hhc2g7XG59XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLlJvdXRlclByb3h5XCIpXG5jbGFzcyBSb3V0ZXJQcm94eSBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0YklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXHRiSXNHdWFyZENyb3NzQWxsb3dlZCA9IGZhbHNlO1xuXHRzSUFwcFN0YXRlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblx0X29TaGVsbFNlcnZpY2VzITogSVNoZWxsU2VydmljZXM7XG5cdGZjbEVuYWJsZWQhOiBib29sZWFuO1xuXHRfZm5CbG9ja2luZ05hdkZpbHRlciE6IEZ1bmN0aW9uO1xuXHRfZm5IYXNoR3VhcmQhOiBGdW5jdGlvbjtcblx0X2JEaXNhYmxlT25IYXNoQ2hhbmdlITogYm9vbGVhbjtcblx0X2JJZ25vcmVSZXN0b3JlITogYm9vbGVhbjtcblx0X2JGb3JjZUZvY3VzITogYm9vbGVhbjtcblx0X29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdF9vTWFuYWdlZEhpc3RvcnkhOiBhbnlbXTtcblx0X29OYXZpZ2F0aW9uR3VhcmQ6IGFueTtcblx0b1Jlc291cmNlQnVuZGxlPzogUmVzb3VyY2VCdW5kbGU7XG5cdF9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbj86IFN5bmNocm9uaXphdGlvbjtcblx0X2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvOiBib29sZWFuID0gZmFsc2U7XG5cdF9iQXBwbHlSZXN0b3JlOiBib29sZWFuID0gZmFsc2U7XG5cdF9iRGVsYXllZFJlYnVpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X3BhdGhNYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10gPSBbXTtcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IGFueSwgaXNmY2xFbmFibGVkOiBib29sZWFuKSB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXG5cdFx0XHRcdHRoaXMuaW5pdFJhdyhvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpKTtcblx0XHRcdFx0Ly8gV2Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSBpbml0aWFsIHJvdXRlTWF0Y2hlZCBpcyBkb25lIGJlZm9yZSBkb2luZyBhbnkgbmF2aWdhdGlvblxuXHRcdFx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0XHRcdC8vIFNldCBmZUxldmVsPTAgZm9yIHRoZSBmaXJzdCBBcHBsaWNhdGlvbiBwYWdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZlTGV2ZWw6IDBcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbiBhcyBhbnlcblx0XHRcdFx0KTtcblx0XHRcdFx0dGhpcy5mY2xFbmFibGVkID0gaXNmY2xFbmFibGVkO1xuXG5cdFx0XHRcdHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIgPSB0aGlzLl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBzaGVsbCBzZXJ2aWNlc1wiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0dGhpcy5fZm5IYXNoR3VhcmQgPSB0aGlzLmhhc2hHdWFyZC5iaW5kKHRoaXMpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JJZ25vcmVSZXN0b3JlID0gZmFsc2U7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSB0cnVlOyAvLyBUcmlnZ2VyIHRoZSBmb2N1cyBtZWNoYW5pc20gZm9yIHRoZSBmaXJzdCB2aWV3IGRpc3BsYXllZCBieSB0aGUgYXBwXG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLl9vU2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0fVxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSYXcgaW5pdGlhbGl6YXRpb24gKGZvciB1bml0IHRlc3RzKS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS5yb3V0aW5nLlJvdXRlcn0gb1JvdXRlciBUaGUgcm91dGVyIHVzZWQgYnkgdGhpcyBwcm94eVxuXHQgKi9cblx0aW5pdFJhdyhvUm91dGVyOiBSb3V0ZXIpIHtcblx0XHR0aGlzLl9vUm91dGVyID0gb1JvdXRlcjtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkgPSBbXTtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblxuXHRcdGNvbnN0IHNDdXJyZW50QXBwSGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNDdXJyZW50QXBwSGFzaCkpO1xuXG5cdFx0Ly8gU2V0IHRoZSBpQXBwU3RhdGUgaWYgdGhlIGluaXRpYWwgaGFzaCBjb250YWlucyBvbmVcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBmaW5kQXBwU3RhdGVJbkhhc2goc0N1cnJlbnRBcHBIYXNoKTtcblx0fVxuXG5cdGdldEhhc2goKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCk7XG5cdH1cblxuXHRpc0ZvY3VzRm9yY2VkKCkge1xuXHRcdHJldHVybiB0aGlzLl9iRm9yY2VGb2N1cztcblx0fVxuXG5cdHNldEZvY3VzRm9yY2VkKGJGb3JjZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLl9iRm9yY2VGb2N1cyA9IGJGb3JjZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmVzZXRzIHRoZSBpbnRlcm5hbCB2YXJpYWJsZSBzSUFwcFN0YXRlS2V5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuUm91dGVyUHJveHkjcmVtb3ZlSUFwcFN0YXRlS2V5XG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0cmVtb3ZlSUFwcFN0YXRlS2V5KCkge1xuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgaGFzaC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5I25hdlRvSGFzaFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuUm91dGVyUHJveHlcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0hhc2ggSGFzaCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVIaXN0b3J5IElmIHNldCB0byB0cnVlLCBub24tYW5jZXN0b3IgZW50cmllcyBpbiBoaXN0b3J5IHdpbGwgYmUgcmV0YWluZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlIElmIHNldCB0byB0cnVlLCBjYWNoZSBwcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYkZvcmNlRm9jdXMgSWYgc2V0IHRvIHRydWUsIHRoZSBsb2dpYyB0byBzZXQgdGhlIGZvY3VzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkIHdpbGwgYmUgdHJpZ2dlcmVkIChvblBhZ2VSZWFkeSlcblx0ICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciBJZiBub3Qgc2V0IHRvIGZhbHNlLCB0aGUgYmFjayBuYXZpZ2F0aW9uIGlzIHNldCB0byB1bmRlZmluZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRuYXZUb0hhc2goXG5cdFx0c0hhc2g6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW4sXG5cdFx0YlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXI/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmIChiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciAhPT0gZmFsc2UpIHtcblx0XHRcdHRoaXMuX29TaGVsbFNlcnZpY2VzLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLndhaXRGb3IoKS50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybykge1xuXHRcdFx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuX2ludGVybmFsTmF2VG9IYXNoKHNIYXNoLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlLCBiRm9yY2VGb2N1cyk7XG5cdFx0fVxuXHR9XG5cblx0X2ludGVybmFsTmF2VG9IYXNoKHNIYXNoOiBhbnksIGJQcmVzZXJ2ZUhpc3Rvcnk6IGFueSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZTogYW55LCBiRm9yY2VGb2N1cz86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBBZGQgdGhlIGFwcCBzdGF0ZSBpbiB0aGUgaGFzaCBpZiBuZWVkZWRcblx0XHRpZiAodGhpcy5mY2xFbmFibGVkICYmIHRoaXMuc0lBcHBTdGF0ZUtleSAmJiAhZmluZEFwcFN0YXRlSW5IYXNoKHNIYXNoKSkge1xuXHRcdFx0c0hhc2ggPSBzZXRBcHBTdGF0ZUluSGFzaChzSGFzaCwgdGhpcy5zSUFwcFN0YXRlS2V5KTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoKSkge1xuXHRcdFx0aWYgKCF0aGlzLm9SZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlIGhhdmUgdG8gdXNlIGEgY29uZmlybSBoZXJlIGZvciBVSSBjb25zaXN0ZW5jeSByZWFzb25zLCBhcyB3aXRoIHNvbWUgc2NlbmFyaW9zXG5cdFx0XHQvLyBpbiB0aGUgRWRpdEZsb3cgd2UgcmVseSBvbiBhIFVJNSBtZWNoYW5pc20gdGhhdCBkaXNwbGF5cyBhIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFsZXJ0XG5cdFx0XHRpZiAoIWNvbmZpcm0odGhpcy5vUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfUk9VVEVSX1BST1hZX1NBUEZFX0VYSVRfTk9UU0FWRURfTUVTU0FHRVwiKSkpIHtcblx0XHRcdFx0Ly8gVGhlIHVzZXIgY2xpY2tlZCBvbiBDYW5jZWwgLS0+IGNhbmNlbCBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gSW4gY2FzZSB0aGUgbmF2aWdhdGlvbiB3aWxsIGNhdXNlIGEgbmV3IHZpZXcgdG8gYmUgZGlzcGxheWVkLCB3ZSBmb3JjZSB0aGUgZm9jdXNcblx0XHQvLyBJLmUuIGlmIHRoZSBrZXlzIGZvciB0aGUgaGFzaCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGN1cnJlbnQgaGFzaCBrZXlzLlxuXHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNIYXNoKTtcblx0XHRpZiAoIXRoaXMuX2JGb3JjZUZvY3VzKSB7XG5cdFx0XHQvLyBJZiB0aGUgZm9jdXMgd2FzIGFscmVhZHkgZm9yY2VkLCBrZWVwIGl0XG5cdFx0XHRjb25zdCBhQ3VycmVudEhhc2hLZXlzID0gdGhpcy5fZXh0cmFjdEtleXNGcm9tSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0XHR0aGlzLl9iRm9yY2VGb2N1cyA9XG5cdFx0XHRcdGJGb3JjZUZvY3VzIHx8XG5cdFx0XHRcdChhQ3VycmVudEhhc2hLZXlzLmxlbmd0aCA8IG9OZXdTdGF0ZS5rZXlzLmxlbmd0aCAmJlxuXHRcdFx0XHRcdGFDdXJyZW50SGFzaEtleXMuZXZlcnkoZnVuY3Rpb24gKGtleTogYW55LCBpbmRleDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ga2V5ID09PSBvTmV3U3RhdGUua2V5c1tpbmRleF07XG5cdFx0XHRcdFx0fSkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgZmFsc2UsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyBicm93c2VyIGhpc3RvcnkgaWYgZW50cmllcyBoYXZlIGJlZW4gYWRkZWQgd2l0aG91dCB1c2luZyB0aGUgUm91dGVyUHJveHkuXG5cdCAqIFVwZGF0ZXMgdGhlIGludGVybmFsIGhpc3RvcnkgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgaGlzdG9yeSBpcyByZWJ1aWx0XG5cdCAqL1xuXHRyZXN0b3JlSGlzdG9yeSgpIHtcblx0XHRpZiAodGhpcy5fYkFwcGx5UmVzdG9yZSkge1xuXHRcdFx0dGhpcy5fYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXHRcdFx0bGV0IHNUYXJnZXRIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0XHRzVGFyZ2V0SGFzaCA9IHNUYXJnZXRIYXNoLnJlcGxhY2UoLyhcXD98JilyZXN0b3JlSGlzdG9yeT10cnVlLywgXCJcIik7XG5cdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzVGFyZ2V0SGFzaCk7XG5cblx0XHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgaGlzdG9yeS5cblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0bmF2QmFjaygpIHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgc1ByZXZpb3VzSGFzaDtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBjdXJyZW50IGhhc2ggaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0c1ByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNQcmV2aW91c0hhc2gpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzUHJldmlvdXNIYXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCBhIHByZXZpb3VzIGhhc2ggaW4gaGlzdG9yeVxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgdHJhbnNpZW50IGhhc2ggaW4gYSBjcmVhdGUgYXBwLCBhbmRcblx0XHRcdC8vIGluIHRoYXQgY2FzZSBoaXN0b3J5LmJhY2sgd291bGQgZ28gYmFjayB0byB0aGUgRkxQXG5cdFx0XHR3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlIHdpdGggcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNSb3V0ZU5hbWUgVGhlIHJvdXRlIG5hbWUgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0bmF2VG8oc1JvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKHNIYXNoLCBmYWxzZSwgb1BhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZSwgZmFsc2UsICFvUGFyYW1ldGVycy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGl0cyB0aGUgY3VycmVudCBhcHAgYnkgbmF2aWdhdGluZyBiYWNrXG5cdCAqIHRvIHRoZSBwcmV2aW91cyBhcHAgKGlmIGFueSkgb3IgdGhlIEZMUC5cblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHdlIGV4aXQgdGhlIGFwcFxuXHQgKi9cblx0ZXhpdEZyb21BcHAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaGVsbFNlcnZpY2VzLmJhY2tUb1ByZXZpb3VzQXBwKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBoYXNoIGNhbiBoYXZlIGFuIGltcGFjdCBvbiB0aGUgY3VycmVudCBzdGF0ZVxuXHQgKiBpLmUuIGlmIHRoZSBoYXNoIGlzIGVxdWFsLCBjb21wYXRpYmxlIG9yIGFuIGFuY2VzdG9yIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IHNIYXNoIGB0cnVlYCBpZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICogQHJldHVybnMge2Jvb2xlYW59IElmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKi9cblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNIYXNoOiBhbnkpIHtcblx0XHRpZiAoc0hhc2hbMF0gPT09IFwiL1wiKSB7XG5cdFx0XHRzSGFzaCA9IHNIYXNoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0xvY2FsR3VhcmQgPSBjcmVhdGVHdWFyZEZyb21IYXNoKHNIYXNoKTtcblx0XHRyZXR1cm4gb0xvY2FsR3VhcmQuY2hlY2sodGhpcy5nZXRIYXNoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59IGBmYWxzZWAgaWYgYSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBpbiB0aGUgUm91dGVyUHJveHkgYW5kIGlzIG5vdCB5ZXQgZmluYWxpemVkXG5cdCAqL1xuXHRpc05hdmlnYXRpb25GaW5hbGl6ZWQoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyAmJiAhdGhpcy5fYkRlbGF5ZWRSZWJ1aWxkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxhc3Qgc3RhdGUgYXMgYSBndWFyZC5cblx0ICogRWFjaCBmdXR1cmUgbmF2aWdhdGlvbiB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGlzIGd1YXJkLCBhbmQgYSBjb25maXJtYXRpb24gZGlhbG9nIHdpbGxcblx0ICogYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgbmF2aWdhdGlvbiBjcm9zc2VzIHRoZSBndWFyZCAoaS5lLiBnb2VzIHRvIGFuIGFuY2VzdG9yIG9mIHRoZSBndWFyZCkuXG5cdCAqXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCBmb3IgdGhlIGd1YXJkXG5cdCAqL1xuXHRzZXROYXZpZ2F0aW9uR3VhcmQoc0hhc2g6IHN0cmluZykge1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPSBjcmVhdGVHdWFyZEZyb21IYXNoKHNIYXNoKTtcblx0XHR0aGlzLmJJc0d1YXJkQ3Jvc3NBbGxvd2VkID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZXMgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqL1xuXHRkaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCkge1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBuYXZpZ2F0aW5nIGd1YXJkIGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0aGFzTmF2aWdhdGlvbkd1YXJkKCkge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkICE9PSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRlc3RzIGEgaGFzaCBhZ2FpbnN0IHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdGVzdGVkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgbmF2aWdhdGluZyB0byB0aGUgaGFzaCBkb2Vzbid0IGNyb3NzIHRoZSBndWFyZFxuXHQgKi9cblx0Y2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCA9PT0gbnVsbCB8fCB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkLmNoZWNrKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHVzZXIgYWxsb3dlZCB0aGUgbmF2aWdhdGlvbiBndWFyZCB0byBiZSBjcm9zc2VkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYmVlbiBhbGxvd2VkIGJ5IHRoZSB1c2VyXG5cdCAqL1xuXHRpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkge1xuXHRcdHJldHVybiB0aGlzLmJJc0d1YXJkQ3Jvc3NBbGxvd2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFjdGl2YXRlcyB0aGUgc3luY2hyb25pemF0aW9uIGZvciByb3V0ZU1hdGNoZWRFdmVudC5cblx0ICogVGhlIG5leHQgTmF2VG9IYXNoIGNhbGwgd2lsbCBjcmVhdGUgYSBTeW5jaHJvbml6YXRpb24gb2JqZWN0IHRoYXQgd2lsbCBiZSByZXNvbHZlZFxuXHQgKiBieSB0aGUgY29ycmVzcG9uZGluZyBvblJvdXRlTWF0Y2hlZCBldmVudCwgcHJldmVudGluZyBhbm90aGVyIE5hdlRvSGFzaCB0byBoYXBwZW4gaW4gcGFyYWxsZWwuXG5cdCAqL1xuXHRhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKSB7XG5cdFx0dGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc29sdmUgdGhlIHJvdXRlTWF0Y2ggc3luY2hyb25pemF0aW9uIG9iamVjdCwgdW5sb2NraW5nIHBvdGVudGlhbCBwZW5kaW5nIE5hdlRvSGFzaCBjYWxscy5cblx0ICovXG5cdHJlc29sdmVSb3V0ZU1hdGNoKCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbikge1xuXHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24ucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlcyBzdXJlIG5vIG5hdmlnYXRpb24gY2FuIGhhcHBlbiBiZWZvcmUgYSByb3V0ZU1hdGNoIGhhcHBlbmVkLlxuXHQgKi9cblx0d2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCkge1xuXHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uID0gbmV3IFN5bmNocm9uaXphdGlvbigpO1xuXHRcdHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gZmFsc2U7XG5cdH1cblxuXHRfZXh0cmFjdEtleXNGcm9tSGFzaChzSGFzaDogYW55KSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cdFx0Y29uc3Qgc0hhc2hOb1BhcmFtcyA9IHNIYXNoLnNwbGl0KFwiP1wiKVswXTsgLy8gcmVtb3ZlIHBhcmFtc1xuXHRcdGNvbnN0IGFUb2tlbnMgPSBzSGFzaE5vUGFyYW1zLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBhS2V5czogYW55W10gPSBbXTtcblxuXHRcdGFUb2tlbnMuZm9yRWFjaChmdW5jdGlvbiAoc1Rva2VuOiBhbnkpIHtcblx0XHRcdGNvbnN0IHJlZ2V4S2V5ID0gL1teXFwoXFwpXStcXChbXlxcKFxcKV0rXFwpLzsgLy8gYWJjKGRlZilcblx0XHRcdGlmIChyZWdleEtleS50ZXN0KHNUb2tlbikpIHtcblx0XHRcdFx0YUtleXMucHVzaChzVG9rZW4uc3BsaXQoXCIoXCIpWzBdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBhS2V5cztcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBzdGF0ZSBmcm9tIGEgaGFzaC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNIYXNoIFRoZSBoYXNoIHRvIGJlIHVzZWQgYXMgZW50cnlcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIHN0YXRlXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNIYXNoOiBzdHJpbmcpIHtcblx0XHRpZiAoc0hhc2ggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c0hhc2ggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9TdGF0ZTogYW55ID0ge1xuXHRcdFx0a2V5czogdGhpcy5fZXh0cmFjdEtleXNGcm9tSGFzaChzSGFzaClcblx0XHR9O1xuXG5cdFx0Ly8gUmV0cmlldmUgbGF5b3V0IChpZiBhbnkpXG5cdFx0Y29uc3QgYUxheW91dCA9IHNIYXNoLm1hdGNoKG5ldyBSZWdFeHAoXCJcXFxcPy4qXCIgKyBlbnVtVVJMUGFyYW1zLkxBWU9VVFBBUkFNICsgXCI9KFteJl0qKVwiKSk7XG5cdFx0b1N0YXRlLnNMYXlvdXQgPSBhTGF5b3V0ICYmIGFMYXlvdXQubGVuZ3RoID4gMSA/IGFMYXlvdXRbMV0gOiBudWxsO1xuXHRcdGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMTtcblx0XHR9IGVsc2UgaWYgKG9TdGF0ZS5zTGF5b3V0ID09PSBcIkVuZENvbHVtbkZ1bGxTY3JlZW5cIikge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDA7XG5cdFx0fVxuXG5cdFx0b1N0YXRlLmhhc2ggPSBzSGFzaDtcblx0XHRyZXR1cm4gb1N0YXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBuZXcgc3RhdGUgaW50byB0aGUgaW50ZXJuYWwgaGlzdG9yeSBzdHJ1Y3R1cmUuXG5cdCAqIE1ha2VzIHN1cmUgdGhpcyBuZXcgc3RhdGUgaXMgYWRkZWQgYWZ0ZXIgYW4gYW5jZXN0b3IuXG5cdCAqIEFsc28gc2V0cyB0aGUgaUFwcFN0YXRlIGtleSBpbiB0aGUgd2hvbGUgaGlzdG9yeS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmV3U3RhdGUgVGhlIG5ldyBzdGF0ZSB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgd2UncmUgcmVidWlsZGluZyB0aGUgaGlzdG9yeSBhZnRlciBhIHNoZWxsIG1lbnUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJQcmVzZXJ2ZUhpc3RvcnkgSWYgc2V0IHRvIHRydWUsIG5vbi1hbmNlc3RvciBlbnRyaWVzIGluIGhpc3Rvcnkgd2lsbCBiZSByZXRhaW5lZFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiBEaXNhYmxlIHRoZSBtZWNoYW5pc20gdG8gcmV0YWluZWQgbWFya2VkIGVudHJpZXMgaW4gY2FjaGVcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIG5ldyBzdGF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZTogYW55LCBiUmVidWlsZE9ubHk6IGJvb2xlYW4sIGJQcmVzZXJ2ZUhpc3Rvcnk6IGJvb2xlYW4sIGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbjogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNDdXJyZW50SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdGxldCBsYXN0SW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblx0XHRsZXQgaVBvcENvdW50ID0gYlJlYnVpbGRPbmx5ID8gMSA6IDA7XG5cblx0XHQvLyAxLiBEbyBzb21lIGNsZWFudXAgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSA6IGluIGNhc2UgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZCBiYWNrIGluIHRoZSBicm93c2VyIGhpc3RvcnksIHdlIG5lZWQgdG8gcmVtb3ZlXG5cdFx0Ly8gdGhlIHN0YXRlcyBhaGVhZCBpbiBoaXN0b3J5IGFuZCBtYWtlIHN1cmUgdGhlIHRvcCBzdGF0ZSBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBwYWdlXG5cdFx0Ly8gV2UgZG9uJ3QgZG8gdGhhdCB3aGVuIHJlc3RvcmluZyB0aGUgaGlzdG9yeSwgYXMgdGhlIGN1cnJlbnQgc3RhdGUgaGFzIGJlZW4gYWRkZWQgb24gdG9wIG9mIHRoZSBicm93c2VyIGhpc3Rvcnlcblx0XHQvLyBhbmQgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0aWYgKCFiUmVidWlsZE9ubHkpIHtcblx0XHRcdHdoaWxlIChsYXN0SW5kZXggPj0gMCAmJiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbbGFzdEluZGV4XS5oYXNoICE9PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRsYXN0SW5kZXgtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaGlzdG9yeS4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgYnJvd3NlciByZWxvYWRcblx0XHRcdFx0Ly8gaGFwcGVuZWQsIGNhdXNpbmcgYSByZWluaXRpYWxpemF0aW9uIG9mIHRoZSBtYW5hZ2VkIGhpc3RvcnkuXG5cdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2UgdXNlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFzIHRoZSBuZXcgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEhhc2gpKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IDAgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDIuIE1hcmsgdGhlIHRvcCBzdGF0ZSBhcyBwcmVzZXJ2ZWQgaWYgcmVxdWlyZWRcblx0XHRpZiAoYlByZXNlcnZlSGlzdG9yeSAmJiAhYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gMy4gVGhlbiBwb3AgYWxsIHN0YXRlcyB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIG9mIHRoZSBuZXcgc3RhdGUsIG9yIHdlIGZpbmQgYSBzdGF0ZSB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkXG5cdFx0bGV0IG9MYXN0UmVtb3ZlZEl0ZW07XG5cdFx0d2hpbGUgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBvVG9wU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uIHx8ICFvVG9wU3RhdGUucHJlc2VydmVkKSAmJlxuXHRcdFx0XHR0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob1RvcFN0YXRlLCBvTmV3U3RhdGUpICE9PSBlbnVtU3RhdGUuQU5DRVNUT1Jcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgdG9wIHN0YXRlIGlzIG5vdCBhbiBhbmNlc3RvciBvZiBvTmV3U3RhdGUgYW5kIGlzIG5vdCBwcmVzZXJ2ZWQgLS0+IHdlIGNhbiBwb3AgaXRcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHR9IGVsc2UgaWYgKG9Ub3BTdGF0ZS5wcmVzZXJ2ZWQgJiYgcmVtb3ZlQXBwU3RhdGVJbkhhc2gob1RvcFN0YXRlLmhhc2gpID09PSByZW1vdmVBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCkpIHtcblx0XHRcdFx0Ly8gV2UgdHJ5IHRvIGFkZCBhIHN0YXRlIHRoYXQgaXMgYWxyZWFkeSBpbiBjYWNoZSAoZHVlIHRvIHByZXNlcnZlZCBmbGFnKSBidXQgd2l0aCBhIGRpZmZlcmVudCBpYXBwLXN0YXRlXG5cdFx0XHRcdC8vIC0tPiB3ZSBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91cyBlbnRyeSAoaXQgd2lsbCBiZSBsYXRlciByZXBsYWNlZCBieSB0aGUgbmV3IG9uZSkgYW5kIHN0b3AgcG9wcGluZ1xuXHRcdFx0XHRvTGFzdFJlbW92ZWRJdGVtID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LnBvcCgpO1xuXHRcdFx0XHRpUG9wQ291bnQrKztcblx0XHRcdFx0b05ld1N0YXRlLnByZXNlcnZlZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnJlYWs7IC8vIEFuY2VzdG9yIG9yIHByZXNlcnZlZCBzdGF0ZSBmb3VuZCAtLT4gd2Ugc3RvcCBwb3BwaW5nIG91dCBzdGF0ZXNcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LiBpQXBwU3RhdGUgbWFuYWdlbWVudFxuXHRcdHRoaXMuc0lBcHBTdGF0ZUtleSA9IGZpbmRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCk7XG5cdFx0aWYgKHRoaXMuZmNsRW5hYmxlZCAmJiB0aGlzLnNJQXBwU3RhdGVLZXkpIHtcblx0XHRcdC8vIEluIGNhc2Ugb2YgRkNMLCB0aGUgbmV3IGFwcCBzdGF0ZSBuZWVkcyB0byBiZSBhcHBsaWVkIHRvIHRoZSB3aG9sZSBoaXN0b3J5XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkuZm9yRWFjaCgob01hbmFnZWRTdGF0ZTogYW55KSA9PiB7XG5cdFx0XHRcdG9NYW5hZ2VkU3RhdGUuaGFzaCA9IHNldEFwcFN0YXRlSW5IYXNoKG9NYW5hZ2VkU3RhdGUuaGFzaCwgdGhpcy5zSUFwcFN0YXRlS2V5KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuZmNsRW5hYmxlZCAmJiBvTGFzdFJlbW92ZWRJdGVtKSB7XG5cdFx0XHRjb25zdCBzUHJldmlvdXNJQXBwU3RhdGVLZXkgPSBmaW5kQXBwU3RhdGVJbkhhc2gob0xhc3RSZW1vdmVkSXRlbS5oYXNoKTtcblx0XHRcdGNvbnN0IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPSB0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob0xhc3RSZW1vdmVkSXRlbSwgb05ld1N0YXRlKTtcblx0XHRcdC8vIGlmIGN1cnJlbnQgc3RhdGUgZG9lc24ndCBjb250YWluIGEgaS1hcHBzdGF0ZSBhbmQgdGhpcyBzdGF0ZSBzaG91bGQgcmVwbGFjZSBhIHN0YXRlIGNvbnRhaW5pbmcgYSBpQXBwU3RhdGVcblx0XHRcdC8vIHRoZW4gdGhlIHByZXZpb3VzIGlBcHBTdGF0ZSBpcyBwcmVzZXJ2ZWRcblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMuc0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHRzUHJldmlvdXNJQXBwU3RhdGVLZXkgJiZcblx0XHRcdFx0KG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5FUVVBTCB8fCBvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID09PSBlbnVtU3RhdGUuQ09NUEFUSUJMRSlcblx0XHRcdCkge1xuXHRcdFx0XHRvTmV3U3RhdGUuaGFzaCA9IHNldEFwcFN0YXRlSW5IYXNoKG9OZXdTdGF0ZS5oYXNoLCBzUHJldmlvdXNJQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDUuIE5vdyB3ZSBjYW4gcHVzaCB0aGUgc3RhdGUgYXQgdGhlIHRvcCBvZiB0aGUgaW50ZXJuYWwgaGlzdG9yeVxuXHRcdGNvbnN0IGJIYXNTYW1lSGFzaCA9IG9MYXN0UmVtb3ZlZEl0ZW0gJiYgb05ld1N0YXRlLmhhc2ggPT09IG9MYXN0UmVtb3ZlZEl0ZW0uaGFzaDtcblx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLmhhc2ggIT09IG9OZXdTdGF0ZS5oYXNoKSB7XG5cdFx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaChvTmV3U3RhdGUpO1xuXHRcdH1cblxuXHRcdC8vIDYuIERldGVybWluZSB3aGljaCBhY3Rpb25zIHRvIGRvIG9uIHRoZSBoaXN0b3J5XG5cdFx0aWYgKGlQb3BDb3VudCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc3RhdGUgd2FzIHBvcHBlZCAtLT4gYXBwZW5kXG5cdFx0XHRyZXR1cm4geyB0eXBlOiBcImFwcGVuZFwiIH07XG5cdFx0fSBlbHNlIGlmIChpUG9wQ291bnQgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgMSBzdGF0ZSB3YXMgcG9wcGVkIC0tPiByZXBsYWNlIGN1cnJlbnQgaGFzaCB1bmxlc3MgaGFzaCBpcyB0aGUgc2FtZSAodGhlbiBub3RoaW5nIHRvIGRvKVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJub25lXCIgfSA6IHsgdHlwZTogXCJyZXBsYWNlXCIgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTW9yZSB0aGFuIDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gZ28gYmFrYyBpbiBoaXN0b3J5IGFuZCByZXBsYWNlIGhhc2ggaWYgbmVjZXNzYXJ5XG5cdFx0XHRyZXR1cm4gYkhhc1NhbWVIYXNoID8geyB0eXBlOiBcImJhY2tcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfSA6IHsgdHlwZTogXCJiYWNrLXJlcGxhY2VcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfTtcblx0XHR9XG5cdH1cblxuXHRfYmxvY2tpbmdOYXZpZ2F0aW9uRmlsdGVyKCkge1xuXHRcdHJldHVybiB0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA/IFwiQ3VzdG9tXCIgOiBcIkNvbnRpbnVlXCI7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgc3RvcCBtZXRob2QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuUm91dGVyUHJveHlcblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpIHtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IHRydWU7XG5cdFx0dGhpcy5fb1JvdXRlci5zdG9wKCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlIHRoZSByb3V0aW5nIGJ5IGNhbGxpbmcgdGhlIHJvdXRlciBpbml0aWFsaXplIG1ldGhvZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5I19lbmFibGVFdmVudE9uSGFzaENoYW5nZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuUm91dGVyUHJveHlcblx0ICogQHBhcmFtIHtib29sZWFufSBbYklnbm9yZUN1cnJlbnRIYXNoXSBJZ25vcmUgdGhlIGxhc3QgaGFzaCBldmVudCB0cmlnZ2VyZWQgYmVmb3JlIHRoZSByb3V0ZXIgaGFzIGluaXRpYWxpemVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9lbmFibGVFdmVudE9uSGFzaENoYW5nZShiSWdub3JlQ3VycmVudEhhc2g6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX29Sb3V0ZXIuaW5pdGlhbGl6ZShiSWdub3JlQ3VycmVudEhhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN5bmNocm9uaXplcyB0aGUgYnJvd3NlciBoaXN0b3J5IHdpdGggdGhlIGludGVybmFsIGhpc3Rvcnkgb2YgdGhlIHJvdXRlclByb3h5LCBhbmQgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIGlmIG5lZWRlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvSGlzdG9yeUFjdGlvbiBTcGVjaWZpZXMgdGhlIG5hdmlnYXRpb24gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgaW50ZXJuYWwgaGlzdG9yeSBpcyBjdXJyZW50bHkgYmVpbmcgcmVidWlsdFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSAocmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQpIHRoYXQgcmV0dXJucyAndHJ1ZScgaWYgYSBuYXZpZ2F0aW9uIHRvb2sgcGxhY2UsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkbid0IGhhcHBlblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uOiBhbnksIGJSZWJ1aWxkT25seTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSB0cnVlO1xuXHRcdFx0Y29uc3Qgb1RhcmdldFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXSxcblx0XHRcdFx0bmV3TGV2ZWwgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblxuXHRcdFx0ZnVuY3Rpb24gcmVwbGFjZUFzeW5jKCkge1xuXHRcdFx0XHRpZiAoIWJSZWJ1aWxkT25seSkge1xuXHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0KHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IG5ld0xldmVsIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblxuXHRcdFx0XHRpZiAoYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBUaW1lb3V0IHRvIGxldCAnaGFzaGNoYW5nZScgZXZlbnQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBieSB0aGUgSGFzaENoYW5nZXIsIHNvIHRoYXRcblx0XHRcdFx0XHRcdC8vIG9uUm91dGVNYXRjaGVkIG5vdGlmaWNhdGlvbiBpc24ndCByYWlzZWRcblx0XHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdC8vIEFzeW5jIGNhbGxiYWNrcyB3aGVuIG5hdmlnYXRpbmcgYmFjaywgaW4gb3JkZXIgdG8gbGV0IGFsbCBub3RpZmljYXRpb25zIGFuZCBldmVudHMgZ2V0IHByb2Nlc3NlZFxuXHRcdFx0ZnVuY3Rpb24gYmFja1JlcGxhY2VBc3luYygpIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrUmVwbGFjZUFzeW5jKTtcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyXG5cdFx0XHRcdFx0cmVwbGFjZUFzeW5jKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiYWNrQXN5bmMoKSB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdHRoYXQuX2JJZ25vcmVSZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0c3dpdGNoIChvSGlzdG9yeUFjdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJyZXBsYWNlXCI6XG5cdFx0XHRcdFx0KHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImFwcGVuZFwiOlxuXHRcdFx0XHRcdHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5zZXRIYXNoKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2tcIjpcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrLXJlcGxhY2VcIjpcblx0XHRcdFx0XHR0aGlzLl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTtcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIE5vIG5hdmlnYXRpb25cblx0XHRcdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpOyAvLyBubyBuYXZpZ2F0aW9uIC0tPiByZXNvbHZlIHRvIGZhbHNlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRMYXN0SGlzdG9yeUVudHJ5KCkge1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0c2V0UGF0aE1hcHBpbmcobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKSB7XG5cdFx0dGhpcy5fcGF0aE1hcHBpbmdzID0gbWFwcGluZ3MuZmlsdGVyKChtYXBwaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWFwcGluZy5vbGRQYXRoICE9PSBtYXBwaW5nLm5ld1BhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHRoYXNoR3VhcmQoKSB7XG5cdFx0bGV0IHNIYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cblx0XHRpZiAoc0hhc2guaW5kZXhPZihcInJlc3RvcmVIaXN0b3J5PXRydWVcIikgIT09IC0xKSB7XG5cdFx0XHR0aGlzLl9iQXBwbHlSZXN0b3JlID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZykge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGhhc2ggbmVlZHMgdG8gYmUgY2hhbmdlZCAodGhpcyBoYXBwZW5zIGluIEZDTCB3aGVuIHN3aXRjaGluZyBiL3cgZWRpdCBhbmQgcmVhZC1vbmx5IHdpdGggMyBjb2x1bW5zIG9wZW4pXG5cdFx0XHRjb25zdCBtYXBwaW5nID0gdGhpcy5fcGF0aE1hcHBpbmdzLmZpbmQoKG0pID0+IHtcblx0XHRcdFx0cmV0dXJuIHNIYXNoLmluZGV4T2YobS5vbGRQYXRoKSA+PSAwO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAobWFwcGluZykge1xuXHRcdFx0XHQvLyBSZXBsYWNlIHRoZSBjdXJyZW50IGhhc2hcblx0XHRcdFx0c0hhc2ggPSBzSGFzaC5yZXBsYWNlKG1hcHBpbmcub2xkUGF0aCwgbWFwcGluZy5uZXdQYXRoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIsIHNIYXNoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFIYXNoU3BsaXQgPSBzSGFzaC5zcGxpdChcIiYvXCIpO1xuXHRcdFx0XHRjb25zdCBzQXBwSGFzaCA9IGFIYXNoU3BsaXRbMV0gPyBhSGFzaFNwbGl0WzFdIDogXCJcIjtcblx0XHRcdFx0aWYgKHRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNBcHBIYXNoKSkge1xuXHRcdFx0XHRcdHRoaXMuX2JEZWxheWVkUmVidWlsZCA9IHRydWU7XG5cdFx0XHRcdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0FwcEhhc2gpO1xuXHRcdFx0XHRcdHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuX2JEZWxheWVkUmVidWlsZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbXBhcmVzIDIgc3RhdGVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXRlMVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1N0YXRlMlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uOlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRVFVQUwgaWYgb1N0YXRlMSBhbmQgb1N0YXRlMiBhcmUgZXF1YWxcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkNPTVBBVElCTEUgaWYgb1N0YXRlMSBhbmQgb1N0YXRlMiBhcmUgY29tcGF0aWJsZVxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuQU5DRVNUT1IgaWYgb1N0YXRlMSBpcyBhbiBhbmNlc3RvciBvZiBvU3RhdGUyXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5ESUZGRVJFTlQgaWYgdGhlIDIgc3RhdGVzIGFyZSBkaWZmZXJlbnRcblx0ICovXG5cblx0X2NvbXBhcmVDYWNoZVN0YXRlcyhvU3RhdGUxOiBhbnksIG9TdGF0ZTI6IGFueSkge1xuXHRcdC8vIEZpcnN0IGNvbXBhcmUgb2JqZWN0IGtleXNcblx0XHRpZiAob1N0YXRlMS5rZXlzLmxlbmd0aCA+IG9TdGF0ZTIua2V5cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UO1xuXHRcdH1cblx0XHRsZXQgZXF1YWwgPSB0cnVlO1xuXHRcdGxldCBpbmRleDtcblx0XHRmb3IgKGluZGV4ID0gMDsgZXF1YWwgJiYgaW5kZXggPCBvU3RhdGUxLmtleXMubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRpZiAob1N0YXRlMS5rZXlzW2luZGV4XSAhPT0gb1N0YXRlMi5rZXlzW2luZGV4XSkge1xuXHRcdFx0XHRlcXVhbCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIWVxdWFsKSB7XG5cdFx0XHQvLyBTb21lIG9iamVjdHMga2V5cyBhcmUgZGlmZmVyZW50XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cblx0XHQvLyBBbGwga2V5cyBmcm9tIG9TdGF0ZTEgYXJlIGluIG9TdGF0ZTIgLS0+IGNoZWNrIGlmIGFuY2VzdG9yXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPCBvU3RhdGUyLmtleXMubGVuZ3RoIHx8IG9TdGF0ZTEuc2NyZWVuTW9kZSA8IG9TdGF0ZTIuc2NyZWVuTW9kZSkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5BTkNFU1RPUjtcblx0XHR9XG5cdFx0aWYgKG9TdGF0ZTEuc2NyZWVuTW9kZSA+IG9TdGF0ZTIuc2NyZWVuTW9kZSkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7IC8vIE5vdCBzdXJlIHRoaXMgY2FzZSBjYW4gaGFwcGVuLi4uXG5cdFx0fVxuXG5cdFx0Ly8gQXQgdGhpcyBzdGFnZSwgdGhlIDIgc3RhdGVzIGhhdmUgdGhlIHNhbWUgb2JqZWN0IGtleXMgKGluIHRoZSBzYW1lIG9yZGVyKSBhbmQgc2FtZSBzY3JlZW5tb2RlXG5cdFx0Ly8gVGhleSBjYW4gYmUgZWl0aGVyIGNvbXBhdGlibGUgb3IgZXF1YWxcblx0XHRyZXR1cm4gb1N0YXRlMS5zTGF5b3V0ID09PSBvU3RhdGUyLnNMYXlvdXQgPyBlbnVtU3RhdGUuRVFVQUwgOiBlbnVtU3RhdGUuQ09NUEFUSUJMRTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYmFjayBleGl0cyB0aGUgcHJlc2VudCBndWFyZCBzZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUHJlc2VudEhhc2ggVGhlIGN1cnJlbnQgaGFzaC4gT25seSB1c2VkIGZvciB1bml0IHRlc3RzLlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGJhY2sgZXhpdHMgdGhlcmUgaXMgYSBndWFyZCBleGl0IG9uIGJhY2tcblx0ICovXG5cdGNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKHNQcmVzZW50SGFzaD86IHN0cmluZykge1xuXHRcdGxldCBzUHJldkhhc2g7XG5cdFx0bGV0IHNDdXJyZW50SGFzaDogc3RyaW5nO1xuXHRcdGlmIChzUHJlc2VudEhhc2ggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gV2UgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGluc3RlYWQgb2YgSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCkgYmVjYXVzZSB0aGUgbGF0dGVyXG5cdFx0XHQvLyByZXBsYWNlcyBjaGFyYWN0ZXJzIGluIHRoZSBVUkwgKGUuZy4gJTI0IHJlcGxhY2VkIGJ5ICQpIGFuZCBpdCBjYXVzZXMgaXNzdWVzIHdoZW4gY29tcGFyaW5nXG5cdFx0XHQvLyB3aXRoIHRoZSBVUkxzIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRcdGNvbnN0IG9TcGxpdEhhc2ggPSB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5zcGxpdEhhc2god2luZG93LmxvY2F0aW9uLmhhc2gpIGFzIGFueTtcblx0XHRcdGlmIChvU3BsaXRIYXNoICYmIG9TcGxpdEhhc2guYXBwU3BlY2lmaWNSb3V0ZSkge1xuXHRcdFx0XHRzQ3VycmVudEhhc2ggPSBvU3BsaXRIYXNoLmFwcFNwZWNpZmljUm91dGU7XG5cdFx0XHRcdGlmIChzQ3VycmVudEhhc2guaW5kZXhPZihcIiYvXCIpID09PSAwKSB7XG5cdFx0XHRcdFx0c0N1cnJlbnRIYXNoID0gc0N1cnJlbnRIYXNoLnN1YnN0cmluZygyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0N1cnJlbnRIYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlICcjJ1xuXHRcdFx0XHRpZiAoc0N1cnJlbnRIYXNoWzBdID09PSBcIi9cIikge1xuXHRcdFx0XHRcdHNDdXJyZW50SGFzaCA9IHNDdXJyZW50SGFzaC5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c0N1cnJlbnRIYXNoID0gc1ByZXNlbnRIYXNoO1xuXHRcdH1cblx0XHRzUHJlc2VudEhhc2ggPSBVUkkuZGVjb2RlKHNDdXJyZW50SGFzaCk7XG5cdFx0aWYgKHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQpIHtcblx0XHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2ldLmhhc2ggPT09IHNQcmVzZW50SGFzaCkge1xuXHRcdFx0XHRcdHNQcmV2SGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIXNQcmV2SGFzaCB8fCAhdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQoc1ByZXZIYXNoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgbGFzdCAyIGVudHJpZXMgaW4gdGhlIGhpc3Rvcnkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqL1xuXHRjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCkge1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIDwgMikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9DdXJyZW50U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdGNvbnN0IG9QcmV2aW91c1N0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAyXTtcblxuXHRcdHJldHVybiBvQ3VycmVudFN0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBvUHJldmlvdXNTdGF0ZS5oYXNoLnNwbGl0KFwiP1wiKVswXTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJQcm94eTtcbiJdfQ==
930
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRlclByb3h5LnRzIl0sIm5hbWVzIjpbImVudW1TdGF0ZSIsIkVRVUFMIiwiQ09NUEFUSUJMRSIsIkFOQ0VTVE9SIiwiRElGRkVSRU5UIiwiZW51bVVSTFBhcmFtcyIsIkxBWU9VVFBBUkFNIiwiSUFQUFNUQVRFUEFSQU0iLCJjcmVhdGVHdWFyZEZyb21IYXNoIiwic0d1YXJkSGFzaCIsIl9ndWFyZEhhc2giLCJyZXBsYWNlIiwiY2hlY2siLCJzSGFzaCIsImluZGV4T2YiLCJmaW5kQXBwU3RhdGVJbkhhc2giLCJhQXBwU3RhdGUiLCJtYXRjaCIsIlJlZ0V4cCIsImxlbmd0aCIsInJlbW92ZUFwcFN0YXRlSW5IYXNoIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsIlJvdXRlclByb3h5IiwiZGVmaW5lVUk1Q2xhc3MiLCJiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmciLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5IiwiYklzR3VhcmRDcm9zc0FsbG93ZWQiLCJzSUFwcFN0YXRlS2V5IiwiX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvIiwiX2JBcHBseVJlc3RvcmUiLCJfYkRlbGF5ZWRSZWJ1aWxkIiwiX3BhdGhNYXBwaW5ncyIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJiaW5kIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9mbkhhc2hHdWFyZCIsImhhc2hHdWFyZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib1JvdXRlciIsIl9vUm91dGVyIiwiX29NYW5hZ2VkSGlzdG9yeSIsIl9vTmF2aWdhdGlvbkd1YXJkIiwic0N1cnJlbnRBcHBIYXNoIiwiZ2V0SGFzaCIsInB1c2giLCJfZXh0cmFjdFN0YXRlRnJvbUhhc2giLCJnZXRIYXNoQ2hhbmdlciIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZWQiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJuYXZUb0hhc2giLCJiUHJlc2VydmVIaXN0b3J5IiwiYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSIsImJGb3JjZUZvY3VzIiwiYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsIndhaXRGb3IiLCJ1bmRlZmluZWQiLCJfaW50ZXJuYWxOYXZUb0hhc2giLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiY29uZmlybSIsImdldFRleHQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9OZXdTdGF0ZSIsImFDdXJyZW50SGFzaEtleXMiLCJfZXh0cmFjdEtleXNGcm9tSGFzaCIsImtleXMiLCJldmVyeSIsImtleSIsImluZGV4Iiwib0hpc3RvcnlBY3Rpb24iLCJfcHVzaE5ld1N0YXRlIiwiX3JlYnVpbGRCcm93c2VySGlzdG9yeSIsInJlc3RvcmVIaXN0b3J5Iiwic1RhcmdldEhhc2giLCJuYXZCYWNrIiwic0N1cnJlbnRIYXNoIiwic1ByZXZpb3VzSGFzaCIsImkiLCJoYXNoIiwiYmFjayIsIm5hdlRvIiwic1JvdXRlTmFtZSIsIm9QYXJhbWV0ZXJzIiwiZ2V0VVJMIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJJc1N0aWNreU1vZGUiLCJleGl0RnJvbUFwcCIsImJhY2tUb1ByZXZpb3VzQXBwIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwic3Vic3RyaW5nIiwib0xvY2FsR3VhcmQiLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsInJlc29sdmVSb3V0ZU1hdGNoIiwiU3luY2hyb25pemF0aW9uIiwic0hhc2hOb1BhcmFtcyIsInNwbGl0IiwiYVRva2VucyIsImFLZXlzIiwiZm9yRWFjaCIsInNUb2tlbiIsInJlZ2V4S2V5IiwidGVzdCIsIm9TdGF0ZSIsImFMYXlvdXQiLCJzTGF5b3V0Iiwic2NyZWVuTW9kZSIsImJSZWJ1aWxkT25seSIsImJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiIsImxhc3RJbmRleCIsImlQb3BDb3VudCIsInBvcCIsInByZXNlcnZlZCIsIm9MYXN0UmVtb3ZlZEl0ZW0iLCJvVG9wU3RhdGUiLCJfY29tcGFyZUNhY2hlU3RhdGVzIiwic1ByZXZpb3VzSUFwcFN0YXRlS2V5Iiwib0NvbXBhcmlzb25TdGF0ZVJlc3VsdCIsImJIYXNTYW1lSGFzaCIsInR5cGUiLCJzdGVwcyIsIl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UiLCJzdG9wIiwiX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwiYklnbm9yZUN1cnJlbnRIYXNoIiwiaW5pdGlhbGl6ZSIsInRoYXQiLCJvVGFyZ2V0U3RhdGUiLCJuZXdMZXZlbCIsInJlcGxhY2VBc3luYyIsInJlcGxhY2VIYXNoIiwic2V0VGltZW91dCIsImJhY2tSZXBsYWNlQXN5bmMiLCJiYWNrQXN5bmMiLCJzZXRIYXNoIiwiZ28iLCJnZXRMYXN0SGlzdG9yeUVudHJ5Iiwic2V0UGF0aE1hcHBpbmciLCJtYXBwaW5ncyIsImZpbHRlciIsIm1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsImZpbmQiLCJtIiwiYUhhc2hTcGxpdCIsInNBcHBIYXNoIiwib1N0YXRlMSIsIm9TdGF0ZTIiLCJlcXVhbCIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwic1ByZXNlbnRIYXNoIiwic1ByZXZIYXNoIiwib1NwbGl0SGFzaCIsInNwbGl0SGFzaCIsImFwcFNwZWNpZmljUm91dGUiLCJVUkkiLCJkZWNvZGUiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0Iiwib0N1cnJlbnRTdGF0ZSIsIm9QcmV2aW91c1N0YXRlIiwiQmFzZU9iamVjdCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBU0EsTUFBTUEsU0FBUyxHQUFHO0FBQ2pCQyxJQUFBQSxLQUFLLEVBQUUsQ0FEVTtBQUVqQkMsSUFBQUEsVUFBVSxFQUFFLENBRks7QUFHakJDLElBQUFBLFFBQVEsRUFBRSxDQUhPO0FBSWpCQyxJQUFBQSxTQUFTLEVBQUU7QUFKTSxHQUFsQjtBQU1BLE1BQU1DLGFBQWEsR0FBRztBQUNyQkMsSUFBQUEsV0FBVyxFQUFFLFFBRFE7QUFFckJDLElBQUFBLGNBQWMsRUFBRTtBQUZLLEdBQXRCO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFdBQVNDLG1CQUFULENBQTZCQyxVQUE3QixFQUFpRDtBQUNoRCxXQUFPO0FBQ05DLE1BQUFBLFVBQVUsRUFBRUQsVUFBVSxDQUFDRSxPQUFYLENBQW1CLFdBQW5CLEVBQWdDLEVBQWhDLENBRE47QUFDMkM7QUFDakRDLE1BQUFBLEtBQUssRUFBRSxVQUFVQyxLQUFWLEVBQXNCO0FBQzVCLGVBQU9BLEtBQUssQ0FBQ0MsT0FBTixDQUFjLEtBQUtKLFVBQW5CLE1BQW1DLENBQTFDO0FBQ0E7QUFKSyxLQUFQO0FBTUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVNLLGtCQUFULENBQTRCRixLQUE1QixFQUEwRDtBQUN6RCxRQUFNRyxTQUFTLEdBQUdILEtBQUssQ0FBQ0ksS0FBTixDQUFZLElBQUlDLE1BQUosZ0JBQW1CYixhQUFhLENBQUNFLGNBQWpDLGNBQVosQ0FBbEI7QUFDQSxXQUFPUyxTQUFTLElBQUlBLFNBQVMsQ0FBQ0csTUFBVixHQUFtQixDQUFoQyxHQUFvQ0gsU0FBUyxDQUFDLENBQUQsQ0FBN0MsR0FBbUQsSUFBMUQ7QUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU0ksb0JBQVQsQ0FBOEJQLEtBQTlCLEVBQTZDO0FBQzVDLFdBQU9BLEtBQUssQ0FBQ0YsT0FBTixDQUFjLElBQUlPLE1BQUosZ0JBQW1CYixhQUFhLENBQUNFLGNBQWpDLFlBQWQsRUFBd0UsRUFBeEUsQ0FBUDtBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVNjLGlCQUFULENBQTJCUixLQUEzQixFQUF1Q1MsWUFBdkMsRUFBMEQ7QUFDekQsUUFBSUMsUUFBSjs7QUFFQSxRQUFJVixLQUFLLENBQUNDLE9BQU4sQ0FBY1QsYUFBYSxDQUFDRSxjQUE1QixLQUErQyxDQUFuRCxFQUFzRDtBQUNyRDtBQUNBZ0IsTUFBQUEsUUFBUSxHQUFHVixLQUFLLENBQUNGLE9BQU4sQ0FBYyxJQUFJTyxNQUFKLFdBQWNiLGFBQWEsQ0FBQ0UsY0FBNUIsWUFBZCxZQUFzRUYsYUFBYSxDQUFDRSxjQUFwRixjQUFzR2UsWUFBdEcsRUFBWDtBQUNBLEtBSEQsTUFHTztBQUNOO0FBQ0EsVUFBSVQsS0FBSyxDQUFDQyxPQUFOLENBQWMsR0FBZCxJQUFxQixDQUF6QixFQUE0QjtBQUMzQlMsUUFBQUEsUUFBUSxhQUFNVixLQUFOLE1BQVI7QUFDQSxPQUZELE1BRU87QUFDTlUsUUFBQUEsUUFBUSxhQUFNVixLQUFOLE1BQVI7QUFDQTs7QUFDRFUsTUFBQUEsUUFBUSxjQUFPbEIsYUFBYSxDQUFDRSxjQUFyQixjQUF1Q2UsWUFBdkMsQ0FBUjtBQUNBOztBQUVELFdBQU9DLFFBQVA7QUFDQTs7TUFHS0MsVyxXQURMQyxjQUFjLENBQUMseUJBQUQsQzs7Ozs7Ozs7Ozs7WUFFZEMsd0IsR0FBMkIsSztZQUMzQkMseUIsR0FBNEIsSztZQUM1QkMsb0IsR0FBdUIsSztZQUN2QkMsYSxHQUErQixJO1lBYS9CQywyQixHQUF1QyxLO1lBQ3ZDQyxjLEdBQTBCLEs7WUFDMUJDLGdCLEdBQTRCLEs7WUFDNUJDLGEsR0FBd0QsRTs7Ozs7O1dBRXhEQyxJLEdBQUEsY0FBS0MsYUFBTCxFQUF5QkMsWUFBekIsRUFBZ0Q7QUFBQTs7QUFDL0M7QUFDQUQsTUFBQUEsYUFBYSxDQUNYRSxVQURGLENBQ2EsZUFEYixFQUVFQyxJQUZGLENBRU8sWUFBTTtBQUNYLFFBQUEsTUFBSSxDQUFDQyxlQUFMLEdBQXVCSixhQUFhLENBQUNLLGdCQUFkLEVBQXZCOztBQUVBLFFBQUEsTUFBSSxDQUFDQyxPQUFMLENBQWFOLGFBQWEsQ0FBQ08sU0FBZCxFQUFiLEVBSFcsQ0FJWDs7O0FBQ0EsUUFBQSxNQUFJLENBQUNDLGlDQUFMLEdBTFcsQ0FPWDs7O0FBQ0FDLFFBQUFBLE9BQU8sQ0FBQ0MsWUFBUixDQUNDQyxNQUFNLENBQUNDLE1BQVAsQ0FDQztBQUNDQyxVQUFBQSxPQUFPLEVBQUU7QUFEVixTQURELEVBSUNKLE9BQU8sQ0FBQ0ssS0FKVCxDQURELEVBT0MsRUFQRCxFQVFDQyxNQUFNLENBQUNDLFFBUlI7QUFVQSxRQUFBLE1BQUksQ0FBQ0MsVUFBTCxHQUFrQmhCLFlBQWxCO0FBRUEsUUFBQSxNQUFJLENBQUNpQixvQkFBTCxHQUE0QixNQUFJLENBQUNDLHlCQUFMLENBQStCQyxJQUEvQixDQUFvQyxNQUFwQyxDQUE1Qjs7QUFDQSxRQUFBLE1BQUksQ0FBQ2hCLGVBQUwsQ0FBcUJpQix3QkFBckIsQ0FBOEMsTUFBSSxDQUFDSCxvQkFBbkQ7QUFDQSxPQXhCRixFQXlCRUksS0F6QkYsQ0F5QlEsVUFBVUMsTUFBVixFQUF1QjtBQUM3QkMsUUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsb0NBQVYsRUFBZ0RGLE1BQWhEO0FBQ0EsT0EzQkY7QUE0QkEsV0FBS0csWUFBTCxHQUFvQixLQUFLQyxTQUFMLENBQWVQLElBQWYsQ0FBb0IsSUFBcEIsQ0FBcEI7QUFDQUwsTUFBQUEsTUFBTSxDQUFDYSxnQkFBUCxDQUF3QixVQUF4QixFQUFvQyxLQUFLRixZQUF6QztBQUNBLFdBQUtHLHFCQUFMLEdBQTZCLEtBQTdCO0FBQ0EsV0FBS0MsZUFBTCxHQUF1QixLQUF2QjtBQUNBLFdBQUtDLFlBQUwsR0FBb0IsSUFBcEIsQ0FsQytDLENBa0NyQjtBQUMxQixLOztXQUVEQyxPLEdBQUEsbUJBQVU7QUFDVCxVQUFJLEtBQUs1QixlQUFULEVBQTBCO0FBQ3pCLGFBQUtBLGVBQUwsQ0FBcUI2QiwwQkFBckIsQ0FBZ0QsS0FBS2Ysb0JBQXJEO0FBQ0E7O0FBQ0RILE1BQUFBLE1BQU0sQ0FBQ21CLG1CQUFQLENBQTJCLFVBQTNCLEVBQXVDLEtBQUtSLFlBQTVDO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3BCLE8sR0FBQSxpQkFBUTZCLE9BQVIsRUFBeUI7QUFDeEIsV0FBS0MsUUFBTCxHQUFnQkQsT0FBaEI7QUFDQSxXQUFLRSxnQkFBTCxHQUF3QixFQUF4QjtBQUNBLFdBQUtDLGlCQUFMLEdBQXlCLElBQXpCO0FBRUEsVUFBTUMsZUFBZSxHQUFHLEtBQUtDLE9BQUwsRUFBeEI7O0FBQ0EsV0FBS0gsZ0JBQUwsQ0FBc0JJLElBQXRCLENBQTJCLEtBQUtDLHFCQUFMLENBQTJCSCxlQUEzQixDQUEzQixFQU53QixDQVF4Qjs7O0FBQ0EsV0FBSzdDLGFBQUwsR0FBcUJkLGtCQUFrQixDQUFDMkQsZUFBRCxDQUF2QztBQUNBLEs7O1dBRURDLE8sR0FBQSxtQkFBVTtBQUNULGFBQU8sS0FBS0osUUFBTCxDQUFjTyxjQUFkLEdBQStCSCxPQUEvQixFQUFQO0FBQ0EsSzs7V0FFREksYSxHQUFBLHlCQUFnQjtBQUNmLGFBQU8sS0FBS2IsWUFBWjtBQUNBLEs7O1dBRURjLGMsR0FBQSx3QkFBZUMsT0FBZixFQUFpQztBQUNoQyxXQUFLZixZQUFMLEdBQW9CZSxPQUFwQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDQyxrQixHQUFBLDhCQUFxQjtBQUNwQixXQUFLckQsYUFBTCxHQUFxQixJQUFyQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3NELFMsR0FBQSxtQkFDQ3RFLEtBREQsRUFFQ3VFLGdCQUZELEVBR0NDLHlCQUhELEVBSUNDLFdBSkQsRUFLQ0MsbUNBTEQsRUFNb0I7QUFBQTs7QUFDbkIsVUFBSUEsbUNBQW1DLEtBQUssS0FBNUMsRUFBbUQ7QUFDbEQsYUFBS2hELGVBQUwsQ0FBcUJpRCxpQkFBckI7QUFDQTs7QUFDRCxVQUFJLEtBQUtDLDJCQUFULEVBQXNDO0FBQ3JDLGVBQU8sS0FBS0EsMkJBQUwsQ0FBaUNDLE9BQWpDLEdBQTJDcEQsSUFBM0MsQ0FBZ0QsWUFBTTtBQUM1RCxVQUFBLE1BQUksQ0FBQ21ELDJCQUFMLEdBQW1DRSxTQUFuQztBQUNBLGlCQUFPLE1BQUksQ0FBQ0Msa0JBQUwsQ0FBd0IvRSxLQUF4QixFQUErQnVFLGdCQUEvQixFQUFpREMseUJBQWpELEVBQTRFQyxXQUE1RSxDQUFQO0FBQ0EsU0FITSxDQUFQO0FBSUEsT0FMRCxNQUtPO0FBQ04sWUFBSSxLQUFLeEQsMkJBQVQsRUFBc0M7QUFDckMsZUFBS2EsaUNBQUw7QUFDQTs7QUFDRCxlQUFPLEtBQUtpRCxrQkFBTCxDQUF3Qi9FLEtBQXhCLEVBQStCdUUsZ0JBQS9CLEVBQWlEQyx5QkFBakQsRUFBNEVDLFdBQTVFLENBQVA7QUFDQTtBQUNELEs7O1dBRURNLGtCLEdBQUEsNEJBQW1CL0UsS0FBbkIsRUFBK0J1RSxnQkFBL0IsRUFBc0RDLHlCQUF0RCxFQUFzRkMsV0FBdEYsRUFBK0g7QUFDOUg7QUFDQSxVQUFJLEtBQUtsQyxVQUFMLElBQW1CLEtBQUt2QixhQUF4QixJQUF5QyxDQUFDZCxrQkFBa0IsQ0FBQ0YsS0FBRCxDQUFoRSxFQUF5RTtBQUN4RUEsUUFBQUEsS0FBSyxHQUFHUSxpQkFBaUIsQ0FBQ1IsS0FBRCxFQUFRLEtBQUtnQixhQUFiLENBQXpCO0FBQ0E7O0FBRUQsVUFBSSxDQUFDLEtBQUtnRSxrQkFBTCxDQUF3QmhGLEtBQXhCLENBQUwsRUFBcUM7QUFDcEMsWUFBSSxDQUFDLEtBQUtpRixlQUFWLEVBQTJCO0FBQzFCLGVBQUtBLGVBQUwsR0FBd0JDLElBQUQsQ0FBaUJDLHdCQUFqQixDQUEwQyxhQUExQyxDQUF2QjtBQUNBLFNBSG1DLENBS3BDO0FBQ0E7QUFDQTs7O0FBQ0EsWUFBSSxDQUFDQyxPQUFPLENBQUMsS0FBS0gsZUFBTCxDQUFxQkksT0FBckIsQ0FBNkIsNENBQTdCLENBQUQsQ0FBWixFQUEwRjtBQUN6RjtBQUNBLGlCQUFPQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBaEIsQ0FBUDtBQUNBOztBQUNELGFBQUt4RSxvQkFBTCxHQUE0QixJQUE1QjtBQUNBLE9BbkI2SCxDQXFCOUg7QUFDQTs7O0FBQ0EsVUFBTXlFLFNBQVMsR0FBRyxLQUFLeEIscUJBQUwsQ0FBMkJoRSxLQUEzQixDQUFsQjs7QUFDQSxVQUFJLENBQUMsS0FBS3FELFlBQVYsRUFBd0I7QUFDdkI7QUFDQSxZQUFNb0MsZ0JBQWdCLEdBQUcsS0FBS0Msb0JBQUwsQ0FBMEIsS0FBSzVCLE9BQUwsRUFBMUIsQ0FBekI7O0FBQ0EsYUFBS1QsWUFBTCxHQUNDb0IsV0FBVyxJQUNWZ0IsZ0JBQWdCLENBQUNuRixNQUFqQixHQUEwQmtGLFNBQVMsQ0FBQ0csSUFBVixDQUFlckYsTUFBekMsSUFDQW1GLGdCQUFnQixDQUFDRyxLQUFqQixDQUF1QixVQUFVQyxHQUFWLEVBQW9CQyxLQUFwQixFQUFnQztBQUN0RCxpQkFBT0QsR0FBRyxLQUFLTCxTQUFTLENBQUNHLElBQVYsQ0FBZUcsS0FBZixDQUFmO0FBQ0EsU0FGRCxDQUhGO0FBTUE7O0FBRUQsVUFBTUMsY0FBYyxHQUFHLEtBQUtDLGFBQUwsQ0FBbUJSLFNBQW5CLEVBQThCLEtBQTlCLEVBQXFDakIsZ0JBQXJDLEVBQXVEQyx5QkFBdkQsQ0FBdkI7O0FBRUEsYUFBTyxLQUFLeUIsc0JBQUwsQ0FBNEJGLGNBQTVCLEVBQTRDLEtBQTVDLENBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NHLGMsR0FBQSwwQkFBaUI7QUFDaEIsVUFBSSxLQUFLaEYsY0FBVCxFQUF5QjtBQUN4QixhQUFLQSxjQUFMLEdBQXNCLEtBQXRCO0FBQ0EsWUFBSWlGLFdBQVcsR0FBRyxLQUFLckMsT0FBTCxFQUFsQjtBQUNBcUMsUUFBQUEsV0FBVyxHQUFHQSxXQUFXLENBQUNyRyxPQUFaLENBQW9CLDJCQUFwQixFQUFpRCxFQUFqRCxDQUFkOztBQUNBLFlBQU0wRixTQUFTLEdBQUcsS0FBS3hCLHFCQUFMLENBQTJCbUMsV0FBM0IsQ0FBbEI7O0FBRUEsWUFBTUosY0FBYyxHQUFHLEtBQUtDLGFBQUwsQ0FBbUJSLFNBQW5CLEVBQThCLElBQTlCLEVBQW9DLEtBQXBDLEVBQTJDLElBQTNDLENBQXZCOztBQUVBLGVBQU8sS0FBS1Msc0JBQUwsQ0FBNEJGLGNBQTVCLEVBQTRDLElBQTVDLENBQVA7QUFDQSxPQVRELE1BU087QUFDTixlQUFPVCxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBO0FBQ0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ2EsTyxHQUFBLG1CQUFVO0FBQ1QsVUFBTUMsWUFBWSxHQUFHLEtBQUt2QyxPQUFMLEVBQXJCO0FBQ0EsVUFBSXdDLGFBQUosQ0FGUyxDQUlUOztBQUNBLFdBQUssSUFBSUMsQ0FBQyxHQUFHLEtBQUs1QyxnQkFBTCxDQUFzQnJELE1BQXRCLEdBQStCLENBQTVDLEVBQStDaUcsQ0FBQyxHQUFHLENBQW5ELEVBQXNEQSxDQUFDLEVBQXZELEVBQTJEO0FBQzFELFlBQUksS0FBSzVDLGdCQUFMLENBQXNCNEMsQ0FBdEIsRUFBeUJDLElBQXpCLEtBQWtDSCxZQUF0QyxFQUFvRDtBQUNuREMsVUFBQUEsYUFBYSxHQUFHLEtBQUszQyxnQkFBTCxDQUFzQjRDLENBQUMsR0FBRyxDQUExQixFQUE2QkMsSUFBN0M7QUFDQTtBQUNBO0FBQ0Q7O0FBRUQsVUFBSUYsYUFBSixFQUFtQjtBQUNsQixlQUFPLEtBQUtoQyxTQUFMLENBQWVnQyxhQUFmLENBQVA7QUFDQSxPQUZELE1BRU87QUFDTjtBQUNBO0FBQ0E7QUFDQWpFLFFBQUFBLE1BQU0sQ0FBQ04sT0FBUCxDQUFlMEUsSUFBZjtBQUNBLGVBQU9uQixPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBO0FBQ0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ21CLEssR0FBQSxlQUFNQyxVQUFOLEVBQTBCQyxXQUExQixFQUE0QztBQUMzQyxVQUFNNUcsS0FBSyxHQUFHLEtBQUswRCxRQUFMLENBQWNtRCxNQUFkLENBQXFCRixVQUFyQixFQUFpQ0MsV0FBakMsQ0FBZDs7QUFDQSxhQUFPLEtBQUt0QyxTQUFMLENBQWV0RSxLQUFmLEVBQXNCLEtBQXRCLEVBQTZCNEcsV0FBVyxDQUFDRSxtQkFBekMsRUFBOEQsS0FBOUQsRUFBcUUsQ0FBQ0YsV0FBVyxDQUFDRyxhQUFsRixDQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDQyxXLEdBQUEsdUJBQWM7QUFDYixhQUFPLEtBQUt0RixlQUFMLENBQXFCdUYsaUJBQXJCLEVBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ0Msd0IsR0FBQSxrQ0FBeUJsSCxLQUF6QixFQUFxQztBQUNwQyxVQUFJQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEtBQWEsR0FBakIsRUFBc0I7QUFDckJBLFFBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDbUgsU0FBTixDQUFnQixDQUFoQixDQUFSO0FBQ0E7O0FBQ0QsVUFBTUMsV0FBVyxHQUFHekgsbUJBQW1CLENBQUNLLEtBQUQsQ0FBdkM7QUFDQSxhQUFPb0gsV0FBVyxDQUFDckgsS0FBWixDQUFrQixLQUFLK0QsT0FBTCxFQUFsQixDQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3VELHFCLEdBQUEsaUNBQXdCO0FBQ3ZCLGFBQU8sQ0FBQyxLQUFLeEcsd0JBQU4sSUFBa0MsQ0FBQyxLQUFLTSxnQkFBL0M7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ21HLGtCLEdBQUEsNEJBQW1CdEgsS0FBbkIsRUFBa0M7QUFDakMsV0FBSzRELGlCQUFMLEdBQXlCakUsbUJBQW1CLENBQUNLLEtBQUQsQ0FBNUM7QUFDQSxXQUFLZSxvQkFBTCxHQUE0QixLQUE1QjtBQUNBO0FBRUQ7QUFDRDtBQUNBOzs7V0FDQ3dHLHNCLEdBQUEsa0NBQXlCO0FBQ3hCLFdBQUszRCxpQkFBTCxHQUF5QixJQUF6QjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0M0RCxrQixHQUFBLDhCQUFxQjtBQUNwQixhQUFPLEtBQUs1RCxpQkFBTCxLQUEyQixJQUFsQztBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ29CLGtCLEdBQUEsNEJBQW1CaEYsS0FBbkIsRUFBa0M7QUFDakMsYUFBTyxLQUFLNEQsaUJBQUwsS0FBMkIsSUFBM0IsSUFBbUMsS0FBS0EsaUJBQUwsQ0FBdUI3RCxLQUF2QixDQUE2QkMsS0FBN0IsQ0FBMUM7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7OztXQUNDeUgseUIsR0FBQSxxQ0FBNEI7QUFDM0IsYUFBTyxLQUFLMUcsb0JBQVo7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7OztXQUNDMkcsaUMsR0FBQSw2Q0FBb0M7QUFDbkMsV0FBS3pHLDJCQUFMLEdBQW1DLElBQW5DO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7OztXQUNDMEcsaUIsR0FBQSw2QkFBb0I7QUFDbkIsVUFBSSxLQUFLL0MsMkJBQVQsRUFBc0M7QUFDckMsYUFBS0EsMkJBQUwsQ0FBaUNXLE9BQWpDO0FBQ0E7QUFDRDtBQUVEO0FBQ0Q7QUFDQTs7O1dBQ0N6RCxpQyxHQUFBLDZDQUFvQztBQUNuQyxXQUFLOEMsMkJBQUwsR0FBbUMsSUFBSWdELGVBQUosRUFBbkM7QUFDQSxXQUFLM0csMkJBQUwsR0FBbUMsS0FBbkM7QUFDQSxLOztXQUVEeUUsb0IsR0FBQSw4QkFBcUIxRixLQUFyQixFQUFpQztBQUNoQyxVQUFJQSxLQUFLLEtBQUs4RSxTQUFkLEVBQXlCO0FBQ3hCOUUsUUFBQUEsS0FBSyxHQUFHLEVBQVI7QUFDQTs7QUFDRCxVQUFNNkgsYUFBYSxHQUFHN0gsS0FBSyxDQUFDOEgsS0FBTixDQUFZLEdBQVosRUFBaUIsQ0FBakIsQ0FBdEIsQ0FKZ0MsQ0FJVzs7QUFDM0MsVUFBTUMsT0FBTyxHQUFHRixhQUFhLENBQUNDLEtBQWQsQ0FBb0IsR0FBcEIsQ0FBaEI7QUFDQSxVQUFNRSxLQUFZLEdBQUcsRUFBckI7QUFFQUQsTUFBQUEsT0FBTyxDQUFDRSxPQUFSLENBQWdCLFVBQVVDLE1BQVYsRUFBdUI7QUFDdEMsWUFBTUMsUUFBUSxHQUFHLHNCQUFqQixDQURzQyxDQUNHOztBQUN6QyxZQUFJQSxRQUFRLENBQUNDLElBQVQsQ0FBY0YsTUFBZCxDQUFKLEVBQTJCO0FBQzFCRixVQUFBQSxLQUFLLENBQUNqRSxJQUFOLENBQVdtRSxNQUFNLENBQUNKLEtBQVAsQ0FBYSxHQUFiLEVBQWtCLENBQWxCLENBQVg7QUFDQTtBQUNELE9BTEQ7QUFPQSxhQUFPRSxLQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NoRSxxQixHQUFBLCtCQUFzQmhFLEtBQXRCLEVBQXFDO0FBQ3BDLFVBQUlBLEtBQUssS0FBSzhFLFNBQWQsRUFBeUI7QUFDeEI5RSxRQUFBQSxLQUFLLEdBQUcsRUFBUjtBQUNBOztBQUVELFVBQU1xSSxNQUFXLEdBQUc7QUFDbkIxQyxRQUFBQSxJQUFJLEVBQUUsS0FBS0Qsb0JBQUwsQ0FBMEIxRixLQUExQjtBQURhLE9BQXBCLENBTG9DLENBU3BDOztBQUNBLFVBQU1zSSxPQUFPLEdBQUd0SSxLQUFLLENBQUNJLEtBQU4sQ0FBWSxJQUFJQyxNQUFKLGdCQUFtQmIsYUFBYSxDQUFDQyxXQUFqQyxjQUFaLENBQWhCO0FBQ0E0SSxNQUFBQSxNQUFNLENBQUNFLE9BQVAsR0FBaUJELE9BQU8sSUFBSUEsT0FBTyxDQUFDaEksTUFBUixHQUFpQixDQUE1QixHQUFnQ2dJLE9BQU8sQ0FBQyxDQUFELENBQXZDLEdBQTZDLElBQTlEOztBQUNBLFVBQUlELE1BQU0sQ0FBQ0UsT0FBUCxLQUFtQixxQkFBdkIsRUFBOEM7QUFDN0NGLFFBQUFBLE1BQU0sQ0FBQ0csVUFBUCxHQUFvQixDQUFwQjtBQUNBLE9BRkQsTUFFTyxJQUFJSCxNQUFNLENBQUNFLE9BQVAsS0FBbUIscUJBQXZCLEVBQThDO0FBQ3BERixRQUFBQSxNQUFNLENBQUNHLFVBQVAsR0FBb0IsQ0FBcEI7QUFDQSxPQUZNLE1BRUE7QUFDTkgsUUFBQUEsTUFBTSxDQUFDRyxVQUFQLEdBQW9CLENBQXBCO0FBQ0E7O0FBRURILE1BQUFBLE1BQU0sQ0FBQzdCLElBQVAsR0FBY3hHLEtBQWQ7QUFDQSxhQUFPcUksTUFBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NyQyxhLEdBQUEsdUJBQWNSLFNBQWQsRUFBOEJpRCxZQUE5QixFQUFxRGxFLGdCQUFyRCxFQUFnRm1FLDJCQUFoRixFQUFzSDtBQUNySCxVQUFNckMsWUFBWSxHQUFHLEtBQUt2QyxPQUFMLEVBQXJCO0FBQ0EsVUFBSTZFLFNBQVMsR0FBRyxLQUFLaEYsZ0JBQUwsQ0FBc0JyRCxNQUF0QixHQUErQixDQUEvQztBQUNBLFVBQUlzSSxTQUFTLEdBQUdILFlBQVksR0FBRyxDQUFILEdBQU8sQ0FBbkMsQ0FIcUgsQ0FLckg7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsVUFBSSxDQUFDQSxZQUFMLEVBQW1CO0FBQ2xCLGVBQU9FLFNBQVMsSUFBSSxDQUFiLElBQWtCLEtBQUtoRixnQkFBTCxDQUFzQmdGLFNBQXRCLEVBQWlDbkMsSUFBakMsS0FBMENILFlBQW5FLEVBQWlGO0FBQ2hGLGVBQUsxQyxnQkFBTCxDQUFzQmtGLEdBQXRCOztBQUNBRixVQUFBQSxTQUFTO0FBQ1Q7O0FBRUQsWUFBSSxLQUFLaEYsZ0JBQUwsQ0FBc0JyRCxNQUF0QixLQUFpQyxDQUFyQyxFQUF3QztBQUN2QztBQUNBO0FBQ0E7QUFDQSxlQUFLcUQsZ0JBQUwsQ0FBc0JJLElBQXRCLENBQTJCLEtBQUtDLHFCQUFMLENBQTJCcUMsWUFBM0IsQ0FBM0I7O0FBQ0F0RSxVQUFBQSxPQUFPLENBQUNDLFlBQVIsQ0FBcUJDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUVDLFlBQUFBLE9BQU8sRUFBRTtBQUFYLFdBQWQsRUFBOEJKLE9BQU8sQ0FBQ0ssS0FBdEMsQ0FBckIsRUFBbUUsRUFBbkU7QUFDQTtBQUNELE9BdEJvSCxDQXdCckg7OztBQUNBLFVBQUltQyxnQkFBZ0IsSUFBSSxDQUFDbUUsMkJBQXpCLEVBQXNEO0FBQ3JELGFBQUsvRSxnQkFBTCxDQUFzQixLQUFLQSxnQkFBTCxDQUFzQnJELE1BQXRCLEdBQStCLENBQXJELEVBQXdEd0ksU0FBeEQsR0FBb0UsSUFBcEU7QUFDQSxPQTNCb0gsQ0E2QnJIOzs7QUFDQSxVQUFJQyxnQkFBSjs7QUFDQSxhQUFPLEtBQUtwRixnQkFBTCxDQUFzQnJELE1BQXRCLEdBQStCLENBQXRDLEVBQXlDO0FBQ3hDLFlBQU0wSSxTQUFTLEdBQUcsS0FBS3JGLGdCQUFMLENBQXNCLEtBQUtBLGdCQUFMLENBQXNCckQsTUFBdEIsR0FBK0IsQ0FBckQsQ0FBbEI7O0FBQ0EsWUFDQyxDQUFDb0ksMkJBQTJCLElBQUksQ0FBQ00sU0FBUyxDQUFDRixTQUEzQyxLQUNBLEtBQUtHLG1CQUFMLENBQXlCRCxTQUF6QixFQUFvQ3hELFNBQXBDLE1BQW1EckcsU0FBUyxDQUFDRyxRQUY5RCxFQUdFO0FBQ0Q7QUFDQXlKLFVBQUFBLGdCQUFnQixHQUFHLEtBQUtwRixnQkFBTCxDQUFzQmtGLEdBQXRCLEVBQW5CO0FBQ0FELFVBQUFBLFNBQVM7QUFDVCxTQVBELE1BT08sSUFBSUksU0FBUyxDQUFDRixTQUFWLElBQXVCdkksb0JBQW9CLENBQUN5SSxTQUFTLENBQUN4QyxJQUFYLENBQXBCLEtBQXlDakcsb0JBQW9CLENBQUNpRixTQUFTLENBQUNnQixJQUFYLENBQXhGLEVBQTBHO0FBQ2hIO0FBQ0E7QUFDQXVDLFVBQUFBLGdCQUFnQixHQUFHLEtBQUtwRixnQkFBTCxDQUFzQmtGLEdBQXRCLEVBQW5CO0FBQ0FELFVBQUFBLFNBQVM7QUFDVHBELFVBQUFBLFNBQVMsQ0FBQ3NELFNBQVYsR0FBc0IsSUFBdEI7QUFDQTtBQUNBLFNBUE0sTUFPQTtBQUNOLGdCQURNLENBQ0M7QUFDUDtBQUNELE9BbERvSCxDQW9Eckg7OztBQUNBLFdBQUs5SCxhQUFMLEdBQXFCZCxrQkFBa0IsQ0FBQ3NGLFNBQVMsQ0FBQ2dCLElBQVgsQ0FBdkM7O0FBQ0EsVUFBSSxDQUFDLEtBQUtqRSxVQUFOLElBQW9Cd0csZ0JBQXhCLEVBQTBDO0FBQ3pDLFlBQU1HLHFCQUFxQixHQUFHaEosa0JBQWtCLENBQUM2SSxnQkFBZ0IsQ0FBQ3ZDLElBQWxCLENBQWhEOztBQUNBLFlBQU0yQyxzQkFBc0IsR0FBRyxLQUFLRixtQkFBTCxDQUF5QkYsZ0JBQXpCLEVBQTJDdkQsU0FBM0MsQ0FBL0IsQ0FGeUMsQ0FHekM7QUFDQTs7O0FBQ0EsWUFDQyxDQUFDLEtBQUt4RSxhQUFOLElBQ0FrSSxxQkFEQSxLQUVDQyxzQkFBc0IsS0FBS2hLLFNBQVMsQ0FBQ0MsS0FBckMsSUFBOEMrSixzQkFBc0IsS0FBS2hLLFNBQVMsQ0FBQ0UsVUFGcEYsQ0FERCxFQUlFO0FBQ0RtRyxVQUFBQSxTQUFTLENBQUNnQixJQUFWLEdBQWlCaEcsaUJBQWlCLENBQUNnRixTQUFTLENBQUNnQixJQUFYLEVBQWlCMEMscUJBQWpCLENBQWxDO0FBQ0E7QUFDRCxPQWxFb0gsQ0FvRXJIOzs7QUFDQSxVQUFNRSxZQUFZLEdBQUdMLGdCQUFnQixJQUFJdkQsU0FBUyxDQUFDZ0IsSUFBVixLQUFtQnVDLGdCQUFnQixDQUFDdkMsSUFBN0U7O0FBQ0EsVUFBSSxLQUFLN0MsZ0JBQUwsQ0FBc0JyRCxNQUF0QixLQUFpQyxDQUFqQyxJQUFzQyxLQUFLcUQsZ0JBQUwsQ0FBc0IsS0FBS0EsZ0JBQUwsQ0FBc0JyRCxNQUF0QixHQUErQixDQUFyRCxFQUF3RGtHLElBQXhELEtBQWlFaEIsU0FBUyxDQUFDZ0IsSUFBckgsRUFBMkg7QUFDMUgsYUFBSzdDLGdCQUFMLENBQXNCSSxJQUF0QixDQUEyQnlCLFNBQTNCO0FBQ0EsT0F4RW9ILENBMEVySDs7O0FBQ0EsVUFBSW9ELFNBQVMsS0FBSyxDQUFsQixFQUFxQjtBQUNwQjtBQUNBLGVBQU87QUFBRVMsVUFBQUEsSUFBSSxFQUFFO0FBQVIsU0FBUDtBQUNBLE9BSEQsTUFHTyxJQUFJVCxTQUFTLEtBQUssQ0FBbEIsRUFBcUI7QUFDM0I7QUFDQSxlQUFPUSxZQUFZLEdBQUc7QUFBRUMsVUFBQUEsSUFBSSxFQUFFO0FBQVIsU0FBSCxHQUFzQjtBQUFFQSxVQUFBQSxJQUFJLEVBQUU7QUFBUixTQUF6QztBQUNBLE9BSE0sTUFHQTtBQUNOO0FBQ0EsZUFBT0QsWUFBWSxHQUFHO0FBQUVDLFVBQUFBLElBQUksRUFBRSxNQUFSO0FBQWdCQyxVQUFBQSxLQUFLLEVBQUVWLFNBQVMsR0FBRztBQUFuQyxTQUFILEdBQTRDO0FBQUVTLFVBQUFBLElBQUksRUFBRSxjQUFSO0FBQXdCQyxVQUFBQSxLQUFLLEVBQUVWLFNBQVMsR0FBRztBQUEzQyxTQUEvRDtBQUNBO0FBQ0QsSzs7V0FFRG5HLHlCLEdBQUEscUNBQTRCO0FBQzNCLGFBQU8sS0FBS1UscUJBQUwsR0FBNkIsUUFBN0IsR0FBd0MsVUFBL0M7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDb0cseUIsR0FBQSxxQ0FBNEI7QUFDM0IsV0FBS3BHLHFCQUFMLEdBQTZCLElBQTdCOztBQUNBLFdBQUtPLFFBQUwsQ0FBYzhGLElBQWQ7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ0Msd0IsR0FBQSxrQ0FBeUJDLGtCQUF6QixFQUFrRTtBQUNqRSxXQUFLdkcscUJBQUwsR0FBNkIsS0FBN0I7O0FBQ0EsV0FBS08sUUFBTCxDQUFjaUcsVUFBZCxDQUF5QkQsa0JBQXpCO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0N6RCxzQixHQUFBLGdDQUF1QkYsY0FBdkIsRUFBNEMwQyxZQUE1QyxFQUFxRjtBQUFBOztBQUNwRjtBQUNBLFVBQU1tQixJQUFJLEdBQUcsSUFBYjtBQUNBLGFBQU8sSUFBSXRFLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQWE7QUFDL0IsUUFBQSxNQUFJLENBQUMxRSx3QkFBTCxHQUFnQyxJQUFoQztBQUNBLFlBQU1nSixZQUFZLEdBQUcsTUFBSSxDQUFDbEcsZ0JBQUwsQ0FBc0IsTUFBSSxDQUFDQSxnQkFBTCxDQUFzQnJELE1BQXRCLEdBQStCLENBQXJELENBQXJCO0FBQUEsWUFDQ3dKLFFBQVEsR0FBRyxNQUFJLENBQUNuRyxnQkFBTCxDQUFzQnJELE1BQXRCLEdBQStCLENBRDNDOztBQUdBLGlCQUFTeUosWUFBVCxHQUF3QjtBQUN2QixjQUFJLENBQUN0QixZQUFMLEVBQW1CO0FBQ2xCbUIsWUFBQUEsSUFBSSxDQUFDSCx3QkFBTCxDQUE4QixJQUE5QjtBQUNBOztBQUVBRyxVQUFBQSxJQUFJLENBQUNsRyxRQUFMLENBQWNPLGNBQWQsR0FBK0IrRixXQUFoQyxDQUFvREgsWUFBWSxDQUFDckQsSUFBakU7O0FBQ0F6RSxVQUFBQSxPQUFPLENBQUNDLFlBQVIsQ0FBcUJDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUVDLFlBQUFBLE9BQU8sRUFBRTJIO0FBQVgsV0FBZCxFQUFxQy9ILE9BQU8sQ0FBQ0ssS0FBN0MsQ0FBckIsRUFBMEUsRUFBMUU7O0FBRUEsY0FBSXFHLFlBQUosRUFBa0I7QUFDakJ3QixZQUFBQSxVQUFVLENBQUMsWUFBWTtBQUN0QjtBQUNBO0FBQ0FMLGNBQUFBLElBQUksQ0FBQ0gsd0JBQUwsQ0FBOEIsSUFBOUI7QUFDQSxhQUpTLEVBSVAsQ0FKTyxDQUFWO0FBS0E7O0FBRURHLFVBQUFBLElBQUksQ0FBQy9JLHdCQUFMLEdBQWdDLEtBQWhDO0FBQ0EwRSxVQUFBQSxPQUFPLENBQUMsSUFBRCxDQUFQLENBakJ1QixDQWlCUjtBQUNmLFNBdkI4QixDQXlCL0I7OztBQUNBLGlCQUFTMkUsZ0JBQVQsR0FBNEI7QUFDM0I3SCxVQUFBQSxNQUFNLENBQUNtQixtQkFBUCxDQUEyQixVQUEzQixFQUF1QzBHLGdCQUF2QztBQUNBRCxVQUFBQSxVQUFVLENBQUMsWUFBWTtBQUN0QjtBQUNBRixZQUFBQSxZQUFZO0FBQ1osV0FIUyxFQUdQLENBSE8sQ0FBVjtBQUlBOztBQUVELGlCQUFTSSxTQUFULEdBQXFCO0FBQ3BCOUgsVUFBQUEsTUFBTSxDQUFDbUIsbUJBQVAsQ0FBMkIsVUFBM0IsRUFBdUMyRyxTQUF2QztBQUNBUCxVQUFBQSxJQUFJLENBQUMvSSx3QkFBTCxHQUFnQyxLQUFoQztBQUNBMEUsVUFBQUEsT0FBTyxDQUFDLElBQUQsQ0FBUCxDQUhvQixDQUdMO0FBQ2Y7O0FBRURxRSxRQUFBQSxJQUFJLENBQUN4RyxlQUFMLEdBQXVCLElBQXZCOztBQUVBLGdCQUFRMkMsY0FBYyxDQUFDc0QsSUFBdkI7QUFDQyxlQUFLLFNBQUw7QUFDRU8sWUFBQUEsSUFBSSxDQUFDbEcsUUFBTCxDQUFjTyxjQUFkLEdBQStCK0YsV0FBaEMsQ0FBb0RILFlBQVksQ0FBQ3JELElBQWpFOztBQUNBekUsWUFBQUEsT0FBTyxDQUFDQyxZQUFSLENBQXFCQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFFQyxjQUFBQSxPQUFPLEVBQUUySDtBQUFYLGFBQWQsRUFBcUMvSCxPQUFPLENBQUNLLEtBQTdDLENBQXJCLEVBQTBFLEVBQTFFO0FBQ0F3SCxZQUFBQSxJQUFJLENBQUMvSSx3QkFBTCxHQUFnQyxLQUFoQztBQUNBMEUsWUFBQUEsT0FBTyxDQUFDLElBQUQsQ0FBUCxDQUpELENBSWdCOztBQUNmOztBQUVELGVBQUssUUFBTDtBQUNDcUUsWUFBQUEsSUFBSSxDQUFDbEcsUUFBTCxDQUFjTyxjQUFkLEdBQStCbUcsT0FBL0IsQ0FBdUNQLFlBQVksQ0FBQ3JELElBQXBEOztBQUNBekUsWUFBQUEsT0FBTyxDQUFDQyxZQUFSLENBQXFCQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFFQyxjQUFBQSxPQUFPLEVBQUUySDtBQUFYLGFBQWQsRUFBcUMvSCxPQUFPLENBQUNLLEtBQTdDLENBQXJCLEVBQTBFLEVBQTFFO0FBQ0F3SCxZQUFBQSxJQUFJLENBQUMvSSx3QkFBTCxHQUFnQyxLQUFoQztBQUNBMEUsWUFBQUEsT0FBTyxDQUFDLElBQUQsQ0FBUCxDQUpELENBSWdCOztBQUNmOztBQUVELGVBQUssTUFBTDtBQUNDbEQsWUFBQUEsTUFBTSxDQUFDYSxnQkFBUCxDQUF3QixVQUF4QixFQUFvQ2lILFNBQXBDO0FBQ0FwSSxZQUFBQSxPQUFPLENBQUNzSSxFQUFSLENBQVcsQ0FBQ3RFLGNBQWMsQ0FBQ3VELEtBQTNCO0FBQ0E7O0FBRUQsZUFBSyxjQUFMO0FBQ0MsWUFBQSxNQUFJLENBQUNDLHlCQUFMOztBQUNBbEgsWUFBQUEsTUFBTSxDQUFDYSxnQkFBUCxDQUF3QixVQUF4QixFQUFvQ2dILGdCQUFwQztBQUNBbkksWUFBQUEsT0FBTyxDQUFDc0ksRUFBUixDQUFXLENBQUN0RSxjQUFjLENBQUN1RCxLQUEzQjtBQUNBOztBQUVEO0FBQ0M7QUFDQSxZQUFBLE1BQUksQ0FBQ3pJLHdCQUFMLEdBQWdDLEtBQWhDO0FBQ0EwRSxZQUFBQSxPQUFPLENBQUMsS0FBRCxDQUFQO0FBQWdCO0FBN0JsQjtBQStCQSxPQXpFTSxDQUFQO0FBMEVBLEs7O1dBRUQrRSxtQixHQUFBLCtCQUFzQjtBQUNyQixhQUFPLEtBQUszRyxnQkFBTCxDQUFzQixLQUFLQSxnQkFBTCxDQUFzQnJELE1BQXRCLEdBQStCLENBQXJELENBQVA7QUFDQSxLOztXQUVEaUssYyxHQUFBLHdCQUFlQyxRQUFmLEVBQWlFO0FBQ2hFLFdBQUtwSixhQUFMLEdBQXFCb0osUUFBUSxDQUFDQyxNQUFULENBQWdCLFVBQUNDLE9BQUQsRUFBYTtBQUNqRCxlQUFPQSxPQUFPLENBQUNDLE9BQVIsS0FBb0JELE9BQU8sQ0FBQ0UsT0FBbkM7QUFDQSxPQUZvQixDQUFyQjtBQUdBLEs7O1dBRUQzSCxTLEdBQUEscUJBQVk7QUFBQTs7QUFDWCxVQUFJakQsS0FBSyxHQUFHcUMsTUFBTSxDQUFDQyxRQUFQLENBQWdCa0UsSUFBNUI7O0FBRUEsVUFBSXhHLEtBQUssQ0FBQ0MsT0FBTixDQUFjLHFCQUFkLE1BQXlDLENBQUMsQ0FBOUMsRUFBaUQ7QUFDaEQsYUFBS2lCLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxPQUZELE1BRU8sSUFBSSxDQUFDLEtBQUtMLHdCQUFWLEVBQW9DO0FBQzFDO0FBQ0EsWUFBTTZKLE9BQU8sR0FBRyxLQUFLdEosYUFBTCxDQUFtQnlKLElBQW5CLENBQXdCLFVBQUNDLENBQUQsRUFBTztBQUM5QyxpQkFBTzlLLEtBQUssQ0FBQ0MsT0FBTixDQUFjNkssQ0FBQyxDQUFDSCxPQUFoQixLQUE0QixDQUFuQztBQUNBLFNBRmUsQ0FBaEI7O0FBR0EsWUFBSUQsT0FBSixFQUFhO0FBQ1o7QUFDQTFLLFVBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDRixPQUFOLENBQWM0SyxPQUFPLENBQUNDLE9BQXRCLEVBQStCRCxPQUFPLENBQUNFLE9BQXZDLENBQVI7QUFDQTdJLFVBQUFBLE9BQU8sQ0FBQ0MsWUFBUixDQUFxQkMsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkgsT0FBTyxDQUFDSyxLQUExQixDQUFyQixFQUF1RCxFQUF2RCxFQUEyRHBDLEtBQTNEO0FBQ0EsU0FKRCxNQUlPO0FBQ04sY0FBTStLLFVBQVUsR0FBRy9LLEtBQUssQ0FBQzhILEtBQU4sQ0FBWSxJQUFaLENBQW5CO0FBQ0EsY0FBTWtELFFBQVEsR0FBR0QsVUFBVSxDQUFDLENBQUQsQ0FBVixHQUFnQkEsVUFBVSxDQUFDLENBQUQsQ0FBMUIsR0FBZ0MsRUFBakQ7O0FBQ0EsY0FBSSxLQUFLL0Ysa0JBQUwsQ0FBd0JnRyxRQUF4QixDQUFKLEVBQXVDO0FBQ3RDLGlCQUFLN0osZ0JBQUwsR0FBd0IsSUFBeEI7O0FBQ0EsZ0JBQU1xRSxTQUFTLEdBQUcsS0FBS3hCLHFCQUFMLENBQTJCZ0gsUUFBM0IsQ0FBbEI7O0FBQ0EsaUJBQUtoRixhQUFMLENBQW1CUixTQUFuQixFQUE4QixLQUE5QixFQUFxQyxLQUFyQyxFQUE0QyxJQUE1Qzs7QUFFQXlFLFlBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2hCLGNBQUEsTUFBSSxDQUFDOUksZ0JBQUwsR0FBd0IsS0FBeEI7QUFDQSxhQUZTLEVBRVAsQ0FGTyxDQUFWO0FBR0E7QUFDRDtBQUNEO0FBQ0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FFQzhILG1CLEdBQUEsNkJBQW9CZ0MsT0FBcEIsRUFBa0NDLE9BQWxDLEVBQWdEO0FBQy9DO0FBQ0EsVUFBSUQsT0FBTyxDQUFDdEYsSUFBUixDQUFhckYsTUFBYixHQUFzQjRLLE9BQU8sQ0FBQ3ZGLElBQVIsQ0FBYXJGLE1BQXZDLEVBQStDO0FBQzlDLGVBQU9uQixTQUFTLENBQUNJLFNBQWpCO0FBQ0E7O0FBQ0QsVUFBSTRMLEtBQUssR0FBRyxJQUFaO0FBQ0EsVUFBSXJGLEtBQUo7O0FBQ0EsV0FBS0EsS0FBSyxHQUFHLENBQWIsRUFBZ0JxRixLQUFLLElBQUlyRixLQUFLLEdBQUdtRixPQUFPLENBQUN0RixJQUFSLENBQWFyRixNQUE5QyxFQUFzRHdGLEtBQUssRUFBM0QsRUFBK0Q7QUFDOUQsWUFBSW1GLE9BQU8sQ0FBQ3RGLElBQVIsQ0FBYUcsS0FBYixNQUF3Qm9GLE9BQU8sQ0FBQ3ZGLElBQVIsQ0FBYUcsS0FBYixDQUE1QixFQUFpRDtBQUNoRHFGLFVBQUFBLEtBQUssR0FBRyxLQUFSO0FBQ0E7QUFDRDs7QUFDRCxVQUFJLENBQUNBLEtBQUwsRUFBWTtBQUNYO0FBQ0EsZUFBT2hNLFNBQVMsQ0FBQ0ksU0FBakI7QUFDQSxPQWY4QyxDQWlCL0M7OztBQUNBLFVBQUkwTCxPQUFPLENBQUN0RixJQUFSLENBQWFyRixNQUFiLEdBQXNCNEssT0FBTyxDQUFDdkYsSUFBUixDQUFhckYsTUFBbkMsSUFBNkMySyxPQUFPLENBQUN6QyxVQUFSLEdBQXFCMEMsT0FBTyxDQUFDMUMsVUFBOUUsRUFBMEY7QUFDekYsZUFBT3JKLFNBQVMsQ0FBQ0csUUFBakI7QUFDQTs7QUFDRCxVQUFJMkwsT0FBTyxDQUFDekMsVUFBUixHQUFxQjBDLE9BQU8sQ0FBQzFDLFVBQWpDLEVBQTZDO0FBQzVDLGVBQU9ySixTQUFTLENBQUNJLFNBQWpCLENBRDRDLENBQ2hCO0FBQzVCLE9BdkI4QyxDQXlCL0M7QUFDQTs7O0FBQ0EsYUFBTzBMLE9BQU8sQ0FBQzFDLE9BQVIsS0FBb0IyQyxPQUFPLENBQUMzQyxPQUE1QixHQUFzQ3BKLFNBQVMsQ0FBQ0MsS0FBaEQsR0FBd0RELFNBQVMsQ0FBQ0UsVUFBekU7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0MrTCx1QixHQUFBLGlDQUF3QkMsWUFBeEIsRUFBK0M7QUFDOUMsVUFBSUMsU0FBSjtBQUNBLFVBQUlqRixZQUFKOztBQUNBLFVBQUlnRixZQUFZLEtBQUt2RyxTQUFyQixFQUFnQztBQUMvQjtBQUNBO0FBQ0E7QUFDQSxZQUFNeUcsVUFBVSxHQUFHLEtBQUs3SixlQUFMLENBQXFCOEosU0FBckIsQ0FBK0JuSixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JrRSxJQUEvQyxDQUFuQjs7QUFDQSxZQUFJK0UsVUFBVSxJQUFJQSxVQUFVLENBQUNFLGdCQUE3QixFQUErQztBQUM5Q3BGLFVBQUFBLFlBQVksR0FBR2tGLFVBQVUsQ0FBQ0UsZ0JBQTFCOztBQUNBLGNBQUlwRixZQUFZLENBQUNwRyxPQUFiLENBQXFCLElBQXJCLE1BQStCLENBQW5DLEVBQXNDO0FBQ3JDb0csWUFBQUEsWUFBWSxHQUFHQSxZQUFZLENBQUNjLFNBQWIsQ0FBdUIsQ0FBdkIsQ0FBZjtBQUNBO0FBQ0QsU0FMRCxNQUtPO0FBQ05kLFVBQUFBLFlBQVksR0FBR2hFLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQmtFLElBQWhCLENBQXFCVyxTQUFyQixDQUErQixDQUEvQixDQUFmLENBRE0sQ0FDNEM7O0FBQ2xELGNBQUlkLFlBQVksQ0FBQyxDQUFELENBQVosS0FBb0IsR0FBeEIsRUFBNkI7QUFDNUJBLFlBQUFBLFlBQVksR0FBR0EsWUFBWSxDQUFDYyxTQUFiLENBQXVCLENBQXZCLENBQWY7QUFDQTtBQUNEO0FBQ0QsT0FoQkQsTUFnQk87QUFDTmQsUUFBQUEsWUFBWSxHQUFHZ0YsWUFBZjtBQUNBOztBQUNEQSxNQUFBQSxZQUFZLEdBQUdLLEdBQUcsQ0FBQ0MsTUFBSixDQUFXdEYsWUFBWCxDQUFmOztBQUNBLFVBQUksS0FBS3pDLGlCQUFULEVBQTRCO0FBQzNCLGFBQUssSUFBSTJDLENBQUMsR0FBRyxLQUFLNUMsZ0JBQUwsQ0FBc0JyRCxNQUF0QixHQUErQixDQUE1QyxFQUErQ2lHLENBQUMsR0FBRyxDQUFuRCxFQUFzREEsQ0FBQyxFQUF2RCxFQUEyRDtBQUMxRCxjQUFJLEtBQUs1QyxnQkFBTCxDQUFzQjRDLENBQXRCLEVBQXlCQyxJQUF6QixLQUFrQzZFLFlBQXRDLEVBQW9EO0FBQ25EQyxZQUFBQSxTQUFTLEdBQUcsS0FBSzNILGdCQUFMLENBQXNCNEMsQ0FBQyxHQUFHLENBQTFCLEVBQTZCQyxJQUF6QztBQUNBO0FBQ0E7QUFDRDs7QUFFRCxlQUFPLENBQUM4RSxTQUFELElBQWMsQ0FBQyxLQUFLdEcsa0JBQUwsQ0FBd0JzRyxTQUF4QixDQUF0QjtBQUNBOztBQUNELGFBQU8sS0FBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NNLHlCLEdBQUEscUNBQTRCO0FBQzNCLFVBQUksS0FBS2pJLGdCQUFMLENBQXNCckQsTUFBdEIsR0FBK0IsQ0FBbkMsRUFBc0M7QUFDckMsZUFBTyxLQUFQO0FBQ0E7O0FBRUQsVUFBTXVMLGFBQWEsR0FBRyxLQUFLbEksZ0JBQUwsQ0FBc0IsS0FBS0EsZ0JBQUwsQ0FBc0JyRCxNQUF0QixHQUErQixDQUFyRCxDQUF0QjtBQUNBLFVBQU13TCxjQUFjLEdBQUcsS0FBS25JLGdCQUFMLENBQXNCLEtBQUtBLGdCQUFMLENBQXNCckQsTUFBdEIsR0FBK0IsQ0FBckQsQ0FBdkI7QUFFQSxhQUFPdUwsYUFBYSxDQUFDckYsSUFBZCxDQUFtQnNCLEtBQW5CLENBQXlCLEdBQXpCLEVBQThCLENBQTlCLE1BQXFDZ0UsY0FBYyxDQUFDdEYsSUFBZixDQUFvQnNCLEtBQXBCLENBQTBCLEdBQTFCLEVBQStCLENBQS9CLENBQTVDO0FBQ0EsSzs7O0lBMXZCd0JpRSxVO1NBNnZCWHBMLFciLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgU3luY2hyb25pemF0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N5bmNocm9uaXphdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJU2hlbGxTZXJ2aWNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaGVsbFNlcnZpY2VzRmFjdG9yeVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBVUkkgZnJvbSBcInNhcC91aS90aGlyZHBhcnR5L1VSSVwiO1xuaW1wb3J0IHR5cGUgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmNvbnN0IGVudW1TdGF0ZSA9IHtcblx0RVFVQUw6IDAsXG5cdENPTVBBVElCTEU6IDEsXG5cdEFOQ0VTVE9SOiAyLFxuXHRESUZGRVJFTlQ6IDNcbn07XG5jb25zdCBlbnVtVVJMUGFyYW1zID0ge1xuXHRMQVlPVVRQQVJBTTogXCJsYXlvdXRcIixcblx0SUFQUFNUQVRFUEFSQU06IFwic2FwLWlhcHAtc3RhdGVcIlxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgSGFzaEd1YXJkIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gc0d1YXJkSGFzaCBUaGUgaGFzaCB1c2VkIGZvciB0aGUgZ3VhcmRcbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGhhc2ggZ3VhcmRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlR3VhcmRGcm9tSGFzaChzR3VhcmRIYXNoOiBzdHJpbmcpIHtcblx0cmV0dXJuIHtcblx0XHRfZ3VhcmRIYXNoOiBzR3VhcmRIYXNoLnJlcGxhY2UoL1xcP1teXFw/XSokLywgXCJcIiksIC8vIFJlbW92ZSBxdWVyeSBwYXJ0XG5cdFx0Y2hlY2s6IGZ1bmN0aW9uIChzSGFzaDogYW55KSB7XG5cdFx0XHRyZXR1cm4gc0hhc2guaW5kZXhPZih0aGlzLl9ndWFyZEhhc2gpID09PSAwO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaUFwcFN0YXRlIHBhcnQgZnJvbSBhIGhhc2ggKG9yIG51bGwgaWYgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcbiAqIEByZXR1cm5zIFRoZSBpQXBwU3RhdGUgcGFydCBvZiB0aGUgaGFzaFxuICovXG5mdW5jdGlvbiBmaW5kQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRjb25zdCBhQXBwU3RhdGUgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0oW14mXSopYCkpO1xuXHRyZXR1cm4gYUFwcFN0YXRlICYmIGFBcHBTdGF0ZS5sZW5ndGggPiAxID8gYUFwcFN0YXRlWzFdIDogbnVsbDtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhc2ggd2l0aG91dCBpdHMgaUFwcFN0YXRlIHBhcnQuXG4gKlxuICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG4gKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRob3V0IHRoZSBpQXBwU3RhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZykge1xuXHRyZXR1cm4gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKGBbJj9dKiR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09W14mXSpgKSwgXCJcIik7XG59XG4vKipcbiAqIEFkZHMgYW4gaUFwcFN0YXRlIGluc2lkZSBhIGhhc2ggKG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSkuXG4gKlxuICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG4gKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBpQXBwU3RhdGUgdG8gYWRkXG4gKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRoIHRoZSBhcHAgc3RhdGVcbiAqL1xuZnVuY3Rpb24gc2V0QXBwU3RhdGVJbkhhc2goc0hhc2g6IGFueSwgc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0bGV0IHNOZXdIYXNoO1xuXG5cdGlmIChzSGFzaC5pbmRleE9mKGVudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU0pID49IDApIHtcblx0XHQvLyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaCwgcmVwbGFjZSBpdFxuXHRcdHNOZXdIYXNoID0gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PVteJl0qYCksIGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PSR7c0FwcFN0YXRlS2V5fWApO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEFkZCB0aGUgaUFwcFN0YXRlIHBhcmFtZXRlciBpbiB0aGUgaGFzaFxuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwiP1wiKSA8IDApIHtcblx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9P2A7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9JmA7XG5cdFx0fVxuXHRcdHNOZXdIYXNoICs9IGAke2VudW1VUkxQYXJhbXMuSUFQUFNUQVRFUEFSQU19PSR7c0FwcFN0YXRlS2V5fWA7XG5cdH1cblxuXHRyZXR1cm4gc05ld0hhc2g7XG59XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLlJvdXRlclByb3h5XCIpXG5jbGFzcyBSb3V0ZXJQcm94eSBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0YklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSA9IGZhbHNlO1xuXHRiSXNHdWFyZENyb3NzQWxsb3dlZCA9IGZhbHNlO1xuXHRzSUFwcFN0YXRlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblx0X29TaGVsbFNlcnZpY2VzITogSVNoZWxsU2VydmljZXM7XG5cdGZjbEVuYWJsZWQhOiBib29sZWFuO1xuXHRfZm5CbG9ja2luZ05hdkZpbHRlciE6IEZ1bmN0aW9uO1xuXHRfZm5IYXNoR3VhcmQhOiBGdW5jdGlvbjtcblx0X2JEaXNhYmxlT25IYXNoQ2hhbmdlITogYm9vbGVhbjtcblx0X2JJZ25vcmVSZXN0b3JlITogYm9vbGVhbjtcblx0X2JGb3JjZUZvY3VzITogYm9vbGVhbjtcblx0X29Sb3V0ZXIhOiBSb3V0ZXI7XG5cdF9vTWFuYWdlZEhpc3RvcnkhOiBhbnlbXTtcblx0X29OYXZpZ2F0aW9uR3VhcmQ6IGFueTtcblx0b1Jlc291cmNlQnVuZGxlPzogUmVzb3VyY2VCdW5kbGU7XG5cdF9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbj86IFN5bmNocm9uaXphdGlvbjtcblx0X2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvOiBib29sZWFuID0gZmFsc2U7XG5cdF9iQXBwbHlSZXN0b3JlOiBib29sZWFuID0gZmFsc2U7XG5cdF9iRGVsYXllZFJlYnVpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X3BhdGhNYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10gPSBbXTtcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IGFueSwgaXNmY2xFbmFibGVkOiBib29sZWFuKSB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXG5cdFx0XHRcdHRoaXMuaW5pdFJhdyhvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpKTtcblx0XHRcdFx0Ly8gV2Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSBpbml0aWFsIHJvdXRlTWF0Y2hlZCBpcyBkb25lIGJlZm9yZSBkb2luZyBhbnkgbmF2aWdhdGlvblxuXHRcdFx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0XHRcdC8vIFNldCBmZUxldmVsPTAgZm9yIHRoZSBmaXJzdCBBcHBsaWNhdGlvbiBwYWdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZlTGV2ZWw6IDBcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbiBhcyBhbnlcblx0XHRcdFx0KTtcblx0XHRcdFx0dGhpcy5mY2xFbmFibGVkID0gaXNmY2xFbmFibGVkO1xuXG5cdFx0XHRcdHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIgPSB0aGlzLl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBzaGVsbCBzZXJ2aWNlc1wiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0dGhpcy5fZm5IYXNoR3VhcmQgPSB0aGlzLmhhc2hHdWFyZC5iaW5kKHRoaXMpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JJZ25vcmVSZXN0b3JlID0gZmFsc2U7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSB0cnVlOyAvLyBUcmlnZ2VyIHRoZSBmb2N1cyBtZWNoYW5pc20gZm9yIHRoZSBmaXJzdCB2aWV3IGRpc3BsYXllZCBieSB0aGUgYXBwXG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLl9vU2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0fVxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSYXcgaW5pdGlhbGl6YXRpb24gKGZvciB1bml0IHRlc3RzKS5cblx0ICpcblx0ICogQHBhcmFtIG9Sb3V0ZXIgVGhlIHJvdXRlciB1c2VkIGJ5IHRoaXMgcHJveHlcblx0ICovXG5cdGluaXRSYXcob1JvdXRlcjogUm91dGVyKSB7XG5cdFx0dGhpcy5fb1JvdXRlciA9IG9Sb3V0ZXI7XG5cdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5ID0gW107XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cblx0XHRjb25zdCBzQ3VycmVudEFwcEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkucHVzaCh0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQ3VycmVudEFwcEhhc2gpKTtcblxuXHRcdC8vIFNldCB0aGUgaUFwcFN0YXRlIGlmIHRoZSBpbml0aWFsIGhhc2ggY29udGFpbnMgb25lXG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gZmluZEFwcFN0YXRlSW5IYXNoKHNDdXJyZW50QXBwSGFzaCk7XG5cdH1cblxuXHRnZXRIYXNoKCkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpO1xuXHR9XG5cblx0aXNGb2N1c0ZvcmNlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYkZvcmNlRm9jdXM7XG5cdH1cblxuXHRzZXRGb2N1c0ZvcmNlZChiRm9yY2VkOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSBiRm9yY2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgdmFyaWFibGUgc0lBcHBTdGF0ZUtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5I3JlbW92ZUlBcHBTdGF0ZUtleVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdHJlbW92ZUlBcHBTdGF0ZUtleSgpIHtcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGhhc2guXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eSNuYXZUb0hhc2hcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlJvdXRlclByb3h5XG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHNIYXNoIEhhc2ggdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBiUHJlc2VydmVIaXN0b3J5IElmIHNldCB0byB0cnVlLCBub24tYW5jZXN0b3IgZW50cmllcyBpbiBoaXN0b3J5IHdpbGwgYmUgcmV0YWluZWRcblx0ICogQHBhcmFtIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUgSWYgc2V0IHRvIHRydWUsIGNhY2hlIHByZXNlcnZhdGlvbiBtZWNoYW5pc20gaXMgZGlzYWJsZWQgZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb25cblx0ICogQHBhcmFtIGJGb3JjZUZvY3VzIElmIHNldCB0byB0cnVlLCB0aGUgbG9naWMgdG8gc2V0IHRoZSBmb2N1cyBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCB3aWxsIGJlIHRyaWdnZXJlZCAob25QYWdlUmVhZHkpXG5cdCAqIEBwYXJhbSBiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciBJZiBub3Qgc2V0IHRvIGZhbHNlLCB0aGUgYmFjayBuYXZpZ2F0aW9uIGlzIHNldCB0byB1bmRlZmluZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSAocmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQpIHRoYXQgcmV0dXJucyAndHJ1ZScgaWYgYSBuYXZpZ2F0aW9uIHRvb2sgcGxhY2UsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkbid0IGhhcHBlblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdG5hdlRvSGFzaChcblx0XHRzSGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbixcblx0XHRiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlcj86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyICE9PSBmYWxzZSkge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24ud2FpdEZvcigpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2ludGVybmFsTmF2VG9IYXNoKHNIYXNoLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlLCBiRm9yY2VGb2N1cyk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvKSB7XG5cdFx0XHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzKTtcblx0XHR9XG5cdH1cblxuXHRfaW50ZXJuYWxOYXZUb0hhc2goc0hhc2g6IGFueSwgYlByZXNlcnZlSGlzdG9yeTogYW55LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlOiBhbnksIGJGb3JjZUZvY3VzPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIEFkZCB0aGUgYXBwIHN0YXRlIGluIHRoZSBoYXNoIGlmIG5lZWRlZFxuXHRcdGlmICh0aGlzLmZjbEVuYWJsZWQgJiYgdGhpcy5zSUFwcFN0YXRlS2V5ICYmICFmaW5kQXBwU3RhdGVJbkhhc2goc0hhc2gpKSB7XG5cdFx0XHRzSGFzaCA9IHNldEFwcFN0YXRlSW5IYXNoKHNIYXNoLCB0aGlzLnNJQXBwU3RhdGVLZXkpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQoc0hhc2gpKSB7XG5cdFx0XHRpZiAoIXRoaXMub1Jlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgaGF2ZSB0byB1c2UgYSBjb25maXJtIGhlcmUgZm9yIFVJIGNvbnNpc3RlbmN5IHJlYXNvbnMsIGFzIHdpdGggc29tZSBzY2VuYXJpb3Ncblx0XHRcdC8vIGluIHRoZSBFZGl0RmxvdyB3ZSByZWx5IG9uIGEgVUk1IG1lY2hhbmlzbSB0aGF0IGRpc3BsYXlzIGEgY29uZmlybSBkaWFsb2cuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYWxlcnRcblx0XHRcdGlmICghY29uZmlybSh0aGlzLm9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19ST1VURVJfUFJPWFlfU0FQRkVfRVhJVF9OT1RTQVZFRF9NRVNTQUdFXCIpKSkge1xuXHRcdFx0XHQvLyBUaGUgdXNlciBjbGlja2VkIG9uIENhbmNlbCAtLT4gY2FuY2VsIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJJc0d1YXJkQ3Jvc3NBbGxvd2VkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBJbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIHdpbGwgY2F1c2UgYSBuZXcgdmlldyB0byBiZSBkaXNwbGF5ZWQsIHdlIGZvcmNlIHRoZSBmb2N1c1xuXHRcdC8vIEkuZS4gaWYgdGhlIGtleXMgZm9yIHRoZSBoYXNoIHdlJ3JlIG5hdmlnYXRpbmcgdG8gaXMgYSBzdXBlcnNldCBvZiB0aGUgY3VycmVudCBoYXNoIGtleXMuXG5cdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0hhc2gpO1xuXHRcdGlmICghdGhpcy5fYkZvcmNlRm9jdXMpIHtcblx0XHRcdC8vIElmIHRoZSBmb2N1cyB3YXMgYWxyZWFkeSBmb3JjZWQsIGtlZXAgaXRcblx0XHRcdGNvbnN0IGFDdXJyZW50SGFzaEtleXMgPSB0aGlzLl9leHRyYWN0S2V5c0Zyb21IYXNoKHRoaXMuZ2V0SGFzaCgpKTtcblx0XHRcdHRoaXMuX2JGb3JjZUZvY3VzID1cblx0XHRcdFx0YkZvcmNlRm9jdXMgfHxcblx0XHRcdFx0KGFDdXJyZW50SGFzaEtleXMubGVuZ3RoIDwgb05ld1N0YXRlLmtleXMubGVuZ3RoICYmXG5cdFx0XHRcdFx0YUN1cnJlbnRIYXNoS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5OiBhbnksIGluZGV4OiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBrZXkgPT09IG9OZXdTdGF0ZS5rZXlzW2luZGV4XTtcblx0XHRcdFx0XHR9KSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb0hpc3RvcnlBY3Rpb24gPSB0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCBmYWxzZSwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSk7XG5cblx0XHRyZXR1cm4gdGhpcy5fcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uLCBmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXJzIGJyb3dzZXIgaGlzdG9yeSBpZiBlbnRyaWVzIGhhdmUgYmVlbiBhZGRlZCB3aXRob3V0IHVzaW5nIHRoZSBSb3V0ZXJQcm94eS5cblx0ICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgaGlzdG9yeSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIGhpc3RvcnkgaXMgcmVidWlsdFxuXHQgKi9cblx0cmVzdG9yZUhpc3RvcnkoKSB7XG5cdFx0aWYgKHRoaXMuX2JBcHBseVJlc3RvcmUpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSBmYWxzZTtcblx0XHRcdGxldCBzVGFyZ2V0SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdFx0c1RhcmdldEhhc2ggPSBzVGFyZ2V0SGFzaC5yZXBsYWNlKC8oXFw/fCYpcmVzdG9yZUhpc3Rvcnk9dHJ1ZS8sIFwiXCIpO1xuXHRcdFx0Y29uc3Qgb05ld1N0YXRlID0gdGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc1RhcmdldEhhc2gpO1xuXG5cdFx0XHRjb25zdCBvSGlzdG9yeUFjdGlvbiA9IHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIHRydWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gdGhlIGhpc3RvcnkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0bmF2QmFjaygpIHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgc1ByZXZpb3VzSGFzaDtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBjdXJyZW50IGhhc2ggaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0c1ByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNQcmV2aW91c0hhc2gpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzUHJldmlvdXNIYXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCBhIHByZXZpb3VzIGhhc2ggaW4gaGlzdG9yeVxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgdHJhbnNpZW50IGhhc2ggaW4gYSBjcmVhdGUgYXBwLCBhbmRcblx0XHRcdC8vIGluIHRoYXQgY2FzZSBoaXN0b3J5LmJhY2sgd291bGQgZ28gYmFjayB0byB0aGUgRkxQXG5cdFx0XHR3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlIHdpdGggcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIHNSb3V0ZU5hbWUgVGhlIHJvdXRlIG5hbWUgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRuYXZUbyhzUm91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXIuZ2V0VVJMKHNSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0XHRyZXR1cm4gdGhpcy5uYXZUb0hhc2goc0hhc2gsIGZhbHNlLCBvUGFyYW1ldGVycy5ub1ByZXNlcnZhdGlvbkNhY2hlLCBmYWxzZSwgIW9QYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4aXRzIHRoZSBjdXJyZW50IGFwcCBieSBuYXZpZ2F0aW5nIGJhY2tcblx0ICogdG8gdGhlIHByZXZpb3VzIGFwcCAoaWYgYW55KSBvciB0aGUgRkxQLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB3ZSBleGl0IHRoZSBhcHBcblx0ICovXG5cdGV4aXRGcm9tQXBwKCkge1xuXHRcdHJldHVybiB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5iYWNrVG9QcmV2aW91c0FwcCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gaGFzaCBjYW4gaGF2ZSBhbiBpbXBhY3Qgb24gdGhlIGN1cnJlbnQgc3RhdGVcblx0ICogaS5lLiBpZiB0aGUgaGFzaCBpcyBlcXVhbCwgY29tcGF0aWJsZSBvciBhbiBhbmNlc3RvciBvZiB0aGUgY3VycmVudCBzdGF0ZS5cblx0ICpcblx0ICogQHBhcmFtIHNIYXNoIGB0cnVlYCBpZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICogQHJldHVybnMgSWYgdGhlcmUgaXMgYW4gaW1wYWN0XG5cdCAqL1xuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkoc0hhc2g6IGFueSkge1xuXHRcdGlmIChzSGFzaFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHNIYXNoID0gc0hhc2guc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBvTG9jYWxHdWFyZCA9IGNyZWF0ZUd1YXJkRnJvbUhhc2goc0hhc2gpO1xuXHRcdHJldHVybiBvTG9jYWxHdWFyZC5jaGVjayh0aGlzLmdldEhhc2goKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBgZmFsc2VgIGlmIGEgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgaW4gdGhlIFJvdXRlclByb3h5IGFuZCBpcyBub3QgeWV0IGZpbmFsaXplZFxuXHQgKi9cblx0aXNOYXZpZ2F0aW9uRmluYWxpemVkKCkge1xuXHRcdHJldHVybiAhdGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgJiYgIXRoaXMuX2JEZWxheWVkUmVidWlsZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBsYXN0IHN0YXRlIGFzIGEgZ3VhcmQuXG5cdCAqIEVhY2ggZnV0dXJlIG5hdmlnYXRpb24gd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhpcyBndWFyZCwgYW5kIGEgY29uZmlybWF0aW9uIGRpYWxvZyB3aWxsXG5cdCAqIGJlIGRpc3BsYXllZCBiZWZvcmUgdGhlIG5hdmlnYXRpb24gY3Jvc3NlcyB0aGUgZ3VhcmQgKGkuZS4gZ29lcyB0byBhbiBhbmNlc3RvciBvZiB0aGUgZ3VhcmQpLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggZm9yIHRoZSBndWFyZFxuXHQgKi9cblx0c2V0TmF2aWdhdGlvbkd1YXJkKHNIYXNoOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCk7XG5cdFx0dGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKi9cblx0ZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpIHtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIGd1YXJkIGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0aGFzTmF2aWdhdGlvbkd1YXJkKCkge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkICE9PSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRlc3RzIGEgaGFzaCBhZ2FpbnN0IHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdGVzdGVkXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBuYXZpZ2F0aW5nIHRvIHRoZSBoYXNoIGRvZXNuJ3QgY3Jvc3MgdGhlIGd1YXJkXG5cdCAqL1xuXHRjaGVja0hhc2hXaXRoR3VhcmQoc0hhc2g6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID09PSBudWxsIHx8IHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQuY2hlY2soc0hhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdXNlciBhbGxvd2VkIHRoZSBuYXZpZ2F0aW9uIGd1YXJkIHRvIGJlIGNyb3NzZWQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGJlZW4gYWxsb3dlZCBieSB0aGUgdXNlclxuXHQgKi9cblx0aXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBY3RpdmF0ZXMgdGhlIHN5bmNocm9uaXphdGlvbiBmb3Igcm91dGVNYXRjaGVkRXZlbnQuXG5cdCAqIFRoZSBuZXh0IE5hdlRvSGFzaCBjYWxsIHdpbGwgY3JlYXRlIGEgU3luY2hyb25pemF0aW9uIG9iamVjdCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWRcblx0ICogYnkgdGhlIGNvcnJlc3BvbmRpbmcgb25Sb3V0ZU1hdGNoZWQgZXZlbnQsIHByZXZlbnRpbmcgYW5vdGhlciBOYXZUb0hhc2ggdG8gaGFwcGVuIGluIHBhcmFsbGVsLlxuXHQgKi9cblx0YWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCkge1xuXHRcdHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIHRoZSByb3V0ZU1hdGNoIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIHVubG9ja2luZyBwb3RlbnRpYWwgcGVuZGluZyBOYXZUb0hhc2ggY2FsbHMuXG5cdCAqL1xuXHRyZXNvbHZlUm91dGVNYXRjaCgpIHtcblx0XHRpZiAodGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24pIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZXMgc3VyZSBubyBuYXZpZ2F0aW9uIGNhbiBoYXBwZW4gYmVmb3JlIGEgcm91dGVNYXRjaCBoYXBwZW5lZC5cblx0ICovXG5cdHdhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpIHtcblx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiA9IG5ldyBTeW5jaHJvbml6YXRpb24oKTtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IGZhbHNlO1xuXHR9XG5cblx0X2V4dHJhY3RLZXlzRnJvbUhhc2goc0hhc2g6IGFueSkge1xuXHRcdGlmIChzSGFzaCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzSGFzaCA9IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IHNIYXNoTm9QYXJhbXMgPSBzSGFzaC5zcGxpdChcIj9cIilbMF07IC8vIHJlbW92ZSBwYXJhbXNcblx0XHRjb25zdCBhVG9rZW5zID0gc0hhc2hOb1BhcmFtcy5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgYUtleXM6IGFueVtdID0gW107XG5cblx0XHRhVG9rZW5zLmZvckVhY2goZnVuY3Rpb24gKHNUb2tlbjogYW55KSB7XG5cdFx0XHRjb25zdCByZWdleEtleSA9IC9bXlxcKFxcKV0rXFwoW15cXChcXCldK1xcKS87IC8vIGFiYyhkZWYpXG5cdFx0XHRpZiAocmVnZXhLZXkudGVzdChzVG9rZW4pKSB7XG5cdFx0XHRcdGFLZXlzLnB1c2goc1Rva2VuLnNwbGl0KFwiKFwiKVswXSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gYUtleXM7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgc3RhdGUgZnJvbSBhIGhhc2guXG5cdCAqXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCB0byBiZSB1c2VkIGFzIGVudHJ5XG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaDogc3RyaW5nKSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvU3RhdGU6IGFueSA9IHtcblx0XHRcdGtleXM6IHRoaXMuX2V4dHJhY3RLZXlzRnJvbUhhc2goc0hhc2gpXG5cdFx0fTtcblxuXHRcdC8vIFJldHJpZXZlIGxheW91dCAoaWYgYW55KVxuXHRcdGNvbnN0IGFMYXlvdXQgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLkxBWU9VVFBBUkFNfT0oW14mXSopYCkpO1xuXHRcdG9TdGF0ZS5zTGF5b3V0ID0gYUxheW91dCAmJiBhTGF5b3V0Lmxlbmd0aCA+IDEgPyBhTGF5b3V0WzFdIDogbnVsbDtcblx0XHRpZiAob1N0YXRlLnNMYXlvdXQgPT09IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiKSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDE7XG5cdFx0fSBlbHNlIGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAwO1xuXHRcdH1cblxuXHRcdG9TdGF0ZS5oYXNoID0gc0hhc2g7XG5cdFx0cmV0dXJuIG9TdGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgbmV3IHN0YXRlIGludG8gdGhlIGludGVybmFsIGhpc3Rvcnkgc3RydWN0dXJlLlxuXHQgKiBNYWtlcyBzdXJlIHRoaXMgbmV3IHN0YXRlIGlzIGFkZGVkIGFmdGVyIGFuIGFuY2VzdG9yLlxuXHQgKiBBbHNvIHNldHMgdGhlIGlBcHBTdGF0ZSBrZXkgaW4gdGhlIHdob2xlIGhpc3RvcnkuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVxuXHQgKiBAcGFyYW0gb05ld1N0YXRlIFRoZSBuZXcgc3RhdGUgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgd2UncmUgcmVidWlsZGluZyB0aGUgaGlzdG9yeSBhZnRlciBhIHNoZWxsIG1lbnUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gRGlzYWJsZSB0aGUgbWVjaGFuaXNtIHRvIHJldGFpbmVkIG1hcmtlZCBlbnRyaWVzIGluIGNhY2hlXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgc3RhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3B1c2hOZXdTdGF0ZShvTmV3U3RhdGU6IGFueSwgYlJlYnVpbGRPbmx5OiBib29sZWFuLCBiUHJlc2VydmVIaXN0b3J5OiBib29sZWFuLCBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb246IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgbGFzdEluZGV4ID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7XG5cdFx0bGV0IGlQb3BDb3VudCA9IGJSZWJ1aWxkT25seSA/IDEgOiAwO1xuXG5cdFx0Ly8gMS4gRG8gc29tZSBjbGVhbnVwIGluIHRoZSBtYW5hZ2VkIGhpc3RvcnkgOiBpbiBjYXNlIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQgYmFjayBpbiB0aGUgYnJvd3NlciBoaXN0b3J5LCB3ZSBuZWVkIHRvIHJlbW92ZVxuXHRcdC8vIHRoZSBzdGF0ZXMgYWhlYWQgaW4gaGlzdG9yeSBhbmQgbWFrZSBzdXJlIHRoZSB0b3Agc3RhdGUgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZVxuXHRcdC8vIFdlIGRvbid0IGRvIHRoYXQgd2hlbiByZXN0b3JpbmcgdGhlIGhpc3RvcnksIGFzIHRoZSBjdXJyZW50IHN0YXRlIGhhcyBiZWVuIGFkZGVkIG9uIHRvcCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5XG5cdFx0Ly8gYW5kIGlzIG5vdCByZWZsZWN0ZWQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHR3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgdGhpcy5fb01hbmFnZWRIaXN0b3J5W2xhc3RJbmRleF0uaGFzaCAhPT0gc0N1cnJlbnRIYXNoKSB7XG5cdFx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0bGFzdEluZGV4LS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGhpc3RvcnkuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIGJyb3dzZXIgcmVsb2FkXG5cdFx0XHRcdC8vIGhhcHBlbmVkLCBjYXVzaW5nIGEgcmVpbml0aWFsaXphdGlvbiBvZiB0aGUgbWFuYWdlZCBoaXN0b3J5LlxuXHRcdFx0XHQvLyBJbiB0aGF0IGNhc2UsIHdlIHVzZSB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50IGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2godGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0N1cnJlbnRIYXNoKSk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiAwIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyAyLiBNYXJrIHRoZSB0b3Agc3RhdGUgYXMgcHJlc2VydmVkIGlmIHJlcXVpcmVkXG5cdFx0aWYgKGJQcmVzZXJ2ZUhpc3RvcnkgJiYgIWJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbikge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIDMuIFRoZW4gcG9wIGFsbCBzdGF0ZXMgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciBvZiB0aGUgbmV3IHN0YXRlLCBvciB3ZSBmaW5kIGEgc3RhdGUgdGhhdCBuZWVkIHRvIGJlIHByZXNlcnZlZFxuXHRcdGxldCBvTGFzdFJlbW92ZWRJdGVtO1xuXHRcdHdoaWxlICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1RvcFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiB8fCAhb1RvcFN0YXRlLnByZXNlcnZlZCkgJiZcblx0XHRcdFx0dGhpcy5fY29tcGFyZUNhY2hlU3RhdGVzKG9Ub3BTdGF0ZSwgb05ld1N0YXRlKSAhPT0gZW51bVN0YXRlLkFOQ0VTVE9SXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhlIHRvcCBzdGF0ZSBpcyBub3QgYW4gYW5jZXN0b3Igb2Ygb05ld1N0YXRlIGFuZCBpcyBub3QgcHJlc2VydmVkIC0tPiB3ZSBjYW4gcG9wIGl0XG5cdFx0XHRcdG9MYXN0UmVtb3ZlZEl0ZW0gPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGlQb3BDb3VudCsrO1xuXHRcdFx0fSBlbHNlIGlmIChvVG9wU3RhdGUucHJlc2VydmVkICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9Ub3BTdGF0ZS5oYXNoKSA9PT0gcmVtb3ZlQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpKSB7XG5cdFx0XHRcdC8vIFdlIHRyeSB0byBhZGQgYSBzdGF0ZSB0aGF0IGlzIGFscmVhZHkgaW4gY2FjaGUgKGR1ZSB0byBwcmVzZXJ2ZWQgZmxhZykgYnV0IHdpdGggYSBkaWZmZXJlbnQgaWFwcC1zdGF0ZVxuXHRcdFx0XHQvLyAtLT4gd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcHJldmlvdXMgZW50cnkgKGl0IHdpbGwgYmUgbGF0ZXIgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUpIGFuZCBzdG9wIHBvcHBpbmdcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHRcdG9OZXdTdGF0ZS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJyZWFrOyAvLyBBbmNlc3RvciBvciBwcmVzZXJ2ZWQgc3RhdGUgZm91bmQgLS0+IHdlIHN0b3AgcG9wcGluZyBvdXQgc3RhdGVzXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNC4gaUFwcFN0YXRlIG1hbmFnZW1lbnRcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBmaW5kQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpO1xuXHRcdGlmICghdGhpcy5mY2xFbmFibGVkICYmIG9MYXN0UmVtb3ZlZEl0ZW0pIHtcblx0XHRcdGNvbnN0IHNQcmV2aW91c0lBcHBTdGF0ZUtleSA9IGZpbmRBcHBTdGF0ZUluSGFzaChvTGFzdFJlbW92ZWRJdGVtLmhhc2gpO1xuXHRcdFx0Y29uc3Qgb0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9IHRoaXMuX2NvbXBhcmVDYWNoZVN0YXRlcyhvTGFzdFJlbW92ZWRJdGVtLCBvTmV3U3RhdGUpO1xuXHRcdFx0Ly8gaWYgY3VycmVudCBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gYSBpLWFwcHN0YXRlIGFuZCB0aGlzIHN0YXRlIHNob3VsZCByZXBsYWNlIGEgc3RhdGUgY29udGFpbmluZyBhIGlBcHBTdGF0ZVxuXHRcdFx0Ly8gdGhlbiB0aGUgcHJldmlvdXMgaUFwcFN0YXRlIGlzIHByZXNlcnZlZFxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5zSUFwcFN0YXRlS2V5ICYmXG5cdFx0XHRcdHNQcmV2aW91c0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHQob0NvbXBhcmlzb25TdGF0ZVJlc3VsdCA9PT0gZW51bVN0YXRlLkVRVUFMIHx8IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5DT01QQVRJQkxFKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9OZXdTdGF0ZS5oYXNoID0gc2V0QXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gsIHNQcmV2aW91c0lBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNS4gTm93IHdlIGNhbiBwdXNoIHRoZSBzdGF0ZSBhdCB0aGUgdG9wIG9mIHRoZSBpbnRlcm5hbCBoaXN0b3J5XG5cdFx0Y29uc3QgYkhhc1NhbWVIYXNoID0gb0xhc3RSZW1vdmVkSXRlbSAmJiBvTmV3U3RhdGUuaGFzaCA9PT0gb0xhc3RSZW1vdmVkSXRlbS5oYXNoO1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID09PSAwIHx8IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV0uaGFzaCAhPT0gb05ld1N0YXRlLmhhc2gpIHtcblx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKG9OZXdTdGF0ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gNi4gRGV0ZXJtaW5lIHdoaWNoIGFjdGlvbnMgdG8gZG8gb24gdGhlIGhpc3Rvcnlcblx0XHRpZiAoaVBvcENvdW50ID09PSAwKSB7XG5cdFx0XHQvLyBObyBzdGF0ZSB3YXMgcG9wcGVkIC0tPiBhcHBlbmRcblx0XHRcdHJldHVybiB7IHR5cGU6IFwiYXBwZW5kXCIgfTtcblx0XHR9IGVsc2UgaWYgKGlQb3BDb3VudCA9PT0gMSkge1xuXHRcdFx0Ly8gT25seSAxIHN0YXRlIHdhcyBwb3BwZWQgLS0+IHJlcGxhY2UgY3VycmVudCBoYXNoIHVubGVzcyBoYXNoIGlzIHRoZSBzYW1lICh0aGVuIG5vdGhpbmcgdG8gZG8pXG5cdFx0XHRyZXR1cm4gYkhhc1NhbWVIYXNoID8geyB0eXBlOiBcIm5vbmVcIiB9IDogeyB0eXBlOiBcInJlcGxhY2VcIiB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBNb3JlIHRoYW4gMSBzdGF0ZSB3YXMgcG9wcGVkIC0tPiBnbyBiYWtjIGluIGhpc3RvcnkgYW5kIHJlcGxhY2UgaGFzaCBpZiBuZWNlc3Nhcnlcblx0XHRcdHJldHVybiBiSGFzU2FtZUhhc2ggPyB7IHR5cGU6IFwiYmFja1wiLCBzdGVwczogaVBvcENvdW50IC0gMSB9IDogeyB0eXBlOiBcImJhY2stcmVwbGFjZVwiLCBzdGVwczogaVBvcENvdW50IC0gMSB9O1xuXHRcdH1cblx0fVxuXG5cdF9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2JEaXNhYmxlT25IYXNoQ2hhbmdlID8gXCJDdXN0b21cIiA6IFwiQ29udGludWVcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlIHRoZSByb3V0aW5nIGJ5IGNhbGxpbmcgdGhlIHJvdXRlciBzdG9wIG1ldGhvZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlKCkge1xuXHRcdHRoaXMuX2JEaXNhYmxlT25IYXNoQ2hhbmdlID0gdHJ1ZTtcblx0XHR0aGlzLl9vUm91dGVyLnN0b3AoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmFibGUgdGhlIHJvdXRpbmcgYnkgY2FsbGluZyB0aGUgcm91dGVyIGluaXRpYWxpemUgbWV0aG9kLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuUm91dGVyUHJveHkjX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVxuXHQgKiBAcGFyYW0gW2JJZ25vcmVDdXJyZW50SGFzaF0gSWdub3JlIHRoZSBsYXN0IGhhc2ggZXZlbnQgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgcm91dGVyIGhhcyBpbml0aWFsaXplZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UoYklnbm9yZUN1cnJlbnRIYXNoOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9vUm91dGVyLmluaXRpYWxpemUoYklnbm9yZUN1cnJlbnRIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTeW5jaHJvbml6ZXMgdGhlIGJyb3dzZXIgaGlzdG9yeSB3aXRoIHRoZSBpbnRlcm5hbCBoaXN0b3J5IG9mIHRoZSByb3V0ZXJQcm94eSwgYW5kIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Sb3V0ZXJQcm94eVxuXHQgKiBAcGFyYW0gb0hpc3RvcnlBY3Rpb24gU3BlY2lmaWVzIHRoZSBuYXZpZ2F0aW9uIGFjdGlvbiB0byBiZSBwZXJmb3JtZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgaW50ZXJuYWwgaGlzdG9yeSBpcyBjdXJyZW50bHkgYmVpbmcgcmVidWlsdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb246IGFueSwgYlJlYnVpbGRPbmx5OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IHRydWU7XG5cdFx0XHRjb25zdCBvVGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdLFxuXHRcdFx0XHRuZXdMZXZlbCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxO1xuXG5cdFx0XHRmdW5jdGlvbiByZXBsYWNlQXN5bmMoKSB7XG5cdFx0XHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0dGhhdC5fZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UodHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXG5cdFx0XHRcdGlmIChiUmVidWlsZE9ubHkpIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIFRpbWVvdXQgdG8gbGV0ICdoYXNoY2hhbmdlJyBldmVudCBiZSBwcm9jZXNzZWQgYmVmb3JlIGJ5IHRoZSBIYXNoQ2hhbmdlciwgc28gdGhhdFxuXHRcdFx0XHRcdFx0Ly8gb25Sb3V0ZU1hdGNoZWQgbm90aWZpY2F0aW9uIGlzbid0IHJhaXNlZFxuXHRcdFx0XHRcdFx0dGhhdC5fZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UodHJ1ZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGF0LmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXN5bmMgY2FsbGJhY2tzIHdoZW4gbmF2aWdhdGluZyBiYWNrLCBpbiBvcmRlciB0byBsZXQgYWxsIG5vdGlmaWNhdGlvbnMgYW5kIGV2ZW50cyBnZXQgcHJvY2Vzc2VkXG5cdFx0XHRmdW5jdGlvbiBiYWNrUmVwbGFjZUFzeW5jKCkge1xuXHRcdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBUaW1lb3V0IHRvIGxldCAnaGFzaGNoYW5nZScgZXZlbnQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBieSB0aGUgSGFzaENoYW5nZXJcblx0XHRcdFx0XHRyZXBsYWNlQXN5bmMoKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGJhY2tBc3luYygpIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrQXN5bmMpO1xuXHRcdFx0XHR0aGF0LmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdH1cblxuXHRcdFx0dGhhdC5fYklnbm9yZVJlc3RvcmUgPSB0cnVlO1xuXG5cdFx0XHRzd2l0Y2ggKG9IaXN0b3J5QWN0aW9uLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcInJlcGxhY2VcIjpcblx0XHRcdFx0XHQodGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiBuZXdMZXZlbCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cdFx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYXBwZW5kXCI6XG5cdFx0XHRcdFx0dGhhdC5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnNldEhhc2gob1RhcmdldFN0YXRlLmhhc2gpO1xuXHRcdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiBuZXdMZXZlbCB9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIik7XG5cdFx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpOyAvLyBhIG5hdmlnYXRpb24gb2NjdXJyZWRcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYmFja1wiOlxuXHRcdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0XHRoaXN0b3J5LmdvKC1vSGlzdG9yeUFjdGlvbi5zdGVwcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2stcmVwbGFjZVwiOlxuXHRcdFx0XHRcdHRoaXMuX2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpO1xuXHRcdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja1JlcGxhY2VBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Ly8gTm8gbmF2aWdhdGlvblxuXHRcdFx0XHRcdHRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZShmYWxzZSk7IC8vIG5vIG5hdmlnYXRpb24gLS0+IHJlc29sdmUgdG8gZmFsc2Vcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGdldExhc3RIaXN0b3J5RW50cnkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdH1cblxuXHRzZXRQYXRoTWFwcGluZyhtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHR0aGlzLl9wYXRoTWFwcGluZ3MgPSBtYXBwaW5ncy5maWx0ZXIoKG1hcHBpbmcpID0+IHtcblx0XHRcdHJldHVybiBtYXBwaW5nLm9sZFBhdGggIT09IG1hcHBpbmcubmV3UGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdGhhc2hHdWFyZCgpIHtcblx0XHRsZXQgc0hhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcblxuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwicmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX2JBcHBseVJlc3RvcmUgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nKSB7XG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgaGFzaCBuZWVkcyB0byBiZSBjaGFuZ2VkICh0aGlzIGhhcHBlbnMgaW4gRkNMIHdoZW4gc3dpdGNoaW5nIGIvdyBlZGl0IGFuZCByZWFkLW9ubHkgd2l0aCAzIGNvbHVtbnMgb3Blbilcblx0XHRcdGNvbnN0IG1hcHBpbmcgPSB0aGlzLl9wYXRoTWFwcGluZ3MuZmluZCgobSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gc0hhc2guaW5kZXhPZihtLm9sZFBhdGgpID49IDA7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChtYXBwaW5nKSB7XG5cdFx0XHRcdC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgaGFzaFxuXHRcdFx0XHRzSGFzaCA9IHNIYXNoLnJlcGxhY2UobWFwcGluZy5vbGRQYXRoLCBtYXBwaW5nLm5ld1BhdGgpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIiwgc0hhc2gpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYUhhc2hTcGxpdCA9IHNIYXNoLnNwbGl0KFwiJi9cIik7XG5cdFx0XHRcdGNvbnN0IHNBcHBIYXNoID0gYUhhc2hTcGxpdFsxXSA/IGFIYXNoU3BsaXRbMV0gOiBcIlwiO1xuXHRcdFx0XHRpZiAodGhpcy5jaGVja0hhc2hXaXRoR3VhcmQoc0FwcEhhc2gpKSB7XG5cdFx0XHRcdFx0dGhpcy5fYkRlbGF5ZWRSZWJ1aWxkID0gdHJ1ZTtcblx0XHRcdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQXBwSGFzaCk7XG5cdFx0XHRcdFx0dGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcblxuXHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5fYkRlbGF5ZWRSZWJ1aWxkID0gZmFsc2U7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29tcGFyZXMgMiBzdGF0ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU3RhdGUxXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU3RhdGUyXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb246XG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5FUVVBTCBpZiBvU3RhdGUxIGFuZCBvU3RhdGUyIGFyZSBlcXVhbFxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuQ09NUEFUSUJMRSBpZiBvU3RhdGUxIGFuZCBvU3RhdGUyIGFyZSBjb21wYXRpYmxlXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5BTkNFU1RPUiBpZiBvU3RhdGUxIGlzIGFuIGFuY2VzdG9yIG9mIG9TdGF0ZTJcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkRJRkZFUkVOVCBpZiB0aGUgMiBzdGF0ZXMgYXJlIGRpZmZlcmVudFxuXHQgKi9cblxuXHRfY29tcGFyZUNhY2hlU3RhdGVzKG9TdGF0ZTE6IGFueSwgb1N0YXRlMjogYW55KSB7XG5cdFx0Ly8gRmlyc3QgY29tcGFyZSBvYmplY3Qga2V5c1xuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoID4gb1N0YXRlMi5rZXlzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXHRcdGxldCBlcXVhbCA9IHRydWU7XG5cdFx0bGV0IGluZGV4O1xuXHRcdGZvciAoaW5kZXggPSAwOyBlcXVhbCAmJiBpbmRleCA8IG9TdGF0ZTEua2V5cy5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdGlmIChvU3RhdGUxLmtleXNbaW5kZXhdICE9PSBvU3RhdGUyLmtleXNbaW5kZXhdKSB7XG5cdFx0XHRcdGVxdWFsID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghZXF1YWwpIHtcblx0XHRcdC8vIFNvbWUgb2JqZWN0cyBrZXlzIGFyZSBkaWZmZXJlbnRcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBrZXlzIGZyb20gb1N0YXRlMSBhcmUgaW4gb1N0YXRlMiAtLT4gY2hlY2sgaWYgYW5jZXN0b3Jcblx0XHRpZiAob1N0YXRlMS5rZXlzLmxlbmd0aCA8IG9TdGF0ZTIua2V5cy5sZW5ndGggfHwgb1N0YXRlMS5zY3JlZW5Nb2RlIDwgb1N0YXRlMi5zY3JlZW5Nb2RlKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkFOQ0VTVE9SO1xuXHRcdH1cblx0XHRpZiAob1N0YXRlMS5zY3JlZW5Nb2RlID4gb1N0YXRlMi5zY3JlZW5Nb2RlKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDsgLy8gTm90IHN1cmUgdGhpcyBjYXNlIGNhbiBoYXBwZW4uLi5cblx0XHR9XG5cblx0XHQvLyBBdCB0aGlzIHN0YWdlLCB0aGUgMiBzdGF0ZXMgaGF2ZSB0aGUgc2FtZSBvYmplY3Qga2V5cyAoaW4gdGhlIHNhbWUgb3JkZXIpIGFuZCBzYW1lIHNjcmVlbm1vZGVcblx0XHQvLyBUaGV5IGNhbiBiZSBlaXRoZXIgY29tcGF0aWJsZSBvciBlcXVhbFxuXHRcdHJldHVybiBvU3RhdGUxLnNMYXlvdXQgPT09IG9TdGF0ZTIuc0xheW91dCA/IGVudW1TdGF0ZS5FUVVBTCA6IGVudW1TdGF0ZS5DT01QQVRJQkxFO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBiYWNrIGV4aXRzIHRoZSBwcmVzZW50IGd1YXJkIHNldC5cblx0ICpcblx0ICogQHBhcmFtIHNQcmVzZW50SGFzaCBUaGUgY3VycmVudCBoYXNoLiBPbmx5IHVzZWQgZm9yIHVuaXQgdGVzdHMuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBiYWNrIGV4aXRzIHRoZXJlIGlzIGEgZ3VhcmQgZXhpdCBvbiBiYWNrXG5cdCAqL1xuXHRjaGVja0lmQmFja0lzT3V0T2ZHdWFyZChzUHJlc2VudEhhc2g/OiBzdHJpbmcpIHtcblx0XHRsZXQgc1ByZXZIYXNoO1xuXHRcdGxldCBzQ3VycmVudEhhc2g6IHN0cmluZztcblx0XHRpZiAoc1ByZXNlbnRIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFdlIHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBpbnN0ZWFkIG9mIEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpIGJlY2F1c2UgdGhlIGxhdHRlclxuXHRcdFx0Ly8gcmVwbGFjZXMgY2hhcmFjdGVycyBpbiB0aGUgVVJMIChlLmcuICUyNCByZXBsYWNlZCBieSAkKSBhbmQgaXQgY2F1c2VzIGlzc3VlcyB3aGVuIGNvbXBhcmluZ1xuXHRcdFx0Ly8gd2l0aCB0aGUgVVJMcyBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0XHRjb25zdCBvU3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXMuc3BsaXRIYXNoKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSBhcyBhbnk7XG5cdFx0XHRpZiAob1NwbGl0SGFzaCAmJiBvU3BsaXRIYXNoLmFwcFNwZWNpZmljUm91dGUpIHtcblx0XHRcdFx0c0N1cnJlbnRIYXNoID0gb1NwbGl0SGFzaC5hcHBTcGVjaWZpY1JvdXRlO1xuXHRcdFx0XHRpZiAoc0N1cnJlbnRIYXNoLmluZGV4T2YoXCImL1wiKSA9PT0gMCkge1xuXHRcdFx0XHRcdHNDdXJyZW50SGFzaCA9IHNDdXJyZW50SGFzaC5zdWJzdHJpbmcoMik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNDdXJyZW50SGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKTsgLy8gVG8gcmVtb3ZlIHRoZSAnIydcblx0XHRcdFx0aWYgKHNDdXJyZW50SGFzaFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdFx0XHRzQ3VycmVudEhhc2ggPSBzQ3VycmVudEhhc2guc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNDdXJyZW50SGFzaCA9IHNQcmVzZW50SGFzaDtcblx0XHR9XG5cdFx0c1ByZXNlbnRIYXNoID0gVVJJLmRlY29kZShzQ3VycmVudEhhc2gpO1xuXHRcdGlmICh0aGlzLl9vTmF2aWdhdGlvbkd1YXJkKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcblx0XHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzUHJlc2VudEhhc2gpIHtcblx0XHRcdFx0XHRzUHJldkhhc2ggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaSAtIDFdLmhhc2g7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICFzUHJldkhhc2ggfHwgIXRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNQcmV2SGFzaCk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGxhc3QgMiBlbnRyaWVzIGluIHRoZSBoaXN0b3J5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqL1xuXHRjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCkge1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIDwgMikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9DdXJyZW50U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHRcdGNvbnN0IG9QcmV2aW91c1N0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAyXTtcblxuXHRcdHJldHVybiBvQ3VycmVudFN0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdID09PSBvUHJldmlvdXNTdGF0ZS5oYXNoLnNwbGl0KFwiP1wiKVswXTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJQcm94eTtcbiJdfQ==