@sapui5/sap.fe.macros 1.141.2 → 1.143.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Breadcrumbs.js +4 -10
  4. package/src/sap/fe/macros/Breadcrumbs.tsx +2 -8
  5. package/src/sap/fe/macros/Chart.js +34 -23
  6. package/src/sap/fe/macros/Chart.tsx +25 -11
  7. package/src/sap/fe/macros/CollaborativeDraftHandler.js +47 -36
  8. package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +50 -31
  9. package/src/sap/fe/macros/CollectionBindingInfo.js +8 -2
  10. package/src/sap/fe/macros/CollectionBindingInfo.ts +11 -6
  11. package/src/sap/fe/macros/CommonHelper.js +14 -24
  12. package/src/sap/fe/macros/CommonHelper.ts +18 -25
  13. package/src/sap/fe/macros/ConditionalSwitch.js +1 -2
  14. package/src/sap/fe/macros/ConditionalSwitch.tsx +0 -1
  15. package/src/sap/fe/macros/ConditionalSwitchProperty.js +1 -3
  16. package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +0 -2
  17. package/src/sap/fe/macros/Field.js +34 -17
  18. package/src/sap/fe/macros/Field.ts +64 -32
  19. package/src/sap/fe/macros/FooterContent.js +7 -3
  20. package/src/sap/fe/macros/FooterContent.tsx +8 -13
  21. package/src/sap/fe/macros/KPITag.js +6 -6
  22. package/src/sap/fe/macros/KPITag.tsx +8 -6
  23. package/src/sap/fe/macros/MacroAPI.js +4 -3
  24. package/src/sap/fe/macros/MacroAPI.ts +3 -3
  25. package/src/sap/fe/macros/MessageButton.js +4 -3
  26. package/src/sap/fe/macros/MessageButton.tsx +7 -3
  27. package/src/sap/fe/macros/MicroChart.js +12 -7
  28. package/src/sap/fe/macros/MicroChart.tsx +9 -3
  29. package/src/sap/fe/macros/MultiValueField.js +22 -36
  30. package/src/sap/fe/macros/MultiValueField.tsx +34 -66
  31. package/src/sap/fe/macros/RichTextEditor.js +3 -4
  32. package/src/sap/fe/macros/RichTextEditor.tsx +2 -3
  33. package/src/sap/fe/macros/Share.js +7 -7
  34. package/src/sap/fe/macros/Share.tsx +9 -6
  35. package/src/sap/fe/macros/Status.js +39 -11
  36. package/src/sap/fe/macros/Status.tsx +25 -5
  37. package/src/sap/fe/macros/ValueHelp.js +5 -2
  38. package/src/sap/fe/macros/ValueHelp.tsx +5 -0
  39. package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
  40. package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
  41. package/src/sap/fe/macros/ai/EasyFilterBar.js +7 -34
  42. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +6 -35
  43. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +31 -7
  44. package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +33 -6
  45. package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
  46. package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
  47. package/src/sap/fe/macros/chart/Action.js +25 -2
  48. package/src/sap/fe/macros/chart/Action.ts +13 -0
  49. package/src/sap/fe/macros/chart/ActionGroup.js +25 -2
  50. package/src/sap/fe/macros/chart/ActionGroup.ts +13 -0
  51. package/src/sap/fe/macros/chart/ChartDelegate.js +29 -8
  52. package/src/sap/fe/macros/chart/ChartDelegate.ts +46 -14
  53. package/src/sap/fe/macros/chart/MdcChartTemplate.js +58 -12
  54. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +75 -13
  55. package/src/sap/fe/macros/chart/OverflowGroup.js +62 -0
  56. package/src/sap/fe/macros/chart/OverflowGroup.ts +22 -0
  57. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +7 -7
  58. package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +3 -2
  59. package/src/sap/fe/macros/controls/FileWrapper.js +11 -5
  60. package/src/sap/fe/macros/controls/FileWrapper.ts +10 -4
  61. package/src/sap/fe/macros/controls/FilterBar.js +39 -3
  62. package/src/sap/fe/macros/controls/FilterBar.ts +42 -1
  63. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +3 -1
  64. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -0
  65. package/src/sap/fe/macros/controls/RadioButtons.js +18 -5
  66. package/src/sap/fe/macros/controls/RadioButtons.tsx +10 -1
  67. package/src/sap/fe/macros/coreUI/CreateDialog.js +3 -3
  68. package/src/sap/fe/macros/coreUI/CreateDialog.tsx +2 -2
  69. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +40 -12
  70. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -9
  71. package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +4 -2
  72. package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +3 -1
  73. package/src/sap/fe/macros/field/FieldFormatOptions.js +4 -4
  74. package/src/sap/fe/macros/field/FieldFormatOptions.ts +2 -2
  75. package/src/sap/fe/macros/field/FieldHelper.js +4 -3
  76. package/src/sap/fe/macros/field/FieldHelper.ts +7 -1
  77. package/src/sap/fe/macros/field/FieldRuntime.js +44 -9
  78. package/src/sap/fe/macros/field/FieldRuntime.ts +72 -8
  79. package/src/sap/fe/macros/field/FieldRuntimeHelper.js +3 -34
  80. package/src/sap/fe/macros/field/FieldRuntimeHelper.ts +28 -53
  81. package/src/sap/fe/macros/field/FieldTemplating.js +5 -4
  82. package/src/sap/fe/macros/field/FieldTemplating.ts +6 -4
  83. package/src/sap/fe/macros/filter/FilterFieldHelper.js +6 -4
  84. package/src/sap/fe/macros/filter/FilterFieldHelper.ts +7 -2
  85. package/src/sap/fe/macros/filter/FilterUtils.js +130 -40
  86. package/src/sap/fe/macros/filter/FilterUtils.ts +167 -45
  87. package/src/sap/fe/macros/filterBar/ExtendedSemanticDateOperators.js +2 -2
  88. package/src/sap/fe/macros/filterBar/ExtendedSemanticDateOperators.ts +1 -1
  89. package/src/sap/fe/macros/filterBar/FilterBar.block.js +4 -3
  90. package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +19 -8
  91. package/src/sap/fe/macros/filterBar/FilterBarAPI.js +15 -9
  92. package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +36 -17
  93. package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +21 -10
  94. package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +81 -63
  95. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.js +376 -0
  96. package/src/sap/fe/macros/filterBar/UOMValidationDelegate.ts +463 -0
  97. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +4 -3
  98. package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +3 -2
  99. package/src/sap/fe/macros/form/Form.block.js +27 -2
  100. package/src/sap/fe/macros/form/Form.block.ts +31 -11
  101. package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -3
  102. package/src/sap/fe/macros/form/FormContainer.block.js +110 -63
  103. package/src/sap/fe/macros/form/FormContainer.block.ts +121 -64
  104. package/src/sap/fe/macros/formatters/TableFormatter.js +13 -10
  105. package/src/sap/fe/macros/formatters/TableFormatter.ts +11 -9
  106. package/src/sap/fe/macros/formatters/VisualFilterFormatter.js +6 -4
  107. package/src/sap/fe/macros/formatters/VisualFilterFormatter.ts +5 -5
  108. package/src/sap/fe/macros/inlineEdit/InlineEdit.js +5 -5
  109. package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +4 -4
  110. package/src/sap/fe/macros/insights/InsightsService.js +3 -2
  111. package/src/sap/fe/macros/insights/InsightsService.ts +2 -1
  112. package/src/sap/fe/macros/internal/DataPoint.js +7 -8
  113. package/src/sap/fe/macros/internal/DataPoint.tsx +6 -9
  114. package/src/sap/fe/macros/internal/field/DisplayStyle.js +8 -6
  115. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +7 -8
  116. package/src/sap/fe/macros/internal/field/EditStyle.js +9 -20
  117. package/src/sap/fe/macros/internal/field/EditStyle.tsx +17 -41
  118. package/src/sap/fe/macros/internal/field/FieldBlockStructure.js +2 -2
  119. package/src/sap/fe/macros/internal/field/FieldBlockStructure.tsx +1 -1
  120. package/src/sap/fe/macros/internal/field/FieldStructure.js +1 -2
  121. package/src/sap/fe/macros/internal/field/FieldStructure.tsx +0 -2
  122. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +7 -7
  123. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +17 -11
  124. package/src/sap/fe/macros/internal/helpers/DataPointTemplating.js +6 -2
  125. package/src/sap/fe/macros/internal/helpers/DataPointTemplating.ts +5 -1
  126. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.js +9 -6
  127. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.ts +7 -5
  128. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +4 -4
  129. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +6 -6
  130. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +5 -2
  131. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +2 -2
  132. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +2 -1
  133. package/src/sap/fe/macros/library.js +5 -6
  134. package/src/sap/fe/macros/{library.ts → library.tsx} +3 -1
  135. package/src/sap/fe/macros/mdc/adapter/StateHelper.js +15 -5
  136. package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +21 -5
  137. package/src/sap/fe/macros/messagebundle.properties +13 -5
  138. package/src/sap/fe/macros/messagebundle_ar.properties +12 -3
  139. package/src/sap/fe/macros/messagebundle_bg.properties +13 -4
  140. package/src/sap/fe/macros/messagebundle_ca.properties +12 -3
  141. package/src/sap/fe/macros/messagebundle_cnr.properties +12 -3
  142. package/src/sap/fe/macros/messagebundle_cs.properties +11 -2
  143. package/src/sap/fe/macros/messagebundle_cy.properties +12 -3
  144. package/src/sap/fe/macros/messagebundle_da.properties +12 -3
  145. package/src/sap/fe/macros/messagebundle_de.properties +16 -7
  146. package/src/sap/fe/macros/messagebundle_el.properties +13 -4
  147. package/src/sap/fe/macros/messagebundle_en.properties +13 -4
  148. package/src/sap/fe/macros/messagebundle_en_GB.properties +13 -4
  149. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +13 -4
  150. package/src/sap/fe/macros/messagebundle_es.properties +12 -3
  151. package/src/sap/fe/macros/messagebundle_es_MX.properties +12 -3
  152. package/src/sap/fe/macros/messagebundle_et.properties +12 -3
  153. package/src/sap/fe/macros/messagebundle_fi.properties +12 -3
  154. package/src/sap/fe/macros/messagebundle_fr.properties +12 -3
  155. package/src/sap/fe/macros/messagebundle_fr_CA.properties +12 -3
  156. package/src/sap/fe/macros/messagebundle_hi.properties +12 -3
  157. package/src/sap/fe/macros/messagebundle_hr.properties +13 -4
  158. package/src/sap/fe/macros/messagebundle_hu.properties +12 -3
  159. package/src/sap/fe/macros/messagebundle_id.properties +18 -9
  160. package/src/sap/fe/macros/messagebundle_it.properties +12 -3
  161. package/src/sap/fe/macros/messagebundle_iw.properties +12 -3
  162. package/src/sap/fe/macros/messagebundle_ja.properties +12 -3
  163. package/src/sap/fe/macros/messagebundle_kk.properties +11 -2
  164. package/src/sap/fe/macros/messagebundle_ko.properties +13 -4
  165. package/src/sap/fe/macros/messagebundle_lt.properties +12 -3
  166. package/src/sap/fe/macros/messagebundle_lv.properties +12 -3
  167. package/src/sap/fe/macros/messagebundle_mk.properties +12 -3
  168. package/src/sap/fe/macros/messagebundle_ms.properties +12 -3
  169. package/src/sap/fe/macros/messagebundle_nl.properties +12 -3
  170. package/src/sap/fe/macros/messagebundle_no.properties +12 -3
  171. package/src/sap/fe/macros/messagebundle_pl.properties +12 -3
  172. package/src/sap/fe/macros/messagebundle_pt.properties +12 -3
  173. package/src/sap/fe/macros/messagebundle_pt_PT.properties +12 -3
  174. package/src/sap/fe/macros/messagebundle_ro.properties +13 -4
  175. package/src/sap/fe/macros/messagebundle_ru.properties +12 -3
  176. package/src/sap/fe/macros/messagebundle_sh.properties +12 -3
  177. package/src/sap/fe/macros/messagebundle_sk.properties +12 -3
  178. package/src/sap/fe/macros/messagebundle_sl.properties +13 -4
  179. package/src/sap/fe/macros/messagebundle_sr.properties +12 -3
  180. package/src/sap/fe/macros/messagebundle_sv.properties +12 -3
  181. package/src/sap/fe/macros/messagebundle_th.properties +11 -2
  182. package/src/sap/fe/macros/messagebundle_tr.properties +12 -3
  183. package/src/sap/fe/macros/messagebundle_uk.properties +12 -3
  184. package/src/sap/fe/macros/messagebundle_vi.properties +13 -4
  185. package/src/sap/fe/macros/messagebundle_zh_CN.properties +12 -3
  186. package/src/sap/fe/macros/messagebundle_zh_TW.properties +12 -3
  187. package/src/sap/fe/macros/messages/MessageButton.js +21 -12
  188. package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
  189. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +7 -3
  190. package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +8 -2
  191. package/src/sap/fe/macros/quickView/QuickView.js +5 -4
  192. package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
  193. package/src/sap/fe/macros/richtexteditor/ButtonGroup.js +2 -2
  194. package/src/sap/fe/macros/richtexteditor/ButtonGroup.ts +2 -2
  195. package/src/sap/fe/macros/table/Action.js +21 -5
  196. package/src/sap/fe/macros/table/Action.ts +14 -4
  197. package/src/sap/fe/macros/table/ActionGroup.js +15 -2
  198. package/src/sap/fe/macros/table/ActionGroup.ts +8 -0
  199. package/src/sap/fe/macros/table/ActionGroupOverride.js +14 -2
  200. package/src/sap/fe/macros/table/ActionGroupOverride.ts +7 -0
  201. package/src/sap/fe/macros/table/ActionOverride.js +14 -2
  202. package/src/sap/fe/macros/table/ActionOverride.ts +7 -0
  203. package/src/sap/fe/macros/table/ActionsTemplating.js +16 -2
  204. package/src/sap/fe/macros/table/ActionsTemplating.tsx +15 -0
  205. package/src/sap/fe/macros/table/Column.js +3 -2
  206. package/src/sap/fe/macros/table/Column.ts +1 -1
  207. package/src/sap/fe/macros/table/MdcTableTemplate.js +96 -18
  208. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +136 -17
  209. package/src/sap/fe/macros/table/OverflowGroups.js +59 -0
  210. package/src/sap/fe/macros/table/OverflowGroups.ts +27 -0
  211. package/src/sap/fe/macros/table/Table.block.js +74 -30
  212. package/src/sap/fe/macros/table/Table.block.tsx +77 -14
  213. package/src/sap/fe/macros/table/TableAPI.js +175 -132
  214. package/src/sap/fe/macros/table/TableAPI.ts +67 -30
  215. package/src/sap/fe/macros/table/TableDefinition.js +20 -3
  216. package/src/sap/fe/macros/table/TableDefinition.ts +18 -2
  217. package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -3
  218. package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +12 -9
  219. package/src/sap/fe/macros/table/TableHelper.js +5 -2
  220. package/src/sap/fe/macros/table/TableHelper.ts +5 -2
  221. package/src/sap/fe/macros/table/TableRuntime.js +25 -13
  222. package/src/sap/fe/macros/table/TableRuntime.ts +31 -17
  223. package/src/sap/fe/macros/table/TableSizeHelper.js +4 -4
  224. package/src/sap/fe/macros/table/TableSizeHelper.ts +6 -11
  225. package/src/sap/fe/macros/table/Utils.js +9 -3
  226. package/src/sap/fe/macros/table/Utils.ts +14 -8
  227. package/src/sap/fe/macros/table/delegates/TableDelegate.js +72 -29
  228. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +114 -123
  229. package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
  230. package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
  231. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +15 -6
  232. package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +14 -5
  233. package/src/sap/fe/macros/table/massEdit/MassEditField.js +1 -1
  234. package/src/sap/fe/macros/table/massEdit/MassEditField.tsx +3 -6
  235. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -3
  236. package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +3 -2
  237. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +42 -14
  238. package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +49 -19
  239. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.js +7 -9
  240. package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.ts +7 -8
  241. package/src/sap/fe/macros/table/mixin/TableExport.js +1 -1
  242. package/src/sap/fe/macros/table/mixin/TableExport.ts +3 -3
  243. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +3 -4
  244. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +2 -3
  245. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.js +5 -4
  246. package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.ts +6 -3
  247. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +17 -10
  248. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +24 -9
  249. package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.js +4 -4
  250. package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.ts +3 -3
  251. package/src/sap/fe/macros/visualfilters/VisualFilter.js +20 -2
  252. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +28 -6
  253. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +6 -3
  254. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +4 -3
  255. package/src/sap/fe/macros/visualfilters/fragments/InteractiveCharts.js +3 -3
  256. package/src/sap/fe/macros/visualfilters/fragments/InteractiveCharts.tsx +10 -4
  257. package/src/sap/fe/macros/visualfilters/fragments/InteractiveDonutChart.fragment.xml +1 -1
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/CommonUtils", "sap/fe/core/TemplateModel", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/converters/controls/ListReport/FilterBar", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/MetaModelFunction", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/PropertyFormatters", "sap/fe/core/type/EDM", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/field/FieldHelper", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/internal/valuehelp/ValueHelpTemplating", "sap/fe/macros/mdc/adapter/StateHelper", "sap/ui/mdc/FilterBarDelegate", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/model/json/JSONModel"], function (Log, mergeObjects, jsx, CommonUtils, TemplateModel, MetaModelConverter, FilterBar, Key, MetaModelFunction, ModelHelper, ResourceModelHelper, StableIdHelper, PropertyFormatters, EDM, CommonHelper, DelegateUtil, FieldHelper, FilterUtils, ValueHelpTemplating, StateHelper, FilterBarDelegate, TypeMap, JSONModel) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/CommonUtils", "sap/fe/core/TemplateModel", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/converters/controls/Common/filter/FilterRestrictions", "sap/fe/core/converters/controls/ListReport/FilterBar", "sap/fe/core/converters/helpers/Key", "sap/fe/core/helpers/MetaModelFunction", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/PropertyFormatters", "sap/fe/core/type/EDM", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/field/FieldHelper", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/filterBar/UOMValidationDelegate", "sap/fe/macros/internal/valuehelp/ValueHelpTemplating", "sap/fe/macros/mdc/adapter/StateHelper", "sap/ui/mdc/FilterBarDelegate", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/model/json/JSONModel"], function (Log, mergeObjects, jsx, CommonUtils, TemplateModel, MetaModelConverter, FilterRestrictions, FilterBar, Key, MetaModelFunction, ModelHelper, ResourceModelHelper, StableIdHelper, PropertyFormatters, EDM, CommonHelper, DelegateUtil, FieldHelper, FilterUtils, UOMValidationDelegate, ValueHelpTemplating, StateHelper, FilterBarDelegate, TypeMap, JSONModel) {
6
6
  "use strict";
7
7
 
8
8
  var getValueHelpTemplate = ValueHelpTemplating.getValueHelpTemplate;
@@ -16,7 +16,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/j
16
16
  var sortPropertyInfosByGroupLabel = FilterBar.sortPropertyInfosByGroupLabel;
17
17
  var processSelectionFields = FilterBar.processSelectionFields;
18
18
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
19
- const ODataFilterBarDelegate = Object.assign({}, FilterBarDelegate);
19
+ const ODataFilterBarDelegate = Object.assign({}, FilterBarDelegate, UOMValidationDelegate);
20
20
  ODataFilterBarDelegate.apiVersion = 2;
21
21
  const EDIT_STATE_PROPERTY_NAME = "$editState",
22
22
  SEARCH_PROPERTY_NAME = "$search",
@@ -235,8 +235,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/j
235
235
  }
236
236
  const delegate = await mPropertyBag.modifier.getProperty(oParentControl, "delegate");
237
237
  const aPropertyInfo = await mPropertyBag.modifier.getProperty(oParentControl, "propertyInfo");
238
+ const propertyInfoExists = await FilterUtils._checkIfPropertyInfoExists(oParentControl, mPropertyBag.modifier, sPropertyInfoName);
238
239
  //We do not get propertyInfo in case of table filters
239
- if (aPropertyInfo) {
240
+ if (aPropertyInfo && !propertyInfoExists) {
240
241
  const hasPropertyInfo = aPropertyInfo.some(function (prop) {
241
242
  return prop.key === sPropertyInfoKey || prop.name === sPropertyInfoKey;
242
243
  });
@@ -274,12 +275,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/j
274
275
  propertyBag.modifier.setProperty(parentControl, "propertyInfo", _propertyInfo);
275
276
  }
276
277
  /**
277
- * Method responsible for creating filter field in standalone mode / in the personalization settings of the filter bar.
278
+ * Method responsible for creating the filter field in standalone mode and in the personalization settings of the filter bar.
278
279
  * @param oParentControl Parent control instance to which the filter field is added
279
280
  * @param sPropertyInfoName Name of the property being added as the filter field
280
281
  * @param mPropertyBag Instance of the property bag from Flex API
281
282
  * @param mPropertyBag.appComponent AppComponent
282
283
  * @param mPropertyBag.modifier Modifier from Flex API
284
+ * @param mPropertyBag.view Instance of the view
283
285
  * @returns Once resolved, a filter field definition is returned
284
286
  */
285
287
  ODataFilterBarDelegate.addItem = async function (oParentControl, sPropertyInfoName, mPropertyBag) {
@@ -294,7 +296,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/j
294
296
  return Promise.resolve(null);
295
297
  }
296
298
  const isXML = modifier && modifier.targets === "xmlTree";
297
- if (isXML) {
299
+ const propertyInfoExists = isXML ? await FilterUtils._checkIfPropertyInfoExists(oParentControl, modifier, sPropertyInfoName) : true;
300
+ if (isXML && !propertyInfoExists) {
298
301
  await _addPropertyInfo(oParentControl, mPropertyBag, oMetaModel, sPropertyInfoName);
299
302
  }
300
303
  return ODataFilterBarDelegate._addFlexItem(sPropertyInfoName, oParentControl, oMetaModel, modifier, mPropertyBag.appComponent, mPropertyBag.view);
@@ -441,7 +444,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/j
441
444
  aFetchedProperties = aFetchedProperties.filter(function (oProp) {
442
445
  return processedFieldsKeys.includes(oProp.key);
443
446
  });
444
- const oFR = CommonUtils.getFilterRestrictionsByPath(sEntitySetPath, oMetaModel),
447
+ const dataModel = getInvolvedDataModelObjects(oMetaModel.getContext(sEntitySetPath));
448
+ const oFR = FilterRestrictions.getFilterRestrictionsByDataModel(dataModel),
445
449
  mAllowedExpressions = oFR.FilterAllowedExpressions;
446
450
  //Object.keys(processedFields).forEach(function (sFilterFieldKey: string) {
447
451
  processedFields.forEach(function (oProp, iFilterFieldIndex) {
@@ -565,12 +569,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/j
565
569
  });
566
570
  };
567
571
  ODataFilterBarDelegate._addFlexItem = async function (sFlexPropertyName, oParentControl, oMetaModel, oModifier, oAppComponent, view) {
572
+ let propertyInfosFromFilterBar = [];
573
+ const bIsXML = !!oModifier && oModifier.targets === "xmlTree";
574
+ if (bIsXML) {
575
+ const customDataValue = await DelegateUtil.getCustomDataWithModifier(oParentControl, "feFilterInfo", oModifier);
576
+ if (customDataValue) {
577
+ propertyInfosFromFilterBar = JSON.parse(customDataValue); // retrieve pre-fetched filter info from custom data, required during templating
578
+ }
579
+ }
568
580
  const sFilterBarId = oModifier ? oModifier.getId(oParentControl) : oParentControl.getId(),
569
581
  sIdPrefix = oModifier ? "" : "Adaptation",
570
- aSelectionFields = FilterUtils.getConvertedFilterFields(oParentControl, undefined, undefined, oMetaModel, oAppComponent, oModifier, oModifier ? undefined : getLineItemQualifierFromTable(oParentControl.getParent(), oMetaModel)),
582
+ aSelectionFields = FilterUtils.getConvertedFilterFields(oParentControl, undefined, undefined, oMetaModel, oAppComponent, oModifier, oModifier ? undefined : getLineItemQualifierFromTable(oParentControl.getParent(), oMetaModel), propertyInfosFromFilterBar),
571
583
  oSelectionField = ODataFilterBarDelegate._findSelectionField(aSelectionFields, sFlexPropertyName),
572
- sPropertyPath = _getPropertyPath(sFlexPropertyName),
573
- bIsXML = !!oModifier && oModifier.targets === "xmlTree";
584
+ sPropertyPath = _getPropertyPath(sFlexPropertyName);
574
585
  if (sFlexPropertyName === EDIT_STATE_PROPERTY_NAME) {
575
586
  return _templateEditState(_generateIdPrefix(sFilterBarId, `${sIdPrefix}FilterField`), oMetaModel, oModifier);
576
587
  } else if (sFlexPropertyName === SEARCH_PROPERTY_NAME) {
@@ -715,4 +726,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/jsx-runtime/j
715
726
  };
716
727
  return ODataFilterBarDelegate;
717
728
  }, false);
718
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPRGF0YUZpbHRlckJhckRlbGVnYXRlIiwiT2JqZWN0IiwiYXNzaWduIiwiRmlsdGVyQmFyRGVsZWdhdGUiLCJhcGlWZXJzaW9uIiwiRURJVF9TVEFURV9QUk9QRVJUWV9OQU1FIiwiU0VBUkNIX1BST1BFUlRZX05BTUUiLCJWQUxVRV9IRUxQX1RZUEUiLCJGRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVkiLCJfdGVtcGxhdGVFZGl0U3RhdGUiLCJzSWRQcmVmaXgiLCJtZXRhTW9kZWwiLCJvTW9kaWZpZXIiLCJvVGhpcyIsIkpTT05Nb2RlbCIsImlkIiwiaXNEcmFmdENvbGxhYm9yYXRpdmUiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwiYmluZGluZ0NvbnRleHRzIiwidGhpcyIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwiRGVsZWdhdGVVdGlsIiwidGVtcGxhdGVDb250cm9sRnJhZ21lbnQiLCJ1bmRlZmluZWQiLCJmaW5hbGx5IiwiZGVzdHJveSIsIl90ZW1wbGF0ZUN1c3RvbUZpbHRlciIsIm9GaWx0ZXJCYXIiLCJvU2VsZWN0aW9uRmllbGRJbmZvIiwib01ldGFNb2RlbCIsInNFbnRpdHlUeXBlUGF0aCIsImdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXIiLCJhbm5vdGF0aW9uUGF0aCIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwiZGF0YU1vZGVsUGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImRvY3VtZW50UmVmVGV4dCIsInRhcmdldE9iamVjdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRG9jdW1lbnRhdGlvblJlZiIsInRvU3RyaW5nIiwib0l0ZW1Nb2RlbCIsIlRlbXBsYXRlTW9kZWwiLCJjb250ZXh0UGF0aCIsIml0ZW0iLCJvVmlldyIsIkNvbW1vblV0aWxzIiwiZ2V0VGFyZ2V0VmlldyIsIm9Db250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsIm9PcHRpb25zIiwiY29udHJvbGxlciIsInZpZXciLCJfZ2V0UHJvcGVydHlQYXRoIiwic0NvbmRpdGlvblBhdGgiLCJGaWx0ZXJVdGlscyIsImdldFByb3BlcnR5UGF0aEZyb21Db25kaXRpb25QYXRoIiwiX2ZpbmRTZWxlY3Rpb25GaWVsZCIsImFTZWxlY3Rpb25GaWVsZHMiLCJzRmxleE5hbWUiLCJmaW5kIiwib1NlbGVjdGlvbkZpZWxkIiwiY29uZGl0aW9uUGF0aCIsInJlcGxhY2VBbGwiLCJhdmFpbGFiaWxpdHkiLCJfZ2VuZXJhdGVJZFByZWZpeCIsInNGaWx0ZXJCYXJJZCIsInNDb250cm9sVHlwZSIsInNOYXZpZ2F0aW9uUHJlZml4IiwiZ2VuZXJhdGUiLCJfdGVtcGxhdGVWYWx1ZUhlbHAiLCJvU2V0dGluZ3MiLCJvUGFyYW1ldGVycyIsImlkUHJlZml4Iiwic1ZoSWRQcmVmaXgiLCJjb25kaXRpb25Nb2RlbCIsIm5hdmlnYXRpb25QcmVmaXgiLCJmaWx0ZXJGaWVsZFZhbHVlSGVscCIsInVzZVNlbWFudGljRGF0ZVJhbmdlIiwiYlVzZVNlbWFudGljRGF0ZVJhbmdlIiwibWV0YVBhdGgiLCJ1c2VNdWx0aVZhbHVlRmllbGQiLCJyZXF1aXJlc1ZhbGlkYXRpb24iLCJjb2xsYWJvcmF0aW9uRW5hYmxlZCIsInJlcXVlc3RHcm91cElkIiwianNvbk1vZGVsIiwibWVyZ2VPYmplY3RzIiwidGFyZ2V0UGF0aCIsIkZpZWxkSGVscGVyIiwidmFsdWVIZWxwUHJvcGVydHlGb3JGaWx0ZXJGaWVsZCIsImlzWE1MIiwidmFsdWVIZWxwWE1MU3RyaW5nIiwianN4IiwicmVuZGVyQXNYTUwiLCJnZXRWYWx1ZUhlbHBUZW1wbGF0ZSIsImdldE1vZGVsIiwidmFsdWVIZWxwWE1MIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiUHJvbWlzZSIsInJlc29sdmUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInRoZW4iLCJhVkhFbGVtZW50cyIsInNBZ2dyZWdhdGlvbk5hbWUiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiZWx0IiwiaW5zZXJ0QWdncmVnYXRpb24iLCJvQ29udHJvbCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJ2YWx1ZUhlbHAiLCJfYWRkWE1MQ3VzdG9tRmlsdGVyRmllbGQiLCJzUHJvcGVydHlQYXRoIiwiYURlcGVuZGVudHMiLCJnZXRBZ2dyZWdhdGlvbiIsImkiLCJsZW5ndGgiLCJvRmlsdGVyRmllbGQiLCJpc0EiLCJzRGF0YVByb3BlcnR5IiwiZ2V0UHJvcGVydHlLZXkiLCJzRmlsdGVyRmllbGRJZCIsImdldElkIiwiaW5kZXhPZiIsIl90ZW1wbGF0ZUZpbHRlckZpZWxkIiwic0luRmlsdGVyQmFySWQiLCJwYWdlTW9kZWwiLCJ2aElkUHJlZml4IiwicHJvcGVydHlQYXRoIiwic1Byb3BlcnR5TmFtZSIsInNldHRpbmdzIiwidmlzdWFsRmlsdGVyIiwiZWRpdE1vZGUiLCJsYWJlbCIsIm9WaXN1YWxGaWx0ZXIiLCJjb252ZXJ0ZXJDb250ZXh0IiwiX2FkZFByb3BlcnR5SW5mbyIsIm9QYXJlbnRDb250cm9sIiwibVByb3BlcnR5QmFnIiwic1Byb3BlcnR5SW5mb05hbWUiLCJzUHJvcGVydHlJbmZvS2V5IiwiS2V5SGVscGVyIiwiZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aCIsInJlcGxhY2UiLCJtb2RpZmllciIsImRlbGVnYXRlIiwiZ2V0UHJvcGVydHkiLCJhUHJvcGVydHlJbmZvIiwiaGFzUHJvcGVydHlJbmZvIiwic29tZSIsInByb3AiLCJrZXkiLCJuYW1lIiwiZW50aXR5VHlwZVBhdGgiLCJwYXlsb2FkIiwiY3JlYXRlQ29udmVydGVyQ29udGV4dCIsImFwcENvbXBvbmVudCIsImVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlIiwiZmlsdGVyRmllbGQiLCJnZXRGaWx0ZXJGaWVsZCIsInByb3BlcnR5SW5mbyIsImJ1aWxkUHJvcGVyeUluZm8iLCJfdXBkYXRlUHJvcGVydHlJbmZvIiwiZXJyb3JNc2ciLCJ3YXJuaW5nIiwicHJvcGVydHlCYWciLCJwYXJlbnRDb250cm9sIiwicHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyIiwicHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyT2JqIiwiSlNPTiIsInBhcnNlIiwicHVzaCIsInN0cmluZ2lmeSIsImN1c3RvbURhdGFOb2RlIiwicmV0cmlldmVDdXN0b21EYXRhTm9kZSIsInNldEF0dHJpYnV0ZSIsIl9wcm9wZXJ0eUluZm8iLCJmb3JtYXRQcm9wZXJ0eUluZm8iLCJzZXRQcm9wZXJ0eSIsImFkZEl0ZW0iLCJfYWRkUDEzbkl0ZW0iLCJtb2RlbCIsImdldE1ldGFNb2RlbCIsInRhcmdldHMiLCJfYWRkRmxleEl0ZW0iLCJyZW1vdmVJdGVtIiwib0ZpbHRlckZpZWxkUHJvcGVydHkiLCJkb1JlbW92ZUl0ZW0iLCJmaWx0ZXJGaWVsZFByb3BlcnR5IiwiZGF0YSIsImFkZENvbmRpdGlvbiIsInJlbW92ZUNvbmRpdGlvbiIsInByb3BlcnR5SW5mb0Zyb21DRCIsImNsZWFyRmlsdGVycyIsIm9GaWx0ZXJDb250cm9sIiwiZmlsdGVyQmFyQVBJIiwiZ2V0UGFyZW50IiwiU3RhdGVIZWxwZXIiLCJjbGVhckZpbHRlclZhbHVlcyIsImZldGNoTW9kZWwiLCJvTW9kZWwiLCJmZXRjaFByb3BlcnRpZXNGb3JFbnRpdHkiLCJvRW50aXR5VHlwZSIsImdldE9iamVjdCIsImluY2x1ZGVIaWRkZW4iLCJvQ29udmVydGVyQ29udGV4dCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0RW50aXR5U2V0UGF0aCIsIm1GaWx0ZXJGaWVsZHMiLCJnZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMiLCJnZXRBcHBDb21wb25lbnQiLCJhRmV0Y2hlZFByb3BlcnRpZXMiLCJvRmlsdGVyRmllbGRJbmZvIiwic0Fubm90YXRpb25QYXRoIiwidGVtcGxhdGUiLCJvUHJvcGVydHlBbm5vdGF0aW9ucyIsImdldENvbnZlcnRlZFR5cGVzIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXQiLCJzVGFyZ2V0UHJvcGVydHlQcmVmaXgiLCJDb21tb25IZWxwZXIiLCJnZXRMb2NhdGlvbkZvclByb3BlcnR5UGF0aCIsInNQcm9wZXJ0eSIsInNlbGVjdGlvbkZpZWxkcyIsIlVJIiwiU2VsZWN0aW9uRmllbGRzIiwiZmlsdGVyRmFjZXRzIiwiRmlsdGVyRmFjZXRzIiwiX2lzRmlsdGVyQWRhcHRhYmxlIiwiaXNQcm9wZXJ0eUZpbHRlcmFibGUiLCJhUGFyYW1ldGVyRmllbGRzIiwicHJvY2Vzc2VkRmllbGRzIiwicHJvY2Vzc1NlbGVjdGlvbkZpZWxkcyIsInByb2Nlc3NlZEZpZWxkc0tleXMiLCJvUHJvcHMiLCJmaWx0ZXIiLCJvUHJvcCIsImluY2x1ZGVzIiwib0ZSIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zQnlQYXRoIiwibUFsbG93ZWRFeHByZXNzaW9ucyIsIkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyIsImlGaWx0ZXJGaWVsZEluZGV4Iiwib1NlbEZpZWxkIiwiZ3JvdXAiLCJncm91cExhYmVsIiwicGF0aCIsInRvb2x0aXAiLCJyZW1vdmVGcm9tQXBwU3RhdGUiLCJoYXNWYWx1ZUhlbHAiLCJvUHJvcGVydHkiLCJvUHJvcGVydHlDb250ZXh0IiwiYlJlbW92ZUZyb21BcHBTdGF0ZSIsIm9GaWx0ZXJEZWZhdWx0VmFsdWVBbm5vdGF0aW9uIiwib0ZpbHRlckRlZmF1bHRWYWx1ZSIsImdldE1vZGVsVHlwZSIsIiRUeXBlIiwiZGVmYXVsdEZpbHRlckNvbmRpdGlvbnMiLCJmaWVsZFBhdGgiLCJvcGVyYXRvciIsInZhbHVlcyIsImZpbHRlckV4cHJlc3Npb24iLCJnZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uIiwidmlzaWJsZSIsInByb3BJbmZvIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJ0eXBlQ29uZmlnIiwiVHlwZU1hcCIsImdldFR5cGVDb25maWciLCJkYXRhVHlwZSIsImZvcm1hdE9wdGlvbnMiLCJjb25zdHJhaW50cyIsImdldExvY2FsaXplZFRleHQiLCJpc1BhcmFtZXRlciIsInNldEN1c3RvbURhdGEiLCJnZXRMaW5lSXRlbVF1YWxpZmllckZyb21UYWJsZSIsImFubm90YXRpb25QYXRocyIsImdldE1ldGFQYXRoIiwic3BsaXQiLCJWaXN1YWxpemF0aW9ucyIsInZpc3VhbGl6YXRpb24iLCIkQW5ub3RhdGlvblBhdGgiLCJtZXRhUGF0aHMiLCJmaWx0ZXJGaWVsZEluZm8iLCJwcm9wZXJ0eUFubm90YXRpb25zIiwiaXNJbkZpbHRlckZhY2V0cyIsImlzU2VsZWN0aW9uRmllbGQiLCJfaXNGaWx0ZXJJblNlbGVjdGlvbkZpZWxkcyIsImZpbHRlckZhY2V0IiwiZmllbGRHcm91cCIsIlRhcmdldCIsIiR0YXJnZXQiLCJEYXRhIiwiZGF0YUZpZWxkIiwiVmFsdWUiLCJBZGFwdGF0aW9uSGlkZGVuIiwiZmlsdGVyRmllbGRLZXkiLCJzZWxlY3Rpb25GaWVsZCIsInZhbHVlIiwic0ZsZXhQcm9wZXJ0eU5hbWUiLCJvQXBwQ29tcG9uZW50IiwiYklzWE1MIiwidHlwZSIsInNOYXZpZ2F0aW9uUGF0aCIsImdldE5hdmlnYXRpb25QYXRoIiwic1VzZVNlbWFudGljRGF0ZVJhbmdlIiwic0JpbmRpbmdQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmV0cmlldmVkRW50aXR5VHlwZVBhdGgiLCJzUmV0cmlldmVkVXNlU2VtYW50aWNEYXRlUmFuZ2UiLCJlbmRzV2l0aCIsInByb3BlcnR5IiwiZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmciLCJqb2luIiwiZ2V0UGF0aCIsInNWYWx1ZUhlbHBUeXBlIiwiZG9lc1ZhbHVlSGVscEV4aXN0IiwiYlZhbHVlSGVscEV4aXN0cyIsImxvY2FsSWQiLCJfZ2V0UGFnZU1vZGVsIiwiX2dldENhY2hlZFByb3BlcnRpZXMiLCJ3aW5kb3ciLCJFbGVtZW50IiwiZ2V0Q3VzdG9tRGF0YSIsIl9zZXRDYWNoZWRQcm9wZXJ0aWVzIiwiX2dldENhY2hlZE9yRmV0Y2hQcm9wZXJ0aWVzRm9yRW50aXR5IiwibG9jYWxHcm91cExhYmVsIiwib0dyb3VwIiwic29ydFByb3BlcnR5SW5mb3NCeUdyb3VwTGFiZWwiLCJmZXRjaFByb3BlcnRpZXMiLCJmaWx0ZXJCYXIiLCJwcm9wZXJ0eUluZm9zIiwiZmV0Y2hGaWx0ZXJQcm9wZXJ0aWVzIiwiZ2V0VHlwZU1hcCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRmlsdGVyQmFyRGVsZWdhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IHR5cGUge1xuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RmllbGRHcm91cFR5cGUsXG5cdEZpbHRlckZhY2V0cyxcblx0UmVmZXJlbmNlRmFjZXQsXG5cdFNlbGVjdGlvbkZpZWxkc1xufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgQmFzZVRyZWVNb2RpZmllciwgUHJlcHJvY2Vzc29yU2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0UHJvcGVydHlJbmZvIGFzIEZFUHJvcGVydHlJbmZvLFxuXHRGaWx0ZXJGaWVsZCxcblx0UHJvcGVydHlJbmZvRXh0ZXJuYWxcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMsIHNvcnRQcm9wZXJ0eUluZm9zQnlHcm91cExhYmVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5RmlsdGVyYWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldExvY2FsaXplZFRleHQsIGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHAgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7IGdldE1vZGVsVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS90eXBlL0VETVwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBEZWxlZ2F0ZVV0aWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvRGVsZWdhdGVVdGlsXCI7XG5pbXBvcnQgRmllbGRIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSUZpbHRlckNvbnRyb2wgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgUHJvcGVydHlJbmZvIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvUHJvcGVydHlJbmZvXCI7XG5pbXBvcnQgeyBnZXRWYWx1ZUhlbHBUZW1wbGF0ZSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUhlbHBUZW1wbGF0aW5nXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9tZGMvYWRhcHRlci9TdGF0ZUhlbHBlclwiO1xuaW1wb3J0IFN0YXRlSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL21kYy9hZGFwdGVyL1N0YXRlSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCBGaWx0ZXJCYXJEZWxlZ2F0ZSBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJEZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgTURDRmlsdGVyRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyRmllbGRcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscCBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCBUeXBlTWFwIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1R5cGVNYXBcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1hY3JvQVBJIGZyb20gXCIuLi9NYWNyb0FQSVwiO1xuXG50eXBlIE1vZGlmaWVyRWxlbWVudCA9IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10gfCBFbGVtZW50IHwgRWxlbWVudFtdO1xudHlwZSBOdWxsYWJsZU1vZGlmaWVyRWxlbWVudCA9IHZvaWQgfCBNb2RpZmllckVsZW1lbnQgfCBudWxsO1xuY29uc3QgT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZSA9IE9iamVjdC5hc3NpZ24oe30sIEZpbHRlckJhckRlbGVnYXRlKSBhcyB0eXBlb2YgRmlsdGVyQmFyRGVsZWdhdGUgJiB7XG5cdGFwaVZlcnNpb246IG51bWJlcjtcblx0X2lzRmlsdGVySW5TZWxlY3Rpb25GaWVsZHMoc2VsZWN0aW9uRmllbGRzOiBTZWxlY3Rpb25GaWVsZHMsIGZpbHRlckZpZWxkSW5mbzogRmlsdGVyRmllbGQpOiBib29sZWFuO1xuXHRfZmluZFNlbGVjdGlvbkZpZWxkKGFTZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNGbGV4TmFtZTogc3RyaW5nKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQ7XG5cdGNsZWFyRmlsdGVycyhvRmlsdGVyQ29udHJvbDogRmlsdGVyQmFyKTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0VHlwZU1hcCgpOiB0eXBlb2YgVHlwZU1hcDtcblx0ZmV0Y2hGaWx0ZXJQcm9wZXJ0aWVzKGZpbHRlckJhcjogSUZpbHRlckNvbnRyb2wpOiBQcm9taXNlPENvbnRyb2xQcm9wZXJ0eUluZm9bXSB8IFByb3BlcnR5SW5mb0V4dGVybmFsW10+O1xuXHRmZXRjaFByb3BlcnRpZXMoZmlsdGVyQmFyOiBGaWx0ZXJCYXIpOiBQcm9taXNlPFByb3BlcnR5SW5mb0V4dGVybmFsW10+O1xuXHRfaXNGaWx0ZXJBZGFwdGFibGUoXG5cdFx0ZmlsdGVyRmllbGRJbmZvOiBGaWx0ZXJGaWVsZCxcblx0XHRwcm9wZXJ0eUFubm90YXRpb25zOiBQcm9wZXJ0eSxcblx0XHRzZWxlY3Rpb25GaWVsZHM/OiBTZWxlY3Rpb25GaWVsZHMsXG5cdFx0ZmlsdGVyRmFjZXRzPzogRmlsdGVyRmFjZXRzXG5cdCk6IGJvb2xlYW47XG5cdGZldGNoUHJvcGVydGllc0ZvckVudGl0eShzRW50aXR5VHlwZVBhdGg6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIG9GaWx0ZXJDb250cm9sOiBJRmlsdGVyQ29udHJvbCk6IFByb3BlcnR5SW5mb1tdO1xuXHRfdGVtcGxhdGVDdXN0b21GaWx0ZXIoXG5cdFx0b0ZpbHRlckJhcjogSUZpbHRlckNvbnRyb2wsXG5cdFx0c0lkUHJlZml4OiBzdHJpbmcsXG5cdFx0b1NlbGVjdGlvbkZpZWxkSW5mbzogRmlsdGVyRmllbGQsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0b01vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyXG5cdCk6IFByb21pc2U8TW9kaWZpZXJFbGVtZW50Pjtcblx0X2FkZFAxM25JdGVtKHNQcm9wZXJ0eUluZm9OYW1lOiBzdHJpbmcsIG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIpOiBQcm9taXNlPE51bGxhYmxlTW9kaWZpZXJFbGVtZW50Pjtcblx0X2FkZEZsZXhJdGVtKFxuXHRcdHNGbGV4UHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRvTW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXIgfCB1bmRlZmluZWQsXG5cdFx0b0FwcENvbXBvbmVudD86IEFwcENvbXBvbmVudCxcblx0XHR2aWV3PzogVmlld1xuXHQpOiBQcm9taXNlPE51bGxhYmxlTW9kaWZpZXJFbGVtZW50Pjtcblx0YWRkSXRlbShcblx0XHRvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyLFxuXHRcdHNQcm9wZXJ0eUluZm9OYW1lOiBzdHJpbmcsXG5cdFx0bVByb3BlcnR5QmFnPzogeyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllcjsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgfVxuXHQpOiBQcm9taXNlPE51bGxhYmxlTW9kaWZpZXJFbGVtZW50Pjtcblx0YWRkQ29uZGl0aW9uKFxuXHRcdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdFx0c1Byb3BlcnR5SW5mb05hbWU6IHN0cmluZyxcblx0XHRtUHJvcGVydHlCYWc6IHsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7IG1vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyIH1cblx0KTogUHJvbWlzZTx2b2lkIHwgbnVsbD47XG5cdHJlbW92ZUl0ZW0oXG5cdFx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0XHRvRmlsdGVyRmllbGRQcm9wZXJ0eTogVUk1RWxlbWVudCB8IEVsZW1lbnQsXG5cdFx0bVByb3BlcnR5QmFnOiB7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50OyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllciB9XG5cdCk6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+O1xuXHRyZW1vdmVDb25kaXRpb24oXG5cdFx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0XHRzUHJvcGVydHlJbmZvTmFtZTogc3RyaW5nLFxuXHRcdG1Qcm9wZXJ0eUJhZzoge1xuXHRcdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdFx0XHRtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllcjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZCB8IG51bGw+O1xufTtcbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuYXBpVmVyc2lvbiA9IDI7XG5jb25zdCBFRElUX1NUQVRFX1BST1BFUlRZX05BTUUgPSBcIiRlZGl0U3RhdGVcIixcblx0U0VBUkNIX1BST1BFUlRZX05BTUUgPSBcIiRzZWFyY2hcIixcblx0VkFMVUVfSEVMUF9UWVBFID0gXCJGaWx0ZXJGaWVsZFZhbHVlSGVscFwiLFxuXHRGRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVkgPSBcInNhcF9mZV9GaWx0ZXJCYXJEZWxlZ2F0ZV9wcm9wZXJ0eUluZm9NYXBcIjtcblxuLy8gRm9yIG9uZSBzaW5nbGUgZW50cnkgaW4gVUkuU2VsZWN0aW9uRmllbGRzXG50eXBlIEFubm90YXRpb25TZWxlY3Rpb25GaWVsZCA9IHtcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIF90ZW1wbGF0ZUVkaXRTdGF0ZShcblx0c0lkUHJlZml4OiBzdHJpbmcsXG5cdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdG9Nb2RpZmllcjogQmFzZVRyZWVNb2RpZmllciB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxNb2RpZmllckVsZW1lbnQ+IHtcblx0Y29uc3Qgb1RoaXMgPSBuZXcgSlNPTk1vZGVsKHtcblx0XHRcdGlkOiBzSWRQcmVmaXgsXG5cdFx0XHRpc0RyYWZ0Q29sbGFib3JhdGl2ZTogTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKVxuXHRcdH0pLFxuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHR0aGlzOiBvVGhpcy5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIilcblx0XHRcdH0sXG5cdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0Ly9cInRoaXMuaTE4blwiOiBSZXNvdXJjZU1vZGVsLmdldE1vZGVsKCksIFRPRE86IFRvIGJlIGNoZWNrZWQgd2h5IHRoaXMgaXMgbmVlZGVkLCBzaG91bGQgbm90IGJlIG5lZWRlZCBhdCBhbGxcblx0XHRcdFx0dGhpczogb1RoaXNcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBEZWxlZ2F0ZVV0aWwudGVtcGxhdGVDb250cm9sRnJhZ21lbnQoXG5cdFx0XCJzYXAuZmUubWFjcm9zLmZpbHRlckJhci5EcmFmdEVkaXRTdGF0ZVwiLFxuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncyxcblx0XHR1bmRlZmluZWQsXG5cdFx0b01vZGlmaWVyXG5cdCkuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0b1RoaXMuZGVzdHJveSgpO1xuXHR9KTtcbn1cblxuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5fdGVtcGxhdGVDdXN0b21GaWx0ZXIgPSBhc3luYyBmdW5jdGlvbiAoXG5cdG9GaWx0ZXJCYXI6IElGaWx0ZXJDb250cm9sLFxuXHRzSWRQcmVmaXg6IHN0cmluZyxcblx0b1NlbGVjdGlvbkZpZWxkSW5mbzogRmlsdGVyRmllbGQsXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRvTW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXJcbik6IFByb21pc2U8TW9kaWZpZXJFbGVtZW50PiB7XG5cdGNvbnN0IHNFbnRpdHlUeXBlUGF0aCA9IGF3YWl0IERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhV2l0aE1vZGlmaWVyPHN0cmluZz4ob0ZpbHRlckJhciwgXCJlbnRpdHlUeXBlXCIsIG9Nb2RpZmllcik7XG5cblx0aWYgKG9TZWxlY3Rpb25GaWVsZEluZm8uYW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIGlmIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdHR5cGUgUHJvcGVydHlBbm5vdGF0aW9uc19Db21tb25fZXh0ZW5kZWQgPSBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiAmIHsgRG9jdW1lbnRhdGlvblJlZj86IHN0cmluZyB9O1xuXHRcdGNvbnN0IGNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQob1NlbGVjdGlvbkZpZWxkSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRkYXRhTW9kZWxQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPFByb3BlcnR5Pihjb250ZXh0KSxcblx0XHRcdGRvY3VtZW50UmVmVGV4dCA9IChcblx0XHRcdFx0ZGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zLkNvbW1vbiBhcyBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbl9leHRlbmRlZFxuXHRcdFx0KT8uRG9jdW1lbnRhdGlvblJlZj8udG9TdHJpbmcoKTtcblx0XHRvU2VsZWN0aW9uRmllbGRJbmZvLmRvY3VtZW50UmVmVGV4dCA9IGRvY3VtZW50UmVmVGV4dDtcblx0fVxuXG5cdGNvbnN0IG9UaGlzID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHRpZDogc0lkUHJlZml4XG5cdFx0fSksXG5cdFx0b0l0ZW1Nb2RlbCA9IG5ldyBUZW1wbGF0ZU1vZGVsKG9TZWxlY3Rpb25GaWVsZEluZm8sIG9NZXRhTW9kZWwpLFxuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRjb250ZXh0UGF0aDogb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5VHlwZVBhdGghKSxcblx0XHRcdFx0dGhpczogb1RoaXMuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpLFxuXHRcdFx0XHRpdGVtOiBvSXRlbU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0fSxcblx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRjb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0dGhpczogb1RoaXMsXG5cdFx0XHRcdGl0ZW06IG9JdGVtTW9kZWxcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9WaWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0VmlldyhvRmlsdGVyQmFyKSxcblx0XHRvQ29udHJvbGxlciA9IG9WaWV3ID8gb1ZpZXcuZ2V0Q29udHJvbGxlcigpIDogdW5kZWZpbmVkLFxuXHRcdG9PcHRpb25zID0ge1xuXHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXIgPyBvQ29udHJvbGxlciA6IHVuZGVmaW5lZCxcblx0XHRcdHZpZXc6IG9WaWV3XG5cdFx0fTtcblxuXHRyZXR1cm4gRGVsZWdhdGVVdGlsLnRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFwic2FwLmZlLm1hY3Jvcy5maWx0ZXIuQ3VzdG9tRmlsdGVyXCIsIG9QcmVwcm9jZXNzb3JTZXR0aW5ncywgb09wdGlvbnMsIG9Nb2RpZmllcikuZmluYWxseShcblx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRvVGhpcy5kZXN0cm95KCk7XG5cdFx0XHRvSXRlbU1vZGVsLmRlc3Ryb3koKTtcblx0XHR9XG5cdCk7XG59O1xuZnVuY3Rpb24gX2dldFByb3BlcnR5UGF0aChzQ29uZGl0aW9uUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIEZpbHRlclV0aWxzLmdldFByb3BlcnR5UGF0aEZyb21Db25kaXRpb25QYXRoKHNDb25kaXRpb25QYXRoKTtcbn1cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2ZpbmRTZWxlY3Rpb25GaWVsZCA9IGZ1bmN0aW9uIChhU2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdLCBzRmxleE5hbWU6IHN0cmluZyk6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGFTZWxlY3Rpb25GaWVsZHMuZmluZChmdW5jdGlvbiAob1NlbGVjdGlvbkZpZWxkOiBGaWx0ZXJGaWVsZCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQob1NlbGVjdGlvbkZpZWxkLmNvbmRpdGlvblBhdGggPT09IHNGbGV4TmFtZSB8fCBvU2VsZWN0aW9uRmllbGQuY29uZGl0aW9uUGF0aC5yZXBsYWNlQWxsKC9cXCovZywgXCJcIikgPT09IHNGbGV4TmFtZSkgJiZcblx0XHRcdG9TZWxlY3Rpb25GaWVsZC5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCJcblx0XHQpO1xuXHR9KTtcbn07XG5mdW5jdGlvbiBfZ2VuZXJhdGVJZFByZWZpeChzRmlsdGVyQmFySWQ6IHN0cmluZywgc0NvbnRyb2xUeXBlOiBzdHJpbmcsIHNOYXZpZ2F0aW9uUHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHNOYXZpZ2F0aW9uUHJlZml4ID8gZ2VuZXJhdGUoW3NGaWx0ZXJCYXJJZCwgc0NvbnRyb2xUeXBlLCBzTmF2aWdhdGlvblByZWZpeF0pIDogZ2VuZXJhdGUoW3NGaWx0ZXJCYXJJZCwgc0NvbnRyb2xUeXBlXSk7XG59XG5hc3luYyBmdW5jdGlvbiBfdGVtcGxhdGVWYWx1ZUhlbHAoXG5cdG9TZXR0aW5nczoge1xuXHRcdGlzWE1MOiBib29sZWFuO1xuXHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0bWV0YVBhdGg6IENvbnRleHQ7XG5cdFx0XHRjb250ZXh0UGF0aDogQ29udGV4dDtcblx0XHR9O1xuXHRcdG1vZGVsczoge1xuXHRcdFx0bWV0YVBhdGg6IE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Y29udGV4dFBhdGg6IE9EYXRhTWV0YU1vZGVsO1xuXHRcdH07XG5cdH0sXG5cdG9QYXJhbWV0ZXJzOiB7XG5cdFx0c1ZoSWRQcmVmaXg6IHN0cmluZztcblx0XHRzTmF2aWdhdGlvblByZWZpeD86IHN0cmluZztcblx0XHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U6IGJvb2xlYW47XG5cdFx0b01vZGlmaWVyPzogQmFzZVRyZWVNb2RpZmllcjtcblx0XHRvQ29udHJvbDogVUk1RWxlbWVudDtcblx0XHR2aWV3PzogVmlldztcblx0fVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9UaGlzID0ge1xuXHRcdGlkUHJlZml4OiBvUGFyYW1ldGVycy5zVmhJZFByZWZpeCxcblx0XHRjb25kaXRpb25Nb2RlbDogXCIkZmlsdGVyc1wiLFxuXHRcdG5hdmlnYXRpb25QcmVmaXg6IG9QYXJhbWV0ZXJzLnNOYXZpZ2F0aW9uUHJlZml4ID8gYC8ke29QYXJhbWV0ZXJzLnNOYXZpZ2F0aW9uUHJlZml4fWAgOiBcIlwiLFxuXHRcdGZpbHRlckZpZWxkVmFsdWVIZWxwOiB0cnVlLFxuXHRcdHVzZVNlbWFudGljRGF0ZVJhbmdlOiBvUGFyYW1ldGVycy5iVXNlU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0bWV0YVBhdGg6IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMubWV0YVBhdGgsXG5cdFx0Y29udGV4dFBhdGg6IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGgsXG5cdFx0dXNlTXVsdGlWYWx1ZUZpZWxkOiBmYWxzZSxcblx0XHRyZXF1aXJlc1ZhbGlkYXRpb246IGZhbHNlLFxuXHRcdGNvbGxhYm9yYXRpb25FbmFibGVkOiBmYWxzZSxcblx0XHRyZXF1ZXN0R3JvdXBJZDogdW5kZWZpbmVkXG5cdH07XG5cdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwob1RoaXMpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBtZXJnZU9iamVjdHMoe30sIG9TZXR0aW5ncywge1xuXHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0dGhpczoganNvbk1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdH0sXG5cdFx0bW9kZWxzOiB7XG5cdFx0XHR0aGlzOiBvVGhpc1xuXHRcdH1cblx0fSkgYXMgUHJlcHJvY2Vzc29yU2V0dGluZ3M7XG5cdGNvbnN0IHRhcmdldFBhdGggPSBGaWVsZEhlbHBlci52YWx1ZUhlbHBQcm9wZXJ0eUZvckZpbHRlckZpZWxkKG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMubWV0YVBhdGgpO1xuXG5cdGlmIChvU2V0dGluZ3MuaXNYTUwpIHtcblx0XHRsZXQgdmFsdWVIZWxwWE1MU3RyaW5nID0ganN4LnJlbmRlckFzWE1MPHN0cmluZyB8IHVuZGVmaW5lZD4oXG5cdFx0XHQoKSA9PlxuXHRcdFx0XHRnZXRWYWx1ZUhlbHBUZW1wbGF0ZShvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLm1ldGFQYXRoLmdldE1vZGVsKCkuY3JlYXRlQmluZGluZ0NvbnRleHQodGFyZ2V0UGF0aCksIG9UaGlzKSBhc1xuXHRcdFx0XHRcdHwgc3RyaW5nXG5cdFx0XHRcdFx0fCB1bmRlZmluZWRcblx0XHQpO1xuXHRcdGlmICh2YWx1ZUhlbHBYTUxTdHJpbmcpIHtcblx0XHRcdGlmIChvU2V0dGluZ3MuaXNYTUwpIHtcblx0XHRcdFx0dmFsdWVIZWxwWE1MU3RyaW5nID0gYDxyb290PiR7dmFsdWVIZWxwWE1MU3RyaW5nfTwvcm9vdD5gO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdmFsdWVIZWxwWE1MID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh2YWx1ZUhlbHBYTUxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHREZWxlZ2F0ZVV0aWwudGVtcGxhdGVDb250cm9sRnJhZ21lbnQodmFsdWVIZWxwWE1MLmZpcnN0RWxlbWVudENoaWxkLCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MsIHtcblx0XHRcdFx0XHRpc1hNTDogb1NldHRpbmdzLmlzWE1MXG5cdFx0XHRcdH0pXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChhVkhFbGVtZW50czogTW9kaWZpZXJFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdFx0aWYgKGFWSEVsZW1lbnRzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzQWdncmVnYXRpb25OYW1lID0gXCJkZXBlbmRlbnRzXCI7XG5cdFx0XHRcdFx0XHQvL1NvbWUgZmlsdGVyIGZpZWxkcyBoYXZlIHRoZSBQZXJzaXN0ZW5jZVByb3ZpZGVyIGFnZ3JlZ2F0aW9uIGJlc2lkZXMgdGhlIEZWSCA6XG5cdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShhVkhFbGVtZW50cykpIHtcblx0XHRcdFx0XHRcdFx0YVZIRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWx0OiBFbGVtZW50IHwgVUk1RWxlbWVudCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1ldGVycy5vTW9kaWZpZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJzLm9Nb2RpZmllci5pbnNlcnRBZ2dyZWdhdGlvbihvUGFyYW1ldGVycy5vQ29udHJvbCwgc0FnZ3JlZ2F0aW9uTmFtZSwgZWx0LCAwKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlcnMub0NvbnRyb2wuaW5zZXJ0QWdncmVnYXRpb24oc0FnZ3JlZ2F0aW9uTmFtZSwgZWx0IGFzIFVJNUVsZW1lbnQsIDAsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvUGFyYW1ldGVycy5vTW9kaWZpZXIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9QYXJhbWV0ZXJzLm9Nb2RpZmllci5pbnNlcnRBZ2dyZWdhdGlvbihcblx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVycy5vQ29udHJvbCxcblx0XHRcdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGFWSEVsZW1lbnRzLFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlcnMudmlldyBhcyB1bmtub3duIGFzIEVsZW1lbnRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJzLm9Db250cm9sLmluc2VydEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUsIGFWSEVsZW1lbnRzIGFzIFVJNUVsZW1lbnQsIDAsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBEZWxlZ2F0ZVV0aWwuaXNWYWx1ZUhlbHBSZXF1aXJlZFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGpzb25Nb2RlbC5kZXN0cm95KCk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCB2YWx1ZUhlbHAgPSBnZXRWYWx1ZUhlbHBUZW1wbGF0ZShvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLm1ldGFQYXRoLmdldE1vZGVsKCkuY3JlYXRlQmluZGluZ0NvbnRleHQodGFyZ2V0UGF0aCksIG9UaGlzKSBhc1xuXHRcdFx0fCBWYWx1ZUhlbHBcblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGlmICh2YWx1ZUhlbHApIHtcblx0XHRcdGNvbnN0IHNBZ2dyZWdhdGlvbk5hbWUgPSBcImRlcGVuZGVudHNcIjtcblx0XHRcdC8vU29tZSBmaWx0ZXIgZmllbGRzIGhhdmUgdGhlIFBlcnNpc3RlbmNlUHJvdmlkZXIgYWdncmVnYXRpb24gYmVzaWRlcyB0aGUgRlZIIDpcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlSGVscCkpIHtcblx0XHRcdFx0dmFsdWVIZWxwLmZvckVhY2goZnVuY3Rpb24gKGVsdDogRWxlbWVudCB8IFVJNUVsZW1lbnQpIHtcblx0XHRcdFx0XHRpZiAob1BhcmFtZXRlcnMub01vZGlmaWVyKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1ldGVycy5vTW9kaWZpZXIuaW5zZXJ0QWdncmVnYXRpb24ob1BhcmFtZXRlcnMub0NvbnRyb2wsIHNBZ2dyZWdhdGlvbk5hbWUsIGVsdCwgMCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJzLm9Db250cm9sLmluc2VydEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUsIGVsdCBhcyBVSTVFbGVtZW50LCAwLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAob1BhcmFtZXRlcnMub01vZGlmaWVyKSB7XG5cdFx0XHRcdG9QYXJhbWV0ZXJzLm9Nb2RpZmllci5pbnNlcnRBZ2dyZWdhdGlvbihvUGFyYW1ldGVycy5vQ29udHJvbCwgc0FnZ3JlZ2F0aW9uTmFtZSwgdmFsdWVIZWxwLCAwKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9QYXJhbWV0ZXJzLm9Db250cm9sLmluc2VydEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUsIHZhbHVlSGVscCwgMCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuYXN5bmMgZnVuY3Rpb24gX2FkZFhNTEN1c3RvbUZpbHRlckZpZWxkKFxuXHRvRmlsdGVyQmFyOiBJRmlsdGVyQ29udHJvbCxcblx0b01vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyLFxuXHRzUHJvcGVydHlQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8VUk1RWxlbWVudCB8IEVsZW1lbnQgfCB2b2lkPiB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgYURlcGVuZGVudHMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUob01vZGlmaWVyLmdldEFnZ3JlZ2F0aW9uKG9GaWx0ZXJCYXIsIFwiZGVwZW5kZW50c1wiKSk7XG5cdFx0bGV0IGk7XG5cdFx0aWYgKGFEZXBlbmRlbnRzICYmIGFEZXBlbmRlbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPD0gYURlcGVuZGVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3Qgb0ZpbHRlckZpZWxkID0gYURlcGVuZGVudHNbaV07XG5cdFx0XHRcdGlmIChvRmlsdGVyRmllbGQgJiYgKG9GaWx0ZXJGaWVsZCBhcyBVSTVFbGVtZW50KS5pc0E8TURDRmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNEYXRhUHJvcGVydHkgPSAob0ZpbHRlckZpZWxkIGFzIE1EQ0ZpbHRlckZpZWxkKS5nZXRQcm9wZXJ0eUtleSgpLFxuXHRcdFx0XHRcdFx0c0ZpbHRlckZpZWxkSWQgPSAob0ZpbHRlckZpZWxkIGFzIE1EQ0ZpbHRlckZpZWxkKS5nZXRJZCgpO1xuXHRcdFx0XHRcdGlmIChzUHJvcGVydHlQYXRoID09PSBzRGF0YVByb3BlcnR5ICYmIHNGaWx0ZXJGaWVsZElkLmluZGV4T2YoXCJDdXN0b21GaWx0ZXJGaWVsZFwiKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9GaWx0ZXJGaWVsZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdExvZy5lcnJvcihcIkZpbHRlciBDYW5ub3QgYmUgYWRkZWRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3RlbXBsYXRlRmlsdGVyRmllbGQoXG5cdG9TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG9QYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0c0luRmlsdGVyQmFySWQ/OiBzdHJpbmcsXG5cdHBhZ2VNb2RlbD86IEpTT05Nb2RlbFxuKTogUHJvbWlzZTxVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdIHwgRWxlbWVudCB8IEVsZW1lbnRbXT4ge1xuXHRjb25zdCBvVGhpcyA9IG5ldyBKU09OTW9kZWwoe1xuXHRcdGlkUHJlZml4OiBvUGFyYW1ldGVycy5zSWRQcmVmaXgsXG5cdFx0dmhJZFByZWZpeDogb1BhcmFtZXRlcnMuc1ZoSWRQcmVmaXgsXG5cdFx0cHJvcGVydHlQYXRoOiBvUGFyYW1ldGVycy5zUHJvcGVydHlOYW1lLFxuXHRcdG5hdmlnYXRpb25QcmVmaXg6IG9QYXJhbWV0ZXJzLnNOYXZpZ2F0aW9uUHJlZml4ID8gYC8ke29QYXJhbWV0ZXJzLnNOYXZpZ2F0aW9uUHJlZml4fWAgOiBcIlwiLFxuXHRcdHVzZVNlbWFudGljRGF0ZVJhbmdlOiBvUGFyYW1ldGVycy5iVXNlU2VtYW50aWNEYXRlUmFuZ2UsXG5cdFx0c2V0dGluZ3M6IG9QYXJhbWV0ZXJzLm9TZXR0aW5ncyxcblx0XHR2aXN1YWxGaWx0ZXI6IG9QYXJhbWV0ZXJzLnZpc3VhbEZpbHRlcixcblx0XHRlZGl0TW9kZTogYHtpbnRlcm5hbD4vJHtzSW5GaWx0ZXJCYXJJZH0vZmlsdGVyRmllbGRzLyR7b1BhcmFtZXRlcnMuc1Byb3BlcnR5TmFtZX0vZWRpdE1vZGV9YCxcblx0XHRsYWJlbDogb1BhcmFtZXRlcnMubGFiZWxcblx0fSk7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9QYXJhbWV0ZXJzLm9NZXRhTW9kZWwgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3Qgb1Zpc3VhbEZpbHRlciA9IG5ldyBUZW1wbGF0ZU1vZGVsKG9QYXJhbWV0ZXJzLnZpc3VhbEZpbHRlciBhcyBvYmplY3QsIG9NZXRhTW9kZWwpO1xuXHRcdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IG1lcmdlT2JqZWN0cyh7fSwgb1NldHRpbmdzLCB7XG5cdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0dGhpczogb1RoaXMuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpLFxuXHRcdFx0XHR2aXN1YWxGaWx0ZXI6IG9WaXN1YWxGaWx0ZXIuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHR9LFxuXHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdHRoaXM6IG9UaGlzLFxuXHRcdFx0XHR2aXN1YWxGaWx0ZXI6IG9WaXN1YWxGaWx0ZXIsXG5cdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogcGFnZU1vZGVsXG5cdFx0XHR9XG5cdFx0fSkgYXMgUHJlcHJvY2Vzc29yU2V0dGluZ3M7XG5cblx0XHRyZXR1cm4gYXdhaXQgRGVsZWdhdGVVdGlsLnRlbXBsYXRlQ29udHJvbEZyYWdtZW50KFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbC5maWx0ZXJGaWVsZC5GaWx0ZXJGaWVsZFRlbXBsYXRlXCIsIG9QcmVwcm9jZXNzb3JTZXR0aW5ncywge1xuXHRcdFx0aXNYTUw6ICEhb1NldHRpbmdzLmlzWE1MXG5cdFx0fSk7XG5cdH0gZmluYWxseSB7XG5cdFx0b1RoaXMuZGVzdHJveSgpO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9hZGRQcm9wZXJ0eUluZm8oXG5cdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdG1Qcm9wZXJ0eUJhZzogeyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllcjsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgfSxcblx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdHNQcm9wZXJ0eUluZm9OYW1lOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuXHR0cnkge1xuXHRcdC8vIGtleSBzaG91bGQgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBuYW1lXG5cdFx0Y29uc3Qgc1Byb3BlcnR5SW5mb0tleSA9IEtleUhlbHBlci5nZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoKHNQcm9wZXJ0eUluZm9OYW1lKTtcblx0XHRzUHJvcGVydHlJbmZvTmFtZSA9IHNQcm9wZXJ0eUluZm9OYW1lLnJlcGxhY2UoXCIqXCIsIFwiXCIpO1xuXHRcdGlmIChtUHJvcGVydHlCYWcgJiYgIW1Qcm9wZXJ0eUJhZy5tb2RpZmllcikge1xuXHRcdFx0dGhyb3cgXCJGaWx0ZXJCYXIgRGVsZWdhdGUgbWV0aG9kIGNhbGxlZCB3aXRob3V0IG1vZGlmaWVyLlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRlbGVnYXRlID0gYXdhaXQgbVByb3BlcnR5QmFnLm1vZGlmaWVyLmdldFByb3BlcnR5PEZpbHRlckJhckRlbGVnYXRlPihvUGFyZW50Q29udHJvbCwgXCJkZWxlZ2F0ZVwiKTtcblx0XHRjb25zdCBhUHJvcGVydHlJbmZvID0gYXdhaXQgbVByb3BlcnR5QmFnLm1vZGlmaWVyLmdldFByb3BlcnR5PEZFUHJvcGVydHlJbmZvW10+KG9QYXJlbnRDb250cm9sLCBcInByb3BlcnR5SW5mb1wiKTtcblx0XHQvL1dlIGRvIG5vdCBnZXQgcHJvcGVydHlJbmZvIGluIGNhc2Ugb2YgdGFibGUgZmlsdGVyc1xuXHRcdGlmIChhUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRjb25zdCBoYXNQcm9wZXJ0eUluZm8gPSBhUHJvcGVydHlJbmZvLnNvbWUoZnVuY3Rpb24gKHByb3A6IEZFUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdHJldHVybiBwcm9wLmtleSA9PT0gc1Byb3BlcnR5SW5mb0tleSB8fCBwcm9wLm5hbWUgPT09IHNQcm9wZXJ0eUluZm9LZXk7XG5cdFx0XHR9KTtcblx0XHRcdGlmICghaGFzUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVR5cGVQYXRoID0gZGVsZWdhdGUucGF5bG9hZC5lbnRpdHlUeXBlUGF0aDtcblx0XHRcdFx0Y29uc3QgY29udmVydGVyQ29udGV4dCA9IEZpbHRlclV0aWxzLmNyZWF0ZUNvbnZlcnRlckNvbnRleHQoXG5cdFx0XHRcdFx0b1BhcmVudENvbnRyb2wgYXMgdW5rbm93biBhcyBJRmlsdGVyQ29udHJvbCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlUGF0aCxcblx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnRcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJGaWVsZCA9IEZpbHRlclV0aWxzLmdldEZpbHRlckZpZWxkKHNQcm9wZXJ0eUluZm9OYW1lLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvID0gRmlsdGVyVXRpbHMuYnVpbGRQcm9wZXJ5SW5mbyhmaWx0ZXJGaWVsZCEsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0XHRhd2FpdCBfdXBkYXRlUHJvcGVydHlJbmZvKFxuXHRcdFx0XHRcdGFQcm9wZXJ0eUluZm8gYXMgUHJvcGVydHlJbmZvW10sXG5cdFx0XHRcdFx0bVByb3BlcnR5QmFnLFxuXHRcdFx0XHRcdHByb3BlcnR5SW5mbyBhcyB1bmtub3duIGFzIFByb3BlcnR5SW5mbyxcblx0XHRcdFx0XHRvUGFyZW50Q29udHJvbFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3JNc2cpIHtcblx0XHRMb2cud2FybmluZyhgJHtvUGFyZW50Q29udHJvbC5nZXRJZCgpfSA6ICR7ZXJyb3JNc2d9YCk7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3VwZGF0ZVByb3BlcnR5SW5mbyhcblx0cHJvcGVydHlJbmZvOiBQcm9wZXJ0eUluZm9bXSxcblx0cHJvcGVydHlCYWc6IHsgbW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXI7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50IH0sXG5cdGZpbHRlckZpZWxkOiBQcm9wZXJ0eUluZm8sXG5cdHBhcmVudENvbnRyb2w6IEZpbHRlckJhclxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGxldCBwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIgPSBhd2FpdCBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllcjxzdHJpbmc+KFxuXHRcdHBhcmVudENvbnRyb2wsXG5cdFx0XCJmZUZpbHRlckluZm9cIixcblx0XHRwcm9wZXJ0eUJhZy5tb2RpZmllclxuXHQpO1xuXHRpZiAocHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyICYmIHByb3BlcnR5SW5mb0ZvckZpbHRlckJhci5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyT2JqID0gSlNPTi5wYXJzZShwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIpIGFzIFByb3BlcnR5SW5mb1tdO1xuXHRcdHByb3BlcnR5SW5mb0ZvckZpbHRlckJhck9iai5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIgPSBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXJPYmopO1xuXHRcdHByb3BlcnR5SW5mb0ZvckZpbHRlckJhciA9IHByb3BlcnR5SW5mb0ZvckZpbHRlckJhci5yZXBsYWNlKC9cXHsvZywgXCJcXFxce1wiKTtcblx0XHRwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIgPSBwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIucmVwbGFjZSgvXFx9L2csIFwiXFxcXH1cIik7XG5cdFx0Y29uc3QgY3VzdG9tRGF0YU5vZGUgPSBhd2FpdCBEZWxlZ2F0ZVV0aWwucmV0cmlldmVDdXN0b21EYXRhTm9kZShwYXJlbnRDb250cm9sLCBcImZlRmlsdGVySW5mb1wiLCBwcm9wZXJ0eUJhZy5tb2RpZmllcik7XG5cdFx0Y3VzdG9tRGF0YU5vZGVbMF0uc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgcHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyKTtcblx0XHRwcm9wZXJ0eUJhZy5tb2RpZmllci5pbnNlcnRBZ2dyZWdhdGlvbihwYXJlbnRDb250cm9sLCBcImN1c3RvbURhdGFcIiwgY3VzdG9tRGF0YU5vZGVbMF0sIDApO1xuXHR9XG5cblx0Ly8gQ3VzdG9tIGRhdGEgaXMgc2V0IHRvIHRoZSBwYXJlbnQgY29udHJvbCB0byBzdG9yZSB0aGUgcHJvcGVydHlJbmZvXG5cdHByb3BlcnR5SW5mby5wdXNoKGZpbHRlckZpZWxkKTtcblx0Ly9yZW1vdmUgdW53YW50ZWQgcHJvcGVydHkgZnJvbSB0aGUgcHJvcGVydHlJbmZvXG5cdGNvbnN0IF9wcm9wZXJ0eUluZm8gPSBGaWx0ZXJVdGlscy5mb3JtYXRQcm9wZXJ0eUluZm8ocHJvcGVydHlJbmZvIGFzIEZFUHJvcGVydHlJbmZvW10pO1xuXHQvL1VwZGF0ZSB0aGUgcHJvcGVydHlJbmZvIGluIHRoZSBwYXJlbnQgY29udHJvbFxuXHRwcm9wZXJ0eUJhZy5tb2RpZmllci5zZXRQcm9wZXJ0eShwYXJlbnRDb250cm9sLCBcInByb3BlcnR5SW5mb1wiLCBfcHJvcGVydHlJbmZvKTtcbn1cbi8qKlxuICogTWV0aG9kIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBmaWx0ZXIgZmllbGQgaW4gc3RhbmRhbG9uZSBtb2RlIC8gaW4gdGhlIHBlcnNvbmFsaXphdGlvbiBzZXR0aW5ncyBvZiB0aGUgZmlsdGVyIGJhci5cbiAqIEBwYXJhbSBvUGFyZW50Q29udHJvbCBQYXJlbnQgY29udHJvbCBpbnN0YW5jZSB0byB3aGljaCB0aGUgZmlsdGVyIGZpZWxkIGlzIGFkZGVkXG4gKiBAcGFyYW0gc1Byb3BlcnR5SW5mb05hbWUgTmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYWRkZWQgYXMgdGhlIGZpbHRlciBmaWVsZFxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZyBJbnN0YW5jZSBvZiB0aGUgcHJvcGVydHkgYmFnIGZyb20gRmxleCBBUElcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50IEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZy5tb2RpZmllciBNb2RpZmllciBmcm9tIEZsZXggQVBJXG4gKiBAcmV0dXJucyBPbmNlIHJlc29sdmVkLCBhIGZpbHRlciBmaWVsZCBkZWZpbml0aW9uIGlzIHJldHVybmVkXG4gKi9cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuYWRkSXRlbSA9IGFzeW5jIGZ1bmN0aW9uIChcblx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0c1Byb3BlcnR5SW5mb05hbWU6IHN0cmluZyxcblx0bVByb3BlcnR5QmFnPzogeyB2aWV3OiBWaWV3OyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllcjsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgfVxuKTogUHJvbWlzZTxOdWxsYWJsZU1vZGlmaWVyRWxlbWVudD4ge1xuXHRpZiAoIW1Qcm9wZXJ0eUJhZykge1xuXHRcdC8vIEludm9rZWQgZHVyaW5nIHJ1bnRpbWUuXG5cdFx0cmV0dXJuIE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2FkZFAxM25JdGVtKHNQcm9wZXJ0eUluZm9OYW1lLCBvUGFyZW50Q29udHJvbCk7XG5cdH1cblx0Y29uc3QgbW9kaWZpZXIgPSBtUHJvcGVydHlCYWcubW9kaWZpZXI7XG5cdGNvbnN0IG1vZGVsID0gbVByb3BlcnR5QmFnICYmIG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQgJiYgbVByb3BlcnR5QmFnLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHRjb25zdCBvTWV0YU1vZGVsID0gbW9kZWwgJiYgbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdGlmICghb01ldGFNb2RlbCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdH1cblx0Y29uc3QgaXNYTUwgPSBtb2RpZmllciAmJiBtb2RpZmllci50YXJnZXRzID09PSBcInhtbFRyZWVcIjtcblx0aWYgKGlzWE1MKSB7XG5cdFx0YXdhaXQgX2FkZFByb3BlcnR5SW5mbyhvUGFyZW50Q29udHJvbCwgbVByb3BlcnR5QmFnLCBvTWV0YU1vZGVsLCBzUHJvcGVydHlJbmZvTmFtZSk7XG5cdH1cblx0cmV0dXJuIE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2FkZEZsZXhJdGVtKFxuXHRcdHNQcm9wZXJ0eUluZm9OYW1lLFxuXHRcdG9QYXJlbnRDb250cm9sLFxuXHRcdG9NZXRhTW9kZWwsXG5cdFx0bW9kaWZpZXIsXG5cdFx0bVByb3BlcnR5QmFnLmFwcENvbXBvbmVudCxcblx0XHRtUHJvcGVydHlCYWcudmlld1xuXHQpO1xufTtcblxuLyoqXG4gKiBNZXRob2QgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIGZpbHRlciBmaWVsZCBpbiBzdGFuZGFsb25lIC8gcGVyc29uYWxpemF0aW9uIGZpbHRlciBiYXIuXG4gKiBAcGFyYW0gb1BhcmVudENvbnRyb2wgUGFyZW50IGNvbnRyb2wgaW5zdGFuY2UgZnJvbSB3aGljaCB0aGUgZmlsdGVyIGZpZWxkIGlzIHJlbW92ZWRcbiAqIEBwYXJhbSBvRmlsdGVyRmllbGRQcm9wZXJ0eSBPYmplY3Qgb2YgdGhlIGZpbHRlciBmaWVsZCBwcm9wZXJ0eSBiZWluZyByZW1vdmVkIGFzIGZpbHRlciBmaWVsZFxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZyBJbnN0YW5jZSBvZiBwcm9wZXJ0eSBiYWcgZnJvbSBGbGV4IEFQSVxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVByb3BlcnR5QmFnLm1vZGlmaWVyIE1vZGlmaWVyIGZyb20gRmxleCBBUElcbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwcm9taXNlXG4gKi9cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUucmVtb3ZlSXRlbSA9IGFzeW5jIGZ1bmN0aW9uIChcblx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0b0ZpbHRlckZpZWxkUHJvcGVydHk6IFVJNUVsZW1lbnQgfCBFbGVtZW50LFxuXHRtUHJvcGVydHlCYWc6IHsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7IG1vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyIH1cbik6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+IHtcblx0bGV0IGRvUmVtb3ZlSXRlbSA9IHRydWU7XG5cdGNvbnN0IG1vZGlmaWVyID0gbVByb3BlcnR5QmFnLm1vZGlmaWVyO1xuXHRjb25zdCBpc1hNTCA9IG1vZGlmaWVyICYmIG1vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiO1xuXHRpZiAoaXNYTUwpIHtcblx0XHRjb25zdCBtb2RlbCA9IG1Qcm9wZXJ0eUJhZyAmJiBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50ICYmIG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbW9kZWwgJiYgbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKCFvTWV0YU1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblx0XHRjb25zdCBmaWx0ZXJGaWVsZFByb3BlcnR5ID0gYXdhaXQgbVByb3BlcnR5QmFnLm1vZGlmaWVyLmdldFByb3BlcnR5KG9GaWx0ZXJGaWVsZFByb3BlcnR5LCBcInByb3BlcnR5S2V5XCIpO1xuXHRcdGF3YWl0IF9hZGRQcm9wZXJ0eUluZm8ob1BhcmVudENvbnRyb2wsIG1Qcm9wZXJ0eUJhZywgb01ldGFNb2RlbCwgZmlsdGVyRmllbGRQcm9wZXJ0eSBhcyBzdHJpbmcpO1xuXHR9XG5cdGlmIChcblx0XHR0eXBlb2Ygb0ZpbHRlckZpZWxkUHJvcGVydHkgIT09IFwic3RyaW5nXCIgJiZcblx0XHQob0ZpbHRlckZpZWxkUHJvcGVydHkgYXMgVUk1RWxlbWVudCkuaXNBICYmXG5cdFx0KG9GaWx0ZXJGaWVsZFByb3BlcnR5IGFzIFVJNUVsZW1lbnQpLmlzQShcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIilcblx0KSB7XG5cdFx0aWYgKChvRmlsdGVyRmllbGRQcm9wZXJ0eSBhcyBVSTVFbGVtZW50KS5kYXRhKFwiaXNTbG90XCIpID09PSBcInRydWVcIiAmJiBtUHJvcGVydHlCYWcpIHtcblx0XHRcdC8vIEluc2VydGluZyBpbnRvIHRoZSBtb2RpZmllciBjcmVhdGVzIGEgY2hhbmdlIGZyb20gZmxleCBhbHNvIGZpbHRlciBpcyBiZWVuIHJlbW92ZWQgaGVuY2UgcHJvbWlzZSBpcyByZXNvbHZlZCB0byBmYWxzZVxuXHRcdFx0bW9kaWZpZXIuaW5zZXJ0QWdncmVnYXRpb24ob1BhcmVudENvbnRyb2wsIFwiZGVwZW5kZW50c1wiLCBvRmlsdGVyRmllbGRQcm9wZXJ0eSk7XG5cdFx0XHRkb1JlbW92ZUl0ZW0gPSBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShkb1JlbW92ZUl0ZW0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGZpbHRlciBmaWVsZCBjb25kaXRpb24gaW4gc3RhbmRhbG9uZSAvIHBlcnNvbmFsaXphdGlvbiBmaWx0ZXIgYmFyLlxuICogQHBhcmFtIG9QYXJlbnRDb250cm9sIFBhcmVudCBjb250cm9sIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBmaWx0ZXIgZmllbGQgaXMgYWRkZWRcbiAqIEBwYXJhbSBzUHJvcGVydHlJbmZvTmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhZGRlZCBhcyBmaWx0ZXIgZmllbGRcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcgSW5zdGFuY2Ugb2YgcHJvcGVydHkgYmFnIGZyb20gRmxleCBBUElcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50IEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZy5tb2RpZmllciBNb2RpZmllciBmcm9tIEZsZXggQVBJXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcHJvbWlzZVxuICovXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLmFkZENvbmRpdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIChcblx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0c1Byb3BlcnR5SW5mb05hbWU6IHN0cmluZyxcblx0bVByb3BlcnR5QmFnOiB7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50OyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllciB9XG4pOiBQcm9taXNlPHZvaWQgfCBudWxsPiB7XG5cdGNvbnN0IG1vZGlmaWVyID0gbVByb3BlcnR5QmFnLm1vZGlmaWVyO1xuXHRjb25zdCBpc1hNTCA9IG1vZGlmaWVyICYmIG1vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiO1xuXHRpZiAoaXNYTUwpIHtcblx0XHRjb25zdCBtb2RlbCA9IG1Qcm9wZXJ0eUJhZyAmJiBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50ICYmIG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbW9kZWwgJiYgbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKCFvTWV0YU1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblx0XHRhd2FpdCBfYWRkUHJvcGVydHlJbmZvKG9QYXJlbnRDb250cm9sLCBtUHJvcGVydHlCYWcsIG9NZXRhTW9kZWwsIHNQcm9wZXJ0eUluZm9OYW1lKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuXG4vKipcbiAqIE1ldGhvZCByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgZmlsdGVyIGZpZWxkIGluIHN0YW5kYWxvbmUgLyBwZXJzb25hbGl6YXRpb24gZmlsdGVyIGJhci5cbiAqIEBwYXJhbSBvUGFyZW50Q29udHJvbCBQYXJlbnQgY29udHJvbCBpbnN0YW5jZSBmcm9tIHdoaWNoIHRoZSBmaWx0ZXIgZmllbGQgaXMgcmVtb3ZlZFxuICogQHBhcmFtIHNQcm9wZXJ0eUluZm9OYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHJlbW92ZWQgYXMgZmlsdGVyIGZpZWxkXG4gKiBAcGFyYW0gbVByb3BlcnR5QmFnIEluc3RhbmNlIG9mIHByb3BlcnR5IGJhZyBmcm9tIEZsZXggQVBJXG4gKiBAcGFyYW0gbVByb3BlcnR5QmFnLmFwcENvbXBvbmVudCBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcubW9kaWZpZXIgTW9kaWZpZXIgZnJvbSBGbGV4IEFQSVxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIHByb21pc2VcbiAqL1xuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5yZW1vdmVDb25kaXRpb24gPSBhc3luYyBmdW5jdGlvbiAoXG5cdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdHNQcm9wZXJ0eUluZm9OYW1lOiBzdHJpbmcsXG5cdG1Qcm9wZXJ0eUJhZzoge1xuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRcdG1vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyO1xuXHR9XG4pOiBQcm9taXNlPHZvaWQgfCBudWxsPiB7XG5cdGNvbnN0IG1vZGlmaWVyID0gbVByb3BlcnR5QmFnLm1vZGlmaWVyO1xuXHRjb25zdCBpc1hNTCA9IG1vZGlmaWVyICYmIG1vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiO1xuXHRpZiAoaXNYTUwpIHtcblx0XHRjb25zdCBwcm9wZXJ0eUluZm9Gcm9tQ0QgPSBhd2FpdCBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllcjxzdHJpbmc+KFxuXHRcdFx0b1BhcmVudENvbnRyb2wsXG5cdFx0XHRcInNhcF9mZV9GaWx0ZXJCYXJEZWxlZ2F0ZV9wcm9wZXJ0eUluZm9NYXBcIixcblx0XHRcdG1vZGlmaWVyXG5cdFx0KTtcblx0XHRpZiAoIXByb3BlcnR5SW5mb0Zyb21DRCkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBtUHJvcGVydHlCYWcgJiYgbVByb3BlcnR5QmFnLmFwcENvbXBvbmVudCAmJiBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gbW9kZWwgJiYgbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRpZiAoIW9NZXRhTW9kZWwpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IF9hZGRQcm9wZXJ0eUluZm8ob1BhcmVudENvbnRyb2wsIG1Qcm9wZXJ0eUJhZywgb01ldGFNb2RlbCwgc1Byb3BlcnR5SW5mb05hbWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuLyoqXG4gKiBDbGVhcnMgYWxsIGlucHV0IHZhbHVlcyBvZiB2aXNpYmxlIGZpbHRlciBmaWVsZHMgaW4gdGhlIGZpbHRlciBiYXIuXG4gKiBAcGFyYW0gb0ZpbHRlckNvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIEZpbHRlckJhciBjb250cm9sXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcHJvbWlzZVxuICovXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLmNsZWFyRmlsdGVycyA9IGFzeW5jIGZ1bmN0aW9uIChvRmlsdGVyQ29udHJvbDogRmlsdGVyQmFyKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGZpbHRlckJhckFQSSA9IG9GaWx0ZXJDb250cm9sLmdldFBhcmVudCgpO1xuXHRyZXR1cm4gU3RhdGVIZWxwZXIuY2xlYXJGaWx0ZXJWYWx1ZXMoZmlsdGVyQmFyQVBJIGFzIE1hY3JvQVBJKTtcbn07XG4vKipcbiAqIENyZWF0ZXMgdGhlIGZpbHRlciBmaWVsZCBpbiB0aGUgdGFibGUgYWRhcHRhdGlvbiBvZiB0aGUgRmlsdGVyQmFyLlxuICogQHBhcmFtIHNQcm9wZXJ0eUluZm9OYW1lIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBlbnRpdHkgdHlwZSBmb3Igd2hpY2ggdGhlIGZpbHRlciBmaWVsZCBuZWVkcyB0byBiZSBjcmVhdGVkXG4gKiBAcGFyYW0gb1BhcmVudENvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcmV0dXJucyBPbmNlIHJlc29sdmVkLCBhIGZpbHRlciBmaWVsZCBkZWZpbml0aW9uIGlzIHJldHVybmVkXG4gKi9cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2FkZFAxM25JdGVtID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRzUHJvcGVydHlJbmZvTmFtZTogc3RyaW5nLFxuXHRvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyXG4pOiBQcm9taXNlPE51bGxhYmxlTW9kaWZpZXJFbGVtZW50PiB7XG5cdHJldHVybiBEZWxlZ2F0ZVV0aWwuZmV0Y2hNb2RlbChvUGFyZW50Q29udHJvbClcblx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAob01vZGVsOiBNb2RlbCkge1xuXHRcdFx0cmV0dXJuIE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2FkZEZsZXhJdGVtKFxuXHRcdFx0XHRzUHJvcGVydHlJbmZvTmFtZSxcblx0XHRcdFx0b1BhcmVudENvbnRyb2wsXG5cdFx0XHRcdG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHQpO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIk1vZGVsIGNvdWxkIG5vdCBiZSByZXNvbHZlZFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0pO1xufTtcbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuZmV0Y2hQcm9wZXJ0aWVzRm9yRW50aXR5ID0gZnVuY3Rpb24gKFxuXHRzRW50aXR5VHlwZVBhdGg6IHN0cmluZyxcblx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdG9GaWx0ZXJDb250cm9sOiBJRmlsdGVyQ29udHJvbFxuKTogUHJvcGVydHlJbmZvW10ge1xuXHRjb25zdCBvRW50aXR5VHlwZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlUeXBlUGF0aCk7XG5cdGNvbnN0IGluY2x1ZGVIaWRkZW4gPSBvRmlsdGVyQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLnZhbHVlaGVscC5GaWx0ZXJCYXJcIikgPyB0cnVlIDogdW5kZWZpbmVkO1xuXHRpZiAoIW9GaWx0ZXJDb250cm9sIHx8ICFvRW50aXR5VHlwZSkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRjb25zdCBvQ29udmVydGVyQ29udGV4dCA9IEZpbHRlclV0aWxzLmNyZWF0ZUNvbnZlcnRlckNvbnRleHQob0ZpbHRlckNvbnRyb2wsIHNFbnRpdHlUeXBlUGF0aCk7XG5cdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzRW50aXR5VHlwZVBhdGgpO1xuXG5cdGNvbnN0IG1GaWx0ZXJGaWVsZHMgPSBGaWx0ZXJVdGlscy5nZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMoXG5cdFx0b0ZpbHRlckNvbnRyb2wsXG5cdFx0c0VudGl0eVR5cGVQYXRoLFxuXHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0b01ldGFNb2RlbCxcblx0XHRDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob0ZpbHRlckNvbnRyb2wpXG5cdCk7XG5cdGxldCBhRmV0Y2hlZFByb3BlcnRpZXM6IEZFUHJvcGVydHlJbmZvW10gPSBbXTtcblx0bUZpbHRlckZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChvRmlsdGVyRmllbGRJbmZvOiBGaWx0ZXJGaWVsZCkge1xuXHRcdGNvbnN0IHNBbm5vdGF0aW9uUGF0aCA9IG9GaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGg7XG5cdFx0aWYgKHNBbm5vdGF0aW9uUGF0aCAmJiAhb0ZpbHRlckZpZWxkSW5mby50ZW1wbGF0ZSkge1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5QW5ub3RhdGlvbnMgPSBvQ29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLnJlc29sdmVQYXRoPFByb3BlcnR5PihzQW5ub3RhdGlvblBhdGgpLnRhcmdldDtcblx0XHRcdGNvbnN0IHNUYXJnZXRQcm9wZXJ0eVByZWZpeCA9IENvbW1vbkhlbHBlci5nZXRMb2NhdGlvbkZvclByb3BlcnR5UGF0aChvTWV0YU1vZGVsLCBzQW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gc0Fubm90YXRpb25QYXRoLnJlcGxhY2UoYCR7c1RhcmdldFByb3BlcnR5UHJlZml4fS9gLCBcIlwiKTtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBvQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZHMgPSBlbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uU2VsZWN0aW9uRmllbGRzO1xuXHRcdFx0Y29uc3QgZmlsdGVyRmFjZXRzID0gZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkZpbHRlckZhY2V0cztcblx0XHRcdGlmIChcblx0XHRcdFx0b1Byb3BlcnR5QW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0T0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5faXNGaWx0ZXJBZGFwdGFibGUob0ZpbHRlckZpZWxkSW5mbywgb1Byb3BlcnR5QW5ub3RhdGlvbnMsIHNlbGVjdGlvbkZpZWxkcywgZmlsdGVyRmFjZXRzKSAmJlxuXHRcdFx0XHRpc1Byb3BlcnR5RmlsdGVyYWJsZShvTWV0YU1vZGVsLCBzVGFyZ2V0UHJvcGVydHlQcmVmaXgsIF9nZXRQcm9wZXJ0eVBhdGgoc1Byb3BlcnR5KSwgdHJ1ZSlcblx0XHRcdCkge1xuXHRcdFx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChvRmlsdGVyRmllbGRJbmZvIGFzIFByb3BlcnR5SW5mbyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vQ3VzdG9tIEZpbHRlcnNcblx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKG9GaWx0ZXJGaWVsZEluZm8gYXMgUHJvcGVydHlJbmZvKTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0IGFQYXJhbWV0ZXJGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IHByb2Nlc3NlZEZpZWxkcyA9IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMoYUZldGNoZWRQcm9wZXJ0aWVzIGFzIEZpbHRlckZpZWxkW10sIG9Db252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgcHJvY2Vzc2VkRmllbGRzS2V5czogc3RyaW5nW10gPSBbXTtcblx0cHJvY2Vzc2VkRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wczogRkVQcm9wZXJ0eUluZm8pIHtcblx0XHRpZiAob1Byb3BzLmtleSkge1xuXHRcdFx0cHJvY2Vzc2VkRmllbGRzS2V5cy5wdXNoKG9Qcm9wcy5rZXkpO1xuXHRcdH1cblx0fSk7XG5cblx0YUZldGNoZWRQcm9wZXJ0aWVzID0gYUZldGNoZWRQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAob1Byb3A6IEZFUHJvcGVydHlJbmZvKSB7XG5cdFx0cmV0dXJuIHByb2Nlc3NlZEZpZWxkc0tleXMuaW5jbHVkZXMob1Byb3Aua2V5ISk7XG5cdH0pO1xuXG5cdGNvbnN0IG9GUiA9IENvbW1vblV0aWxzLmdldEZpbHRlclJlc3RyaWN0aW9uc0J5UGF0aChzRW50aXR5U2V0UGF0aCwgb01ldGFNb2RlbCksXG5cdFx0bUFsbG93ZWRFeHByZXNzaW9ucyA9IG9GUi5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM7XG5cdC8vT2JqZWN0LmtleXMocHJvY2Vzc2VkRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzRmlsdGVyRmllbGRLZXk6IHN0cmluZykge1xuXHRwcm9jZXNzZWRGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAob1Byb3AsIGlGaWx0ZXJGaWVsZEluZGV4OiBudW1iZXIpIHtcblx0XHRjb25zdCBvU2VsRmllbGQgPSBhRmV0Y2hlZFByb3BlcnRpZXNbaUZpbHRlckZpZWxkSW5kZXhdO1xuXHRcdGlmICghb1NlbEZpZWxkIHx8ICFvU2VsRmllbGQuY29uZGl0aW9uUGF0aCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gX2dldFByb3BlcnR5UGF0aChvU2VsRmllbGQuY29uZGl0aW9uUGF0aCk7XG5cdFx0Ly9mZXRjaEJhc2ljXG5cdFx0b1Byb3AgPSBPYmplY3QuYXNzaWduKG9Qcm9wLCB7XG5cdFx0XHRncm91cDogb1NlbEZpZWxkLmdyb3VwLFxuXHRcdFx0Z3JvdXBMYWJlbDogb1NlbEZpZWxkLmdyb3VwTGFiZWwsXG5cdFx0XHRwYXRoOiBvU2VsRmllbGQuY29uZGl0aW9uUGF0aCxcblx0XHRcdHRvb2x0aXA6IG51bGwsXG5cdFx0XHRyZW1vdmVGcm9tQXBwU3RhdGU6IGZhbHNlLFxuXHRcdFx0aGFzVmFsdWVIZWxwOiBmYWxzZVxuXHRcdH0pO1xuXG5cdFx0Ly9mZXRjaFByb3BJbmZvXG5cdFx0aWYgKG9TZWxGaWVsZC5hbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0Y29uc3Qgc0Fubm90YXRpb25QYXRoID0gb1NlbEZpZWxkLmFubm90YXRpb25QYXRoO1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0Fubm90YXRpb25QYXRoKSxcblx0XHRcdFx0b1Byb3BlcnR5QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQW5ub3RhdGlvblBhdGh9QGApLFxuXHRcdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQW5ub3RhdGlvblBhdGgpO1xuXG5cdFx0XHRjb25zdCBiUmVtb3ZlRnJvbUFwcFN0YXRlID1cblx0XHRcdFx0b1Byb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmVcIl0gfHxcblx0XHRcdFx0b1Byb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiXSB8fFxuXHRcdFx0XHRvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiXTtcblxuXHRcdFx0Y29uc3Qgc1RhcmdldFByb3BlcnR5UHJlZml4ID0gQ29tbW9uSGVscGVyLmdldExvY2F0aW9uRm9yUHJvcGVydHlQYXRoKG9NZXRhTW9kZWwsIG9TZWxGaWVsZC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRjb25zdCBzUHJvcGVydHkgPSBzQW5ub3RhdGlvblBhdGgucmVwbGFjZShgJHtzVGFyZ2V0UHJvcGVydHlQcmVmaXh9L2AsIFwiXCIpO1xuXHRcdFx0bGV0IG9GaWx0ZXJEZWZhdWx0VmFsdWVBbm5vdGF0aW9uO1xuXHRcdFx0bGV0IG9GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRpZiAob1Byb3BlcnR5Q29udGV4dCAmJiBpc1Byb3BlcnR5RmlsdGVyYWJsZShvTWV0YU1vZGVsLCBzVGFyZ2V0UHJvcGVydHlQcmVmaXgsIF9nZXRQcm9wZXJ0eVBhdGgoc1Byb3BlcnR5KSwgdHJ1ZSkpIHtcblx0XHRcdFx0b0ZpbHRlckRlZmF1bHRWYWx1ZUFubm90YXRpb24gPSBvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRGVmYXVsdFZhbHVlXCJdO1xuXHRcdFx0XHRpZiAob0ZpbHRlckRlZmF1bHRWYWx1ZUFubm90YXRpb24pIHtcblx0XHRcdFx0XHRvRmlsdGVyRGVmYXVsdFZhbHVlID0gb0ZpbHRlckRlZmF1bHRWYWx1ZUFubm90YXRpb25bYCQke2dldE1vZGVsVHlwZShvUHJvcGVydHkuJFR5cGUpfWBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b1Byb3AgPSBPYmplY3QuYXNzaWduKG9Qcm9wLCB7XG5cdFx0XHRcdFx0dG9vbHRpcDogb1Byb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlF1aWNrSW5mb1wiXSB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0cmVtb3ZlRnJvbUFwcFN0YXRlOiBiUmVtb3ZlRnJvbUFwcFN0YXRlLFxuXHRcdFx0XHRcdGhhc1ZhbHVlSGVscDogaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eUNvbnRleHQuZ2V0T2JqZWN0KCksIHsgY29udGV4dDogb1Byb3BlcnR5Q29udGV4dCB9KSxcblx0XHRcdFx0XHRkZWZhdWx0RmlsdGVyQ29uZGl0aW9uczogb0ZpbHRlckRlZmF1bHRWYWx1ZVxuXHRcdFx0XHRcdFx0PyBbXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRQYXRoOiBvU2VsRmllbGQuY29uZGl0aW9uUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZXM6IFtvRmlsdGVyRGVmYXVsdFZhbHVlXVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCAgXVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly9iYXNlXG5cblx0XHRpZiAob1Byb3ApIHtcblx0XHRcdGlmIChtQWxsb3dlZEV4cHJlc3Npb25zW3NQcm9wZXJ0eVBhdGhdICYmIG1BbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5UGF0aF0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRvUHJvcC5maWx0ZXJFeHByZXNzaW9uID0gQ29tbW9uVXRpbHMuZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihtQWxsb3dlZEV4cHJlc3Npb25zW3NQcm9wZXJ0eVBhdGhdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Qcm9wLmZpbHRlckV4cHJlc3Npb24gPSBcImF1dG9cIjtcblx0XHRcdH1cblxuXHRcdFx0b1Byb3AgPSBPYmplY3QuYXNzaWduKG9Qcm9wLCB7XG5cdFx0XHRcdHZpc2libGU6IG9TZWxGaWVsZC5hdmFpbGFiaWxpdHkgPT09IFwiRGVmYXVsdFwiXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRwcm9jZXNzZWRGaWVsZHNbaUZpbHRlckZpZWxkSW5kZXhdID0gb1Byb3A7XG5cdH0pO1xuXHRwcm9jZXNzZWRGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcEluZm86IEZFUHJvcGVydHlJbmZvKSB7XG5cdFx0Ly8ga2V5IHNob3VsZCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIG5hbWVcblx0XHRwcm9wSW5mby5rZXkgPSBwcm9wSW5mby5uYW1lO1xuXHRcdGlmIChwcm9wSW5mby5wYXRoID09PSBcIiRlZGl0U3RhdGVcIikge1xuXHRcdFx0cHJvcEluZm8ubGFiZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9GaWx0ZXJDb250cm9sKS5nZXRUZXh0KFwiRklMVEVSQkFSX0VESVRJTkdfU1RBVFVTXCIpO1xuXHRcdH1cblx0XHRwcm9wSW5mby50eXBlQ29uZmlnID0gVHlwZU1hcC5nZXRUeXBlQ29uZmlnKHByb3BJbmZvLmRhdGFUeXBlLCBwcm9wSW5mby5mb3JtYXRPcHRpb25zLCBwcm9wSW5mby5jb25zdHJhaW50cyk7XG5cdFx0cHJvcEluZm8ubGFiZWwgPSBnZXRMb2NhbGl6ZWRUZXh0KHByb3BJbmZvLmxhYmVsISwgb0ZpbHRlckNvbnRyb2wpIHx8IFwiXCI7XG5cdFx0aWYgKHByb3BJbmZvLmlzUGFyYW1ldGVyKSB7XG5cdFx0XHRhUGFyYW1ldGVyRmllbGRzLnB1c2gocHJvcEluZm8ubmFtZSk7XG5cdFx0fVxuXHR9KTtcblxuXHRhRmV0Y2hlZFByb3BlcnRpZXMgPSBwcm9jZXNzZWRGaWVsZHM7XG5cdERlbGVnYXRlVXRpbC5zZXRDdXN0b21EYXRhKG9GaWx0ZXJDb250cm9sLCBcInBhcmFtZXRlcnNcIiwgYVBhcmFtZXRlckZpZWxkcyBhcyB1bmtub3duIGFzIHN0cmluZyk7XG5cblx0cmV0dXJuIGFGZXRjaGVkUHJvcGVydGllcyBhcyBQcm9wZXJ0eUluZm9bXTtcbn07XG5cbmZ1bmN0aW9uIGdldExpbmVJdGVtUXVhbGlmaWVyRnJvbVRhYmxlKG9Db250cm9sOiBNYW5hZ2VkT2JqZWN0LCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChvQ29udHJvbC5pc0E8RW5oYW5jZVdpdGhVSTU8VGFibGVBUEk+PihcInNhcC5mZS5tYWNyb3MudGFibGUuVGFibGVBUElcIikpIHtcblx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aHMgPSBvQ29udHJvbC5nZXRNZXRhUGF0aCgpLnNwbGl0KFwiI1wiKVswXS5zcGxpdChcIi9cIik7XG5cdFx0c3dpdGNoIChhbm5vdGF0aW9uUGF0aHNbYW5ub3RhdGlvblBhdGhzLmxlbmd0aCAtIDFdKSB7XG5cdFx0XHRjYXNlIGBAJHtVSUFubm90YXRpb25UZXJtcy5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50fWA6XG5cdFx0XHRjYXNlIGBAJHtVSUFubm90YXRpb25UZXJtcy5QcmVzZW50YXRpb25WYXJpYW50fWA6XG5cdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0LmdldE9iamVjdChvQ29udHJvbC5nZXRNZXRhUGF0aCgpKVxuXHRcdFx0XHRcdC5WaXN1YWxpemF0aW9ucz8uZmluZCgodmlzdWFsaXphdGlvbjogeyAkQW5ub3RhdGlvblBhdGg6IHN0cmluZyB9KSA9PlxuXHRcdFx0XHRcdFx0dmlzdWFsaXphdGlvbi4kQW5ub3RhdGlvblBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLkxpbmVJdGVtfWApXG5cdFx0XHRcdFx0KS4kQW5ub3RhdGlvblBhdGg7XG5cdFx0XHRjYXNlIGBAJHtVSUFubm90YXRpb25UZXJtcy5MaW5lSXRlbX1gOlxuXHRcdFx0XHRjb25zdCBtZXRhUGF0aHMgPSBvQ29udHJvbC5nZXRNZXRhUGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0cmV0dXJuIG1ldGFQYXRoc1ttZXRhUGF0aHMubGVuZ3RoIC0gMV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2lzRmlsdGVyQWRhcHRhYmxlID0gZnVuY3Rpb24gKFxuXHRmaWx0ZXJGaWVsZEluZm86IEZpbHRlckZpZWxkLFxuXHRwcm9wZXJ0eUFubm90YXRpb25zOiBQcm9wZXJ0eSxcblx0c2VsZWN0aW9uRmllbGRzPzogU2VsZWN0aW9uRmllbGRzLFxuXHRmaWx0ZXJGYWNldHM/OiBGaWx0ZXJGYWNldHNcbik6IGJvb2xlYW4ge1xuXHRsZXQgaXNJbkZpbHRlckZhY2V0czogYm9vbGVhbjtcblx0Y29uc3QgaXNTZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkcyA/IE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2lzRmlsdGVySW5TZWxlY3Rpb25GaWVsZHMoc2VsZWN0aW9uRmllbGRzLCBmaWx0ZXJGaWVsZEluZm8pIDogZmFsc2U7XG5cdGlmIChmaWx0ZXJGYWNldHMpIHtcblx0XHRpc0luRmlsdGVyRmFjZXRzID0gZmlsdGVyRmFjZXRzLnNvbWUoZnVuY3Rpb24gKGZpbHRlckZhY2V0OiBSZWZlcmVuY2VGYWNldCkge1xuXHRcdFx0Y29uc3QgZmllbGRHcm91cCA9IGZpbHRlckZhY2V0LlRhcmdldD8uJHRhcmdldCBhcyBGaWVsZEdyb3VwVHlwZTtcblx0XHRcdHJldHVybiBmaWVsZEdyb3VwPy5EYXRhLnNvbWUoZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykge1xuXHRcdFx0XHQvLyB3ZSBleHBlY3QgZGF0YUZpZWxkIHRvIGJlIERhdGFGaWVsZFR5cGVzIChoYXZpbmcgYSBWYWx1ZSkgaW5zaWRlIEZpZWxkR3JvdXBzIGluc2lkZSBGaWx0ZXJGYWNldHNcblx0XHRcdFx0aWYgKChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlLnBhdGggPT09IGZpbHRlckZpZWxkSW5mby5rZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBkYXRhRmllbGQgdHlwZXMgaGF2aW5nIG5vIFZhbHVlIChEYXRhRmllbGRGb3JBbm5vdGF0aW9uVHlwZXMsIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMsIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwVHlwZXMpLCB0aGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrLCBidXQgdGhpcyBzaG91bGQgbm90IG9jY3VyIGFueXdheVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRpc0luRmlsdGVyRmFjZXRzID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGlzU2VsZWN0aW9uRmllbGQgfHwgaXNJbkZpbHRlckZhY2V0cyB8fCAhcHJvcGVydHlBbm5vdGF0aW9ucy5hbm5vdGF0aW9ucz8uVUk/LkFkYXB0YXRpb25IaWRkZW47XG59O1xuXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLl9pc0ZpbHRlckluU2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24gKHNlbGVjdGlvbkZpZWxkczogU2VsZWN0aW9uRmllbGRzLCBmaWx0ZXJGaWVsZEluZm86IEZpbHRlckZpZWxkKTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpbHRlckZpZWxkS2V5ID0gZmlsdGVyRmllbGRJbmZvLmtleT8uaW5kZXhPZihcIjo6XCIpID4gMCA/IGZpbHRlckZpZWxkSW5mby5rZXk/LnJlcGxhY2UoXCI6OlwiLCBcIi9cIikgOiBmaWx0ZXJGaWVsZEluZm8ua2V5O1xuXHRyZXR1cm4gc2VsZWN0aW9uRmllbGRzLnNvbWUoZnVuY3Rpb24gKHNlbGVjdGlvbkZpZWxkOiBBbm5vdGF0aW9uU2VsZWN0aW9uRmllbGQpIHtcblx0XHRpZiAoc2VsZWN0aW9uRmllbGQudmFsdWUgPT09IGZpbHRlckZpZWxkS2V5KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn07XG5cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2FkZEZsZXhJdGVtID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRzRmxleFByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyLFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0b01vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyIHwgdW5kZWZpbmVkLFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgfCB1bmRlZmluZWQsXG5cdHZpZXc/OiBWaWV3IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPE51bGxhYmxlTW9kaWZpZXJFbGVtZW50PiB7XG5cdGNvbnN0IHNGaWx0ZXJCYXJJZCA9IG9Nb2RpZmllciA/IG9Nb2RpZmllci5nZXRJZChvUGFyZW50Q29udHJvbCkgOiBvUGFyZW50Q29udHJvbC5nZXRJZCgpLFxuXHRcdHNJZFByZWZpeCA9IG9Nb2RpZmllciA/IFwiXCIgOiBcIkFkYXB0YXRpb25cIixcblx0XHRhU2VsZWN0aW9uRmllbGRzID0gRmlsdGVyVXRpbHMuZ2V0Q29udmVydGVkRmlsdGVyRmllbGRzKFxuXHRcdFx0b1BhcmVudENvbnRyb2wgYXMgdW5rbm93biBhcyBJRmlsdGVyQ29udHJvbCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0b01vZGlmaWVyLFxuXHRcdFx0b01vZGlmaWVyID8gdW5kZWZpbmVkIDogZ2V0TGluZUl0ZW1RdWFsaWZpZXJGcm9tVGFibGUob1BhcmVudENvbnRyb2wuZ2V0UGFyZW50KCkhLCBvTWV0YU1vZGVsKVxuXHRcdCksXG5cdFx0b1NlbGVjdGlvbkZpZWxkID0gT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5fZmluZFNlbGVjdGlvbkZpZWxkKGFTZWxlY3Rpb25GaWVsZHMsIHNGbGV4UHJvcGVydHlOYW1lKSxcblx0XHRzUHJvcGVydHlQYXRoID0gX2dldFByb3BlcnR5UGF0aChzRmxleFByb3BlcnR5TmFtZSksXG5cdFx0YklzWE1MID0gISFvTW9kaWZpZXIgJiYgb01vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiO1xuXHRpZiAoc0ZsZXhQcm9wZXJ0eU5hbWUgPT09IEVESVRfU1RBVEVfUFJPUEVSVFlfTkFNRSkge1xuXHRcdHJldHVybiBfdGVtcGxhdGVFZGl0U3RhdGUoX2dlbmVyYXRlSWRQcmVmaXgoc0ZpbHRlckJhcklkLCBgJHtzSWRQcmVmaXh9RmlsdGVyRmllbGRgKSwgb01ldGFNb2RlbCwgb01vZGlmaWVyKTtcblx0fSBlbHNlIGlmIChzRmxleFByb3BlcnR5TmFtZSA9PT0gU0VBUkNIX1BST1BFUlRZX05BTUUpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHR9IGVsc2UgaWYgKG9TZWxlY3Rpb25GaWVsZD8udGVtcGxhdGUpIHtcblx0XHRyZXR1cm4gT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5fdGVtcGxhdGVDdXN0b21GaWx0ZXIoXG5cdFx0XHRvUGFyZW50Q29udHJvbCBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sLFxuXHRcdFx0X2dlbmVyYXRlSWRQcmVmaXgoc0ZpbHRlckJhcklkLCBgJHtzSWRQcmVmaXh9YCksXG5cdFx0XHRvU2VsZWN0aW9uRmllbGQsXG5cdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0b01vZGlmaWVyIVxuXHRcdCk7XG5cdH1cblxuXHRpZiAob1NlbGVjdGlvbkZpZWxkPy50eXBlID09PSBcIlNsb3RcIiAmJiBvTW9kaWZpZXIpIHtcblx0XHRyZXR1cm4gX2FkZFhNTEN1c3RvbUZpbHRlckZpZWxkKG9QYXJlbnRDb250cm9sIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wsIG9Nb2RpZmllciwgc1Byb3BlcnR5UGF0aCk7XG5cdH1cblxuXHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBDb21tb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdGxldCBzRW50aXR5VHlwZVBhdGg6IHN0cmluZztcblx0bGV0IHNVc2VTZW1hbnRpY0RhdGVSYW5nZTtcblx0bGV0IG9TZXR0aW5nczoge1xuXHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0Y29udGV4dFBhdGg6IENvbnRleHQ7XG5cdFx0XHRwcm9wZXJ0eTogQ29udGV4dDtcblx0XHR9O1xuXHRcdG1vZGVsczoge1xuXHRcdFx0Y29udGV4dFBhdGg6IE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0cHJvcGVydHk/OiBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdG1ldGFQYXRoPzogT0RhdGFNZXRhTW9kZWw7XG5cdFx0fTtcblx0XHRpc1hNTDogYm9vbGVhbjtcblx0fTtcblx0bGV0IHNCaW5kaW5nUGF0aDtcblx0bGV0IG9QYXJhbWV0ZXJzOiB7XG5cdFx0bWV0YVBhdGg6IHN0cmluZztcblx0XHRzUHJvcGVydHlOYW1lOiBzdHJpbmc7XG5cdFx0c0JpbmRpbmdQYXRoOiBzdHJpbmc7XG5cdFx0c1ZhbHVlSGVscFR5cGU6IHN0cmluZztcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbDtcblx0XHRzSWRQcmVmaXg6IHN0cmluZztcblx0XHRvU2V0dGluZ3M6IHVua25vd247XG5cdFx0c1ZoSWRQcmVmaXg6IHN0cmluZztcblx0XHRzTmF2aWdhdGlvblByZWZpeD86IHN0cmluZztcblx0XHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U6IGJvb2xlYW47XG5cdFx0b01vZGlmaWVyPzogQmFzZVRyZWVNb2RpZmllcjtcblx0XHRvQ29udHJvbDogVUk1RWxlbWVudDtcblx0XHR2aXN1YWxGaWx0ZXI/OiB1bmtub3duO1xuXHRcdHZpZXc/OiBWaWV3O1xuXHRcdGxhYmVsPzogc3RyaW5nO1xuXHR9O1xuXG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuXHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChvU2VsZWN0aW9uRmllbGQ/LmlzUGFyYW1ldGVyKSB7XG5cdFx0XHRcdGNvbnN0IHNBbm5vdGF0aW9uUGF0aCA9IG9TZWxlY3Rpb25GaWVsZC5hbm5vdGF0aW9uUGF0aDtcblx0XHRcdFx0cmV0dXJuIHNBbm5vdGF0aW9uUGF0aC5zdWJzdHJpbmcoMCwgc0Fubm90YXRpb25QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhV2l0aE1vZGlmaWVyPHN0cmluZz4ob1BhcmVudENvbnRyb2wsIFwiZW50aXR5VHlwZVwiLCBvTW9kaWZpZXIpO1xuXHRcdH0pXG5cdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKHNSZXRyaWV2ZWRFbnRpdHlUeXBlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRzRW50aXR5VHlwZVBhdGggPSBzUmV0cmlldmVkRW50aXR5VHlwZVBhdGghO1xuXHRcdFx0cmV0dXJuIERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhV2l0aE1vZGlmaWVyPHN0cmluZz4ob1BhcmVudENvbnRyb2wsIFwidXNlU2VtYW50aWNEYXRlUmFuZ2VcIiwgb01vZGlmaWVyKTtcblx0XHR9KVxuXHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChzUmV0cmlldmVkVXNlU2VtYW50aWNEYXRlUmFuZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdFx0c1VzZVNlbWFudGljRGF0ZVJhbmdlID0gc1JldHJpZXZlZFVzZVNlbWFudGljRGF0ZVJhbmdlO1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5Q29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVR5cGVQYXRoICsgc1Byb3BlcnR5UGF0aCkhO1xuXHRcdFx0bGV0IHNJbkZpbHRlckJhcklkID0gb01vZGlmaWVyID8gb01vZGlmaWVyLmdldElkKG9QYXJlbnRDb250cm9sKSA6IG9QYXJlbnRDb250cm9sLmdldElkKCk7XG5cdFx0XHRpZiAoc0luRmlsdGVyQmFySWQuZW5kc1dpdGgoXCItY29udGVudFwiKSkge1xuXHRcdFx0XHQvLyAtY29udGVudCBpcyBvbmx5IGFkZGVkIHdoZW4gdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgZGlyZWN0bHkgaW4gdGhlIGZpbHRlciBiYXJcblx0XHRcdFx0c0luRmlsdGVyQmFySWQgPSBzSW5GaWx0ZXJCYXJJZC5zdWJzdHJpbmcoMCwgc0luRmlsdGVyQmFySWQubGFzdEluZGV4T2YoXCItY29udGVudFwiKSk7XG5cdFx0XHRcdC8vIEJ5IHVzaW5nIHRoZSBpZCBvZiB0aGUgcGFyZW50IGNvbnRyb2wsIHdlIGNhbiBnZXQgdGhlIGNvcnJlY3QgaWRQcmVmaXggZm9yIHRoZSB2YWx1ZSBoZWxwXG5cdFx0XHR9XG5cdFx0XHRvU2V0dGluZ3MgPSB7XG5cdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlUeXBlUGF0aCkhLFxuXHRcdFx0XHRcdHByb3BlcnR5OiBvUHJvcGVydHlDb250ZXh0XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdHByb3BlcnR5OiBvTWV0YU1vZGVsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGlzWE1MOiBiSXNYTUxcblx0XHRcdH07XG5cdFx0XHRzQmluZGluZ1BhdGggPSBgLyR7TW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzRW50aXR5VHlwZVBhdGgpXG5cdFx0XHRcdC5zcGxpdChcIi9cIilcblx0XHRcdFx0LmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZylcblx0XHRcdFx0LmpvaW4oXCIvXCIpfWA7XG5cdFx0XHRvUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0bWV0YVBhdGg6IG9Qcm9wZXJ0eUNvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRzUHJvcGVydHlOYW1lOiBzUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRzQmluZGluZ1BhdGg6IHNCaW5kaW5nUGF0aCxcblx0XHRcdFx0c1ZhbHVlSGVscFR5cGU6IHNJZFByZWZpeCArIFZBTFVFX0hFTFBfVFlQRSxcblx0XHRcdFx0b0NvbnRyb2w6IG9QYXJlbnRDb250cm9sLFxuXHRcdFx0XHRvTWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRvTW9kaWZpZXI6IG9Nb2RpZmllcixcblx0XHRcdFx0c0lkUHJlZml4OiBfZ2VuZXJhdGVJZFByZWZpeChzSW5GaWx0ZXJCYXJJZCwgYCR7c0lkUHJlZml4fUZpbHRlckZpZWxkYCwgc05hdmlnYXRpb25QYXRoKSxcblx0XHRcdFx0c1ZoSWRQcmVmaXg6IF9nZW5lcmF0ZUlkUHJlZml4KHNJbkZpbHRlckJhcklkLCBzSWRQcmVmaXggKyBWQUxVRV9IRUxQX1RZUEUpLFxuXHRcdFx0XHRzTmF2aWdhdGlvblByZWZpeDogc05hdmlnYXRpb25QYXRoLFxuXHRcdFx0XHRiVXNlU2VtYW50aWNEYXRlUmFuZ2U6IHNVc2VTZW1hbnRpY0RhdGVSYW5nZSBhcyB1bmtub3duIGFzIGJvb2xlYW4sXG5cdFx0XHRcdG9TZXR0aW5nczogb1NlbGVjdGlvbkZpZWxkPy5zZXR0aW5ncyA/PyB7fSxcblx0XHRcdFx0dmlzdWFsRmlsdGVyOiBvU2VsZWN0aW9uRmllbGQ/LnZpc3VhbEZpbHRlcixcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0bGFiZWw6IG9TZWxlY3Rpb25GaWVsZD8ubGFiZWxcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiBEZWxlZ2F0ZVV0aWwuZG9lc1ZhbHVlSGVscEV4aXN0KG9QYXJhbWV0ZXJzKTtcblx0XHR9KVxuXHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChiVmFsdWVIZWxwRXhpc3RzOiBib29sZWFuKSB7XG5cdFx0XHRpZiAoIWJWYWx1ZUhlbHBFeGlzdHMpIHtcblx0XHRcdFx0cmV0dXJuIF90ZW1wbGF0ZVZhbHVlSGVscChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVR5cGVQYXRoKSEsXG5cdFx0XHRcdFx0XHRcdG1ldGFQYXRoOiBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLnByb3BlcnR5XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRtZXRhUGF0aDogb01ldGFNb2RlbFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGlzWE1MOiBiSXNYTUxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9QYXJhbWV0ZXJzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fSlcblx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXI8c3RyaW5nPihvUGFyZW50Q29udHJvbCwgXCJsb2NhbElkXCIsIG9Nb2RpZmllcik7XG5cdFx0fSlcblx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAobG9jYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRsZXQgcGFnZU1vZGVsO1xuXHRcdFx0aWYgKG9QYXJhbWV0ZXJzLnZpc3VhbEZpbHRlcikge1xuXHRcdFx0XHQvL05lZWQgdG8gc2V0IHRoZSBjb252ZXJ0ZXJjb250ZXh0IGFzIHBhZ2VNb2RlbCBpbiBzZXR0aW5ncyBmb3IgQnVpbGRpbmdCbG9jayAyLjBcblx0XHRcdFx0cGFnZU1vZGVsID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0VmlldyhvUGFyZW50Q29udHJvbCkuZ2V0Q29udHJvbGxlcigpLl9nZXRQYWdlTW9kZWwoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBfdGVtcGxhdGVGaWx0ZXJGaWVsZChvU2V0dGluZ3MsIG9QYXJhbWV0ZXJzLCBsb2NhbElkLCBwYWdlTW9kZWwpO1xuXHRcdH0pO1xufTtcbmZ1bmN0aW9uIF9nZXRDYWNoZWRQcm9wZXJ0aWVzKG9GaWx0ZXJCYXI6IElGaWx0ZXJDb250cm9sIHwgRWxlbWVudCk6IG51bGwgfCBQcm9wZXJ0eUluZm9bXSB8IHVuZGVmaW5lZCB7XG5cdC8vIHByb3BlcnRpZXMgYXJlIG5vdCBjYWNoZWQgZHVyaW5nIHRlbXBsYXRpbmdcblx0aWYgKG9GaWx0ZXJCYXIgaW5zdGFuY2VvZiB3aW5kb3cuRWxlbWVudCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdHJldHVybiBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YTxQcm9wZXJ0eUluZm9bXT4ob0ZpbHRlckJhciwgRkVUQ0hFRF9QUk9QRVJUSUVTX0RBVEFfS0VZKTtcbn1cbmZ1bmN0aW9uIF9zZXRDYWNoZWRQcm9wZXJ0aWVzKG9GaWx0ZXJCYXI6IElGaWx0ZXJDb250cm9sIHwgRWxlbWVudCwgYUZldGNoZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eUluZm9bXSk6IHZvaWQge1xuXHQvLyBkbyBub3QgY2FjaGUgZHVyaW5nIHRlbXBsYXRpbmcsIGVsc2UgaXQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjYWNoZWQgdmlld1xuXHRpZiAob0ZpbHRlckJhciBpbnN0YW5jZW9mIHdpbmRvdy5FbGVtZW50KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdERlbGVnYXRlVXRpbC5zZXRDdXN0b21EYXRhKG9GaWx0ZXJCYXIsIEZFVENIRURfUFJPUEVSVElFU19EQVRBX0tFWSwgYUZldGNoZWRQcm9wZXJ0aWVzIGFzIHVua25vd24gYXMgc3RyaW5nKTtcbn1cbmZ1bmN0aW9uIF9nZXRDYWNoZWRPckZldGNoUHJvcGVydGllc0ZvckVudGl0eShcblx0c0VudGl0eVR5cGVQYXRoOiBzdHJpbmcsXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRvRmlsdGVyQmFyOiBJRmlsdGVyQ29udHJvbFxuKTogQ29udHJvbFByb3BlcnR5SW5mb1tdIHwgUHJvcGVydHlJbmZvRXh0ZXJuYWxbXSB7XG5cdGxldCBhRmV0Y2hlZFByb3BlcnRpZXMgPSBfZ2V0Q2FjaGVkUHJvcGVydGllcyhvRmlsdGVyQmFyKTtcblx0bGV0IGxvY2FsR3JvdXBMYWJlbDtcblxuXHRpZiAoIWFGZXRjaGVkUHJvcGVydGllcykge1xuXHRcdGFGZXRjaGVkUHJvcGVydGllcyA9IE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuZmV0Y2hQcm9wZXJ0aWVzRm9yRW50aXR5KHNFbnRpdHlUeXBlUGF0aCwgb01ldGFNb2RlbCwgb0ZpbHRlckJhcik7XG5cdFx0YUZldGNoZWRQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKG9Hcm91cDogRkVQcm9wZXJ0eUluZm8pIHtcblx0XHRcdGxvY2FsR3JvdXBMYWJlbCA9IG51bGw7XG5cdFx0XHRpZiAob0dyb3VwLmdyb3VwTGFiZWwpIHtcblx0XHRcdFx0bG9jYWxHcm91cExhYmVsID0gZ2V0TG9jYWxpemVkVGV4dChvR3JvdXAuZ3JvdXBMYWJlbCwgb0ZpbHRlckJhcik7XG5cdFx0XHRcdG9Hcm91cC5ncm91cExhYmVsID0gbG9jYWxHcm91cExhYmVsID09PSBudWxsID8gb0dyb3VwLmdyb3VwTGFiZWwgOiBsb2NhbEdyb3VwTGFiZWw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c29ydFByb3BlcnR5SW5mb3NCeUdyb3VwTGFiZWwoYUZldGNoZWRQcm9wZXJ0aWVzKTtcblx0XHRfc2V0Q2FjaGVkUHJvcGVydGllcyhvRmlsdGVyQmFyLCBhRmV0Y2hlZFByb3BlcnRpZXMpO1xuXHR9XG5cdHJldHVybiBhRmV0Y2hlZFByb3BlcnRpZXM7XG59XG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLmZldGNoUHJvcGVydGllcyA9IGFzeW5jIGZ1bmN0aW9uIChmaWx0ZXJCYXI6IEZpbHRlckJhcik6IFByb21pc2U8UHJvcGVydHlJbmZvRXh0ZXJuYWxbXT4ge1xuXHRjb25zdCBwcm9wZXJ0eUluZm9zID0gYXdhaXQgT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5mZXRjaEZpbHRlclByb3BlcnRpZXMoZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHREZWxlZ2F0ZVV0aWwuc2V0Q3VzdG9tRGF0YShmaWx0ZXJCYXIsIFwiZmVGaWx0ZXJJbmZvXCIsIHByb3BlcnR5SW5mb3MpO1xuXHRpZiAocHJvcGVydHlJbmZvcy5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIEZpbHRlclV0aWxzLmZvcm1hdFByb3BlcnR5SW5mbyhwcm9wZXJ0eUluZm9zIGFzIFByb3BlcnR5SW5mb1tdKSBhcyBQcm9wZXJ0eUluZm9FeHRlcm5hbFtdO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBbXTtcblx0fVxufTtcblxuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5mZXRjaEZpbHRlclByb3BlcnRpZXMgPSBhc3luYyBmdW5jdGlvbiAoXG5cdGZpbHRlckJhcjogSUZpbHRlckNvbnRyb2xcbik6IFByb21pc2U8Q29udHJvbFByb3BlcnR5SW5mb1tdIHwgUHJvcGVydHlJbmZvRXh0ZXJuYWxbXT4ge1xuXHRjb25zdCBlbnRpdHlUeXBlUGF0aCA9IERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhPHN0cmluZz4oZmlsdGVyQmFyLCBcImVudGl0eVR5cGVcIikhO1xuXHRyZXR1cm4gRGVsZWdhdGVVdGlsLmZldGNoTW9kZWwoZmlsdGVyQmFyIGFzIEZpbHRlckJhcikudGhlbihmdW5jdGlvbiAobW9kZWw6IE1vZGVsKSB7XG5cdFx0aWYgKCFtb2RlbCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHRyZXR1cm4gX2dldENhY2hlZE9yRmV0Y2hQcm9wZXJ0aWVzRm9yRW50aXR5KGVudGl0eVR5cGVQYXRoLCBtb2RlbC5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCwgZmlsdGVyQmFyKTtcblx0fSk7XG59O1xuXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLmdldFR5cGVNYXAgPSBmdW5jdGlvbiAoKTogdHlwZW9mIFR5cGVNYXAge1xuXHRyZXR1cm4gVHlwZU1hcDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9EYXRhRmlsdGVyQmFyRGVsZWdhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTJEQSxNQUFNQSxzQkFBc0IsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMs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
729
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPRGF0YUZpbHRlckJhckRlbGVnYXRlIiwiT2JqZWN0IiwiYXNzaWduIiwiRmlsdGVyQmFyRGVsZWdhdGUiLCJVT01WYWxpZGF0aW9uRGVsZWdhdGUiLCJhcGlWZXJzaW9uIiwiRURJVF9TVEFURV9QUk9QRVJUWV9OQU1FIiwiU0VBUkNIX1BST1BFUlRZX05BTUUiLCJWQUxVRV9IRUxQX1RZUEUiLCJGRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVkiLCJfdGVtcGxhdGVFZGl0U3RhdGUiLCJzSWRQcmVmaXgiLCJtZXRhTW9kZWwiLCJvTW9kaWZpZXIiLCJvVGhpcyIsIkpTT05Nb2RlbCIsImlkIiwiaXNEcmFmdENvbGxhYm9yYXRpdmUiLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwiYmluZGluZ0NvbnRleHRzIiwidGhpcyIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwiRGVsZWdhdGVVdGlsIiwidGVtcGxhdGVDb250cm9sRnJhZ21lbnQiLCJ1bmRlZmluZWQiLCJmaW5hbGx5IiwiZGVzdHJveSIsIl90ZW1wbGF0ZUN1c3RvbUZpbHRlciIsIm9GaWx0ZXJCYXIiLCJvU2VsZWN0aW9uRmllbGRJbmZvIiwib01ldGFNb2RlbCIsInNFbnRpdHlUeXBlUGF0aCIsImdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXIiLCJhbm5vdGF0aW9uUGF0aCIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwiZGF0YU1vZGVsUGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImRvY3VtZW50UmVmVGV4dCIsInRhcmdldE9iamVjdCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRG9jdW1lbnRhdGlvblJlZiIsInRvU3RyaW5nIiwib0l0ZW1Nb2RlbCIsIlRlbXBsYXRlTW9kZWwiLCJjb250ZXh0UGF0aCIsIml0ZW0iLCJvVmlldyIsIkNvbW1vblV0aWxzIiwiZ2V0VGFyZ2V0VmlldyIsIm9Db250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsIm9PcHRpb25zIiwiY29udHJvbGxlciIsInZpZXciLCJfZ2V0UHJvcGVydHlQYXRoIiwic0NvbmRpdGlvblBhdGgiLCJGaWx0ZXJVdGlscyIsImdldFByb3BlcnR5UGF0aEZyb21Db25kaXRpb25QYXRoIiwiX2ZpbmRTZWxlY3Rpb25GaWVsZCIsImFTZWxlY3Rpb25GaWVsZHMiLCJzRmxleE5hbWUiLCJmaW5kIiwib1NlbGVjdGlvbkZpZWxkIiwiY29uZGl0aW9uUGF0aCIsInJlcGxhY2VBbGwiLCJhdmFpbGFiaWxpdHkiLCJfZ2VuZXJhdGVJZFByZWZpeCIsInNGaWx0ZXJCYXJJZCIsInNDb250cm9sVHlwZSIsInNOYXZpZ2F0aW9uUHJlZml4IiwiZ2VuZXJhdGUiLCJfdGVtcGxhdGVWYWx1ZUhlbHAiLCJvU2V0dGluZ3MiLCJvUGFyYW1ldGVycyIsImlkUHJlZml4Iiwic1ZoSWRQcmVmaXgiLCJjb25kaXRpb25Nb2RlbCIsIm5hdmlnYXRpb25QcmVmaXgiLCJmaWx0ZXJGaWVsZFZhbHVlSGVscCIsInVzZVNlbWFudGljRGF0ZVJhbmdlIiwiYlVzZVNlbWFudGljRGF0ZVJhbmdlIiwibWV0YVBhdGgiLCJ1c2VNdWx0aVZhbHVlRmllbGQiLCJyZXF1aXJlc1ZhbGlkYXRpb24iLCJjb2xsYWJvcmF0aW9uRW5hYmxlZCIsInJlcXVlc3RHcm91cElkIiwianNvbk1vZGVsIiwibWVyZ2VPYmplY3RzIiwidGFyZ2V0UGF0aCIsIkZpZWxkSGVscGVyIiwidmFsdWVIZWxwUHJvcGVydHlGb3JGaWx0ZXJGaWVsZCIsImlzWE1MIiwidmFsdWVIZWxwWE1MU3RyaW5nIiwianN4IiwicmVuZGVyQXNYTUwiLCJnZXRWYWx1ZUhlbHBUZW1wbGF0ZSIsImdldE1vZGVsIiwidmFsdWVIZWxwWE1MIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiUHJvbWlzZSIsInJlc29sdmUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInRoZW4iLCJhVkhFbGVtZW50cyIsInNBZ2dyZWdhdGlvbk5hbWUiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiZWx0IiwiaW5zZXJ0QWdncmVnYXRpb24iLCJvQ29udHJvbCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJ2YWx1ZUhlbHAiLCJfYWRkWE1MQ3VzdG9tRmlsdGVyRmllbGQiLCJzUHJvcGVydHlQYXRoIiwiYURlcGVuZGVudHMiLCJnZXRBZ2dyZWdhdGlvbiIsImkiLCJsZW5ndGgiLCJvRmlsdGVyRmllbGQiLCJpc0EiLCJzRGF0YVByb3BlcnR5IiwiZ2V0UHJvcGVydHlLZXkiLCJzRmlsdGVyRmllbGRJZCIsImdldElkIiwiaW5kZXhPZiIsIl90ZW1wbGF0ZUZpbHRlckZpZWxkIiwic0luRmlsdGVyQmFySWQiLCJwYWdlTW9kZWwiLCJ2aElkUHJlZml4IiwicHJvcGVydHlQYXRoIiwic1Byb3BlcnR5TmFtZSIsInNldHRpbmdzIiwidmlzdWFsRmlsdGVyIiwiZWRpdE1vZGUiLCJsYWJlbCIsIm9WaXN1YWxGaWx0ZXIiLCJjb252ZXJ0ZXJDb250ZXh0IiwiX2FkZFByb3BlcnR5SW5mbyIsIm9QYXJlbnRDb250cm9sIiwibVByb3BlcnR5QmFnIiwic1Byb3BlcnR5SW5mb05hbWUiLCJzUHJvcGVydHlJbmZvS2V5IiwiS2V5SGVscGVyIiwiZ2V0U2VsZWN0aW9uRmllbGRLZXlGcm9tUGF0aCIsInJlcGxhY2UiLCJtb2RpZmllciIsImRlbGVnYXRlIiwiZ2V0UHJvcGVydHkiLCJhUHJvcGVydHlJbmZvIiwicHJvcGVydHlJbmZvRXhpc3RzIiwiX2NoZWNrSWZQcm9wZXJ0eUluZm9FeGlzdHMiLCJoYXNQcm9wZXJ0eUluZm8iLCJzb21lIiwicHJvcCIsImtleSIsIm5hbWUiLCJlbnRpdHlUeXBlUGF0aCIsInBheWxvYWQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJmaWx0ZXJGaWVsZCIsImdldEZpbHRlckZpZWxkIiwicHJvcGVydHlJbmZvIiwiYnVpbGRQcm9wZXJ5SW5mbyIsIl91cGRhdGVQcm9wZXJ0eUluZm8iLCJlcnJvck1zZyIsIndhcm5pbmciLCJwcm9wZXJ0eUJhZyIsInBhcmVudENvbnRyb2wiLCJwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIiLCJwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXJPYmoiLCJKU09OIiwicGFyc2UiLCJwdXNoIiwic3RyaW5naWZ5IiwiY3VzdG9tRGF0YU5vZGUiLCJyZXRyaWV2ZUN1c3RvbURhdGFOb2RlIiwic2V0QXR0cmlidXRlIiwiX3Byb3BlcnR5SW5mbyIsImZvcm1hdFByb3BlcnR5SW5mbyIsInNldFByb3BlcnR5IiwiYWRkSXRlbSIsIl9hZGRQMTNuSXRlbSIsIm1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwidGFyZ2V0cyIsIl9hZGRGbGV4SXRlbSIsInJlbW92ZUl0ZW0iLCJvRmlsdGVyRmllbGRQcm9wZXJ0eSIsImRvUmVtb3ZlSXRlbSIsImZpbHRlckZpZWxkUHJvcGVydHkiLCJkYXRhIiwiYWRkQ29uZGl0aW9uIiwicmVtb3ZlQ29uZGl0aW9uIiwicHJvcGVydHlJbmZvRnJvbUNEIiwiY2xlYXJGaWx0ZXJzIiwib0ZpbHRlckNvbnRyb2wiLCJmaWx0ZXJCYXJBUEkiLCJnZXRQYXJlbnQiLCJTdGF0ZUhlbHBlciIsImNsZWFyRmlsdGVyVmFsdWVzIiwiZmV0Y2hNb2RlbCIsIm9Nb2RlbCIsImZldGNoUHJvcGVydGllc0ZvckVudGl0eSIsIm9FbnRpdHlUeXBlIiwiZ2V0T2JqZWN0IiwiaW5jbHVkZUhpZGRlbiIsIm9Db252ZXJ0ZXJDb250ZXh0Iiwic0VudGl0eVNldFBhdGgiLCJnZXRFbnRpdHlTZXRQYXRoIiwibUZpbHRlckZpZWxkcyIsImdldENvbnZlcnRlZEZpbHRlckZpZWxkcyIsImdldEFwcENvbXBvbmVudCIsImFGZXRjaGVkUHJvcGVydGllcyIsIm9GaWx0ZXJGaWVsZEluZm8iLCJzQW5ub3RhdGlvblBhdGgiLCJ0ZW1wbGF0ZSIsIm9Qcm9wZXJ0eUFubm90YXRpb25zIiwiZ2V0Q29udmVydGVkVHlwZXMiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsInNUYXJnZXRQcm9wZXJ0eVByZWZpeCIsIkNvbW1vbkhlbHBlciIsImdldExvY2F0aW9uRm9yUHJvcGVydHlQYXRoIiwic1Byb3BlcnR5Iiwic2VsZWN0aW9uRmllbGRzIiwiVUkiLCJTZWxlY3Rpb25GaWVsZHMiLCJmaWx0ZXJGYWNldHMiLCJGaWx0ZXJGYWNldHMiLCJfaXNGaWx0ZXJBZGFwdGFibGUiLCJpc1Byb3BlcnR5RmlsdGVyYWJsZSIsImFQYXJhbWV0ZXJGaWVsZHMiLCJwcm9jZXNzZWRGaWVsZHMiLCJwcm9jZXNzU2VsZWN0aW9uRmllbGRzIiwicHJvY2Vzc2VkRmllbGRzS2V5cyIsIm9Qcm9wcyIsImZpbHRlciIsIm9Qcm9wIiwiaW5jbHVkZXMiLCJkYXRhTW9kZWwiLCJvRlIiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnNCeURhdGFNb2RlbCIsIm1BbGxvd2VkRXhwcmVzc2lvbnMiLCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMiLCJpRmlsdGVyRmllbGRJbmRleCIsIm9TZWxGaWVsZCIsImdyb3VwIiwiZ3JvdXBMYWJlbCIsInBhdGgiLCJ0b29sdGlwIiwicmVtb3ZlRnJvbUFwcFN0YXRlIiwiaGFzVmFsdWVIZWxwIiwib1Byb3BlcnR5Iiwib1Byb3BlcnR5Q29udGV4dCIsImJSZW1vdmVGcm9tQXBwU3RhdGUiLCJvRmlsdGVyRGVmYXVsdFZhbHVlQW5ub3RhdGlvbiIsIm9GaWx0ZXJEZWZhdWx0VmFsdWUiLCJnZXRNb2RlbFR5cGUiLCIkVHlwZSIsImRlZmF1bHRGaWx0ZXJDb25kaXRpb25zIiwiZmllbGRQYXRoIiwib3BlcmF0b3IiLCJ2YWx1ZXMiLCJmaWx0ZXJFeHByZXNzaW9uIiwiZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbiIsInZpc2libGUiLCJwcm9wSW5mbyIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0IiwidHlwZUNvbmZpZyIsIlR5cGVNYXAiLCJnZXRUeXBlQ29uZmlnIiwiZGF0YVR5cGUiLCJmb3JtYXRPcHRpb25zIiwiY29uc3RyYWludHMiLCJnZXRMb2NhbGl6ZWRUZXh0IiwiaXNQYXJhbWV0ZXIiLCJzZXRDdXN0b21EYXRhIiwiZ2V0TGluZUl0ZW1RdWFsaWZpZXJGcm9tVGFibGUiLCJhbm5vdGF0aW9uUGF0aHMiLCJnZXRNZXRhUGF0aCIsInNwbGl0IiwiVmlzdWFsaXphdGlvbnMiLCJ2aXN1YWxpemF0aW9uIiwiJEFubm90YXRpb25QYXRoIiwibWV0YVBhdGhzIiwiZmlsdGVyRmllbGRJbmZvIiwicHJvcGVydHlBbm5vdGF0aW9ucyIsImlzSW5GaWx0ZXJGYWNldHMiLCJpc1NlbGVjdGlvbkZpZWxkIiwiX2lzRmlsdGVySW5TZWxlY3Rpb25GaWVsZHMiLCJmaWx0ZXJGYWNldCIsImZpZWxkR3JvdXAiLCJUYXJnZXQiLCIkdGFyZ2V0IiwiRGF0YSIsImRhdGFGaWVsZCIsIlZhbHVlIiwiQWRhcHRhdGlvbkhpZGRlbiIsImZpbHRlckZpZWxkS2V5Iiwic2VsZWN0aW9uRmllbGQiLCJ2YWx1ZSIsInNGbGV4UHJvcGVydHlOYW1lIiwib0FwcENvbXBvbmVudCIsInByb3BlcnR5SW5mb3NGcm9tRmlsdGVyQmFyIiwiYklzWE1MIiwiY3VzdG9tRGF0YVZhbHVlIiwidHlwZSIsInNOYXZpZ2F0aW9uUGF0aCIsImdldE5hdmlnYXRpb25QYXRoIiwic1VzZVNlbWFudGljRGF0ZVJhbmdlIiwic0JpbmRpbmdQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmV0cmlldmVkRW50aXR5VHlwZVBhdGgiLCJzUmV0cmlldmVkVXNlU2VtYW50aWNEYXRlUmFuZ2UiLCJlbmRzV2l0aCIsInByb3BlcnR5IiwiZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmciLCJqb2luIiwiZ2V0UGF0aCIsInNWYWx1ZUhlbHBUeXBlIiwiZG9lc1ZhbHVlSGVscEV4aXN0IiwiYlZhbHVlSGVscEV4aXN0cyIsImxvY2FsSWQiLCJfZ2V0UGFnZU1vZGVsIiwiX2dldENhY2hlZFByb3BlcnRpZXMiLCJ3aW5kb3ciLCJFbGVtZW50IiwiZ2V0Q3VzdG9tRGF0YSIsIl9zZXRDYWNoZWRQcm9wZXJ0aWVzIiwiX2dldENhY2hlZE9yRmV0Y2hQcm9wZXJ0aWVzRm9yRW50aXR5IiwibG9jYWxHcm91cExhYmVsIiwib0dyb3VwIiwic29ydFByb3BlcnR5SW5mb3NCeUdyb3VwTGFiZWwiLCJmZXRjaFByb3BlcnRpZXMiLCJmaWx0ZXJCYXIiLCJwcm9wZXJ0eUluZm9zIiwiZmV0Y2hGaWx0ZXJQcm9wZXJ0aWVzIiwiZ2V0VHlwZU1hcCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRmlsdGVyQmFyRGVsZWdhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IHR5cGUge1xuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RmllbGRHcm91cFR5cGUsXG5cdEZpbHRlckZhY2V0cyxcblx0UmVmZXJlbmNlRmFjZXQsXG5cdFNlbGVjdGlvbkZpZWxkc1xufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgQmFzZVRyZWVNb2RpZmllciwgUHJlcHJvY2Vzc29yU2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBGaWx0ZXJSZXN0cmljdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL2ZpbHRlci9GaWx0ZXJSZXN0cmljdGlvbnNcIjtcbmltcG9ydCB0eXBlIHtcblx0UHJvcGVydHlJbmZvIGFzIEZFUHJvcGVydHlJbmZvLFxuXHRGaWx0ZXJGaWVsZCxcblx0UHJvcGVydHlJbmZvRXh0ZXJuYWxcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMsIHNvcnRQcm9wZXJ0eUluZm9zQnlHcm91cExhYmVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5RmlsdGVyYWJsZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldExvY2FsaXplZFRleHQsIGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBoYXNWYWx1ZUhlbHAgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7IGdldE1vZGVsVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS90eXBlL0VETVwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBEZWxlZ2F0ZVV0aWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvRGVsZWdhdGVVdGlsXCI7XG5pbXBvcnQgRmllbGRIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSUZpbHRlckNvbnRyb2wgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBVT01WYWxpZGF0aW9uRGVsZWdhdGUgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyQmFyL1VPTVZhbGlkYXRpb25EZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9Qcm9wZXJ0eUluZm9cIjtcbmltcG9ydCB7IGdldFZhbHVlSGVscFRlbXBsYXRlIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlSGVscFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL21kYy9hZGFwdGVyL1N0YXRlSGVscGVyXCI7XG5pbXBvcnQgU3RhdGVIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvbWRjL2FkYXB0ZXIvU3RhdGVIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhclwiO1xuaW1wb3J0IEZpbHRlckJhckRlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhckRlbGVnYXRlXCI7XG5pbXBvcnQgdHlwZSBNRENGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgTWFjcm9BUEkgZnJvbSBcIi4uL01hY3JvQVBJXCI7XG5cbnR5cGUgTW9kaWZpZXJFbGVtZW50ID0gVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXSB8IEVsZW1lbnQgfCBFbGVtZW50W107XG50eXBlIE51bGxhYmxlTW9kaWZpZXJFbGVtZW50ID0gdm9pZCB8IE1vZGlmaWVyRWxlbWVudCB8IG51bGw7XG5jb25zdCBPRGF0YUZpbHRlckJhckRlbGVnYXRlID0gT2JqZWN0LmFzc2lnbih7fSwgRmlsdGVyQmFyRGVsZWdhdGUsIFVPTVZhbGlkYXRpb25EZWxlZ2F0ZSkgYXMgdHlwZW9mIEZpbHRlckJhckRlbGVnYXRlICZcblx0dHlwZW9mIFVPTVZhbGlkYXRpb25EZWxlZ2F0ZSAmIHtcblx0XHRhcGlWZXJzaW9uOiBudW1iZXI7XG5cdFx0X2lzRmlsdGVySW5TZWxlY3Rpb25GaWVsZHMoc2VsZWN0aW9uRmllbGRzOiBTZWxlY3Rpb25GaWVsZHMsIGZpbHRlckZpZWxkSW5mbzogRmlsdGVyRmllbGQpOiBib29sZWFuO1xuXHRcdF9maW5kU2VsZWN0aW9uRmllbGQoYVNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSwgc0ZsZXhOYW1lOiBzdHJpbmcpOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZDtcblx0XHRjbGVhckZpbHRlcnMob0ZpbHRlckNvbnRyb2w6IEZpbHRlckJhcik6IFByb21pc2U8dm9pZD47XG5cdFx0Z2V0VHlwZU1hcCgpOiB0eXBlb2YgVHlwZU1hcDtcblx0XHRmZXRjaEZpbHRlclByb3BlcnRpZXMoZmlsdGVyQmFyOiBJRmlsdGVyQ29udHJvbCk6IFByb21pc2U8Q29udHJvbFByb3BlcnR5SW5mb1tdIHwgUHJvcGVydHlJbmZvRXh0ZXJuYWxbXT47XG5cdFx0ZmV0Y2hQcm9wZXJ0aWVzKGZpbHRlckJhcjogRmlsdGVyQmFyKTogUHJvbWlzZTxQcm9wZXJ0eUluZm9FeHRlcm5hbFtdPjtcblx0XHRfaXNGaWx0ZXJBZGFwdGFibGUoXG5cdFx0XHRmaWx0ZXJGaWVsZEluZm86IEZpbHRlckZpZWxkLFxuXHRcdFx0cHJvcGVydHlBbm5vdGF0aW9uczogUHJvcGVydHksXG5cdFx0XHRzZWxlY3Rpb25GaWVsZHM/OiBTZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRmaWx0ZXJGYWNldHM/OiBGaWx0ZXJGYWNldHNcblx0XHQpOiBib29sZWFuO1xuXHRcdGZldGNoUHJvcGVydGllc0ZvckVudGl0eShzRW50aXR5VHlwZVBhdGg6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIG9GaWx0ZXJDb250cm9sOiBJRmlsdGVyQ29udHJvbCk6IFByb3BlcnR5SW5mb1tdO1xuXHRcdF90ZW1wbGF0ZUN1c3RvbUZpbHRlcihcblx0XHRcdG9GaWx0ZXJCYXI6IElGaWx0ZXJDb250cm9sLFxuXHRcdFx0c0lkUHJlZml4OiBzdHJpbmcsXG5cdFx0XHRvU2VsZWN0aW9uRmllbGRJbmZvOiBGaWx0ZXJGaWVsZCxcblx0XHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0b01vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyXG5cdFx0KTogUHJvbWlzZTxNb2RpZmllckVsZW1lbnQ+O1xuXHRcdF9hZGRQMTNuSXRlbShzUHJvcGVydHlJbmZvTmFtZTogc3RyaW5nLCBvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyKTogUHJvbWlzZTxOdWxsYWJsZU1vZGlmaWVyRWxlbWVudD47XG5cdFx0X2FkZEZsZXhJdGVtKFxuXHRcdFx0c0ZsZXhQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRcdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdFx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdG9Nb2RpZmllcjogQmFzZVRyZWVNb2RpZmllciB8IHVuZGVmaW5lZCxcblx0XHRcdG9BcHBDb21wb25lbnQ/OiBBcHBDb21wb25lbnQsXG5cdFx0XHR2aWV3PzogVmlld1xuXHRcdCk6IFByb21pc2U8TnVsbGFibGVNb2RpZmllckVsZW1lbnQ+O1xuXHRcdGFkZEl0ZW0oXG5cdFx0XHRvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyLFxuXHRcdFx0c1Byb3BlcnR5SW5mb05hbWU6IHN0cmluZyxcblx0XHRcdG1Qcm9wZXJ0eUJhZz86IHsgbW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXI7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50IH1cblx0XHQpOiBQcm9taXNlPE51bGxhYmxlTW9kaWZpZXJFbGVtZW50Pjtcblx0XHRhZGRDb25kaXRpb24oXG5cdFx0XHRvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyLFxuXHRcdFx0c1Byb3BlcnR5SW5mb05hbWU6IHN0cmluZyxcblx0XHRcdG1Qcm9wZXJ0eUJhZzogeyBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDsgbW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXIgfVxuXHRcdCk6IFByb21pc2U8dm9pZCB8IG51bGw+O1xuXHRcdHJlbW92ZUl0ZW0oXG5cdFx0XHRvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyLFxuXHRcdFx0b0ZpbHRlckZpZWxkUHJvcGVydHk6IFVJNUVsZW1lbnQgfCBFbGVtZW50LFxuXHRcdFx0bVByb3BlcnR5QmFnOiB7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50OyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllciB9XG5cdFx0KTogUHJvbWlzZTxib29sZWFuIHwgbnVsbD47XG5cdFx0cmVtb3ZlQ29uZGl0aW9uKFxuXHRcdFx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0XHRcdHNQcm9wZXJ0eUluZm9OYW1lOiBzdHJpbmcsXG5cdFx0XHRtUHJvcGVydHlCYWc6IHtcblx0XHRcdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdFx0XHRcdG1vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyO1xuXHRcdFx0fVxuXHRcdCk6IFByb21pc2U8dm9pZCB8IG51bGw+O1xuXHR9O1xuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5hcGlWZXJzaW9uID0gMjtcbmNvbnN0IEVESVRfU1RBVEVfUFJPUEVSVFlfTkFNRSA9IFwiJGVkaXRTdGF0ZVwiLFxuXHRTRUFSQ0hfUFJPUEVSVFlfTkFNRSA9IFwiJHNlYXJjaFwiLFxuXHRWQUxVRV9IRUxQX1RZUEUgPSBcIkZpbHRlckZpZWxkVmFsdWVIZWxwXCIsXG5cdEZFVENIRURfUFJPUEVSVElFU19EQVRBX0tFWSA9IFwic2FwX2ZlX0ZpbHRlckJhckRlbGVnYXRlX3Byb3BlcnR5SW5mb01hcFwiO1xuXG4vLyBGb3Igb25lIHNpbmdsZSBlbnRyeSBpbiBVSS5TZWxlY3Rpb25GaWVsZHNcbnR5cGUgQW5ub3RhdGlvblNlbGVjdGlvbkZpZWxkID0ge1xuXHR2YWx1ZTogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gX3RlbXBsYXRlRWRpdFN0YXRlKFxuXHRzSWRQcmVmaXg6IHN0cmluZyxcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0b01vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPE1vZGlmaWVyRWxlbWVudD4ge1xuXHRjb25zdCBvVGhpcyA9IG5ldyBKU09OTW9kZWwoe1xuXHRcdFx0aWQ6IHNJZFByZWZpeCxcblx0XHRcdGlzRHJhZnRDb2xsYWJvcmF0aXZlOiBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpXG5cdFx0fSksXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdHRoaXM6IG9UaGlzLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0fSxcblx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHQvL1widGhpcy5pMThuXCI6IFJlc291cmNlTW9kZWwuZ2V0TW9kZWwoKSwgVE9ETzogVG8gYmUgY2hlY2tlZCB3aHkgdGhpcyBpcyBuZWVkZWQsIHNob3VsZCBub3QgYmUgbmVlZGVkIGF0IGFsbFxuXHRcdFx0XHR0aGlzOiBvVGhpc1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIERlbGVnYXRlVXRpbC50ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChcblx0XHRcInNhcC5mZS5tYWNyb3MuZmlsdGVyQmFyLkRyYWZ0RWRpdFN0YXRlXCIsXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRvTW9kaWZpZXJcblx0KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRvVGhpcy5kZXN0cm95KCk7XG5cdH0pO1xufVxuXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLl90ZW1wbGF0ZUN1c3RvbUZpbHRlciA9IGFzeW5jIGZ1bmN0aW9uIChcblx0b0ZpbHRlckJhcjogSUZpbHRlckNvbnRyb2wsXG5cdHNJZFByZWZpeDogc3RyaW5nLFxuXHRvU2VsZWN0aW9uRmllbGRJbmZvOiBGaWx0ZXJGaWVsZCxcblx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdG9Nb2RpZmllcjogQmFzZVRyZWVNb2RpZmllclxuKTogUHJvbWlzZTxNb2RpZmllckVsZW1lbnQ+IHtcblx0Y29uc3Qgc0VudGl0eVR5cGVQYXRoID0gYXdhaXQgRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXI8c3RyaW5nPihvRmlsdGVyQmFyLCBcImVudGl0eVR5cGVcIiwgb01vZGlmaWVyKTtcblxuXHRpZiAob1NlbGVjdGlvbkZpZWxkSW5mby5hbm5vdGF0aW9uUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gaWYgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0dHlwZSBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbl9leHRlbmRlZCA9IFByb3BlcnR5QW5ub3RhdGlvbnNfQ29tbW9uICYgeyBEb2N1bWVudGF0aW9uUmVmPzogc3RyaW5nIH07XG5cdFx0Y29uc3QgY29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvU2VsZWN0aW9uRmllbGRJbmZvLmFubm90YXRpb25QYXRoKSxcblx0XHRcdGRhdGFNb2RlbFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UHJvcGVydHk+KGNvbnRleHQpLFxuXHRcdFx0ZG9jdW1lbnRSZWZUZXh0ID0gKFxuXHRcdFx0XHRkYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnMuQ29tbW9uIGFzIFByb3BlcnR5QW5ub3RhdGlvbnNfQ29tbW9uX2V4dGVuZGVkXG5cdFx0XHQpPy5Eb2N1bWVudGF0aW9uUmVmPy50b1N0cmluZygpO1xuXHRcdG9TZWxlY3Rpb25GaWVsZEluZm8uZG9jdW1lbnRSZWZUZXh0ID0gZG9jdW1lbnRSZWZUZXh0O1xuXHR9XG5cblx0Y29uc3Qgb1RoaXMgPSBuZXcgSlNPTk1vZGVsKHtcblx0XHRcdGlkOiBzSWRQcmVmaXhcblx0XHR9KSxcblx0XHRvSXRlbU1vZGVsID0gbmV3IFRlbXBsYXRlTW9kZWwob1NlbGVjdGlvbkZpZWxkSW5mbywgb01ldGFNb2RlbCksXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzID0ge1xuXHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlUeXBlUGF0aCEpLFxuXHRcdFx0XHR0aGlzOiBvVGhpcy5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiksXG5cdFx0XHRcdGl0ZW06IG9JdGVtTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHR9LFxuXHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHR0aGlzOiBvVGhpcyxcblx0XHRcdFx0aXRlbTogb0l0ZW1Nb2RlbFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b1ZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KG9GaWx0ZXJCYXIpLFxuXHRcdG9Db250cm9sbGVyID0gb1ZpZXcgPyBvVmlldy5nZXRDb250cm9sbGVyKCkgOiB1bmRlZmluZWQsXG5cdFx0b09wdGlvbnMgPSB7XG5cdFx0XHRjb250cm9sbGVyOiBvQ29udHJvbGxlciA/IG9Db250cm9sbGVyIDogdW5kZWZpbmVkLFxuXHRcdFx0dmlldzogb1ZpZXdcblx0XHR9O1xuXG5cdHJldHVybiBEZWxlZ2F0ZVV0aWwudGVtcGxhdGVDb250cm9sRnJhZ21lbnQoXCJzYXAuZmUubWFjcm9zLmZpbHRlci5DdXN0b21GaWx0ZXJcIiwgb1ByZXByb2Nlc3NvclNldHRpbmdzLCBvT3B0aW9ucywgb01vZGlmaWVyKS5maW5hbGx5KFxuXHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdG9UaGlzLmRlc3Ryb3koKTtcblx0XHRcdG9JdGVtTW9kZWwuZGVzdHJveSgpO1xuXHRcdH1cblx0KTtcbn07XG5mdW5jdGlvbiBfZ2V0UHJvcGVydHlQYXRoKHNDb25kaXRpb25QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gRmlsdGVyVXRpbHMuZ2V0UHJvcGVydHlQYXRoRnJvbUNvbmRpdGlvblBhdGgoc0NvbmRpdGlvblBhdGgpO1xufVxuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5fZmluZFNlbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24gKGFTZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNGbGV4TmFtZTogc3RyaW5nKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gYVNlbGVjdGlvbkZpZWxkcy5maW5kKGZ1bmN0aW9uIChvU2VsZWN0aW9uRmllbGQ6IEZpbHRlckZpZWxkKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdChvU2VsZWN0aW9uRmllbGQuY29uZGl0aW9uUGF0aCA9PT0gc0ZsZXhOYW1lIHx8IG9TZWxlY3Rpb25GaWVsZC5jb25kaXRpb25QYXRoLnJlcGxhY2VBbGwoL1xcKi9nLCBcIlwiKSA9PT0gc0ZsZXhOYW1lKSAmJlxuXHRcdFx0b1NlbGVjdGlvbkZpZWxkLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIlxuXHRcdCk7XG5cdH0pO1xufTtcbmZ1bmN0aW9uIF9nZW5lcmF0ZUlkUHJlZml4KHNGaWx0ZXJCYXJJZDogc3RyaW5nLCBzQ29udHJvbFR5cGU6IHN0cmluZywgc05hdmlnYXRpb25QcmVmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc05hdmlnYXRpb25QcmVmaXggPyBnZW5lcmF0ZShbc0ZpbHRlckJhcklkLCBzQ29udHJvbFR5cGUsIHNOYXZpZ2F0aW9uUHJlZml4XSkgOiBnZW5lcmF0ZShbc0ZpbHRlckJhcklkLCBzQ29udHJvbFR5cGVdKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIF90ZW1wbGF0ZVZhbHVlSGVscChcblx0b1NldHRpbmdzOiB7XG5cdFx0aXNYTUw6IGJvb2xlYW47XG5cdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRtZXRhUGF0aDogQ29udGV4dDtcblx0XHRcdGNvbnRleHRQYXRoOiBDb250ZXh0O1xuXHRcdH07XG5cdFx0bW9kZWxzOiB7XG5cdFx0XHRtZXRhUGF0aDogT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRjb250ZXh0UGF0aDogT0RhdGFNZXRhTW9kZWw7XG5cdFx0fTtcblx0fSxcblx0b1BhcmFtZXRlcnM6IHtcblx0XHRzVmhJZFByZWZpeDogc3RyaW5nO1xuXHRcdHNOYXZpZ2F0aW9uUHJlZml4Pzogc3RyaW5nO1xuXHRcdGJVc2VTZW1hbnRpY0RhdGVSYW5nZTogYm9vbGVhbjtcblx0XHRvTW9kaWZpZXI/OiBCYXNlVHJlZU1vZGlmaWVyO1xuXHRcdG9Db250cm9sOiBVSTVFbGVtZW50O1xuXHRcdHZpZXc/OiBWaWV3O1xuXHR9XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgb1RoaXMgPSB7XG5cdFx0aWRQcmVmaXg6IG9QYXJhbWV0ZXJzLnNWaElkUHJlZml4LFxuXHRcdGNvbmRpdGlvbk1vZGVsOiBcIiRmaWx0ZXJzXCIsXG5cdFx0bmF2aWdhdGlvblByZWZpeDogb1BhcmFtZXRlcnMuc05hdmlnYXRpb25QcmVmaXggPyBgLyR7b1BhcmFtZXRlcnMuc05hdmlnYXRpb25QcmVmaXh9YCA6IFwiXCIsXG5cdFx0ZmlsdGVyRmllbGRWYWx1ZUhlbHA6IHRydWUsXG5cdFx0dXNlU2VtYW50aWNEYXRlUmFuZ2U6IG9QYXJhbWV0ZXJzLmJVc2VTZW1hbnRpY0RhdGVSYW5nZSxcblx0XHRtZXRhUGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5tZXRhUGF0aCxcblx0XHRjb250ZXh0UGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5jb250ZXh0UGF0aCxcblx0XHR1c2VNdWx0aVZhbHVlRmllbGQ6IGZhbHNlLFxuXHRcdHJlcXVpcmVzVmFsaWRhdGlvbjogZmFsc2UsXG5cdFx0Y29sbGFib3JhdGlvbkVuYWJsZWQ6IGZhbHNlLFxuXHRcdHJlcXVlc3RHcm91cElkOiB1bmRlZmluZWRcblx0fTtcblx0Y29uc3QganNvbk1vZGVsID0gbmV3IEpTT05Nb2RlbChvVGhpcyk7XG5cdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IG1lcmdlT2JqZWN0cyh7fSwgb1NldHRpbmdzLCB7XG5cdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHR0aGlzOiBqc29uTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0fSxcblx0XHRtb2RlbHM6IHtcblx0XHRcdHRoaXM6IG9UaGlzXG5cdFx0fVxuXHR9KSBhcyBQcmVwcm9jZXNzb3JTZXR0aW5ncztcblx0Y29uc3QgdGFyZ2V0UGF0aCA9IEZpZWxkSGVscGVyLnZhbHVlSGVscFByb3BlcnR5Rm9yRmlsdGVyRmllbGQob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5tZXRhUGF0aCk7XG5cblx0aWYgKG9TZXR0aW5ncy5pc1hNTCkge1xuXHRcdGxldCB2YWx1ZUhlbHBYTUxTdHJpbmcgPSBqc3gucmVuZGVyQXNYTUw8c3RyaW5nIHwgdW5kZWZpbmVkPihcblx0XHRcdCgpID0+XG5cdFx0XHRcdGdldFZhbHVlSGVscFRlbXBsYXRlKG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMubWV0YVBhdGguZ2V0TW9kZWwoKS5jcmVhdGVCaW5kaW5nQ29udGV4dCh0YXJnZXRQYXRoKSwgb1RoaXMpIGFzXG5cdFx0XHRcdFx0fCBzdHJpbmdcblx0XHRcdFx0XHR8IHVuZGVmaW5lZFxuXHRcdCk7XG5cdFx0aWYgKHZhbHVlSGVscFhNTFN0cmluZykge1xuXHRcdFx0aWYgKG9TZXR0aW5ncy5pc1hNTCkge1xuXHRcdFx0XHR2YWx1ZUhlbHBYTUxTdHJpbmcgPSBgPHJvb3Q+JHt2YWx1ZUhlbHBYTUxTdHJpbmd9PC9yb290PmA7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB2YWx1ZUhlbHBYTUwgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlSGVscFhNTFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdERlbGVnYXRlVXRpbC50ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudCh2YWx1ZUhlbHBYTUwuZmlyc3RFbGVtZW50Q2hpbGQsIG9QcmVwcm9jZXNzb3JTZXR0aW5ncywge1xuXHRcdFx0XHRcdGlzWE1MOiBvU2V0dGluZ3MuaXNYTUxcblx0XHRcdFx0fSlcblx0XHRcdClcblx0XHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKGFWSEVsZW1lbnRzOiBNb2RpZmllckVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0XHRpZiAoYVZIRWxlbWVudHMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBZ2dyZWdhdGlvbk5hbWUgPSBcImRlcGVuZGVudHNcIjtcblx0XHRcdFx0XHRcdC8vU29tZSBmaWx0ZXIgZmllbGRzIGhhdmUgdGhlIFBlcnNpc3RlbmNlUHJvdmlkZXIgYWdncmVnYXRpb24gYmVzaWRlcyB0aGUgRlZIIDpcblx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGFWSEVsZW1lbnRzKSkge1xuXHRcdFx0XHRcdFx0XHRhVkhFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbHQ6IEVsZW1lbnQgfCBVSTVFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbWV0ZXJzLm9Nb2RpZmllcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlcnMub01vZGlmaWVyLmluc2VydEFnZ3JlZ2F0aW9uKG9QYXJhbWV0ZXJzLm9Db250cm9sLCBzQWdncmVnYXRpb25OYW1lLCBlbHQsIDApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVycy5vQ29udHJvbC5pbnNlcnRBZ2dyZWdhdGlvbihzQWdncmVnYXRpb25OYW1lLCBlbHQgYXMgVUk1RWxlbWVudCwgMCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9QYXJhbWV0ZXJzLm9Nb2RpZmllcikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhcmFtZXRlcnMub01vZGlmaWVyLmluc2VydEFnZ3JlZ2F0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJzLm9Db250cm9sLFxuXHRcdFx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0YVZIRWxlbWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVycy52aWV3IGFzIHVua25vd24gYXMgRWxlbWVudFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlcnMub0NvbnRyb2wuaW5zZXJ0QWdncmVnYXRpb24oc0FnZ3JlZ2F0aW9uTmFtZSwgYVZIRWxlbWVudHMgYXMgVUk1RWxlbWVudCwgMCwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBldmFsdWF0aW5nIERlbGVnYXRlVXRpbC5pc1ZhbHVlSGVscFJlcXVpcmVkXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0anNvbk1vZGVsLmRlc3Ryb3koKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHZhbHVlSGVscCA9IGdldFZhbHVlSGVscFRlbXBsYXRlKG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMubWV0YVBhdGguZ2V0TW9kZWwoKS5jcmVhdGVCaW5kaW5nQ29udGV4dCh0YXJnZXRQYXRoKSwgb1RoaXMpIGFzXG5cdFx0XHR8IFZhbHVlSGVscFxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0aWYgKHZhbHVlSGVscCkge1xuXHRcdFx0Y29uc3Qgc0FnZ3JlZ2F0aW9uTmFtZSA9IFwiZGVwZW5kZW50c1wiO1xuXHRcdFx0Ly9Tb21lIGZpbHRlciBmaWVsZHMgaGF2ZSB0aGUgUGVyc2lzdGVuY2VQcm92aWRlciBhZ2dyZWdhdGlvbiBiZXNpZGVzIHRoZSBGVkggOlxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWVIZWxwKSkge1xuXHRcdFx0XHR2YWx1ZUhlbHAuZm9yRWFjaChmdW5jdGlvbiAoZWx0OiBFbGVtZW50IHwgVUk1RWxlbWVudCkge1xuXHRcdFx0XHRcdGlmIChvUGFyYW1ldGVycy5vTW9kaWZpZXIpIHtcblx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJzLm9Nb2RpZmllci5pbnNlcnRBZ2dyZWdhdGlvbihvUGFyYW1ldGVycy5vQ29udHJvbCwgc0FnZ3JlZ2F0aW9uTmFtZSwgZWx0LCAwKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b1BhcmFtZXRlcnMub0NvbnRyb2wuaW5zZXJ0QWdncmVnYXRpb24oc0FnZ3JlZ2F0aW9uTmFtZSwgZWx0IGFzIFVJNUVsZW1lbnQsIDAsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChvUGFyYW1ldGVycy5vTW9kaWZpZXIpIHtcblx0XHRcdFx0b1BhcmFtZXRlcnMub01vZGlmaWVyLmluc2VydEFnZ3JlZ2F0aW9uKG9QYXJhbWV0ZXJzLm9Db250cm9sLCBzQWdncmVnYXRpb25OYW1lLCB2YWx1ZUhlbHAsIDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1BhcmFtZXRlcnMub0NvbnRyb2wuaW5zZXJ0QWdncmVnYXRpb24oc0FnZ3JlZ2F0aW9uTmFtZSwgdmFsdWVIZWxwLCAwLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5hc3luYyBmdW5jdGlvbiBfYWRkWE1MQ3VzdG9tRmlsdGVyRmllbGQoXG5cdG9GaWx0ZXJCYXI6IElGaWx0ZXJDb250cm9sLFxuXHRvTW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXIsXG5cdHNQcm9wZXJ0eVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxVSTVFbGVtZW50IHwgRWxlbWVudCB8IHZvaWQ+IHtcblx0dHJ5IHtcblx0XHRjb25zdCBhRGVwZW5kZW50cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShvTW9kaWZpZXIuZ2V0QWdncmVnYXRpb24ob0ZpbHRlckJhciwgXCJkZXBlbmRlbnRzXCIpKTtcblx0XHRsZXQgaTtcblx0XHRpZiAoYURlcGVuZGVudHMgJiYgYURlcGVuZGVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8PSBhRGVwZW5kZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBvRmlsdGVyRmllbGQgPSBhRGVwZW5kZW50c1tpXTtcblx0XHRcdFx0aWYgKG9GaWx0ZXJGaWVsZCAmJiAob0ZpbHRlckZpZWxkIGFzIFVJNUVsZW1lbnQpLmlzQTxNRENGaWx0ZXJGaWVsZD4oXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc0RhdGFQcm9wZXJ0eSA9IChvRmlsdGVyRmllbGQgYXMgTURDRmlsdGVyRmllbGQpLmdldFByb3BlcnR5S2V5KCksXG5cdFx0XHRcdFx0XHRzRmlsdGVyRmllbGRJZCA9IChvRmlsdGVyRmllbGQgYXMgTURDRmlsdGVyRmllbGQpLmdldElkKCk7XG5cdFx0XHRcdFx0aWYgKHNQcm9wZXJ0eVBhdGggPT09IHNEYXRhUHJvcGVydHkgJiYgc0ZpbHRlckZpZWxkSWQuaW5kZXhPZihcIkN1c3RvbUZpbHRlckZpZWxkXCIpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0ZpbHRlckZpZWxkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0TG9nLmVycm9yKFwiRmlsdGVyIENhbm5vdCBiZSBhZGRlZFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBfdGVtcGxhdGVGaWx0ZXJGaWVsZChcblx0b1NldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0b1BhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRzSW5GaWx0ZXJCYXJJZD86IHN0cmluZyxcblx0cGFnZU1vZGVsPzogSlNPTk1vZGVsXG4pOiBQcm9taXNlPFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10gfCBFbGVtZW50IHwgRWxlbWVudFtdPiB7XG5cdGNvbnN0IG9UaGlzID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0aWRQcmVmaXg6IG9QYXJhbWV0ZXJzLnNJZFByZWZpeCxcblx0XHR2aElkUHJlZml4OiBvUGFyYW1ldGVycy5zVmhJZFByZWZpeCxcblx0XHRwcm9wZXJ0eVBhdGg6IG9QYXJhbWV0ZXJzLnNQcm9wZXJ0eU5hbWUsXG5cdFx0bmF2aWdhdGlvblByZWZpeDogb1BhcmFtZXRlcnMuc05hdmlnYXRpb25QcmVmaXggPyBgLyR7b1BhcmFtZXRlcnMuc05hdmlnYXRpb25QcmVmaXh9YCA6IFwiXCIsXG5cdFx0dXNlU2VtYW50aWNEYXRlUmFuZ2U6IG9QYXJhbWV0ZXJzLmJVc2VTZW1hbnRpY0RhdGVSYW5nZSxcblx0XHRzZXR0aW5nczogb1BhcmFtZXRlcnMub1NldHRpbmdzLFxuXHRcdHZpc3VhbEZpbHRlcjogb1BhcmFtZXRlcnMudmlzdWFsRmlsdGVyLFxuXHRcdGVkaXRNb2RlOiBge2ludGVybmFsPi8ke3NJbkZpbHRlckJhcklkfS9maWx0ZXJGaWVsZHMvJHtvUGFyYW1ldGVycy5zUHJvcGVydHlOYW1lfS9lZGl0TW9kZX1gLFxuXHRcdGxhYmVsOiBvUGFyYW1ldGVycy5sYWJlbFxuXHR9KTtcblx0dHJ5IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1BhcmFtZXRlcnMub01ldGFNb2RlbCBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBvVmlzdWFsRmlsdGVyID0gbmV3IFRlbXBsYXRlTW9kZWwob1BhcmFtZXRlcnMudmlzdWFsRmlsdGVyIGFzIG9iamVjdCwgb01ldGFNb2RlbCk7XG5cdFx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gbWVyZ2VPYmplY3RzKHt9LCBvU2V0dGluZ3MsIHtcblx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHR0aGlzOiBvVGhpcy5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiksXG5cdFx0XHRcdHZpc3VhbEZpbHRlcjogb1Zpc3VhbEZpbHRlci5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIilcblx0XHRcdH0sXG5cdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0dGhpczogb1RoaXMsXG5cdFx0XHRcdHZpc3VhbEZpbHRlcjogb1Zpc3VhbEZpbHRlcixcblx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBwYWdlTW9kZWxcblx0XHRcdH1cblx0XHR9KSBhcyBQcmVwcm9jZXNzb3JTZXR0aW5ncztcblxuXHRcdHJldHVybiBhd2FpdCBEZWxlZ2F0ZVV0aWwudGVtcGxhdGVDb250cm9sRnJhZ21lbnQoXCJzYXAuZmUubWFjcm9zLmludGVybmFsLmZpbHRlckZpZWxkLkZpbHRlckZpZWxkVGVtcGxhdGVcIiwgb1ByZXByb2Nlc3NvclNldHRpbmdzLCB7XG5cdFx0XHRpc1hNTDogISFvU2V0dGluZ3MuaXNYTUxcblx0XHR9KTtcblx0fSBmaW5hbGx5IHtcblx0XHRvVGhpcy5kZXN0cm95KCk7XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX2FkZFByb3BlcnR5SW5mbyhcblx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0bVByb3BlcnR5QmFnOiB7IG1vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyOyBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCB9LFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0c1Byb3BlcnR5SW5mb05hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG5cdHRyeSB7XG5cdFx0Ly8ga2V5IHNob3VsZCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIG5hbWVcblx0XHRjb25zdCBzUHJvcGVydHlJbmZvS2V5ID0gS2V5SGVscGVyLmdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgoc1Byb3BlcnR5SW5mb05hbWUpO1xuXHRcdHNQcm9wZXJ0eUluZm9OYW1lID0gc1Byb3BlcnR5SW5mb05hbWUucmVwbGFjZShcIipcIiwgXCJcIik7XG5cdFx0aWYgKG1Qcm9wZXJ0eUJhZyAmJiAhbVByb3BlcnR5QmFnLm1vZGlmaWVyKSB7XG5cdFx0XHR0aHJvdyBcIkZpbHRlckJhciBEZWxlZ2F0ZSBtZXRob2QgY2FsbGVkIHdpdGhvdXQgbW9kaWZpZXIuXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGVsZWdhdGUgPSBhd2FpdCBtUHJvcGVydHlCYWcubW9kaWZpZXIuZ2V0UHJvcGVydHk8RmlsdGVyQmFyRGVsZWdhdGU+KG9QYXJlbnRDb250cm9sLCBcImRlbGVnYXRlXCIpO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eUluZm8gPSBhd2FpdCBtUHJvcGVydHlCYWcubW9kaWZpZXIuZ2V0UHJvcGVydHk8RkVQcm9wZXJ0eUluZm9bXT4ob1BhcmVudENvbnRyb2wsIFwicHJvcGVydHlJbmZvXCIpO1xuXHRcdGNvbnN0IHByb3BlcnR5SW5mb0V4aXN0cyA9IGF3YWl0IEZpbHRlclV0aWxzLl9jaGVja0lmUHJvcGVydHlJbmZvRXhpc3RzKG9QYXJlbnRDb250cm9sLCBtUHJvcGVydHlCYWcubW9kaWZpZXIsIHNQcm9wZXJ0eUluZm9OYW1lKTtcblx0XHQvL1dlIGRvIG5vdCBnZXQgcHJvcGVydHlJbmZvIGluIGNhc2Ugb2YgdGFibGUgZmlsdGVyc1xuXHRcdGlmIChhUHJvcGVydHlJbmZvICYmICFwcm9wZXJ0eUluZm9FeGlzdHMpIHtcblx0XHRcdGNvbnN0IGhhc1Byb3BlcnR5SW5mbyA9IGFQcm9wZXJ0eUluZm8uc29tZShmdW5jdGlvbiAocHJvcDogRkVQcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0cmV0dXJuIHByb3Aua2V5ID09PSBzUHJvcGVydHlJbmZvS2V5IHx8IHByb3AubmFtZSA9PT0gc1Byb3BlcnR5SW5mb0tleTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFoYXNQcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0Y29uc3QgZW50aXR5VHlwZVBhdGggPSBkZWxlZ2F0ZS5wYXlsb2FkLmVudGl0eVR5cGVQYXRoO1xuXHRcdFx0XHRjb25zdCBjb252ZXJ0ZXJDb250ZXh0ID0gRmlsdGVyVXRpbHMuY3JlYXRlQ29udmVydGVyQ29udGV4dChcblx0XHRcdFx0XHRvUGFyZW50Q29udHJvbCBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sLFxuXHRcdFx0XHRcdGVudGl0eVR5cGVQYXRoLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0bVByb3BlcnR5QmFnLmFwcENvbXBvbmVudFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckZpZWxkID0gRmlsdGVyVXRpbHMuZ2V0RmlsdGVyRmllbGQoc1Byb3BlcnR5SW5mb05hbWUsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eUluZm8gPSBGaWx0ZXJVdGlscy5idWlsZFByb3BlcnlJbmZvKGZpbHRlckZpZWxkISwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRcdGF3YWl0IF91cGRhdGVQcm9wZXJ0eUluZm8oXG5cdFx0XHRcdFx0YVByb3BlcnR5SW5mbyBhcyBQcm9wZXJ0eUluZm9bXSxcblx0XHRcdFx0XHRtUHJvcGVydHlCYWcsXG5cdFx0XHRcdFx0cHJvcGVydHlJbmZvIGFzIHVua25vd24gYXMgUHJvcGVydHlJbmZvLFxuXHRcdFx0XHRcdG9QYXJlbnRDb250cm9sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvck1zZykge1xuXHRcdExvZy53YXJuaW5nKGAke29QYXJlbnRDb250cm9sLmdldElkKCl9IDogJHtlcnJvck1zZ31gKTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBfdXBkYXRlUHJvcGVydHlJbmZvKFxuXHRwcm9wZXJ0eUluZm86IFByb3BlcnR5SW5mb1tdLFxuXHRwcm9wZXJ0eUJhZzogeyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllcjsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgfSxcblx0ZmlsdGVyRmllbGQ6IFByb3BlcnR5SW5mbyxcblx0cGFyZW50Q29udHJvbDogRmlsdGVyQmFyXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0bGV0IHByb3BlcnR5SW5mb0ZvckZpbHRlckJhciA9IGF3YWl0IERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhV2l0aE1vZGlmaWVyPHN0cmluZz4oXG5cdFx0cGFyZW50Q29udHJvbCxcblx0XHRcImZlRmlsdGVySW5mb1wiLFxuXHRcdHByb3BlcnR5QmFnLm1vZGlmaWVyXG5cdCk7XG5cdGlmIChwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIgJiYgcHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXJPYmogPSBKU09OLnBhcnNlKHByb3BlcnR5SW5mb0ZvckZpbHRlckJhcikgYXMgUHJvcGVydHlJbmZvW107XG5cdFx0cHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyT2JqLnB1c2goZmlsdGVyRmllbGQpO1xuXHRcdHByb3BlcnR5SW5mb0ZvckZpbHRlckJhciA9IEpTT04uc3RyaW5naWZ5KHByb3BlcnR5SW5mb0ZvckZpbHRlckJhck9iaik7XG5cdFx0cHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyID0gcHJvcGVydHlJbmZvRm9yRmlsdGVyQmFyLnJlcGxhY2UoL1xcey9nLCBcIlxcXFx7XCIpO1xuXHRcdHByb3BlcnR5SW5mb0ZvckZpbHRlckJhciA9IHByb3BlcnR5SW5mb0ZvckZpbHRlckJhci5yZXBsYWNlKC9cXH0vZywgXCJcXFxcfVwiKTtcblx0XHRjb25zdCBjdXN0b21EYXRhTm9kZSA9IGF3YWl0IERlbGVnYXRlVXRpbC5yZXRyaWV2ZUN1c3RvbURhdGFOb2RlKHBhcmVudENvbnRyb2wsIFwiZmVGaWx0ZXJJbmZvXCIsIHByb3BlcnR5QmFnLm1vZGlmaWVyKTtcblx0XHRjdXN0b21EYXRhTm9kZVswXS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBwcm9wZXJ0eUluZm9Gb3JGaWx0ZXJCYXIpO1xuXHRcdHByb3BlcnR5QmFnLm1vZGlmaWVyLmluc2VydEFnZ3JlZ2F0aW9uKHBhcmVudENvbnRyb2wsIFwiY3VzdG9tRGF0YVwiLCBjdXN0b21EYXRhTm9kZVswXSwgMCk7XG5cdH1cblxuXHQvLyBDdXN0b20gZGF0YSBpcyBzZXQgdG8gdGhlIHBhcmVudCBjb250cm9sIHRvIHN0b3JlIHRoZSBwcm9wZXJ0eUluZm9cblx0cHJvcGVydHlJbmZvLnB1c2goZmlsdGVyRmllbGQpO1xuXHQvL3JlbW92ZSB1bndhbnRlZCBwcm9wZXJ0eSBmcm9tIHRoZSBwcm9wZXJ0eUluZm9cblx0Y29uc3QgX3Byb3BlcnR5SW5mbyA9IEZpbHRlclV0aWxzLmZvcm1hdFByb3BlcnR5SW5mbyhwcm9wZXJ0eUluZm8gYXMgRkVQcm9wZXJ0eUluZm9bXSk7XG5cdC8vVXBkYXRlIHRoZSBwcm9wZXJ0eUluZm8gaW4gdGhlIHBhcmVudCBjb250cm9sXG5cdHByb3BlcnR5QmFnLm1vZGlmaWVyLnNldFByb3BlcnR5KHBhcmVudENvbnRyb2wsIFwicHJvcGVydHlJbmZvXCIsIF9wcm9wZXJ0eUluZm8pO1xufVxuLyoqXG4gKiBNZXRob2QgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBmaWx0ZXIgZmllbGQgaW4gc3RhbmRhbG9uZSBtb2RlIGFuZCBpbiB0aGUgcGVyc29uYWxpemF0aW9uIHNldHRpbmdzIG9mIHRoZSBmaWx0ZXIgYmFyLlxuICogQHBhcmFtIG9QYXJlbnRDb250cm9sIFBhcmVudCBjb250cm9sIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBmaWx0ZXIgZmllbGQgaXMgYWRkZWRcbiAqIEBwYXJhbSBzUHJvcGVydHlJbmZvTmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhZGRlZCBhcyB0aGUgZmlsdGVyIGZpZWxkXG4gKiBAcGFyYW0gbVByb3BlcnR5QmFnIEluc3RhbmNlIG9mIHRoZSBwcm9wZXJ0eSBiYWcgZnJvbSBGbGV4IEFQSVxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVByb3BlcnR5QmFnLm1vZGlmaWVyIE1vZGlmaWVyIGZyb20gRmxleCBBUElcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcudmlldyBJbnN0YW5jZSBvZiB0aGUgdmlld1xuICogQHJldHVybnMgT25jZSByZXNvbHZlZCwgYSBmaWx0ZXIgZmllbGQgZGVmaW5pdGlvbiBpcyByZXR1cm5lZFxuICovXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLmFkZEl0ZW0gPSBhc3luYyBmdW5jdGlvbiAoXG5cdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdHNQcm9wZXJ0eUluZm9OYW1lOiBzdHJpbmcsXG5cdG1Qcm9wZXJ0eUJhZz86IHsgdmlldzogVmlldzsgbW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXI7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50IH1cbik6IFByb21pc2U8TnVsbGFibGVNb2RpZmllckVsZW1lbnQ+IHtcblx0aWYgKCFtUHJvcGVydHlCYWcpIHtcblx0XHQvLyBJbnZva2VkIGR1cmluZyBydW50aW1lLlxuXHRcdHJldHVybiBPRGF0YUZpbHRlckJhckRlbGVnYXRlLl9hZGRQMTNuSXRlbShzUHJvcGVydHlJbmZvTmFtZSwgb1BhcmVudENvbnRyb2wpO1xuXHR9XG5cdGNvbnN0IG1vZGlmaWVyID0gbVByb3BlcnR5QmFnLm1vZGlmaWVyO1xuXHRjb25zdCBtb2RlbCA9IG1Qcm9wZXJ0eUJhZyAmJiBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50ICYmIG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IG1vZGVsICYmIG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRpZiAoIW9NZXRhTW9kZWwpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHR9XG5cdGNvbnN0IGlzWE1MID0gbW9kaWZpZXIgJiYgbW9kaWZpZXIudGFyZ2V0cyA9PT0gXCJ4bWxUcmVlXCI7XG5cdGNvbnN0IHByb3BlcnR5SW5mb0V4aXN0cyA9IGlzWE1MID8gYXdhaXQgRmlsdGVyVXRpbHMuX2NoZWNrSWZQcm9wZXJ0eUluZm9FeGlzdHMob1BhcmVudENvbnRyb2wsIG1vZGlmaWVyLCBzUHJvcGVydHlJbmZvTmFtZSkgOiB0cnVlO1xuXHRpZiAoaXNYTUwgJiYgIXByb3BlcnR5SW5mb0V4aXN0cykge1xuXHRcdGF3YWl0IF9hZGRQcm9wZXJ0eUluZm8ob1BhcmVudENvbnRyb2wsIG1Qcm9wZXJ0eUJhZywgb01ldGFNb2RlbCwgc1Byb3BlcnR5SW5mb05hbWUpO1xuXHR9XG5cdHJldHVybiBPRGF0YUZpbHRlckJhckRlbGVnYXRlLl9hZGRGbGV4SXRlbShcblx0XHRzUHJvcGVydHlJbmZvTmFtZSxcblx0XHRvUGFyZW50Q29udHJvbCxcblx0XHRvTWV0YU1vZGVsLFxuXHRcdG1vZGlmaWVyLFxuXHRcdG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQsXG5cdFx0bVByb3BlcnR5QmFnLnZpZXdcblx0KTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyBmaWx0ZXIgZmllbGQgaW4gc3RhbmRhbG9uZSAvIHBlcnNvbmFsaXphdGlvbiBmaWx0ZXIgYmFyLlxuICogQHBhcmFtIG9QYXJlbnRDb250cm9sIFBhcmVudCBjb250cm9sIGluc3RhbmNlIGZyb20gd2hpY2ggdGhlIGZpbHRlciBmaWVsZCBpcyByZW1vdmVkXG4gKiBAcGFyYW0gb0ZpbHRlckZpZWxkUHJvcGVydHkgT2JqZWN0IG9mIHRoZSBmaWx0ZXIgZmllbGQgcHJvcGVydHkgYmVpbmcgcmVtb3ZlZCBhcyBmaWx0ZXIgZmllbGRcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcgSW5zdGFuY2Ugb2YgcHJvcGVydHkgYmFnIGZyb20gRmxleCBBUElcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50IEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZy5tb2RpZmllciBNb2RpZmllciBmcm9tIEZsZXggQVBJXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcHJvbWlzZVxuICovXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLnJlbW92ZUl0ZW0gPSBhc3luYyBmdW5jdGlvbiAoXG5cdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdG9GaWx0ZXJGaWVsZFByb3BlcnR5OiBVSTVFbGVtZW50IHwgRWxlbWVudCxcblx0bVByb3BlcnR5QmFnOiB7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50OyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllciB9XG4pOiBQcm9taXNlPGJvb2xlYW4gfCBudWxsPiB7XG5cdGxldCBkb1JlbW92ZUl0ZW0gPSB0cnVlO1xuXHRjb25zdCBtb2RpZmllciA9IG1Qcm9wZXJ0eUJhZy5tb2RpZmllcjtcblx0Y29uc3QgaXNYTUwgPSBtb2RpZmllciAmJiBtb2RpZmllci50YXJnZXRzID09PSBcInhtbFRyZWVcIjtcblx0aWYgKGlzWE1MKSB7XG5cdFx0Y29uc3QgbW9kZWwgPSBtUHJvcGVydHlCYWcgJiYgbVByb3BlcnR5QmFnLmFwcENvbXBvbmVudCAmJiBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG1vZGVsICYmIG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGlmICghb01ldGFNb2RlbCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0XHR9XG5cdFx0Y29uc3QgZmlsdGVyRmllbGRQcm9wZXJ0eSA9IGF3YWl0IG1Qcm9wZXJ0eUJhZy5tb2RpZmllci5nZXRQcm9wZXJ0eShvRmlsdGVyRmllbGRQcm9wZXJ0eSwgXCJwcm9wZXJ0eUtleVwiKTtcblxuXHRcdGF3YWl0IF9hZGRQcm9wZXJ0eUluZm8ob1BhcmVudENvbnRyb2wsIG1Qcm9wZXJ0eUJhZywgb01ldGFNb2RlbCwgZmlsdGVyRmllbGRQcm9wZXJ0eSBhcyBzdHJpbmcpO1xuXHR9XG5cdGlmIChcblx0XHR0eXBlb2Ygb0ZpbHRlckZpZWxkUHJvcGVydHkgIT09IFwic3RyaW5nXCIgJiZcblx0XHQob0ZpbHRlckZpZWxkUHJvcGVydHkgYXMgVUk1RWxlbWVudCkuaXNBICYmXG5cdFx0KG9GaWx0ZXJGaWVsZFByb3BlcnR5IGFzIFVJNUVsZW1lbnQpLmlzQShcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIilcblx0KSB7XG5cdFx0aWYgKChvRmlsdGVyRmllbGRQcm9wZXJ0eSBhcyBVSTVFbGVtZW50KS5kYXRhKFwiaXNTbG90XCIpID09PSBcInRydWVcIiAmJiBtUHJvcGVydHlCYWcpIHtcblx0XHRcdC8vIEluc2VydGluZyBpbnRvIHRoZSBtb2RpZmllciBjcmVhdGVzIGEgY2hhbmdlIGZyb20gZmxleCBhbHNvIGZpbHRlciBpcyBiZWVuIHJlbW92ZWQgaGVuY2UgcHJvbWlzZSBpcyByZXNvbHZlZCB0byBmYWxzZVxuXHRcdFx0bW9kaWZpZXIuaW5zZXJ0QWdncmVnYXRpb24ob1BhcmVudENvbnRyb2wsIFwiZGVwZW5kZW50c1wiLCBvRmlsdGVyRmllbGRQcm9wZXJ0eSk7XG5cdFx0XHRkb1JlbW92ZUl0ZW0gPSBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShkb1JlbW92ZUl0ZW0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGZpbHRlciBmaWVsZCBjb25kaXRpb24gaW4gc3RhbmRhbG9uZSAvIHBlcnNvbmFsaXphdGlvbiBmaWx0ZXIgYmFyLlxuICogQHBhcmFtIG9QYXJlbnRDb250cm9sIFBhcmVudCBjb250cm9sIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBmaWx0ZXIgZmllbGQgaXMgYWRkZWRcbiAqIEBwYXJhbSBzUHJvcGVydHlJbmZvTmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhZGRlZCBhcyBmaWx0ZXIgZmllbGRcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcgSW5zdGFuY2Ugb2YgcHJvcGVydHkgYmFnIGZyb20gRmxleCBBUElcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50IEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1Qcm9wZXJ0eUJhZy5tb2RpZmllciBNb2RpZmllciBmcm9tIEZsZXggQVBJXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcHJvbWlzZVxuICovXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLmFkZENvbmRpdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIChcblx0b1BhcmVudENvbnRyb2w6IEZpbHRlckJhcixcblx0c1Byb3BlcnR5SW5mb05hbWU6IHN0cmluZyxcblx0bVByb3BlcnR5QmFnOiB7IGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50OyBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllciB9XG4pOiBQcm9taXNlPHZvaWQgfCBudWxsPiB7XG5cdGNvbnN0IG1vZGlmaWVyID0gbVByb3BlcnR5QmFnLm1vZGlmaWVyO1xuXHRjb25zdCBpc1hNTCA9IG1vZGlmaWVyICYmIG1vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiO1xuXHRpZiAoaXNYTUwpIHtcblx0XHRjb25zdCBtb2RlbCA9IG1Qcm9wZXJ0eUJhZyAmJiBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50ICYmIG1Qcm9wZXJ0eUJhZy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbW9kZWwgJiYgbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKCFvTWV0YU1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblx0XHRhd2FpdCBfYWRkUHJvcGVydHlJbmZvKG9QYXJlbnRDb250cm9sLCBtUHJvcGVydHlCYWcsIG9NZXRhTW9kZWwsIHNQcm9wZXJ0eUluZm9OYW1lKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuXG4vKipcbiAqIE1ldGhvZCByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgZmlsdGVyIGZpZWxkIGluIHN0YW5kYWxvbmUgLyBwZXJzb25hbGl6YXRpb24gZmlsdGVyIGJhci5cbiAqIEBwYXJhbSBvUGFyZW50Q29udHJvbCBQYXJlbnQgY29udHJvbCBpbnN0YW5jZSBmcm9tIHdoaWNoIHRoZSBmaWx0ZXIgZmllbGQgaXMgcmVtb3ZlZFxuICogQHBhcmFtIHNQcm9wZXJ0eUluZm9OYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHJlbW92ZWQgYXMgZmlsdGVyIGZpZWxkXG4gKiBAcGFyYW0gbVByb3BlcnR5QmFnIEluc3RhbmNlIG9mIHByb3BlcnR5IGJhZyBmcm9tIEZsZXggQVBJXG4gKiBAcGFyYW0gbVByb3BlcnR5QmFnLmFwcENvbXBvbmVudCBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUHJvcGVydHlCYWcubW9kaWZpZXIgTW9kaWZpZXIgZnJvbSBGbGV4IEFQSVxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIHByb21pc2VcbiAqL1xuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5yZW1vdmVDb25kaXRpb24gPSBhc3luYyBmdW5jdGlvbiAoXG5cdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdHNQcm9wZXJ0eUluZm9OYW1lOiBzdHJpbmcsXG5cdG1Qcm9wZXJ0eUJhZzoge1xuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRcdG1vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyO1xuXHR9XG4pOiBQcm9taXNlPHZvaWQgfCBudWxsPiB7XG5cdGNvbnN0IG1vZGlmaWVyID0gbVByb3BlcnR5QmFnLm1vZGlmaWVyO1xuXHRjb25zdCBpc1hNTCA9IG1vZGlmaWVyICYmIG1vZGlmaWVyLnRhcmdldHMgPT09IFwieG1sVHJlZVwiO1xuXHRpZiAoaXNYTUwpIHtcblx0XHRjb25zdCBwcm9wZXJ0eUluZm9Gcm9tQ0QgPSBhd2FpdCBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllcjxzdHJpbmc+KFxuXHRcdFx0b1BhcmVudENvbnRyb2wsXG5cdFx0XHRcInNhcF9mZV9GaWx0ZXJCYXJEZWxlZ2F0ZV9wcm9wZXJ0eUluZm9NYXBcIixcblx0XHRcdG1vZGlmaWVyXG5cdFx0KTtcblx0XHRpZiAoIXByb3BlcnR5SW5mb0Zyb21DRCkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBtUHJvcGVydHlCYWcgJiYgbVByb3BlcnR5QmFnLmFwcENvbXBvbmVudCAmJiBtUHJvcGVydHlCYWcuYXBwQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gbW9kZWwgJiYgbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRpZiAoIW9NZXRhTW9kZWwpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IF9hZGRQcm9wZXJ0eUluZm8ob1BhcmVudENvbnRyb2wsIG1Qcm9wZXJ0eUJhZywgb01ldGFNb2RlbCwgc1Byb3BlcnR5SW5mb05hbWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuLyoqXG4gKiBDbGVhcnMgYWxsIGlucHV0IHZhbHVlcyBvZiB2aXNpYmxlIGZpbHRlciBmaWVsZHMgaW4gdGhlIGZpbHRlciBiYXIuXG4gKiBAcGFyYW0gb0ZpbHRlckNvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIEZpbHRlckJhciBjb250cm9sXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcHJvbWlzZVxuICovXG5PRGF0YUZpbHRlckJhckRlbGVnYXRlLmNsZWFyRmlsdGVycyA9IGFzeW5jIGZ1bmN0aW9uIChvRmlsdGVyQ29udHJvbDogRmlsdGVyQmFyKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGZpbHRlckJhckFQSSA9IG9GaWx0ZXJDb250cm9sLmdldFBhcmVudCgpO1xuXHRyZXR1cm4gU3RhdGVIZWxwZXIuY2xlYXJGaWx0ZXJWYWx1ZXMoZmlsdGVyQmFyQVBJIGFzIE1hY3JvQVBJKTtcbn07XG4vKipcbiAqIENyZWF0ZXMgdGhlIGZpbHRlciBmaWVsZCBpbiB0aGUgdGFibGUgYWRhcHRhdGlvbiBvZiB0aGUgRmlsdGVyQmFyLlxuICogQHBhcmFtIHNQcm9wZXJ0eUluZm9OYW1lIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBlbnRpdHkgdHlwZSBmb3Igd2hpY2ggdGhlIGZpbHRlciBmaWVsZCBuZWVkcyB0byBiZSBjcmVhdGVkXG4gKiBAcGFyYW0gb1BhcmVudENvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcmV0dXJucyBPbmNlIHJlc29sdmVkLCBhIGZpbHRlciBmaWVsZCBkZWZpbml0aW9uIGlzIHJldHVybmVkXG4gKi9cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2FkZFAxM25JdGVtID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRzUHJvcGVydHlJbmZvTmFtZTogc3RyaW5nLFxuXHRvUGFyZW50Q29udHJvbDogRmlsdGVyQmFyXG4pOiBQcm9taXNlPE51bGxhYmxlTW9kaWZpZXJFbGVtZW50PiB7XG5cdHJldHVybiBEZWxlZ2F0ZVV0aWwuZmV0Y2hNb2RlbChvUGFyZW50Q29udHJvbClcblx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAob01vZGVsOiBNb2RlbCkge1xuXHRcdFx0cmV0dXJuIE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2FkZEZsZXhJdGVtKFxuXHRcdFx0XHRzUHJvcGVydHlJbmZvTmFtZSxcblx0XHRcdFx0b1BhcmVudENvbnRyb2wsXG5cdFx0XHRcdG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHQpO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIk1vZGVsIGNvdWxkIG5vdCBiZSByZXNvbHZlZFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0pO1xufTtcbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuZmV0Y2hQcm9wZXJ0aWVzRm9yRW50aXR5ID0gZnVuY3Rpb24gKFxuXHRzRW50aXR5VHlwZVBhdGg6IHN0cmluZyxcblx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdG9GaWx0ZXJDb250cm9sOiBJRmlsdGVyQ29udHJvbFxuKTogUHJvcGVydHlJbmZvW10ge1xuXHRjb25zdCBvRW50aXR5VHlwZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlUeXBlUGF0aCk7XG5cdGNvbnN0IGluY2x1ZGVIaWRkZW4gPSBvRmlsdGVyQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLnZhbHVlaGVscC5GaWx0ZXJCYXJcIikgPyB0cnVlIDogdW5kZWZpbmVkO1xuXHRpZiAoIW9GaWx0ZXJDb250cm9sIHx8ICFvRW50aXR5VHlwZSkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRjb25zdCBvQ29udmVydGVyQ29udGV4dCA9IEZpbHRlclV0aWxzLmNyZWF0ZUNvbnZlcnRlckNvbnRleHQob0ZpbHRlckNvbnRyb2wsIHNFbnRpdHlUeXBlUGF0aCk7XG5cdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzRW50aXR5VHlwZVBhdGgpO1xuXG5cdGNvbnN0IG1GaWx0ZXJGaWVsZHMgPSBGaWx0ZXJVdGlscy5nZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMoXG5cdFx0b0ZpbHRlckNvbnRyb2wsXG5cdFx0c0VudGl0eVR5cGVQYXRoLFxuXHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0b01ldGFNb2RlbCxcblx0XHRDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob0ZpbHRlckNvbnRyb2wpXG5cdCk7XG5cdGxldCBhRmV0Y2hlZFByb3BlcnRpZXM6IEZFUHJvcGVydHlJbmZvW10gPSBbXTtcblx0bUZpbHRlckZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChvRmlsdGVyRmllbGRJbmZvOiBGaWx0ZXJGaWVsZCkge1xuXHRcdGNvbnN0IHNBbm5vdGF0aW9uUGF0aCA9IG9GaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGg7XG5cdFx0aWYgKHNBbm5vdGF0aW9uUGF0aCAmJiAhb0ZpbHRlckZpZWxkSW5mby50ZW1wbGF0ZSkge1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5QW5ub3RhdGlvbnMgPSBvQ29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLnJlc29sdmVQYXRoPFByb3BlcnR5PihzQW5ub3RhdGlvblBhdGgpLnRhcmdldDtcblx0XHRcdGNvbnN0IHNUYXJnZXRQcm9wZXJ0eVByZWZpeCA9IENvbW1vbkhlbHBlci5nZXRMb2NhdGlvbkZvclByb3BlcnR5UGF0aChvTWV0YU1vZGVsLCBzQW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gc0Fubm90YXRpb25QYXRoLnJlcGxhY2UoYCR7c1RhcmdldFByb3BlcnR5UHJlZml4fS9gLCBcIlwiKTtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBvQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZHMgPSBlbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uU2VsZWN0aW9uRmllbGRzO1xuXHRcdFx0Y29uc3QgZmlsdGVyRmFjZXRzID0gZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uVUk/LkZpbHRlckZhY2V0cztcblx0XHRcdGlmIChcblx0XHRcdFx0b1Byb3BlcnR5QW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0T0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5faXNGaWx0ZXJBZGFwdGFibGUob0ZpbHRlckZpZWxkSW5mbywgb1Byb3BlcnR5QW5ub3RhdGlvbnMsIHNlbGVjdGlvbkZpZWxkcywgZmlsdGVyRmFjZXRzKSAmJlxuXHRcdFx0XHRpc1Byb3BlcnR5RmlsdGVyYWJsZShvTWV0YU1vZGVsLCBzVGFyZ2V0UHJvcGVydHlQcmVmaXgsIF9nZXRQcm9wZXJ0eVBhdGgoc1Byb3BlcnR5KSwgdHJ1ZSlcblx0XHRcdCkge1xuXHRcdFx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChvRmlsdGVyRmllbGRJbmZvIGFzIFByb3BlcnR5SW5mbyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vQ3VzdG9tIEZpbHRlcnNcblx0XHRcdGFGZXRjaGVkUHJvcGVydGllcy5wdXNoKG9GaWx0ZXJGaWVsZEluZm8gYXMgUHJvcGVydHlJbmZvKTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0IGFQYXJhbWV0ZXJGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IHByb2Nlc3NlZEZpZWxkcyA9IHByb2Nlc3NTZWxlY3Rpb25GaWVsZHMoYUZldGNoZWRQcm9wZXJ0aWVzIGFzIEZpbHRlckZpZWxkW10sIG9Db252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgcHJvY2Vzc2VkRmllbGRzS2V5czogc3RyaW5nW10gPSBbXTtcblx0cHJvY2Vzc2VkRmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wczogRkVQcm9wZXJ0eUluZm8pIHtcblx0XHRpZiAob1Byb3BzLmtleSkge1xuXHRcdFx0cHJvY2Vzc2VkRmllbGRzS2V5cy5wdXNoKG9Qcm9wcy5rZXkpO1xuXHRcdH1cblx0fSk7XG5cblx0YUZldGNoZWRQcm9wZXJ0aWVzID0gYUZldGNoZWRQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAob1Byb3A6IEZFUHJvcGVydHlJbmZvKSB7XG5cdFx0cmV0dXJuIHByb2Nlc3NlZEZpZWxkc0tleXMuaW5jbHVkZXMob1Byb3Aua2V5ISk7XG5cdH0pO1xuXHRjb25zdCBkYXRhTW9kZWwgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlTZXRQYXRoKSk7XG5cdGNvbnN0IG9GUiA9IEZpbHRlclJlc3RyaWN0aW9ucy5nZXRGaWx0ZXJSZXN0cmljdGlvbnNCeURhdGFNb2RlbChkYXRhTW9kZWwgYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KSxcblx0XHRtQWxsb3dlZEV4cHJlc3Npb25zID0gb0ZSLkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucztcblx0Ly9PYmplY3Qua2V5cyhwcm9jZXNzZWRGaWVsZHMpLmZvckVhY2goZnVuY3Rpb24gKHNGaWx0ZXJGaWVsZEtleTogc3RyaW5nKSB7XG5cdHByb2Nlc3NlZEZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcCwgaUZpbHRlckZpZWxkSW5kZXg6IG51bWJlcikge1xuXHRcdGNvbnN0IG9TZWxGaWVsZCA9IGFGZXRjaGVkUHJvcGVydGllc1tpRmlsdGVyRmllbGRJbmRleF07XG5cdFx0aWYgKCFvU2VsRmllbGQgfHwgIW9TZWxGaWVsZC5jb25kaXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBfZ2V0UHJvcGVydHlQYXRoKG9TZWxGaWVsZC5jb25kaXRpb25QYXRoKTtcblx0XHQvL2ZldGNoQmFzaWNcblx0XHRvUHJvcCA9IE9iamVjdC5hc3NpZ24ob1Byb3AsIHtcblx0XHRcdGdyb3VwOiBvU2VsRmllbGQuZ3JvdXAsXG5cdFx0XHRncm91cExhYmVsOiBvU2VsRmllbGQuZ3JvdXBMYWJlbCxcblx0XHRcdHBhdGg6IG9TZWxGaWVsZC5jb25kaXRpb25QYXRoLFxuXHRcdFx0dG9vbHRpcDogbnVsbCxcblx0XHRcdHJlbW92ZUZyb21BcHBTdGF0ZTogZmFsc2UsXG5cdFx0XHRoYXNWYWx1ZUhlbHA6IGZhbHNlXG5cdFx0fSk7XG5cblx0XHQvL2ZldGNoUHJvcEluZm9cblx0XHRpZiAob1NlbEZpZWxkLmFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRjb25zdCBzQW5ub3RhdGlvblBhdGggPSBvU2VsRmllbGQuYW5ub3RhdGlvblBhdGg7XG5cdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQW5ub3RhdGlvblBhdGgpLFxuXHRcdFx0XHRvUHJvcGVydHlBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NBbm5vdGF0aW9uUGF0aH1AYCksXG5cdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBbm5vdGF0aW9uUGF0aCk7XG5cblx0XHRcdGNvbnN0IGJSZW1vdmVGcm9tQXBwU3RhdGUgPVxuXHRcdFx0XHRvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiXSB8fFxuXHRcdFx0XHRvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0XCJdIHx8XG5cdFx0XHRcdG9Qcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCJdO1xuXG5cdFx0XHRjb25zdCBzVGFyZ2V0UHJvcGVydHlQcmVmaXggPSBDb21tb25IZWxwZXIuZ2V0TG9jYXRpb25Gb3JQcm9wZXJ0eVBhdGgob01ldGFNb2RlbCwgb1NlbEZpZWxkLmFubm90YXRpb25QYXRoKTtcblx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IHNBbm5vdGF0aW9uUGF0aC5yZXBsYWNlKGAke3NUYXJnZXRQcm9wZXJ0eVByZWZpeH0vYCwgXCJcIik7XG5cdFx0XHRsZXQgb0ZpbHRlckRlZmF1bHRWYWx1ZUFubm90YXRpb247XG5cdFx0XHRsZXQgb0ZpbHRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdGlmIChvUHJvcGVydHlDb250ZXh0ICYmIGlzUHJvcGVydHlGaWx0ZXJhYmxlKG9NZXRhTW9kZWwsIHNUYXJnZXRQcm9wZXJ0eVByZWZpeCwgX2dldFByb3BlcnR5UGF0aChzUHJvcGVydHkpLCB0cnVlKSkge1xuXHRcdFx0XHRvRmlsdGVyRGVmYXVsdFZhbHVlQW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJEZWZhdWx0VmFsdWVcIl07XG5cdFx0XHRcdGlmIChvRmlsdGVyRGVmYXVsdFZhbHVlQW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdG9GaWx0ZXJEZWZhdWx0VmFsdWUgPSBvRmlsdGVyRGVmYXVsdFZhbHVlQW5ub3RhdGlvbltgJCR7Z2V0TW9kZWxUeXBlKG9Qcm9wZXJ0eS4kVHlwZSl9YF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvUHJvcCA9IE9iamVjdC5hc3NpZ24ob1Byb3AsIHtcblx0XHRcdFx0XHR0b29sdGlwOiBvUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUXVpY2tJbmZvXCJdIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRyZW1vdmVGcm9tQXBwU3RhdGU6IGJSZW1vdmVGcm9tQXBwU3RhdGUsXG5cdFx0XHRcdFx0aGFzVmFsdWVIZWxwOiBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5Q29udGV4dC5nZXRPYmplY3QoKSwgeyBjb250ZXh0OiBvUHJvcGVydHlDb250ZXh0IH0pLFxuXHRcdFx0XHRcdGRlZmF1bHRGaWx0ZXJDb25kaXRpb25zOiBvRmlsdGVyRGVmYXVsdFZhbHVlXG5cdFx0XHRcdFx0XHQ/IFtcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFBhdGg6IG9TZWxGaWVsZC5jb25kaXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlczogW29GaWx0ZXJEZWZhdWx0VmFsdWVdXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ICBdXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvL2Jhc2VcblxuXHRcdGlmIChvUHJvcCkge1xuXHRcdFx0aWYgKG1BbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5UGF0aF0gJiYgbUFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHlQYXRoXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG9Qcm9wLmZpbHRlckV4cHJlc3Npb24gPSBDb21tb25VdGlscy5nZXRTcGVjaWZpY0FsbG93ZWRFeHByZXNzaW9uKG1BbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5UGF0aF0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Byb3AuZmlsdGVyRXhwcmVzc2lvbiA9IFwiYXV0b1wiO1xuXHRcdFx0fVxuXG5cdFx0XHRvUHJvcCA9IE9iamVjdC5hc3NpZ24ob1Byb3AsIHtcblx0XHRcdFx0dmlzaWJsZTogb1NlbEZpZWxkLmF2YWlsYWJpbGl0eSA9PT0gXCJEZWZhdWx0XCJcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHByb2Nlc3NlZEZpZWxkc1tpRmlsdGVyRmllbGRJbmRleF0gPSBvUHJvcDtcblx0fSk7XG5cdHByb2Nlc3NlZEZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wSW5mbzogRkVQcm9wZXJ0eUluZm8pIHtcblx0XHQvLyBrZXkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgbmFtZVxuXHRcdHByb3BJbmZvLmtleSA9IHByb3BJbmZvLm5hbWU7XG5cdFx0aWYgKHByb3BJbmZvLnBhdGggPT09IFwiJGVkaXRTdGF0ZVwiKSB7XG5cdFx0XHRwcm9wSW5mby5sYWJlbCA9IGdldFJlc291cmNlTW9kZWwob0ZpbHRlckNvbnRyb2wpLmdldFRleHQoXCJGSUxURVJCQVJfRURJVElOR19TVEFUVVNcIik7XG5cdFx0fVxuXHRcdHByb3BJbmZvLnR5cGVDb25maWcgPSBUeXBlTWFwLmdldFR5cGVDb25maWcocHJvcEluZm8uZGF0YVR5cGUsIHByb3BJbmZvLmZvcm1hdE9wdGlvbnMsIHByb3BJbmZvLmNvbnN0cmFpbnRzKTtcblx0XHRwcm9wSW5mby5sYWJlbCA9IGdldExvY2FsaXplZFRleHQocHJvcEluZm8ubGFiZWwhLCBvRmlsdGVyQ29udHJvbCkgfHwgXCJcIjtcblx0XHRpZiAocHJvcEluZm8uaXNQYXJhbWV0ZXIpIHtcblx0XHRcdGFQYXJhbWV0ZXJGaWVsZHMucHVzaChwcm9wSW5mby5uYW1lKTtcblx0XHR9XG5cdH0pO1xuXG5cdGFGZXRjaGVkUHJvcGVydGllcyA9IHByb2Nlc3NlZEZpZWxkcztcblx0RGVsZWdhdGVVdGlsLnNldEN1c3RvbURhdGEob0ZpbHRlckNvbnRyb2wsIFwicGFyYW1ldGVyc1wiLCBhUGFyYW1ldGVyRmllbGRzIGFzIHVua25vd24gYXMgc3RyaW5nKTtcblxuXHRyZXR1cm4gYUZldGNoZWRQcm9wZXJ0aWVzIGFzIFByb3BlcnR5SW5mb1tdO1xufTtcblxuZnVuY3Rpb24gZ2V0TGluZUl0ZW1RdWFsaWZpZXJGcm9tVGFibGUob0NvbnRyb2w6IE1hbmFnZWRPYmplY3QsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKG9Db250cm9sLmlzQTxFbmhhbmNlV2l0aFVJNTxUYWJsZUFQST4+KFwic2FwLmZlLm1hY3Jvcy50YWJsZS5UYWJsZUFQSVwiKSkge1xuXHRcdGNvbnN0IGFubm90YXRpb25QYXRocyA9IG9Db250cm9sLmdldE1ldGFQYXRoKCkuc3BsaXQoXCIjXCIpWzBdLnNwbGl0KFwiL1wiKTtcblx0XHRzd2l0Y2ggKGFubm90YXRpb25QYXRoc1thbm5vdGF0aW9uUGF0aHMubGVuZ3RoIC0gMV0pIHtcblx0XHRcdGNhc2UgYEAke1VJQW5ub3RhdGlvblRlcm1zLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnR9YDpcblx0XHRcdGNhc2UgYEAke1VJQW5ub3RhdGlvblRlcm1zLlByZXNlbnRhdGlvblZhcmlhbnR9YDpcblx0XHRcdFx0cmV0dXJuIG9NZXRhTW9kZWxcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KG9Db250cm9sLmdldE1ldGFQYXRoKCkpXG5cdFx0XHRcdFx0LlZpc3VhbGl6YXRpb25zPy5maW5kKCh2aXN1YWxpemF0aW9uOiB7ICRBbm5vdGF0aW9uUGF0aDogc3RyaW5nIH0pID0+XG5cdFx0XHRcdFx0XHR2aXN1YWxpemF0aW9uLiRBbm5vdGF0aW9uUGF0aC5pbmNsdWRlcyhgQCR7VUlBbm5vdGF0aW9uVGVybXMuTGluZUl0ZW19YClcblx0XHRcdFx0XHQpLiRBbm5vdGF0aW9uUGF0aDtcblx0XHRcdGNhc2UgYEAke1VJQW5ub3RhdGlvblRlcm1zLkxpbmVJdGVtfWA6XG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRocyA9IG9Db250cm9sLmdldE1ldGFQYXRoKCkuc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRyZXR1cm4gbWV0YVBhdGhzW21ldGFQYXRocy5sZW5ndGggLSAxXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5faXNGaWx0ZXJBZGFwdGFibGUgPSBmdW5jdGlvbiAoXG5cdGZpbHRlckZpZWxkSW5mbzogRmlsdGVyRmllbGQsXG5cdHByb3BlcnR5QW5ub3RhdGlvbnM6IFByb3BlcnR5LFxuXHRzZWxlY3Rpb25GaWVsZHM/OiBTZWxlY3Rpb25GaWVsZHMsXG5cdGZpbHRlckZhY2V0cz86IEZpbHRlckZhY2V0c1xuKTogYm9vbGVhbiB7XG5cdGxldCBpc0luRmlsdGVyRmFjZXRzOiBib29sZWFuO1xuXHRjb25zdCBpc1NlbGVjdGlvbkZpZWxkID0gc2VsZWN0aW9uRmllbGRzID8gT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5faXNGaWx0ZXJJblNlbGVjdGlvbkZpZWxkcyhzZWxlY3Rpb25GaWVsZHMsIGZpbHRlckZpZWxkSW5mbykgOiBmYWxzZTtcblx0aWYgKGZpbHRlckZhY2V0cykge1xuXHRcdGlzSW5GaWx0ZXJGYWNldHMgPSBmaWx0ZXJGYWNldHMuc29tZShmdW5jdGlvbiAoZmlsdGVyRmFjZXQ6IFJlZmVyZW5jZUZhY2V0KSB7XG5cdFx0XHRjb25zdCBmaWVsZEdyb3VwID0gZmlsdGVyRmFjZXQuVGFyZ2V0Py4kdGFyZ2V0IGFzIEZpZWxkR3JvdXBUeXBlO1xuXHRcdFx0cmV0dXJuIGZpZWxkR3JvdXA/LkRhdGEuc29tZShmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdFx0XHRcdC8vIHdlIGV4cGVjdCBkYXRhRmllbGQgdG8gYmUgRGF0YUZpZWxkVHlwZXMgKGhhdmluZyBhIFZhbHVlKSBpbnNpZGUgRmllbGRHcm91cHMgaW5zaWRlIEZpbHRlckZhY2V0c1xuXHRcdFx0XHRpZiAoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWUucGF0aCA9PT0gZmlsdGVyRmllbGRJbmZvLmtleSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGRhdGFGaWVsZCB0eXBlcyBoYXZpbmcgbm8gVmFsdWUgKERhdGFGaWVsZEZvckFubm90YXRpb25UeXBlcywgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBUeXBlcyksIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2ssIGJ1dCB0aGlzIHNob3VsZCBub3Qgb2NjdXIgYW55d2F5XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGlzSW5GaWx0ZXJGYWNldHMgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gaXNTZWxlY3Rpb25GaWVsZCB8fCBpc0luRmlsdGVyRmFjZXRzIHx8ICFwcm9wZXJ0eUFubm90YXRpb25zLmFubm90YXRpb25zPy5VST8uQWRhcHRhdGlvbkhpZGRlbjtcbn07XG5cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX2lzRmlsdGVySW5TZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbiAoc2VsZWN0aW9uRmllbGRzOiBTZWxlY3Rpb25GaWVsZHMsIGZpbHRlckZpZWxkSW5mbzogRmlsdGVyRmllbGQpOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyRmllbGRLZXkgPSBmaWx0ZXJGaWVsZEluZm8ua2V5Py5pbmRleE9mKFwiOjpcIikgPiAwID8gZmlsdGVyRmllbGRJbmZvLmtleT8ucmVwbGFjZShcIjo6XCIsIFwiL1wiKSA6IGZpbHRlckZpZWxkSW5mby5rZXk7XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHMuc29tZShmdW5jdGlvbiAoc2VsZWN0aW9uRmllbGQ6IEFubm90YXRpb25TZWxlY3Rpb25GaWVsZCkge1xuXHRcdGlmIChzZWxlY3Rpb25GaWVsZC52YWx1ZSA9PT0gZmlsdGVyRmllbGRLZXkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufTtcblxuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5fYWRkRmxleEl0ZW0gPSBhc3luYyBmdW5jdGlvbiAoXG5cdHNGbGV4UHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdG9QYXJlbnRDb250cm9sOiBGaWx0ZXJCYXIsXG5cdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRvTW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXIgfCB1bmRlZmluZWQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCB8IHVuZGVmaW5lZCxcblx0dmlldz86IFZpZXcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8TnVsbGFibGVNb2RpZmllckVsZW1lbnQ+IHtcblx0bGV0IHByb3BlcnR5SW5mb3NGcm9tRmlsdGVyQmFyOiBQcm9wZXJ0eUluZm9bXSA9IFtdO1xuXHRjb25zdCBiSXNYTUwgPSAhIW9Nb2RpZmllciAmJiBvTW9kaWZpZXIudGFyZ2V0cyA9PT0gXCJ4bWxUcmVlXCI7XG5cdGlmIChiSXNYTUwpIHtcblx0XHRjb25zdCBjdXN0b21EYXRhVmFsdWUgPSBhd2FpdCBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllcjxzdHJpbmc+KG9QYXJlbnRDb250cm9sLCBcImZlRmlsdGVySW5mb1wiLCBvTW9kaWZpZXIpO1xuXHRcdGlmIChjdXN0b21EYXRhVmFsdWUpIHtcblx0XHRcdHByb3BlcnR5SW5mb3NGcm9tRmlsdGVyQmFyID0gSlNPTi5wYXJzZShjdXN0b21EYXRhVmFsdWUpIGFzIFByb3BlcnR5SW5mb1tdOyAvLyByZXRyaWV2ZSBwcmUtZmV0Y2hlZCBmaWx0ZXIgaW5mbyBmcm9tIGN1c3RvbSBkYXRhLCByZXF1aXJlZCBkdXJpbmcgdGVtcGxhdGluZ1xuXHRcdH1cblx0fVxuXHRjb25zdCBzRmlsdGVyQmFySWQgPSBvTW9kaWZpZXIgPyBvTW9kaWZpZXIuZ2V0SWQob1BhcmVudENvbnRyb2wpIDogb1BhcmVudENvbnRyb2wuZ2V0SWQoKSxcblx0XHRzSWRQcmVmaXggPSBvTW9kaWZpZXIgPyBcIlwiIDogXCJBZGFwdGF0aW9uXCIsXG5cdFx0YVNlbGVjdGlvbkZpZWxkcyA9IEZpbHRlclV0aWxzLmdldENvbnZlcnRlZEZpbHRlckZpZWxkcyhcblx0XHRcdG9QYXJlbnRDb250cm9sIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdG9Nb2RpZmllcixcblx0XHRcdG9Nb2RpZmllciA/IHVuZGVmaW5lZCA6IGdldExpbmVJdGVtUXVhbGlmaWVyRnJvbVRhYmxlKG9QYXJlbnRDb250cm9sLmdldFBhcmVudCgpISwgb01ldGFNb2RlbCksXG5cdFx0XHRwcm9wZXJ0eUluZm9zRnJvbUZpbHRlckJhclxuXHRcdCksXG5cdFx0b1NlbGVjdGlvbkZpZWxkID0gT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5fZmluZFNlbGVjdGlvbkZpZWxkKGFTZWxlY3Rpb25GaWVsZHMsIHNGbGV4UHJvcGVydHlOYW1lKSxcblx0XHRzUHJvcGVydHlQYXRoID0gX2dldFByb3BlcnR5UGF0aChzRmxleFByb3BlcnR5TmFtZSk7XG5cblx0aWYgKHNGbGV4UHJvcGVydHlOYW1lID09PSBFRElUX1NUQVRFX1BST1BFUlRZX05BTUUpIHtcblx0XHRyZXR1cm4gX3RlbXBsYXRlRWRpdFN0YXRlKF9nZW5lcmF0ZUlkUHJlZml4KHNGaWx0ZXJCYXJJZCwgYCR7c0lkUHJlZml4fUZpbHRlckZpZWxkYCksIG9NZXRhTW9kZWwsIG9Nb2RpZmllcik7XG5cdH0gZWxzZSBpZiAoc0ZsZXhQcm9wZXJ0eU5hbWUgPT09IFNFQVJDSF9QUk9QRVJUWV9OQU1FKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblx0fSBlbHNlIGlmIChvU2VsZWN0aW9uRmllbGQ/LnRlbXBsYXRlKSB7XG5cdFx0cmV0dXJuIE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuX3RlbXBsYXRlQ3VzdG9tRmlsdGVyKFxuXHRcdFx0b1BhcmVudENvbnRyb2wgYXMgdW5rbm93biBhcyBJRmlsdGVyQ29udHJvbCxcblx0XHRcdF9nZW5lcmF0ZUlkUHJlZml4KHNGaWx0ZXJCYXJJZCwgYCR7c0lkUHJlZml4fWApLFxuXHRcdFx0b1NlbGVjdGlvbkZpZWxkLFxuXHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdG9Nb2RpZmllciFcblx0XHQpO1xuXHR9XG5cblx0aWYgKG9TZWxlY3Rpb25GaWVsZD8udHlwZSA9PT0gXCJTbG90XCIgJiYgb01vZGlmaWVyKSB7XG5cdFx0cmV0dXJuIF9hZGRYTUxDdXN0b21GaWx0ZXJGaWVsZChvUGFyZW50Q29udHJvbCBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sLCBvTW9kaWZpZXIsIHNQcm9wZXJ0eVBhdGgpO1xuXHR9XG5cblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gQ29tbW9uSGVscGVyLmdldE5hdmlnYXRpb25QYXRoKHNQcm9wZXJ0eVBhdGgpO1xuXHRsZXQgc0VudGl0eVR5cGVQYXRoOiBzdHJpbmc7XG5cdGxldCBzVXNlU2VtYW50aWNEYXRlUmFuZ2U7XG5cdGxldCBvU2V0dGluZ3M6IHtcblx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdGNvbnRleHRQYXRoOiBDb250ZXh0O1xuXHRcdFx0cHJvcGVydHk6IENvbnRleHQ7XG5cdFx0fTtcblx0XHRtb2RlbHM6IHtcblx0XHRcdGNvbnRleHRQYXRoOiBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdHByb3BlcnR5PzogT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRtZXRhUGF0aD86IE9EYXRhTWV0YU1vZGVsO1xuXHRcdH07XG5cdFx0aXNYTUw6IGJvb2xlYW47XG5cdH07XG5cdGxldCBzQmluZGluZ1BhdGg7XG5cdGxldCBvUGFyYW1ldGVyczoge1xuXHRcdG1ldGFQYXRoOiBzdHJpbmc7XG5cdFx0c1Byb3BlcnR5TmFtZTogc3RyaW5nO1xuXHRcdHNCaW5kaW5nUGF0aDogc3RyaW5nO1xuXHRcdHNWYWx1ZUhlbHBUeXBlOiBzdHJpbmc7XG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWw7XG5cdFx0c0lkUHJlZml4OiBzdHJpbmc7XG5cdFx0b1NldHRpbmdzOiB1bmtub3duO1xuXHRcdHNWaElkUHJlZml4OiBzdHJpbmc7XG5cdFx0c05hdmlnYXRpb25QcmVmaXg/OiBzdHJpbmc7XG5cdFx0YlVzZVNlbWFudGljRGF0ZVJhbmdlOiBib29sZWFuO1xuXHRcdG9Nb2RpZmllcj86IEJhc2VUcmVlTW9kaWZpZXI7XG5cdFx0b0NvbnRyb2w6IFVJNUVsZW1lbnQ7XG5cdFx0dmlzdWFsRmlsdGVyPzogdW5rbm93bjtcblx0XHR2aWV3PzogVmlldztcblx0XHRsYWJlbD86IHN0cmluZztcblx0fTtcblxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAob1NlbGVjdGlvbkZpZWxkPy5pc1BhcmFtZXRlcikge1xuXHRcdFx0XHRjb25zdCBzQW5ub3RhdGlvblBhdGggPSBvU2VsZWN0aW9uRmllbGQuYW5ub3RhdGlvblBhdGg7XG5cdFx0XHRcdHJldHVybiBzQW5ub3RhdGlvblBhdGguc3Vic3RyaW5nKDAsIHNBbm5vdGF0aW9uUGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllcjxzdHJpbmc+KG9QYXJlbnRDb250cm9sLCBcImVudGl0eVR5cGVcIiwgb01vZGlmaWVyKTtcblx0XHR9KVxuXHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChzUmV0cmlldmVkRW50aXR5VHlwZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdFx0c0VudGl0eVR5cGVQYXRoID0gc1JldHJpZXZlZEVudGl0eVR5cGVQYXRoITtcblx0XHRcdHJldHVybiBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllcjxzdHJpbmc+KG9QYXJlbnRDb250cm9sLCBcInVzZVNlbWFudGljRGF0ZVJhbmdlXCIsIG9Nb2RpZmllcik7XG5cdFx0fSlcblx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoc1JldHJpZXZlZFVzZVNlbWFudGljRGF0ZVJhbmdlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0XHRcdHNVc2VTZW1hbnRpY0RhdGVSYW5nZSA9IHNSZXRyaWV2ZWRVc2VTZW1hbnRpY0RhdGVSYW5nZTtcblx0XHRcdGNvbnN0IG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlUeXBlUGF0aCArIHNQcm9wZXJ0eVBhdGgpITtcblx0XHRcdGxldCBzSW5GaWx0ZXJCYXJJZCA9IG9Nb2RpZmllciA/IG9Nb2RpZmllci5nZXRJZChvUGFyZW50Q29udHJvbCkgOiBvUGFyZW50Q29udHJvbC5nZXRJZCgpO1xuXHRcdFx0aWYgKHNJbkZpbHRlckJhcklkLmVuZHNXaXRoKFwiLWNvbnRlbnRcIikpIHtcblx0XHRcdFx0Ly8gLWNvbnRlbnQgaXMgb25seSBhZGRlZCB3aGVuIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGRpcmVjdGx5IGluIHRoZSBmaWx0ZXIgYmFyXG5cdFx0XHRcdHNJbkZpbHRlckJhcklkID0gc0luRmlsdGVyQmFySWQuc3Vic3RyaW5nKDAsIHNJbkZpbHRlckJhcklkLmxhc3RJbmRleE9mKFwiLWNvbnRlbnRcIikpO1xuXHRcdFx0XHQvLyBCeSB1c2luZyB0aGUgaWQgb2YgdGhlIHBhcmVudCBjb250cm9sLCB3ZSBjYW4gZ2V0IHRoZSBjb3JyZWN0IGlkUHJlZml4IGZvciB0aGUgdmFsdWUgaGVscFxuXHRcdFx0fVxuXHRcdFx0b1NldHRpbmdzID0ge1xuXHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRjb250ZXh0UGF0aDogb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5VHlwZVBhdGgpISxcblx0XHRcdFx0XHRwcm9wZXJ0eTogb1Byb3BlcnR5Q29udGV4dFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRjb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRwcm9wZXJ0eTogb01ldGFNb2RlbFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRpc1hNTDogYklzWE1MXG5cdFx0XHR9O1xuXHRcdFx0c0JpbmRpbmdQYXRoID0gYC8ke01vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc0VudGl0eVR5cGVQYXRoKVxuXHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpXG5cdFx0XHRcdC5qb2luKFwiL1wiKX1gO1xuXHRcdFx0b1BhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdG1ldGFQYXRoOiBvUHJvcGVydHlDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0c1Byb3BlcnR5TmFtZTogc1Byb3BlcnR5UGF0aCxcblx0XHRcdFx0c0JpbmRpbmdQYXRoOiBzQmluZGluZ1BhdGgsXG5cdFx0XHRcdHNWYWx1ZUhlbHBUeXBlOiBzSWRQcmVmaXggKyBWQUxVRV9IRUxQX1RZUEUsXG5cdFx0XHRcdG9Db250cm9sOiBvUGFyZW50Q29udHJvbCxcblx0XHRcdFx0b01ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0b01vZGlmaWVyOiBvTW9kaWZpZXIsXG5cdFx0XHRcdHNJZFByZWZpeDogX2dlbmVyYXRlSWRQcmVmaXgoc0luRmlsdGVyQmFySWQsIGAke3NJZFByZWZpeH1GaWx0ZXJGaWVsZGAsIHNOYXZpZ2F0aW9uUGF0aCksXG5cdFx0XHRcdHNWaElkUHJlZml4OiBfZ2VuZXJhdGVJZFByZWZpeChzSW5GaWx0ZXJCYXJJZCwgc0lkUHJlZml4ICsgVkFMVUVfSEVMUF9UWVBFKSxcblx0XHRcdFx0c05hdmlnYXRpb25QcmVmaXg6IHNOYXZpZ2F0aW9uUGF0aCxcblx0XHRcdFx0YlVzZVNlbWFudGljRGF0ZVJhbmdlOiBzVXNlU2VtYW50aWNEYXRlUmFuZ2UgYXMgdW5rbm93biBhcyBib29sZWFuLFxuXHRcdFx0XHRvU2V0dGluZ3M6IG9TZWxlY3Rpb25GaWVsZD8uc2V0dGluZ3MgPz8ge30sXG5cdFx0XHRcdHZpc3VhbEZpbHRlcjogb1NlbGVjdGlvbkZpZWxkPy52aXN1YWxGaWx0ZXIsXG5cdFx0XHRcdHZpZXcsXG5cdFx0XHRcdGxhYmVsOiBvU2VsZWN0aW9uRmllbGQ/LmxhYmVsXG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gRGVsZWdhdGVVdGlsLmRvZXNWYWx1ZUhlbHBFeGlzdChvUGFyYW1ldGVycyk7XG5cdFx0fSlcblx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoYlZhbHVlSGVscEV4aXN0czogYm9vbGVhbikge1xuXHRcdFx0aWYgKCFiVmFsdWVIZWxwRXhpc3RzKSB7XG5cdFx0XHRcdHJldHVybiBfdGVtcGxhdGVWYWx1ZUhlbHAoXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlUeXBlUGF0aCkhLFxuXHRcdFx0XHRcdFx0XHRtZXRhUGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5wcm9wZXJ0eVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0bWV0YVBhdGg6IG9NZXRhTW9kZWxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRpc1hNTDogYklzWE1MXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvUGFyYW1ldGVyc1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pXG5cdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhV2l0aE1vZGlmaWVyPHN0cmluZz4ob1BhcmVudENvbnRyb2wsIFwibG9jYWxJZFwiLCBvTW9kaWZpZXIpO1xuXHRcdH0pXG5cdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKGxvY2FsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IHBhZ2VNb2RlbDtcblx0XHRcdGlmIChvUGFyYW1ldGVycy52aXN1YWxGaWx0ZXIpIHtcblx0XHRcdFx0Ly9OZWVkIHRvIHNldCB0aGUgY29udmVydGVyY29udGV4dCBhcyBwYWdlTW9kZWwgaW4gc2V0dGluZ3MgZm9yIEJ1aWxkaW5nQmxvY2sgMi4wXG5cdFx0XHRcdHBhZ2VNb2RlbCA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcob1BhcmVudENvbnRyb2wpLmdldENvbnRyb2xsZXIoKS5fZ2V0UGFnZU1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gX3RlbXBsYXRlRmlsdGVyRmllbGQob1NldHRpbmdzLCBvUGFyYW1ldGVycywgbG9jYWxJZCwgcGFnZU1vZGVsKTtcblx0XHR9KTtcbn07XG5mdW5jdGlvbiBfZ2V0Q2FjaGVkUHJvcGVydGllcyhvRmlsdGVyQmFyOiBJRmlsdGVyQ29udHJvbCB8IEVsZW1lbnQpOiBudWxsIHwgUHJvcGVydHlJbmZvW10gfCB1bmRlZmluZWQge1xuXHQvLyBwcm9wZXJ0aWVzIGFyZSBub3QgY2FjaGVkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdGlmIChvRmlsdGVyQmFyIGluc3RhbmNlb2Ygd2luZG93LkVsZW1lbnQpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRyZXR1cm4gRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGE8UHJvcGVydHlJbmZvW10+KG9GaWx0ZXJCYXIsIEZFVENIRURfUFJPUEVSVElFU19EQVRBX0tFWSk7XG59XG5mdW5jdGlvbiBfc2V0Q2FjaGVkUHJvcGVydGllcyhvRmlsdGVyQmFyOiBJRmlsdGVyQ29udHJvbCB8IEVsZW1lbnQsIGFGZXRjaGVkUHJvcGVydGllczogUHJvcGVydHlJbmZvW10pOiB2b2lkIHtcblx0Ly8gZG8gbm90IGNhY2hlIGR1cmluZyB0ZW1wbGF0aW5nLCBlbHNlIGl0IGJlY29tZXMgcGFydCBvZiB0aGUgY2FjaGVkIHZpZXdcblx0aWYgKG9GaWx0ZXJCYXIgaW5zdGFuY2VvZiB3aW5kb3cuRWxlbWVudCkge1xuXHRcdHJldHVybjtcblx0fVxuXHREZWxlZ2F0ZVV0aWwuc2V0Q3VzdG9tRGF0YShvRmlsdGVyQmFyLCBGRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVksIGFGZXRjaGVkUHJvcGVydGllcyBhcyB1bmtub3duIGFzIHN0cmluZyk7XG59XG5mdW5jdGlvbiBfZ2V0Q2FjaGVkT3JGZXRjaFByb3BlcnRpZXNGb3JFbnRpdHkoXG5cdHNFbnRpdHlUeXBlUGF0aDogc3RyaW5nLFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0b0ZpbHRlckJhcjogSUZpbHRlckNvbnRyb2xcbik6IENvbnRyb2xQcm9wZXJ0eUluZm9bXSB8IFByb3BlcnR5SW5mb0V4dGVybmFsW10ge1xuXHRsZXQgYUZldGNoZWRQcm9wZXJ0aWVzID0gX2dldENhY2hlZFByb3BlcnRpZXMob0ZpbHRlckJhcik7XG5cdGxldCBsb2NhbEdyb3VwTGFiZWw7XG5cblx0aWYgKCFhRmV0Y2hlZFByb3BlcnRpZXMpIHtcblx0XHRhRmV0Y2hlZFByb3BlcnRpZXMgPSBPRGF0YUZpbHRlckJhckRlbGVnYXRlLmZldGNoUHJvcGVydGllc0ZvckVudGl0eShzRW50aXR5VHlwZVBhdGgsIG9NZXRhTW9kZWwsIG9GaWx0ZXJCYXIpO1xuXHRcdGFGZXRjaGVkUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChvR3JvdXA6IEZFUHJvcGVydHlJbmZvKSB7XG5cdFx0XHRsb2NhbEdyb3VwTGFiZWwgPSBudWxsO1xuXHRcdFx0aWYgKG9Hcm91cC5ncm91cExhYmVsKSB7XG5cdFx0XHRcdGxvY2FsR3JvdXBMYWJlbCA9IGdldExvY2FsaXplZFRleHQob0dyb3VwLmdyb3VwTGFiZWwsIG9GaWx0ZXJCYXIpO1xuXHRcdFx0XHRvR3JvdXAuZ3JvdXBMYWJlbCA9IGxvY2FsR3JvdXBMYWJlbCA9PT0gbnVsbCA/IG9Hcm91cC5ncm91cExhYmVsIDogbG9jYWxHcm91cExhYmVsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHNvcnRQcm9wZXJ0eUluZm9zQnlHcm91cExhYmVsKGFGZXRjaGVkUHJvcGVydGllcyk7XG5cdFx0X3NldENhY2hlZFByb3BlcnRpZXMob0ZpbHRlckJhciwgYUZldGNoZWRQcm9wZXJ0aWVzKTtcblx0fVxuXHRyZXR1cm4gYUZldGNoZWRQcm9wZXJ0aWVzO1xufVxuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5mZXRjaFByb3BlcnRpZXMgPSBhc3luYyBmdW5jdGlvbiAoZmlsdGVyQmFyOiBGaWx0ZXJCYXIpOiBQcm9taXNlPFByb3BlcnR5SW5mb0V4dGVybmFsW10+IHtcblx0Y29uc3QgcHJvcGVydHlJbmZvcyA9IGF3YWl0IE9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuZmV0Y2hGaWx0ZXJQcm9wZXJ0aWVzKGZpbHRlckJhciBhcyB1bmtub3duIGFzIElGaWx0ZXJDb250cm9sKTtcblx0RGVsZWdhdGVVdGlsLnNldEN1c3RvbURhdGEoZmlsdGVyQmFyLCBcImZlRmlsdGVySW5mb1wiLCBwcm9wZXJ0eUluZm9zKTtcblx0aWYgKHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBGaWx0ZXJVdGlscy5mb3JtYXRQcm9wZXJ0eUluZm8ocHJvcGVydHlJbmZvcyBhcyBQcm9wZXJ0eUluZm9bXSkgYXMgUHJvcGVydHlJbmZvRXh0ZXJuYWxbXTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gW107XG5cdH1cbn07XG5cbk9EYXRhRmlsdGVyQmFyRGVsZWdhdGUuZmV0Y2hGaWx0ZXJQcm9wZXJ0aWVzID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRmaWx0ZXJCYXI6IElGaWx0ZXJDb250cm9sXG4pOiBQcm9taXNlPENvbnRyb2xQcm9wZXJ0eUluZm9bXSB8IFByb3BlcnR5SW5mb0V4dGVybmFsW10+IHtcblx0Y29uc3QgZW50aXR5VHlwZVBhdGggPSBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YTxzdHJpbmc+KGZpbHRlckJhciwgXCJlbnRpdHlUeXBlXCIpITtcblx0cmV0dXJuIERlbGVnYXRlVXRpbC5mZXRjaE1vZGVsKGZpbHRlckJhciBhcyBGaWx0ZXJCYXIpLnRoZW4oZnVuY3Rpb24gKG1vZGVsOiBNb2RlbCkge1xuXHRcdGlmICghbW9kZWwpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cdFx0cmV0dXJuIF9nZXRDYWNoZWRPckZldGNoUHJvcGVydGllc0ZvckVudGl0eShlbnRpdHlUeXBlUGF0aCwgbW9kZWwuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsIGZpbHRlckJhcik7XG5cdH0pO1xufTtcblxuT0RhdGFGaWx0ZXJCYXJEZWxlZ2F0ZS5nZXRUeXBlTWFwID0gZnVuY3Rpb24gKCk6IHR5cGVvZiBUeXBlTWFwIHtcblx0cmV0dXJuIFR5cGVNYXA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPRGF0YUZpbHRlckJhckRlbGVnYXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUErREEsTUFBTUEsc0JBQXNCLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFQyxpQkFBaUIsRUFBRUMscUJBQXFCLENBdUR2RjtFQUNGSixzQkFBc0IsQ0FBQ0ssVUFBVSxHQUFHLENBQUM7RUFDckMsTUFBTUMsd0JBQXdCLEdBQUcsWUFBWTtJQUM1Q0Msb0JBQW9CLEdBQUcsU0FBUztJQUNoQ0MsZUFBZSxHQUFHLHNCQUFzQjtJQUN4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